📆 오늘 한 일
- 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 설정 완료