300===Dev Framework/Spring

Spring @Options와 FlushCache 정책 😋

블로글러 2024. 11. 21. 20:33

오늘은 MyBatis의 @Options 애노테이션과 캐시 정책에 대해 자세히 알아보겠습니다!

@Options가 뭔가요? 🤔

마치 커피숍에서 주문할 때 "아이스로 해주세요", "시럽 추가해주세요" 같은 옵션을 지정하듯이,
@Options는 MyBatis 쿼리 실행 시 다양한 옵션을 설정할 수 있게 해주는 애노테이션입니다.

FlushCache 옵션은 어떤 역할을 하나요? 💫

FlushCache는 쿼리 실행 전/후에 캐시를 어떻게 처리할지 결정하는 정책입니다.

예를 들어보면:

  • TRUE로 설정: 커피숍에서 물통을 완전히 비우고 새로운 물을 채우는 것처럼, 캐시를 깨끗이 비웁니다
  • FALSE로 설정: 물통에 있는 물을 그대로 사용하는 것처럼, 기존 캐시를 유지합니다

어떻게 사용하나요? 🎬

1. 기본 사용법

@Options(flushCache = Options.FlushCachePolicy.TRUE)
@Update("UPDATE users SET name = #{name} WHERE id = #{id}")
int updateUser(User user);

2. 다양한 설정 옵션

@Options(
    flushCache = Options.FlushCachePolicy.TRUE,
    useCache = true,
    timeout = 10000
)
@Select("SELECT * FROM users WHERE id = #{id}")
User getUser(Long id);

FlushCache 정책의 종류 🌟

  1. TRUE

    • 쿼리 실행 시 캐시를 강제로 비움
    • INSERT, UPDATE, DELETE 작업에 주로 사용
    • 데이터 정합성 보장이 필요할 때 유용
  2. FALSE (기본값)

    • 캐시를 그대로 유지
    • SELECT 쿼리에 기본으로 설정됨
    • 성능 최적화에 도움

언제 사용해야 할까요? 📊

TRUE를 사용하는 경우

  1. 데이터가 변경되는 작업

    @Options(flushCache = Options.FlushCachePolicy.TRUE)
    @Update("UPDATE products SET stock = #{stock}")
    void updateStock(int stock);
  2. 실시간 데이터가 중요한 경우

    @Options(flushCache = Options.FlushCachePolicy.TRUE)
    @Select("SELECT balance FROM accounts WHERE id = #{id}")
    BigDecimal getBalance(Long id);

FALSE를 사용하는 경우

  1. 자주 변경되지 않는 데이터
    @Options(flushCache = Options.FlushCachePolicy.FALSE)
    @Select("SELECT * FROM categories")
    List<Category> getCategories();

주의할 점 ⚠️

  1. 성능 영향

    • TRUE 설정 시 캐시 재구성 비용 발생
    • 불필요한 캐시 초기화는 피하기
  2. 트랜잭션 고려

    • 트랜잭션 내에서 캐시 정책 일관성 유지 필요

실제 활용 예시 💡

1. 상품 재고 관리

@Service
public class ProductService {
    @Options(flushCache = Options.FlushCachePolicy.TRUE)
    @Update("UPDATE products SET stock = stock - #{quantity}")
    void decreaseStock(@Param("productId") Long productId, 
                      @Param("quantity") int quantity);

    @Options(flushCache = Options.FlushCachePolicy.FALSE)
    @Select("SELECT * FROM products")
    List<Product> getAllProducts();
}

2. 사용자 프로필 관리

@Service
public class UserService {
    @Options(flushCache = Options.FlushCachePolicy.TRUE)
    @Update("UPDATE users SET profile = #{profile}")
    void updateProfile(UserProfile profile);

    @Options(flushCache = Options.FlushCachePolicy.FALSE)
    @Select("SELECT * FROM users WHERE id = #{id}")
    User getUser(Long id);
}

성능 최적화 팁 🚀

  1. 선택적 캐시 초기화

    @Options(flushCache = Options.FlushCachePolicy.TRUE)
    @Update("UPDATE specific_table")
    void updateSpecificData();
  2. 배치 처리와 함께 사용

    @Options(flushCache = Options.FlushCachePolicy.TRUE)
    @Update("UPDATE batch_table")
    void batchUpdate(List<DataObject> dataList);

마치며 🎁

@Options의 FlushCache 정책은 마치 집안 대청소와 같습니다. 필요할 때만 하면 좋지만, 너무 자주하면 피곤하죠! 상황에 맞게 적절히 사용하면 데이터의 정확성과 성능을 모두 잡을 수 있습니다.


참고자료:

  1. MyBatis 공식 문서: https://mybatis.org/mybatis-3/
  2. Spring Framework 문서: https://docs.spring.io/
  3. MyBatis-Spring 가이드: http://mybatis.org/spring/
728x90