[java] MyBatis에서 쿼리 결과 캐시하기

MyBatis는 자바 기반의 ORM(Object-Relational Mapping) 프레임워크로, 데이터베이스와의 상호작용을 쉽게 처리할 수 있도록 도와줍니다. 한 가지 유용한 기능으로 쿼리 결과를 캐시하여 성능을 향상시킬 수 있다는 것을 알고 계셨나요?

쿼리 결과 캐싱은 쿼리의 실행 결과를 임시 저장소에 보관하여, 동일한 쿼리가 다시 실행될 때 데이터베이스로의 접근을 최소화하는 방식입니다. 이는 데이터베이스에 대한 부하를 줄이고 응답 시간을 개선할 수 있습니다.

캐시 설정하기

MyBatis에서는 쿼리 결과 캐시를 활용할 수 있는 설정을 제공합니다. 먼저, MyBatis의 캐시 관리자(Cache Manager) 를 설정해야 합니다. 캐시 관리자는 캐시를 생성하고 관리하는 역할을 담당합니다.

<configuration>
  <settings>
    <setting name="cacheEnabled" value="true" />
    <setting name="localCacheScope" value="STATEMENT" />
  </settings>
  <environments default="development">
    <environment id="development">
      <!-- 캐시 관리자 설정 -->
      <cache type="org.apache.ibatis.cache.impl.PerpetualCache"/>
      <!-- 데이터베이스 연결 설정 -->
      ...
    </environment>
  </environments>
</configuration>

위의 설정에서 cacheEnabled 속성을 true로 설정하여 캐시를 활성화하고, localCacheScope 속성을 STATEMENT로 설정하여 같은 스트링으로 실행된 쿼리 결과를 캐시하는 방식을 선택했습니다. 이 외에도 SESSIONTRANSACTION 등 다른 옵션도 사용할 수 있습니다.

캐시 적용하기

캐시를 적용하려는 쿼리 메서드에 @Select 애너테이션과 함께 @Options 애너테이션을 추가하여 캐시 옵션을 설정할 수 있습니다.

@Mapper
public interface UserMapper {
    @Options(useCache = true)
    @Select("SELECT * FROM user WHERE id = #{id}")
    User getUserById(int id);
}

위의 코드에서는 useCache 속성을 true로 설정하여 해당 쿼리 결과를 캐시하도록 설정했습니다. 이를 통해 동일한 id 값으로 호출되는 경우, 쿼리를 다시 실행하지 않고 캐시된 결과를 반환합니다.

캐시 유효성 검증하기

캐시를 사용하면 데이터베이스의 변동에 대응하기 위해 캐시의 유효성을 검증해야 합니다. MyBatis에서는 @Options 애너테이션의 flushCache 속성을 이용하여 캐시를 갱신하는 방법을 설정할 수 있습니다.

@Mapper
public interface UserMapper {
    @Options(useCache = true, flushCache = FlushCachePolicy.TRUE)
    @Select("SELECT * FROM user WHERE id = #{id}")
    User getUserById(int id);
}

위의 코드에서는 flushCache 속성을 FlushCachePolicy.TRUE로 설정하여 해당 쿼리 메서드 호출 후, 캐시를 갱신하도록 설정했습니다. 이를 통해 데이터베이스의 변동이 발생한 경우, 최신 데이터를 가져올 수 있습니다.

결론

MyBatis에서 쿼리 결과를 캐시하는 것은 성능 향상을 위한 좋은 방법입니다. 적절히 캐시 옵션을 설정하고, 캐시의 유효성을 검증하는 것은 중요한 과제입니다. 이를 통해 데이터베이스로의 접근을 최소화하고 애플리케이션의 응답 시간을 개선할 수 있습니다.


참고 문서 및 자료