bibimbap/docs/development/local-dev-setup.md

3.3 KiB

Local Dev Setup — 로컬 개발 환경 설정

로컬에서 앱을 구동할 때 필요한 환경/경로 설정을 둔다.

업로드 저장 루트 (static 트리 밖)

업로드물(프로필 이미지·게임 WebGL asset)은 웹서버 정적 서빙 트리(src/main/resources/static/) 밖에 저장한다. 직접 서빙을 차단하고 컨트롤러 권한 게이트를 강제하기 위함이다(보안 하드닝, commit 9041bb7).

경로 규약

설정 키 비고
app.upload.game-storage-path ${user.home}/.bibimbap/uploads application.properties 에 명시. ${user.home} 는 Spring 런타임 placeholder
  • 프로필 이미지: ~/.bibimbap/uploads/profile/{userId}/*.{png,jpg}UploadResourceConfig/profile/** ResourceHandler 가 이 위치를 서빙.
  • 게임 WebGL asset: ~/.bibimbap/uploads/game/{gameUuid}/**GameAssetController @GetMapping("/game/{gameUuid}/**") 컨트롤러가 경계 검증 후 서빙(정적 핸들러 아님).

디렉토리 생성

런타임에 Files.createDirectories 로 자동 생성된다(GameUploadController·UserController). 첫 업로드 시 ~/.bibimbap/uploads/{game,profile} 가 만들어지므로 수동 생성 불필요.

@Value 기본값 주의

5개 클래스(UploadResourceConfig·GameUploadController·GameAssetController·UserController·GameAssetCleanupService)의 @Value("${app.upload.game-storage-path:src/main/resources/static}") 기본값(fallback)은 src/main/resources/static 으로 유지한다. 이유:

  • application.properties 의 명시 설정이 항상 오버라이드하므로 실제 동작 경로는 ~/.bibimbap/uploads.
  • 기본값을 홈 경로로 바꾸면 IDE/CI 가 명시 설정 없이 홈 디렉토리에 파일을 생성하는 부작용이 생긴다.
  • 업로드 테스트(GameUploadControllerSecurityTest)는 @TempDir + ReflectionTestUtils.setField 로 경로를 격리하므로 기본값과 무관.

자산 이전 이력

저장 루트가 static 트리 밖으로 이전되면서, 이전부터 static/profile/ 에 커밋돼 있던 자산은 자동 이동되지 않는다. 신규 루트로 수동 이전이 필요하다.

일자 이전 대상 조치
2026-06-29 src/main/resources/static/profile/8/* (user 8 프로필 2파일) ~/.bibimbap/uploads/profile/8/ 로 이동(체크섬 대조 검증) + tracked 원본 git rm. 이후 user 8 프로필은 신규 루트에서 서빙됨.

static/game/ 은 이전 시점 비어 있어(커밋된 게임 자산 0) 이전 대상 없음.

향후 저장 루트를 다시 옮기거나 자산을 마이그레이션할 때 이 표에 한 줄씩 기록한다.

SSRF DNS 캐시 (운영 참고)

SsrfSafeFetcher@PostConstructnetworkaddress.cache.ttl=30 을 best-effort 설정한다(DNS rebinding TOCTOU 완화). 런타임 반영은 InetAddressCachePolicy lazy init 경합에 의존하므로 결정적 보장이 필요하면 JVM 레벨($JAVA_HOME/conf/security/java.securitynetworkaddress.cache.ttl=30)이 정본이다. 앱 기동 후 java.security.Security.getProperty("networkaddress.cache.ttl") 로 반영 여부를 확인할 수 있다(배포 후 체크리스트 참조: ../maintenance/post-deploy-verification-checklist.md).