์ฌ์ฉ์ ยท ๊ฐ๊ฒ ยท ์ํ ยท ์ฃผ๋ฌธ ยท ๊ฒฐ์ ๋ฑ ํต์ฌ ๋๋ฉ์ธ์ ์ค์ฌ์ผ๋ก ์ค๊ณํ ์์์ ์ฃผ๋ฌธ ๊ด๋ฆฌ ํ๋ซํผ
4๊ณ์ธต ์ํคํ
์ฒ(ControllerโServiceโDomainโInfrastructure)์ ์ฉ, DDD(Domain-Driven Design) ๊ด์ ์์ ๋๋ฉ์ธ ๋ก์ง์ ๋ช
ํํ
๋ถ๋ฆฌํ์ฌ ์์ง๋ ๊ฐํ
OCP(๊ฐ๋ฐฉ-ํ์ ์์น) ์ DIP(์์กด ์ญ์ ์์น) ์ ์ ์ฉํ์ฌ ์ธํ๋ผ ๊ณ์ธต์ ๊ธฐ์ ์์กด์ฑ์ ์ต์ํํ๊ณ , ํ์ฅ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ๊ฐํ
| ๋ถ๋ฅ | ์์ธ |
|---|---|
| IDE | IntelliJ |
| Language | Java 17 |
| Framework | Spring Boot 3.5.5, Spring Data JPA, Spring Security + JWT, Validation, Lombok |
| Database | PostgreSQL 14 |
| Build Tool | Gradle |
| Development Tool | Swagger, Postman, Mockito |
| Collaboration | Discord, Notion, Zep |
#
Postgresql ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฑ
CREATE
DATABASE orderplatform;# ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค์
POSTGRES_DB=your_database_name
POSTGRES_USER=your_postgres_user
POSTGRES_PASSWORD=your_postgres_password
POSTGRES_PORT=5432
# ์ ํ๋ฆฌ์ผ์ด์
์ค์
APP_PORT=8080
SPRING_PROFILES_ACTIVE=docker
SPRING_APPLICATION_NAME=order-platform
# JWT ์ค์ (๊ฐ๋ ฅํ ํค๋ก ๋ณ๊ฒฝํ์ธ์)
JWT_SECRET=your_jwt_secret_key_here_at_least_32_characters_long
JWT_ACCESS_TOKEN_EXPIRATION=900000
JWT_REFRESH_TOKEN_EXPIRATION=604800000
# Google Gemini AI ์ค์ (๋ณธ์ธ์ API ํค๋ก ๋ณ๊ฒฝํ์ธ์)
GOOGLE_GEMINI_API_KEY=your_google_gemini_api_key_here
GOOGLE_GEMINI_API_URL=https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent
# ๋ก๊น
๋ ๋ฒจ
LOGGING_LEVEL_ROOT=INFO
LOGGING_LEVEL_APP=DEBUG
LOGGING_LEVEL_SECURITY=DEBUG
LOGGING_LEVEL_SQL=DEBUG
LOGGING_LEVEL_SQL_BINDER=TRACE
# ์ปจํ
์ด๋ ์ด๋ฆ
POSTGRES_CONTAINER_NAME=order-platform-db
APP_CONTAINER_NAME=order-platform-app
# ๋คํธ์ํฌ
NETWORK_NAME=order-platform-network# docker
# ์ด๋ฏธ์ง ๋น๋ ํ ์ปจํ
์ด๋ ์คํ (๋ฐฑ๊ทธ๋ผ์ด๋ ๋ชจ๋)
docker compose up -d --build
# ์ปจํ
์ด๋ ์ํ ํ์ธ
docker compose ps
#์์)
# NAME COMMAND STATE PORTS
#orderplatform-postgres "docker-entrypoint.sโฆ" Up 0.0.0.0:5432->5432/tcp
#orderplatform-app "java -jar app.jar" Up 0.0.0.0:8080->8080/tcp
# gradle
./gradlew bootRun
๐ docker-compose.yml
์ ์ ๋ชฉ๋ก / ๋น๋ฐ๋ฒํธ: Asd123456!
-------------------
Customer
hong@test.com
oh@test.com
-------------------
Owner
lee@test.com
lucas@test.com
-------------------
Master
mk@test.com
| API | ๊ฐ์ | API | ๊ฐ์ |
|---|---|---|---|
| ์ฌ์ฉ์ (User) | 8๊ฐ | ์ธ์ฆ ๋ฐ ํ ํฐ(Auth) | 1๊ฐ |
| ์ฃผ์(Address) | 4๊ฐ | ์์์ (Store) | 13๊ฐ |
| ์ํ (Product) | 9๊ฐ | ์ํ ์ค๋ช (AI) | 1๊ฐ |
| ์ํ ์ต์ (Option) | 6๊ฐ | ์ฃผ๋ฌธ(Order) | 7๊ฐ |
| ๊ฒฐ์ (Payment) | 5๊ฐ | ๋ฆฌ๋ทฐ(Review) | 7๊ฐ |
| ์นดํ ๊ณ ๋ฆฌ(Category) | 5๊ฐ |
| ๊ตฌ๋ถ | ๊ท์น | ์์ |
|---|---|---|
| ํด๋์ค | PascalCase | UserService, OrderController |
| ๋ณ์ / ๋ฉ์๋ | camelCase | StoreName, calculateTotal() |
| ํจํค์ง | ์๋ฌธ์, ๊ธฐ๋ฅ๋ณ ๊ตฌ๋ถ | com.spartaclub.orderplatform.domain |
| DB ํ ์ด๋ธ | snake_case + p_์ ๋์ฌ | p_user, p_category |
| DB ์ปฌ๋ผ | snake_case | created_at, store_address |
๐java-google ์ฝ๋ ์คํ์ผ
main.java.com.spartaclub.orderplatform
โโ domain
โ โโ ai
โ โ โโ application
โ โ โโ domain
โ โ โโ infrastructure
โ โ โโ presentation
โ โ
โ โโ category
โ โ โโ application
โ โ โโ domain
โ โ โโ exception
โ โ โโ infrastructure
โ โ โโ presentation
โ โ
โ โโ order
โ โ โโ ...
โ โ
โ โโ payment
โ โ โโ ...
โ โ
โ โโ product
โ โ โโ ...
โ โ
โ โโ review
โ โ โโ ...
โ โ
โ โโ store
โ โ โโ ...
โ โ
โ โโ user
โ โโ ...
โ
โโ global
โโ application.security
โ
โโ auth
โ โโ exception
โ โโ handler
โ โโ jwt
โ โโ sevice
โ
โโ config
โ โโ auditing
โ โโ security
โ โโ web
โ
โโ domain.entity
โ
โโ exception
โ โโ advice
โ
โโ infrastructure.config.swagger
โ
โโ presentation.dto
โ
โโ util
์์ฒญ์ ๋ฐ์ผ๋ฉด AI์ ์๋ต ์์ฑ ์์ฒญ์ ๋ณด๋ด๊ณ , ๋ฐ์ ๊ฐ์ ์บ์์ ์ ์ฅ, ์บ์๋ userId๋ก ๊ตฌ๋ถ
์ํ์ด ์ ์ฅ๋ ํ ์บ์๋ฅผ DB์ ์ ์ฅ, ์ ์ฅ๋ ์ํ ์ค๋ช
๊ณผ ์บ์์ ๋ง์ง๋ง์ ์ ์ฅ๋ ์๋ต์ด ์ผ์นํ๋ฉด ๋ก๊ทธ์ ์ํ๋ฅผ USED๋ก ๋ณ๊ฒฝ ํ DB์ ์ ์ฅ
- CUSTOMER ๊ถํ โ ํด๋น ๊ณ ๊ฐ์ด ์์ฑํ ๋ฆฌ๋ทฐ ๋ชฉ๋ก ์กฐํ
- OWNER ๊ถํ โ ๋ณธ์ธ ์์ ๊ฐ๊ฒ ๊ธฐ์ค ๋ฆฌ๋ทฐ ๋ชฉ๋ก ์กฐํ
- MANAGER, MASTER ๊ถํ โ ์ญ์ ๋์ง ์์ ๋ชจ๋ ๋ชฉ๋ก ์กฐํ

์์์ ์ ๋ฆฌ๋ทฐ ์์ ํ๊ท ํ์ ์ ์ค์๊ฐ์ผ๋ก ๊ณ์ฐํ ํ์๋ ์๋ค๊ณ ํ๋จํด 3์๊ฐ ๊ฐ๊ฒฉ์ผ๋ก ๊ฐฑ์ ๋๋๋ก ์ค์
ํ๊ท ํ์ ๊ณผ ๋ฆฌ๋ทฐ ์๋ฅผ ํ๋ฒ์ ์ฟผ๋ฆฌ๋ก ๊ณ์ฐํ๊ณ , ํด๋น ๊ฒฐ๊ณผ๋ฅผ ๋งคํํด ๊ฐ ์์์ ์ํฐํฐ์ ๋ฐ์
์ค์๊ฐ ๊ณ์ฐ ๋์ ์ค์ผ์ค๋ง์ ์ฌ์ฉํด ์ฑ๋ฅ ๋ถ๋ด ๊ฐ์
์ง๊ณ ์ฟผ๋ฆฌ + ์ผ๊ด ์
๋ฐ์ดํธ๋ก ๋ถํ์ํ ์ฐ์ฐ์ ์ค์ด๊ณ N+1 ๋ฌธ์ ๋ฐฉ์ง
- ์๋ ๊ธฐ๋ณธ ์ฃผ์ ์ค์ : ์ฌ์ฉ์์ ์ฒซ ๋ฒ์งธ ์ฃผ์๋ ์๋์ผ๋ก ๊ธฐ๋ณธ ์ฃผ์๋ก ์ค์ ํ์ฌ ์ฌ์ฉ์ ํธ์์ฑ ๊ทน๋ํ
- ๊ธฐ๋ณธ ์ฃผ์ ์ ์ผ์ฑ ๋ณด์ฅ: ์๋ก์ด ๊ธฐ๋ณธ ์ฃผ์ ๋ฑ๋ก ์ ๊ธฐ์กด ๊ธฐ๋ณธ ์ฃผ์๋ฅผ ์๋์ผ๋ก ํด์ ํ์ฌ ๋ฐ์ดํฐ ์ผ๊ด์ฑ ์ ์ง
- ์ต์ ์ฃผ์ ๋ณด์ฅ: ์ฌ์ฉ์๋ ์ต์ 1๊ฐ์ ํ์ฑ ์ฃผ์๋ฅผ ํ์๋ก ๋ณด์ ํ๋๋ก ๋น์ฆ๋์ค ๊ท์น์ ๊ฐ์ ์ ์ฉ
- ๊ธฐ๋ณธ ์ฃผ์ ์ฐ์์ฑ: ๊ธฐ๋ณธ ์ฃผ์ ์ญ์ ์ ๊ฐ์ฅ ์ต๊ทผ ์์ฑ๋ ์ฃผ์๋ก ์๋ ์ฌํ ๋นํ์ฌ ์๋น์ค ์ค๋จ ์์ด ์ฐ์์ฑ ๋ณด์ฅ
์ฃผ๋ฌธ ์์ฑ ํ ํธ๋์ญ์ ์ปค๋ฐ ์ @TransactionalEventListener(phase = AFTER_COMMIT)๋ก ๊ฒฐ์ ๋๋ฉ์ธ ์ด๋ฒคํธ ๋ฐํ โ ๊ฒฐ์ ์์ฑ ๋ฐ ์น์ธ ์ฒ๋ฆฌ
์ด๋ฒคํธ ์ ์คยท์ค๋ณต ์ํ, ์ฌ์๋ ์ ์ ํํ ์ํ ๋ณด์ฅ ์ด๋ ค์
์ฃผ๋ฌธ-๊ฒฐ์ ๋๋ฉ์ธ ๊ฐ ๊ฐํ ๊ฒฐํฉ โ ์์ฒญ/์๋ต ํ๋ฆ ๋ณต์ก, ์๋ต ์ง์ฐ ์ฆ๊ฐ
API๋ฅผ ๋ช ํํ ๋ถ๋ฆฌํ๊ณ ์ํ ์ ์ด๋ฅผ ๊ฐ ๋๋ฉ์ธ์ ์์ง โ ๋๋ฉ์ธ ๊ฐ ์์กด์ฑ ์ฝํ ๊ฒฐํฉ๋โ ์์ง๋โ, ์๋ต ์๋ ๋จ์ถ, ์ฅ์ ๊ฒฉ๋ฆฌ์ฑ ๊ฐ์
AI ์ํ ์ค๋ช
์์ฒญ ์๋ง๋ค ๋ก๊ทธ๋ฅผ DB์ ์ฆ์ ์ ์ฅํ๋๋ก ์ค๊ณ
์์ฒญ์ ํ ๋ ๋ง๋ค ์ด์ ๋ก๊ทธ์ ์ํ๋ฅผ USED -> NO_USE๋ก ์์
๊ฒฐ๊ณผ์ ์ผ๋ก, ๋จ์ผ ์ํ ์์ฑ ์ ์ฌ๋ฌ ๋ฒ์ update ์ฟผ๋ฆฌ๊ฐ ๋ฐ์
๋ชจ๋ ์์ฒญ์ ์ฆ์ DB์ ๋ฐ์ํ๋ ๊ตฌ์กฐ
์ํ ์ ์ฅ ์์ ๊น์ง โ์์ ์ํโ์์๋ ์ง์์ ์ผ๋ก DB์ ์ ๊ทผ
์์ฒญ ๋ก๊ทธ๋ฅผ ์บ์์ ์์ ์ ์ฅํ๋๋ก ๋ฆฌํฉํ ๋ง
- ๋ชจ๋ ๋ก๊ทธ๋ฅผ ์บ์์ NO_USE ์ํ๋ก ์ ์ฅ
- ์ํ ์ ์ฅ ํ ์บ์์ ์ ์ฅ๋ ํด๋น ์ํ์ ๋ก๊ทธ ์ค ๋ง์ง๋ง ์์ฒญ์ ๋น๊ต
- ์ํ์ ์ ์ฅ๋ ์ค๋ช ๊ณผ ๋ก๊ทธ์ ์๋ต ์ค๋ช ์ด ๊ฐ์ผ๋ฉด USED๋ก ๋ณ๊ฒฝ
- DB์ ๋ก๊ทธ ์ ์ฅ ํ ์บ์ ๋น์
Entity ์์ฑํ ๋ Mapstruct๋ฅผ ์ฌ์ฉํด์ requestDto์์ ๋ฐ์์จ ๊ฐ๋ค์ service์์ toEntity ๋ฉ์๋ ํตํด entity๋ก ์ ๋ฌ ํ๋๋ฐ Bean๊ด๋ จ ์ค๋ฅ ๋ฐ์
Entity ๊ฐ์ฒด๋ก ์ ๋ณด ์ ๋ฌํ ๋ ์จ์ ํ๊ฒ ์ธ๋ ํค ๊ด๊ณ Entity ๊ฐ์ฒด ์์ฑ ๋ชปํด์ ๋งตํ ์ค ๋ฌธ์ ๋ฐ์ํ ๊ฒ์ผ๋ก ์ถ์ธก
์ธ๋ ํค์ findById ๋ฉ์๋ ํ์ฉํด ์ธ๋ ํค ์ํฐํฐ ๋ฐ์์ ์์ฑํ ์ ์ ํฉํฐ๋ฆฌ ๋ฉ์๋์ ํ๋ผ๋ฏธํฐ๋ก ๋ฃ์ด ์ ๋ฌํ ํ,
Entity ํด๋์ค์์ ์จ์ ํ ํ๋์ ํ์ผ๋ก DB์ ๋ฐ์๋๋๋ก ์ํฐํฐ ๊ฐ์ฒด ์์ฑํ๋๋ก ํ์ฌ ํด๊ฒฐ
์์์ ๋ชฉ๋ก ์กฐํ ์ ๊ฐ ์์์ ์ ์ฐ๊ฒฐ๋ ๋ฆฌ๋ทฐ์ํฐํฐ๋ฅผ ํตํด ๋ฆฌ๋ทฐ ํ์ ๊ณผ ๋ฆฌ๋ทฐ ์๋ฅผ ์ค์๊ฐ์ผ๋ก ๊ณ์ฐํ๋ ค๊ณ ํ๋ฉด, ๋ฐ๋ณต์ ์ผ๋ก DB ์กฐํํ๊ฒ ๋์ด N+1๋ฌธ์ ๋ฐ์ํ ์ ์์
๋ฐ๋ณต๋ฌธ ์์์ ๊ฐ ์์์ ์ ์ฐ๊ด ๋ฆฌ๋ทฐ๋ฅผ ์ ๊ทผํ๋ฉด ์ฟผ๋ฆฌ ๋ฐ๋ณต ์คํ, ๋งค ์์ฒญ ์๋ง๋ค ์ง๊ณ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ฉด ํธ๋ํฝ์ด ๋ง์ ์๊ฐ๋์ DB ๋ถํ ๋ฐ์ํ ์ ์์
LEFT JOIN๊ณผ GROUP BY๋ฅผ ํ์ฉํด ๋ชจ๋ ๋ฆฌ๋ทฐ ํ๋ฒ์ ์ง๊ณํด ๋ฐ๋ณต๋ฌธ ์์์๋ ํ๋๋ง ์์ ํ๊ณ Lazy ์ฐ๊ด ์ ๊ทผํ์ง ์์ N+1 ๋ฌธ์ ๋ฐฉ์ง
EC2์์ openjdk:17-jre-slim ์ด๋ฏธ์ง ๋น๋ ์คํจ
๋ก์ปฌ์์๋ ์ ์ ๋์, EC2์์๋ง "not found" ์ค๋ฅ ๋ฐ์
Docker Hub์์ openjdk:17-jre-slim ์ด๋ฏธ์ง deprecated
Alpine ๊ธฐ๋ฐ ์ด๋ฏธ์ง์์ ์ฌ์ฉ์ ์์ฑ ๋ช
๋ น์ด ์ฐจ์ด๋ก ์ถ๊ฐ ์ค๋ฅ ๋ฐ์
Base Image ๋ณ๊ฒฝ: amazoncorretto:17-alpine
Alpine ํ๊ฒฝ์ ๋ง๊ฒ ์ฌ์ฉ์ ์์ฑ ๋ช
๋ น์ด ์์ : addgroup -S springboot / adduser -S springboot -G springboot
- createdAt/modifiedAt, createdId/modifiedId: ์์ฑ ๋ฐ ์์ ์๊ฐ, ID(์๋ ๊ด๋ฆฌ, JPA Auditing ์ฌ์ฉ)
- deletedAt, deletedId: ์ํํธ ์ญ์ ์๊ฐ, ID
- ์์ฑ/์์ ์ ๋ณด ๊ด๋ฆฌ ์๋ํ, ์ฝ๋ ์ค๋ณต ์ ๊ฑฐ ๋ฐ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ ํ๋ณด
- @EnableJpaAuditing(auditorAwareRef = โ๋น์ ์ด๋ฆโ)
- AuditorAware ๋น ์ฐธ์กฐ ์ด๋ฆ์ ์ง์ ํด Auditing์ ํ์ฑํ
- Entity์๋ @EntityListeners(AuditingEntityListener.class) ๋๋ ์ ์ญ ๋ฑ๋ก์ ๋์
- AuditingEntityListener
- JPA Entity ๋ผ์ดํ์ฌ์ดํด ์ด๋ฒคํธ๋ฅผ ๋ฆฌ์ค๋ํด์ auditing ๋์์ ์คํํ๋ค.
- Entity๊ฐ persist/update ๋ ๋ ์๋์ผ๋ก ํธ์ถํด ์ด๋ ธํ ์ด์ ์ฒ๋ฆฌ
- AuditorAware
- ํ์ฌ ๊ฐ์ฌ์๋ฅผ ๋ฐํํ๋ ์ธํฐํ์ด์ค. getCurrentAuditor()๋ฅผ ํตํด Optional๋ก ๋ฐ์์จ๋ค.
- WebMvcConfigurer์ ๊ตฌํ์ฒด์ธ WebConfig์ addArgumentResolvers ๋ฉ์๋์์ HandlerMethodArgumentResolver ๋ชฉ๋ก์ ์ฌ์ฉ์ ์ ์ resolver๋ฅผ ์ถ๊ฐ
- HandlerMethodArgumentResolver๋ฅผ ๊ตฌํํด Pageable ํ์ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ์ธ๋ฉ
- supportsParameter: ํ๋ผ๋ฏธํฐ ํ์ ์ด Pageable์ด๋ฉด true
- resolveArgument: page, size, sort ํ๋ผ๋ฏธํฐ๋ฅผ ์ฝ์ด PageRequest.of(page,size,sort) ๋ฐํ
- ์ ์ฑ
- ํ์ฉ๋ sizes: 10, 30, 50 (๊ทธ ์ธ ๊ธฐ๋ณธ 10)
- ๊ธฐ๋ณธ page: 0
- ํ์ฉ sort fields: createdAt, rating, totoalPrice, paymentAmount, averageRating, reviewCount
- ๊ธฐ๋ณธ sort: createdAt, DESC
- ๋ชจ๋ API ์๋ต์ ํต์ผ๋ ๊ตฌ์กฐ๋ก ๋ฐํ
- ์๋ฌ ๋ฉ์ธ์ง ๋ฐ ๋ฐ์ดํฐ ๊ตฌ์กฐ ์ผ๊ด์ฑ ์ ์ง
- ๋ชจ๋ ์ปจํธ๋กค๋ฌ์์ ๋ฐ์ํ๋ ์์ธ ์ ์ญ ์ฒ๋ฆฌ
- ์ฒ๋ฆฌ ๋ฒ์:
- MethodArgumentNotValidException: ์ ํจ์ฑ ๊ฒ์ฆ ์คํจ
- BusinessException: ๋น์ฆ๋์ค ๋ก์ง ์์ธ
- Exeption: ๊ธฐํ ๋ชจ๋ ์์ธ
- ๊ณตํต ์์ธ ์ฒ๋ฆฌ ์ ์ฑ ์ ๊ตฌ์ฑํ๊ณ ์ ์ฉํ ์
- SOLID ์์น์ ๊ณ ๋ คํ๋ฉฐ ์ฝ๋๋ฅผ ๊ตฌ์ฑํ ์
- Builder์ Setter๋ฅผ ์ ๊ฑฐํ๊ณ ์ ์ ํฉํ ๋ฆฌ ๋ฉ์๋๋ก ์ํฐํฐ ์์ฑ ์ฑ ์์ ๋ช ํํ ๋ถ๋ฆฌํ์ฌ ๋ถ๋ณ์ฑ์ ๊ฐํํ ์
- ๊ธ๋ก๋ง ๋ณด์๋ ๋์์ธ ํจํด์ ์ง์ ์ฝ๋์ ์ ์ฉํ๋ ๊ณผ์ ์์์ ์ด๋ ค์
- ๊ฐ์ ์์ ํ ์ฝ๋๋ฅผ ํตํฉํ๋ฉด์ ์ถฉ๋๊ณผ ์ค๋ฅ๊ฐ ๋ฐ์ํด ์ด๋ฅผ ํด๊ฒฐํ๋ ๊ณผ์ ์ ์ด๋ ค์
- DTO๋ฅผ Entity๋ก ๋ณํํ ๋ ์ธ๋ ํค ๊ด๊ณ์ ์์กด์ฑ ๊ด๋ฆฌ ๋ฌธ์ ์ ์ด๋ ค์
- ๋๋ฉ์ธ๊ฐ ๊ฒฐํฉ๋๋ฅผ ๋์จํ๊ฒ ํ๊ธฐ ์ํด ์ง์ ์ฐธ์กฐ ๋ฐฉ์์์ ๊ฐ์ ์ฐธ์กฐ๋ก ๋ณ๊ฒฝ
- ๊ณตํต ๋ก๊น ์ ์ฑ ์ ์ ์ฉํด ๋ชจ๋ API ์์ฒญ/์๋ต๊ณผ ์์ธ์ํฉ์ ์ผ๊ด๋๊ฒ ๊ธฐ๋ก
- ์๋น์ค ์์ ์ฑ์ ๋์ด๊ธฐ ์ํด ํฌ์ค์ฒดํฌ์ ๋ชจ๋ํฐ๋ง ์ฒด๊ณ๋ฅผ ์ ์ฉ
- ํ์ ๊ฐ ์์ ์๋ ์ฐจ์ด๋ก ์ธํด ๊ณตํต ๋ชจ๋์ด๋ ๊ธฐ๋ฅ ๊ฐ๋ฐ์ด ์ง์ฐ๋จ โ ๋๋ฆฐ ์งํ์ ์กฐ๊ธฐ์ ํ์ ํ๊ณ , ํ์ด ํ๋ก๊ทธ๋๋ฐ ์ง์
- ๋๋ฆฐ ์งํ ๋๋ฌธ์ ๋ค๋ฅธ ๊ธฐ๋ฅ ๊ฐ๋ฐ์ด๋ ํ ์คํธ ์ผ์ ์๋ ์ํฅ์ ์ค โ ์์ ๋จ์๋ฅผ ์ธ๋ถํํ๊ณ ์ฐ์ ์์์ ๋ฐ๋ผ ๊ณํ ์กฐ์
| ๊นํ๊ฒฐ | ๋ฅํ์ | ์ด์ค์ฑ | ์ดํ์ฃผ | ์ ์ฐ์ |
|---|---|---|---|---|
Order, Payment |
Product, Option, AI |
Review, Category |
Store |
User, Address, Auth |
ํ
ํฌ๋ฆฌ๋ |
ํ์ |
ํ์ |
ํ์ฅ |
ํ์ |

