티스토리 뷰


  1. Hibernate(annotation만 jpa 스펙이었음) -> 모든 인터페이스 jpa 스펙으로 변경
  2. SpringData JPA 적용 : JPA기반 ORM Supporter
  3. QueryDsl 적용 : create type-safe JPA queries
    참조 : 12
    자세한 설정 방법은 나중에...

Hibernate -> JPA

  • DB접근을 위한 interface를 sessionFactory에서 entityManagerFactory로 변경
  • persistence.xml로 특정 orm의 설정을 그대로 두고 import 시키는 방식 대신 기존처럼 직접 바인딩하는 설정을 사용하였음
  • 기존 GenericDao에 sessionFactory inject 대신 EntityManager를 걸어주면 되고, annotation은 @PersistenceContext를 사용한다.
  • hibernate core와 사용하는 메소드명과 의미가 조금씩 다르긴 하지만, 거의 유사하다고 보면 된다.
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
      <property name="packagesToScan" value="com.playsw.service"/>
          <property name="dataSource" ref="dataSource"/>
          <property name="jpaVendorAdapter">
              <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
          </property>
          <property name="jpaProperties">
              <props>
                  <prop key="hibernate.dialect">${hibernate.dialect}</prop>
                  <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
                  <prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
              </props>
          </property>
    </bean>
    

SpringData JPA

  • 기존의 GenericDao를 대체하고 추가적으로, 유연한 query implementation을 지원해주는 framework
  • 기본적인 crud는 JpaRepository interface를 상속받는 interface를 새로 작성하는 것으로 해결된다.
  • springData JPA가 구동되면서 JpaRepository를 상속받고 있는 interface를 찾아서 구현체를 만들어줌.
  • 아래 설정으로 repository를 찾는다.
    -> <jpa:repositories base-package="targetPackage" transaction-manager-ref="transactionManager"/>
  • 개발자는 interface로 메소드만 실행시키면 된다.
  • 추가적인 쿼리를 만들고 싶으면 interface에 findByName <- 요런식으로 메소드명만 잘 만들어주면 된다. 문법은 문서를 참조
public interface TagRepository extends JpaRepository<Tag, Integer> {
    Tag findByName(String name);
}

QueryDsl

  • SpringData JPA로 커버가 되지 않는 조금은 더 복잡한 쿼리가 필요할 때 사용
  • type-safe한 즉, 디버깅이 쉽고 기계의 도움을 받을 수 있는 수준의 쿼리 작성이 가능하다.
  • interface에 QueryDslPredicateExecutor를 상속 받는다.
  • update, delete 등의 쿼리에서 조회조건을 추가하고 싶다면?! -> QueryDslPredicateExecutor(abstract class)를 상속받아 새로운 클래스를 정의하여 사용하면 된다.
  • 하다하다 안되면 native sql도 사용가능하다고 한다.
  • maven 플러그인 추가 후에 build하면 Q가 붙은 도메인 클래스들이 생기는데 요것들로 쿼리를 작성하게 된다.

    @Test
    public void testBooleanBuilder() {
      QTag tag = QTag.tag;
      BooleanBuilder builder = new BooleanBuilder();
          builder.and(tag.name.eq("thisIsTag")).and(tag.modr.ne("doublemetal"));
    
          List<Tag> tags = (List<Tag>) tagRepository.findAll(builder.getValue());
      for (Tag obj : tags) {
              System.out.println(obj);
          }
    }
    public interface TagRepository extends JpaRepository<Tag, Integer>, QueryDslPredicateExecutor<Tag> {
      Tag findByName(String name);
    }
    

hsqldb

  • 테스트용 메모리 DB
  • 임베디드/메모리/원격 설정이 가능한데 임베디드를 사용한다.
  • 테스트용 context파일을 따로 만들어서 적용하였다.
  • src/test/resources 하위에 설정 파일과 실제 DB관련 파일(hsqldb폴더)이 담긴다.
  • 원래 context와 설정은 동일하고 dataSource만 바꿔주면 된다.(username과 password는 고정)
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
          <property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
          <!--<property name="url" value="jdbc:hsqldb:mem:test"/>-->
          <property name="url" value="jdbc:hsqldb:file:src/test/resources/hsqldb/dummy"/>
          <property name="username" value="sa"/>
    </bean>


댓글
댓글쓰기 폼