2016년 11월 28일 월요일

[자바강의,스프링강의,JPA강의추천_탑크리에듀][JPA,Querydsl강좌]QueryDSL,SQLQueryFactory로엔티티생성없이DB쿼리하기,NativeSQL사용,DB스키마를쿼리타입으로생성하기위한 메이븐설정

[JPA,Querydsl강좌]QueryDSL,SQLQueryFactory로엔티티생성없이DB쿼리하기,NativeSQL사용,DB스키마를쿼리타입으로생성하기위한 메이븐설정

SQLQueryFactory  Query Type 생성을 위한 MAVEN 설정

n  SQLQueryFactory 엔티티가 생성되지 않은 상태에서 DB에 JPA의 메소드기반으로 쿼리를 타입세이프하게 만들어 실행하는 방법을 제공한다그러기위해 DB스키마와같은 쿼리타입을 자바단에 만들어 두어야 하는데 그걸 코드 제너레이션 이라한다.

n  메이븐을 통해 하려면 메이븐 설정에 querydsl-sql 또는 querydsl-sql-spring, dermy 의존성을 추가하고 querydsl-maven-plugin을 이용하여 DB스키마 구조대로 쿼리를 위한 쿼리타입 클래스(QXXX..)를 만들어야 한다.

n  그런다음 SQLQueryFactory를 통해 타입세이프하게 메소드기반의 자바코드로 쿼리문을 만들면 DB에  SQL문이 전달되어 실행된다


<dependency>
  <groupId>com.querydsl</groupId>
  <artifactId>querydsl-sql</artifactId>
  <version>${querydsl.version}</version>
</dependency>

<dependency>
  <groupId>com.querydsl</groupId>
  <artifactId>querydsl-sql-codegen</artifactId>
  <version>${querydsl.version}</version>
  <scope>provided</scope>
</dependency>

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-log4j12</artifactId>
  <version>1.6.1</version>
</dependency>

n  아래처럼 Maven을 이용해서 Code Generation을 하는 경우라면 querydsl-sql-codegen 의존성은 필요없다. Maven을 이용하여 DB스키마 코드를 Generation 하기 위해서는 아래 plugin을 추가해야 한다.

<plugins>
      ...
<plugin>
        <groupId>com.querydsl</groupId>
        <artifactId>querydsl-maven-plugin</artifactId>
        <version>${querydsl.version}</version>
        <executions>
          <execution>
            <goals>
              <goal>export</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <jdbcDriver>org.apache.derby.jdbc.EmbeddedDriver</jdbcDriver>
          <jdbcUrl>jdbc:derby:target/demoDB;create=true</jdbcUrl>
          <packageName>com.myproject.domain</packageName>
          <targetFolder>${project.basedir}/target/generated-sources/java</targetFolder>
        </configuration>
        <dependencies>
          <dependency>
            <groupId>org.apache.derby</groupId>
            <artifactId>derby</artifactId>
            <version>${derby.version}</version>
          </dependency>
        </dependencies>
      </plugin>
      ...
 </plugins>


n  만약 Spring Integration을 이용하려면 querydsl-sql 대신 query-sql-spring 의존성을 추가하면 된다.

<dependency>
  <groupId>com.querydsl</groupId>
  <artifactId>querydsl-sql-spring</artifactId>
  <version>${querydsl.version}</version>
</dependency>

이 설정은 스프링 예외처리와 스프링의 TransactionManager를 이용하여 Querydsl SQL의 위한 Spring Connection을 제공한다아래 스프링 설정 예문을 참조하자.

import com.querydsl.sql.H2Templates;
import com.querydsl.sql.SQLQueryFactory;
import com.querydsl.sql.SQLTemplates;
import com.querydsl.sql.spring.SpringConnectionProvider;
import com.querydsl.sql.spring.SpringExceptionTranslator;
import com.querydsl.sql.types.DateTimeType;
import com.querydsl.sql.types.LocalDateType;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;

import javax.inject.Inject;
import javax.inject.Provider;
import javax.sql.DataSource;
import java.sql.Connection;

@Configuration
public class JdbcConfiguration {

    @Bean
    public DataSource dataSource() {
        // implementation omitted
    }

    @Bean
    public PlatformTransactionManager transactionManager() {
        return new DataSourceTransactionManager(dataSource());
    }

    @Bean
    public com.querydsl.sql.Configuration querydslConfiguration() {
        SQLTemplates templates = H2Templates.builder().build(); //change to your Templates
        com.querydsl.sql.Configuration configuration = new com.querydsl.sql.Configuration(templates);
        configuration.setExceptionTranslator(new SpringExceptionTranslator());
        return configuration;
    }

    @Bean
    public SQLQueryFactory queryFactory() {
        Provider<Connection> provider = new SpringConnectionProvider(dataSource());
        return new SQLQueryFactory(querydslConfiguration(), provider);
    }

}

n  위와 같이 의존성 및 플러그인을 추가함으로써 DB스키마 코드를 만드는 것과 SQLQueryFactory를 이용하여 DB쪽으로 직접쿼리 할 수 있다.


SQLQueryFactory 위한 Query Type, Configuration 생성하기

n  DB스키마를 Querydsl을 위한 쿼리 타입으로 변환하기 위해서는 다음과 같이 하면 된다.

java.sql.Connection conn = ...;
MetaDataExporter exporter = new MetaDataExporter();
exporter.setPackageName("com.myproject.mydomain");
exporter.setTargetFolder(new File("target/generated-sources/java"));
exporter.export(conn.getMetaData());

n  Configuration은 아래처럼 생성한다. MySQL5.5 이상 이라면 MySQLTemplates, 오라클 이라면 OracleTemplates을 사용하면 된다.

//MySQL이라면 MySQLTemplates, Oracle이라면 OracleTemplates를 사용하면 된다.
SQLTemplates templates = new H2Templates();
Configuration configuration = new Configuration(templates);

n  아래와 같이 SQLQueryFactory를 생성한 후 쿼리를 만들어 실행하면 된다.

SQLQueryFactory queryFactory = new SQLQueryFactory(configuration, dataSource);

댓글 없음:

댓글 쓰기