JPA

JPQL 사용 시 DTO Mapping 하는 법

초록색거북이 2023. 2. 24. 13:56
728x90
반응형
SMALL

예를 들어

테이블명

User

 

칼럼 

id

name

age

height

nickname

address

 

있다고 가정 해본다.

프론트는 서버로 요청할 것이다. ([ex] id 값이 5인 사람의 주소를 줘)

 

서버는 데이터베이스에 있는 자료를 찾아서 id값이 5인 사람의 주소(address)를 반환 해줘야 한다.

 

프론트로부터 받은, 파라미터 id = 5 가지고, 우리는 spring data jpa 를 이용하여 쿼리를 날린다.

id = 5 라고 가정.

userRepository.findById(id);

위의 메소드를 이용을 하면, jpa 에서는 자동적으로 쿼리를 만들어 데이터베이스의 데이터들을 조회해온다.

이때 발생되는 쿼리는 select id,name,age,height,nickname,address from user; 이다.

user 테이블의 모든 칼럼을 조회해온다.

 

여기서

굳이 모든 칼럼을 조회해올 필요가 있을까?... 칼럼이 많아지면 많아질수록 성능은 당연히 느려질 것이다.

 

그래서 우리는 JPQL 과 DTO Mapping을 해보기로 한다.

JPQL을 이용하여 DTO Mapping을 해놓으면, 우리가 필요한 칼럼만 조회해올수 있는 쿼리를 뽑아내준다.

 

Entity

@Entity
@Getter
@Setter
@NoArgsConstructor
@Table(name = "user")
@AllArgsConstructor
public class User {
    @Id
    private String id;
    private String name;
    private String age;
    private String height;
    private String nickname;
    private String address;
}

UserDto

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class UserDto {
    private String id;
    private String name;
    private String age;
    private String height;
    private String nickname;
    private String address;
}

 

Repository

public interface UserRepository extends JpaRepository<User, Long> {

    @Query(value = """
          select new kr.co.test.test.api.web.dto.UserDto
          (u.address)
          from User u
          where u.id = :id
            """
    List<User> findById(@Param("id") Long id);

여기서 중요한 것은, select 구분에서 new를 적어준다. 생성자를 통해 객체를 반환해야한다.

이렇게 짜주면, 원하는 칼럼만 조회해올수 있는 쿼리를 만들 수 있다.

실제로 동작도 select 구문에 명시해준 칼럼만 조회해오는 쿼리를 볼 수 있다.

728x90
반응형
LIST