QueryDsl 적용기

·2024년 9월 18일
0

🎯개발지식

목록 보기
7/7

프로젝트를 할때마다 QueryDsl를 까먹어서 항상 다시 공부를 했었다
프로젝트의 내용들을 적용해보며 마지막으로 복습하자

config

@Configuration
public class QueryDslConfig {

    @PersistenceContext
    private EntityManager entityManager;

    @Bean
    public JPAQueryFactory jpaQueryFactory() {
        return new JPAQueryFactory(entityManager);
    }
}
  • 해당 과정을 통해 JPAQueryFactory가 스프링 컨텍스트에 빈으로 등록되어 자동 주입(autowire) 할 수 있게 됩니다.
  • config를 하지 않으면 query클래스마다 해당 코드를 등록해줘야한다
public class test {

    private final EntityManager entityManager;
    private final JPAQueryFactory jpaQueryFactory;

    @Autowired
    public MyService(EntityManager entityManager) {
        this.entityManager = entityManager;
        this.jpaQueryFactory = new JPAQueryFactory(entityManager);
    }
}

1. DTO로 바꾸기

기존의 JPA코드

  • repository에서 엔티디를 받는다
  • service에서 DTO로 변환
    => 2번의 작업이 필요

repository

@Repository
public interface ChalletBankRepository extends JpaRepository<ChalletBank, Long> {
    List<ChalletBank> findByPhoneNumber(String phoneNumber);
}

service

@Service
@RequiredArgsConstructor
public class ChalletBankServiceImpl implements ChalletBankService {

    private final ChalletBankRepository challetBankRepository;

    @Override
    public List<AccountInfoResponseDTO> findAccountByPhoneNumber(String phoneNumber) {
        List<ChalletBank> challetBanks = challetBankRepository.findByPhoneNumber(phoneNumber);

        // 엔티티 리스트를 DTO 리스트로 변환
        return challetBanks.stream()
                .map(challetBank -> new AccountInfoResponseDTO(
                        challetBank.getId(),
                        challetBank.getAccountNumber(),
                        challetBank.getAccountBalance()
                ))
                .collect(Collectors.toList());
    }
}


QueryDsl 적용

@Repository
@RequiredArgsConstructor
public class ChalletBankRepositoryImpl implements ChalletBankRepositoryCustom {

    private final JPAQueryFactory query;

    @Override
    public List<AccountInfoResponseDTO> findByAccountInfo(String phoneNumber) {
        QChalletBank challetBank = QChalletBank.challetBank;

        return query
            .select(Projections.constructor(AccountInfoResponseDTO.class,
                challetBank.id,
                challetBank.accountNumber,      
                challetBank.accountBalance
            ))
            .from(challetBank)
            .where(challetBank.phoneNumber.eq(phoneNumber))
            .fetch();  // 여러 결과를 리스트로 반환
    }
}

0개의 댓글