백엔드에서는 여러 스레드를 통해 이미 생성된 인스턴스들로 다양한 데이터를 CRUD를 한다. 하지만 항상 모든 데이터에 대해서 데이터베이스에서 가져오는 것은 데이터베이스에 큰 부하가되며 이어져 서버에도 많은 부하를 줄 수 있다. 또한 이런 현상은 서버의 전반적인 속도를 늦추는 문제가 생긴다. 이럴 때 사용하는 것이 캐시이다.
Cache
- 자주 사용하는 데이터를 미리 보관해둔 임시 저장소
- 저장 공간이 적고 비용이 좀 비쌈.
- 빠른 I/O 가 가능하다.
캐시를 사용하는 사례
- 자주 호출되지만 프로그램 도중에 잘 변경되지 않는 데이터
Spring boot의 캐시
- JSR(Java Specification Requests) : 자바로 만들어진 플랫폼에 대한 규격을 제안하거나 기술한 것.
- JSR-107 : JCASHE(Java Temporary Caching API)에 대한 내용.
(JSR-107을 따르는 캐시를 Spring에서 사용시 어떤 구현체의 캐시를 사용하더라도 추상화를 그대로 Spring에서 사용가능하다.)
캐시의 종류
- 로컬 캐시
- 특정 하나의 서버에서만 사용하는 캐시
- 외부서버와 트랜잭션 비용이 들지 않기에 빨리 처리
- 분산 서버 구조(MSA, 로드 밸런싱, Scale Out) 환경에서 캐시를 공유하기 어렵다.
- 글로벌 캐시
- 여러 서버에서 접근할 수 있는 캐시 서버
- 네트워크를 통해 데이터를 가져오는 트랜잭션 비용이 있기에 로컬 캐시에 비해 느리다.
- 별도의 서버로 운영되기 때문에 서버 간 데이터 공유에 용이하다.
Redis
- (키-값) 구조의 데이터 저장
- 오픈 소스 기반의 비관계형 데이터 관리 시스템 <-> RDBMS
- 하드 디스크에 저장(기존의 DB의 저장 위치)이 아닌 메모리에 저장하는 방식 -> CPU의 코어와 가까워 속도가 빠르다.
- 확장성이 크다 -> 여러 언어에서 사용 가능.
- Redis Client : Jedis or Lettuce (서버는 Redis Server에 접근하는 방식이므로 하나의 클라이언트로 볼 수있고 Lettuce를 많이 사용)
등 여러가지 특징이 있다.
사용
1. Dependancy 설정
<!-- Redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2. Properties 설정
- host, port 설정
3. Config 설정
@Configuration
public class RedisCacheConfig{
// Properties에서 불러올 값들 @Value사용
// host
private String host;
// 포트
private int port;
// 객체 생성 후 repository 사용시
@Bean
public RedisConnectionFactory redisConnectionFactory(){
return new LettuceConnectionFactory(host, port);
}
// RedisTemplete 사용시
@Bean
public RedisTemplate<?, ?> redisTemplate() {
RedisTemplate<?, ?> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory());
return redisTemplate;
}
}
4. 저장할 객체 생성-Redis Repositoty연결 or Redis Templete 사용
// Interface
public interface ShortUrlRedisRepository extends CrudRepository<저장할 클래스명, 아이디의 타입> {
}
// Class(VO)
@RedisHash(value = "Prefix 명", timeToLive = 살아있을 시간 설정)
이 후, 사용하고자 하는 클래스에 주입해 원하는 방식으로 사용하면 된다.
'Server Development > Data API' 카테고리의 다른 글
JPA - Query DSL (0) | 2023.05.11 |
---|---|
JPA - Join (0) | 2023.05.09 |
JPA - @Query with Spring JPA (0) | 2023.04.05 |
JPA - Query Method with Spring JPA (0) | 2023.04.05 |
JPA - Auditing (0) | 2023.04.04 |