[Mybatis] 지연 로딩(Lazy Loading) 개념과 예제
지연 로딩(Lazy Loading)은 객체의 필드를 처음으로 접근할 때까지 해당 필드를 로드하지 않고, 필요한 시점에서 데이터를 로드하는 방법입니다. 이는 객체의 성능을 향상시키고 메모리 사용을 줄이는 데 도움이 됩니다. MyBatis는 지연 로딩을 지원하는데, 이를 통해 연관된 객체나 컬렉션을 필요할 때 로드할 수 있습니다.
예제: MyBatis를 사용한 지연 로딩
- 매퍼 인터페이스 작성:
public interface UserMapper {
User getUserWithOrders(Long userId);
}`
- 매퍼 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
로 설정하여 지연 로딩을 활용하고 있습니다.
- 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를 통해 지연 로딩을 설정하면 연관된 객체나 컬렉션을 효율적으로 관리할 수 있습니다.