TokyoAJ

도쿄아재

SPRINGBOOT 2025.04.16

Spring Boot + Redis 연동하기 (Docker 설치부터 TTL 자동삭제까지)

1. 목차

환경설정 - Docker로 Redis 설치

Spring Boot + Redis 연동 설정 (의존성 포함)

예제 목표 및 Redis에 저장할 데이터 구조

예제 소스코드

테스트 방법

TTL로 자동 삭제 설정 방법

마무리


2. 환경설정 - Docker로 Redis 설치

Redis를 Docker로 간편하게 설치할 수 있습니다.

docker run --name redis
-p 6379:6379
-d redis

설치 확인

docker ps

Redis CLI 접속방법(선택)

docker exec -it redis redis-cli


3. Spring Boot + Redis 연동 설정

의존성 설정 (build.gradle)

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'com.fasterxml.jackson.core:jackson-databind'
implementation 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
}


application.yml

spring:
redis:
host: localhost
port: 6379



4. 예제 목표 및 소스코드

예제 목표

  1. 이메일 전송에 필요한 정보를 Redis에 저장
  2. 저장된 정보 조회
  3. 정보 삭제 기능 구현
  4. TTL로 자동 삭제 설정

Redis에 저장될 데이터 구조

  1. 관리번호 (UUID 등 key)
  2. 제목 (subject)
  3. 본문 (content)


프로젝트 구조

redis-mail-example
├── src
│ └── main
│ ├── java
│ │ └── com.example.redis
│ │ ├── config
│ │ │ └── RedisConfig.java
│ │ ├── controller
│ │ │ └── MailController.java
│ │ ├── dto
│ │ │ └── MailInfo.java
│ │ ├── repository
│ │ │ └── MailRedisRepository.java
│ │ └── RedisMailExampleApplication.java
│ └── resources
│ └── application.yml
└── build.gradle


MailInfo.java (DTO)

package com.example.redis.dto;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
* 이메일 정보 DTO
* Redis에 저장할 메일 제목과 본문 정보를 담는다.
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MailInfo {
private String subject; // 메일 제목
private String content; // 메일 본문
}


RedisConfig.java (설정)

package com.example.redis.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
* RedisTemplate 설정 클래스
* key는 String, value는 JSON으로 직렬화
*/
@Configuration
public class RedisConfig {

@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);

// Key는 문자열, Value는 JSON 형태로 직렬화 설정
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());

return template;
}
}


MailRedisRepository.java (레포지토리)

package com.example.redis.repository;

import com.example.redis.dto.MailInfo;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Repository;

import java.time.Duration;

/**
* Redis를 통해 이메일 정보를 저장, 조회, 삭제하는 레포지토리
*/
@Repository
public class MailRedisRepository {

private final RedisTemplate<String, Object> redisTemplate;
private final ValueOperations<String, Object> valueOps;

public MailRedisRepository(RedisTemplate<String, Object> redisTemplate) {
this.redisTemplate = redisTemplate;
this.valueOps = redisTemplate.opsForValue();
}

/**
* 이메일 정보 저장 (TTL 포함)
* @param id 키 값 (관리번호)
* @param mailInfo 저장할 메일 정보
* @param ttlSeconds TTL(초) 설정 - 자동 삭제 용도
*/
public void save(String id, MailInfo mailInfo, long ttlSeconds) {
valueOps.set(id, mailInfo, Duration.ofSeconds(ttlSeconds));
}

/**
* 키를 기반으로 이메일 정보 조회
*/
public MailInfo find(String id) {
return (MailInfo) valueOps.get(id);
}

/**
* 키를 기반으로 이메일 정보 삭제
*/
public void delete(String id) {
redisTemplate.delete(id);
}
}


MailController.java (컨트롤러)

package com.example.redis.controller;

import com.example.redis.dto.MailInfo;
import com.example.redis.repository.MailRedisRepository;
import org.springframework.web.bind.annotation.*;

import java.util.UUID;

/**
* 이메일 정보를 Redis에 저장/조회/삭제하는 API 컨트롤러
*/
@RestController
@RequestMapping("/mail")
public class MailController {

private final MailRedisRepository mailRepo;

public MailController(MailRedisRepository mailRepo) {
this.mailRepo = mailRepo;
}

/**
* 이메일 정보 저장 API
* UUID 기반의 ID를 생성하고 TTL 300초로 저장
* @param mailInfo 제목과 본문이 담긴 객체
* @return 생성된 ID 반환
*/
@PostMapping("/save")
public String save(@RequestBody MailInfo mailInfo) {
String id = UUID.randomUUID().toString(); // 관리번호 생성
mailRepo.save(id, mailInfo, 300); // TTL: 5분
return id;
}

/**
* 이메일 정보 조회 API
* @param id 조회할 관리번호
* @return 저장된 메일 정보 반환
*/
@GetMapping("/{id}")
public MailInfo get(@PathVariable String id) {
return mailRepo.find(id);
}

/**
* 이메일 정보 삭제 API
* @param id 삭제할 관리번호
*/
@DeleteMapping("/{id}")
public void delete(@PathVariable String id) {
mailRepo.delete(id);
}
}


RedisMailExampleApplication.java (메인 클래스)

package com.example.redis;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
* Redis 연동 메일 예제 메인 클래스
*/
@SpringBootApplication
public class RedisMailExampleApplication {
public static void main(String[] args) {
SpringApplication.run(RedisMailExampleApplication.class, args);
}
}



5. 테스트 방법 (curl 명령어)

Redis 연동 API는 POST, GET, DELETE 방식으로 테스트할 수 있습니다. 아래는 각각의 요청을 curl로 테스트하는 방법입니다.

5.1. 이메일 정보 저장

curl -X POST http://localhost:8080/mail/save
-H "Content-Type: application/json"
-d '{
"subject": "메일 제목",
"content": "메일 본문입니다."
}'

성공 시 반환되는 id 값을 복사해서 아래의 조회/삭제 요청에 사용하세요.


5.2. 이메일 정보 조회

curl http://localhost:8080/mail/{id}

예시:
curl http://localhost:8080/mail/5f65a4d8-xxxx-xxxx-xxxx-8a2db35c72ee


5.3. 이메일 정보 삭제

curl -X DELETE http://localhost:8080/mail/{id}

예시:
curl -X DELETE http://localhost:8080/mail/5f65a4d8-xxxx-xxxx-xxxx-8a2db35c72ee



6. TTL로 자동삭제 설정방법

valueOps.set(id, mailInfo, Duration.ofSeconds(ttlSeconds));

TTL(Time To Live)은 Redis에 데이터를 일정 시간 후 자동으로 삭제하게 해줍니다. 위 예제에서는 TTL을 300초(5분)로 설정했습니다.

데이터가 저장된 후 5분이 지나면 자동으로 삭제됩니다.


CLI에서 TTL 확인

TTL {key}


7. 마무리

이번 포스팅에서는 Docker를 이용해 Redis를 설치하고, Spring Boot에서 Redis 연동 설정 및 간단한 이메일 정보 저장/조회/삭제 기능을 구현해봤습니다.

TTL 설정을 통해 일정 시간이 지나면 자동 삭제되는 로직도 함께 구성해 보았는데요.

이런 구조는 인증번호, 이메일 전송 대기 큐, 임시 저장 정보 등 다양한 실무 상황에서 매우 유용하게 활용할 수 있습니다.:

댓글