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. 예제 목표 및 소스코드
예제 목표
- 이메일 전송에 필요한 정보를 Redis에 저장
- 저장된 정보 조회
- 정보 삭제 기능 구현
- TTL로 자동 삭제 설정
Redis에 저장될 데이터 구조
- 관리번호 (UUID 등 key)
- 제목 (subject)
- 본문 (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;
@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;
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
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;
@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();
}
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;
@RestController
@RequestMapping("/mail")
public class MailController {
private final MailRedisRepository mailRepo;
public MailController(MailRedisRepository mailRepo) {
this.mailRepo = mailRepo;
}
@PostMapping("/save")
public String save(@RequestBody MailInfo mailInfo) {
String id = UUID.randomUUID().toString();
mailRepo.save(id, mailInfo, 300);
return id;
}
@GetMapping("/{id}")
public MailInfo get(@PathVariable String id) {
return mailRepo.find(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;
@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 설정을 통해 일정 시간이 지나면 자동 삭제되는 로직도 함께 구성해 보았는데요.
이런 구조는 인증번호, 이메일 전송 대기 큐, 임시 저장 정보 등 다양한 실무 상황에서 매우 유용하게 활용할 수 있습니다.:
댓글