TIL 62 [ Spring 실전 프로젝트 ( Day 5 ) - Cache 적용 ]

2025. 5. 22. 22:37·[내일배움캠프-Sparta]/Spring 6기
반응형

아침에 잠깐 최종 프로젝트 인원들과 주제를 선정하는 것에 대해서 논의를 하였다. 

많은 주제가 오고 갔었는데, 비트코인 사이트, 코딩 테스트 웹사이트, 그룹웨어 등 많은 아이디어가 있었다.

어제 튜터링 결과로는 프로젝트 주제를 정했을때 바로 설계에 들어가는 것이 아니라 검증된 기술이라면 빠르게 주제를 선점하는것이 좋을것이라고 말씀해주셨다. 그래서 그것을 고려하여 주제를 잘 선정되었다. ( 그룹웨어 )

이것을 주제로 하다보니까 기능이 상당히 많아서 ERD와 API 명세서 지금까지와는 상당히 다른 프로젝트 규모를 경험하게 될것이라고 생각된다. 얼마나 많은 데이터들이 들어가고 많은 기술 스택이 사용될지 작은 기대를 해본다.

 

어제 캐싱에 대한 기본적인 개념과 팀원들과 협의 끝에 기본적인 설정을 마치고 이제 각자 캐싱에 대한 작업에 들어가서 오늘날 에 진행을 하는 방향으로 가게 되었다. 

가장 많이본 도서 TOP10 을 조회하는 Redis의 Z-set 자료구조를 사용해볼 예정이다.

🔍 Cache 적용

✅ 새로운 API, 응답 Dto

새로운 API를 만들기 전에 응답 Dto를 만들어서 TOP10 조회순 도서에 걸맞게 rank라는 필드를 넣어서 순위를 표시하고, 나머지는 필요한 값들만 Dto에 담아줄 것이며, from 절을 통해 형변환 용으로 entity ➡ Dto 방식의 static 메소드를 추가하였다.

✅ BookService 로직 추가

상세 조회 하는 로직에서 조회수를 캐싱하기 위해 해당되는 로직을 추가하였다.

redisTemplate는 생성자 주입으로 받은 의존성 클래스이며, opsForZset()은 Redis의 자료구조중 Z-set을 선택한것이다. 

incrementScore()는 지정하는 매개변수에 점수를 증가하는 메소드 이며, 매개변수는 이러한 내용을 가지고 있다. ( 상단 두번째 사진 ) 여기서 키 이름은 다른데에서도 가져오는데에 쓰인다. ⭐

컨트롤러에서 받은 서비스 로직에서는 주석으로 설명이 되어 있으니 잘 참고하면서 보면 좋을거 같다.

 

여기서 Java Stream에 Collectors는 스트림의 결과를 원하는 형태로 수집하여 결과를 도출해낼수 있고, Function.identity()는 객체 자체를 그대로 값으로 사용할수 있는 로직이다.

 

✅ 자동 갱신 Schduled

BookService에 너무 많은 로직을 부담을 줄이기 위해서 클래스를 새로 생성하여 분리하였으며, 서버를 실행할때 자동으로 업데이트가 되는 것이 Spring boot내 로그가 계속 돌아간다. 가장 많은 조회순 top10 데이터가 1시간 마다 자동으로 갱신이 되고 있다.

@Scheduled 어노테이션을 통해서 시간을 조절할 수 있으며, 쿼리 메소드로 먼저 DB내 top10 정보를 가져오고, redis에 기존 데이터들 삭제하고 다시 새로운 데이터들을 redis에 하나씩 for 향상문을 통해 최신화 시켜준다.

이렇게 분리를 해도 잘 적용이 된다는 점을 처음 알게 되었다. ( log.info는 정확히 실행되나 확인용 으로 넣음 )

/**
 * 조회가 가장 많은 책 Top10 자동으로 업데이트 해주는 클래스
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class BookViewedRankingScheduler {

    private final BookRepository bookRepository;
    private final RedisTemplate<String, String> redisTemplate;

    @Scheduled(fixedRate = 1000 * 60 * 60) // 1000 = 1초 ( 1시간마다 업데이트 )
    public void updateTopViewedBooksIn() {
        log.info("[도서 가장 많은 조회순 시작]");

        // DB 승인된 도서 가장 많은 조회수 순 Top10 가져오기
        List<Book> topBooks = bookRepository.findTop10ByEnrollStatusOrderByViewerDesc(EnrollStatus.ACCEPT);

        // Redis 기존 데이터 삭제
        redisTemplate.delete("book:view:ranking");

        // 새로운 데이터 추가
        for (Book book : topBooks) {
            String key = "book:" + book.getId();
            redisTemplate.opsForZSet().add("book:view:ranking", key, book.getViewer());
        }
        log.info("[도서 가장 많은 조회순 완료]");
    }

}

📦 Docker를 통해  Redis 연결 가능

Windows 환경에서 Docker에 Redis 설치

 

Windows 환경에서 Docker에 Redis 설치

윈도우즈 환경에 docker를 통해 redis를 설치해보자.

velog.io

Redis 명령어 ( Docker )

더보기

 

인텔리제이 내에서도 Redis 명령어들을 통해서 실시간으로 뷰어 기준으로 top10 데이터를 볼수 있다.

 

어느덧 실전 프로젝트도 마무리 하는 시간이 다가오고 있다. 아직 끝이 아니니 마무리 준비를 위해 열심히 해야겠다.

💡 내일 할것

  • 코드 리팩토링 ( 내가 짠 코드는 잘 알기 )
  • 동시성 제어 테스트 코드 짜보기
  • API 명세서, ERD 최신화
반응형

'[내일배움캠프-Sparta] > Spring 6기' 카테고리의 다른 글

TIL 64 [ Spring 실전 프로젝트 ( D-Day ) - 발표/마무리, 트러블 슈팅 ]  (0) 2025.05.26
TIL 63 [ Spring 실전 프로젝트 ( Day 6 ) - 코드리뷰, 발표자료, 대본작성 ]  (0) 2025.05.23
TIL 61 [ Spring 실전 프로젝트 ( Day 4 ) - Cache 💡, 오류 개선, Redis 기본세팅 + PostMan 웹 공유법 ]  (0) 2025.05.21
TIL 60 [ Spring 실전 프로젝트 ( Day 3 ) - 기본 API 구현/병합/전체 테스트, Cache + Redis 세션 ]  (0) 2025.05.20
📦 Redis : 개념부터 캐싱 전략까지  (0) 2025.05.20
'[내일배움캠프-Sparta]/Spring 6기' 카테고리의 다른 글
  • TIL 64 [ Spring 실전 프로젝트 ( D-Day ) - 발표/마무리, 트러블 슈팅 ]
  • TIL 63 [ Spring 실전 프로젝트 ( Day 6 ) - 코드리뷰, 발표자료, 대본작성 ]
  • TIL 61 [ Spring 실전 프로젝트 ( Day 4 ) - Cache 💡, 오류 개선, Redis 기본세팅 + PostMan 웹 공유법 ]
  • TIL 60 [ Spring 실전 프로젝트 ( Day 3 ) - 기본 API 구현/병합/전체 테스트, Cache + Redis 세션 ]
dimenshun
dimenshun
한 소년의 개발 일기
    반응형
  • dimenshun
    Dev Life Notes
    dimenshun
  • 전체
    오늘
    어제
    • 분류 전체보기 (268)
      • CS (23)
        • 자료구조 (0)
        • 알고리즘 (0)
        • 컴퓨터 구조 (8)
        • 네트워크 (6)
        • 운영체제 (3)
        • DB ( + SQLD ) (5)
        • SW공학 (1)
      • 프로그래밍 (3)
        • Java (0)
        • Spring (0)
        • HTML,CSS (3)
        • JavaScript (0)
      • 개발 툴 (7)
        • Git(버전관리) (1)
        • Docker (3)
        • AWS (2)
        • JSP (1)
      • 코딩테스트(Algorithm) (125)
        • 백준 (6)
        • 프로그래머스 (119)
      • [내일배움캠프-Sparta] (110)
        • Spring 6기 (106)
        • KPT 회고 (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    배포
    SQLD
    내일배움캠프
    컴퓨터구조
    Java
    운영체제
    KPT
    network
    Python
    트랜잭션
    web
    메모리
    Testcode
    docker
    웹
    알고리즘
    spring
    개발자
    코딩테스트
    Til
    SQL
    세션
    네트워크
    It
    백엔드
    cs
    db
    OS
    CPU
    AWS
  • hELLO· Designed By정상우.v4.10.3
dimenshun
TIL 62 [ Spring 실전 프로젝트 ( Day 5 ) - Cache 적용 ]
상단으로

티스토리툴바