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