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 적용하고 빌드하기
반응형