posts-empty/recruit-empty.jspf가 <%@ include file %>(정적 include)로
삽입되는데 파편에 pageEncoding 미선언 → Jasper가 기본 ISO-8859-1로
읽어 한글 mojibake. 정적 include는 파일별 인코딩이 독립 결정되므로
각 파편에 <%@ page pageEncoding="UTF-8" %> 추가. 브라우저 스모크로
빈상태 한글 정상 렌더 확인.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
리디자인 비주얼 레이어 반영. 뷰 fragment 2종(posts-empty/recruit-empty
.jspf)·공유 bibimbap.css·docs 신규 노드 + posts-list/recruit-list
include 엣지 2건 반영. last_generated_at·Scopes 표 갱신.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
errer 비주얼 이식 시 디자인서 딸려온 javax JSTL taglib
(http://java.sun.com/jsp/jstl/core) 1줄이 stray로 남아 Jakarta EE
환경에서 미해소 → /error 500(JasperException). 본문은 순수 scriptlet
분기라 JSTL 미사용 → 해당 taglib 제거. 로컬 재기동 스모크로 /error 200 확인.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
recruit-form.jsp에 .req 필수표시(4곳), summary 글자수 카운터
(.count/#sc, 독립 oninput), .preview-card sticky 외형 추가.
제출은 기존 AJAX(fetch /recruit/new)+BibimbapCsrf.headers·필드명
10종(projectName 등) 보존, render() 미리보기 IIFE 무손실.
디자인 name=title·/recruit·CSRF누락 form 미채택.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
profile.jsp에 .profile-head·.game-row·.avatar·.card 외형 클래스 적용.
모델은 기존 scriptlet(session attr·myGames getName/getThumbnailUrl) 보존,
디자인 ${user.*} EL 미채택. submitNickname/uploadAvatar AJAX +
BibimbapCsrf.headers·JS참조 id 불변. 미존재 라우트(공개토글
/games/{id}/visibility, /profile/edit)는 비노출.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
errer.jsp에 디자인 SVG 아이콘·.empty-state 외형 이식,
403/404/기타 3분기 확장. status_code scriptlet 코드읽기 방식과
isErrorPage·requestUri/message 상세 블록 보존(errorData EL 미채택).
뷰명 errer 유지.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
index.jsp에 히어로 섹션·sort-bar 칩·game-grid/game-card 외형 이식.
모델 EL은 기존 scriptlet(getName/getCreator/getThumbnailUrl) 보존,
디자인 title/author·/games/new 미채택. 정렬칩은 SearchController가
바인딩하는 sort 파라미터(latest/likes/views) 사용. 기존 head·검색폼·
include 전부 보존.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
fragments/posts-empty.jspf·recruit-empty.jspf 신설(.empty-state).
CTA href 실제 라우트로 교정(/posts/new·/recruit/new 단수).
posts-list·recruit-list 빈 분기에 include. recruit-list는 서버
초기 빈상태=파편 / 클라필터 0건=기존 #recruit-empty div 역할 분리,
필터 JS 무수정.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
리디자인 산출물 css를 src/main/webapp/css/bibimbap.css로 신설.
폰트는 system fallback 보강(외부 CDN 0, Pretendard 로컬 우선).
다크 오버라이드 블록 추가 — header.jsp data-theme=dark 토큰 차용해
body 컴포넌트와 header/footer 다크모드 정합.
theme-init.jsp(23개 페이지 공통 include)에 link 1줄 추가.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
외부 디자인 툴 산출물(리디자인 zip: 7 JSP + bibimbap.css + 3 jspf + error.jsp)을
전수 검토하고 우리 실제 코드와 design↔reality 매핑을 확정. 코드 변경 없음(검토 세션).
핵심: 산출물은 라우트(/games 복수 vs 실제 /game 단수), 폼 제출(classic POST vs
JSON API+AJAX), CSRF(전무 vs CsrfTokens/_csrf/window.BibimbapCsrf), contextPath
(${ctx} vs ${pageContext.request.contextPath}), include(common/ 가정 vs 평면),
에러(web.xml/error.jsp vs errer 뷰), css 디렉토리(없음) 가 모두 불일치 →
파일 통째 교체 금지, 공유 bibimbap.css 신설 + 비주얼 레이어 이식으로 결론.
산출물: artifacts/handoff-prompt.md (새 세션 작업 프롬프트 + 매핑표 + 하드 제약 + 순서).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0162BaZnrbiYgWc9JJMZ9Czb
- docs/changes/2026-06-30-screenshot-guide-auth.md 신규 작성
- docs/changes/index.md 링크 추가
- docs/development/screenshot-guide.md 변경 이력 섹션 추가
- .atp/work-session/20260630-141415/ 세션 보고서 포함
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0162BaZnrbiYgWc9JJMZ9Czb
- screenshot-guide.py: 로컬 Chrome 헤드리스로 7개 주요 페이지 캡처
- 출력 경로: /tmp/bibimbap-screenshots/ (Claude Design 연동용)
- index.md 링크 추가
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017mhnv7hDExHaXUmbaYAxZd
listPublishedKeyset 에 cursor=null·categoryId=null 전달 시
posts-list 뷰 정상 반환 검증.
isNull() matcher 로 null 파라미터가 매퍼에 실제 전달됨을 명시.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3FeMrbtxfTScjrwUukyHD
listPublishedKeyset SQL에서 #{categoryId}/#{cursorCreatedAt} IS NULL 조건 사용 시
PostgreSQL이 바인드 파라미터 타입을 결정하지 못해
PSQLException: could not determine data type of parameter $1 → 500 발생.
파라미터에 ::bigint / ::timestamptz 명시 캐스트 추가로 수정.
update() SQL에서 category_id = #{categoryId} 컬럼 누락 — 카테고리 변경이
DB에 반영되지 않는 데이터 정합성 버그 함께 수정.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3FeMrbtxfTScjrwUukyHD
src↔docs 교차 엣지 단절 문제로 분리 scope 폐기.
merge-graphs로 2038노드/4685엣지 full 그래프 생성.
규모 비대화 시 재검토 노트 work-session에 기록.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3FeMrbtxfTScjrwUukyHD
- abstracts/(4파일)·GameCatalog·fragments/header.jspf 삭제(외부참조 0 확인)
- GameController.gameDetail(): GameCatalog fallback(redirect/정적뷰) 제거 →
DB 미존재 게임 ID = HTTP 404(ResponseStatusException)
- ApiExceptionControllerAdvice: ResponseStatusException 핸들러 추가(404 status
보존 — 기존 Exception 핸들러가 500으로 가리던 것 수정)
- 회귀 가드 gameDetailThrowsNotFoundWhenGameMissing 추가
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3FeMrbtxfTScjrwUukyHD
GameController 가 GameLikesMapper 를 주입받으나(B3 좋아요 영속화) 테스트
컨텍스트 @MockBean 목록에 누락돼 contextLoads 가 NoSuchBeanDefinitionException
으로 실패하던 사전결함 수정.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3FeMrbtxfTScjrwUukyHD
중복 0 점검 후 ALTER TABLE ADD CONSTRAINT uq_game_likes_game_user UNIQUE(game_id,user_key)
를 dev DB(bibimbap-db/schema dev)에 적용, pg_constraint 검증. B3 체크리스트 [~]→[x].
별도 prod DB 는 배포 시 동일 마이그레이션 적용 필요.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3FeMrbtxfTScjrwUukyHD