hyeoks-super-market / harmony-english-academy

0 stars 0 forks source link

페이지 별 영어 스크립트 조회 및 타이틀로 스크립트 조회 부분에 레디스 적용 #10

Closed choichanhyeok closed 1 week ago

choichanhyeok commented 2 weeks ago

a. 작업 내용 (Task Description)

  1. 레디스 관련 빌드

    • 스프링 부트 애플리케이션에서 레디스 사용을 위해 아래 의존성 추가 필요
      implementation 'org.springframework.boot:spring-boot-starter-data-redis'


  2. 레디스 적용을 위한 정보 application.yml에 세팅해주기

    • 아래와 같이 application.yml의 spring 하위에 data: redis 추가하고 호스트명, 포트 정보 세팅
    • 캐시 로깅을 위해 로깅 레벨 trace 지정
      spring:
      ...
      data:
      redis:
      host: localhost
      port: 6379
      ...
      logging:
      level:
      org.springframework.cache: trace


  1. 레디스 적용을 위한 configuration 정의
    • 캐시 설정을 위한 Configuration 작성
@Configuration
@EnableCaching // Spring Boot의 캐싱 설정을 활성화
public class RedisCacheConfig {
    @Bean
    public CacheManager englishTranscriptCacheManager(RedisConnectionFactory redisConnectionFactory) {
        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration
                .defaultCacheConfig()
                /* 직렬화 옵션 */
                .serializeKeysWith(
                        RedisSerializationContext.SerializationPair.fromSerializer(
                                new StringRedisSerializer()))
                .serializeValuesWith(
                        RedisSerializationContext.SerializationPair.fromSerializer(
                                new Jackson2JsonRedisSerializer<Object>(Object.class)
                        )
                )
                /* 데이터 만료 기간 (TTL) 설정: 현재 옵션은 만료기간 1분 */
                .entryTtl(Duration.ofMinutes(1L));

        return RedisCacheManager
                .RedisCacheManagerBuilder
                .fromConnectionFactory(redisConnectionFactory)
                .cacheDefaults(redisCacheConfiguration)
                .build();
    }
}

참고


  1. 페이지별 조회 기능 구현 및 레디스 적용
    • 아래와 같이 간단한 페이지별 조회 기능 구현
      
      public List<EnglishTranscript> getEnglishTranscript(int page, int size) {
    Pageable pageable = PageRequest.of(page - 1, size);
    Page<EnglishTranscript> pageOfEnglishTranscript = englishTranscriptRepository.findAllByOrderByCreatedAtDesc(pageable);

    return pageOfEnglishTranscript.getContent();

}

- Cacheable 애노테이션 적용

// @Cacheable @RequiredArgsConstructor @Service public class EnglishTranscriptService { private final EnglishTranscriptRepository englishTranscriptRepository;

public void createTranscript(EnglishTranscriptCreate englishTranscriptCreate) {

    englishTranscriptRepository.save(englishTranscriptCreate.toEntity());

}

// @Cacheable(cacheNames = "getEnglishTranscript", key = "'englishTranscript:page:' + #page + ':size:' + #size", cacheManager = "englishTranscriptCacheManager")
public List<EnglishTranscript> getEnglishTranscript(int page, int size) {
..

<br>

> 5. 기존에 영어 스크립트 등록 API에 대한 통합 테스트를 위해 작성해뒀던 'title 검색'을 통한 조회 기능에도 레디스 적용
- 아래 메서드에도 캐시 적용 필요
public List<EnglishTranscript> searchTranscriptByTitle(String title, int page, int size) {
    Pageable pageable = PageRequest.of(page - 1, size);
    ...


> 6. PostMan을 이용한 응답 시간 분석과 ngrinder를 이용한 부하 테스트 결과 보고서 작성
- 레디스 적용 전 후 응답 시간 비교
- ngrinder를 통한 높은 트래픽 상황에서의 캐시의 영향도 눈으로 확인

## b. 실행 배경

> 1. 캐시를 이용한 시스템 성능 개선
- 히트율이나 보다 세부적인 요구사항 위에서 의사결정 하는게 옳지만 작고 ASAP한 컨셉의 프로젝트이기에 부하 테스트 및 큰 문제가 없다면 적용해보기로 결정

## c. 목표

> 1. 영어 스크립트 페이지 조회 및 검색 기능의 성능 개선
- 1ms 안에 페이지 조회 및 검색 기능의 성능 개선을 목표로함
- 트래픽이 아무리 몰리더라도 1ms라는 기준치를 꾸준히 유지하는 걸 목표로함

## d. 추가 정보

> 1. 스프링 부트 애플리케이션에 레디스 적용 가이드
- [[참고1].](https://premika-17.medium.com/implementing-redis-in-spring-boot-3d2756e5ab69)
- [[참고2].](https://redis.io/learn/develop/java/redis-and-spring-course)
choichanhyeok commented 2 weeks ago

코드 내용 중 확인 요망 image

choichanhyeok commented 1 week ago

적용 회고