--- kind: maintenance title: "배포 후 검증 체크리스트 — W3/W4 + 하드닝 b1/b2 (L3 deferred)" created_at: 2026-06-29 session_id: 20260629-142115 status: pending related_change: "../changes/2026-06-29-w3-w4-features.md" related_security_checklist: "../security/security-remediation-checklist.md" --- # 배포 후 검증 체크리스트 — W3/W4 + 하드닝 b1/b2 L3 런타임 스모크는 세션 20260629-100849 및 20260629-142115 에서 자동 수행하지 않고 **배포 후 과제로 이월**한 항목이다. 이 문서는 실 dev 환경(WAR 기동 + 실 DB) 에서 수동 확인해야 할 체크리스트다. 관련 변경이력: [2026-06-29-w3-w4-features.md](../changes/2026-06-29-w3-w4-features.md). --- ## 사전 조건 배포 전 아래 항목이 완료되어야 한다. - [x] **DB DDL 8종 적용 완료** (사용자 보고 수신 2026-06-29): tag/games-hub/board/game-upload/badge DDL 5종 + W2 jam DDL 3종을 `db/apply-local-ddl.sh` 로 실 dev DB 에 일괄 적용. - [ ] **b2 자산 수동 이전** — 아래 §자산 수동 이전 참조. WAR 기동 전 수행 권장. --- ## §자산 수동 이전 (b2 신규 저장루트) `application.properties` 변경(`app.upload.game-storage-path=${user.home}/.bibimbap/uploads`)으로 업로드 저장루트가 `static/` 트리 밖으로 이전됐다. **이전이 필요한 자산:** ``` # 이전 경로 → 새 경로 src/main/resources/static/profile/8/ → ~/.bibimbap/uploads/profile/8/ ``` - `static/profile/8/` 에 user 8 프로필 이미지가 존재할 경우 새 경로로 수동 이전 필요. - **미이전 시**: user 8 프로필 이미지 404 발생. - `static/game/` 은 비어있으므로 게임 자산 이전 불필요. **이전 명령 예시 (디렉토리가 존재하는 경우):** ```bash mkdir -p ~/.bibimbap/uploads/profile/8 cp -r src/main/resources/static/profile/8/. ~/.bibimbap/uploads/profile/8/ # 확인 후 원본 삭제(선택) ``` 완료 후 이 체크리스트 항목에 체크: - [ ] user 8 프로필 이미지 `~/.bibimbap/uploads/profile/8/` 에 존재 확인 --- ## §게임 좋아요 UNIQUE 마이그레이션 (세션 20260629-151216, DB 미적용) 게임 좋아요 서버 영속화([changes/2026-06-29-game-like-server-persistence.md](../changes/2026-06-29-game-like-server-persistence.md))에서 `game_likes (game_id, user_key)` 중복을 막는 UNIQUE 제약을 `db/migrations/20260629-game-likes-unique.sql` 로 추가했으나 **운영 DB 에는 아직 적용하지 않았다.** 제약이 없으면 동시 더블클릭 시 중복 좋아요 row 가 생길 수 있다(애플리케이션 레벨 select-then-act + 단일 트랜잭션으로 1차 방어하나 DB 보증은 별도). **적용 절차 (중복 점검 게이트 선행 필수):** ```sql -- 1) 중복 row 점검 — 결과가 0건이어야 바로 ALTER 가능 SELECT game_id, user_key, COUNT(*) FROM game_likes GROUP BY game_id, user_key HAVING COUNT(*) > 1; -- 2) (중복이 있으면) 중복 제거 후 진행. 없으면 곧장 제약 추가 ALTER TABLE game_likes ADD CONSTRAINT uq_game_likes_game_user UNIQUE (game_id, user_key); ``` - 롤백: `ALTER TABLE game_likes DROP CONSTRAINT uq_game_likes_game_user;` - (선택) 초기 정합 보정 — 기존 `like_count` 컬럼과 row 수 불일치 교정이 필요할 때만. 시드/레거시 카운트를 보존하려면 실행하지 않는다(본 기능 비목표): ```sql UPDATE games g SET like_count = COALESCE((SELECT COUNT(*) FROM game_likes gl WHERE gl.game_id = g.id), 0); ``` 완료 후 체크: - [ ] 중복 점검 SELECT 0건 확인 - [ ] `uq_game_likes_game_user` UNIQUE 제약 적용 --- ## L3 런타임 스모크 체크리스트 WAR 기동 후 아래 기능을 수동으로 확인한다. ### 1. 검색 (`/games/search`) - [ ] 태그 필터(단일/다중 AND/OR) 정상 동작 - [ ] 정렬키 6종(최신/조회수/평점/리뷰수/잼연관 등) 전환 확인 - [ ] 잼 필터(`?jam=slug`) 경유 잼 게임 목록 표시 - [ ] 방문수 dedupe — 동일 사용자 짧은 interval 내 재방문 시 view_count 미증가 확인 ### 2. 허브 (`/`) - [ ] keyset 페이징 더보기(스크롤/버튼) — 중복 없이 다음 페이지 로드 - [ ] 진행중 잼 배너 표시 (`JamsMapper.listActive` → `/games/search?jam=` 라우팅) - [ ] **게임카드 creator 배지 칩 표시** (이번 세션 신규 — `WebMvcController` creatorBadges 주입) ### 3. 포스팅 보드 - [ ] 포스팅 작성 (POST_WRITE 권한 보유 계정으로 로그인 후 `/posts/new`) - [ ] 마크다운 sanitize 렌더 — XSS 시도(`