[Spring] JPA native query 사용시 dto mapping 방법
- 코딩/Spring
- 2022. 11. 29.
[Spring] JPA native query 사용시 dto mapping 방법 알아보기
1. EntityManager를 사용하여 Native Query 실행
@PersistenceContext
private EntityManager entityManager;
public List<MyDto> getMyDtoList() {
String sql = "SELECT * FROM my_table";
Query query = entityManager.createNativeQuery(sql, MyDto.class);
List<MyDto> myDtoList = query.getResultList();
return myDtoList;
}
EntityManager를 사용하여 Native Query를 실행하고, 이를 DTO 객체에 매핑합니다.
위 코드에서 createNativeQuery() 메서드의 두 번째 인수는 매핑할 DTO 클래스입니다.
2. JdbcTemplate를 사용하여 Native Query 실행
@Autowired
private JdbcTemplate jdbcTemplate;
public List<MyDto> getMyDtoList() {
String sql = "SELECT * FROM my_table";
List<MyDto> myDtoList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(MyDto.class));
return myDtoList;
}
Spring의 JdbcTemplate을 사용하여 Native Query를 실행하고, 이를 DTO 객체에 매핑합니다. 이를 위해서는 다음과 같은 코드를 사용할 수 있습니다.
BeanPropertyRowMapper는 ResultSet에서 가져온 데이터를 MyDto 클래스의 프로퍼티에 자동으로 매핑하는데 사용됩니다. 이 메서드는 Spring에서 제공되는 편리한 방법입니다.
3. @SqlResultSetMapping을 사용하여 Native Query 실행
@SqlResultSetMapping(
name = "myDtoMapping",
classes = @ConstructorResult(
targetClass = MyDto.class,
columns = {
@ColumnResult(name = "col1"),
@ColumnResult(name = "col2"),
@ColumnResult(name = "col3")
}
)
)
public List<MyDto> getMyDtoList() {
String sql = "SELECT col1, col2, col3 FROM my_table";
Query query = entityManager.createNativeQuery(sql, "myDtoMapping");
List<MyDto> myDtoList = query.getResultList();
return myDtoList;
}
@SqlResultSetMapping 어노테이션을 사용하여 Native Query 결과를 매핑할 DTO 클래스를 정의하고, EntityManager를 사용하여 Native Query를 실행합니다.
@SqlResultSetMapping 어노테이션은 MyDto 클래스와 MyDto 클래스의 생성자를 정의하며, 각 컬럼과 DTO의 프로퍼티를 매핑합니다. 이 메서드는 특정 DTO 클래스의 생성자 인수와 컬럼 이름을 매핑하여 결과를 처리하는데 사용됩니다. 이 방법은 XML을 사용하여 동일한 일을 수행하는 방법과 비교하여 좀 더 간단하고 쉬운 방법입니다.
4. Native Query를 실행할 때, 결과를 DTO 인터페이스로 생성하는 방법
1. Dto 인터페이스를 작성
public interface UserDtoInterface {
Long getId();
String getUsername();
String getEmail();
}
2. Native Query를 작성합니다. 이때, SELECT 절에서 DTO 인터페이스의 필드와 동일한 이름의 열을 선택해야 합니다.
String sql = "SELECT id, username, email FROM users WHERE id = :id";
Query query = entityManager.createNativeQuery(sql, UserDtoInterface.class);
query.setParameter("id", 1L);
3. 결과를 DTO 인터페이스로 매핑
UserDtoInterface result = (UserDtoInterface) query.getSingleResult();
이 방법을 사용하면 Native Query의 결과를 DTO 인터페이스로 쉽게 매핑할 수 있습니다. 그러나 DTO 인터페이스에 정의된 필드 이외의 필드가 존재할 경우, 매핑이 제대로 이루어지지 않을 수 있으므로 주의해야 합니다. 이런 경우에는 DTO 클래스를 사용하거나, 다른 방법으로 매핑해야 할 수 있습니다.
'코딩 > Spring' 카테고리의 다른 글
[Linux] Linux에서 SpringBoot jar 파일 서비스 등록해 자동실행 되게 하기(+ 서비스 관련 기본 명령어들) (0) | 2023.01.03 |
---|---|
[Spring]Jpa insert default value (0) | 2022.12.14 |
[Spring] JPA In 절 사용하기 (1) | 2022.11.29 |
[Spring] DB커넥션풀과 Hikari CP란? (0) | 2022.11.23 |
Over-fetching vs Under-fetching (0) | 2022.11.22 |