티스토리 뷰
블로그프로젝트를 할 때 나는 프론트엔드와 백엔드가 분리된 방식으로 진행했다.
이 때 레이아웃에 대한 정보 중 자주 바뀌지 않는 자료들이 있다.
- 카테고리 정보
- 카테고리 정보는 블로그 주인이 변경하지 않는다면 자주 바뀌지 않는 정보이다.
- 가져오는 모든 카테고리 정보에 대해 애플리케이션 단에서 계층형 카테고리 작업까지 진행하기에 매번 조회한다면 성능상 문제가 될 수도 있다.
- 글의 개수
- 페이징을 위한 총 글의 개수 정보 또한 블로그 주인이 글을 추가하거나 삭제하지 않는이상 거의 변하지 않는 정보이다
이러한 정보들을 캐시에 담아두고 요청을 할 때 DB까지가지않고 캐시에서 가져오는 전략을 사용하면 애플리케이션의 성능을 높일 수 있을 것이다.
스프링 내장 캐시?
스프링 프레임워크는 자체 내장 캐시를 제공하는데 이 내장 캐시는 간단하고 빠르며, 많은 설정이 필요없기에 쉽게 사용할 수 있다.
스프링 내장 캐시는 메모리 기반 캐시를 사용하며, 캐시는 애플리케이션의 라이프 사이클과 함께 생성 및 파괴된다.
아래의 어노테이션을 통해 간편하게 사용할 수 있다.
- @EnableCaching : 캐시를 활성화하고 스프링 캐시 관련 빈들을 생성합니다.
- @Cacheable : 메소드의 리턴값을 캐시에 저장하고, 동일한 파라미터로 메소드가 호출되면 캐시에서 값을 반환합니다. 캐시에 값이 없다면 메서드를 실행하고 반환된 값을 캐시에 저장한 후에 값을 반환한다.
- @CachePut : 메소드의 리턴값을 캐시에 갱신합니다. 항상 메소드를 실행하고, 실행된 결과를 캐시에 저장합니다.
- @CacheEvict : 지정된 캐시에서 데이터를 삭제합니다.
캐시 활성화 시키기
@Configuration
@EnableCaching
public class CacheConfig {
@Bean
public CacheManager cacheManager() {
SimpleCacheManager simpleCacheManager = new SimpleCacheManager();
simpleCacheManager.setCaches(List.of(
new ConcurrentMapCache("CategoryLayoutStore"),
new ConcurrentMapCache("totalCount"))
);
return simpleCacheManager;
}
}
- CacheManager을 Bean으로 등록하면서 내부 캐시에서 사용할 캐시이름을 등록했다.
- 이렇게 등록한 캐시의 이름은 캐시를 @Cacheable 등의 어노테이션에서 사용할 수 있다.
언제 사용할까?
카테고리의 추가, 수정, 삭제 작업이 일어났을 경우에는 캐시의 데이터를 갱신해야하고 카테고리의 정보를 조회하는 작업에서는 캐시에서 데이터를 가져와야 한다.
"카테고리 추가"
"카테고리 삭제"
"카테고리 조회"
이렇게 한다면 반복적인 조회 데이터를 더욱 빠르게 가져올 수 있고 사용자 경험이 좋아질 것이다.
페이징에 필요한 글 개수에 대한 캐시도 카테고리와 유사하게 캐시를 적용하면 된다.
이렇게 스프링 기본 캐시는 간편한 설정과 어노테이션만으로 간단하게 구현이 가능하다.
하지만 모든 기능에능 트레이드오프가 있는거처럼 해당 기능에도 단점이 있다.
1. 확장성이 낮음
스프링 내장 캐시는 메모리 기반 캐시이기에 대규모 애플리케이션에서 스케일 아웃을 한다면 각 캐시에 대한 데이터 정합성이 흔들릴 가능성이 크다. 따라서 대규모 애플리케이션에서는 외부 캐시 라이브러리나 프로그램을 사용하는 것이 좋다.
2. 제한된 기능
캐시에 저장하고 가져오는 기본적인 기능만을 제공한다.
3. 제한된 성능
메모리 기반 캐시이므로 대규모 애플리케이션에서는 성능문제가 발생할 수도 있다. 또한 분산 서버 환경에서 서버 간의 캐시 동기화가 필요한 경우 문제가 될 수 있다.
위와 같은 단점이 있으므로 잘 선택해서 기술을 사용해야한다.
'만들어보자!!' 카테고리의 다른 글
[토이프로젝트 저장소]검색어 자동완성 기능을 만들어보자(1) - 기존상황 및 고려사항 그리고 기능 블록도 (0) | 2023.08.05 |
---|---|
[트러블슈팅] 특정 URL에 대한 스프링 시큐리티 필터체인 무시가 안되는 문제 (0) | 2023.07.11 |
[블로그프로젝트] - 임시저장기능 만들기 (0) | 2022.11.30 |
[블로그프로젝트] - Fetch Join을 통한 성능 개선 (0) | 2022.11.25 |
게시판 만들기 - Entity 개발 (0) | 2022.09.24 |
- Total
- Today
- Yesterday
- 서블릿#Servlet
- MVC
- arraylist
- 1316번
- 프로그래머스
- 백준
- 오류
- 7568
- 스프링
- 대충 만든 자판
- 게시판#자바#JPA#Entity
- querydsl
- 백준#서강근육맨#20300
- 회고
- 4673번
- java
- 자바
- 백엔드#게시판
- HTTP#HTTP특징
- controller
- Spring
- 덧칠하기
- 1978
- 파이썬
- 백준#잃어버린 괄호#1541
- 11659
- list
- this()
- 사탕 게임#백준#3085
- springboot
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |