반응형

MyBatis는 효율적인 캐싱 메커니즘을 제공하여 데이터베이스 부하를 줄이고 성능을 개선할 수 있습니다. 오늘은 MyBatis에서 제공하는 1차 캐시와 2차 캐시를 활용하는 방법을 배워봅니다.


1. 캐싱의 필요성

데이터베이스에서 같은 데이터를 반복적으로 조회하는 경우, 캐싱을 활용하면 다음과 같은 이점이 있습니다:

  1. 응답 시간 단축: 동일한 요청 시 캐시 데이터를 반환하여 빠른 응답을 제공합니다.
  2. 데이터베이스 부하 감소: 중복 쿼리를 줄여 데이터베이스 부하를 경감합니다.

2. MyBatis의 캐시 종류

MyBatis는 두 가지 수준의 캐시를 지원합니다:

1차 캐시 (Session Cache)

  • 범위: SQL 세션(SqlSession) 범위에서 유효.
  • 동일한 세션 내에서 실행된 쿼리 결과를 캐싱.
  • 자동으로 활성화됨.

2차 캐시 (Mapper Cache)

  • 범위: Mapper 단위에서 여러 세션 간에 공유.
  • 수동으로 설정해야 활성화됨.
  • 더 넓은 범위에서 캐싱 효과를 제공.

3. 1차 캐시 활용

(1) 기본 동작

1차 캐시는 기본적으로 활성화되어 있으며, 동일한 SqlSession 내에서 동일한 쿼리를 수행하면 캐시된 결과를 반환합니다.

(2) 예제 코드

SqlSession session = sqlSessionFactory.openSession();
try {
    Employee employee1 = session.selectOne("findEmployeeById", 1);
    Employee employee2 = session.selectOne("findEmployeeById", 1); // 캐시 사용
    System.out.println(employee1 == employee2); // true
} finally {
    session.close();
}

4. 2차 캐시 활성화

(1) Mapper 설정

Mapper XML 파일에서 <cache> 태그를 추가합니다.

<mapper namespace="com.example.mapper.EmployeeMapper">
    <cache eviction="LRU" flushInterval="60000" size="512" readOnly="true"/>
</mapper>
  • eviction: 캐시 제거 정책(LRU, FIFO 등).
  • flushInterval: 캐시 갱신 간격(ms).
  • size: 캐시 객체 수 제한.
  • readOnly: 읽기 전용 여부 설정.

(2) MyBatis 설정 파일

mybatis-config.xml에서 2차 캐시를 활성화해야 합니다.

<settings>
    <setting name="cacheEnabled" value="true"/>
</settings>

5. 주의점

  • 1차 캐시 무효화: INSERT, UPDATE, DELETE를 실행하면 1차 캐시가 무효화됩니다.
  • 2차 캐시 무효화: Mapper 레벨에서 변경이 발생하면 캐시가 갱신됩니다.
  • 캐싱 적합성 판단: 캐싱이 모든 상황에서 유효하지 않을 수 있으므로 사용 시 주의가 필요합니다.

6. 실무 적용 사례

(1) 자주 조회되는 데이터

  • 코드 테이블, 공통 데이터 등 변경 빈도가 낮고 조회 빈도가 높은 데이터.

(2) 읽기 전용 데이터

  • 읽기 전용 데이터를 캐싱하면 성능을 더욱 극대화할 수 있습니다.
반응형

+ Recent posts