# Core — bibimbap

게임 쇼케이스 + 팀원 모집 웹앱 (org: com.pandoli365). 서버사이드 JSP 렌더 + JSON API 혼합. Spring Boot WAR + MyBatis + PostgreSQL.

## Source map (`src/main/java/com/pandoli365/bibimbap/`)
- `BibimbapApplication` / `ServletInitializer` — 부트 진입 + 외부 서블릿 컨테이너 배포용 initializer (packaging=war).
- `controller/` — `@Controller`. 페이지 컨트롤러(`RecruitController`, `WebMvcController`)는 JSP view-name 반환. `controller/api/` (`GameController`·`GameAssetController`·`GameUploadController`·`UserController` + `ApiExceptionControllerAdvice`)는 JSON/mutation 처리.
- `mapper/` — MyBatis `@Mapper` 인터페이스, 어노테이션 인라인 SQL. 상세 `mem:conventions`.
- `data/` — DB row/DTO POJO (`GameData`,`UserData`,`RecruitPostData`,`GameComment/LikeData`,`UserAuthIdentityData`). 수기 getter/setter (Lombok 미사용).
- `abstracts/` — 제네릭 베이스 `Request`/`Result`/`Service<Req,Res>`/`ErrorResult`.
- `game/GameCatalog` — DB 이전 레거시 게임 카탈로그(정적 배열 NAMES/CREATORS/...). DB 미존재 game id fallback.
- `security/CsrfTokens` — 수동 CSRF 토큰 util (Spring Security 없음).
- `config/UploadResourceConfig` — 업로드 WebGL/프로필 정적 리소스 핸들러.
- `webapp/WEB-INF/views/*.jsp` (+ `fragments/header.jspf`) — 뷰. ViewResolver prefix `/WEB-INF/views/`, suffix `.jsp`.
- `resources/{dev,live}/db.properties` — 프로필별 DB 자격증명 (gitignore; `.example` 만 커밋).

## 프로젝트 전역 불변식
- **Soft delete**: 조회는 `is_delete IS NOT TRUE` 필터, 삭제는 `is_delete=true, updated_at=now()`. `game_likes` 는 hard delete.
- **인증** = `HttpSession` attr `userId` (Spring Security 없음). mutation 엔드포인트는 첫 줄에 `CsrfTokens.isValid(request)` 체크 → 실패 시 403.
- **소유권** = session userId vs row userId 비교.
- 사용자 노출 문자열은 한국어.

## 참조
- 언어/프레임워크/빌드: `mem:tech_stack`
- 실행 명령: `mem:suggested_commands`
- 코드 컨벤션(mapper/controller/validation): `mem:conventions`
- 작업 완료 게이트: `mem:task_completion`

추가: 광범위한 `docs/` (ATP 문서체계 + 분석) 와 `docs/graph/` (graphify 산출물 메타) 존재.

graphify 그래프 산출물 위치·재생성·`graphify-out` 캐시 정리 함정: `mem:graphify_workflow`.
