JAVA/JDBC

[MyBatis] ResultHandler에 대해

JongHyun99 2023. 9. 12. 17:38
728x90

.
ResultHandler는 MyBatis에서 제공하는 인터페이스로, SQL 쿼리의 결과를 자바 객체로 변환하는 과정을 사용자가 직접 제어할 수 있게 해줍니다. handleResult 메소드를 오버라이딩하여, 원하는 방식으로 결과를 매핑하거나 추가적인 로직을 적용할 수 있습니다.

이 두 요소의 조합을 통해, 데이터베이스에서 쿼리 결과를 더 유연하고 효율적으로 다룰 수 있게 됩니다.

 

 


필요성
대용량 데이터 처리
일반적인 MyBatis의 쿼리 실행 방식은 1건씩 호출하기에 대용량 데이터에 비효율적입니다.

그러나 ResultHandler를 사용하면, 결과 셋이 DB에서 한 번에 하나씩 메모리에 로드되기 때문에 대용량 데이터도 효율적으로 처리할 수 있습니다.

 

 

작동 원리
내부 구조
ResultHandler는 handleResult라는 메소드를 가지고 있으며, 이 메소드는 쿼리 결과가 도착할 때마다 호출됩니다. 이 메소드 내에서 결과 데이터를 원하는 형태의 자바 객체로 변환하거나, 필요한 추가 작업을 수행할 수 있습니다.

작동 메커니즘
SQL 쿼리가 실행된 후, MyBatis는 결과 셋을 한 행씩 읽어 handleResult 메소드를 호출합니다. 이 과정에서 ResultHandler가 구현한 로직이 적용되며, 이를 통해 사용자는 SQL 쿼리 결과에 대한 높은 수준의 제어를 할 수 있습니다.

 

 

 

사용예제

 

Mapper 인터페이스

public interface UserMapper {
  void getAllUsers(ResultHandler<User> resultHandler);
}

 

Mapper XML

<select id="getAllUsers" resultType="User">
  SELECT * FROM User
</select>

 

서비스 클래스

@Service
public class UserService {
  @Autowired
  private UserMapper userMapper;

  public void listAllUsers() {
    ResultHandler<User> resultHandler = new ResultHandler<User>() {
      @Override
      public void handleResult(ResultContext<? extends User> resultContext) {
        User user = resultContext.getResultObject();
        // 원하는 처리 로직
        System.out.println("User ID: " + user.getId());
        System.out.println("User Name: " + user.getName());
      }
    };

    userMapper.getAllUsers(resultHandler);
  }
}

 

 

SqlSession을 스프링에서 관리하도록 처리하였으며

resultHandler도 인터페이스 단으로 넘겨 가능한 간단하고 유연하게 구조를 만들 수 있습니다.

 

 

ResultHandler는 대용량 데이터 조회 사용 시 좋지만 기존 소스보다 복잡해지기 적절하게 사용함이 좋을 것 같습니다.