풍선 여러개를 조회할때 이미 주운 풍선은 보여선 안된다는 조건 때문에, 조금 복잡한 sql이 필요했다.
처음에는 JPQL을 사용하려 했지만 이거 문법이 뭔지도 잘 모르겠고.. 문서도 오래되어서 보기가 어려웠다.
그래서 자동완성을 지원하는 QueryDSL을 사용하게 되었다.
## 적용 방법
이 글은 튜토리얼 같은 것이 아니라, 내가 고민한 것과 막힌 부분에 대해서 적는게 목적이기 때문에 적용 방법을 하나하나 설명하지는 않겠다.
개인적으로는 아래 글이 좋은 것 같으니 필요하다면 참고 바란다.
https://tecoble.techcourse.co.kr/post/2021-08-08-basic-querydsl/
## JPA + QueryDSL
QueryDSL 자체는 쿼리를 생성해주는 역할만 하는 것 같다.
문서도 아주 간단하게 되어있다.
나는 JPA를 기본으로 사용하고 있으니 JPA에서 QueryDSL을 활용하는 방법을 찾았다. 아래 있다.
http://querydsl.com/static/querydsl/latest/reference/html/ch02.html#jpa_integration
JPQL은 문자열로 작성하지만 QueryDSL은 JPAQuery를 가지고 쿼리를 만들어나간다.
JPAQuery는 아래와 같이 생겼고, entityManager를 갖게된다.
(SQLAlchemy의 쿼리 객체는 커넥션을 갖지 않았던 것 같은데 특이하다.)
JPAQuery<?> query = new JPAQuery<Void>(entityManager);
우리는 직접 쿼리를 생성하지 않고 JPAQueryFactory를 이용해 쿼리 객체를 생성할 수 있다.
쿼리 객체는 fetchXxx() 함수로 데이터를 불러온다.
JPAQueryFactory jpaQueryFactory = new JPAQueryFactory(entityManager);
QCustomer customer = QCustomer.customer;
Customer bob = queryFactory.selectFrom(customer)
.where(customer.firstName.eq(“bob”))
.fetchOne();
## Repository 패턴 활용하기
QueryDsl을 서비스 클래스에서 그대로 사용할 수는 없고, 별도의 레포지토리를 만들어서 관리하고 싶었다.
그래서 아래와 같이 구현했다.
public interface BalloonCustomRepository {
List<Balloon> findNotRepliedOrderByCreatedAtDesc(Long replierId, Pageable pageable);
}
@Repository
@RequiredArgsConstructor
public class BalloonCustomRepositoryImpl implements BalloonCustomRepository {
private JPAQueryFactory jpaQueryFactory;
@Override
public List<Balloon> findNotRepliedOrderByCreatedAtDesc(Long replierId, Pageable pageable) {
…
}
}
public interface BalloonRepository extends JpaRepository<Balloon, Long>, BalloonCustomRepository {
}
사용할때는 기존의 방식대로 BalloonRepository 타입의 객체를 주입받아 사용하면 된다.
왜 그런지는 아래를 참고하면 좋고, 나는 믹스인 처럼 동작한다고 생각하기로 했다.
https://docs.spring.io/spring-data/jpa/reference/repositories/custom-implementations.html
@Autowired
BalloonRepository balloonRepository;
List<Balloon> founds = balloonRepository.findNotRepliedOrderByCreatedAtDesc(replierId,
pageable);
'프로그래밍 > A music in a balloon' 카테고리의 다른 글
# 15 com.fasterxml.jackson.databind.exc.InvalidDefinitionException를 만나다. (0) | 2024.07.09 |
---|---|
# 14 지도, 풍선, 반응, 음악 (0) | 2024.07.09 |
# 12 프론트 개발 - 지도와 위치 정보 (0) | 2024.06.24 |
# 11 바람에 날리는 풍선은 어떻게 구현할까? (2) | 2024.06.11 |
# 10 스프링 예외처리 (1) | 2024.06.06 |