Spring Boot에서 Redis를 사용해보겠습니다.
1. build.gradle에 Spring-Data-Redis 의존성 추가
Spring-Data-Redis
- 여러가지 Redis 드라이버(Jedis, Lettuce 등등)를 추상화하여 사용합니다.
- RedisTemplate를 이용하여 Redis 작업, 직렬화 작업 등의 여러 작업을 지원합니다.
Maven Project(pom.xml)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
Gralde Project(build.gradle)
dependencies {
// spring redis
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
}
2. RedisConfig 생성
RedisConnectionFactory
- RedisConnectionFactory는 새로운 Connection이나 이미 존재하는 Connection을 리턴합니다.
- 예외 변환도 가능하며 예외 발생 시 SpringDataAccessException으로 전환합니다.
- Jedis, Lettuce 등등 Redis-client를 선택해서 연결을 생성할 수 있습니다.
RedisTemplate
- StringRedisSerializer를 사용하고, 저장된 key-value를 읽을 수 있습니다.
- key-value가 String 형태로 나오게 하기 위해 StringRedisTemplate를 사용합니다.
- thread-safe하고 재사용이 용이합니다.
@Configuration
@EnableRedisRepositories
public class RedisConfig {
@Value("${spring.redis.host}")
private String redisHost;
@Value("${spring.redis.port}")
private int redisPort;
@Bean
public RedisConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory(redisHost, redisPort);
}
@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;
}
@Bean
public StringRedisTemplate stringRedisTemplate() {
StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
stringRedisTemplate.setKeySerializer(new StringRedisSerializer());
stringRedisTemplate.setValueSerializer(new StringRedisSerializer());
stringRedisTemplate.setConnectionFactory(redisConnectionFactory());
return stringRedisTemplate;
}
}
3. application.yml
.gitignore 등록을 통해 정보가 노출되지 않도록 합니다.
spring:
redis:
host: [Redis 엔드포인트]
port: 6379
설정이 완료되었으면 직접 사용해보겠습니다.
AWS에서의 Redis를 EC2가 아닌 그 외부 환경에서는 사용할 수가 없습니다.
따라서 아래 링크 참고하시어 docker 설치 + redis 셋팅 후 redis 테스트를 진행해 주세요.
https://blossom6729.tistory.com/15
그에 따라 application.yml 파일 내용도 아래처럼 변경해 줍니다.
spring:
redis:
host: 127.0.0.1
port: 6379
4. RestController.java
@RequiredArgsConstructor
@RestController
public class RedisController {
private final RedisService redisService;
@GetMapping("/redis")
public String redisHello() {
redisService.redisString();
return "redisHello";
}
}
5. RestService.java
@Slf4j
@RequiredArgsConstructor
@Service
public class RedisService {
private final RedisTemplate<String, Object> redisTemplate;
public void redisString() {
ValueOperations<String, Object> operations = redisTemplate.opsForValue();
operations.set("redisHello", "redisHello");
String redis = (String)operations.get("redisHello");
log.info(redis);
}
}
6. 실행 결과
redis에 redisHello라는 key, value 값이 들어가면 정상적으로 해당 값을 화면에 출력합니다.
이렇게 되면 redis에 정상적으로 접근이 가능하단 뜻입니다.
7. RedisRepository 사용하기
이번에는 RedisTemplate가 아닌 RedisRepository에 대해서 알아보겠습니다.
RedisTemplate의 경우 특정 자료구조에 값을 저장하였지만 RedisRepository는 객체를 담을 수 있습니다.
7. RedisTest.java
RedisRepository에 저장할 객체를 만들어줍니다. ( 이름이 조금 와닿지 않네요 ), 이는 곧 Set이 될 것입니다.
@RedisHash("RedisTest")
@Getter
public class RedisTest {
@Id
String id;
String name;
Address address;
@Builder
public RedisTest(String id, String name, Address address) {
this.id = id;
this.name = name;
this.address = address;
}
}
8. TestRedisRepository.java
- JPA와 동일한 구조입니다. CrudRepository<엔티티, ID> 를 상속받습니다.
public interface TestRedisRepository extends CrudRepository<RedisTest, String> {
}
9. RedisService.java
- redisRepositorySave() 함수를 추가해 주었습니다.
@Slf4j
@RequiredArgsConstructor
@Service
public class RedisService {
private final RedisTemplate<String, Object> redisTemplate;
// 직렬화, 역직렬화로 String을 사용하는 StringRedisTemplate
private final StringRedisTemplate stringRedisTemplate;
private final TestRedisRepository testRedisRepository;
// RedisTemplate
public void redisString() {
ValueOperations<String, Object> operations = redisTemplate.opsForValue();
operations.set("redisHello", "redisHello");
String redis = (String) operations.get("redisHello");
log.info(redis);
}
// RedisRepository
public String redisRepositorySave() throws BaseException {
Address address = new Address("서울시 금천구");
RedisTest redisTest = RedisTest
.builder()
.id(null)
.address(address)
.name("이름")
.build();
RedisTest savedRedisTest = testRedisRepository.save(redisTest);
Optional<RedisTest> findId = testRedisRepository.findById(savedRedisTest.getId());
if (findId.isPresent()) {
return findId.get().getId();
} else {
throw new BaseException(DATABASE_ERROR);
}
}
}
10. RedisController.java
- /redis-save URI 입력 시 저장된 RedisTest 객체의 ID값을 반환하도록 해 줍니다.
@RequiredArgsConstructor
@RestController
public class RedisController {
private final RedisService redisService;
@GetMapping("/redis")
public String redisHello() {
redisService.redisString();
return "redisHello";
}
@GetMapping("/redis-save")
public String redisSaveTest() {
String resultId = redisService.redisRepositorySave();
return new BaseResponse<>(resultId);
}
}
11. Redis-Cli
- Redis에 저장된 값을 확인해 보겠습니다.
# 1) 키, 매핑정보 등등 모든 값을 출력합니다.
# 여러번 테스트를 해서 데이터가 여러 개 남아 있는 상태입니다.
# id를 null로 하면 32size의 UUID 형식으로 출력됩니다.
local-redis:6379> keys *
1) "\xac\xed\x00\x05t\x00\nredisHello"
2) "RedisTest:fd05a011-87f6-4636-9361-7ce52ff88acb"
3) "test"
4) "RedisTest:f4edf9d4-4ee5-4696-b77b-00aa1b2fdac6"
5) "redisHello"
6) "RedisTest"
# RedisTest는 set 자료구조를 가지고 있습니다.
local-redis:6379> type RedisTest
set
# RedisTest의 ID는 Hash로 되어 있습니다.
local-redis:6379> type RedisTest:f4edf9d4-4ee5-4696-b77b-00aa1b2fdac6
hash
# RedisTest에 속한 해시값들을 표시합니다.
local-redis:6379> smembers RedisTest
1) "f4edf9d4-4ee5-4696-b77b-00aa1b2fdac6"
2) "fd05a011-87f6-4636-9361-7ce52ff88acb"
# 해당 해시값에 대한 key를 확인합니다.
local-redis:6379> hkeys RedisTest:f4edf9d4-4ee5-4696-b77b-00aa1b2fdac6
1) "_class"
2) "address.address"
3) "id"
4) "name"
# 해당 해시값에 대한 Value를 확인합니다.
local-redis:6379> hvals RedisTest:f4edf9d4-4ee5-4696-b77b-00aa1b2fdac6
1) "com.sikhye.univcity.utils.redis.RedisTest"
2) "\xec\x84\x9c\xec\x9a\xb8\xec\x8b\x9c \xea\xb8\x88\xec\xb2\x9c\xea\xb5\xac"
3) "f4edf9d4-4ee5-4696-b77b-00aa1b2fdac6"
4) "\xec\x9d\xb4\xeb\xa6\x84"
다음 포스팅에서는
RedisRepository를 이용한 이메일 인증을 다뤄보겠습니다. 😀
'AWS' 카테고리의 다른 글
Docker 이용하여 Redis 설치 (0) | 2021.11.10 |
---|---|
[Redis 1/2] AWS에서 ElastiCache(Redis) 만들기 (0) | 2021.11.09 |
AWS EC2에 HTTPS 적용 (let's encrypt) (0) | 2021.11.02 |
AWS에서 RDS만들기 [MySQL] (1) | 2021.11.01 |
AWS S3에서 버킷 생성 후 IAM 사용자 만들기 (0) | 2021.10.31 |