[백엔드 강의] Query DSL 테스트

이나형·2024년 8월 29일
0
post-thumbnail

이 포스팅은 인프런 강의 중 쥬쥬님의 '쥬쥬와 함께 하루만에 시작하는 백엔드 - 스프링, 도커, AWS' 에 올라온
코드 및 사진 이미지 모두 해당 강의를 참고하였습니다.

(인프런)쥬쥬와 함께 하루만에 시작하는 백엔드 - 스프링, 도커, AWS링크


Qeury DSL을 활용한 예제

Custom Repository 인터페이스 정의

public interface TestRepositoryCustom {

    public List<TestEntity> findAllByQuerydsl(String name);
}

먼저, Custom Repository 인터페이스를 정의한다. 여기서는 TestRepositoryCustom이라는 인터페이스를 만들고, findAllByQuerydsl이라는 메서드를 선언한다.

이 인터페이스는 기본 JPA 레포지토리의 기능을 확장하기 위해 사용된다. findAllByQuerydsl 메서드는 특정 조건에 따라 TestEntity의 리스트를 반환하는 역할을 한다.



Custom Repository 구현체 작성

@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 참고한 블로그




Service에 메서드 추가

public List<TestEntity> findAllByNameByQuerydsl(String name){
        return testRepository.findAllByQuerydsl(name);
    }

이 메서드는 레포지토리에서 데이터를 가져와서 서비스 레이어에 반환하는 역할을 한다.



Rest API 구현

이제 위에서 구현한 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"인 객체만 정확히 조회되는 것을 확인할 수 있다.

profile
정도를 걷는 개발자

0개의 댓글