Skip to main content

Command Palette

Search for a command to run...

[Spring] @Cacheable, @CachePut, @CacheEvict

Updated
2 min read
[Spring] @Cacheable, @CachePut, @CacheEvict
S

Nice to meet u :) Im Backend Developer

캐시는 서버의 부담을 줄이고 성능을 높이기 위해 사용되는 기술이다. 반복적으로 동일한 결과를 반환하는 경우 용이하다.

✅ 설정

@EnableCaching
@Configuration 
public class CacheConfig {
    ... 
}

✅ 캐시 매니저 빈 추가

캐시를 관리해 줄 CacheManager를 빈으로 등록한다.

  • ConcurrentMapCacheManager : Java의 ConcurrentHashMap을 사용해 구현

  • SimpleCacheManager : 캐시를 직접 등록하여 사용

1️⃣ @Cacheable

캐시를 저장/조회하기 위함

캐시를 적용할 메서드에 이 어노테이션을 붙여주면 캐시에 데이터가 없을 경우 기존의 로직을 실행한 후에 캐시에 데이터를 추가하고 캐시에 데이터가 있으면 캐시의 데이터를 반환한다.

@Cacheable("bestSeller")
public Book getBestSeller(String bookNo) {
..
}

캐시는 기본적으로 캐시 이름 하위에 key-value형태로 저장하는데 bestSeller가 캐시의 이름이고 그 하위에 bookNo를 key값으로 저장한다.

  1. getBestSeller(1) 처음 호출

    • bestSeller캐시에 bookNo(1)에 해당하는 값이 있는지 확인한다.(값 없음)

    • 캐시에 값이 없으므로 해당 로직을 실행하여 값을 반환한다.

    • 반환한 값을 캐시에 bookNo(1)의 value로 저장한다.

  2. getBestSeller(1) 두번째 호출

    • bestSeller캐시에 bookNo(1)에 해당하는 값이 있는지 확인한다.(값 있음)

    • 캐시에 값이 있으므로 로직을 실행하지 않고 캐시에서 조회한 값을 반환한다.

메서드에 파라미터가 없다면 0을 key로 저장하고 여러개면 hashCode값을 조합하여 키를 생성한다. 여러 파라미터 중에서 1개만 키 값으로 지정하는 경우는 key값을 별도로 지정해주면 된다.

@Cacheable(value = "bestSeller", key = "#bookNo")
public Book getBestSeller(String bookNo, User user, Date dateTime) {

}

만약 파라미터가 객체라면 하위속성에 접근해야한다.

@Cacheable(value = "bestSeller", key = "#book.bookNo")
public Book getBestSeller(Book book, User user, Date dateTime) {

}

만약 파라미터 값이 특정 조건인 경우에만 적용해야한다면 condition을 이용한다.

@Cacheable(value = "bestSeller", key = "#book.bookNo", condition = "#user.type == 'ADMIN'")
public Book getBestSeller(Book book, User user, Date dateTime) {

}

2️⃣ @CachePut

캐시에 값을 저장하는 용도로만 사용한다. 항목을 변경할 때마다 선택적으로 업데이트한다. @Cacheable과 유사하게 실행 결과를 캐시에 저장하지만 조회시 저장된 캐시의 내용을 사용하지 않고 항상 메서드의 로직을 실행한다.

3️⃣ @CacheEvict

만약 값이 달라진다면 캐시를 제거해야하는 것처럼 캐시는 적절한 시점에 제거가 되어야한다.

  • 일정한 주기로 제거

  • 값이 변할 때 제거

이 어노테이션에 캐시 이름을 넣어주면 메서드가 실행될 때 캐시의 내용이 제거된다.

@CacheEvict(value = "bestSeller")
public void clearBestSeller() {
}
-- 메서드의 키에 해당하는 캐시만 제거하는데 밑은 bookNo키 값 캐시만 제거된다.
@CacheEvict(value = "book", key = "#book.bookNo")
public void updateBook(Book book) {

}
--캐시에 저장된 값을 모두 제거할 필요가 있다면 다음 옵션을 true로 설정한다.
@CacheEvict(value = "bestSeller", allEntires = true)
public void clearBestSeller() {

}

More from this blog

[Spring] N+1문제 발생과 분석

✍️ 작성하게 된 이유 옷을 관리하는 서비스를 개발하면서 Cloth 엔티티와 그에 연관된 ClothWithAttributes, Attribute 데이터를 함께 조회하는 기능이 필요했다.그런데 연관 데이터를 조회할 때마다 쿼리가 폭발적으로 증가(N+1 문제) 하며, 성능이 급격히 저하되는 상황을 마주하게 되었다. Spring JPA의 대표적인 문제로 N+1임을 알고있었지만, 해결하는 방법은 Fetch Join밖에 몰랐다. 지연로딩되는 필드를 엔티...

Sep 17, 20256 min read
[Spring] N+1문제 발생과 분석

데이터베이스 기본 개념 정리

1️⃣ 데이터베이스(DB) & DBMS DB (Database): 일정한 규칙(스키마)에 따라 구조화되어 저장된 데이터의 집합. DBMS (Database Management System): DB를 제어/관리하는 시스템 소프트웨어. 특징: 실시간 접근 가능, 동시 공유 가능. 구조: 데이터베이스 → DBMS → 응용 프로그램 → 사용자 2️⃣ 엔티티(Entity) & 릴레이션(Relation) 엔티티: 여러 속성을 가진 "개체"...

Aug 5, 20252 min read
데이터베이스 기본 개념 정리

[Project] 날씨에 맞는 옷 추천 서비스 : 지그재그 크롤링 여정 기록 (1) ChromeDriver를 EC2에 설치하기

✍️ 작성하게 된 이유 무신사, 29cm는 Jsoup으로 충분히 크롤링이 가능했기 때문에, ZigZag도 당연히 Jsoup으로 처리될 것이라 생각했다. 무신사, 29cm와 마찬가지로 필요한 데이터는 모두 <script> 태그 안에 들어있었다. 하지만… 예상은 보기 좋게 빗나갔다. 🧪 현상 ✅ 로컬 크롤링 → 정상 작동 Jsoup으로 script 태그 내에서 대표 이미지와 상품명을 잘 추출 로컬 환경에서는 아무 문제 없이 작동 ❌ A...

Jul 30, 20253 min read
[Project] 날씨에 맞는 옷 추천 서비스 : 지그재그 크롤링 여정 기록 (1) ChromeDriver를 EC2에 설치하기

[Project] 날씨에 맞는 옷 추천 프로젝트: Selenium은 정말 필요한 선택이었을까? - 크롤링 삽질 기록

✍️ 작성하게 된 이유 날씨에 따라 옷을 추천해주는 서비스를 만들면서, 사용자가 입력한 구매 링크에서 옷 정보( 대표이미지, 상품명 )를 불러오는 기능이 필요했다. 처음에 해당 페이지를 동적 페이지로 판단했고, 자연스럽게 Selenium을 도입했다. 하지만 이 결정이 과연 최선이었는지는 수많은 시행착오 끝에야 알 수 있었다. 🕸️ Selenium을 선택한 이유 동적 페이지는 Jsoup으로 크롤링이 어렵다는 인식으로 처음부터 Selenium을 ...

Jul 28, 20254 min read
[Project] 날씨에 맞는 옷 추천 프로젝트: Selenium은 정말 필요한 선택이었을까? - 크롤링 삽질 기록

Soyulia's Blog

49 posts