Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
256 changes: 164 additions & 92 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,32 @@
![Swagger UI](https://img.shields.io/badge/Swagger_UI-85EA2D?style=flat&logo=swagger&logoColor=black)
<br><br>

## ๐Ÿ“‘ Table of Contents

- [ShoppingFourU](#shoppingfouru)
- [๐Ÿ‘ฅ Team Member](#-team-member)
- [๐Ÿ› Architecture](#-architecture)
- [๐Ÿ“Œ Convention](#-convention)
- [๐Ÿ“ก API Documentation](#-api-documentation)
- [๐Ÿ”ฅ Troubleshooting](#-troubleshooting)
- [๋ถˆํ•„์š”ํ•œ ์ฟผ๋ฆฌ ์ƒ์„ฑ ๋ฌธ์ œ]
- [JWT ํ•„ํ„ฐ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋ฌธ์ œ]
- [๐Ÿš€ ๊ธฐ๋ณธ ํ”„๋กœ์ ํŠธ ์ดํ›„ ๋ณด์™„์ ](#-๊ธฐ๋ณธ-ํ”„๋กœ์ ํŠธ-์ดํ›„-๋ณด์™„์ )
- [Git ยท Slack ์•Œ๋ฆผ & Bot ์—๋Ÿฌ ์—ฐ๋™]
- [API ์ ‘๊ทผ ์ œํ•œ (Rate Limiting)]
- [Domain Refactoring]
- [ํ• ์ธ ยท ๋ฉค๋ฒ„์‹ญ ์ •์ฑ… ๋ชจ๋“ˆํ™”]
- [์ฃผ๋ฌธ ์‹œ ๋ฐฐ์†ก์ง€ ๊ฒ€์ฆ ๊ฐ•ํ™”]
- [์ฃผ๋ฌธโ€“๊ฒฐ์ œ ํ”„๋กœ์„ธ์Šค ๋ฆฌํŒฉํ† ๋ง & ๋™์‹œ์„ฑ ์ œ์–ด]
- [๋‚™๊ด€์  ๋ฝ (Optimistic Lock) ๋„์ž…]
- [์žฌ๊ณ  ์˜ˆ์•ฝ ์‹œ์Šคํ…œ ๋„์ž…]
- [์ฐœ (Wishlist) ๋„๋ฉ”์ธ ์ถ”๊ฐ€]
- [๐Ÿš€ ์ƒˆ๋กœ์šด ๊ธฐ์ˆ  ๋„์ž… ์‚ฌํ•ญ ๋ฐ ์„ ์ • ์ด์œ ](#-์ƒˆ๋กœ์šด-๊ธฐ์ˆ -๋„์ž…-์‚ฌํ•ญ-๋ฐ-์„ ์ •-์ด์œ )
- [์ƒํ’ˆ ํ• ์ธ ์‹œ ์ด๋ฉ”์ผ ์•Œ๋ฆผ ์‹œ์Šคํ…œ ๋„์ž…]
- [OpenAI ๊ธฐ๋ฐ˜ FAQ ์ฑ—๋ด‡ ๋„์ž…]
- [ELK + ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ ๋„์ž…]


# ShoppingFourU
`ShoppingFourU` ๋Š” ์˜จ๋ผ์ธ ์‡ผํ•‘๋ชฐ ์šด์˜์— ํ•„์š”ํ•œ ๊ธฐ๋Šฅ๋“ค์„ ์™„์ „ํ•˜๊ฒŒ ๊ตฌํ˜„ํ•œ E-commerce ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค.<br>
ํšŒ์› ๊ด€๋ฆฌ๋ถ€ํ„ฐ ์ƒํ’ˆ ๋“ฑ๋ก, ์žฅ๋ฐ”๊ตฌ๋‹ˆ, ์ฃผ๋ฌธ/๊ฒฐ์ œ๊นŒ์ง€ ์‹ค์ œ ์„œ๋น„์Šค์™€ ๋™์ผํ•œ ํ๋ฆ„์„ ์ œ๊ณตํ•˜๋ฉฐ<br>
Expand All @@ -35,100 +61,13 @@
## ๐Ÿ› Architecture

๐Ÿ“œ ERD ์„ค๊ณ„๋„
<img width="1902" height="858" alt="image" src="https://github.com/user-attachments/assets/b8cd6585-15a3-4266-a9c0-eae0f79661f1" />
<br>

## ๐Ÿ“Œ Naming Rules

| ํ•ญ๋ชฉ | ๊ทœ์น™ |
| --------- | ------------ |
| Package | `kebab-case` |
| Class | `PascalCase` |
| Constant | `UPPERCASE` |
| Method | `camelCase` |
| Variables | `camelCase` |
<br>


## ๐Ÿ“ Commit Convention

| Header | ๊ธฐ๋Šฅ |
| ------------ | -------------------- |
| **Update** | ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์—…๋ฐ์ดํŠธ |
| **feat** | ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€ |
| **fix** | ๋ฒ„๊ทธ ์ˆ˜์ • |
| **docs** | ๋ฌธ์„œ ์ˆ˜์ • |
| **style** | ์ฝ”๋“œ ํฌ๋งทํŒ… |
| **refactor** | ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง |
| **test** | ํ…Œ์ŠคํŠธ ์ฝ”๋“œ |
| **chore** | ๋นŒ๋“œ ์—…๋ฌด ์ˆ˜์ •, ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ € ์ˆ˜์ • |
| **comment** | ์ฃผ์„ ์ถ”๊ฐ€ ๋ฐ ๋ณ€๊ฒฝ |
| **remove** | ํŒŒ์ผ, ํด๋” ์‚ญ์ œ |
| **rename** | ํŒŒ์ผ, ํด๋”๋ช… ์ˆ˜์ • |
<br>


โœ” ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ํ˜•์‹<br>

[ํ‹ฐ์ผ“ ๋ฒˆํ˜ธ] ์ž‘์—… ์œ ํ˜•: ์ž‘์—… ๋‚ด์šฉ<br><br>

โœ” ์˜ˆ์‹œ<br>

[TKT-15] feat: ๋กœ๊ทธ์ธ ์‹œ ์ž ๊ธˆ ๊ฒ€์ฆ ๊ธฐ๋Šฅ ์ถ”๊ฐ€<br>

[TKT-17] chore: ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€<br>

[TKT-23] feat: ์ธ์ฆ/์ธ๊ฐ€ ๊ธฐ๋Šฅ ์ถ”๊ฐ€<br>
<br>


## ๐Ÿฌ Git Flow

<img width="1476" height="1038" alt="image" src="https://github.com/user-attachments/assets/4c56ca48-d36b-4132-a545-30960f410f0b" />

- **main** : ์ถœ์‹œ ๊ฐ€๋Šฅํ•œ ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ์˜ ๋ธŒ๋žœ์น˜

- **dev** : ๋‹ค์Œ ๋ฒ„์ „์„ ๊ฐœ๋ฐœํ•˜๋Š” ๋ธŒ๋žœ์น˜

- **feat** : ์ด์Šˆ ๋‹จ์œ„๋กœ ๊ธฐ๋Šฅ์„ ๊ฐœ๋ฐœํ•˜๋Š” ๋ธŒ๋žœ์น˜
- ๋ธŒ๋žœ์น˜ ๋„ค์ด๋ฐ: `feat/#์ด์Šˆ๋ฒˆํ˜ธ/[topic]`

- **fix** : ์ด์Šˆ ๋‹จ์œ„๋กœ ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋ธŒ๋žœ์น˜
- ๋ธŒ๋žœ์น˜ ๋„ค์ด๋ฐ: `fix/#์ด์Šˆ๋ฒˆํ˜ธ/[topic]`

*๋ธŒ๋žœ์น˜๋ช…์€ Jira ์ž‘์—…์„ ์ƒ์„ฑํ•˜๋ฉด ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
<br>
<img width="2398" height="1454" alt="basic-project-shopping_last_last_copy" src="https://github.com/user-attachments/assets/ad08aeba-4c13-4351-b23e-630429d8f662" />
<br>

## ๐Ÿ“Œ Convention
์ž์„ธํ•œ ์ปจ๋ฒค์…˜์‚ฌํ•ญ์€ ๋…ธ์…˜์„ ํ†ตํ•ด ํ™•์ธ ํ•ด์ฃผ์„ธ์š”!
https://vivid-thyme-ac6.notion.site/Commit-Convention-2e19e3e335cc80d7bf16c7377e4ddeac?source=copy_link

## ๐Ÿงฉ Issue Template

โœจ์ด์Šˆ ์„ค๋ช…
<br><br>


๐Ÿ”ฅํˆฌ๋‘๋ฆฌ์ŠคํŠธ
<br><br>


๐Ÿ”–๊ธฐํƒ€ ์‚ฌํ•ญ
<br><br>
<br>

## ๐Ÿ”€ PR Template

๐Ÿ“์š”์•ฝ(Summary)<br>
์ด์Šˆ ๋ฒˆํ˜ธ : #
<br><br>


๐Ÿ”จ๋ณ€๊ฒฝ ์‚ฌํ•ญ(Changes)
<br><br>


๐Ÿ˜‰๋ฆฌ๋ทฐ ์š”๊ตฌ์‚ฌํ•ญ
<br><br>
<br>

## ๐Ÿ“ก API Documentation

Expand All @@ -139,6 +78,7 @@
[๐Ÿ“„ Swagger Documentation](http://shoppingfouru.ap-northeast-2.elasticbeanstalk.com/swagger-ui/index.html)
<br><br><br>


## ๐Ÿ”ฅ Troubleshooting

### ๋ถˆํ•„์š”ํ•œ ์ฟผ๋ฆฌ ์ƒ์„ฑ ๋ฌธ์ œ
Expand All @@ -155,7 +95,6 @@
- ์ฟผ๋ฆฌ ํšŸ์ˆ˜ 50% ๊ฐ์†Œ (2ํšŒ โ†’ 1ํšŒ)
<br>

---

### JWT ํ•„ํ„ฐ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋ฌธ์ œ

Expand Down Expand Up @@ -190,3 +129,136 @@ return header.substring(BEARER_PREFIX.length());
์˜ˆ์™ธ๋ฅผ ๋˜์ง€์ง€ ์•Š๊ณ  null ๋ฐ˜ํ™˜<br>
- ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด Security์—์„œ ์ธ์ฆ์—†์ด ํ†ต๊ณผ์‹œํ‚ค๊ณ 
Controller ๋กœ์ง๊นŒ์ง€ ์ •์ƒ์ ์œผ๋กœ ์ „๋‹ฌ๋จ
<br><br>

## ๐Ÿš€ ๊ธฐ๋ณธ ํ”„๋กœ์ ํŠธ ์ดํ›„ ๋ณด์™„์ 

๊ธฐ๋ณธ ํ”„๋กœ์ ํŠธ ๊ตฌํ˜„ ์ดํ›„,
์‹ค์ œ ์šด์˜ ํ™˜๊ฒฝ์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋“ค์„ ๊ฐ€์ •ํ•˜๊ณ  **์•ˆ์ •์„ฑ๊ณผ ํ™•์žฅ์„ฑ**์„ ์ค‘์‹ฌ์œผ๋กœ ๊ตฌ์กฐ๋ฅผ ๋ณด์™„ํ–ˆ์Šต๋‹ˆ๋‹ค.
๋‹จ์ˆœ ๊ธฐ๋Šฅ ๊ตฌํ˜„์„ ๋„˜์–ด์„œ **์šด์˜ ๊ด€์ ์˜ ํ’ˆ์งˆ ๊ฐœ์„ **์— ์ดˆ์ ์„ ๋งž์ท„์Šต๋‹ˆ๋‹ค.

### 1. Git ยท Slack ์•Œ๋ฆผ & Bot ์—๋Ÿฌ ์—ฐ๋™


### 2. API ์ ‘๊ทผ ์ œํ•œ (Rate Limiting)
#### ์„ค๊ณ„ ๋ชฉํ‘œ

**1์ฐจ ๋ฐฉ์–ด**
- Global Filter ๊ธฐ๋ฐ˜ IP ๋‹จ์œ„ ์ œํ•œ
- ์ดˆ๋‹น 100ํšŒ / ์ตœ๋Œ€ 10,000 IP ๊ธฐ์ค€

**2์ฐจ ๋ฐฉ์–ด**
- AOP ๊ธฐ๋ฐ˜ Controller ๋‹จ์œ„ ์ ‘๊ทผ ์ œ์–ด
- API ํŠน์„ฑ์— ๋”ฐ๋ผ IP / ์‚ฌ์šฉ์ž๋ณ„ ์ œํ•œ ์ •์ฑ… ๋ถ„๋ฆฌ ์ ์šฉ

#### Bucket4j ์„ ํƒ ์ด์œ 
- ๋ฉ”์„œ๋“œ๋ณ„๋กœ ์„œ๋กœ ๋‹ค๋ฅธ ์ œํ•œ ์ •์ฑ… ์ ์šฉ ๊ฐ€๋Šฅ
- Redis ์‚ฌ์šฉ์ด ์ œํ•œ์ ์ธ ํ™˜๊ฒฝ ๊ณ ๋ ค
- Caffeine ๊ธฐ๋ฐ˜ ์บ์‹œ๋กœ **๊ฒฝ๋Ÿ‰ ยท ๊ณ ์„ฑ๋Šฅ ยท ๋™์‹œ์„ฑ ์•ˆ์ •์„ฑ ํ™•๋ณด**


### 3. Domain Refactoring

#### 1๏ธโƒฃ ํ• ์ธ ยท ๋ฉค๋ฒ„์‹ญ ์ •์ฑ… ๋ชจ๋“ˆํ™”

#### 2๏ธโƒฃ ์ฃผ๋ฌธ ์‹œ ๋ฐฐ์†ก์ง€ ๊ฒ€์ฆ ๊ฐ•ํ™”


### 4. ์ฃผ๋ฌธโ€“๊ฒฐ์ œ ํ”„๋กœ์„ธ์Šค ๋ฆฌํŒฉํ† ๋ง & ๋™์‹œ์„ฑ ์ œ์–ด
#### ๊ฐœ์„ ๋œ ํ”„๋กœ์„ธ์Šค

**์ฃผ๋ฌธ ์ƒ์„ฑ API**
- ์ƒํ’ˆ ๊ตฌ๋งค ๊ฐ€๋Šฅ ์—ฌ๋ถ€ ํ™•์ธ
- ์ฃผ๋ฌธ ์ •๋ณด ์ €์žฅ
๐Ÿ‘‰ ์ƒํƒœ: `PENDING_PAYMENT`

**๊ฒฐ์ œ ์ƒ์„ฑ API**
- ์™ธ๋ถ€ ๊ฒฐ์ œ ๋ชจ๋“ˆ ํ˜ธ์ถœ
- **(Transaction)**
- ๊ฒฐ์ œ ์ •๋ณด ์ €์žฅ
- ์ƒํ’ˆ ์žฌ๊ณ  ์ฐจ๊ฐ
- ์ฃผ๋ฌธ ์ƒํƒœ ๋ณ€๊ฒฝ โ†’ `PAID`

> ๐Ÿ’ก
> ์™ธ๋ถ€ ๊ฒฐ์ œ API ํ˜ธ์ถœ์€ ํŠธ๋žœ์žญ์…˜์— ํฌํ•จํ•˜์ง€ ์•Š๊ณ ,
> DB ๋ณ€๊ฒฝ ๋กœ์ง๋งŒ ์›์ž์ ์œผ๋กœ ๋ฌถ์–ด **๋ฝ ์ ์œ  ๋ฐ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ๋ฐฉ์ง€**


### 5. ๋‚™๊ด€์  ๋ฝ (Optimistic Lock) ๋„์ž…

- ์ƒํ’ˆ ์—”ํ‹ฐํ‹ฐ์— `@Version` ํ•„๋“œ ์ถ”๊ฐ€
- ๋™์‹œ ์žฌ๊ณ  ์ฐจ๊ฐ ์‹œ ์ปค๋ฐ‹ ์‹œ์ ์— ์ถฉ๋Œ ๊ฐ์ง€
- ์ถฉ๋Œ ๋ฐœ์ƒ ์‹œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ํ›„ ์žฌ์‹œ๋„ ์ „๋žต ์ ์šฉ


### 6. ์žฌ๊ณ  ์˜ˆ์•ฝ ์‹œ์Šคํ…œ ๋„์ž…

#### ๋„์ž… ์ด์œ 
- ๋™์‹œ ์ฃผ๋ฌธ ํ™˜๊ฒฝ์—์„œ ์ดˆ๊ณผ ํŒ๋งค ๋ฐฉ์ง€
- ๊ฒฐ์ œ ์™„๋ฃŒ ์ „ ๊ตฌ๋งค ๊ถŒํ•œ ์„ ์  ํ•„์š”

#### ํ”„๋กœ์„ธ์Šค

**์ฃผ๋ฌธ ์ƒ์„ฑ ์‹œ**
- ์žฌ๊ณ  ์ฐจ๊ฐ
- ์žฌ๊ณ  ์˜ˆ์•ฝ ์ •๋ณด ์ €์žฅ
- ์ฃผ๋ฌธ ์ƒํƒœ: `PENDING_PAYMENT`

**๊ฒฐ์ œ ์„ฑ๊ณต ์‹œ**
- ์žฌ๊ณ  ์˜ˆ์•ฝ ํ•ด์ œ
- ์ฃผ๋ฌธ ์ƒํƒœ ๋ณ€๊ฒฝ: `PAID`

**๊ฒฐ์ œ ์‹คํŒจ / ์˜ˆ์•ฝ ๋งŒ๋ฃŒ ์‹œ**
- ์˜ˆ์•ฝ ์ •๋ณด ์‚ญ์ œ
- ์žฌ๊ณ  ๋ณต๊ตฌ

### 7. ์ฐœ (Wishlist) ๋„๋ฉ”์ธ ์ถ”๊ฐ€

<br>

## ๐Ÿš€ ์ƒˆ๋กœ์šด ๊ธฐ์ˆ  ๋„์ž… ์‚ฌํ•ญ ๋ฐ ์„ ์ • ์ด์œ 

### 1. ์ƒํ’ˆ ํ• ์ธ ์‹œ ์ด๋ฉ”์ผ ์•Œ๋ฆผ ์‹œ์Šคํ…œ ๋„์ž…


#### ์ด๋ฉ”์ผ ์„ ์ • ์ด์œ 
- ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฉ”์ผ์„ ๋ณด์œ ํ•˜๊ณ  ์žˆ์–ด ์ ‘๊ทผ์„ฑ์ด ๋†’์Œ
- ํšŒ์›๊ฐ€์ž… ์‹œ ์ด๋ฏธ ์ด๋ฉ”์ผ ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•˜๋ฏ€๋กœ
์ถ”๊ฐ€ ์ •๋ณด ์ž…๋ ฅ์ด๋‚˜ ์™ธ๋ถ€ ์„œ๋น„์Šค ์ฐธ์—ฌ๋ฅผ ์š”๊ตฌํ•˜์ง€ ์•Š์•„๋„ ๋จ
- Slack, Discord ๋“ฑ์€ ๋ณ„๋„์˜ ํ”„๋กœ๊ทธ๋žจ ์‚ฌ์šฉ ๋ฐ ๊ณต๊ฐ„ ์ฐธ์—ฌ๊ฐ€ ํ•„์š”ํ•˜์—ฌ
์‚ฌ์šฉ์ž ์•Œ๋ฆผ ๋ชฉ์ ๊ณผ ๋งž์ง€ ์•Š์•„ ์ œ์™ธ
- ์นด์นด์˜คํ†ก ์ฑ„๋„์˜ ๊ฒฝ์šฐ
- ์‚ฌ์—…์ž ๋“ฑ๋ก ํ•„์ˆ˜
- ์œ ๋ฃŒ ๋ฉ”์‹œ์ง€ ๋ฐœ์†ก
- ์นด์นด์˜ค ๊ณ„์ • ๊ด€๋ จ ์ •๋ณด ์ถ”๊ฐ€ ๊ด€๋ฆฌ ํ•„์š”
โ†’ ์šด์˜ ๋น„์šฉ ๋ฐ ๋ณต์žก์„ฑ ์ฆ๊ฐ€๋กœ ์ธํ•ด ์ œ์™ธ

### 2. OpenAI ๊ธฐ๋ฐ˜ FAQ ์ฑ—๋ด‡ ๋„์ž…

#### ๋ฐ์ดํ„ฐ ๊ตฌ์„ฑ
- ๋„๋ฉ”์ธ๋ณ„ ์ž์ฃผ ๋ฌป๋Š” ์งˆ๋ฌธ๊ณผ ๋‹ต๋ณ€์„ **JSON ํŒŒ์ผ๋กœ ์ •๋ฆฌ**
- ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ **๋ฒกํ„ฐ ์Šคํ† ์–ด(Vector Store) ์—ฐ๋™**

#### ๊ธฐ๋Šฅ ๋ฒ”์œ„
- FAQ JSON ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜ ์งˆ์˜์‘๋‹ต ์ œ๊ณต
- ์„œ๋น„์Šค ๋‹ด๋‹น ๋„๋ฉ”์ธ ์™ธ ์งˆ๋ฌธ์— ๋Œ€ํ•ด์„œ๋Š”
์‘๋‹ต์„ ์ œํ•œํ•˜์—ฌ **๋น„์˜๋„์  ๋‹ต๋ณ€ ๋ฐฉ์ง€**

### 3. ELK + ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ ๋„์ž…

#### ์—ญํ•  ๋ถ„๋ฆฌ ๋ฐ ํ™œ์šฉ

**ELK Stack**
- ์—๋Ÿฌ ๋กœ๊ทธ ์ˆ˜์ง‘
- ์š”์ฒญ ํ๋ฆ„ ๋ฐ ์žฅ์•  ์›์ธ ์ถ”์ 

**Prometheus + Grafana**
- EC2 ๋ฐ Docker ์ปจํ…Œ์ด๋„ˆ ๋ฆฌ์†Œ์Šค ๋ชจ๋‹ˆํ„ฐ๋ง
- CPU / ๋ฉ”๋ชจ๋ฆฌ / ์„œ๋น„์Šค ๋ถ€ํ•˜ ์ƒํƒœ ์‹ค์‹œ๊ฐ„ ์‹œ๊ฐํ™”

#### ๋„์ž… ํšจ๊ณผ
- ๋กœ๊ทธ์™€ ๋ฉ”ํŠธ๋ฆญ์„ ๋ถ„๋ฆฌํ•˜์—ฌ ๋ถ„์„ ๊ฐ€๋Šฅ
- ์„œ๋น„์Šค ์žฅ์•  ๋ฐœ์ƒ ์‹œ ์›์ธ ํŒŒ์•… ์†๋„ ํ–ฅ์ƒ
- ์šด์˜ ๊ด€์ ์—์„œ ์‹œ์Šคํ…œ ์ƒํƒœ๋ฅผ ํ•œ๋ˆˆ์— ํŒŒ์•… ๊ฐ€๋Šฅ


Loading