오늘은 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 정책의 종류 🌟
TRUE
- 쿼리 실행 시 캐시를 강제로 비움
- INSERT, UPDATE, DELETE 작업에 주로 사용
- 데이터 정합성 보장이 필요할 때 유용
FALSE (기본값)
- 캐시를 그대로 유지
- SELECT 쿼리에 기본으로 설정됨
- 성능 최적화에 도움
언제 사용해야 할까요? 📊
TRUE를 사용하는 경우
데이터가 변경되는 작업
@Options(flushCache = Options.FlushCachePolicy.TRUE) @Update("UPDATE products SET stock = #{stock}") void updateStock(int stock);
실시간 데이터가 중요한 경우
@Options(flushCache = Options.FlushCachePolicy.TRUE) @Select("SELECT balance FROM accounts WHERE id = #{id}") BigDecimal getBalance(Long id);
FALSE를 사용하는 경우
- 자주 변경되지 않는 데이터
@Options(flushCache = Options.FlushCachePolicy.FALSE) @Select("SELECT * FROM categories") List<Category> getCategories();
주의할 점 ⚠️
성능 영향
- TRUE 설정 시 캐시 재구성 비용 발생
- 불필요한 캐시 초기화는 피하기
트랜잭션 고려
- 트랜잭션 내에서 캐시 정책 일관성 유지 필요
실제 활용 예시 💡
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);
}
성능 최적화 팁 🚀
선택적 캐시 초기화
@Options(flushCache = Options.FlushCachePolicy.TRUE) @Update("UPDATE specific_table") void updateSpecificData();
배치 처리와 함께 사용
@Options(flushCache = Options.FlushCachePolicy.TRUE) @Update("UPDATE batch_table") void batchUpdate(List<DataObject> dataList);
마치며 🎁
@Options의 FlushCache 정책은 마치 집안 대청소와 같습니다. 필요할 때만 하면 좋지만, 너무 자주하면 피곤하죠! 상황에 맞게 적절히 사용하면 데이터의 정확성과 성능을 모두 잡을 수 있습니다.
참고자료:
- MyBatis 공식 문서: https://mybatis.org/mybatis-3/
- Spring Framework 문서: https://docs.spring.io/
- MyBatis-Spring 가이드: http://mybatis.org/spring/
728x90
'300===Dev Framework > Spring' 카테고리의 다른 글
@Autowired 어노테이션 완벽 가이드 🚀 (0) | 2024.12.06 |
---|---|
Spring에서의 Builder 패턴 완벽 가이드 🏗️ (0) | 2024.11.28 |
Spring Controller HTTP 메소드 어노테이션 완벽 가이드 🎯 (0) | 2024.11.14 |
Spring Controller 완벽 가이드 🎯 (3) | 2024.11.14 |
Spring Data JDBC: JPA보다 가벼운 ORM의 대안 🚀 (1) | 2024.11.14 |