-
[Spring] RedisSpring 2025. 4. 14. 10:20
Spring

프로젝트 팀원 
- Redis (Remote Dictionary Server)
→ 키-값(Key-Value) 구조의 데이터를 저장하는 오픈 소스 기반 비관계형(NoSQL) 데이터베이스
→ Map 또는 Dictionary처럼 동작 - 주로 캐시나 세션처럼 빠른 접근이 필요한 데이터에 사용된다.
- "모든 데이터를 메모리에 올려 두고 빠르게 꺼내 쓰는" 임시 저장소나 빠른 접근이 필요한 서비스에 적합하다.
항목 설명 동작 방식 모든 데이터를 메모리에 올려 처리한다. 속도 매우 빠른 성능 (RAM 기반 처리) 휘발 메모리 저장 → 전원 종료 시 데이터 소실 가능 지속성 옵션 설정에 따라 디스크 저장도 가능 (AOF, RDB 방식) 활용 예시 캐시 서버, 세션 저장소, 실시간 랭킹, Pub/Sub 등 SQL vs NoSQLSQL NoSQL 총 정리 - 식: 테이블 기반 (행/열 구조)
- 스키마: 고정된 스키마 (데이터 구조 미리 정의 필요)
- 언어: SQL (Structured Query Language)
- 확장성: 수직 확장 (서버 성능 향상)
- 예시: MySQL, PostgreSQL, Oracle, MS SQL
Server - 장점:
- 데이터 무결성과 정합성 보장
- 형식: 문서(Document), 키-값(Key-Value), 그래프,
컬럼 기반 등 다양 - 스키마: 유연한 스키마 (필드 변경 자유로움)
- 언어: 쿼리 언어는 DB마다 다름
(MongoDB는 JSON 기반 쿼리) - 확장성: 수평 확장 (서버 추가로 확장)
- 예시: MongoDB, Redis, Cassandra, Firebase
- 장점:
- 빠른 개발, 대용량 데이터 처리에 유리
- 구조 변경이 자유롭고, 분산 시스템에 강함
DB Type 관계형 데이터 베이스 비관계형 데이터 베이스 구조 테이블 문서, 키- 값 등 다양 스키마 고정 유연 확장성 수직(Scale - up) 수평 (Scale-Out) 트랜잭션 강력한 지원(ACID) 제한적 또는 없음 사용예 금용,ERP 등 정형 데이터 SNS, 게임 로그, 캐시, IoT 등 ◈ Redis 설치하기
https://github.com/microsoftarchive/redis/releases
Releases · microsoftarchive/redis
Redis is an in-memory database that persists on disk. The data model is key-value, but many different kind of values are supported: Strings, Lists, Sets, Sorted Sets, Hashes - microsoftarchive/redis
github.com
공식이나 위의 링크를 받아 설치 하자.
◈ application.properties
#redis spring.data.redis.host=localhost spring.data.redis.port=6379설치후 Redis와 연결하기위해 위의 코드를 application.propertis에 추가하자. 6379는 기본 포트이다.
◈ bulid.grable 추가
Redis 사용
implementation 'org.springframework.boot:spring-boot-starter-data-redis'◈ RedisConfig 추가
@EnableRedisRepositories( basePackages = "com.example.sns_feed.domain.redis" ) @Configuration public class RedisConfig { @Value("localhost") private String host; @Value("6379") private int port; @Bean public LettuceConnectionFactory redisConnectionFactory() { return new LettuceConnectionFactory(new RedisStandaloneConfiguration(host, port)); } @Bean public RedisTemplate<String, Object> redisTemplate() { RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(redisConnectionFactory()); redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(new StringRedisSerializer()); return redisTemplate; }◈ JPA추가
import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.data.redis.repository.configuration.EnableRedisRepositories; @EnableJpaRepositories( basePackages = "com.example.sns_feed.domain.jpa" ) public class JpaConfig { }JPA를 사용중이라면, JPA Config가 없다면 추가 해주고 위의 어노테이션을 붙인다.
◈ Redis 추가
@EnableRedisRepositories( basePackages = "com.example.sns_feed.domain.redis" )@EnableRedisRepositories는 RedisRepository를 활성화하는 목적도 있고 JPA를 사용 중이면 충돌 방지용으로 추가해준다.
패키지 폴더 안에 RedisRepository를 꼭 추가 하자. 안그러면 서버가 충돌나거나 시작하지 않는다.
◈ RedisServer
import com.example.sns_feed.common.exception.CustomException; import com.example.sns_feed.common.exception.ErrorCode; import lombok.RequiredArgsConstructor; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; import java.util.concurrent.TimeUnit; @Service @RequiredArgsConstructor public class RedisServiceImpl implements RedisService{ private final StringRedisTemplate redisTemplate; @Override public void setRedisData(String email, String code) { //String redisKey = "emailCode:" + email; redisTemplate.opsForValue().set(email, code, 5, TimeUnit.MINUTES); } @Override public void deleteVerificationCode(String email) { redisTemplate.delete(email); } @Override public String getRedisData(String email) { String code = redisTemplate.opsForValue().get(email); if(code == null){ throw new CustomException(ErrorCode.SESSION_NOT_FOUND); } return code; } }redisTrmplate를 전역으로 추가 한다.
- setRedisData
이메일과 인증코드를 Redis에 보관하고 n분 동안 유지하기 위해 다은 셋 함수를 사용한다.
redisTemplate.opsForValue().set(key, value, n, TimeUnit.MINUTES);- getRedisData
key의 데이터의 Value를 반환한다.
redisTemplate.opsForValue().get(key);- deleteVerification
해당 키와 값을 찾아 삭제한다.
redisTemplate.delete(key);◈ RdisRepository
CrudRepository를 상속받아서 사용한다.
import com.example.sns_feed.domain.redis.entity.RedisItem; import org.springframework.data.repository.CrudRepository; public interface RedisRepository extends CrudRepository<RedisItem, String> { }다른 서비스에서 연결해서 사용하느라 Controller를 만들어 사용하지 않는다.
◈ Redis를 사용 한 이유
Session은 서 연산보다 읽기 연산이 많고(특히 로그인), Redis는 외부 저장소에 저장을 할수 있으며, DB서버에서 문제가 발생하면 데이터 복구를 해주시 때문에 선택하게 되었다.
◈ Session VS Redis 차이
redis는 저장소 ex) 사물함
session은 로그인 상태 같은 데이터를 저장하는 개념 ex) 로그인 시 생기는 나만을 위한 공간session은 기본적으로 서버 메모리에
저장되기 때문에 서버가 여러 대인 경우 다른 서버에서는 모름이럴 때 redis가 등장
redis에 session 정보를 저장해두면 서버 여러 대가 redis에 접속해서 공유된 session을 사용할 수 있다'Spring' 카테고리의 다른 글
[Spring] 이메일 인증 구현하기 (1) 2025.04.14 [Spring] 세션 로그인 검증 방식 개선 제안 (0) 2025.04.14 [Spring] 과제 - Trobleshooting Session을 이용한 로그인 유지. (1) 2025.04.04 [Spring] SpringMVC (0) 2025.03.30 [Spring] MVC 패턴 문제 (0) 2025.03.29 - Redis (Remote Dictionary Server)
