[Mybatis] 지연 로딩(Lazy Loading) 개념과 예제

지연 로딩(Lazy Loading)은 객체의 필드를 처음으로 접근할 때까지 해당 필드를 로드하지 않고, 필요한 시점에서 데이터를 로드하는 방법입니다. 이는 객체의 성능을 향상시키고 메모리 사용을 줄이는 데 도움이 됩니다. MyBatis는 지연 로딩을 지원하는데, 이를 통해 연관된 객체나 컬렉션을 필요할 때 로드할 수 있습니다.

예제: MyBatis를 사용한 지연 로딩

  1. 매퍼 인터페이스 작성:
public interface UserMapper {
    User getUserWithOrders(Long userId);
}` 
  1. 매퍼 XML 파일 작성:
<!-- UserMapper.xml -->
<mapper namespace="com.example.UserMapper">
    <resultMap id="userResultMap" type="User">
        <id property="id" column="user_id"/>
        <result property="username" column="username"/>
        <!-- orders 필드를 지연 로딩으로 설정 -->
        <collection property="orders" ofType="Order" select="getOrdersByUserId" fetchType="lazy"/>
    </resultMap>
    
    <select id="getUserWithOrders" resultMap="userResultMap">
        SELECT user_id, username FROM users WHERE user_id = #{userId}
    </select>
    
    <select id="getOrdersByUserId" resultType="Order">
        SELECT order_id, order_name FROM orders WHERE user_id = #{userId}
    </select>
</mapper>` 

위의 예제에서는 getUserWithOrders 메서드를 사용하여 사용자(User) 객체와 연관된 주문(Order) 객체들을 가져오는데, fetchType 속성을 lazy로 설정하여 지연 로딩을 활용하고 있습니다.

  1. Java 코드에서 호출:
public class Main {

    public static void main(String[] args) {
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        try (SqlSession sqlSession = sessionFactory.openSession()) {
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            
            Long userId = 1L;
            
            // getUserWithOrders 메서드를 호출하면 User 객체만 로드됨
            User user = userMapper.getUserWithOrders(userId);
            
            // orders 필드에 접근할 때 비로소 주문 데이터 로드됨
            List<Order> orders = user.getOrders();
            
            System.out.println("User: " + user);
            System.out.println("Orders: " + orders);
        }
    }
}` 

위의 예제에서 getUserWithOrders 메서드를 호출하면 사용자(User) 객체만 로드되고, 실제로 주문(Order) 데이터는 orders 필드에 처음 접근할 때 비로소 로드됩니다. 이렇게 필요한 시점에서 데이터를 로드하는 것이 지연 로딩의 핵심 아이디어입니다.

지연 로딩을 사용하면 필요한 데이터만 로드하여 성능을 최적화하고 메모리 사용을 줄일 수 있습니다. MyBatis를 통해 지연 로딩을 설정하면 연관된 객체나 컬렉션을 효율적으로 관리할 수 있습니다.