Spring Data JPA

Spring JPA [SpringBoot3.1] - Querydsl 사용

Stark97 2023. 8. 8. 00:48
반응형

이전 포스팅에서 querydsl적용을 했고 이번에는 repository를 만들어서 사용해 보겠다.

 

1. QuerydslConfig라는 클래스를 만들고 JPAQueryFactory Bean설정을 해준다.

import com.querydsl.jpa.impl.JPAQueryFactory;
import jakarta.persistence.EntityManager;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@RequiredArgsConstructor
public class QuerydslConfig {

    private final EntityManager em;

    @Bean
    public JPAQueryFactory jpaQueryFactory(EntityManager em){
        return new JPAQueryFactory(em);
    }

}

2. repository 폴더를 만들고 그 안에 내가 원하는 jpa 전용 repository를 만든다.

  • 여기서는 board로 하겠다.
package com.jinan.profile.repository.board;

import com.jinan.profile.domain.board.Board;
import com.jinan.profile.repository.querydsl.board.BoardRepositoryCustom;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

//querydsl custom 인터페이스로 extends에 추가해준다.
@Repository
public interface BoardRepository extends JpaRepository<Board, Long> {
}

3. 이제 querydsl이라는 package를 만들고 그 안에 board 패키지를 만든다.

4. 이후 querydsl > board안에 querydsl 전용 custom 인터페이스를 만들고 구현체도 만들어 준다.

  • BoardRepositoryCustom 생성
import com.jinan.profile.domain.board.Board;

import java.util.List;
import java.util.Optional;

public interface BoardRepositoryCustom {

    Optional<List<Board>> findByLoginId(String loginId);
}
  • BoardRepositoryImpl 생성
import com.jinan.profile.domain.board.Board;
import com.querydsl.jpa.impl.JPAQueryFactory;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Optional;

import static com.jinan.profile.domain.board.QBoard.board;
import static com.jinan.profile.domain.user.QUser.user;

/**
 * 쿼리dsl 구현체 코드
 */
@RequiredArgsConstructor
@Repository
public class BoardRepositoryImpl implements BoardRepositoryCustom {

    private final JPAQueryFactory queryFactory;

    @Override
    public Optional<List<Board>> findByLoginId(String loginId) {
        List<Board> result = queryFactory
                .select(board)
                .from(board)
                .where(user.loginId.eq(loginId))
                .fetch();

        return result.isEmpty() ? Optional.empty() : Optional.of(result);
    }
}

5. 완성된 인터페이스를 BoardRepository에서 상속받도록 작성한다.

import com.jinan.profile.domain.board.Board;
import com.jinan.profile.repository.querydsl.board.BoardRepositoryCustom;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

//querydsl custom 인터페이스로 extends에 추가해준다.
@Repository
public interface BoardRepository extends JpaRepository<Board, Long>, BoardRepositoryCustom {

}

6. querydsl 코드가 잘 동작하는지 테스트를 해봤다.

  • findByLoginId()가 매우 잘 동작했다. 
@DisplayName("유저의 로그인id로 모든 게시글을 리스트로 조회한다.")
@Test
void findByLoginId() {
    //given
    User user = createUser();
    Board board = createBoard(user, "테스트");
    User savedUser = userRepository.save(user);
    Board savedBoard = boardRepository.save(board);

    //when
    List<Board> boardList = boardRepository.findByLoginId(savedUser.getLoginId())
            .orElseThrow(() -> new ProfileApplicationException(ErrorCode.USER_NOT_FOUND));

    //then
    assertThat(boardList).isEqualTo(List.of(board));
    assertThat(boardList).hasSize(1);
    assertThat(boardList.get(0)).isInstanceOf(Board.class);
}

 

 

2023.08.08 - [JPA] - SpringBoot3.x.x - Querydsl 적용하고 빌드하기

 

SpringBoot3.x.x - Querydsl 적용하고 빌드하기

SpringBoot3버전에서 Querydsl을 적용하는법이 2버전과 다르게 변경되었다. 1. Build.gradle을 설정한다. 아래와 같이 querydsl설정을 해준다. QClass를 만들때는 스프링부트 2.x.x처럼 compileQuerydsl로 하는게 아

curiousjinan.tistory.com

 

반응형