[Spring] JPA native query 사용시 dto mapping 방법

    [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 클래스를 사용하거나, 다른 방법으로 매핑해야 할 수 있습니다.

    댓글

    Designed by JB FACTORY