ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • spring boot querydsl
    카테고리 없음 2023. 4. 19. 09:55
    이번시간엔 querydsl에 대해 알아보자 한글 레퍼런스는 여기에 querydsl 은 JPQL와 Criteria를 대체 할 수 있으며 더 쉽다. 그게 장점이다. 일단 다음과 같이 메이븐에 추가하자
    <dependency>
        <groupId>com.mysema.querydsl</groupId>
        <artifactId>querydsl-apt</artifactId>
        <version>${querydsl.version}</version>
        <scope>provided</scope>
    </dependency>
    
    <dependency>
        <groupId>com.mysema.querydsl</groupId>
        <artifactId>querydsl-jpa</artifactId>
        <version>${querydsl.version}</version>
    </dependency>
    ...
    
    <plugin>
        <groupId>com.mysema.maven</groupId>
        <artifactId>apt-maven-plugin</artifactId>
        <version>1.1.3</version>
        <executions>
            <execution>
                <goals>
                    <goal>process</goal>
                </goals>
                <configuration>
                    <outputDirectory>target/generated-sources/java</outputDirectory>
                    <processor>com.mysema.query.apt.jpa.JPAAnnotationProcessor</processor>
                </configuration>
            </execution>
        </executions>
    </plugin>
    
    간단하게 entity를 추가하자
    @Data
    @Entity
    @NoArgsConstructor
    @RequiredArgsConstructor
    public class Account {
    
        @Id
        @GeneratedValue
        private Long id;
    
        @NotBlank
        @Size(min = 5, max = 100)
        @NonNull
        private String name;
    
        @NotBlank
        @Size(min = 2, max = 100)
        @NonNull
        private String password;
    
        @NonNull
        private String email;
    }
    
    
    일반 적인 자바빈 형태다. 그리고 나서 repository 클래스를 만들자
    public interface AccountRepository extends JpaRepository<Account, Long>{
    }
    
    그런후에 querydsl을 사용할 인터페이스를 만들어야 된다. 필자는 이렇게 만들었다
    public interface CustomAccountRepository {
    
        Page<Account> findByemail(String email, Pageable pageable);
    
        Account findByname(String name);
    }
    
    
    실질적으로 저 인터페이스는 구현해야 된다. 인터페이스를 구현할 클래스를 만들자
    public class AccountRepositoryImpl extends QueryDslRepositorySupport implements CustomAccountRepository {
    
        public AccountRepositoryImpl() {
            super(Account.class);
        }
    
        @Override
        public Page<Account> findByemail(String email, Pageable pageable) {
            QAccount account = QAccount.account;
            SearchResults<Account> accountSearchResults =
                    from(account)
                            .where(account.email.like("%" + email + "%"))
                            .limit(pageable.getPageSize())
                            .offset(pageable.getOffset())
                            .listResults(account);
            return new PageImpl<>(accountSearchResults.getResults(), pageable, accountSearchResults.getTotal());
        }
    
        @Override
        public Account findByname(String name) {
            QAccount account = QAccount.account;
            return from(account)
                    .where(account.name.eq(name))
    //                .uniqueResult(account) //하나 이상이면 에러
                    .singleResult(account); //하나 이상이면 처음거를 반환
        }
    }
    
    밑에서 다시 설명하도록 하고 그전에 AccountRepository인터페이스에 CustomAccountRepository를 상속하자
    public interface AccountRepository extends JpaRepository<Account, Long>, CustomAccountRepository {
    }
    
    QAccount 처럼 Q파일이 없다면 메이븐을 인스톨하자
    mvn install 
    
    소스를 보면 query랑 비슷한거를 확인 할 수 있다. sql는다 알고 있으니 설명은 하지 않겠다. 한번씩 해보면 다 알듯 하다. 조인도 가능하고 서브 쿼리도 가능하다. 중요한건 마지막에있는 메소드이다. listResults와 uniqueResult,singleResult 이것들이다. listResults는 SearchResults타입을 리턴한다. 거기 안에 limit, offset, totalCount등 페이징에 필요한 메소드들이 포함되어있다. List로 리턴 받을 수 있다. listResults 대신 list를 사용하면된다. 다음 으론 uniqueResult 단일 메소드이다. 한개만 가져오고 만약 한개 이상이면 에러가 난다. singleResult도 uniqueResult 와 똑같이 한개만 가져오지만 만약 한개 이상일 경우에는 제일 처음 것을 가져 온다. 일단 단순하게 querydsl을 알아봤다. 더 자세한건 레퍼런스를 보면서 한번씩 해보면 될 것 같다.

    댓글

Designed by Tistory.