이정수
6047a39ca5
feat(board): W3-3 포스팅 보드 — 공지/블로그 + OG 미리보기(SSRF 방어) + 유니티 피드 감시
...
- posts/post_categories/unity_feed_sources/unity_feed_items 4테이블: docs/board-ddl.sql 권위 + db/schema.sql 동기, 멱등(IF NOT EXISTS/DO $$). FK·CHECK·부분 UNIQUE(unity_feed_items source_id,guid)
- 포스팅 CRUD: PostController 공개 목록(keyset 페이징 (created_at,id)) + 상세 + 작성/수정/삭제. POST_WRITE enforcement 연결(W1 PermissionGate, 임시 role 체크 0). 작성자무관 POST_WRITE 보유자 편집
- 마크다운 본문: PostMarkdownService commonmark 0.22.0 → jsoup 1.17.2 Safelist allowlist sanitize, 저장 시 1회 캐시(body_sanitized_html). script/on*/javascript:/iframe/object 제거(adversarial 감사 SOUND)
- ★SsrfSafeFetcher 공용 외부 fetch 관문: scheme allowlist + 전 resolved IP 공인검증(사설/루프백/링크로컬/메타데이터169.254.169.254 + CGNAT 100.64/10 + class-E/benchmarking/NAT64/6to4 차단) + 포트 allowlist{80/443/8080/8443} + hostname-connect(HTTPS SNI 정합) + 매홉 재검증(redirect NEVER, MAX 3) + peer 재검증(rebinding) + size cap + timeout + Content-Type + graceful
- OG 미리보기(OgPreviewService) + 유니티 피드 폴링(UnityFeedPoller @Scheduled, SchedulingConfig @EnableScheduling, FeedParser RSS/Atom XXE 방어 disallow-doctype) + guid dedupe(ON CONFLICT DO NOTHING)
- 카테고리/피드 운영: PostAdminController/UnityFeedAdminController /admin/** ADMIN 인터셉터 + CSRF 전수. 카테고리 삭제 FK 보호
- 신규 6매퍼 #{} only(${} 0). @MockBean 8. JSP 5(scriptlet+HtmlUtils.htmlEscape, JSTL 의존 부재 정합)
검증: 컨테이너 ./mvnw -o test 287/287 GREEN(신규 44), 회귀 0. L2 격리 throwaway DB contract PASS(keyset row-comparison·alias·insertIgnoreDup ON CONFLICT·FK 거부). adversarial SSRF 감사: rebinding/redirect/scheme/IP인코딩/IPv6 차단 실증, XSS sanitize SOUND. 실 dev DB 무접촉.
backward 보정(동일 커밋 통합): (1) Host restricted-header→fetch 전건 empty+테스트 vacuous → hostname-connect 전환(HTTPS SNI 정합, JVM 플래그 불요) (2) CGNAT 등 차단범위 확장 (3) FeedParser RFC1123 요일-날짜 불일치 robust 파싱.
알려진 잔여: option-b hostname-connect 는 connect 시 재resolve 로 rebinding TOCTOU 창 존재(DNS 캐시로 최소화). 위협모델상 LOW(fetch URL 제출자=ADMIN 피드등록/POST_WRITE OG). HTTPS 실 TLS = L3 스모크 권고.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3FeMrbtxfTScjrwUukyHD
2026-06-29 11:46:28 +09:00
이정수
e28fa60ca6
feat(hub): W3-4 메인 허브 keyset 페이징 + 진행중 잼 배너 (단계1+2 통합)
...
- keyset 페이징: GamesMapper.listVisibleKeyset/searchVisibleKeyset 신규 — 커서 (sort_order,created_at,id) 3-튜플 OR 분해(혼합방향 ASC/DESC/DESC), LIMIT #{limit}, #{} only. 기존 getVisibleGames/searchVisibleGames 보존(회귀 0)
- WebMvcController: cursor 파라미터 + nextCursor 산정 + parseCursor/encodeCursor(형식오류→첫페이지 폴백, throw 0) + HubCursor record + HUB_PAGE_SIZE=24. 검색/비검색 동일 커서 규약(공통 헬퍼)
- 진행중 잼 배너(단계2): JamsMapper.listActive/countActive 신규(status IN RECRUIT/DEV/EVAL, is_visible). 최신 1건 + "외 N-1개" 라벨, N=0 미렌더. CTA → W3-1 /games/search?jam={slug}
- index.jsp: 더보기 링크(hasNextPage, q+cursor URLEncoder) + 잼 배너(title HtmlUtils.htmlEscape, slug URLEncoder). 기존 렌더루프+W3-1 태그 UI 보존
- docs/games-hub-ddl.sql: idx_games_visible_keyset 멱등(games 컬럼 0변경) + schema.sql 동기
- BibimbapApplicationTests 무변경(JamsMapper/GamesMapper @MockBean W2-1 기등록 재사용)
검증: 컨테이너 ./mvnw -o test 243/243 GREEN(신규 8: WebMvcControllerTest), 회귀 0. L2 격리 throwaway DB contract PASS(혼합방향 keyset 경계 무중복/무누락·동일 sort_order/created_at tie-break·검색 keyset·잼 status 필터). 정렬키 5곳 동일·${} 0. 실 dev DB 무접촉.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3FeMrbtxfTScjrwUukyHD
2026-06-29 10:59:17 +09:00
이정수
35f1dc3de9
feat(search): W3-1 게임 태그 + 검색 확장 — tags/game_tags/jam_tags/game_views + 다중태그·정렬키·방문수·리뷰 정렬
...
- 신규 4테이블(tags/game_tags/jam_tags/game_views) + games.view_count ALTER: docs/tag-ddl.sql 권위 + db/schema.sql 동기 사본, 멱등(IF NOT EXISTS/DO $$ guard)
- 통합 태그 도메인: tag_type(GAME/JAM/COMMON) + 운영자 사전정의·사용자 pending→승인 하이브리드. slug/name UNIQUE
- 검색 확장 GamesMapper.searchGamesAdvanced(SearchCriteria): 태그 다중필터(AND HAVING==tagCount / OR IN) + 제작자 ILIKE + 정렬키 6(latest/likes/views/reviews/rating/relevance) + 잼 검색 라우트(/games/search?jam={slug}, jam_entries 조인). 기존 searchVisibleGames 보존(회귀 0)
- game_review_stats VIEW LEFT JOIN: avg_rating AS "avgRating"/review_count AS "reviewCount" 케이스폴딩 인용. NULLS LAST. 정렬키/tagMode 는 <choose> 내부 고정문자열
- 방문수: game_views 24h dedupe(interval) + games.view_count 비정규화 증분. GameController view 훅
- 태그 관리 API: TagController(생성/승인/비활성/부착) CSRF 전수 + /admin/tags CONTENT_MODERATE 게이트. TagSanitizer 길이2~20·화이트리스트·금칙어(banned-words.txt)
- 신규 4매퍼 #{} only(${} 0건). GameData nullable 박스필드(viewCount/avgRating/reviewCount) 확장. BibimbapApplicationTests @MockBean 4종
검증: 컨테이너 ./mvnw -o test 235/235 GREEN(신규 45: TagSanitizerTest 16·SearchControllerTest 10·TagControllerTest 19), 회귀 0. L2 격리 throwaway DB contract PASS(alias 케이스폴딩 인용/비인용 대조·NULLS LAST·AND⊆OR·ILIKE·interval dedupe). 집합전수 AC-1/2/4/5 PASS. 실 dev DB 무접촉.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3FeMrbtxfTScjrwUukyHD
2026-06-29 10:44:23 +09:00
이정수
7ae6589b39
docs(dev): W2 회고 교훈 3건 반영 — (검증)태그·케이스폴딩 기준·공유헬퍼 grounding
...
설계·테스트 단계 체크리스트(append-only):
- 신규 *Test.java 는 "(검증)" 소유태그여도 구현 산출물(verification은 실행만, Write 없음)
- 매퍼 alias 케이스폴딩 기준 = Map resultType/집계 SELECT (VIEW 여부 아님). POJO 직접매핑은 비인용 허용 — BUG-2 교훈 정밀화
- 신규 컨트롤러 호출 공유 헬퍼는 정의 존재를 grounding(rg)으로 선확인(test-compile 비신뢰)
외부 번들 권고 2건 추가(design-advisor owner 표기 분리·impl-advisor 헬퍼 grounding). 근거 W2 세션(20260624).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-24 14:23:12 +09:00
이정수
932ca92753
chore(graph): graphify 양 scope 재생성 메타 갱신 — W1 RBAC + W2 게임잼 (b9d836d→a74bf74)
...
- fully-stale 판정 → /graphify src/(1152노드) + /graphify docs/(91노드) 재생성
- docs/graph/index.md frontmatter source_commit a74bf74 + Scopes 표 갱신. 본체는 .gitignore(재생성 가능)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-24 14:19:14 +09:00
이정수
b222b0106c
docs(jam): W2 게임잼 변경 이력 기록 + 설계 구현추적 갱신
...
- docs/changes/2026-06-24-w2-jam-platform.md 신규 — W2-1~6 전체 변경(테이블·컨트롤러·게이트·보안·검증 190/190 + 커밋 ccf1e42~a74bf74)
- docs/changes/index.md 링크 추가
- work-log 풀설계 요약에 W2 구현 완료 추적 한 줄 + 교차 링크
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-24 14:19:14 +09:00
이정수
2d5601bda7
feat(jam): W2-3 잼 평가 동결 스키마 — jam_criteria/scores/votes/awards + jam_score_stats VIEW ( ⚠️ 클러스터 단일권위)
...
- 신규 4테이블 + 1 집계 VIEW(docs/jam-eval-ddl.sql 권위 + db/schema.sql 동기, 멱등)
- 평가단위 = (jam_id,game_id) 활성 자연키. FK game_id→games·jam_id→jams 직접(jam_entries.id surrogate 아님). W2-1 jam_entries 활성 UNIQUE 가 1:1 보장
- 무결성: 1심사위원1기준1점·1인1표(UNIQUE), score 1~5·weight≥0·track 4값·rank≥1(CHECK)
- jam_score_stats VIEW: WITH per_criterion CTE 선집계 후 LEFT JOIN(fan-out 가드, game_review_stats 선례 동형) + NULLIF 0-division 가드. 미채점 criterion 자동 제외. 컬럼 소문자 snake(하류 매퍼가 AS "camelCase" 인용 매핑 — W2-4 소관)
- 하류 W2-4/5/6 소비 계약 동결. 매퍼/컨트롤러는 비목표(하류 산출)
검증: ./mvnw test 119/119 GREEN 유지(Java 무변경·회귀 0). L2 contract PASS — DDL 적용·제약 거부 4종·VIEW 집계 정합(가중합/단순합 손계산 일치, 심사위원 2→4 증가에도 fan-out 왜곡 0, NULLIF 가드). 집합전수 AC-T1~6 PASS(DROP 0·리뷰 인프라 무변경).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-24 11:33:19 +09:00
이정수
71b6b6f32a
feat(jam): W2-2 심사위원 역할 — jam_judges + JamRoleGate(잼 스코프 게이트) + 자기출품 충돌
...
- 신규 jam_judges 테이블(docs/jam-judge-ddl.sql 권위 + db/schema.sql 동기, 멱등). 전역 RBAC(user_permissions) 무변경 — 잼 스코프 권한은 별도 조인
- JamRoleGate.isJudge(잼별 지정 조회) + isOwnEntry(개인 entrant OR 팀멤버 OR-EXISTS) — 자기출품 충돌 판정 헬퍼/계약 제공(enforce=W2-4)
- JamJudgeAdminController: 지정/해제/조회 + requireJamManage 게이트 + CSRF. W2-1 /admin/jams/** exclude 가 judges 트리 커버(인터셉터 무수정)
- JamEntriesMapper.isOwnEntry 추가(#{} only). admin-jam-list.jsp 심사위원 섹션
- BibimbapApplicationTests @MockBean 2건(JamJudgesMapper/JamRoleGate)
검증: ./mvnw -o test 119/119 GREEN(신규 22: JamRoleGateTest 8·JamJudgeAdminControllerTest 14, 회귀 0). L2 contract PASS(ux_jam_judges UNIQUE 거부·isOwnEntry OR-EXISTS 6/6 정합). 집합전수 AC-T1~7 PASS(전역 RBAC 무변경 단언 포함).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-24 11:15:22 +09:00
이정수
ccf1e42430
feat(jam): W2-1 게임잼 엔티티/라이프사이클 — jams/entries/teams + GAME_JAM_MANAGE enforcement + 공개 목록·상세
...
- 신규 5테이블(jams/jam_teams/jam_team_members/jam_entries/jam_status_log) DDL: docs/jam-ddl.sql 권위 + db/schema.sql 동기 사본, 멱등(IF NOT EXISTS/DO $$ guard)
- 잼-게임 연결 = 조인테이블 jam_entries(games 무변경). 평가단위 = (jam_id,game_id) 활성 자연키. 잼당 게임 1회 활성 UNIQUE
- 출품 주체 개인/팀 XOR(entrant_type + XOR CHECK). jam_teams/jam_team_members
- 라이프사이클 4상태(RECRUIT/DEV/EVAL/CLOSED) + JamLifecycle 전이 그래프·기간정합 + jam_status_log 감사(수동/자동 공통 코어)
- GAME_JAM_MANAGE enforcement: JamAdminController 진입부 requireJamManage 게이트 + InterceptorConfig /admin/jams/** exclude(SUBADMIN+키 통과)
- 공개 JamController: keyset 페이징 목록(/jams) + 상세(/jams/{slug}) + 출품/팀 액션(CSRF). 3 JSP
- 신규 5매퍼 #{} only, snake→camel alias. BibimbapApplicationTests @MockBean 5건
검증: ./mvnw -o test 97/97 GREEN(신규 32: JamControllerTest 14·JamAdminControllerTest 10·JamLifecycleTest 8 + contextLoads), 회귀 0. L2 dev DB contract PASS(XOR/status CHECK·활성 UNIQUE·keyset row-comparison). 집합전수 AC-T1~6 PASS.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-24 10:50:12 +09:00
이정수
bfbe1de9e4
docs(design): W2(게임잼)+W3(잔여)+W4 풀설계 산출 + 골자 카탈로그 + stale 정정
...
설계 전용 세션(코드 0줄, src/·pom.xml 무변경). 골자 → 정석 결정 확정 → 풀설계.
- 골자 신규: W2(6서브)·W4 카탈로그(docs/work-log/2026-06-23-w2-w4-feature-skeletons.md). W3-* 는 기존 골자 유지.
- 풀설계 11기능(W2-1~6·W3-1/3-3/3-4/3-5·W4) — W1-design 깊이(DDL/API계약/시퀀스/파일영향맵/대안비교/AC매핑), 오픈질문 0. 본문 = .atp/work-session/20260623-104307/implementation/.
- 정석 크로스-W 결정(개입없이 orchestrator 확정, 사용자 위임): 잼 스코프=별도 jam_judges / 평가단위=(jam_id,game_id) 자연키 / 유저평점=avg_rating 단방향 / 잼연결=조인테이블 jam_entries + 팀출품 1차 / 인기투표=1인1표 UNIQUE / SSRF=공용 SsrfSafeFetcher 9항목 / 권한키 BADGE_MANAGE 신규.
- 교차정합 감사(_cross-consistency-audit.md): 동결 단일권위(W2-3) 유지·하류 정합 PASS. HIGH 1(W2-1 평가단위 표현 drift, DDL정합) 5개소 정정. LOW 3 무해.
- 골자 stale 정정 3건: RBAC 인프라 실재(enforcement 갭)·리뷰 하이브리드(overall+6축)+VIEW·/game/** 정상 서빙(QG-3 해소, GameAssetController).
- 통합 인덱스: docs/work-log/2026-06-23-w2-w4-full-design-summary.md.
검증: 설계 전용 — 코드 변경 0이라 L1/L2 해당 없음(graph-refresh §3.2 no-scope-change skip). 구현·검증은 착수 시 별도 세션. game_likes 운영 DB UNIQUE 는 미확인(추정, 운영 확인 권장).
resumed_from: 20260622-180054 (W1 설계/구현)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 12:14:32 +09:00
이정수
941f9fb128
feat(rbac): W1 거버넌스/RBAC — 관리자 콘솔·권한 게이트·세션 epoch 전파
...
- role(ADMIN/SUBADMIN/USER) + user_permissions join 권한 모델 도입. ADMIN 암묵 전권, SUBADMIN 부여 키만, USER 0.
- permissions 카탈로그(DB 테이블) + PermissionKeys enum 단일 정의처. 부팅 시 PermissionCatalogVerifier 가 enum→DB 멱등 시드·불일치 경고(코드↔DB 동기화 계약).
- PermissionGate(판정 코어) + RbacInterceptor(/admin/** ADMIN 게이트) + InterceptorConfig. 미인증 401/redirect·미인가 403·CSRF 실패 403 정책 확정.
- AdminConsoleController 4액션(임명/권한토글/강등/운영진 목록) + admin-console.jsp. 상태변경 전부 CsrfTokens.isValid 선검증.
- users.permissions_epoch 스탬프 + 요청당 PK 단일조회 대조로 권한 회수 즉시 반영. Spring Session 부재(톰캣 in-memory)로 타 세션 직접 무효화 불가한 제약을 epoch 대조로 우회 — 회수 우회 차단.
- comment/review 모더레이션 ROLE_ADMIN.equals(role) → PermissionGate.canModerate(ADMIN OR SUBADMIN+CONTENT_MODERATE) 흡수. ADMIN 통과 동작 회귀 보존.
- rbac_audit_log 임명/강등/부여/회수 대칭 기록.
- DDL: docs/rbac-ddl.sql(멱등·비파괴, 기존 전원 role=USER 호환), db/bootstrap-admin.sql(최초 ADMIN 수동 seed — 자동 승격 경로 부재).
검증: ./mvnw -o test 65/65 GREEN (PermissionGateTest 7 · AdminConsoleControllerTest 13 · GameComment/ReviewControllerTest 흡수 회귀 PASS). DDL 로컬 적용·L2(DB 방언 계약)·L3(스모크)는 미수행 — 별도 결정으로 분리.
설계: .atp/work-session/20260622-180054/implementation/W1-design.md
요구: .atp/work-session/20260622-180054/research/W1-requirements.md
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 10:38:57 +09:00
이정수
e0eb8eae15
docs(dev): 검증 회고 교훈 반영 — DB-방언 계약 L2 + stale 빌드 가드
...
W3-2 L3 검증 세션(20260622-170857) 회고에서 채택한 재현성 교훈 2건 docs 반영.
- verification-strategies.md: 버그범주→L레벨 표에 "MyBatis 매퍼/SQL alias·집계 뷰
변경 = L1+L2(dev DB contract)" 행 추가 + mock-vs-reality 노트(alias 케이스 폴딩,
뷰 fan-out 실증) — L1 @MockBean 이 DB-방언 계약을 구조적으로 우회함을 명시.
- local-setup.md §4.2: L3 검증 진입 전 "가동 앱이 현재 빌드인지" 확인 절차 신설
(JSP docBase 동결 → stale spring-boot:run 라이브 리로드 불가, 재기동 필수).
- work-session 회고 산출물(report.md Retrospective/applied_changes) 동봉.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 17:58:47 +09:00
이정수
21892c8a03
fix(reviews): game_review_stats 집계 버그 2건 수정 + W3-2 L3 검증 완료
...
W3-2 댓글/리뷰 고도화 검증 부채(DDL 적용·L1 회귀·L3 브라우저 스모크) 해소 중
서버 집계의 실버그 2건을 발견·수정. 둘 다 L1 @MockBean 사각으로 누출됨.
BUG-1 game_review_stats 뷰 fan-out
- LEFT JOIN game_review_axes 직접 조인 → 리뷰가 axes 행수(최대 6)만큼 복제,
COUNT(*)/AVG(rating) 왜곡(다축 리뷰 1건에 review_count 11/avg 2.8, 실제 6/3.5).
- 축 평균은 서브쿼리 game 단위 선집계 후 LEFT JOIN(MAX), 리뷰 단위 집계는
game_reviews 단독 산출로 수정. docs/game-reviews-ddl.sql + db/schema.sql 동기.
BUG-2 GameReviewStatsMapper alias 케이스 폴딩
- 따옴표 없는 AS gameId/avgRating/reviewCount → Postgres 소문자 폴딩 →
buildSummary의 camelCase Map 조회 null → summary 항상 null("아직 평가 없음" 오표시).
- alias 3개 큰따옴표로 케이스 보존.
검증
- mvn test 43/43 GREEN(수정 후 무회귀).
- 수정 후 dev 실게임: 뷰 review_count 6/avg 3.5, summary={avgRating:3.5,reviewCount:6,axes}.
- L3 스모크 12항목 전수 PASS(XSS 미실행·재방문 영속·다축6행·SVG레이더·집계·
페이지네이션·키보드·C1/C2/C4·B2·A2). changes 문서 §L3 결과 + security checklist B3 갱신.
- 권고: game_review_stats L2 contract 테스트 신설(L1 mock 사각 차단) — 이월.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 17:54:19 +09:00
이정수
5a8080ddd3
docs(dev): 비-메인스트림 브랜치 커밋 표준 승인 정책 추가
...
비-메인스트림 브랜치(main/master·보호 브랜치 외)에서는 작업 단위마다 매번
묻지 않고 커밋하도록 표준 승인(durable authorization)을 명문화. 하니스
기본규칙('사용자 요청 시에만 커밋')과 모순 없음 — 프로젝트 지침이 사전·상시
승인을 부여하는 형태. push 는 브랜치 무관 명시 요청 한정, 메인스트림은
branch-first 유지.
- docs/development/git-workflow.md: 정본 신설. 브랜치 분류·표준 승인·push
제외·커밋 단위·Conventional Commits + Co-Authored-By 트레일러 규약.
- CLAUDE.md 작업 원칙: 표준 승인 요지 2불릿 + 정본 링크.
- docs/development/index.md: 정본 등재.
ADR 아닌 development 규칙으로 분류(가역적 운영 절차). 부수 발견: 보고서들이
참조하는 ADR-0010 은 docs/adr/ 에 실재하지 않는 phantom 참조.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 16:59:09 +09:00
이정수
3593c82d78
feat(db): 로컬 DDL 즉시적용 스크립트 + 셋업 절차 문서화
...
마이그레이션 도구(flyway/liquibase) 부재. db/schema.sql 은 컨테이너 최초
기동 시 1회만 자동 주입되어, 이후 docs/*-ddl.sql 변경은 실행 DB 에 미반영.
- db/apply-local-ddl.sh: docs/*-ddl.sql 을 실행 컨테이너 dev 스키마에 멱등
적용(search_path 강제, ON_ERROR_STOP=1, .env 접속정보 로드, 컨테이너 가드).
- docs/usage/local-setup.md §4.1: 신규/변경 DDL 즉시 적용 절차 + 작성자 규약
(DDL 파일 / 실행 DB / db/schema.sql 세 곳 동기화).
검증: game-reviews-ddl.sql 적용 후 game_review_axes·game_review_stats·
game_comments.updated_at·game_reviews.is_rating_manual 생성 확인, 스크립트
전체 멱등 재실행 성공.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 16:58:59 +09:00
이정수
375a2de0ff
docs(graph): W3-2 댓글/리뷰 반영 graph 메타 갱신
...
src+docs 양 scope 재생성 (fully-stale 판정 처리, no-defer).
- src: 536노드/1206엣지/20커뮤니티 — 리뷰 다축평점·댓글 commentView·edited 토폴로지 반영
- docs: 119노드/164엣지/15커뮤니티 — C3 재분류·육각형·axes/stats DB 스키마·검증교훈 군집
source_commit b9d836d 동기화. graph 본체는 .gitignore(재생성 가능).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 12:40:24 +09:00
이정수
b9d836d5f4
feat: W3-2 댓글/리뷰 고도화 — 다축 평점·육각형 레이더·페이지네이션·집계뷰
...
W3-2 코어 위에 FINAL SPEC 전체 구현 (resumed_from 20260618-145152).
- 다축 평점: game_review_axes(6축·리뷰당6행) + overall 자동평균/수동(is_rating_manual)
- 육각형 SVG 레이더(요약+카드, frontend-design 폴리시), 6축 radiogroup(roving tabindex)
- A1 commentView 통일 / A2 하이브리드 작성자명+탈퇴자 마스킹(QG-2) / A3 edited·updated_at
- B1 페이지네이션(limit+1 hasMore) + sort 화이트리스트(@SelectProvider, ${} 미사용)
- B2 본문 최소10자 / B3 TextNormalizer 정규화
- C3 game_review_stats 집계뷰(W3-2 일반 DDL, 잼평가 동결 무관). 클라 평균계산 폐기
- DDL 멱등 ALTER/CREATE (game-reviews-ddl.sql + db/schema.sql 동기화)
검증: ./mvnw test 43/43 GREEN(회귀0). DDL 적용·L3 스모크 = 사용자 환경.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 12:29:21 +09:00
이정수
e98c437765
feat: W3-2 댓글/리뷰 분리 구현
...
기존 game_comments(닉네임 자유입력, localStorage 전용)를 서버 영속화 +
로그인 연동으로 전환하고, 별점 5점 + 서술 평가 형태의 game_reviews 도메인 신설.
- 댓글 서버 영속화: localStorage → DB game_comments. user_id NULL FK 비파괴 추가,
content 200자 앱레벨 검증. 레거시 nickname 레코드 보존(비마이그레이션, QG-2).
- game_reviews 신설: 게임당 1회(partial UNIQUE), rating CHECK(1~5), soft-delete.
- 권한: 작성자 본인 OR ROLE_ADMIN. 비로그인 쓰기 401, CSRF 미검증 403.
- GameController.deleteGame 에 리뷰 cascade soft-delete 추가.
- GameCommentController(C1~C4) / GameReviewController(R1~R5) 신규.
- 컨트롤러 단위 테스트 추가, BibimbapApplicationTests 매퍼 @MockBean 보강.
- 보안 체크리스트 댓글 항목 충족 마킹, 좋아요 항목은 범위 밖 미결 유지.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019tHAb6XYHWDPzb82FNKugo
2026-06-18 14:35:24 +09:00
이정수
f9590e59bc
docs: 에이전트 출력 규약 추가 — 의사결정 제시문 압축 비적용
...
W3 합의 세션 회고 교훈을 MEMORY 대신 docs/development/ 에 반영(사용자 지시).
사용자 대면 의사결정 제시문은 배경+선택지+권장 풀어쓰기, 압축은 내부 산출물 한정.
발원: 20260617-174635 세션 W3-1 마무리 질문 과압축 → 사용자 파악 실패.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 10:16:09 +09:00
이정수
15b8bc3362
docs: W3 사이트플랫폼 5기능 골자 확정 (draft→confirmed)
...
W3-1~W3-5 골자를 기능별·항목별 합의해 status draft→confirmed.
- W3-1 태그+검색: 통합 1테이블, 정렬 매트릭스(태그 일치도 가중×2차키), 개발자 검색
- W3-2 댓글/리뷰: 리뷰=별점5+서술(다축 후속), 권한 작성자+운영자, 수정=이력보존+'수정됨' 표시
- W3-3 포스팅: W1 완료 후 착수, 카테고리 DB, 마크다운, OG 미리보기, 유니티블로그 외부 피드 감시
- W3-4 메인 허브: 잼 노출=검색창 아래 배너→잼 태그 검색 라우팅, 페이지네이션 도입
- W3-5 WebGL: deferred 유지, 조사 항목 7개·권한·QG-3 조사 단계로
합의 중 새 결합 3건 발굴: W3-1↔W3-2 양방향 / W3-4→W3-1 잼태그 라우팅 / W3-3 외부 fetch 인프라.
착수순서 W3-2→W3-1→W3-4→W3-3→W3-5 확정. 미결질문은 해소 않고 합의 목록으로 유지.
세션 산출 동봉(20260617-172407 초안 생성 + 20260617-174635 합의).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 09:57:37 +09:00
이정수
2eb0be5654
docs: 고도화 로드맵 목적축 재구조 (게임잼 단일프레임 → W1~W4 워크스트림)
...
20260617-150635 로드맵(S1~S7, 의존성축)을 목적축("왜 존재/누구를 위한가")으로
재검토. 모든 항목이 단일 "게임잼" 프레임에 묶여 있던 것을 4개 목적 워크스트림으로 분해:
- W1 거버넌스/RBAC — 사이트 거버넌스, 게임잼은 소비자, 독립
- W2 게임잼 — 본체(엔티티+심사위원역할+잼평가설계+심사/투표/시상)
- W3 사이트 플랫폼 — 태그검색·댓글리뷰·포스팅·메인허브·Unity, 전부 잼일정 독립
- W4 유저 배지/평판 — 신규 발굴(리뷰어/기술자가 RBAC 플래그로 오분류됐던 것)
150635 대비 핵심 교정 5건 + S→W 매핑표 + 의존성 그래프(빌드순서) 유지.
번들(이전 잔여 정리): 오늘 work-session durable history
(094450/143315/150635/162536), serena 설정·메모리, 분석문서 교차링크.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 17:20:53 +09:00
이정수
14f41c6531
feat: 로컬 개발환경 셋업 (Docker + 호스트 직접) 검증 + 온보딩 문서
...
두 경로를 실제 실행으로 검증하고 온보딩 문서를 추가한다.
- docs/usage/local-setup.md: 7섹션 온보딩 (Path A Docker / Path B 호스트,
DB 스키마 초기화, 검증 체크리스트, 트러블슈팅, 미해결). usage/index 링크.
- db/schema.sql: 6테이블 init DDL 복원. recruit_posts 는 권위 DDL,
나머지 5테이블은 매퍼+POJO 역추출 비권위본(타입 추론, 헤더에 명시).
- docker-compose.yml + Dockerfile: postgres:16 + JDK21 멀티스테이지 빌드.
비밀값은 .env(gitignore)/환경변수 주입, 이미지·git 비포함.
회사 TLS 인터셉션 프록시 대응으로 certs/*.crt 를 빌드 truststore 에 주입.
starter-parent 미사용 pom 이라 spring-boot:repackage 명시(-P dev 필수).
- .env.example / .dockerignore / certs/README.md 추가, .gitignore 에 .env·certs CA 제외.
- mvnw 실행권한 부여.
검증: Path A 홈 200 + DB 라운드트립, Path B mvnw test 6/0/0 + spring-boot:run 200.
AC 5/5 PASS. src/·pom.xml 무수정.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 11:55:30 +09:00
이정수
8c41b228c9
Merge PR #1 (docs/project-analysis): ATP 문서 체계 + 프로젝트 종합 분석
...
origin/main 의 사고 커밋(f6f691c )이 csrf 보안 수정과 PR 문서의 부분 스냅샷을
한 커밋에 섞어 PR 이 mergeable:false 가 된 상태를 해소.
충돌 해결:
- csrf 보안 수정(UserController/login/signup/테스트 2건)은 main 버전 유지
- 충돌 문서(project-analysis.md, docs/index.md, .serena/project.yml)는 PR 정식본 채택
- CLAUDE.md 는 main 프로젝트 지침 + PR ATP 블록 결합
- docs/security/security-remediation-checklist.md(고유 내용) 유지
- 사고 커밋이 남긴 README.md 5건 제거 (PR 의 index.md 컨벤션으로 통일)
- .atp/work-session 파일/디렉토리 타입 충돌 → PR 디렉토리 채택
병합 결과 src/ 트리는 origin/main 과 바이트 동일 (코드 변경 0, csrf 보존).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 10:00:39 +09:00
김판돌
f6f691ca73
fix: harden auth csrf handling
2026-06-16 15:38:44 +09:00
이정수
d297f31f72
chore: Serena onboarding 메모리 + graphify 지식그래프(src·docs) 생성
...
- .serena/memories/: 프로젝트 onboarding 메모리 6종(core/tech_stack/
suggested_commands/conventions/task_completion/graphify_workflow)
- docs/graph/: graphify src(384N/613E/23C)·docs(44N/56E/7C) 스코프 생성,
index.md 메타·Scopes 표 갱신 (graph 본체 html/json/audit 는 gitignore)
- .atp/work-session/20260616-123205/: ATP 세션 보고서
Serena Java LSP 가 사내 SSL 검사 프록시(Cloudflare Gateway CA)로 IntelliCode
다운로드에 실패하던 것을 CA 번들(certifi+System keychain) MCP env 지정으로
해결한 뒤 진행.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 14:13:51 +09:00
이정수
33a4465e0e
docs: ATP 문서 체계 도입 및 프로젝트 종합 분석 추가
...
docs/ 카테고리 트리(adr·analysis·architecture 등)와 ATP 워크플로 문서를 신규 추가하고,
4축(아키텍처·보안·품질·도메인) read-only 종합 분석을
docs/analysis/2026-06-16-project-analysis.md 로 기록한다.
- 신규 분석 문서 + docs/analysis/index.md 링크
- 기존 docs 2건(db-update-query-generator, user-signup-schema)에 교차링크 추가
- CLAUDE.md 프로젝트 지침, .atp/work-session 분석 세션 기록, .serena 프로젝트 설정 포함
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 12:18:56 +09:00
pandoli365
40bde12c6d
페이지 개선2
2026-06-13 15:05:18 +09:00
pandoli365
d88cfbf5fb
페이지 개선
2026-06-13 15:05:12 +09:00
pandoli365
2cca6c72a6
비빕밥 팀원 모집 페이지 작업
2026-06-13 14:43:33 +09:00
pandoli365
3508a4b3bb
로그인 페이지 작업완료
2026-05-03 17:56:40 +09:00
pandoli365
23f594c3c5
Prepare public repository
2026-05-03 16:13:32 +09:00