본문 바로가기

Spring

[Spring] Spring JPA Data + Hibernate 설정

회사에서 팀에서 스터디겸 프로젝트로 하나 진행하고 있는 것이 있다.

새로운것들을 마구마구 적용해서 공부도 하면서 비지니스에 뭔가 도움이 될만한 재미있는 것을 만들자는 것이 목적인데...


현기형님께서 워낙 이런 기술습득이나 적용에 월등하게 빠르셔서.. 그냥 설정해주신 내용을 가지고 따라 쓰기도 바쁜 상태였었다. 빌리님께서 셋팅하신 스프링 배치도 마찬가지고... git빼고는 해본게 아무것도 없는 설정이라 더욱 곤욕...ㅋ


그래서, 그래도 프로젝트 초반에 한번 직접 셋팅이라도 해보지 않으면 나중에 더 힘들어질듯하여..

예전에 봤던 책 내용들을 다시 되새기면서(구글링하면서...) 셋팅을 해보았다.


막셋팅이라 최적화와는 거리가 멀겠으나 일단 테스트케이스까지 만들어보는 것 성공...

그 내용을 이제 맥북프로를 받으시면 똑같이 해보셔야하는 계춘님을 위해 정리 ㅋㅋ


1. build.gradle


많은 부분을 현기형님이 작성하진 build.gradle에서 차용.. 아직 gradle이 익숙하지 않은데.. 이번에 이거 셋팅하면서 이것저것 만지작 거렸더니 조금 감이온다.  ${target}은 Default로 "local"이 셋팅된다.

또한 allprojects에서 target의 값에 맞춰서 sourceSets을 정의하도록 하였다. 이에 맞춰서 build시에 resources-${target} 의 파일들이 processResouces에 의해서 target directory로 이동된다



2. applicationContext-dao.xml


대부분의 설정이 들어간다. 하이버네이트 관련 설정은 persistence.xml에 위치시키고 여기서는 entityManagerFactory bean 생성시 참조하도록 하였다. 그리고, local에서는 HSQL DB가 같이 startup 될 수 있도록 "jdbc:embedded-database"로 설정을 추가하였고, 이때 사용 할 schema와 testData sql은 별도로 만들어 위치를 지정하였다.



3. schema.sql, test-data.sql


HSQL용 ddl sql과 테스트 데이터를 위한 insert sql 문장.



4. jdbc.properties



profile별로 설정 할 수 있게....



5. persistence.xml


hibernate.dialect 설정에 HSQL관련 설정이 있음.



6. User.java


Entity로 사용될 User 클래스. 특별한것은 없다..



7. UserDao.java


CrudRepository를 사용한 인터페이스. CrudRepository를 extends하면서 기본적인 CRUD 메서드가 제공된다. (find, findAll 등등)



8. UserDaoTest.java



Mockito등을 사용해서 실제 데이터베이스와의 연결을 단위테스트에서는 하지 않기도 하지만, 이번에는 설정들이 잘 되어 UserDao의 동작을 실제로 보기위해서 Mockito는 사용하지 않았다. save() 메서드에서 하나의 user 객체를 save하였는데, findAll에서는 2개의 User 객체가 return된다. 위 jdbc:embedded 설정에 의해서 하나의 테스트 데이터가 이미 들어가 있는 상황임을 알 수 있다.


9. UserDaoJpaRepository.java


JpaRepository를 상속한 인터페이스도 한번 추가해보았다. CrudRepository와 JpaRepository의 차이점은 이곳에..

(http://stackoverflow.com/questions/14014086/what-is-difference-between-crudrepository-and-jparepository-interfaces-in-spring)

요약하면 "JpaRepository will have all the functions of CrudRepository and PagingAndSortingRepository" 이다. 

즉, JpaRepository는 PagingAndSortingRepository를 상속하고 있고, PagingAndSortingRepository는 CrudRepository를 상속하고 있다.



10. UserDaoJpaRepositoryTest.java



findAll() 메서드에서 캐스팅이 필요없는 것을 참고.


11. 프로젝트 구조









현재 진행중인 팀프로젝트에는 Query DSL까지 들어가있다. 처음에 Spring-data도 모르는 상황에서 팀프로젝트의 설정을 보니 어디까지가 spring-data이고 어디부터가 Query DSL인지도 모르겠더라... 그만큼 잘 녹아있기도하고.. 그래서 일부러 이번에 설정할때는 Query DSL을 제외하고 설정을 해보았다.. 
해보니 좀 알겠다....;;

원래 모든 설정을 모두 이해하고 사용하는것이 올바르고 정확하겠으나...
우선 한번 부딫혀보는걸로...... ㅎㅎㅎ


근데 이클립스에서 테스트케이스 돌리면 잘 도는데..

gradle build 커맨드를 통한 테스트케이스 실행은 Entity가 관리 대상이 아니라면서 에러가 나는데..

이거 이유를 잘 모르겠다..;