'spring-data-jpa'에 해당되는 글 2건

  1. 2013.11.08 [Java] Spring-Data-JPA 프로젝트 템플릿 (4)
  2. 2013.08.06 [Spring] Spring JPA Data + Hibernate 설정 (2)

몇개월전에 현기형님의 주도하게 팀 프로젝트를 간단하게 진행한적이 있습니다.

그때 형님께서 Spring-data-Jpa + QueryDSL로 프로젝트 셋팅을 하셨고 그에 맞춰서 간단하게 진행을 했었습니다.

그전까지 ORM을 책으로만 봐왔던 저에게는 처음 경험하는 ORM이 신기할뿐이었는데요... 그 아쉬움으로

따로 JPA 설정을 하면서 포스팅을 하기도 했었습니다.

(http://devyongsik.tistory.com/640)


그리고 한참 잊고 지내다가 이번에 CMD를 하면서 제가 다시 한번 프로젝트 셋팅을 할 기회가 생겼는데

프로젝트 리딩하시는 빌리님과 협의하여 Spring-data-jpa로 한번 다시 해보기로 하였습니다.


많은 부분을 현기형님께서 만드셨던 build.gradle을 참조하여 작업을 하였고..

실제 프로젝트를 진행하면서 "와.. 이거 너무 편하다.. 신세계다" 라는 생각을 하게되면서

좀 더 이 JPA을 더 경험해보고 싶어졌습니다.


아무튼 spring-data-jpa의 매력에 푹 빠졌습니다.


그래서 앞으로 자주 써보고 싶은데.. 아무리 maven이나 gradle이 있어도 파일럿을 만들려고 할 때마다 

뭔가 셋팅하고 하는게 귀찮습니다. 그냥 rails server 이런것처럼 되었으면 좋겠어요...


하지만 자바에서 그럴 수는 없죠. 그래도 최대한 귀차니즘을 존중하여 

spring-data-jpa, spring-data-jpa + queryDSL로 각각 프로젝트 템플릿을 만들어

github에 올려보았습니다. 마찬가지로 현기형님의 build.gradle을 참조하여.. 조금 제 생각대로 수정을 하면서 스크립트를 작성하였습니다.



간단한 웹어플리케이션설정과 테스트케이스등이 포함되어 있습니다.

위의것은 spring-data-jpa + hibernate이고..

아래것은 거기에 queryDSL이 추가되었습니다.


clone 받으신 후 이클립스의 경우 "gradle eclipse"를 실행하시면 됩니다.

dsl 프로젝트의 경우 Entity를 만드신 후 Q~ 자바 소스 생성을 위해 다시한번 gradle eclipse를 실행하시면 됩니다.

이 부분은 다른 task로 빼던가 해야겠어요..


intelliJ의 경우는 자동으로 인식됩니다.


공부를 하려는 것이 목적이다보니 설정이나 API를 사용하는 방법이 best practice는 아닙니다.

그럼에도 불구하고 잘못된 부분에 대한 조언을 듣고 싶기도해서 이렇게 포스팅해봅니다.


감사합니다.

Posted by 용식

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

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


현기형님께서 워낙 이런 기술습득이나 적용에 월등하게 빠르셔서.. 그냥 설정해주신 내용을 가지고 따라 쓰기도 바쁜 상태였었다. 빌리님께서 셋팅하신 스프링 배치도 마찬가지고... 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가 관리 대상이 아니라면서 에러가 나는데..

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

Posted by 용식