[MyBatis] ResultHandler에 대해
.
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는 대용량 데이터 조회 사용 시 좋지만 기존 소스보다 복잡해지기 적절하게 사용함이 좋을 것 같습니다.