DataBase

[ Redis ] 메모리 데이터 베이스 Redis - 개발 지식

yongyongcoding 2025. 4. 16. 20:34
오늘은 Redis에 대해서 알아보도록하겠습니다.
개발을 하다보면 서버에서 유저 정보를 저장해줘야하는데 어떻게 저장을 해야할까요?
저는 서블릿 기반으로 개발할 때는 저장할 곳이 없어서 Session에 사용자 정보를 저장하고
Cookie에는 그 SessionID값을 저장해서 로그인 인증 처리를 해주었었습니다.
그런데 서버는 하나의 사용자만을 저장하지 않기 때문에 로그인한 사용자 정보를 저장할 데이터베이스가  필요하게 됩니다. 문제는 데이터 베이스는 영속성을 지니고 있는데 로그인 인증은 영속성이 필요 없는 휘발성 데이터입니다.
그래서 저희가 사용하는게 바로 메모리 데이터 베이스 Reids입니다.

 

목차

01. REDIS란 무엇일까?
	01-1. 사용 방법 예시 정리
	01-2. Java에서의 Redis 구현체들

02. REDIS 환경 세팅
	02-1. 레디스 다운로드 받기
	02-2. redis-server.exe로 Redis 서버 실행시키기
	02-3. redis-cli.exe로 redis 클라이언트 실행시키기 


03. REDIS 환경 세팅
	03-1. 의존성 주입 넣어주기
	03-2. RedisConfig파일 만들어주기.
	03-3. Service사용 시 redis로 데이터 저장 및 조회

 

 

 


01. REDIS란 무엇일까?

정의 : Reids란 데이터를 메모리로 저장하고 불러와서 처리하는 메모리 기반 DBMS입니다.

쉽게 말해 데이터를 메모리 DB에 저장하고 관리하는 개념입니다.

※ DBMS(Database Management System) : 사용자가 데이터를 쉽게 저장, 검색, 수정, 삭제할 수 있도록 도와주는 소프트웨어 시스템.   ex) DDL, DCL , DML, 무결성 등...

 

특징 : 

  • key - value구조로 비정형 데이터를 저장하고 관리힙낟.
  • 문자열, 해시, 리스트, 셋 등 다양한 데이터 구조를 지원합니다. 
  • 휘발성에서 영속성으로 데이터를 보존하는 기능도 제공하여 디스크에 데이터 저장이 가능합니다.

 

01-1. 사용 방법 예시 정리

자료구조 사용 코드
Strings 자료구조
list 자료구조
set 자료구조 (중복 금지, 순서 보장 X)
hash map 자료구조로 객체 만들기

 

 

 

01-2. Java에서의 Redis 구현체들

개념 역할 및 사용 방식 주요 특징 연결 관리
Jedis Redis의 동기식 Java 클라이언트 - 간단하고 직관적인 API- 직접적인 Redis 명령 호출 JedisPool을 통한 연결 관리 필요
Lettuce Redis의 동기 및 비동기 Java 클라이언트 - 넷티 기반의 비동기 API- 스레드 안전성- 고성능 및 확장성 제공 기본적으로 넷티 기반의 연결 풀 사용
RedisTemplate 스프링의 고수준 추상화 클래스 - 다양한 Redis 데이터 타입 지원- 트랜잭션 및 Pub/Sub 관리 RedisConnectionFactory(Jedis/Lettuce)
RedisRepository Spring Data Redis의 인터페이스 - CRUD 기능 자동 제공- 도메인 객체 매핑 RedisConnectionFactory(Jedis/Lettuce)

 

 

 

 

 


이제 개념을 알았으니 환경 세팅 방법을 정리하도록 하겠습니다. 

02. REDIS 환경 세팅

 

02-1. 레디스 다운로드 받기

환경 방법
[Window] https://github.com/microsoftarchive/redis/releases

 ( Redis-x64-3.0.504.zip 다운로드 / 설치 )
[MAC] brew install redis

brew services start redis

 

 

02-2. redis-server.exe로 Redis 서버 실행시키기

 

02-3. redis-cli.exe로 redis 클라이언트 실행시키기 

 

 

 

 


이제 Redis를 직접 실행할 수 있는 환경이 갖추어졌으니 실제 예시를 따라해보면서 Redis를 사용해보도록하겠습니다.

03. REDIS 환경 세팅

 

03-1. 의존성 주입 넣어주기

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

 

03-2. RedisConfig파일 만들어주기.

Redisconfig 클래스는 Redis를 연결하고 사용하기 위한 설정 클래스입니다.]

★ @Bean으로 RedisTemplate<String, Object>객체를 빈으로 등록하여 Redis에 데이터를 저장하거나 불러올 때 사용할 수 있습니다.

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> sessionRedisTemplate = new RedisTemplate<>();

	// redis 연결을 위한 메소드
        sessionRedisTemplate.setConnectionFactory(redisConnectionFactory);
	// Redis 키를 문자열로 저장하도록 설정
	sessionRedisTemplate.setKeySerializer(new StringRedisSerializer());
        // 값을 JSON 형식으로 저장 (json형식으로 직렬화/역직렬화)
        sessionRedisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        // 해시 자료구조 사용시 문자열/json으로 직렬화 설정
        sessionRedisTemplate.setHashKeySerializer(new StringRedisSerializer());
        sessionRedisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
        return sessionRedisTemplate;
    }
}

 

 

03-3. Service사용 시 redis로 데이터 저장 및 조회

★ @Autowired  RedisTemplate<String, Object> redisTemplate; 의존성 주입으로 위에서 빈으로 등록한  reids객체를 받음

★  redisTemplate.opsForHash().put() / redisTemplate.opsForHash().get()  으로 저장 및 조회 사용!

@Service
public class MemberService {

    @Autowired
    RedisTemplate<String, Object> redisTemplate;

    private String HASH_NAME = "Member:";

    public Member saveUser(MemberCreateCommand member) {
        Member newMember = new Member("1", member.getName(), member.getAge(), member.getClazz(), Role.MEMBER);
        redisTemplate.opsForHash().put(HASH_NAME, newMember.getId(), newMember);
        return newMember;
    }

    public Member getMember(String memberId){
        Object o = redisTemplate.opsForHash().get(HASH_NAME, memberId);
        if(o==null){
            throw new RuntimeException();
        }
        return (Member) o;
    }

    public List<Member> getMemberList(){
        List<Member> memberList = new ArrayList<>();
        redisTemplate.opsForHash().multiGet(HASH_NAME, Collections.singleton(memberList));
        return memberList;
    }

    public void deleteMember(String memberId){
        redisTemplate.opsForHash().delete(HASH_NAME, memberId);
    }

    // DB
    public void updateMember(Member member){
        redisTemplate.opsForHash().put(HASH_NAME, member.getId(), member);
    }
}

 

 

 


 

redis는 메모리 DB로 빠른 메모리 접근이라는 큰 장점을 가지고 있습니다.
하지만 무분별한 reids의 사용는 문제를 일으킬 수 있습니다.
실제로 Cache도 비슷한데 Cache의 가장 큰 문제가 있습니다.
그것은 바로 실제 DB와 Cache에 저장한 데이터 간의 동기화 문제입니다.
실제 DB의 값과 Cache의 값이 달라저 오류를 범할 수 있습니다. 이와 같이 redis도 동일하게
실제 DB와의 동기화 문제에 유의해야합니다.

지금까지 redis의 개념부터 사용법까지 알아보았습니다!
감사합니다.