ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] Redis
    Spring 2025. 4. 14. 10:20

     

    minecraft-font

    Spring

     

     

     

     

    프로젝트 팀원

     

     

    • Redis (Remote Dictionary Server)
       키-값(Key-Value) 구조의 데이터를 저장하는 오픈 소스 기반 비관계형(NoSQL) 데이터베이스
       Map 또는 Dictionary처럼 동작
    • 주로 캐시나 세션처럼 빠른 접근이 필요한 데이터에 사용된다.
    • "모든 데이터를 메모리에 올려 두고 빠르게 꺼내 쓰는임시 저장소빠른 접근이 필요한 서비스에 적합하다.
    항목 설명
    동작 방식 모든 데이터를 메모리에 올려 처리한다. 
    속도 매우 빠른 성능 (RAM 기반 처리)
    휘발 메모리 저장 → 전원 종료 시 데이터 소실 가능
    지속성 옵션 설정에 따라 디스크 저장도 가능 (AOF, RDB 방식)
    활용 예시 캐시 서버, 세션 저장소, 실시간 랭킹, Pub/Sub 등

     

    SQL vs NoSQL                                                                                                                             
      SQL NoSQL
     총 정리
    • : 테이블 기반 (행/열 구조)

    • 스키마: 고정된 스키마 (데이터 구조 미리 정의 필요)

    • 언어: SQL (Structured Query Language)

    • 확장성: 수직 확장 (서버 성능 향상)

    • 예시: MySQL, PostgreSQL, Oracle, MS SQL
      Server

    • 장점:
      • 데이터 무결성과 정합성 보장
    복잡한 쿼리 처리에 강함 (JOIN, 트랜잭션 등)
    • 형식: 문서(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을 사용할 수 있다

     

     

Designed by Tistory.