Skip to content

Conversation

@hyodongg
Copy link
Collaborator

@hyodongg hyodongg commented Dec 25, 2025

🔥Pull requests

👷 과제 구현

필수과제

  • 댓글 기능 구현

선택과제

  • 캐싱 성능 최적화
  • 대용량 데이터 처리
  • 인프라 설계 시각화
  • 테스트 코드 도입

구현한 내용에 대해서 설명해주세요

  1. 엔티티 및 DTO 검증
  • @Column(length = 300)을 통해 DB 레벨에서 댓글 길이 제한 했습니다.
  • @Size(max = 300)을 통해 DTO 레벨에서 댓글 길이 제한 했습니다.
  1. 조회 전략
  • 전체 조회GET /articles 시에 댓글 전체 내용 대신 댓글 수만 반환하여 응답 크기를 줄였습니다.
  • 상세 조회 GET /articles/{id} 시에 해당 게시글의 모든 댓글 정보를 포함하여 반환했습니다. 상세페이지에서 필요한 전체 정보를 제공합니다
  1. 연관관계 설정
  • Comment <-> Member 연관관계 매핑을 통해 댓글 작성자 정보를 볼 수 있습니다.

캐시

  1. Article 전체 조회 및 상세 조회에 Redis 캐싱 도입
// 설정 파일 전체 구조 요약
RedisConfig
├─ @EnableCaching캐싱 활성화
├─ ObjectMapperJSON 변환 설정
├─ RedisSerializer직렬화 방식 (JSON)
├─ RedisCacheConfiguration기본 캐시 설정
└─ CacheManager캐시별 TTL 관리
  • 아티클 작성, 댓글 작성, 수정, 삭제 시 캐시 무효화되게 구현 했습니다.
image 캐시 전 image Redis 캐시 적용 후

대용량 데이터

image image
  • 인덱스 사용했을 때
    • rows: 139개 읽음 (1.4%)
    • type: range → B-Tree에서 BETWEEN 범위만 탐색
  • 인덱스 사용하지 않았을 때
    • rows: 9,978개 읽음 (전체 스캔)
    • type: ALL → 모든 행을 순차적으로 읽음
  • Selectivity 분석
    • 조회 건수 / 전체 건수 = 139 / 10,000 = 1.39% → 매우 좋음

article 데이터를 약 10,000개 정도 넣고 테스트를 해봤는데, 실행 속도는 차이가 안나서 Selectivity기반으로 판단했습니다.

실행시간이 별로 차이나지 않은 이유가 궁금해서 찾아보았는데

  • MySQL Buffer Pool 캐싱
    • MySQL은 자주 사용하는 데이터를 메모리에 캐싱함
  • 데이터 크기가 작음
    • 현재 데이터 크기가 그렇게 큰 게 아니라(1만개 정도면 크다 생각했습니다) 전체 테이블이 메모리에 올라감

이런 요인이 있다고 합니다! 현재 데이터 크기가 그리 크지 않아서 이렇게 되는 것 같긴 합니다.


인프라 구조도

인프라 시각화

다중 서버 운영은 아직 먼 얘기 같아서 단일 서버로 구성 했습니다. VPC 안에 Public, Private 나누고 Nginx와 스프링 서버를 도커를 활용하여 띄웁니다. 현재 스프링 서버가 하나인데 깜빡하고 하나만 그렸습니다. Blue, Green으로 나눠 무중단 배포까지 적용하면 좋을 것 같습니다.

다중 서버 운영시 앞단에 ALB를 두어 트래픽 분산하면 좋을 것 같습니다.


테스트

  1. MemberService 단위 테스트 도입
    현재 구현되어 있는 MemberService들의 메서드 단위테스트를 진행했습니다. 실패, 성공했을 경우를 나눠서 했습니다.


구현하며 고민했던 내용을 적어주세요 (사소한 것도 좋아요)

  1. Redis 적용 중에 캐싱은 정상적으로 되지만 2번 조회 시 서버오류가 계속 떴습니다. Redis에서 꺼낼 때 역직렬화 문제인 것 같은데 RedisConfig 파일에서
    mapper.activateDefaultTyping(ptv, ObjectMapper.DefaultTyping.EVERYTHING; 이 부분을 EVERYTHING으로 설정 시 임시적으로 해결은 되지만 EVERYTHING이 deprecated 예정이라고 해서 해결중입니다.. 혹시 관련 문제 있거나 아시는 분 도와주시면 감사하겠습니다.

  1. 테스트코드 도입시에 AssertJ와 JUnit 두 가지 선택지가 있었는데요, 찾아보니까 그냥 AssertJ를 사용하라고 합니다. AssertJ가 메서드 체이닝도 되고 여러모로 장점이라고 하네요!
image

키워드 과제 정리내용



🚨 참고 사항

캐시관련, 인덱스관련 시간 차 등등 무수한 팁들 공유 부탁드립니다.

테스트관련
현재 service단에서 단위 테스트만 진행 했지만 컨트롤러 테스트 -> 레포지토리 테스트 -> 통합테스트 순으로 이어나갈 예정입니다.

@hyodongg hyodongg self-assigned this Dec 25, 2025
@hyodongg hyodongg added 🐤 조효동 저는 조효동입니다 📖 7주차 과제 labels Dec 25, 2025
@hyodongg hyodongg linked an issue Dec 25, 2025 that may be closed by this pull request
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🐤 조효동 저는 조효동입니다 📖 7주차 과제

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[SEMINAR] 7주차 세미나

2 participants