TIL

[250409] N+1, 인덱싱, 썸네일

도원좀비 2025. 4. 9. 20:44

📆 오늘 한 일

  • N+1 문제 개념 정리 및 QueryDSL 기반 해결
  • JPA 인덱싱 적용으로 검색/정렬 성능 최적화
  • 피드 썸네일 기능 구현 (대표 이미지 1장)
  • Postman으로 응답 속도 전후 비교 → 성능 개선 확인

1️⃣ N+1 문제와 해결

학습한 개념

  • LAZY 로딩된 연관 객체에 반복적으로 접근하면 N+1 문제가 발생
  • 해결 방법으로는
    • DTO로 조회 구조 분리
    • QueryDSL에서 .join() 명시
    • 필요 시 @EntityGraph 또는 Fetch Join

적용

  • 피드 리스트/좋아요 목록/댓글에서 DTO로 Projection 구조 적용
  • QueryDSL 쿼리에 .join(news.user, user) 등 명시

2️⃣ JPA 인덱싱 적용

학습한 개념

  • 인덱스는 WHERE, ORDER BY, JOIN 조건의 컬럼에 성능 향상
  • LIKE 'abc%'는 인덱스 적용되지만, '%abc'는 안됨
  • @Index, @UniqueConstraint로 JPA에서도 인덱스 선언 가능
  • title, content, updatedAt, user_id, news_feed_id 등에 인덱스 적용
  • Postman으로 조회 테스트 → 성능 300ms → 20ms로 개선됨
@Table(name = "news_feeds", indexes = {
    @Index(name = "idx_title", columnList = "title"),
    @Index(name = "idx_updated_at", columnList = "updated_at")
})

3️⃣ 썸네일 기능 구현

학습한 개념

  • 피드에 여러 이미지를 업로드했을 때 목록에 대표 이미지 1개만 보여주기
  • 이미지가 없을 경우엔 기본 썸네일 URL 사용
  • 서버 로컬에 저장한 이미지를 정적 리소스로 서빙하려면 addResourceHandler 설정 필요

적용

  • 이미지 업로드 후 file.path.min() 으로 대표 이미지 추출
  • DTO에 thumbnailUrl 필드 추가
  • 이미지 없으면 기본 썸네일 URL 반환
  • http://localhost:8080/uploads/... 경로로 이미지 접근 가능하게 WebMvcConfig 설정 완료