|
15 | 15 |  |
16 | 16 | <br><br> |
17 | 17 |
|
| 18 | +## ๐ Table of Contents |
| 19 | + |
| 20 | +- [ShoppingFourU](#shoppingfouru) |
| 21 | +- [๐ฅ Team Member](#-team-member) |
| 22 | +- [๐ Architecture](#-architecture) |
| 23 | +- [๐ Convention](#-convention) |
| 24 | +- [๐ก API Documentation](#-api-documentation) |
| 25 | +- [๐ฅ Troubleshooting](#-troubleshooting) |
| 26 | + - [๋ถํ์ํ ์ฟผ๋ฆฌ ์์ฑ ๋ฌธ์ ] |
| 27 | + - [JWT ํํฐ ์์ธ ์ฒ๋ฆฌ ๋ฌธ์ ] |
| 28 | +- [๐ ๊ธฐ๋ณธ ํ๋ก์ ํธ ์ดํ ๋ณด์์ ](#-๊ธฐ๋ณธ-ํ๋ก์ ํธ-์ดํ-๋ณด์์ ) |
| 29 | + - [Git ยท Slack ์๋ฆผ & Bot ์๋ฌ ์ฐ๋] |
| 30 | + - [API ์ ๊ทผ ์ ํ (Rate Limiting)] |
| 31 | + - [Domain Refactoring] |
| 32 | + - [ํ ์ธ ยท ๋ฉค๋ฒ์ญ ์ ์ฑ
๋ชจ๋ํ] |
| 33 | + - [์ฃผ๋ฌธ ์ ๋ฐฐ์ก์ง ๊ฒ์ฆ ๊ฐํ] |
| 34 | + - [์ฃผ๋ฌธโ๊ฒฐ์ ํ๋ก์ธ์ค ๋ฆฌํฉํ ๋ง & ๋์์ฑ ์ ์ด] |
| 35 | + - [๋๊ด์ ๋ฝ (Optimistic Lock) ๋์
] |
| 36 | + - [์ฌ๊ณ ์์ฝ ์์คํ
๋์
] |
| 37 | + - [์ฐ (Wishlist) ๋๋ฉ์ธ ์ถ๊ฐ] |
| 38 | +- [๐ ์๋ก์ด ๊ธฐ์ ๋์
์ฌํญ ๋ฐ ์ ์ ์ด์ ](#-์๋ก์ด-๊ธฐ์ -๋์
-์ฌํญ-๋ฐ-์ ์ -์ด์ ) |
| 39 | + - [์ํ ํ ์ธ ์ ์ด๋ฉ์ผ ์๋ฆผ ์์คํ
๋์
] |
| 40 | + - [OpenAI ๊ธฐ๋ฐ FAQ ์ฑ๋ด ๋์
] |
| 41 | + - [ELK + ๋ชจ๋ํฐ๋ง ์์คํ
๋์
] |
| 42 | + |
| 43 | + |
18 | 44 | # ShoppingFourU |
19 | 45 | `ShoppingFourU` ๋ ์จ๋ผ์ธ ์ผํ๋ชฐ ์ด์์ ํ์ํ ๊ธฐ๋ฅ๋ค์ ์์ ํ๊ฒ ๊ตฌํํ E-commerce ํ๋ซํผ์
๋๋ค.<br> |
20 | 46 | ํ์ ๊ด๋ฆฌ๋ถํฐ ์ํ ๋ฑ๋ก, ์ฅ๋ฐ๊ตฌ๋, ์ฃผ๋ฌธ/๊ฒฐ์ ๊น์ง ์ค์ ์๋น์ค์ ๋์ผํ ํ๋ฆ์ ์ ๊ณตํ๋ฉฐ<br> |
|
35 | 61 | ## ๐ Architecture |
36 | 62 |
|
37 | 63 | ๐ ERD ์ค๊ณ๋ |
38 | | -<img width="1902" height="858" alt="image" src="https://github.com/user-attachments/assets/b8cd6585-15a3-4266-a9c0-eae0f79661f1" /> |
39 | | -<br> |
40 | | - |
41 | | -## ๐ Naming Rules |
42 | | - |
43 | | -| ํญ๋ชฉ | ๊ท์น | |
44 | | -| --------- | ------------ | |
45 | | -| Package | `kebab-case` | |
46 | | -| Class | `PascalCase` | |
47 | | -| Constant | `UPPERCASE` | |
48 | | -| Method | `camelCase` | |
49 | | -| Variables | `camelCase` | |
50 | | -<br> |
51 | | - |
52 | | - |
53 | | -## ๐ Commit Convention |
54 | | - |
55 | | -| Header | ๊ธฐ๋ฅ | |
56 | | -| ------------ | -------------------- | |
57 | | -| **Update** | ๋ณ๊ฒฝ ์ฌํญ ์
๋ฐ์ดํธ | |
58 | | -| **feat** | ์๋ก์ด ๊ธฐ๋ฅ ์ถ๊ฐ | |
59 | | -| **fix** | ๋ฒ๊ทธ ์์ | |
60 | | -| **docs** | ๋ฌธ์ ์์ | |
61 | | -| **style** | ์ฝ๋ ํฌ๋งทํ
| |
62 | | -| **refactor** | ์ฝ๋ ๋ฆฌํฉํ ๋ง | |
63 | | -| **test** | ํ
์คํธ ์ฝ๋ | |
64 | | -| **chore** | ๋น๋ ์
๋ฌด ์์ , ํจํค์ง ๋งค๋์ ์์ | |
65 | | -| **comment** | ์ฃผ์ ์ถ๊ฐ ๋ฐ ๋ณ๊ฒฝ | |
66 | | -| **remove** | ํ์ผ, ํด๋ ์ญ์ | |
67 | | -| **rename** | ํ์ผ, ํด๋๋ช
์์ | |
68 | | -<br> |
69 | | - |
70 | | - |
71 | | -โ ์ปค๋ฐ ๋ฉ์์ง ํ์<br> |
72 | | - |
73 | | -[ํฐ์ผ ๋ฒํธ] ์์
์ ํ: ์์
๋ด์ฉ<br><br> |
74 | | - |
75 | | -โ ์์<br> |
76 | | - |
77 | | -[TKT-15] feat: ๋ก๊ทธ์ธ ์ ์ ๊ธ ๊ฒ์ฆ ๊ธฐ๋ฅ ์ถ๊ฐ<br> |
78 | | - |
79 | | -[TKT-17] chore: ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ถ๊ฐ<br> |
80 | | - |
81 | | -[TKT-23] feat: ์ธ์ฆ/์ธ๊ฐ ๊ธฐ๋ฅ ์ถ๊ฐ<br> |
82 | | -<br> |
83 | | - |
84 | | - |
85 | | -## ๐ฌ Git Flow |
86 | | - |
87 | | -<img width="1476" height="1038" alt="image" src="https://github.com/user-attachments/assets/4c56ca48-d36b-4132-a545-30960f410f0b" /> |
88 | | - |
89 | | -- **main** : ์ถ์ ๊ฐ๋ฅํ ํ๋ก๋์
์ฝ๋์ ๋ธ๋์น |
90 | | - |
91 | | -- **dev** : ๋ค์ ๋ฒ์ ์ ๊ฐ๋ฐํ๋ ๋ธ๋์น |
92 | | - |
93 | | -- **feat** : ์ด์ ๋จ์๋ก ๊ธฐ๋ฅ์ ๊ฐ๋ฐํ๋ ๋ธ๋์น |
94 | | - - ๋ธ๋์น ๋ค์ด๋ฐ: `feat/#์ด์๋ฒํธ/[topic]` |
95 | | - |
96 | | -- **fix** : ์ด์ ๋จ์๋ก ๋ฒ๊ทธ๋ฅผ ์์ ํ๋ ๋ธ๋์น |
97 | | - - ๋ธ๋์น ๋ค์ด๋ฐ: `fix/#์ด์๋ฒํธ/[topic]` |
98 | | - |
99 | | -*๋ธ๋์น๋ช
์ Jira ์์
์ ์์ฑํ๋ฉด ์๋์ผ๋ก ์์ฑ๋ฉ๋๋ค. |
100 | | -<br> |
| 64 | +<img width="2398" height="1454" alt="basic-project-shopping_last_last_copy" src="https://github.com/user-attachments/assets/ad08aeba-4c13-4351-b23e-630429d8f662" /> |
101 | 65 | <br> |
102 | 66 |
|
| 67 | +## ๐ Convention |
| 68 | +์์ธํ ์ปจ๋ฒค์
์ฌํญ์ ๋
ธ์
์ ํตํด ํ์ธ ํด์ฃผ์ธ์! |
| 69 | +https://vivid-thyme-ac6.notion.site/Commit-Convention-2e19e3e335cc80d7bf16c7377e4ddeac?source=copy_link |
103 | 70 |
|
104 | | -## ๐งฉ Issue Template |
105 | | - |
106 | | -โจ์ด์ ์ค๋ช
|
107 | | -<br><br> |
108 | | - |
109 | | - |
110 | | -๐ฅํฌ๋๋ฆฌ์คํธ |
111 | | -<br><br> |
112 | | - |
113 | | - |
114 | | -๐๊ธฐํ ์ฌํญ |
115 | | -<br><br> |
116 | | -<br> |
117 | | - |
118 | | -## ๐ PR Template |
119 | | - |
120 | | -๐์์ฝ(Summary)<br> |
121 | | -์ด์ ๋ฒํธ : # |
122 | | -<br><br> |
123 | | - |
124 | | - |
125 | | -๐จ๋ณ๊ฒฝ ์ฌํญ(Changes) |
126 | | -<br><br> |
127 | | - |
128 | | - |
129 | | -๐๋ฆฌ๋ทฐ ์๊ตฌ์ฌํญ |
130 | | -<br><br> |
131 | | -<br> |
132 | 71 |
|
133 | 72 | ## ๐ก API Documentation |
134 | 73 |
|
|
139 | 78 | [๐ Swagger Documentation](http://shoppingfouru.ap-northeast-2.elasticbeanstalk.com/swagger-ui/index.html) |
140 | 79 | <br><br><br> |
141 | 80 |
|
| 81 | + |
142 | 82 | ## ๐ฅ Troubleshooting |
143 | 83 |
|
144 | 84 | ### ๋ถํ์ํ ์ฟผ๋ฆฌ ์์ฑ ๋ฌธ์ |
|
155 | 95 | - ์ฟผ๋ฆฌ ํ์ 50% ๊ฐ์ (2ํ โ 1ํ) |
156 | 96 | <br> |
157 | 97 |
|
158 | | ---- |
159 | 98 |
|
160 | 99 | ### JWT ํํฐ ์์ธ ์ฒ๋ฆฌ ๋ฌธ์ |
161 | 100 |
|
@@ -190,3 +129,136 @@ return header.substring(BEARER_PREFIX.length()); |
190 | 129 | ์์ธ๋ฅผ ๋์ง์ง ์๊ณ null ๋ฐํ<br> |
191 | 130 | - ์ด๋ ๊ฒ ํ๋ฉด Security์์ ์ธ์ฆ์์ด ํต๊ณผ์ํค๊ณ |
192 | 131 | Controller ๋ก์ง๊น์ง ์ ์์ ์ผ๋ก ์ ๋ฌ๋จ |
| 132 | +<br><br> |
| 133 | + |
| 134 | +## ๐ ๊ธฐ๋ณธ ํ๋ก์ ํธ ์ดํ ๋ณด์์ |
| 135 | + |
| 136 | +๊ธฐ๋ณธ ํ๋ก์ ํธ ๊ตฌํ ์ดํ, |
| 137 | +์ค์ ์ด์ ํ๊ฒฝ์์ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ๋ค์ ๊ฐ์ ํ๊ณ **์์ ์ฑ๊ณผ ํ์ฅ์ฑ**์ ์ค์ฌ์ผ๋ก ๊ตฌ์กฐ๋ฅผ ๋ณด์ํ์ต๋๋ค. |
| 138 | +๋จ์ ๊ธฐ๋ฅ ๊ตฌํ์ ๋์ด์ **์ด์ ๊ด์ ์ ํ์ง ๊ฐ์ **์ ์ด์ ์ ๋ง์ท์ต๋๋ค. |
| 139 | + |
| 140 | +### 1. Git ยท Slack ์๋ฆผ & Bot ์๋ฌ ์ฐ๋ |
| 141 | + |
| 142 | + |
| 143 | +### 2. API ์ ๊ทผ ์ ํ (Rate Limiting) |
| 144 | +#### ์ค๊ณ ๋ชฉํ |
| 145 | + |
| 146 | +**1์ฐจ ๋ฐฉ์ด** |
| 147 | +- Global Filter ๊ธฐ๋ฐ IP ๋จ์ ์ ํ |
| 148 | +- ์ด๋น 100ํ / ์ต๋ 10,000 IP ๊ธฐ์ค |
| 149 | + |
| 150 | +**2์ฐจ ๋ฐฉ์ด** |
| 151 | +- AOP ๊ธฐ๋ฐ Controller ๋จ์ ์ ๊ทผ ์ ์ด |
| 152 | +- API ํน์ฑ์ ๋ฐ๋ผ IP / ์ฌ์ฉ์๋ณ ์ ํ ์ ์ฑ
๋ถ๋ฆฌ ์ ์ฉ |
| 153 | + |
| 154 | +#### Bucket4j ์ ํ ์ด์ |
| 155 | +- ๋ฉ์๋๋ณ๋ก ์๋ก ๋ค๋ฅธ ์ ํ ์ ์ฑ
์ ์ฉ ๊ฐ๋ฅ |
| 156 | +- Redis ์ฌ์ฉ์ด ์ ํ์ ์ธ ํ๊ฒฝ ๊ณ ๋ ค |
| 157 | +- Caffeine ๊ธฐ๋ฐ ์บ์๋ก **๊ฒฝ๋ ยท ๊ณ ์ฑ๋ฅ ยท ๋์์ฑ ์์ ์ฑ ํ๋ณด** |
| 158 | + |
| 159 | + |
| 160 | +### 3. Domain Refactoring |
| 161 | + |
| 162 | +#### 1๏ธโฃ ํ ์ธ ยท ๋ฉค๋ฒ์ญ ์ ์ฑ
๋ชจ๋ํ |
| 163 | + |
| 164 | +#### 2๏ธโฃ ์ฃผ๋ฌธ ์ ๋ฐฐ์ก์ง ๊ฒ์ฆ ๊ฐํ |
| 165 | + |
| 166 | + |
| 167 | +### 4. ์ฃผ๋ฌธโ๊ฒฐ์ ํ๋ก์ธ์ค ๋ฆฌํฉํ ๋ง & ๋์์ฑ ์ ์ด |
| 168 | +#### ๊ฐ์ ๋ ํ๋ก์ธ์ค |
| 169 | + |
| 170 | +**์ฃผ๋ฌธ ์์ฑ API** |
| 171 | +- ์ํ ๊ตฌ๋งค ๊ฐ๋ฅ ์ฌ๋ถ ํ์ธ |
| 172 | +- ์ฃผ๋ฌธ ์ ๋ณด ์ ์ฅ |
| 173 | + ๐ ์ํ: `PENDING_PAYMENT` |
| 174 | + |
| 175 | +**๊ฒฐ์ ์์ฑ API** |
| 176 | +- ์ธ๋ถ ๊ฒฐ์ ๋ชจ๋ ํธ์ถ |
| 177 | +- **(Transaction)** |
| 178 | + - ๊ฒฐ์ ์ ๋ณด ์ ์ฅ |
| 179 | + - ์ํ ์ฌ๊ณ ์ฐจ๊ฐ |
| 180 | + - ์ฃผ๋ฌธ ์ํ ๋ณ๊ฒฝ โ `PAID` |
| 181 | + |
| 182 | +> ๐ก |
| 183 | +> ์ธ๋ถ ๊ฒฐ์ API ํธ์ถ์ ํธ๋์ญ์
์ ํฌํจํ์ง ์๊ณ , |
| 184 | +> DB ๋ณ๊ฒฝ ๋ก์ง๋ง ์์์ ์ผ๋ก ๋ฌถ์ด **๋ฝ ์ ์ ๋ฐ ์ฑ๋ฅ ์ ํ๋ฅผ ๋ฐฉ์ง** |
| 185 | +
|
| 186 | + |
| 187 | +### 5. ๋๊ด์ ๋ฝ (Optimistic Lock) ๋์
|
| 188 | + |
| 189 | +- ์ํ ์ํฐํฐ์ `@Version` ํ๋ ์ถ๊ฐ |
| 190 | +- ๋์ ์ฌ๊ณ ์ฐจ๊ฐ ์ ์ปค๋ฐ ์์ ์ ์ถฉ๋ ๊ฐ์ง |
| 191 | +- ์ถฉ๋ ๋ฐ์ ์ ์์ธ ์ฒ๋ฆฌ ํ ์ฌ์๋ ์ ๋ต ์ ์ฉ |
| 192 | + |
| 193 | + |
| 194 | +### 6. ์ฌ๊ณ ์์ฝ ์์คํ
๋์
|
| 195 | + |
| 196 | +#### ๋์
์ด์ |
| 197 | +- ๋์ ์ฃผ๋ฌธ ํ๊ฒฝ์์ ์ด๊ณผ ํ๋งค ๋ฐฉ์ง |
| 198 | +- ๊ฒฐ์ ์๋ฃ ์ ๊ตฌ๋งค ๊ถํ ์ ์ ํ์ |
| 199 | + |
| 200 | +#### ํ๋ก์ธ์ค |
| 201 | + |
| 202 | +**์ฃผ๋ฌธ ์์ฑ ์** |
| 203 | +- ์ฌ๊ณ ์ฐจ๊ฐ |
| 204 | +- ์ฌ๊ณ ์์ฝ ์ ๋ณด ์ ์ฅ |
| 205 | +- ์ฃผ๋ฌธ ์ํ: `PENDING_PAYMENT` |
| 206 | + |
| 207 | +**๊ฒฐ์ ์ฑ๊ณต ์** |
| 208 | +- ์ฌ๊ณ ์์ฝ ํด์ |
| 209 | +- ์ฃผ๋ฌธ ์ํ ๋ณ๊ฒฝ: `PAID` |
| 210 | + |
| 211 | +**๊ฒฐ์ ์คํจ / ์์ฝ ๋ง๋ฃ ์** |
| 212 | +- ์์ฝ ์ ๋ณด ์ญ์ |
| 213 | +- ์ฌ๊ณ ๋ณต๊ตฌ |
| 214 | + |
| 215 | +### 7. ์ฐ (Wishlist) ๋๋ฉ์ธ ์ถ๊ฐ |
| 216 | + |
| 217 | +<br> |
| 218 | + |
| 219 | +## ๐ ์๋ก์ด ๊ธฐ์ ๋์
์ฌํญ ๋ฐ ์ ์ ์ด์ |
| 220 | + |
| 221 | +### 1. ์ํ ํ ์ธ ์ ์ด๋ฉ์ผ ์๋ฆผ ์์คํ
๋์
|
| 222 | + |
| 223 | + |
| 224 | +#### ์ด๋ฉ์ผ ์ ์ ์ด์ |
| 225 | +- ๋๋ถ๋ถ์ ์ฌ์ฉ์๊ฐ ์ด๋ฉ์ผ์ ๋ณด์ ํ๊ณ ์์ด ์ ๊ทผ์ฑ์ด ๋์ |
| 226 | +- ํ์๊ฐ์
์ ์ด๋ฏธ ์ด๋ฉ์ผ ์ ๋ณด๋ฅผ ์์งํ๋ฏ๋ก |
| 227 | + ์ถ๊ฐ ์ ๋ณด ์
๋ ฅ์ด๋ ์ธ๋ถ ์๋น์ค ์ฐธ์ฌ๋ฅผ ์๊ตฌํ์ง ์์๋ ๋จ |
| 228 | +- Slack, Discord ๋ฑ์ ๋ณ๋์ ํ๋ก๊ทธ๋จ ์ฌ์ฉ ๋ฐ ๊ณต๊ฐ ์ฐธ์ฌ๊ฐ ํ์ํ์ฌ |
| 229 | + ์ฌ์ฉ์ ์๋ฆผ ๋ชฉ์ ๊ณผ ๋ง์ง ์์ ์ ์ธ |
| 230 | +- ์นด์นด์คํก ์ฑ๋์ ๊ฒฝ์ฐ |
| 231 | + - ์ฌ์
์ ๋ฑ๋ก ํ์ |
| 232 | + - ์ ๋ฃ ๋ฉ์์ง ๋ฐ์ก |
| 233 | + - ์นด์นด์ค ๊ณ์ ๊ด๋ จ ์ ๋ณด ์ถ๊ฐ ๊ด๋ฆฌ ํ์ |
| 234 | + โ ์ด์ ๋น์ฉ ๋ฐ ๋ณต์ก์ฑ ์ฆ๊ฐ๋ก ์ธํด ์ ์ธ |
| 235 | + |
| 236 | +### 2. OpenAI ๊ธฐ๋ฐ FAQ ์ฑ๋ด ๋์
|
| 237 | + |
| 238 | +#### ๋ฐ์ดํฐ ๊ตฌ์ฑ |
| 239 | +- ๋๋ฉ์ธ๋ณ ์์ฃผ ๋ฌป๋ ์ง๋ฌธ๊ณผ ๋ต๋ณ์ **JSON ํ์ผ๋ก ์ ๋ฆฌ** |
| 240 | +- ํด๋น ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก **๋ฒกํฐ ์คํ ์ด(Vector Store) ์ฐ๋** |
| 241 | + |
| 242 | +#### ๊ธฐ๋ฅ ๋ฒ์ |
| 243 | +- FAQ JSON ๋ฐ์ดํฐ ๊ธฐ๋ฐ ์ง์์๋ต ์ ๊ณต |
| 244 | +- ์๋น์ค ๋ด๋น ๋๋ฉ์ธ ์ธ ์ง๋ฌธ์ ๋ํด์๋ |
| 245 | + ์๋ต์ ์ ํํ์ฌ **๋น์๋์ ๋ต๋ณ ๋ฐฉ์ง** |
| 246 | + |
| 247 | +### 3. ELK + ๋ชจ๋ํฐ๋ง ์์คํ
๋์
|
| 248 | + |
| 249 | +#### ์ญํ ๋ถ๋ฆฌ ๋ฐ ํ์ฉ |
| 250 | + |
| 251 | +**ELK Stack** |
| 252 | +- ์๋ฌ ๋ก๊ทธ ์์ง |
| 253 | +- ์์ฒญ ํ๋ฆ ๋ฐ ์ฅ์ ์์ธ ์ถ์ |
| 254 | + |
| 255 | +**Prometheus + Grafana** |
| 256 | +- EC2 ๋ฐ Docker ์ปจํ
์ด๋ ๋ฆฌ์์ค ๋ชจ๋ํฐ๋ง |
| 257 | +- CPU / ๋ฉ๋ชจ๋ฆฌ / ์๋น์ค ๋ถํ ์ํ ์ค์๊ฐ ์๊ฐํ |
| 258 | + |
| 259 | +#### ๋์
ํจ๊ณผ |
| 260 | +- ๋ก๊ทธ์ ๋ฉํธ๋ฆญ์ ๋ถ๋ฆฌํ์ฌ ๋ถ์ ๊ฐ๋ฅ |
| 261 | +- ์๋น์ค ์ฅ์ ๋ฐ์ ์ ์์ธ ํ์
์๋ ํฅ์ |
| 262 | +- ์ด์ ๊ด์ ์์ ์์คํ
์ํ๋ฅผ ํ๋์ ํ์
๊ฐ๋ฅ |
| 263 | + |
| 264 | + |
0 commit comments