This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
- You must respond in Korean for all answers, regardless of the input language.
- Do not write any comments in code blocks, even if asked to do so.
- Do not use wildcard when importing libraries.
- When you write reviews for pull request, specific review will be very helpful for my team.
- Suggest based on logical reasons.
- For every request, follow this order before writing any code:
- Analyze the process (νμ¬ κ΅¬μ‘°/νλ¦ νμ )
- If anything is unclear or requires a decision only the user can make, ask clarifying questions before proposing a direction
- Suggest a direction based on the analysis (and any answers received)
- Present trade-offs for each direction
- Do NOT write code unless the user explicitly asks with a direct command such as "κ°λ°ν΄μ€", "μμ±ν΄μ€", "ꡬνν΄μ€".
- When implementing from a GitHub issue with multiple feature items, process one item at a time: complete the full analyze β clarify β direction β trade-off β explicit approval cycle for a single item before moving to the next.
./gradlew clean build # μ 체 λΉλ (ν
μ€νΈ ν¬ν¨)
./gradlew test # ν
μ€νΈλ§ μ€ν
./gradlew test --tests "ssu.eatssu.domain.review.service.ReviewServiceTest" # λ¨μΌ ν
μ€νΈ ν΄λμ€ μ€ν
./gradlew bootRun --args='--spring.profiles.active=local' # λ‘컬 μλ² μ€ν (port 9000)
docker build -f Dockerfile -t eatssu-local . # Docker μ΄λ―Έμ§ λΉλ (λ°λμ ./gradlew build -x test μ ν νμ)λ‘컬 μ€ν μ MySQLμ΄ localhost:3306/eatssuμ νμνλ©°, application-local.ymlμμ DB μ 보λ₯Ό μ€μ νλ€. .env νμΌλ‘ νκ²½λ³μλ₯Ό μ€λ²λΌμ΄λν μ μλ€ (spring.config.import: optional:file:.env[.properties]).
QueryDSL Qν΄λμ€λ src/main/generatedμ μμ±λλ€. ./gradlew cleanμΌλ‘ μ κ±°λλ€.
src/main/java/ssu/eatssu/
βββ domain/ # λλ©μΈλ³ ν¨ν€μ§ (auth, menu, review, user, admin, ...)
β βββ <domain>/
β βββ entity/ # JPA μν°ν°
β βββ dto/ # Request/Response DTO
β βββ presentation/ # Controller (μΌλΆ λλ©μΈμ controller/)
β βββ service/ # λΉμ¦λμ€ λ‘μ§
β βββ persistence/ # Repository (μΌλΆ λλ©μΈμ repository/)
β βββ ...
βββ global/ # κ³΅ν΅ μΈνλΌ
βββ config/ # Spring μ€μ (Security, QueryDSL, S3, Async λ±)
βββ handler/ # μ μ μμΈ μ²λ¦¬, μλ΅ λνΌ
βββ log/ # AOP λ‘κΉ
, MDC νν°
βββ i18n/ # λ€κ΅μ΄ μ§μ μΈν°νμ΄μ€
βββ util/ # S3 μ
λ‘λ λ± μ νΈλ¦¬ν°
- auth: Kakao/Apple OAuth λ‘κ·ΈμΈ, JWT ν ν° λ°κΈ/κ²μ¦ (
JwtTokenProvider),CustomUserDetails - menu:
Menu(κ³ μ λ©λ΄,MenuType.FIXED)μMeal(λ μ§λ³ λ³λ μλ¨,MenuType.VARIABLE)μ΄MealMenuλ₯Ό ν΅ν΄ λ€λλ€ μ°κ²° - review:
MenuλλMealμ λν 리뷰. V1/V2 ControllerΒ·Serviceκ° κ³΅μ‘΄νλ©°, V2κ° μ΅μ - rating:
Ratingsμλ² λλ κ°μ²΄λ‘ λ³μ μ§κ³ κ΄λ¦¬ - user: User μν°ν°, νκ³Ό/λ¨κ³Όλν μ 보(
departmentνμ ν¨ν€μ§), λ€κ΅μ΄ μ€μ (Languageenum: KO/EN/JA/VI) - partnership: μ ν΄ μλΉ μ 보 λ° μ’μμ
- admin: Mustache ν νλ¦Ώ κΈ°λ° μ΄λλ―Ό UI. μλ¨/λ©λ΄/μΉ΄ν κ³ λ¦¬/λ¬Έμ/리ν¬νΈ/리뷰 κ΄λ¦¬
- slice: 컀μ κΈ°λ° νμ΄μ§λ€μ΄μ
(
SliceResponse<T>) - slack: μλ² μλ¬ λ°μ μ Slack μλ¦Ό (
SlackErrorNotifier)
μλ΅ λνΌ: λͺ¨λ API μλ΅μ BaseResponse<T>λ‘ κ°μΌλ€. μλ¬λ BaseException(BaseResponseStatus) throw β GlobalExceptionHandlerμμ μ²λ¦¬.
μλ¬ μ½λ: BaseResponseStatus enumμ HTTP μν + 컀μ€ν
μ½λ + λ©μμ§λ₯Ό ν¨κ» μ μνλ€.
λ€κ΅μ΄(i18n): Localizable μΈν°νμ΄μ€μ getLocalizedValue(language, ko, en, ja, vi)λ₯Ό ꡬννμ¬ μΈμ΄λ³ νλλ₯Ό λ°ννλ€.
μΌλΆ Controller/Serviceλ V1/V2λ‘ λ²μ μ΄ λΆλ¦¬λμ΄ μλ€(μ: ReviewController/ReviewControllerV2, ReviewService/ReviewServiceV2). μ κΈ°λ₯μ V2 μ΄μμ μΆκ°νκ±°λ, νμ μ μ λ²μ μ μμ±νλ€.
GitHub Actions(deploy.yml)λ‘ Docker μ΄λ―Έμ§λ₯Ό λΉλνμ¬ EC2μ SSH λ°°ν¬νλ€. prod/dev λΈλμΉμ λ°λΌ λ°°ν¬ νκ²½μ΄ λΆκΈ°λλ€.
μ»€λ° λ©μμ§λ feat:, fix:, refactor:, style: λ±μ prefixλ₯Ό μ¬μ©νλ€.
.github/PULL_REQUEST_TEMPLATE.mdλ₯Ό λ°λ₯Έλ€: resolved #μ΄μλ²νΈ, λ³κ²½ μ¬ν μμ½, λ¦¬λ·°μ΄ κ³΅μ μ¬ν μμ±.