์ค๊ณ๊ฐ ๋ช ํํ๋ฉด, "์ฝ๋๋ฅผ ์น๋ ํ์" ๋ ๋ชฉํ๋ฅผ ๋ฌ์ฑํ๋ "์๋จ" ์ด ๋๋ค.
์ค๊ณ๊ฐ ๋ช ํํ์ง ์์ผ๋ฉด, "์ฝ๋๋ฅผ ์น๋ ํ์" ๋ ๋ถํ์ํ "๋ ธ๋" ์ด ๋๋ค.
์๊ฐ
๋ฌด์ ์ญ(MUSINSSAK)์ ๋ฌด์ ์ฌ ํํ์ด์ง๋ฅผ ๋ชจ๋ฐฉํ์ฌ ๊ตฌํํ ์ด์ปค๋จธ์ค ์ผํ๋ชฐ ํ๋ซํผ์
๋๋ค.
์ฌ์ฉ์๋ ํฌ๋กค๋งํ ์ํ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ํ ์ ํ โ ์ฅ๋ฐ๊ตฌ๋ ๋ด๊ธฐ โ ์ฃผ๋ฌธ โ ๊ฒฐ์ ๊น์ง์ ํ๋ฆ์ ๊ฒฝํ,
์ถ๊ฐ๋ก AI ์ฑ๋ด ์ถ์ฒ ๊ธฐ๋ฅ์ ํตํด ๊ฐ์ธํ๋ ์ํ ์ถ์ฒ๊ณผ ๊ตฌ๋งค ์ง์์ ๋ฐ์ ์ ์์ต๋๋ค.
๊ฐ๋ฐ ๊ธฐ๊ฐ
2025.07.18(๊ธ) ~ ์งํ ์ค
๊ฐ๋ฐ ์ธ์
AI 1๋ช
, ๋ฐฑ์๋ 2๋ช
, ํ๋ก ํธ์๋ 2๋ช
| ์์ญ ๊ตฌ๋ถ | ๊ธฐ์ ๋๊ตฌ | ์ ์ ์ด์ | ์ฌ์ฉ์ฒ |
|---|---|---|---|
| ์ธ์ด & ํ๋ ์์ํฌ |
Java 17, Spring Boot 3.5.3 | ์ต์ LTS ๊ธฐ๋ฐ์ ์์ ์ฑ๊ณผ ํ๋ถํ ๋ ํผ๋ฐ์ค๋ฅผ ์ ๊ณตํ๋ Spring Boot ์ ํ | - REST API ์๋ฒ ๊ฐ๋ฐ - ์ ์์๊ฑฐ๋ ๋๋ฉ์ธ ๋ก์ง ๊ตฌํ |
| ORM/JPA | Spring Data JPA, QueryDSL | JPA๋ก CRUD ๋จ์ํ, QueryDSL๋ก ๋ฌดํ ์คํฌ๋กค(์ปค์ ๊ธฐ๋ฐ) ํ์ด์ง ๋ฐ ๋์ ์ฟผ๋ฆฌ ๊ตฌํ |
- ์ํ ๊ฒ์/์กฐํ API - ์นดํ ๊ณ ๋ฆฌ/๋ธ๋๋ ์ ๋ ฌยทํํฐ๋ง |
| DB | MySQL 8.0 | RDBMS ์ค ์ฐธ๊ณ ํ ์ ์๋ ๋ ํผ๋ฐ์ค๊ฐ ๊ฐ์ฅ ๋ง์ MySQL์ ์ ํํ์ต๋๋ค. | - ์ํ ๊ฒ์/์กฐํ API - ์นดํ ๊ณ ๋ฆฌ/๋ธ๋๋ ์ ๋ ฌยทํํฐ๋ง |
| DB ๋ง์ด๊ทธ๋ ์ด์ | Flyway | DB ์คํค๋ง ๋ณ๊ฒฝ ์ด๋ ฅ์ ๋ฒ์ ๊ด๋ฆฌ, ํ์ ์ถฉ๋ ์ต์ํ | - V1__init.sql ๊ธฐ๋ฐ ํ
์ด๋ธ ์์ฑ - ๋ฐฐํฌ ์ ๋ง์ด๊ทธ๋ ์ด์ ์๋ ์ ์ฉ |
| ์บ์/์ธ์
๊ด๋ฆฌ |
Redis 7.0 | In-Memory ๊ธฐ๋ฐ์ผ๋ก ์ธ์
/ํ ํฐ ์ ์ฅ ๋ฐ ๋ถ์ฐ ๋ฝ ์ ๊ณต |
- Refresh Token ์ ์ฅยท๊ฒ์ฆ - ๋ก๊ทธ์์ ์ ํ ํฐ ์ญ์ - ์ฃผ๋ฌธ ๋์์ฑ ์ ์ด ๋ฝ |
| ๋ฉ์์ง & ์ด๋ฒคํธ (์งํ์ค) |
Apache Kafka + Zookeeper | ๋๊ท๋ชจ ์ด๋ฒคํธ ์ฒ๋ฆฌ ๋ฐ ๋น๋๊ธฐ ํ์ฅ์ฑ ํ๋ณด | - ๊ฒฐ์ ์๋ฃ โ ์ฃผ๋ฌธ ํ์ ์ด๋ฒคํธ ๋ฐํ - ์ค์๊ฐ ์๋ฆผ ์ด๋ฒคํธ ์ฒ๋ฆฌ |
| ๋ณด์ & ์ธ์ฆ |
Spring Security + JJWT | JWT ๊ธฐ๋ฐ ์ธ์ฆ/์ธ๊ฐ๋ก ๋ฌด์ํ ์ํคํ ์ฒ ๊ตฌํ | - ๋ก๊ทธ์ธ/๋ก๊ทธ์์ API - Access/Refresh โ Token ๋ฐ๊ธ ๋ฐ ๊ฒ์ฆ |
| API ๋ฌธ์ํ | Springdoc (Swagger UI) | API ํ ์คํธ ๋ฐ ๋ฌธ์ํ๋ฅผ ๋น ๋ฅด๊ฒ ์ง์ | - /swagger-ui.html์ ํตํ ๊ฐ๋ฐ/QA ํ์ |
| ํด๋ผ์ฐ๋/ ๋ฐฐํฌ (์งํ์ค) |
GitHub Actions, Docker Compose, AWS EC2 | GitHub Actions๋ก CI/CD ์๋ํ, Docker Compose๋ก ํ๊ฒฝ ์ผ๊ด์ฑ ํ๋ณด, AWS EC2 ํ๋ฆฌํฐ์ด๋ก ๋น์ฉ ์ ๊ฐ | - main ๋ธ๋์น ํธ์ ์ ์๋ ๋น๋/๋ฐฐํฌ - BE/DB/Redis/Kafka๋ฅผ Docker Compose๋ก ๊ด๋ฆฌ - AWS EC2์ ๋ฐฐํฌ |
| ๋ชจ๋ํฐ๋ง (์งํ์ค) |
Prometheus + Grafana | ๋ฉํธ๋ฆญ ๊ธฐ๋ฐ WAS ์ฑ๋ฅ/์์ ์ฑ ๋ชจ๋ํฐ๋ง | - Spring Boot Actuator + Micrometer โ /actuator/prometheus ์์ง - Docker Compose ๋ถ๋ฆฌ( infra/monitoring)๋ก ๋
๋ฆฝ ๊ธฐ๋ - ๋์๋ณด๋: RPS(30s), p95(1m), 5xx ์๋ฌ์จ, Tomcat Thread Util, Hikari Util/Pending, Top5 RPSยทp95 by URI - ์ด์: Actuator 8081(๋ด๋ถ๋ง), ๊ฐ๋ฐ: 8080 |
| ํ๊ฒฝ ๋ณ์ ๊ด๋ฆฌ |
.env | ๋ฏผ๊ฐ ์ ๋ณด ๋ณ๋ ๊ด๋ฆฌ๋ก ๋ณด์ ๊ฐํ | - DB ๊ณ์ , JWT Secret, Kakao API Key ๊ด๋ฆฌ |
| ํ๋ก ํธ์๋ | React(ts), Vite, Axios | ๋น ๋ฅธ ๋ฒ๋ค๋ง(Vite)๊ณผ ๊ฐ๋จํ API ํธ์ถ(Axios)๋ก ํจ์จ์ ์ธ UI/๋ฐ์ดํฐ ์ฐ๋ | - API ํธ์ถ |
| ๋น๋ ๋๊ตฌ | Gradle | ์์กด์ฑ ๊ด๋ฆฌ ๋ฐ ๋น๋ ์๋ํ | - Spring Boot ํ๋ก์ ํธ ๋น๋/ํ ์คํธ/๋ฐฐํฌ |
| ํ ์คํธ/ํ์ | Postman, GitHub PR | API ํ ์คํธ ๋ฐ ํ์ ํ์คํ | - API ์๋๋ฆฌ์ค ํ
์คํธ - ๋ธ๋์น ์ ๋ต & ์ฝ๋ ๋ฆฌ๋ทฐ |
Scouter APM โ Prometheus+Grafana ์ ํ ์ด์ : ์ปค์คํ ์งํ/๋์๋ณด๋ ๊ตฌ์ฑ์ ์ ์ฐ์ฑ, CI/CDยท๋ก์ปฌ ๋ถ๋ฆฌ ๊ธฐ๋, ์ปค๋ฎค๋ํฐ ๋์๋ณด๋/์ํ๊ณ ํ์ฉ.
์์ฝ
- ์ด ํ ์ด๋ธ 34๊ฐ, ์ธ๋ํค 42๊ฐ
- ํต์ฌ ์ถ:
usersโordersโorder_itemsโproductsโpayments
๋๋ฉ์ธ๋ณ ๊ตฌ์ฑ
- ํ์/๊ณ์ (4): ์ฌ์ฉ์/์ฃผ์/ํ์ผ/๋น๋ฐ๋ฒํธ ๊ด๋ฆฌ
- ๋ธ๋๋ยท์นดํ ๊ณ ๋ฆฌยท์ํ (6): ์ํ/์ต์ /์ด๋ฏธ์ง/๋ฐฐ์ก์ ์ฑ
- ๊ด์ฌยท์ต๊ทผยท์ฅ๋ฐ๊ตฌ๋ (4): ์ฐ/์ต๊ทผ ๋ณธ/์ฅ๋ฐ๊ตฌ๋
- ์ฃผ๋ฌธยท์ฌ๊ณ (4): ์ฃผ๋ฌธ/์ฃผ๋ฌธ์ํ/๋ฐฐ์ก/์ฌ๊ณ ์์ฝ
- ๊ฒฐ์ (4): ๊ฒฐ์ /์นด๋/์นด์นด์คํ์ด/์์ํฌํธ
- ๋ฆฌ๋ทฐยท๋ฌธ์ (7): ๋ฆฌ๋ทฐ/๋ฌธ์/์ํ๋ฌธ์
- ์ฟ ํฐยท์ ๋ฆฝ๊ธ (5): ์ฟ ํฐ/์ฌ์ฉ๋ด์ญ/์ ๋ฆฝ๊ธ/์ด๋ ฅ
- ๊ฒฝ๋ก: React Dev Server โ Spring Boot App โ Docker(Compose) โ MySQL / Redis / Kafka / ZK / Scouter
- ๋ชฉ์ : ํ๊ฒฝ ์ฌํ์ฑ, ๋ก์ปฌ ์ผ๊ด ๊ธฐ๋, Kafka-UI & Scouter๋ก ๊ฐ์์ฑ ํ๋ณด
- AI Server (๋ก์ปฌ): Spring Boot App โ (Docker ๋คํธ์ํฌ ๋ด๋ถ) โ
ai-server:8000- WebClient baseUrl:
http://ai-server:8000(Compose ์๋น์ค๋ช ์ฌ์ฉ) docker-compose.yml์ai-server์๋น์ค ์ถ๊ฐ ๋ฐapp์depends_on: [ai-server]์ค์ /api/chat์permitAll์ ์ง, AI๊ฐ ๋ฐํํ ์ํ ID ์์ ๋ณด์กด ํ DB ์กฐํยท์๋ต ์กฐ๋ฆฝ
- WebClient baseUrl:
- ๊ฒฝ๋ก: CloudFront+S3 โ Nginx/ALB โ EC2(App) โ RDS / Redis / Kafka
- FE: CloudFront+S3๋ก ์ ์ ํ์ผ(CSS/JS/์ด๋ฏธ์ง ๋ฑ)์ CDN ์บ์ฑํด ์ ์ก ์๋ ์ต์ ํ
- Nginx/ALB: API ์์ฒญ์ ๋ฐ์ EC2(App) ์ธ์คํด์ค๋ก ํธ๋ํฝ ๋ถ์ฐ ์ฒ๋ฆฌ
- BE: EC2 ์ปจํ ์ด๋์์ Spring Boot ์คํ
- DB/์บ์/๋ฉ์์ง: ์ด๊ธฐ์ EC2+Compose๋ก ์์ โ ํธ๋ํฝ ์ฆ๊ฐ ์ RDS / ElastiCache / MSK๋ก ํ์ฅ
- AI Server: EC2(App) โ (๋ด๋ถ ํต์ ) โ EC2(AI, Python FastAPI/Flask)
- Java ๋ฐฑ์๋๊ฐ
WebClient๋ก AI ์๋ฒ์ ์ง์ โ ์ถ์ฒ ์ํ ID ๋ฆฌ์คํธ ์์ โ DB ์กฐํ๋ก ์ต์ข ์๋ต ์กฐ๋ฆฝ - ์ธ๋ถ ๊ณต๊ฐ ์์(ํผ๋ธ๋ฆญ ํธ๋ํฝ ์ฐจ๋จ), ALB๋ App๋ง ๋ ธ์ถ, AI๋ ํ๋ผ์ด๋น ์๋ธ๋ท/๋ณด์๊ทธ๋ฃน ํ์ฉ์ผ๋ก ๋ด๋ถ ํธ์ถ๋ง
- Java ๋ฐฑ์๋๊ฐ
- GitHub Actions๋ก ๋น๋ โ Docker ์ด๋ฏธ์ง ํธ์ โ EC2 ์๋ ๋ฐฐํฌ
- ์ธํ๋ผ ์์ฑ/์ค์ ์ ์ฝ์ ๋๋ IaC(Terraform ๋ฑ)๋ก ๊ด๋ฆฌ
์์ฝ: Dev๋ ๊ฐ๋จํ ํ ๋ฒ์ ๋์ ๊ฐ๋ฐ, Prod๋ CDNยท๋ก๋๋ฐธ๋ฐ์ยท๋งค๋์ง๋ ์๋น์ค๋ก ์์ ์ฑ๊ณผ ํ์ฅ์ฑ ๊ฐํ
ํ์ ๋ฐฉ์, ์ปค๋ฐ ์ปจ๋ฒค์
main: ์ด์ ๋ธ๋์นdev: ๊ฐ๋ฐ ํตํฉ ๋ธ๋์นfeature/*: ๊ธฐ๋ฅ ๋จ์ ๋ธ๋์น โ dev ๋จธ์งdev โ main: ํ์ฅ ์น์ธ ํ ๋จธ์ง
feat: ๊ธฐ๋ฅ ์ถ๊ฐfix: ๋ฒ๊ทธ ์์ docs: ๋ฌธ์ ์์ style: ์ฝ๋ ์คํ์ผ/UIrefactor: ๋ฆฌํฉํ ๋งtest: ํ ์คํธ ์ฝ๋chore: ์ค์ /๋น๋ ์์
ํต์ฌ ๊ธฐ๋ฅ ์์ธ (JWT ์ธ์ฆ, ์ํ ์กฐํ, ๊ฒฐ์ ๋ฑ)
- Access (~15๋ถ) / Refresh (~14์ผ) ๊ตฌ์กฐ
- Refresh ํ ํฐ์ Redis์ ์ ์ฅ (
RT:{userId}) /api/auth/refresh: Access ์ฌ๋ฐ๊ธ/api/auth/logout: Redis Refresh ์ญ์ + ์ฟ ํค ๋ง๋ฃ- ์คํจ ์๋ต ํต์ผ
{ "status": 401, "code": "AUTH_REQUIRED", "message": "๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค." }
- ErrorCode: ์ํยท์ฝ๋ยท๋ฉ์์ง ์ ์
- BusinessException: ์๋น์ค์์ throw
- GlobalExceptionHandler: JSON ์๋ต์ผ๋ก ๋ณํ
- ์ํ + ๋ธ๋๋ + ์ด๋ฏธ์ง + ์ต์ + ๋ฆฌ๋ทฐ ์ง๊ณ
- Facade ํจํด ์ ์ฉ
- Service: ์กฐํ ๊ท์น, ์์ธ ์ฒ๋ฆฌ
- Facade: DTO ์กฐ๋ฆฝ
- QueryDSL๋ก ์ ๋ ฌ/ํ์ด์ง ์ต์ ํ
- REST API ํค โ
.env๊ด๋ฆฌ - RestTemplate Client โ Service โ Controller ๋ถ๋ฆฌ
- ์๋ต DTO: ๋๋ก๋ช , ์ง๋ฒ, ์ฐํธ๋ฒํธ, ๊ฑด๋ฌผ๋ช ๋ฑ ๋ณํ
- ์นด๋์ฌ ์ธ์ฆ โ ์๋ฒ ์๋ต โ PortOne(์์ํฌํธ) ์ฐ๋
- ๊ธฐ๋ฅ: ๊ฒฐ์ / ์ทจ์ / ํ๋ถ
- ๋ณด์ ๋ฐ ์ํ ๋๊ธฐํ ๊ณ ๋ ค
- Public API(
POST /api/chat) ์ ๊ณต โ ๋ก๊ทธ์ธ ์์ด ์ด์ฉ ๊ฐ๋ฅ ChatService: AI ์๋ฒ ํธ์ถ โ ์ํ DB ์กฐํ โ ์๋ต ์กฐ๋ฆฝ- ์์ ๋ณด์ฅ: AI ์ถ์ฒ ์ํ ID ์์๋ฅผ ์ ์งํด DB ๊ฒฐ๊ณผ๋ฅผ ์ฌ์ ๋ ฌ
WebClient๊ธฐ๋ฐ ๋น๋๊ธฐ ํต์ ์ผ๋ก Python AI ์๋ฒ์ ์ฐ๋- ์๋ต ์์:
{ "chatbotMessage": "์ฌํ๊ฐ ๋ ์ธ๋งํ ๊ฐ๋ฐฉ์ ์ถ์ฒํด๋๋ฆด๊ฒ์.", "recommendedProducts": [ ... ] }
src/
โโ api/ # API ํธ์ถ ํจ์
โโ components/
โ โโ atoms/ # input, button ๋ฑ ์ต์ ๋จ์
โ โโ molecules/ # ์ฃผ์ ๋ฆฌ์คํธ ์์ดํ
๋ฑ
โ โโ organisms/ # atoms + molecules ์กฐํฉ (๋ชจ๋ฌ ๋ฑ)
โ โโ templates/ # ๋ ์ด์์/์น์
๋จ์
โโ pages/ # ํ๋ฉด ๋จ์
๐ฅ BE ์ฑ๋ฆฐ์ง & ํด๊ฒฐ (๋ฌธ์ ์ํฉ๊ณผ ํด๊ฒฐ ๊ณผ์ (์ฑ๋ฅ, ๋์์ฑ, ๋ณด์ ๋ฑ) ์งํ ์ค)
ํ๋ก๋ฉํ ์ฐ์คยท๊ทธ๋ผํ๋๋ก ์งํ ํ์ธ โ ๋ฆฌํฉํ ๋ง์ผ๋ก ๊ทธ๋ํ ๊ฐ์ (ํด๋ฆญ)
- Prometheus + Grafana ๊ธฐ๋ฐ ๋ชจ๋ํฐ๋ง๋ก ์ ํํ์ฌ ์ฑ๋ฅ ๋ถ์ ์งํ (Spring Boot Actuator + Micrometer, /actuator/prometheus)
- ๋ถํ ํ ์คํธ ์ค RPS, p95, 5xx, Tomcat Thread Util, Hikari Util/Pending ์งํ๋ก ๋ณ๋ชฉ ์๋ณ โ ๊ฐ์ ์์ด๋์ด ์ ๋ฆฌ/์ ์ฉ
- ์งํ ์ํฉ์ Grafana ๋์๋ณด๋ ์บก์ฒ(์ /ํ ๋น๊ต ๊ทธ๋ํ)์ ํจ๊ป ์ ๋ฐ์ดํธ ์์
musinssak/
โโ api/ # ์ธ๋ถ ๋
ธ์ถ ๋ ์ด์ด (์
ยท์ถ๋ ฅ ๊ฒฝ๊ณ)
โ โโ <domain>/ # ์: product, order, auth ...
โ โ โโ dto/ # ์์ฒญ/์๋ต DTO
โ โ โโ facade/ # ์ ์ฆ์ผ์ด์ค ์กฐํฉ/ํ๋ฆ ์กฐ์
โ โโ <domain>Controller.java # ๊ฐ ๋๋ฉ์ธ ์ปจํธ๋กค๋ฌ
โ
โโ common/ # ์ ์ญ ๊ณตํต ๋ชจ๋
โ โโ exception/ # ErrorCode, ์์ธ ๊ณ์ธต, ๊ธ๋ก๋ฒ ํธ๋ค๋ฌ
โ โโ web/ # ๊ณตํต ์๋ต/ํํฐ/๋ฆฌ์กธ๋ฒ ๋ฑ ์น ์ ํธ
โ
โโ domain/ # ํต์ฌ ๋๋ฉ์ธ (๋น์ฆ๋์ค ๊ท์น)
โ โโ <domain>/
โ โ โโ entity/ # JPA ์ํฐํฐ(์ ๊ทธ๋ฆฌ๊ฒ์ ๋ฃจํธ ์ค์ฌ)
โ โ โโ repository/ # JPA/QueryDSL ๋ฆฌํฌ์งํ ๋ฆฌ (๋๋ฉ์ธ ๊ด์ )
โ โ โโ service/ # ๋๋ฉ์ธ ์๋น์ค(ํธ๋์ญ์
, ์ ํฉ์ฑ)
โ โโ ...
โ
โโ infra/ # ์ธ๋ถ ์์คํ
์ด๋ํฐ (๊ตฌํ ์์ธ)
โ โโ external/ # ์นด์นด์ค ์ฃผ์๊ฒ์ ๋ฑ ์ธ๋ถ API ํด๋ผ์ด์ธํธ
โ โโ openapi/ # Swagger/Springdoc(OpenAPI) ์ค์ /๊ทธ๋ฃนํ
โ โโ security/ # JWT, Security ์ค์ /ํํฐ/์ธ์ฆ ์ธํ๋ผ
โ โโ test/ # ํตํฉ ํ
์คํธ ๋ณด์กฐ(๋์ปค/์ฌ๋ผ์ด์ค ๋ฑ)
- ๋ ์ด์ด ๋ถ๋ฆฌ: api(์ ยท์ถ๋ ฅ) โ domain(๊ท์น) โ infra(์ธ๋ถ/๊ตฌํ)๋ก ๋๋ ๊ด์ฌ์ฌ ๋ถ๋ฆฌ & ๊ต์ฒด ์ฉ์ด์ฑ ํ๋ณด.
- ๋๋ฉ์ธ ์ค์ฌ: ๋น์ฆ๋์ค ๊ท์น์ domain์ ์ง์ค(์ํฐํฐ/์๋น์ค/๋ฆฌํฌ์งํ ๋ฆฌ), ์ปจํธ๋กค๋ฌ๋ ์๊ฒ ์ ์ง.
- ํ์ฌ๋ ๋์ : api//facade๊ฐ ์ ์ฆ์ผ์ด์ค ์ค์ผ์คํธ๋ ์ด์ ๊ณผ DTO ์กฐ๋ฆฝ ๋ด๋น โ ์๋น์ค ๊ฐ ์ํ์ฐธ์กฐ ๋ฐฉ์ง.
- ์ธ๋ถ ์ฐ๋ ์บก์ํ: infra/external์ ์ธ๋ถ API ํด๋ผ์ด์ธํธ๋ฅผ ๋ชจ์ ์๋ฌ/์ฌ์๋/DTO ๋งคํ์ ํ์คํ.
- ๋ฌธ์ยท๋ณด์ ํ์คํ: infra/openapi(API ๋ฌธ์), infra/security(JWT/ํํฐ)๋ก ์ผ๊ด๋ ์ง์ /๋ฌธ์/์ธ์ฆ ์ฒด๊ณ ์ ๊ณต.
- ํ ์คํธ ์ฌํ์ฑ: infra/test๋ก ํตํฉ ํ ์คํธ ํ๊ฒฝ ๋ณด์กฐ(๋์ปค/์ฌ๋ผ์ด์ค) โ ์์ ์ ํ๊ท ๊ฒ์ฆ.
- swagger
- Sequence Diagram
- AI ์ฑ๋ด ์คํ ํ๋ฉด
๊ณต์ /ํ์ต ์ ๋ฆฌ ๋งํฌ(ํด๋ฆญ)
-
๊ฐ๋ฐ ํ๊ฒฝ & ๋ฐฐํฌ
- Docker + MySQL + Spring Boot + React ์ฐ๋
- Flyway๋ก DB ๋ง์ด๊ทธ๋ ์ด์ ๊ด๋ฆฌ
- Git ๋ธ๋์น ์ ๋ต & ์ปค๋ฐ ์ปจ๋ฒค์
- GitHub Actions ๊ธฐ๋ฐ CI/CD (์งํ ์ค)
-
๋ฐฑ์๋ ํต์ฌ ๊ธฐ์
- Spring Data JPA + QueryDSL: ํ ๋น(Repository)ยท๋ ํ๊น ๊ตฌ์กฐ
- ์ ์ญ ์์ธ ์ฒ๋ฆฌ:
ErrorCode โ BusinessException โ GlobalHandler - JWT ๊ธฐ๋ฐ ์ธ์ฆ/์ธ๊ฐ + Redis Refresh Token
- ์นด์นด์ค ์ฃผ์๊ฒ์ API ์ฐ๋
-
ํ๋ก ํธ/ํ๊ฒฝ ์ค์
- Vite ํ๊ฒฝ ๋ณ์(
VITE_์ ๋์ฌ) ํ์ ์์ ์ฑ ํ๋ณด - React ํ๋ก์ ํธ ์คํ/์ฐ๋ ํ์ธ
- Vite ํ๊ฒฝ ๋ณ์(
-
๊ธฐ๋ฅ ๊ตฌํ ์ฌ๋ก
- ์ํ ์์ธ ์กฐํ (๋ธ๋๋ยท์ต์ ยท๋ฆฌ๋ทฐ ์ง๊ณ + Facade ํจํด)
- Swagger(OpenAPI) ๋ฌธ์ํ (Code-First ๋ฐฉ์)
- ๋ชจ๋ํฐ๋ง: Scouter APM (์งํ ์ค)
-
๊ธฐํ
- DIP ์์น ์ ๋ฆฌ (์ํฐํฐยท๋ ํฌ์งํ ๋ฆฌยท์๋น์ค ์ฐธ์กฐ ๊ตฌ์กฐ)
- Postman์ผ๋ก JWT API ํ ์คํธ
- ChatGPT ํ๋กฌํํธ ํ์ต ํ์ฉ
- ๋๋ฉ์ธ ์ฃผ๋ ์ค๊ณ (DDD): ์ํฐํฐ/์๋น์ค/ํ์ฌ๋ ์ญํ ๋ถ๋ฆฌ
- ์์ ์ ์ธ ์ธ์ฆ ๊ตฌ์กฐ: JWT + Redis ๊ธฐ๋ฐ ํ ํฐ ๊ด๋ฆฌ
- ์ค๋ฌดํ ์ํคํ ์ฒ: Docker, Flyway, QueryDSL, ์ ์ญ ์์ธ ์ฒ๋ฆฌ
- ํ๋ก ํธ/๋ฐฑ์๋ ์ฐ๋: React + Spring Boot + REST API

