Skip to content

fix: 쓰지 않는 사진 파일을 지우고 검증 구멍과 낡은 문서를 정리한다 - #123

Merged
sususuj merged 3 commits into
mainfrom
fix/community-cleanup
Sep 17, 2026
Merged

sususuj merged 3 commits into
mainfrom
fix/community-cleanup

Conversation

@sususuj

@sususuj sususuj commented Sep 17, 2026

Copy link
Copy Markdown
Collaborator

변경 내용

커뮤니티 쪽 오류·낭비를 잡고 낡은 문서를 지금 동작에 맞췄다. 기능 추가는 없다.

1. 게시물 수정으로 빠진 사진이 저장소에 영원히 남았다

PATCH /posts/{postId} 로 mediaList 를 교체하면 DB 행만 지우고 S3 파일은 남겨 뒀다.
고아 파일 정리는 한 번도 게시물에 붙지 않은 파일만 보므로, 붙었다 빠진 파일은 아무도
지우지 않는다. MediaFileRemover 를 추가해 커밋된 뒤에 지운다. 트랜잭션 안에서 지우면
뒤이어 롤백됐을 때 파일만 사라져 사진이 깨진 글이 남는다. 만료 게시물 정리가 이미 같은
방식이다. 파일을 못 지워도 수정은 성공하며, 같은 url 을 다시 보낸 사진은 남긴다.

2. 검증 구멍 두 곳

대상 이전 이후
PATCH /users/me/profile-image URL 길이 제한 없음 최대 2048자
GET /posts/me/deleted size 를 조용히 50 으로 줄임 1~50 을 벗어나면 400

프로필 사진 URL 은 피드·댓글·팔로워·알림 응답에 모두 실려 나가, 상한이 없으면 한 사용자가
목록 응답 크기를 좌우한다. 본문 2000자 상한과 같은 이유인데 여기만 빠져 있었다.
size 는 문서가 이미 "1~50, 넘기면 400" 이라 적고 있어 코드를 문서에 맞췄다.
3. 코드 정리

  • CommentService.likedCommentIds 의 @Transactional 제거. private 메서드라 프록시가
    걸지 못해 아무 일도 하지 않았다. 주석도 update() 설명이 복사돼 있었다.
  • CommentService 의 페이지 크기 상수 두 개를 Paging 으로 통일.
  • 좋아요 취소에도 활성 사용자 확인 추가(게시물·댓글). 누르기만 확인하고 있었다.

4. 문서 정정

자유 입력 해시태그 시절 설명이 남아 있었고, 아래 둘은 지금 동작과 정반대다.

  • "삭제하면 연결을 물리 삭제하고 복구할 때 본문에서 다시 뽑는다" → 연결은 남기고 사용
    수만 줄인다. 연결까지 지우면 무엇을 골랐는지 되짚을 근거가 사라진다.
  • "해시태그를 본문 안에 함께 적는다" → 카테고리는 categories 로 고르며 본문과 무관하다.

ERD.md 24절의 "# 뒤의 한글·영문만 인정", "게시물당 20개·태그당 50자"(실제 10개)도
고치고, 테이블 이름이 hashtags 인 이유와 AdminStatsService 가 네이티브 SQL 로 이
이름을 쓴다는 사실을 적어 뒀다.

영향

  • API 변경 없음

    • API 문서와 변경 이력 수정
    • DB·ERD 변경 없음
    • ERD와 필요한 migration 수정
    • 외부 API 영향 확인

    요청·응답 형식은 그대로다. 정상 범위의 요청은 동작이 같고, 상한을 넘기던 요청만 400 이
    된다. ERD.md 는 24절 설명만 고쳤고 스키마·migration 변경은 없다. 외부 API 중에는 S3 만
    관계있으며, 삭제 호출이 게시물 수정 경로에 추가된다. 저장소가 꺼져 있으면 아무것도 하지
    않는다.

    테스트

    ./gradlew test                                                                                                                                                            
    # BUILD SUCCESSFUL — 전부 통과                                                                                                                                            
                                                                                                                                                                              
    # 추가한 테스트                                                                                                                                                           
    # PostServiceTest      교체로 빠진 사진만 저장소에서 지우고 그대로 남긴 사진은 두다                                                                                       
    # FeedSizeValidationTest  지운 게시물 목록도 같은 상한을 지킨다                                                                                                           
                                                                                                                                                                              
    확인                                     
                                                        
    - [x] 비밀값이 포함되지 않음                                                                                                                                              
    - [x] 관련 문서와 구현이 일치함                                                                                                                                           
    - [x] 의도하지 않은 변경이 없음   

@github-actions

github-actions Bot commented Sep 17, 2026 •

Copy link
Copy Markdown

🤖 Gemini PR Review

분석 결과 실제 수정이 필요한 문제가 발견되었습니다. 아래 내용을 확인해 주세요.

1. [HIGH] @Validated 누락으로 인한 쿼리 파라미터 검증 미작동 문제

  • 파일: src/main/java/com/server/post/controller/PostController.java

  • 라인: 34-38 (클래스 선언부) 및 161

  • 문제점:
    Spring MVC 환경에서 @RequestParam에 직접 지정한 @Min(1), @Max(50) 등의 제약 조건 어노테이션이 동작하려면, 해당 컨트롤러 클래스 레벨에 반드시 @Validated 어노테이션이 선언되어 있어야 합니다.

    현재 PostController에는 @Validated가 누락되어 있어, getMyDeletedPosts 메서드의 size 파라미터에 1000이나 0 같은 잘못된 값이 들어와도 아무런 예외(ConstraintViolationException) 없이 그대로 통과합니다. 이로 인해 서비스 레이어와 DB까지 잘못된 size 값이 전달되어 대량의 데이터 조회로 인한 성능 저하를 유발할 수 있습니다.

  • 개선 제안:
    PostController 클래스 상단에 @Validated 어노테이션을 추가하여 쿼리 파라미터 검증이 정상적으로 수행되도록 수정하세요.

  • 개선 예시:

@RestController
@RequestMapping("/api/v1/posts")
@Validated // 컨트롤러 파라미터 검증 활성화를 위해 추가
@Tag(name = "커뮤니티 게시물", description = "여행 후기 게시물 작성과 조회")
public class PostController {
    // ...
}

Model: `gemini-3.5-flash` · API key: `PRIMARY` · Commit: `408e83a`

@sususuj
sususuj merged commit e1d2a88 into main Sep 17, 2026
2 of 4 checks passed
SD-gif added a commit that referenced this pull request Sep 17, 2026
main 에 들어온 '게시물 수정으로 빠진 사진 파일 정리'(#123)와 겹친다. 그쪽은 요청의
원본 주소에 없는 딸린 파일을 지우는데, 축소본이 생기면서 딸린 파일 주소에 축소본이
함께 들어온다. 그대로 두는 사진의 축소본까지 지워져 목록 사진이 깨지므로, 남길
목록에 요청의 thumbnailUrl 도 넣는다.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@sususuj
sususuj deleted the fix/community-cleanup branch September 18, 2026 03:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant