본문 바로가기
웹 프로그래밍/스프링부트

스프링 데이터 JPA 연동

by Backchus 2019. 10. 28.

오늘 포스팅은 스프링부트와 스프링 데이터 JPA를 연동하는 방법에 대해 살펴보겠습니다.

살펴보기 전에 간단히 ORM(Object-Relational Mapping)과 JPA(Java Persistence API)에 대해서 설명하자면

ORM은 객체와 릴레이션을 맵핑할 때 발생하는 개념적 불일치를 해결하는 프레임워크입니다.

쉽게 말해서 자바의 클래스의 멤버들을 데이터베이스의 컬럼과 맵핑을 시켜주는 역할을 합니다.

 

스프링부트 프로젝트를 만든 후 mysql과 h2 jpa의존성을 추가합니다.

H2는 인메모리DB로 테스트에 이용하기 위해 scope을 test로 지정합니다. 실제 저장할 DB는 Mysql로 저장할 예정입니다.

 

application.properties에서 DataSource에 대한 설정을 합니다.

 

Account.java

 DTO객체인 Account.java를 작성합니다. 일일이 getter, setter를 작성할 필요 없이 lombok을 쓰셔도 상관없습니다.

 

AccountRepository.java

그리고 AccountRepository를 만드는데 JpaRepository를 상속받는 interface로 만들어 줍니다.

 

AccountRepository의 테스트코드를 작성해 보겠습니다. AccountRepository에서 윈도우 기준으로 Ctrl + Shift + t를 누르면 Create New Test라는 부분을 클릭하면

이런 창이 뜨게되는데 JUnit4로 설정하고 그대로 ok를 눌러 줍니다.

 

슬라이싱 테스트를 만들기 위해 @DataJpaTest어노테이션을 추가합니다. 슬라이싱 테스트는 Repository를 포함해서 Repository에 관련된 빈들만 등록을 해서 테스트하는 것을 말합니다.

여기서 중요한것은 이 테스트를 실행하게 되면 DataSource의 설정은 인메모리 DB를 쓸 수 있게 자동으로 설정은 해줍니다. 결론적으로 스프링부트를 실행할 땐 Mysql을 사용하게 되고 테스트를 할 때는 H2를 사용하게 됩니다.

이렇게 하게 되면 DataSource, JdbcTemplate, JpaRpository를 상속받아 만들었던 AccountRepository를 주입받을 수 있습니다. 

 

비어있는 테스트를 실행해보면 

오류없이 성공적으로 실행되는 것을 볼 수 있습니다. 이 뜻은 DataSource, JdbcTemplate, AccountRepository빈이 정상적으로 주입되었다는 것을 알 수 있습니다.

 

좀 더 확실히 알아보기위해 metadata를 콘솔에 출력해 보겠습니다.

이 테스트를 실행시켜서 URL, DriverName, UserName을 출력해보면 

 

정상적으로 출력하는 것을 알 수 있고 H2 Driver를 쓰는 것을 확인했습니다.

 

만약 이렇게 @DataJpaTest대신 @SpringBootTest를 사용한다면 통합 테스트로 이렇게 되면 애플리케이션의 루트인  SpringBootapplicaton.java에 있는 @SpringBootApplication어노테이션을 찾아서 모든 빈을 등록하게 합니다. 그렇게 되면 application.properties에 작성한 설정이 적용이 되기 때문에 테스트 코드에서 H2를 쓰지 않고 Mysql를 사용하게 되는 것입니다.

이렇게 Mysql을 사용하게 됩니다. 하지만 이러한 방법은 오래걸리기 때문에 테스트용 DB인 인메모리 DB를 따로 만들어 테스트하는 것을 권장합니다.

 

이제 데이터를 직접 DB에 저장해보고 제대로 저장했는지에 대한 테스트 코드를 작성해 보도록 해보겠습니다. 일단 AccountRepository인터페이스에 findByUsername이라는 메서드를 작성해보겠습니다.

이렇게 인터페이스에 메소드를 작성하면 JPA가 자동으로 이 인터페이스의 메서드를 자동으로 구현시켜줍니다.

 

테스트 코드를 작성후 실행시켜 보겠습니다.

 

정상적으로 테스트가 실행되는 것을 확인했습니다.