Skip to content

MSG-502 feat: 승인된 이벤트를 골라 참여를 신청한다 - #244

Merged
s13121312 merged 5 commits into
developfrom
feature/MSG-502-event-participation
Aug 30, 2026
Merged

MSG-502 feat: 승인된 이벤트를 골라 참여를 신청한다#244
s13121312 merged 5 commits into
developfrom
feature/MSG-502-event-participation

Conversation

@s13121312

@s13121312 s13121312 commented Aug 30, 2026

Copy link
Copy Markdown
Member

🎫 관련 티켓

작업 내용

배경 (PRD docs/prd/event-submission.md v2.2) — 행사 운영자 콘솔의 등록 유형은 셋입니다. 지역축제와 팝업스토어는 독립 행사를 새로 등재하는 신청이고(MSG-498), 세 번째 "이벤트 참여형"은 2026-08-28 디자인 개정으로 바뀐 유형입니다: 독립 행사를 만드는 게 아니라 이미 승인된 큰 행사(이벤트)를 골라 그 아래에 참여를 신청합니다(FR-7). 유형 카드를 누르면 페이지 이동 없이 모달이 떠서 시·도 칩과 검색으로 승인 이벤트를 고르고(FR-26, MSG-501), 그다음 기본 정보를 입력해 제출합니다. 이 PR이 그 신청 경로입니다.

flowchart LR
    A["유형 선택<br/>(지역축제 / 팝업 / 이벤트)"] -->|이벤트 카드| B["승인 이벤트 모달<br/>시·도 칩 + 검색 (MSG-501)"]
    B -->|부모 회차 선택| C["기본 정보 입력<br/>이름·운영 주체·공개 기간<br/>참여 방식·소개·커버 이미지"]
    C --> D["대표 위치 등록<br/>사각형 영역 1곳"]
    D --> E["제출 → 심사 중"]
    E -->|승인| F["부모 이벤트의<br/>행사 위치로 반영 (MSG-500)"]
    E -->|반려| G["사유 확인 → 수정 → 재제출<br/>(부모는 못 바꿈)"]
    G --> E
Loading

PRD의 유형별 기본 정보 (시안 실측 — 이 PR은 세 번째 행을 구현):

유형 항목
지역축제 축제명, 주최 기관, 축제 기간, 주요 프로그램, 축제 소개, 대표 이미지
팝업스토어 팝업명, 브랜드/운영사, 운영 기간, 운영 시간, 팝업 소개, 대표 이미지
이벤트 참여형 이름, 운영 주체, 공개 기간, 참여 방식, 소개, 커버 이미지 + 입력 전에 모달에서 부모 이벤트 선택

구현한 것

  • 새 API는 없습니다. 기존 신청 API 5개(제출, 내 목록, 상세, 재제출, 이미지 업로드 URL)가 그대로 이 유형을 받습니다 — MSG-498이 유형별로 갈라지게 만들어 둔 자리에 세 번째 갈래만 추가했습니다
  • 신청에 두 값이 늘었습니다: 모달에서 고른 부모 행사 회차 참조, 참여 방식 설명. DB 컬럼 2개 추가(Flyway1 V50) + "이벤트 유형이면 부모 필수, 아니면 금지"를 DB 제약으로 강제
  • 부모 행사 검증 2가지: 없는 회차 404(13440), 끝난 회차 409(13441). "끝났다" 판정 시각을 모달 목록의 노출 조건과 정확히 반대로 맞춰서, 같은 순간에 목록에서 사라지고 신청도 막힙니다 — 목록엔 보이는데 신청은 거부되는 어긋난 구간이 없습니다
  • 위치는 대표 위치 1곳만 받습니다(지역축제·팝업이 최대 81칸 목록을 받는 것과 다른 점 — PRD FR-8에 예외 명문화)
  • 반려본을 고쳐 다시 낼 때 부모 행사는 바꿀 수 없습니다. 부모를 바꾸는 건 사실상 다른 신청이라서입니다
  • PRD v2.2 개정 동봉: 8-29 확정 2건 기록 — ① 참여로 생기는 것은 별도 이름 없이 "행사 위치"로 흡수 ② 승인된 지역축제·팝업은 별도 공간 없이 기존 미션 칩(축제 칩·팝업 칩)에 편입. ②의 구현은 MSG-500 몫
  • 요구사항 명세(SRS2)에 FR-EVENT-17 신규 등재 + 검증 테스트 22건 연결. 테스트 준비 데이터의 고정 날짜를 상대 날짜로 교체(10월·11월에 날짜가 지나면 테스트가 깨지기 시작하는 시한폭탄이 이번 것 2개와 MSG-498 것 3개에 있었음)
  • 신규 테스트 22건, 전체 스위트 초록불 (리뷰 에이전트 독립 재실행 2,883건 + Codex 교차 리뷰 스펙 3라운드·구현 2라운드 수렴)

🤔 고민한 내용

  • "대표 위치는 1곳만" 검사를 기존 메서드 시그니처를 바꾸지 않고 넣었습니다. 위치를 전개하는 메서드에 유형을 넘기는 대신, 유형을 이미 아는 앞 단계 검증에서 2곳 이상을 거부합니다. 대신 두 검증의 실행 순서가 바뀌면 이 검사가 사라지는 순서 의존이 생겨서, 코드 주석과 작업 로그에 알려진 한계로 남겼습니다
  • 참여 방식의 길이 검사(10~2000자)는 요청 DTO의 선언적 검증(Bean Validation3)으로 뒀습니다. 서비스 코드에서 13439로 통일하자는 안도 있었지만, 기존 두 유형의 전용 필드(주요 프로그램, 운영 시간)가 이미 같은 방식이라 세 필드의 규칙을 통일하는 쪽을 택했습니다
  • 구버전으로 되돌리기 비호환을 수용했습니다. 이 변경으로 EVENT 유형 행이 생긴 뒤 이전 버전 코드로 돌아가면, 코드의 유형 목록(enum4)에 EVENT가 없어 그 행을 읽다 깨집니다. 아직 화면도 없고 실사용자도 없는 출시 전 기능이라 단계적 배포는 과하다고 보고, 되돌릴 일이 생기면 EVENT 행을 먼저 지운다는 조건만 작업 로그에 남겼습니다

👀 리뷰 포인트

  • 재제출에서 부모가 안 바뀐다는 보장이 DB 제약이 아니라 "요청 DTO에 부모 필드가 아예 없음"에서 옵니다. JPA가 변경분을 저장할 때(더티 체킹5) 부모 컬럼이 같은 값으로 다시 쓰이기는 합니다 — 값을 바꿀 입력 경로가 없다는 게 보장의 실체인데, 이 방식이 충분한지 봐주세요
  • 승인할 때 신청의 속성(운영 주체, 소개, 공개 기간, 참여 방식, 커버 이미지)을 행사 위치로 옮겨 적는 일은 다음 티켓 MSG-500 몫으로 스펙에 목록을 남겼습니다. 500 시작 전에 이 목록에 빠진 게 없는지 확인 부탁드립니다

Footnotes

  1. Flyway — DB 스키마 변경을 번호 붙은 SQL 파일(V50 등)로 쌓아 순서대로 적용하는 도구. 번호가 겹치거나 순서가 꼬이면 배포가 깨져서, 병렬 작업에서는 번호 예약이 중요하다.

  2. SRS(요구사항 명세) — 서비스 전체 요구사항을 한 문서(docs/srs.md)에 ID를 붙여 모아 둔 정본. 각 요구가 어떤 테스트로 검증되는지 추적표(docs/rtm.md)로 이어지고, CI가 이 연결이 끊기면 빌드를 막는다.

  3. Bean Validation — 요청 DTO 필드에 어노테이션(@SiZe 등)으로 다는 선언적 입력 검증. 서비스 코드에 닿기 전에 걸러지고, 실패하면 공통 400 응답으로 나간다.

  4. enum — 코드에 값 목록을 고정해 두는 자료형. DB에는 문자열로 저장되므로, DB에 새 값이 있는데 코드 목록에 없으면 그 행을 읽는 순간 변환에 실패한다.

  5. 더티 체킹 — JPA가 트랜잭션 안에서 객체의 바뀐 필드를 감지해 커밋 시점에 UPDATE 문을 만들어 주는 동작. 개발자가 UPDATE를 직접 쓰지 않아도 저장되는 대신, 실제 나가는 SQL은 로그로 확인해야 안다.

@claude

claude Bot commented Aug 30, 2026

Copy link
Copy Markdown

Claude finished @s13121312's task in 3m 44s —— View job


리뷰 완료

  • 컨텍스트 수집 (PR body, 변경 파일 목록)
  • 병렬 브랜치 경합 확인 (마이그레이션 번호, developCode 대역, Owner 계약)
  • 스펙 대비 구현 확인 (docs/spec/MSG-502.md)
  • 실행 시 드러나는 결함 확인 (트랜잭션, 시간대, 인가, N+1)
  • PR 본문 주장 검증
  • 결과 정리

확인한 범위: 마이그레이션 V50/에러코드 13440·13441이 origin/develop 및 로컬에 페치된 다른 브랜치들과 충돌하지 않음(단, 네트워크 접근이 막혀 있어 gh pr list로 열린 PR 전체를 다시 조회하지는 못했고 로컬 refs 기준의 추정입니다) · EventSubmissionServiceImpl의 부모 검증·유형별 분기·재제출 부모 불변 로직을 스펙(D-2·D-3·D-4·D-6)과 대조 · V50 마이그레이션의 CHECK 제약과 엔티티 매핑 · 종료 정각 경계(endsAt <= now)를 포함한 테스트 22건 및 리소스 정합성.

발견된 이슈 없음. PR 본문에서 스스로 밝힌 두 가지 알려진 한계(위치 개수 검증의 호출 순서 의존성, EVENT 행 생성 후 구버전 롤백 비호환)는 코드 주석·스펙 결정 기록·테스트로 충분히 뒷받침되어 있어 별도 지적하지 않았습니다.

@github-actions

Copy link
Copy Markdown

테스트 커버리지

Overall Project 96.11% -0.01% 🍏
Files changed 97.8% 🍏

File Coverage
EventSubmissionParentEventResponseDto.java 100% 🍏
EventSubmissionUpdateRequestDto.java 100% 🍏
EventSubmissionDetailResponseDto.java 100% 🍏
EventSubmissionCreateRequestDto.java 100% 🍏
EventErrorCode.java 100% 🍏
EventSubmissionType.java 100% 🍏
EventSubmission.java 100% 🍏
EventSubmissionServiceImpl.java 98.06% -0.61% 🍏
EventSubmissionController.java 80% 🍏

@s13121312
s13121312 merged commit 820f6ec into develop Aug 30, 2026
2 checks passed
@s13121312
s13121312 deleted the feature/MSG-502-event-participation branch August 30, 2026 02:47
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