이제 본격적으로 JPA를 이용해서 데이터를 처리해보려 한다.

리포지터리(Repository)

엔티티만으로는 데이터베이스에 데이터를 저장하거나 조회 할 수 없다. 데이터 처리를 위해서는 실제 데이터베이스와 연동하는 JPA 리포지터리가 필요하다.

점프 투 스프링부트 리포지터리란?

리포지터리는 엔티티에 의해 생성된 데이터베이스 테이블에 접근하는 메서드들(예: findAll, save 등)을 사용하기 위한 인터페이스이다. 데이터 처리를 위해서는 테이블에 어떤 값을 넣거나 값을 조회하는 등의 CRUD(Create, Read, Update, Delete)가 필요하다. 이 때 이러한 CRUD를 어떻게 처리할지 정의하는 계층이 바로 리포지터리이다.

 

다음과 같이 QuestionRepository 인터페이스를 생성하자.

QuestionRepository는 리포지터리로 만들기 위해 JpaRepository 인터페이스를 상속했다. JpaRepository를 상속할 때는 제네릭스 타입으로 <Question, Integer> 처럼 리포지터리의 대상이 되는 엔티티의 타입(Question)과 해당 엔티티의 PK의 속성 타입(Integer)을 지정해야 한다. 이것은 JpaRepository를 생성하기 위한 규칙이다.

Question 엔티티의 PK(Primary Key) 속성인 id의 타입은 Integer 이다.

마찬가지로 AnswerRepository도 다음과 같이 생성하자.

오류가 나길래, 몇번이나 코드를 확인해봤는데도 이상이 없었다. 혹시 몰라서 실행해보니 실행 자체는 문제없이 원활하게 진행되었다. 뭔가 거슬리긴 하지만 우선은 그냥 넘어가자.

 

질문과 답변 리포지토리를 모두 작성하였다. 이제 QuestionRepository, AnswerRepository를 이용하여 question, answer 테이블에 데이터를 저장하거나 조회할 수 있다.

 

데이터 저장하기

작성한 리포지터리를 테스트하기 위해서 JUnit 기반의 스프링부트의 테스트 프레임워크를 사용해 보자.

테스트는 실제 로컬 서버와는 다르게 처리된다. 시작하는 시점부터가 다르며, 테스트로 실행하면 로컬 서버의 H2 콘솔이 접속되지 않는 등 차이가 있다. 만약 서버를 실행햇는데 로컬 서버에서 접속이 되지 않으면, 테스트 모드로 실행하지 않았는지 체크해보자.

 

테스트 프레임워크를 사용하려면, 이제까지 실행해왔던 WebBoardApplication.java 파일이 아닌, WebBoardApplicationTests.java 파일로 들어가서 다음과 같이 코드를 작성해준다.

 

@SpringBootTest 애너테이션은 SbbApplicationTests 클래스가 스프링부트 테스트 클래스임을 의미한다. 

@Autowired 애너테이션은 스프링의 DI 기능으로 questionRepository 객체를 스프링이 자동으로 생성해 준다.

DI(Dependency Injection) - 스프링이 객체를 대신 생성하여 주입한다.

점프 투 스프링부트@Autowired

객체를 주입하기 위해 사용하는 스프링의 애너테이션이다. 객체를 주입하는 방식에는 @Autowired 외에 Setter 또는 생성자를 사용하는 방식이 있다. 순환참조 문제와 같은 이유로 @Autowired 보다는 생성자를 통한 객체 주입방식이 권장된다. 하지만 테스트 코드의 경우에는 생성자를 통한 객체의 주입이 불가능하므로 테스트 코드 작성시에만 @Autowired를 사용하고 실제 코드 작성시에는 생성자를 통한 객체 주입방식을 사용하겠다.

testJpa 메서드 위의 @Test 애너테이션은 testJpa 메서드가 테스트 메서드임을 나타낸다. 위 클래스를 JUnit으로 실행하면 @Test 애너테이션이 붙은 메서드가 실행된다.

JUnit은 테스트코드를 작성하고 작성한 테스트코드를 실행하기 위해 사용하는 자바의 테스트 프레임워크이다.

testJpa 메서드의 내용을 잠시 살펴보자. testJpa 메서드는 q1, q2 라는 Question 엔티티 객체를 생성하고 QuestionRepository를 이용하여 그 값을 데이터베이스에 저장하는 코드이다.

 

이제 작성한 SbbApplicationTests 클래스를 실행해 보자. 

(테스트를 실행하기 전에, 로컬 서버가 구동되어 있다면 The file is locked: nio:/Users/pahkey/local.mv.db 와 비슷한 오류가 발생할 것이다. H2 데이터베이스는 파일 기반의 데이터베이스라서, 이미 로컬서버가 점유하고 있기 때문에 이러한 오류가 발생한다. 따라서 테스트를 하기 위해서는 로컬 서버를 중지해야 한다. )

 

올바르게 코드가 작성되었다면, 다음과 같은 화면이 출력될 것이다.

테스트에 성공했다면, 위와 같이 초록색 체크표시가 나타난다. 참고로 로컬 서버에서는 이러한 초록색 체크표시는 나타나지 않는다.

실제 데이터베이스에 값이 잘 들어갔는지 확인하려면 테스트 서버에서는 불가능하고,  다시 로컬서버를 구동하고 H2 콘솔에 접속하여 쿼리문을 실행해야 한다. 이때는 아까와 반대로 테스트 서버를 종료하고 로컬 서버를 실행시켜준다.

테스트에 성공했다는 뜻은 실제 로컬 서버에서 아무 오류 없이 잘 구동된다는 의미이므로, 안심하고 종료해주자.

 

H2 콘솔에 접속했다면, 아래와 같이 쿼리문을 입력해준다.

실행을 하면, 다음처럼 우리가 저장한 Question 객체의 값이 데이터베이스에 저장된 것을 확인할 수 있다.

id는 Question 엔티티의 기본 키(Primary Key)이다. id는 앞에서 엔티티를 생성할 때 설정했던대로 데이터를 생성할 때 속성값이 자동으로 1씩 증가하는 것을 확인할 수 있다.

Question 엔티티의 id는 @GeneratedValue 설정을 했다.

다음 포스팅에서는 데이터를 조회하는 방법에 대해 작성하겠다.

'백엔드 > Springboot' 카테고리의 다른 글

리포지터리(Repository) -3-  (0) 2023.09.18
리포지터리(Repository) -2-  (0) 2023.09.18
엔티티(Entity) -2-  (0) 2023.09.17
엔티티(Entity) -1-  (0) 2023.09.17
JPA 환경설정  (0) 2023.09.17

+ Recent posts