드디어 Spring Boot에 Redis를 연동하고 성능 테스트 내용까지 다뤄보자!
이론도 이론이지만 실습이 더 재밌는건 어쩔 수 없다!
1. Spring Boot 프로젝트에 Redis 세팅 추가
build.gradle 파일에 Redis 의존성 먼저 추가해야 한다.
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
의존성을 추가하고 추가한 의존성이 프로젝트에 빌드될 수 있도록 오른쪽 상단에 있는 코끼리 새로고침 표시를 눌러줘야 한다.
2. application.yml 설정 파일 수정
Redis 연동에 필요한 설정과 Redis 사용에 대한 로그가 찍힐 수 있도록 설정을 추가해준다.
spring:
profiles:
default: local
datasource:
url: jdbc:mysql://localhost:3306/mydb
username: root
password: [password]
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
hibernate:
ddl-auto: update
show-sql: true
# Redis 연동 설정
data:
redis:
host: localhost
port: 6379
# Redis 사용에 대한 로그 조회 설정
logging:
level:
org.springframework.cache: trace
3. Redis 설정 코드 추가
config 패키지를 생성하고 하위에 Redis 설정과 RedisCache 설정을 위한 코드를 추가해준다.
@Configuration
public class RedisConfig {
@Value("${spring.data.redis.host}")
private String host;
@Value("${spring.data.redis.port}")
private int port;
@Bean
public LettuceConnectionFactory redisConnectionFactory() {
/*
Lettuce(Redis와 연결시켜주는 라이브러리)를 활용해 Redis 연결을 관리하는 객체 생성
Redis 서버에 대한 정보(host, port)를 설정
*/
return new LettuceConnectionFactory(host, port);
}
}
@Configuration
@EnableCaching // Spring Boot 캐싱 설정 활성화
public class RedisCacheConfig {
@Bean
public CacheManager boardCacheManager(RedisConnectionFactory redisConnectionFactory) {
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration
.defaultCacheConfig()
// Redis에 Key를 저장할 때 String 형태로 직렬화(변환)해서 저장
.serializeKeysWith(RedisSerializationContext
.SerializationPair
.fromSerializer(new StringRedisSerializer()))
// Redis에 Value를 저장할 때 Json으로 직렬화(변환)해서 저장
.serializeValuesWith(RedisSerializationContext
.SerializationPair
.fromSerializer(
new Jackson2JsonRedisSerializer<>(Object.class)))
// 데이터의 만료기간(TTL) 설정
.entryTtl(Duration.ofMinutes(1L));
return RedisCacheManager.RedisCacheManagerBuilder
.fromConnectionFactory(redisConnectionFactory)
.cacheDefaults(redisCacheConfiguration)
.build();
}
}
4. BoardService에 Caching 로직 추가
@Service
public class BoardService {
private final BoardRepository boardRepository;
public BoardService(BoardRepository boardRepository) {
this.boardRepository = boardRepository;
}
@Cacheable(cacheNames = "getBoards",
key = "'boards:page:' + #page + ':size:' + #size",
cacheManager = "boardCacheManager")
public List<Board> getBoards(int page, int size) {
Pageable pageable = PageRequest.of(page - 1, size);
Page<Board> pageOfBoards = boardRepository.findAllByOrderByCreatedAtDesc(pageable);
return pageOfBoards.getContent();
}
}
@Cacheable 어노테이션을 붙여주면 해당 메서드는 Cache Aside 전략으로 Caching이 적용된다.
즉, 해당 메서드로 요청이 들어왔을 경우 Redis에서 데이터를 먼저 찾고 없으면 데이터베이스에서 찾아 응답을 내려준 뒤 Redis에 해당 데이터를 저장하는 과정을 거친다는 의미이다.
@Cacheable 어노테이션의 속성에 대해서 정리해둬야겠다.
- cacheNames: 캐시 이름 설정
- key: Redis에 저장할 Key 이름 설정
- cacheManager: 사용할 cacheManager의 Bean 이름 지정
5. Caching 정상 동작 확인
자, 이제 Spring Boot 서버를 시작하고 Caching이 정상적으로 동작하는지 API를 호출해보자!
브라우저에 응답은 정상적으로 왔다.
그럼 Cache Aside 전략으로 Caching이 잘 적용되었는지 로그도 살펴 보자.
오! Redis에서 먼저 데이터를 찾았지만 데이터를 찾을 수 없어 데이터베이스에서 찾고 마지막에 Redis에 데이터를 넣는 로그가 그대로 남아 있었다!
Cache Aside 전략 그대로 동작했다.
한번 더 호출해보자.
한번 더 호출하니 이번엔 Redis에서 데이터를 찾아 데이터베이스 쿼리가 동작하지 않은 걸 알 수 있었다!
더 정확한 확인을 위해 Redis에 접속해 정말 데이터가 저장되어 있는지 확인해볼까?
Redis에 접속해보니 설정한 Key-Value 형태로 데이터가 정상적으로 저장되어 있었다!
만료시간(TTL)도 20초 남아 있다고 조회된다.
6. Redis 적용 전,후 성능이 궁금해!
조회 성능을 높이기 위해 Redis를 적용한 것이기 때문에 적용 전과 후의 성능을 확인할 필요가 있다.
성능 개선에 있어서는 강사님이 수치로 이야기할 수 있어야 한다고 한다.
또한, 여러번 호출을 반복해 평균적인 수치가 어느 정도 나오는지 책정해야 한다고 한다.
그러니 정확하게 수치로 확인해보자?
성능 테스트는 Postman을 사용할거고, 수치는 각자의 환경에 따라 다를 수 있다.
데이터베이스 성능 수치
Redis 적용 전, 조회 성능의 평균적인 수치는 400ms 정도로 확인되었다.
Redis 성능 수치
Redis 적용 후, 조회 성능의 평균적인 수치는 10ms 정도로 확인되었다.
처음 호출했을 때는 Cache Miss 상태로 1000ms 정도의 수치를 나타냈지만, Redis에 Caching이 된 후로는 10ms를 넘지 않았다.
400ms 걸리던 속도가 10ms 속도로 빨라졌다는건 40배의 성능 개선이 이루어졌다고 볼 수 있는건가???? 대박!
Reference.
'Redis' 카테고리의 다른 글
[Redis] AWS EC2에서 Redis를 활용해보자! (2) (0) | 2024.10.25 |
---|---|
[Redis] AWS EC2에서 Redis를 활용해보자! (1) (0) | 2024.10.25 |
[Redis] 로컬에서 Spring Boot + Redis 사용해보자! (1) (0) | 2024.10.25 |
[Redis] Redis 캐싱 전략이 궁금해! (0) | 2024.10.25 |
[Redis] Redis의 기본 개념부터 다져볼까? (4) | 2024.10.24 |