[java] MyBatis에서 캐싱 처리하기

캐싱은 데이터베이스에서 데이터를 조회할 때 반복적으로 동일한 쿼리를 실행하지 않고 결과를 캐시하여 성능을 향상시키는 기술입니다. MyBatis는 캐싱을 지원하여 쿼리 실행 속도를 향상시킬 수 있습니다.

1. 캐시 설정하기

MyBatis에서 캐시를 사용하려면 cacheEnabled 속성을 true로 설정해야 합니다. 이 속성은 MyBatis의 설정 파일인 mybatis-config.xml에 설정할 수 있습니다.

<configuration>
  ...
  <setting name="cacheEnabled" value="true" />
  ...
</configuration>

2. 캐시 적용하기

MyBatis에서는 두 가지 종류의 캐시를 제공합니다: Local CacheSecond Level Cache입니다.

2.1. Local Cache

Local Cache는 MyBatis에서 기본적으로 제공하는 캐시로, 동일한 세션 내에서만 캐시를 사용할 수 있습니다. Local Cache를 사용하려면 localCacheScope 속성을 SESSION으로 설정해야 합니다. 이 설정은 mapper<cache> 요소로 설정할 수 있습니다.

<mapper namespace="com.example.mapper">
  <cache type="org.apache.ibatis.cache.impl.PerpetualCache" />
  ...
</mapper>

2.2. Second Level Cache

Second Level Cache는 여러 세션 간에 캐시를 공유할 수 있는 캐시입니다. Second Level Cache를 사용하려면 localCacheScope 속성을 STATEMENT로 설정해야 합니다. 이 설정은 mapper<cache> 요소로 설정할 수 있습니다.

<mapper namespace="com.example.mapper">
  <cache type="org.apache.ibatis.cache.impl.PerpetualCache" localCacheScope="STATEMENT" />
  ...
</mapper>

3. 결과 캐시하기

MyBatis에서는 @Cacheable 애노테이션을 사용하여 개별적으로 결과를 캐싱할 수 있습니다.

@Cacheable(namespace = "com.example.mapper.UserMapper", key = "#id")
User getUserById(int id);

위의 예제에서 @Cacheable 애노테이션은 User 객체를 id를 기준으로 캐싱하는 역할을 합니다.

4. 캐시 비우기

MyBatis에서는 @CacheEvict 애노테이션을 사용하여 캐시를 비울 수 있습니다.

@CacheEvict(namespace = "com.example.mapper.UserMapper", key = "#id")
void deleteUserById(int id);

위의 예제에서 @CacheEvict 애노테이션은 id를 기준으로 캐시를 비우는 역할을 합니다.

결론

MyBatis는 캐싱을 통해 쿼리의 반복 수행을 줄이고 성능을 향상시킬 수 있는 강력한 기능을 제공합니다. 위에서 설명한 방법을 사용하여 캐시 설정과 사용 방법을 적절히 활용하여 MyBatis의 성능을 최적화할 수 있습니다.

참고 자료