본문 바로가기
Redis

[Redis] 로컬에서 Spring Boot + Redis 사용해보자! (2)

by jn4624 2024. 10. 25.
반응형
드디어 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.

https://www.inflearn.com/course/%EB%B9%84%EC%A0%84%EA%B3%B5%EC%9E%90-redis-%EC%9E%85%EB%AC%B8-%EC%84%B1%EB%8A%A5-%EC%B5%9C%EC%A0%81%ED%99%94

 

비전공자도 이해할 수 있는 Redis 입문/실전 (조회 성능 최적화편) 강의 | JSCODE 박재성 - 인프런

JSCODE 박재성 | 비전공자 입장에서도 쉽게 이해할 수 있고, 실전에서 바로 적용 가능한 'Redis 입문/실전 (조회 성능 최적화편)' 강의를 만들어봤습니다!, 🤬 에라이, 못 해먹겠네!비전공자로 개발

www.inflearn.com

 

반응형