Java / / 2023. 1. 13. 12:56

[JPA] 프로젝션과 결과 반환 - 기본

반응형

해당 글은 김영한님의 querydsl을 수강하며 정리하려고 적는 포스팅입니다.

 

QueryDsl

  • 오픈소스 프레임 워크이다.
  • 정적 타입을 이용하서 SQL과 같은 쿼리를 생성할 수 있도록 해준다.
  • 쿼리를 문자열로 작성하거나 직접 작성하는 것이 아니다.
  • 자체적으로 제공하는 Fluent API를 이용해 코드 작성의 형식으로 쿼리를 생성할 수 있게 도와준다.

프로젝션 이란?

  • sql의 select절에 무엇을 가져올 것인지 대상을 지정하는 것을 의미한다.

 

프로젝션 대상이 하나인 경우

List<String> result = queryFactory
     .select(member.username)
     .from(member)
     .fetch();
  • 프로젝션 대상이 하나이면 타입을 명확하게 지정할 수 있다.
  • 프로젝션 대상이 둘 이상이면 튜플이나 DTO로 조회 가능하다.

 

1. 프로젝션 기본 조회

  • 프로젝션 대상이 둘 이상일 때 사용한다.
  • com.querydsl.core.Tuple
  • String 대신에 객체 타입인 Member를 넣어도 상관이 없다.
@Test
public void simpleProjection() {
    //객체 타입인 Mebmer를 넣어도 상관 없음
    List<String> result = queryFactory
            .select(member.username)
            .from(member)
            .fetch();

    for (String s : result) {
        System.out.println("s = " + s);
    }
}

//-------------------------------------------------------------------------
2023-01-13T12:42:37.476+09:00 DEBUG 9840 --- [           main] org.hibernate.SQL                        : 
    /* select
        member1.username 
    from
        Member member1 */ select
            m1_0.username 
        from
            member m1_0
            
s = member1
s = member2
s = member3
s = member4

 

 

 

2. 튜플 조회

@Test
public void tupleProjection() {
    List<Tuple> result = queryFactory
            .select(member.username, member.age)
            .from(member)
            .fetch();

    for (Tuple tuple : result) {
        String username = tuple.get(member.username);
        Integer age = tuple.get(member.age);
        System.out.println("username = " + username);
        System.out.println("age = " + age);
    }
}

//------------------------------------------------------
2023-01-13T12:45:26.804+09:00 DEBUG 3952 --- [           main] org.hibernate.SQL                        : 
    /* select
        member1.username,
        member1.age 
    from
        Member member1 */ select
            m1_0.username,
            m1_0.age 
        from
            member m1_0
            
username = member1
age = 10
username = member2
age = 20
username = member3
age = 30
username = member4
age = 40

 

 

※ 참고

  1. DTO : 자바 빈을 생성하고, 여러 데이터들을 받을 수 있도록 자료 구조를 만들어 둔 것이다. (임의로 자료 구조에 맞게 생성)
  2. Tuple : Querydsl이 여러개를 조회할 때를 대비하여 만들어둔 타입.

 

 

정리

Tuple은 repository 계층에서 쓰는 것은 상관없다.

하지만, service 계층이나 controller에서 사용하는 것은 크게 좋지 않다고 생각한다.

Tuple도 qeurydsl에 종속적인 타입이기 때문에 repository안에서 쓰고 정리하고, 밖의 계층으로 던지는 것은 DTO로 변환해서 나가는 것을 권장한다.

(나머지 계층에서는 의존이 없도록 설계하는 것이 좋다.)

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유