spring_2기[본캠프]/과제

[과제] Spring 플러스 프로젝트 Day 5

minwoo95 2026. 3. 16. 21:21

https://github.com/TheOne-team-1/TheOne-Bottle-Shop

 

GitHub - TheOne-team-1/TheOne-Bottle-Shop: 주류 커머스 플랫폼 백엔드 구현하기

주류 커머스 플랫폼 백엔드 구현하기. Contribute to TheOne-team-1/TheOne-Bottle-Shop development by creating an account on GitHub.

github.com

 

TIL: 리뷰 시스템 고도화 및 Redis 분산 락 트러블슈팅
1. 오늘 진행한 핵심 작업
QueryDSL 기반 동적 검색 및 정렬: 평점, 키워드 검색 및 좋아요/최신순 정렬 구현.

상위 3개 고정 노출: 좋아요 순 상위 3개 리뷰를 일반 목록 상단에 고정하는 복합 조회 로직.

Redis 분산 락 적용: 좋아요 클릭 시 발생하는 Race Condition(동시성) 문제 해결.

조회수 어뷰징 방지: Redis를 활용한 24시간 중복 조회 제한 로직 구현.

2. 트러블슈팅 (Troubleshooting)
Issue 1: 엔티티 필드 추가 후 QueryDSL Q클래스 미갱신
현상: Review 엔티티에 likeCount, viewCount를 추가했으나, ReviewRepositoryImpl에서 해당 필드에 빨간불(컴파일 에러) 발생.

원인: QueryDSL은 컴파일 시점에 Q클래스를 생성하는데, 엔티티 변경 사항이 Q클래스에 즉시 반영되지 않음.

해결: Gradle의 clean 작업 후 compileJava를 실행하여 build/generated 내의 Q클래스를 최신화함.

Issue 2: Redis 분산 락 적용 시 트러블슈팅
현상: @RedisLock 적용 시 데이터 정합성이 깨지거나 락이 해제되지 않을 우려 발생.

원인: 락 해제 시점이 트러블슈팅 완료(커밋) 전이면 정합성이 깨질 수 있음.

해결: 팀장님이 작성하신 AopInTransaction을 활용해 트랜잭션 전파 속성을 REQUIRES_NEW로 설정. 락 해제 전에 실제 DB 커밋이 완료되도록 보장함.

Issue 3: 어뷰징 방지 로직과 엔티티 메서드 부재
현상: increaseViewCount() 등 비즈니스 메서드 호출 시 빨간불 발생.

원인: 롬복 @Getter는 단순 필드 조회만 생성할 뿐, 수치 증가 같은 도메인 로직은 생성하지 않음.

해결: Review 엔티티 내부에 객체지향적으로 스스로의 상태를 변경하는 increaseLikeCount(), increaseViewCount() 메서드를 직접 구현하여 해결.

3. 핵심 인사이트 (Key Lessons)
인프라 활용의 중요성: 팀장님이 짜둔 RedisLock과 WatchDog 설정을 활용해보니, 비즈니스 로직에만 집중하면서도 동시성을 잡는 코딩이 가능했음.

DTO 분리 전략: ListResponse, DetailResponse 등을 명확히 분리함으로써, 이메일 노출 여부나 상위 3개 노출 같은 세밀한 요구사항을 안전하게 처리할 수 있었음.

Soft Delete: 관리자의 삭제 요구사항을 deleted 필드 하나로 처리하여 데이터 무결성을 유지함.