이 포스팅은 인프런 강의 중 쥬쥬님의 '쥬쥬와 함께 하루만에 시작하는 백엔드 - 스프링, 도커, AWS' 에 올라온
코드 및 사진 이미지 모두 해당 강의를 참고하였습니다.
(인프런)쥬쥬와 함께 하루만에 시작하는 백엔드 - 스프링, 도커, AWS링크
public interface TestRepositoryCustom {
public List<TestEntity> findAllByQuerydsl(String name);
}
이 인터페이스는 기본 JPA 레포지토리의 기능을 확장하기 위해 사용된다. findAllByQuerydsl 메서드는 특정 조건에 따라 TestEntity의 리스트를 반환하는 역할을 한다.
@RequiredArgsConstructor
@Repository
public class TestRepositoryImpl implements TestRepositoryCustom{
private final JPAQueryFactory queryFactory;
@Override
public List<TestEntity> findAllByNameByQuerydsl(String name) {
return queryFactory.selectFrom(QTestEntity.testEntity)
.where(QTestEntity.testEntity.name.eq(name))
.fetch();
}
}
다음으로, 위에서 정의한 인터페이스를 구현하는 TestRepositoryImpl 클래스를 작성한다.
이 클래스는 TestRepositoryCustom 인터페이스를 구현하며, 실제로 QueryDSL을 사용하여 데이터베이스에서 데이터를 조회하는 로직을 포함한다.
QTestEntity.testEntity는 QueryDSL이 자동 생성하는 Q 클래스이며, 이 클래스는 엔티티의 필드에 접근할 수 있는 메타 데이터를 제공한다.
Q 클래스란 무엇일까?
QueryDSL을 공부하면서 Q클래스에 대한 언급이 나왔는데,
이를 왜 사용하는지 이것은 무엇인지에 대한 의문이 생겼다.
참고한 사이트 : Query DSL Qclass 참고한 블로그
public List<TestEntity> findAllByNameByQuerydsl(String name){
return testRepository.findAllByQuerydsl(name);
}
이 메서드는 레포지토리에서 데이터를 가져와서 서비스 레이어에 반환하는 역할을 한다.
이제 위에서 구현한 QueryDSL 기반 메서드를 활용하여 API를 구현한다.
'TestQueryApi' 클래스를 생성하여 Rest API 엔드포인트를 정의한다.
@RequiredArgsConstructor
@RestController
public class TestQueryApi {
private final TestService testService;
@GetMapping("/test/query/querydsl")
public List<TestEntity> queryQuerydsl(){
return testService.findAllByNameByQuerydsl("jyujyu");
}
}
이 REST 컨트롤러는 /test/querydsl 엔드포인트를 통해 findAllByNameByQuerydsl 메서드를 호출한다.
우선 H2 데이터베이스에 연결하여 데이터가 아무것도 없는 상태임을 확인한 후,
http://localhost:8080/test/entity/create로
{
"name": "backend",
"age": 20
}
와
{
"name": "jyujyu",
"age": 20
}
로 데이터베이스에 두 개의 데이터를 삽입한다.
그럼 이렇게 두개의 데이터가 잘 들어갔음을 확인할 수 있고
위에서 만든 API를 실행한다.
그러면 이름이 "jyujyu"인 객체만 정확히 조회되는 것을 확인할 수 있다.