Conversation
chldPDms
commented
Apr 2, 2026
- 리뷰 생성 api
- 이미지 생성 api랑 파일 서버 구축 확인 후 일부 수정 예정
pinomaker-hoo
left a comment
There was a problem hiding this comment.
코드 리뷰: feat: PLI-9-1-1 리뷰 생성 API
🔴 치명
1. ErrorCode 열거형 이름과 코드 문자열 불일치
ErrorCode.java:23 — 열거형 이름은 VISITED_PLACE_NOT_FOUND인데 code 문자열은 "PLACE_NOT_FOUND"로 되어 있어 기존 PLACE_NOT_FOUND와 충돌하거나 디버깅 시 혼동을 유발합니다.
VISITED_PLACE_NOT_FOUND(HttpStatus.NOT_FOUND, "PLACE_NOT_FOUND", ...)
// ^^^^^^^^^^^^^^^^ "VISITED_PLACE_NOT_FOUND"여야 함2. 방문 기록 소유자 검증 시 부적절한 에러코드
ReviewService.java:50-52, 54-56 — 다른 사용자의 방문 기록으로 리뷰를 작성하려는 시도는 **권한 문제(FORBIDDEN/UNAUTHORIZED)**이지, 잘못된 입력(INVALID_INPUT)이 아닙니다. 클라이언트가 원인을 파악할 수 없고, 보안 관점에서도 접근 제어 위반과 입력 오류를 구분해야 합니다.
3. 중복 리뷰 방지 로직 부재
ReviewService.java:36-68 — 동일 사용자가 같은 visitedPlace에 대해 리뷰를 여러 번 생성할 수 있습니다. 비즈니스 요구사항에 따라 다르지만, 일반적으로 방문 기록당 1개 리뷰가 자연스럽습니다. DB unique 제약조건이나 서비스 레벨 검증이 필요합니다.
🟡 설계
4. ReviewCreateRequestDto에 미사용 import 존재
ReviewCreateRequestDto.java:8-11 — User, Place, Review, VisitedPlace, LocalDate import가 있지만 DTO 내에서 전혀 사용되지 않습니다. toEntity() 메서드를 위해 남겨둔 것으로 보이나, 현재 상태에서는 제거해야 합니다.
5. ReviewCreateResponseDto에 불필요한 validation import
ReviewCreateResponseDto.java:4 — Response DTO에 jakarta.validation.constraints.* import가 있지만 validation 어노테이션을 사용하지 않습니다. LocalDate import도 미사용입니다.
6. 파일 끝 개행문자 누락
ReviewService.java:76 — diff에 No newline at end of file 경고가 표시됩니다. 파일 끝에 개행문자를 추가해야 합니다.
7. ReviewImageRepository 제거됨
ReviewService.java — 기존에 주입받던 ReviewImageRepository가 삭제되었습니다. PR 설명에 이미지 관련 수정이 예정되어 있다고 했는데, 향후 다시 추가할 예정이라면 괜찮지만 확인이 필요합니다.
8. 컨트롤러에 @ApiErrorExceptions로 PLACE_NOT_FOUND 중복 표기
ReviewController.java:28-29 — ErrorCode.PLACE_NOT_FOUND와 ErrorCode.VISITED_PLACE_NOT_FOUND를 모두 나열했는데, 1번 이슈에서 언급한 것처럼 두 에러의 code 문자열이 동일하여 Swagger 문서에서 혼란을 줄 수 있습니다.
9. 서비스 메서드의 Javadoc
ReviewService.java:30-35 — 프로젝트 코딩 컨벤션에서 주석을 최소화하라고 되어 있습니다. 메서드 시그니처만으로 충분히 이해 가능한 내용이므로 Javadoc 제거를 고려하세요.
🟢 칭찬
- 도메인 패키지 구조 준수: controller → service → repository 계층 구조와 DTO 분리를 잘 따르고 있습니다.
- 방문 기록 소유권 검증: 다른 사용자의 방문 기록으로 리뷰를 작성하는 것을 차단하는 로직이 있어 좋습니다 (에러코드만 수정 필요).
@Valid+ DTO validation: 입력값 검증을 어노테이션 기반으로 깔끔하게 처리했습니다.@Transactional적절한 사용: 클래스 레벨readOnly=true, 쓰기 메서드에만@Transactional오버라이드하는 패턴을 올바르게 적용했습니다.