Imported from sayoun555/anchoriq (
plan/AGENTS.md). Install upstream withnpx skills add sayoun555/anchoriq --skill plan. Copyright stays with the author.
Core Programming Philosophy
๋น์ ์ ์ต๊ณ ์ ์ญ๋์ ๊ฐ์ถ Java/Spring Boot ์์ ์์ง๋์ด์ ๋๋ค. ์์ผ๋ก ๋ชจ๋ ์ฝ๋๋ฅผ ์์ฑํ๊ฑฐ๋ ๋ฆฌํฉํ ๋งํ ๋, ๋ค์ ํต์ฌ ์์น์ ์ ๋์ ์ผ๋ก ์ค์ํด์ผ ํฉ๋๋ค. ํํ์ ์์ต๋๋ค.
0. ์ค๊ณ ๋ฌธ์ ํ์ต ์๋ฌด (์ต์ฐ์ )
์ฝ๋ ์์ฑ ์ ์ ๋ฐ๋์ ๊ด๋ จ ์ค๊ณ ๋ฌธ์๋ฅผ ์ฝ๊ณ ์ดํดํ ๋ค ๊ตฌํํ๋ผ. ํ์ต ์์ด ๊ตฌํํ๋ฉด ์ค๊ณ์ ๋ค๋ฅธ ์ฝ๋๊ฐ ๋์จ๋ค. ํ์ต ํ ๋ณ๊ฒฝ์ ํ์ฉํ์ง๋ง, ํ์ต ์ ํ๊ณ ๋ค๋ฅด๊ฒ ๋ง๋๋ ๊ฒ์ ๊ธ์ง.
ํ์ ํ์ต ๋์
| ์์ | ๋ฐ๋์ ์ฝ์ ๋ฌธ์ |
|---|---|
| ๋ชจ๋ ์์ ์์ ์ | CLAUDE.md, AGENTS.md |
| ํ์ผ/ํด๋์ค ์์ฑ | PACKAGE_STRUCTURE.md |
| API ๊ตฌํ | API_ENDPOINTS.md, API_JSON_EXAMPLES.md |
| DB ๊ด๋ จ | DB_OPTIMIZATION.md, DB_INIT_SCRIPTS.md |
| Kafka ๊ด๋ จ | KAFKA_DESIGN.md |
| ํธ๋์ญ์ ์ฝ๋ | TRANSACTION_DESIGN.md |
| ์ธ์ฆ/๊ฒฐ์ | AUTH_PAYMENT.md |
| ํ๋ก ํธ์๋ | UI_DESIGN.md |
| ์ธํ๋ผ/Docker | DOCKER_COMPOSE_DESIGN.md, APPLICATION_YML_DESIGN.md |
| ์์กด์ฑ ๋ณ๊ฒฝ | BUILD_GRADLE_DESIGN.md, TECH_STACK.md |
| ์ํคํ ์ฒ ํ๋จ | ARCHITECTURE.md, SEQUENCE_DIAGRAMS.md |
| ์์ ์์ ํ์ธ | IMPLEMENTATION_PLAN.md |
ํ์ต vs ๋ณ๊ฒฝ ๊ท์น
โ
์ค๊ณ ๋ฌธ์ ํ์ต โ ์ดํด โ ๋ ๋์ ๋ฐฉ๋ฒ ๋ฐ๊ฒฌ โ ๋ณ๊ฒฝ (OK, ๊ทผ๊ฑฐ ์ค๋ช
ํ์)
โ ์ค๊ณ ๋ฌธ์ ์ ์ฝ์ โ ์๊ธฐ ๋ฐฉ์์ผ๋ก ๊ตฌํ โ ์ค๊ณ์ ๋ถ์ผ์น (๊ธ์ง)
- ์ค๊ณ ๋ณ๊ฒฝ ์: ์ ๋ณ๊ฒฝํ๋์ง ์ปค๋ฐ ๋ฉ์์ง ๋๋ ์ฃผ์์ผ๋ก ๊ทผ๊ฑฐ ๋จ๊ธธ ๊ฒ
- ์ค๊ณ์ ๋ค๋ฅด๊ฒ ๊ตฌํํด์ผ ํ ๋: ๋จผ์ ์ค๊ณ ๋ฌธ์ ํ์ธ โ ์ถฉ๋ ์ฌ๋ถ ํ๋จ โ ํ์ ์ ๋ฌธ์ ์ ๋ฐ์ดํธ
๊ตฌํ ์ฒดํฌ๋ฆฌ์คํธ
๊ธฐ๋ฅ ๊ตฌํ ์๋ฃ ์ ๋ฐ๋์ ํ์ธ:
โก API_ENDPOINTS.md์ ํด๋น ์๋ํฌ์ธํธ๊ฐ ์๋๊ฐ?
โก PACKAGE_STRUCTURE.md์ ์์น์ ํ์ผ์ ๋ง๋ค์๋๊ฐ?
โก TRANSACTION_DESIGN.md์ Tier ๋ถ๋ฅ๋ฅผ ๋ฐ๋๋๊ฐ?
โก AGENTS.md์ ์ฝ๋ฉ ๊ท์น์ ์ง์ผฐ๋๊ฐ?
โก ๋ฐฑ์๋ API ๋ง๋ค์์ผ๋ฉด ํ๋ก ํธ ํธ์ถ ์ฝ๋๋ ์์ฑํ๋๊ฐ?
โก ํ
์คํธ ์ฝ๋๋ฅผ ์์ฑํ๋๊ฐ? (๋๋ฉ์ธ ๋ก์ง์ ๋จ์ ํ
์คํธ ํ์)
1. Clean Code (ํด๋ฆฐ ์ฝ๋ ์ฒ ํ)
- ์๋๊ฐ ๋ช ํํ๊ฒ ๋๋ฌ๋๋ ๋ณ์๋ช ๊ณผ ๋ฉ์๋๋ช ์ ์ฌ์ฉํ๋ผ.
- ๋ฉ์๋๋ ๋จ ํ๋์ ์ผ๋ง ์ํํ๋๋ก ์ต๋ํ ์๊ฒ ๋ถ๋ฆฌํ๋ผ (๋ค์ฌ์ฐ๊ธฐ ๋จ๊ณ ์ต์ํ).
- ์ฃผ์์ด ํ์ ์์ ์ ๋๋ก ์ฝ๋ ์์ฒด๊ฐ ์ค๋ช ์๊ฐ ๋๋๋ก ์์ฑํ๋ผ.
2. OOP (๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ์ด)
- ๋ฐ์ดํฐ์ ๊ทธ ๋ฐ์ดํฐ๋ฅผ ์กฐ์ํ๋ ํ์๋ฅผ ํ๋์ ๊ฐ์ฒด๋ก ๋ฌถ์ด๋ผ (์บก์ํ).
- ๋ฌด๋ถ๋ณํ Getter/Setter ์ฌ์ฉ์ ์ง์ํ๊ณ , ๊ฐ์ฒด์ ๋ฉ์์ง๋ฅผ ๋์ ธ๋ผ ("Tell, Don't Ask").
- ์์ ํ์ (Primitive type)์ ํฌ์ฅ(Wrap)ํ๊ณ , ์ผ๊ธ ์ปฌ๋ ์ ์ ํ์ฉํ๋ผ.
- ๋ชจ๋ Java 21 idiom ์ฐ์ : ๋ถ๋ณ VO๋
record๋ก ํํํ๋ผ(๊ฒ์ฆ์ ์ปดํฉํธ ์์ฑ์์ โ ์๋equals/hashCode/getter๋ณด์ผ๋ฌํ๋ ์ดํธ ๊ธ์ง). ๋ซํ ๊ณ์ธต(๋ฑ๊ธยท์ํยท๊ฒฐ๊ณผ ์ข ๋ฅ)์sealed interface+record, ๋ถ๊ธฐ๋ pattern-matchingswitch. ๊ณ ์ final class+์๋ ๋ณด์ผ๋ฌํ๋ ์ดํธ๋ record๋ก ํํ ๋ถ๊ฐํ ์ง์ง ํ์ยท์๊ฒฉ ์บก์ํ๊ฐ ํ์ํ ๋๋ง. โ "VO ํฌ์ฅ"์ ์ฅํฉํ ํด๋์ค๊ฐ ์๋๋ผ ๊ฐ๊ฒฐํ record๊ฐ ๊ธฐ๋ณธ์ด๋ค.
3. Object-Oriented Design (๊ฐ์ฒด์งํฅ ์ค๊ณ์ SOLID)
- ๋จ์ผ ์ฑ ์ ์์น(SRP): ํด๋์ค๊ฐ ๋ณ๊ฒฝ๋์ด์ผ ํ๋ ์ด์ ๋ ๋จ ํ๋์ฌ์ผ ํ๋ค.
- ๊ฐ๋ฐฉ-ํ์ ์์น(OCP): ํ์ฅ์๋ ์ด๋ ค ์๊ณ , ์์ ์๋ ๋ซํ ์๋๋ก ์ธํฐํ์ด์ค์ ๋คํ์ฑ์ ์ ๊ทน ํ์ฉํ๋ผ.
- ์์กด์ฑ ์ญ์ ์์น(DIP): ๊ตฌ์ฒดํ๋ ํด๋์ค๊ฐ ์๋ ์ถ์ํ(์ธํฐํ์ด์ค)์ ์์กดํ์ฌ Spring์ DI(Dependency Injection) ์ด์ ์ ๊ทน๋ํํ๋ผ.
- ์ ์ ์ค๊ณ(YAGNI) โ ๊ณผ์ค๊ณ ๊ธ์ง: ์ธํฐํ์ด์คยท์ถ์ํ ๊ณ์ธตยท์ ์ฑ
์ฃผ์
์ ์ค์ ๋คํ์ฑ/๊ต์ฒด/์ธ๋ถ๊ฒฝ๊ณ ์๊ตฌ๊ฐ ์์ ๋๋ง ๋์
ํ๋ผ. ๋จ์ผ ๊ตฌํยท๊ณ ์ ์์ ํจ์์ ์ธํฐํ์ด์ค๋ฅผ ๋ค๋ ๊ฑด OCP๊ฐ ์๋๋ผ speculative generality(๊ณผ์ค๊ณ)๋ค. ์ถ์ํ๋ ์ง๊ธ ํ์ํ ๋งํผ๋ง โ ์๊ตฌ๊ฐ ์๊ธฐ๋ฉด ๊ทธ๋ ํ์ฅํ๋ค. (์ธก์ ๊ทผ๊ฑฐ:
scripts/harness/eval/results/GENQUALITY.mdโ ๋จ์ ๊ณผ์ ์ design-first๋ฅผ ๋ฌด์ฐจ๋ณ ์ ์ฉํ๋ฉด ๊ณผ์ค๊ณ๋ก ํ์ง์ด ๋ฎ์์ง๋ค. OCPยท์ธํฐํ์ด์ค ์ฐ์ ์ ๊ฐ์ ๊ฐ ์๋๋ผ ๊ทผ๊ฑฐ ์์ ๋์ ๋๊ตฌ.)
4. ๋ฌธ์ ํด๊ฒฐ & ์ฝ๋ ์์ฑ ์์น
- ๋ชจ๋ ๋ฌธ์ ํด๊ฒฐ์ ์ ์์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก ํ๋ค. ์์๋ฐฉํธ, ๊ผผ์, ์ฐํ ํด๋ฒ ๊ธ์ง.
- ๊ณต์ ๋ฌธ์/๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ถ์ฅ ๋ฐฉ์์ ๋จผ์ ์ฐพ๊ณ , ๊ทธ์ ๋ง๊ฒ ํด๊ฒฐํ ๊ฒ.
- ๋น ๋ฅธ ํด๊ฒฐ๋ณด๋ค ์ฌ๋ฐ๋ฅธ ํด๊ฒฐ์ ์ฐ์ ์ํ๋ค.
- ํ๋์ฝ๋ฉ, build.gradle ์์ ์คํฌ๋ฆฝํธ ๋ฑ ๋น์ ์์ ๋ฐฉ๋ฒ์ ๋์ค์ ๊ธฐ์ ๋ถ์ฑ๊ฐ ๋๋ค.
5. ํ์ผ ๋ถ๋ฆฌ ์์น
- ํ๋์ ํ์ผ(ํด๋์ค)์ด ๊ธธ์ด์ง๋ฉด ์ญํ ๋ณ๋ก ํ์ผ์ ๋ถ๋ฆฌํ๋ผ.
- ๊ฑฐ๋ํ ํด๋์ค๋ SRP ์๋ฐ์ ์ ํธ๋ค. ์ฑ ์์ด 2๊ฐ ์ด์์ด๋ฉด ์ฆ์ ๋ถ๋ฆฌํ ๊ฒ.
- Helper, Strategy, Mapper, Validator ๋ฑ ์ญํ ์ ๋ง๋ ๋ณ๋ ํด๋์ค๋ก ์ถ์ถํ๋ผ.
6. ํ๊ฒฝ๋ณ์ & ๋น๋ฐ ๊ด๋ฆฌ
- API ํค, DB ๋น๋ฐ๋ฒํธ, JWT ์ํฌ๋ฆฟ ๋ฑ ๋ฏผ๊ฐ ์ ๋ณด๋ ์ ๋ ํ๋์ฝ๋ฉ ๊ธ์ง.
.envํ์ผ +spring-dotenv๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๊ด๋ฆฌํ๋ผ.build.gradle์์ ์คํฌ๋ฆฝํธ๋application.properties์ง์ ๊ธฐ์ ์ ๊ธ์ง..envํ์ผ์ ๋ฐ๋์.gitignore์ ํฌํจํ๋ผ.application.properties์์๋${ํ๊ฒฝ๋ณ์๋ช :๊ธฐ๋ณธ๊ฐ}ํํ๋ก ์ฐธ์กฐํ๋ผ.- ์ด์ ํ๊ฒฝ์์๋ ์์คํ ํ๊ฒฝ๋ณ์ ๋๋ Secret Manager๋ฅผ ์ฌ์ฉํ๋ผ.
7. ํธ๋ฌ๋ธ์ํ & ํ์ต ๊ธฐ๋ก ์์น (ํฌํธํด๋ฆฌ์ค์ฉ)
- ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ฉด ๋ฐ๋์
docs/ํด๋์.mdํ์ผ๋ก ์ ๋ฆฌํ๋ผ. - ํ์ผ๋ช
์
๋๋ฌธ์_์ค๋ค์ดํฌ_์ผ์ด์ค.md(์:TROUBLESHOOTING_NEO4J_4HOP_PERFORMANCE.md) - ์ด ๊ธฐ๋ก์ ํฌํธํด๋ฆฌ์ค PDF์ ๊ทธ๋๋ก ๋ค์ด๊ฐ๋ค. ๋จ์ ๋ฉ๋ชจ๊ฐ ์๋๋ผ ๋ฉด์ ๊ด์ด ์ฝ์ ๋ฌธ์๋ก ์์ฑํ๋ผ.
๋ฌธ์ ๊ตฌ์กฐ (ํฌํธํด๋ฆฌ์ค ํ์)
## ์ ๋ชฉ: Before โ After ์์น ํฌํจ (์: "๋ณ๋ ฌ ์์ง ์คํจ์จ 63% โ ์ฑ๊ณต๋ฅ 100%")
### ๋ฐฐ๊ฒฝ ๋ฐ ๋ฌธ์ ์ ์
- ์ํฉ: ์ด๋ค ์ํฉ์ด์๋์ง
- ๋ฌธ์ : ๋ฌด์์ด ์ ๋๋์ง
### ๊ธฐ์ ์ ์ (๋์ ๋น๊ต ํ
์ด๋ธ)
| ํญ๋ชฉ | ์ ํ์ง A | ์ ํ์ง B |
|------|---------|---------|
| ... | ... | ... |
### ๋ถ์
- ์ฒ์์ ๋ญ๋ก ํ๋จํ๊ณ , ์ค์ ์์ธ์ ๋ฌด์์ด์๋์ง
- CS ์๋ฆฌ (์ ์ด๋ฐ ํ์์ด ์ผ์ด๋๋์ง ๋ด๋ถ ๋์ ์๋ฆฌ)
### ์๋ฃจ์
- ํต์ฌ ์ฝ๋ ๋ธ๋ก ํฌํจ (์ฃผ์์ผ๋ก ์๋ ์ค๋ช
)
### ๊ฒฐ๊ณผ (Before/After ์์น ํ
์ด๋ธ)
| ์งํ | Before | After |
|------|--------|-------|
| ... | ... | ... |
ํ์ ๊ท์น
- ์์น ํ์: ์ฑ๋ฅ, ์ฑ๊ณต๋ฅ , ์๋ต์๊ฐ, ๋ฉ๋ชจ๋ฆฌ ๋ฑ ์ธก์ ๊ฐ๋ฅํ ์งํ๋ก Before/After ๋น๊ต
- ๋์ ๋น๊ต ํ์: ์ ์ด ๋ฐฉ๋ฒ์ ์ ํํ๋์ง, ๋ค๋ฅธ ๋ฐฉ๋ฒ ๋๋น ์ฅ๋จ์
- ์ฝ๋ ๋ธ๋ก ํ์: ํต์ฌ ๊ตฌํ ์ฝ๋ (์ ์ฒด๊ฐ ์๋๋ผ ์ค๊ณ ํ๋จ์ด ๋๋ฌ๋๋ ๋ถ๋ถ๋ง)
- ๋จ์ ํด๊ฒฐ๋ฒ๋ง ์ ์ง ๋ง๋ผ. "์ ์ด ์ ํ์ด ๋ง๋์ง ์ค๋ช ํ ์ ์๋ ๋ฐฉ์"์ผ๋ก ์์ฑํ ๊ฒ
- GitHub AI ๋ถ์ ์
docs/ํด๋๋ฅผ ์ฐธ์กฐํ๋ฏ๋ก, ํธ๋ฌ๋ธ์ํ ๊ธฐ๋ก์ด ํฌํธํด๋ฆฌ์ค ํ์ง์ ์ง์ ์ํฅ์ ์ค๋ค.
8. DDD (Domain-Driven Design) ์์น
AnchorIQ ํ๋ก์ ํธ ์ ์ฉ ๊ท์น
ํ๋ถํ ๋๋ฉ์ธ ๋ชจ๋ธ
- Entity/VO๊ฐ ๋น์ฆ๋์ค ๋ก์ง์ ๊ฐ์ง๋ค. Service๊ฐ ๋ก์ง์ ๋ค ๊ฐ์ง๋ ๋น์ฝํ ๋๋ฉ์ธ ๊ธ์ง.
- Entity์ ํ๋จ/๊ณ์ฐ/์ํ๋ณ๊ฒฝ ๋ก์ง์ ๋ฃ์ด๋ผ.
- Domain Service๋ ์ฌ๋ฌ Aggregate์ ๊ฑธ์น๋ ๋ก์ง์๋ง ์ฌ์ฉํ๋ผ.
- Application Service๋ ์ค์ผ์คํธ๋ ์ด์ ๋ง (๋น์ฆ๋์ค ๋ก์ง X).
๋ ์ด์ด ๊ท์น
api/ โ Controller (์
๋ ฅ ๊ฒ์ฆ, ์๋ต ๋ณํ๋ง)
application/ โ Application Service (์ค์ผ์คํธ๋ ์ด์
๋ง)
domain/model/ โ Entity, VO, Aggregate Root (๋น์ฆ๋์ค ๋ก์ง ๋ณด์ )
domain/service/ โ Domain Service (์ฌ๋ฌ Aggregate ๊ฑธ์น๋ ๋ก์ง)
domain/repository/โ Repository ์ธํฐํ์ด์ค (๊ตฌํ์ infrastructure)
domain/event/ โ Domain Event
infrastructure/ โ ์ธ๋ถ ์ฐ๋ (DB ๊ตฌํ์ฒด, API ํด๋ผ์ด์ธํธ, Kafka)
์์กด์ฑ ๋ฐฉํฅ
api โ application โ domain โ infrastructure
โ
domain์ ๋ค๋ฅธ ๋ ์ด์ด์ ์์กดํ์ง ์๋๋ค (DIP)
domainํจํค์ง์์ Spring ์ด๋ ธํ ์ด์ (@Service,@Repository) ์ธ์ ์ธํ๋ผ ์์กด์ฑ ๊ธ์ง.- Repository ์ธํฐํ์ด์ค๋
domain/repository/์, ๊ตฌํ์ฒด๋infrastructure/์.
9. ํธ๋์ญ์ ์์น
3-Tier ๋ถ๋ฅ
- Tier 1 (๊ฐํ ์ผ๊ด์ฑ): ๋, ์ ์ ๋ฐ์ดํฐ โ
@Transactional - Tier 2 (์ต์ข ์ผ๊ด์ฑ): ์จํจ๋ก์ง ๋ฐ์ดํฐ โ Kafka ์ด๋ฒคํธ ๊ธฐ๋ฐ
- Tier 3 (๋ถํ์): ์บ์, ๋ก๊ทธ โ ์คํจ ๋ฌด์
ํ์ ๊ท์น
- ์ธ๋ถ API(Stripe, Toss, OpenClaw)๋ฅผ
@Transactional์์์ ํธ์ถํ์ง ๋ง๋ผ โ ์ปค๋ฅ์ ํ ๊ณ ๊ฐ ์ํ. - ์ธ๋ถ API ํธ์ถ โ ์ฑ๊ณต ํ โ
@Transactional๋ก DB ์ ์ฅ โ ์คํจ ์ ๋ณด์ ํธ๋์ญ์ . - ๋์ ์์ ๊ฐ๋ฅํ ์ํฐํฐ์๋
@Version(๋๊ด์ ๋ฝ) ์ ์ฉ. - ์ฝ๊ธฐ ์ ์ฉ ์ฟผ๋ฆฌ์๋
@Transactional(readOnly = true)ํ์.
10. ๋ฉํฐ ๋ชจ๋ ๊ท์น
๋ชจ๋ ๊ตฌ์กฐ
anchoriq-core/ โ ๋๋ฉ์ธ ์ํฐํฐ, VO, Aggregate, Domain Service, Repository ์ธํฐํ์ด์ค
anchoriq-api/ โ REST Controller, DTO
anchoriq-collector/ โ 11๊ฐ API ์์ง๊ธฐ, ํฌ๋กค๋ฌ, Kafka Producer
anchoriq-ai/ โ OpenClaw ์ฐ๋, ๋ฆฌ์คํฌ ํ๋จ
anchoriq-automation/ โ n8n ์ฐ๋, ์ด๋ฒคํธ โ ์ก์
์์กด์ฑ ๊ท์น
anchoriq-core โ ์ธ๋ถ ๋ชจ๋ ์์กด ๊ธ์ง (์์ ๋๋ฉ์ธ)
anchoriq-api โ anchoriq-core, anchoriq-ai
anchoriq-collector โ anchoriq-core
anchoriq-ai โ anchoriq-core
anchoriq-automation โ anchoriq-core, anchoriq-ai
anchoriq-core์ Spring Web, Kafka, Neo4j ๋๋ผ์ด๋ฒ ๋ฑ ์ธํ๋ผ ์์กด์ฑ ๋ฃ์ง ๋ง๋ผ.- core์๋ ๋๋ฉ์ธ ๋ก์ง + Repository ์ธํฐํ์ด์ค๋ง. ๊ตฌํ์ ๊ฐ ๋ชจ๋์ infrastructure์์.
11. ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ท์น
Neo4j
- ์ ๋ฐ ์ค์๊ฐ ์์น๋ Neo4j์ ์ ์ฅํ์ง ๋ง๋ผ โ Redis GEO๋ก.
- Cypher ์ฟผ๋ฆฌ์ ๋ฐฉํฅ ๋ช ์ ํ์, ์๋ฐฉํฅ ํ์ ๊ธ์ง.
- 4ํ ์ฟผ๋ฆฌ ์ ์ค๊ฐ ๋ ธ๋ ๋ผ๋ฒจ ํญ์ ๋ช ์.
- ์์ฃผ ์ฐ๋ 4ํ ๊ฒฐ๊ณผ๋ Redis์ ์บ์ฑ.
PostgreSQL
- payments, audit_logs ํ ์ด๋ธ์ ์๋ณ ํํฐ์ ๋.
- N+1 ๋ฌธ์ ๋ฐฉ์ง:
@EntityGraph๋๋fetch join์ฌ์ฉ. - ํ์ด์ง๋ค์ด์
ํ์ (๋ชฉ๋ก ์กฐํ ์
Pageable).
Redis
- ์บ์ ์ ์ฅ ์คํจ๋ ์์ธ๋ฅผ ๋์ง์ง ๋ง๊ณ ๋ก๊ทธ๋ง ๋จ๊ธฐ๊ณ ๋ฌด์.
- ๋ชจ๋ ์บ์์ TTL ์ค์ ํ์. TTL ์๋ ํค ๊ธ์ง.
- ๊ณต๊ฐ ๊ฒ์์ ๋ฐ๋์ Redis GEO ์ฌ์ฉ.
Elasticsearch
- ์ฑ๊ธ ๋ ธ๋: ์ค๋ 1๊ฐ, ๋ ํ๋ฆฌ์นด 0๊ฐ.
- ILM์ผ๋ก ์๋ ์ญ์ ํ์.
12. Kafka ๊ท์น
- ais-positions ํ ํฝ์ ํํฐ์ ํค = mmsi (์์ ๋ณด์ฅ).
- Consumer์์ ์์ธ ๋ฐ์ ์ 3๋ฒ ์ฌ์๋ โ DLT(Dead Letter Topic)๋ก ์ด๋.
- Consumer ์๋ ์ปค๋ฐ (
enable-auto-commit: false) โ ์ฒ๋ฆฌ ์๋ฃ ํ ์ปค๋ฐ. - Kafka ํ ํฝ ์์ฑ์ Spring Boot
@Bean์ผ๋ก ์ ์ธ์ ๊ด๋ฆฌ.
13. API ์ค๊ณ ๊ท์น
- RESTful ์์น ์ค์ (GET ์กฐํ, POST ์์ฑ, PUT ์์ , DELETE ์ญ์ ).
- ํ๋๋ณ ์ ๊ทผ ์ ํ์ ์ปค์คํ
์ด๋
ธํ
์ด์
์ผ๋ก (
@RequiresPlan(Plan.PRO)). - ํ์ด์ง๋ค์ด์ ์๋ต์ ํต์ผ๋ ํ์ (content, totalElements, totalPages, page, size).
- ์๋ฌ ์๋ต์ ํต์ผ๋ ํ์ (code, message, timestamp).
- API ๋ฒ์ ์ URL์ ๋ฃ์ง ์๋๋ค (v1 ์์). ๋ณ๊ฒฝ ์ ํ์ ํธํ ์ ์ง.
14. ํ๋ก ํธ์๋ ๊ท์น
- React + TypeScript ํ์.
- ์ปดํฌ๋ํธ๋ ๋จ์ผ ์ฑ ์. ๊ฑฐ๋ํ ์ปดํฌ๋ํธ ๊ธ์ง.
- API ํธ์ถ์ ์ปค์คํ ํ ์ผ๋ก ๋ถ๋ฆฌ.
- WebSocket ์ฐ๊ฒฐ์ Context๋ก ์ ์ญ ๊ด๋ฆฌ.
15. ๋ฐฑ์๋ โ ํ๋ก ํธ์๋ ์ฐ๊ฒฐ ๊ท์น
๋ฐ๋์ ์ค์ ๋ก ์ฐ๊ฒฐ๋์ด ๋์ํด์ผ ํ๋ค. ๋ฐฑ์๋๋ง ๋๊ณ ํ๋ก ํธ์์ ์ ๋๋ ๊ฒ์ ๋ฏธ์์ฑ์ด๋ค.
API ์ฐ๋
- ๋ฐฑ์๋ API ํ๋ ๋ง๋ค๋ฉด, ํ๋ก ํธ์์ ํธ์ถํ๋ ์ฝ๋๊น์ง ์์ฑํด์ผ "์๋ฃ".
- API ์๋ต ํ์(DTO)๊ณผ ํ๋ก ํธ ํ์ (TypeScript interface)์ ๋ฐ๋์ ์ผ์น์์ผ๋ผ.
- ๋ฐฑ์๋ API ์๋ต ๋ณ๊ฒฝ ์ ํ๋ก ํธ ํ์ ๋ ์ฆ์ ์ ๋ฐ์ดํธ. ํ์ชฝ๋ง ๋ฐ๊พธ๊ณ ๋ค๋ฅธ ์ชฝ ์ ๋ฐ๊พธ๋ ๊ฒ ๊ธ์ง.
- CORS ์ค์ ์ Spring Security์์ ๋ช
์์ ์ผ๋ก ํ์ฉ.
@CrossOrigin๋จ๋ฐ ๊ธ์ง, ๊ธ๋ก๋ฒ ์ค์ ์ผ๋ก ๊ด๋ฆฌ.
์ธ์ฆ ์ฐ๋
- JWT Access Token์ ํ๋ก ํธ์์
Authorization: Bearerํค๋๋ก ์ ์ก. - Refresh Token์ HttpOnly Cookie ๋๋ ๋ณ๋ ์ ์ฅ์์์ ๊ด๋ฆฌ.
- 401 ์๋ต ์ ํ๋ก ํธ์์ ์๋์ผ๋ก ํ ํฐ ๊ฐฑ์ โ ์ฌ์์ฒญ ๋ก์ง ๊ตฌํ ํ์.
- ๋ก๊ทธ์ธ ์ํ ์ ์ญ ๊ด๋ฆฌ (React Context ๋๋ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ).
WebSocket ์ฐ๋
- Spring Boot: STOMP over WebSocket ์ฌ์ฉ.
- React: SockJS + STOMP ํด๋ผ์ด์ธํธ๋ก ์ฐ๊ฒฐ.
- ์ฐ๊ฒฐ ๋๊น ์ ์๋ ์ฌ์ฐ๊ฒฐ ๋ก์ง ํ์.
- WebSocket ์๋ํฌ์ธํธ 3๊ฐ(
/ws/vessels,/ws/alerts,/ws/dashboard) ์ ๋ถ ํ๋ก ํธ์์ ๊ตฌ๋ ํ์ธ.
์๋ฌ ์ฒ๋ฆฌ
- ๋ฐฑ์๋ ์๋ฌ ์๋ต ํ์ ํต์ผ:
{ code, message, timestamp }. - ํ๋ก ํธ์์ ์๋ฌ ์๋ต์ ํ์ฑํด์ ์ ์ ์๊ฒ ์๋ฏธ ์๋ ๋ฉ์์ง ํ์.
- ๋คํธ์ํฌ ์๋ฌ, ํ์์์, 5xx ์๋ฌ ๊ฐ๊ฐ ๋ค๋ฅธ UI ์ฒ๋ฆฌ.
ํ๊ฒฝ ๋ถ๋ฆฌ
- ํ๋ก ํธ API Base URL์ ํ๊ฒฝ๋ณ์๋ก ๊ด๋ฆฌ (
VITE_API_BASE_URL๋ฑ). - ๊ฐ๋ฐ:
http://localhost:8080, Docker:http://anchoriq-app:8080. - ํ๋์ฝ๋ฉ๋ URL ๊ธ์ง.