diff --git a/README.md b/README.md
index f11799b..905f615 100644
--- a/README.md
+++ b/README.md
@@ -12,6 +12,8 @@
> - [๐ ํ์ผ ๊ตฌ์กฐ](#ํ์ผ-๊ตฌ์กฐ)
> - [๐ฉ ์์ ๊ฐ์ด๋](#์์-๊ฐ์ด๋)
> - [๐ฅ๏ธ ๊ธฐ์ ์คํ](#๊ธฐ์ -์คํ)
+> - [๐ BE ๊ฐ๋ฐ ์ฃผ์์ ](#๊ฐ๋ฐ-์ฃผ์์ )
+> - [โก์ฑ๋ฅ ์ต์ ํ](#์ฑ๋ฅ-์ต์ ํ)
> - [ยฉ๏ธ License: The MIT License (MIT)](#license)
@@ -54,12 +56,11 @@
## ํ์ ์๊ฐ
-| | | | | |
-|:--:|:----------:|:----------:|:----------:|:----------:|
-| ์ด๋ฆ | [๋จ์์ ](https://github.com/1jeongg) | [๋ฌธ์์ค](https://github.com/seokwns) | [์ฒ์์ฑ](https://github.com/chaee813)|[๊น์ ๋](https://github.com/Rizingblare) |
-| ๊ฐ๋ฐ ๋ฒ์ | ํ์, ๊ฒฐ์ , ์ฐํ๊ธฐ | ํ ํฐ, ์ด๋ฉ์ผ, ํฌํธํด๋ฆฌ์ค, ๊ฒฌ์ ์ | ์ฑํ
, ๋งค์นญ, ๊ฒฌ์ ์, ๋ฆฌ๋ทฐ | ํฌํธํด๋ฆฌ์ค |
-
+| [๊น์ฐฌํธ](https://github.com/kimchanho97) | [์ดํ๋น](https://github.com/blackhblee) | [๋จ์์ ](https://github.com/1jeongg) | [๋ฌธ์์ค](https://github.com/seokwns) | [์ฒ์์ฑ](https://github.com/chaee813) | [๊น์ ๋](https://github.com/Rizingblare) |
+| :--------------------------------------------------------: | :-------------------------------------------------------: | :----------------------------------------------------: | :----------------------------------------------------: | :-----------------------------------------------------: | :--------------------------------------------------------: |
+| | | | | | |
+| FE | FE | BE | BE | BE | BE |
## ์ฃผ์ ๊ธฐ๋ฅ
@@ -68,29 +69,44 @@
> - ๐ ๊ฒฌ์ ์
> - ๐ฏ ๋ฆฌ๋ทฐ
-|๋ถ๋ฅ|๊ธฐ๋ฅ1|๊ธฐ๋ฅ2|
-|------|------|---|
-|ํฌํธํด๋ฆฌ์ค| ![ํฌํธํด๋ฆฌ์ค ์กฐํ](https://github.com/Step3-kakao-tech-campus/Team5_BE/assets/84652886/add60899-8a8f-433f-9ca0-dd68d22970cb) | ![ํฌํธํด๋ฆฌ์ค ๋ฑ๋ก](https://github.com/Step3-kakao-tech-campus/Team5_BE/assets/84652886/65bad53a-0916-40fe-9e3b-7f001034c890) |
-| | โข ํ๋๋๊ฐ ๋ฑ๋กํ ์ ๋ณด, ์ด๋ฏธ์ง, ๋ฆฌ๋ทฐ ๋ฑ ์กฐํ
โข ๊ฒ์๊ณผ ํํฐ๋ง
โข ๋ฉค๋ฒ์ญ ์ฌ์ฉ์ - ์ง๋ ๊ณ์ฝ ์ ๋ณด(์งํ ๊ฐ๊ฒฉ, ์
์ฒด ๋ฑ) ์กฐํ
โข ์ฐํ๊ธฐ | โข ํ๋๋์ ์๊ฐ, ๊ฐ๊ฒฉ ๋ฑ์ ์ ๋ณด๋ฅผ ๋ฑ๋ก
โข ์์ ๋ฐ ์ญ์ |
-|์ฑํ
์๋ด| ![์ฑํ
์๋ด](https://github.com/Step3-kakao-tech-campus/Team5_BE/assets/84652886/5741cb65-a3ff-4260-954d-be354dc25964)| |
-|๊ฒฌ์ ์| ![์๋น ๋ถ๋ถ ๊ฒฌ์ ์](https://github.com/Step3-kakao-tech-campus/Team5_BE/assets/84652886/20fbc800-3808-4e73-a545-63356b9ff47c) | ![ํ๋๋ ๊ฒฌ์ ์](https://github.com/Step3-kakao-tech-campus/Team5_BE/assets/84652886/764d33a5-e988-4667-9329-ccbc245169df) |
-| | โข ๊ฒฌ์ ์ ์ ์ฒด ๋ฆฌ์คํธ ์กฐํ
โข ๊ฒฌ์ ์ ๋งค์นญ๋ณ ๋ฆฌ์คํธ ์กฐํ
โข ๋งค์นญ ํ์ | โข ๊ฒฌ์ ์ ๋ฑ๋ก, ์์ , ์ญ์
โข ๊ฒฌ์ ์ 1๊ฐ ํ์ |
-| ๋ฆฌ๋ทฐ | ![๋ฆฌ๋ทฐ](https://github.com/Step3-kakao-tech-campus/Team5_BE/assets/84652886/7e4d7927-9f1d-4468-b062-b598f80cb84b) | |
-| | โข ๋ฆฌ๋ทฐ ์ ์ฒด ๋ฆฌ์คํธ ์กฐํ
โข ๋ฆฌ๋ทฐ ํ๋๋๋ณ ๋ฆฌ์คํธ ์กฐํ
โข ๋ฆฌ๋ทฐ ์์ธ ์กฐํ
โข ๋ฑ๋ก ์์ ์ญ์ | |
+| ํฌํธํด๋ฆฌ์ค ํ์ | ๊ฒ์ ๋ฐ ํํฐ๋ง |
+| --------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
+| | |
+| โข ํ๋๋๊ฐ ๋ฑ๋กํ ์ ๋ณด, ์ด๋ฏธ์ง, ๋ฆฌ๋ทฐ ๋ฑ ์กฐํ
โข ๋ฉค๋ฒ์ญ ์ฌ์ฉ์ - ์ด์ ๊ณ์ฝ ์ ๋ณด(๊ฐ๊ฒฉ, ์
์ฒด ๋ฑ) ์กฐํ
| โข ์ง์ญ๊ณผ ๊ฐ๊ฒฉ ๋ฑ ํํฐ๋ง ์กฐ๊ฑด ์ค์
โข ํ๋๋ ์ด๋ฆ ๊ฒ์ |
+
+| ์ฑํ
์ ์ก | ์ฑํ
์๋ต |
+| ---------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
+| | |
+| โข ์ด๋ฏธ์ง ์ ์ก | โข ์ฝ์ ์ ๋ฌด ํ์
โข ์ ์ฝ์ ๋ฉ์์ง ๊ฐ์ ํ์ |
+
+| ํฌํธํด๋ฆฌ์ค ์์ฑ / ์์ | ๊ฒฌ์ ์ ์์ฑ / ์์ |
+| --------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
+| | |
+| โข ํ๋๋์ ์๊ฐ, ๊ฐ๊ฒฉ ๋ฑ์ ์ ๋ณด๋ฅผ ๋ฑ๋ก
โข ์์ ๋ฐ ์ญ์ | โข ๊ฒฌ์ ์ ํญ๋ชฉ์ ๋ํ ์ ๋ณด ๋ฑ๋ก
โข ์์ ๋ฐ ์ญ์ |
+| ๋ฆฌ๋ทฐ ์์ฑ / ์์ | ๋ฆฌ๋ทฐ ์กฐํ |
+| --------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
+| | |
+| โข ํ๋๋์ ๋ณ์ ๋ฐ ํ๊ธฐ ๋ฑ๋ก
โข ์์ ๋ฐ ์ญ์ | โข ํด๋น ํ๋๋์ ๋ฆฌ๋ทฐ ์กฐํ |
+
+| ๊ฒฐ์ | ์ฐํ๊ธฐ |
+| --------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
+| | |
+| โข ํ ์ค ํ์ด๋จผ์ธ ์ฐ๋
โข ๊ฒฐ์ ์น์ธ & ์ ์ ๋ฑ๊ธ ์
๊ทธ๋ ์ด๋ | โข ์ฐํ๊ธฐ ๋ฑ๋ก ๋ฐ ์ญ์
โข ์ฐํ๊ธฐ ๋ชจ์๋ณด๊ธฐ |
## ๋งํฌ ๋ชจ์
-| ๊ธฐํ | ๋์์ธ | ๊ฐ๋ฐ | ๋ฐฐํฌ |
-|------|-------|-------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------|
-| [๋
ธ์
](https://unmarred-belief-362.notion.site/f11783c42731479ca1f6c9a97a738324?pvs=4) | [์์ด์ดํ๋ ์](https://www.figma.com/file/Wcz9d59GIQqwTEAfIEmRly/SUNSU-WEDDING?type=design&node-id=0%3A1&mode=design&t=5PnD2GPs3WktbNNy-1) | [๋ฐฑ์๋ ๊นํ๋ธ](https://github.com/Step3-kakao-tech-campus/Team5_BE) | [ํ๋ก ํธ ๋ฐฐํฌ ์ฃผ์](https://k5c1813d97f50a.user-app.krampoline.com/) |
-| [๊ธฐํ์ PPT](https://www.figma.com/file/A81sCNiwoLUfSe5aqXEHXr/%EC%B9%B4%ED%85%8C%EC%BA%A0-5%EC%A1%B0---%EA%B8%B0%ED%9A%8D%EC%95%88?type=design&node-id=972-145&mode=design&t=QdcoBgtPZi631myk-0) | | [ERD](https://www.erdcloud.com/d/fww6HRj7oXL9cdp5t) | [๋ฐฑ์๋ / ํ์คํ ๋ฐฐํฌ ์ฃผ์](https://k0b2de7d86228a.user-app.krampoline.com/) |
-| [Survey](https://unmarred-belief-362.notion.site/Survey-a4c9ba9b8114456f88faa61b33f232c9) | | [API ๋ฌธ์](https://unmarred-belief-362.notion.site/6fd74038970941a2ad02df0045705095?v=545b8da990c74661b2b6b560009766ff) | |
-| | | [ํ
์คํธ ์๋๋ฆฌ์ค ๋ช
์ธ์](https://unmarred-belief-362.notion.site/FE-93d000ab86f44dcf8ea1c99d8d0b1fa4?pvs=4) | [์ ํ๋ธ](https://youtu.be/WfDcwd8AQNQ) |
-| | | [ํ
์คํธ ๊ฒฐ๊ณผ ๋ณด๊ณ ์](https://unmarred-belief-362.notion.site/FE-abc1a99b7e14459ea5e8ee25957a3053?pvs=4) | |
+| ๊ธฐํ | ๋์์ธ | ๊ฐ๋ฐ | ๋ฐฐํฌ |
+|------|-------|------|------|
+| [๋
ธ์
](https://unmarred-belief-362.notion.site/f11783c42731479ca1f6c9a97a738324?pvs=4) | [์์ด์ดํ๋ ์](https://www.figma.com/file/Wcz9d59GIQqwTEAfIEmRly/SUNSU-WEDDING?type=design&node-id=0%3A1&mode=design&t=5PnD2GPs3WktbNNy-1) | [ํ๋ก ํธ ๊นํ๋ธ](https://github.com/Step3-kakao-tech-campus/Team5_FE) | [ํ์คํ ๋ฐฐํฌ ์ฃผ์ - ํ์ฌ ๋์ X](https://k6f3d3b1a0696a.user-app.krampoline.com) |
+| [๊ธฐํ์ PPT](https://www.figma.com/file/A81sCNiwoLUfSe5aqXEHXr/%EC%B9%B4%ED%85%8C%EC%BA%A0-5%EC%A1%B0---%EA%B8%B0%ED%9A%8D%EC%95%88?type=design&node-id=972-145&mode=design&t=QdcoBgtPZi631myk-0) | | [ERD](https://www.erdcloud.com/d/fww6HRj7oXL9cdp5t) | [ํ๋ก ํธ ํ
์คํธ์ฉ ๋ฐฐํฌ ์ฃผ์ - ํ์ฌ ๋์ X](https://k5c1813d97f50a.user-app.krampoline.com/)
+| [Survey](https://unmarred-belief-362.notion.site/Survey-a4c9ba9b8114456f88faa61b33f232c9) | | [API ๋ฌธ์](https://unmarred-belief-362.notion.site/6fd74038970941a2ad02df0045705095?v=545b8da990c74661b2b6b560009766ff) | |
+| | | [ํ
์คํธ ์๋๋ฆฌ์ค ๋ช
์ธ์](https://unmarred-belief-362.notion.site/BE-3d4e69e38d6a498d8f9e790945660790?pvs=4) | |
+| | | [ํ
์คํธ ๊ฒฐ๊ณผ ๋ณด๊ณ ์](https://unmarred-belief-362.notion.site/BE-d5eade6a1d6f4bed9933eebd5899b6a8?pvs=4) | |
+
@@ -98,7 +114,51 @@
![ERD](https://github.com/Step3-kakao-tech-campus/Team5_BE/assets/84652886/2f6cf5f5-64d5-4a89-9b84-a9f552b9cc6d)
## API ๋ชจ์๋ณด๊ธฐ
-
+
+|์ด๋ฆ|url|์ฌ์ฉ์|๋ฉ์๋|
+|:--|:--|:----|:-----|
+|//ํ์//||||
+|๐ค ํ์๊ฐ์
| /api/user/signup| `๊ณตํต` |`POST`|
+|๐ค ๋ก๊ทธ์ธ| /api/user/login |`๊ณตํต` |`POST`|
+|๐ค ์ ์ ์ ๋ณด ์กฐํ| /api/user/info | `๊ณตํต` |`GET`|
+|๐ค ํ ํฐ ๊ฐฑ์ | /api/user/token |`๊ณตํต` | `POST` |
+|๐ค ํ์ํํด| /api/user |`๊ณตํต`| `DELETE`|
+|// ์ด๋ฉ์ผ // ||||
+|โ๏ธ ์ด๋ฉ์ผ ์ธ์ฆ ์ฝ๋ ์ ์ก| /api/mail |`๊ณตํต` |`POST`|
+|โ๏ธ ์ด๋ฉ์ผ ์ธ์ฆ ์ฝ๋ ๊ฒ์ฆ| /api/mail/verify| `๊ณตํต`| `POST`|
+|// ๊ฒฐ์ // ||||
+|๐ณ ๊ฒฐ์ ๋ฐ์ดํฐ ์ ์ฅ| /api/payment/save| `๊ณตํต`| `POST`|
+|๐ณ ๊ฒฐ์ ์น์ธ ๋ฐ ์
๊ทธ๋ ์ด๋| /api/payment/approve| `๊ณตํต`| `POST` |
+|// ํฌํธํด๋ฆฌ์ค // ||||
+|โ๏ธ ๊ฒ์๊ธ ๋ฆฌ์คํธ ์กฐํ| /api/portfolio?cursor={nextCursor} |`๊ณตํต`| `GET`|
+|โ๏ธ๋ณธ์ธ ๊ฒ์๊ธ ์กฐํ(ํ๋๋)| /api/portfolio/self| `์จ๋ฉ ํ๋๋`| `GET`|
+|โ๏ธ์์ธ ๊ฒ์๊ธ ์กฐํ| /api/portfolio/{portfolio_id} | `๊ณตํต`| `GET`|
+|โ๏ธ๊ฒ์๊ธ ๋ฑ๋ก| /api/portfolio |`์จ๋ฉ ํ๋๋` |`POST`|
+|โ๏ธ๊ฒ์๊ธ ์์ |/api/portfolio |`์จ๋ฉ ํ๋๋`| `PUT`|
+|โ๏ธ๊ฒ์๊ธ ์ญ์ | /api/portfolio |`์จ๋ฉ ํ๋๋`| `DELETE`|
+|// ์ฑํ
// ||||
+|๐จ๏ธ ์ฑํ
๋ฐฉ ์์ฑํ๊ธฐ| /api/chat |`์๋น ๋ถ๋ถ` |`POST`|
+|// ๋งค์นญ // ||||
+|๐ ๋งค์นญ ํ์ (๊ฒฌ์ ์ ์ ์ฒด ํ์ )| /api/match/confirm?chatId={chatId} |`์๋น ๋ถ๋ถ`| `POST`|
+|๐ ๋ฆฌ๋ทฐ ์์ฑ ๊ฐ๋ฅํ ๋งค์นญ ์กฐํ| /api/match/review |`์๋น ๋ถ๋ถ`| `GET`|
+|// ๊ฒฌ์ ์ // ||||
+|๐ ๊ฒฌ์ ์ ์ ์ฒด ๋ฆฌ์คํธ ์กฐํ| /api/quotation/all?page={page} |`๊ณตํต` |`GET`|
+|๐ ๊ฒฌ์ ์ ๋งค์นญ๋ณ ๋ฆฌ์คํธ ์กฐํ |/api/quotation?chatId={chatId}| `๊ณตํต` |`GET`|
+|๐ ๊ฒฌ์ ์ ๋ฑ๋ก| /api/quotation?chatId={chatId}| `์จ๋ฉ ํ๋๋` `POST`|
+|๐ ๊ฒฌ์ ์ ์์ | /api/quotation/{quotationId}?chatId={chatId}| `์จ๋ฉ ํ๋๋` |`PUT`|
+|๐ ๊ฒฌ์ ์ 1๊ฐ ํ์ |/api/quotation/confirm/{quotationId}?chatId={chatId} |`์จ๋ฉ ํ๋๋`| `POST`|
+|๐ ๊ฒฌ์ ์ ์ญ์ | /api/quotation/{quotationId} |`์จ๋ฉ ํ๋๋`| `DELETE`|
+|// ๋ฆฌ๋ทฐ // ||||
+|๐ฏ ๋ฆฌ๋ทฐ ์ ์ฒด ๋ฆฌ์คํธ ์กฐํ |/api/review/all |`์๋น ๋ถ๋ถ`|`GET`|
+|๐ฏ ๋ฆฌ๋ทฐ ํ๋๋๋ณ ๋ฆฌ์คํธ ์กฐํ |/api/review?plannerId={plannerId}&page={page} |`๊ณตํต`| `GET`|
+|๐ฏ ๋ฆฌ๋ทฐ ์์ธ ์กฐํ| /api/review/{reviewId} |`์๋น ๋ถ๋ถ` |`GET`|
+|๐ฏ ๋ฆฌ๋ทฐ ๋ฑ๋ก| /api/review?chatId={chatId} |`์๋น ๋ถ๋ถ`|`POST`|
+|๐ฏ ๋ฆฌ๋ทฐ ์์ | /api/review/{reviewId}| `์๋น ๋ถ๋ถ`| `PUT`|
+|๐ฏ ๋ฆฌ๋ทฐ ์ญ์ |/api/review/{reviewId} |`์๋น ๋ถ๋ถ`| `DELETE`|
+|// ์ฐํ๊ธฐ // ||||
+|โค๏ธ ์ฐ ์ ์ฒด ๋ฆฌ์คํธ ์กฐํ | /api/favorite?page={page} |`๊ณตํต`| `GET`|
+|โค๏ธ ์ฐ ๋ฑ๋กํ๊ธฐ |/api/favorite/{portfolioId} |`๊ณตํต`| `POST`|
+|โค๏ธ ์ฐ ์ญ์ ํ๊ธฐ |/api/favorite/{portfolioId}| `๊ณตํต` |`DELETE`|
## ํ์ผ ๊ตฌ์กฐ
```
@@ -149,6 +209,17 @@
โโโโ๐_core
```
+ํด๋ ๋ด๋ถ ๊ตฌ์กฐ
+```
+- Entity.java
+- DTOConverter.java
+- JPARepository.java
+- Request.java
+- Response.java
+- RestController.java
+- Service.java
+- ServiceImpl.java
+```
## ์์ ๊ฐ์ด๋
@@ -176,10 +247,263 @@ java -jar sunsu-wedding-0.0.1-SNAPSHOT.jar
## ๊ธฐ์ ์คํ
-![๊ธฐ์ ์คํ)](https://github.com/Step3-kakao-tech-campus/Team5_BE/assets/84652886/1710fc38-9fc3-44d1-b9f9-e2893129eda1)
+![๊ธฐ์ ์คํ](https://github.com/Step3-kakao-tech-campus/Team5_BE/assets/84652886/62444da9-f45d-4c7a-a046-449da0445592)
+
+
+
+## ๊ฐ๋ฐ ์ฃผ์์
+
+### ๐ฅ๏ธ ์ฝ๋ ์ปจ๋ฒค์
+
+**๋ค์ด๋ฐ ๊ท์น**
+> - ํด๋ ์ด๋ฆ: ์๋ฌธ์
+> - ํ์ผ๋ช
, ๋ณ์๋ช
, ๋ฉ์๋๋ช
: `CamelCase`
+> - ์ํฐํฐ์ ํ๋๋ค์: `snake_case`
+> - ์์: `UPPER_CASE`
+> - ํ
์ด๋ธ ์ด๋ฆ: `snake_case_tb`
+> - CRUD ๋ค์ด๋ฐ ํต์ผ (์์ฑ โ `save` / ์กฐํ โ `find` / ์์ โ `update` / ์ญ์ โ `delete`)
+
+**์ฝ๋**
+> - `record` ์ฌ์ฉํ๊ธฐ, `DTOConverter`์์ Entity -> DTO๋ก ๋ณํํ๊ธฐ
+> - `Annotation` ์์ ์ค์ : ํด๋์ค โ ํ๋ โ ์์ฑ์ โ ๋ฉ์๋
+> - Class ์ ์ฒด์ `@Transactional(readOnly = true)`๋ฅผ ์ฌ์ฉํ๊ณ ํ์ํ ๋ฉ์๋์ `@Transactional` ์ฌ์ฉํ๊ธฐ
+> - ์ํ, ๋ฑ๊ธ ๋ฑ constantํ ๊ฐ์ ๊ฐ์ง๊ณ ์๋ ๋ด์ฉ์ `enum` ํ์
์ผ๋ก ๋ถ๋ฆฌํ๊ธฐ
+> - DB๋ฅผ ์๋ชป ์ญ์ ํ๋ ๊ฑธ ๋ฐฉ์งํ๊ธฐ ์ํด์ ๊ฐ table๋ง๋ค `is_active` ํ๋๋ฅผ ํตํด `SQLDelete`ํ์ฉํ๊ธฐ
+
+**ํ
์คํธ**
+> - Assertions.assertThat, assertThrows๋ `static import`ํ๊ธฐ
+> - RepositoryTest๋ `DummyEntity`์์ ์์ฑํด์, ControllerTest๋ `teardown.sql`์์ ๊ฐ์ ธ์์ ํ
์คํธ ํ๊ธฐ
+> - `logResult()` ํจ์๋ฅผ ๋ฐ๋ก ๋นผ์ ์ค๋ณต ์ฝ๋ ์ค์ด๊ธฐ
+
+
+
+### ๐ค ์ ์ ๋ณ ๊ธฐ๋ฅ ์ ๊ทผ ์ ํ
+1๏ธ. ๋ก๊ทธ์ธ ์ ๋ฌด์ ๋ฐ๋ฅธ ๊ธฐ๋ฅ ์ ๊ทผ ์ ํ - `401 UnAuthorized`
+
+|๋ก๊ทธ์ธ ํ์ X|๐ค ํ์ |ํ์๊ฐ์
, ๋ก๊ทธ์ธ |
+|:-------------|:-------|:------------------|
+||โ๏ธ ๋ฉ์ผ|์ธ์ฆ ์ฝ๋ ์ ์ก, ๊ฒ์ฆ|
+||โ๏ธ ํฌํธํด๋ฆฌ์ค| ๋ฆฌ์คํธ ์กฐํ, ์์ธ ์กฐํ|
+|๋ก๊ทธ์ธ ํ์ O| ๐ค ํ์| ํ์ํํด, ์ ์ ์ ๋ณด ์กฐํ, ํ ํฐ ๊ฐฑ์ |
+|| ๐ณ ๊ฒฐ์ | ๊ฒฐ์ ๋ฐ์ดํฐ ์ ์ฅ, ๊ฒฐ์ ์น์ธ ๋ฐ ์
๊ทธ๋ ์ด๋|
+|| โ๏ธ ํฌํธํด๋ฆฌ์ค| ๋ณธ์ธ ๊ฒ์๊ธ ์กฐํ, ๋ฑ๋ก, ์์ , ์ญ์ |
+|| ๐จ๏ธ ์ฑํ
| ์ฑํ
๋ฐฉ ์์ฑ|
+|| ๐ ๋งค์นญ| ๋งค์นญ ํ์ , ๋ฆฌ๋ทฐ ์์ฑ ๊ฐ๋ฅํ ๋งค์นญ ์กฐํ|
+|| ๐ ๊ฒฌ์ ์| ์ ์ฒด ๋ฆฌ์คํธ ์กฐํ, ๋งค์นญ๋ณ ๋ฆฌ์คํธ ์กฐํ, ๊ฒฌ์ ์ ๋ฑ๋ก, ์์ , ์ญ์ , 1๊ฐ ํ์ |
+|| ๐ฏ ๋ฆฌ๋ทฐ| ์ ์ฒด ๋ฆฌ์คํธ ์กฐํ, ํ๋๋๋ณ ๋ฆฌ๋ทฐ ์กฐํ, ์์ธ ์กฐํ, ๋ฑ๋ก, ์์ , ์ญ์ |
+|| โค๏ธ ์ฐํ๊ธฐ| ์ฐ๋ฆฌ์คํธ ์กฐํ, ๋ฑ๋ก, ์ญ์ |
+
+
+
+2๏ธ. ์ฌ์ฉ์ role์ ๋ฐ๋ฅธ ๊ธฐ๋ฅ ์ ๊ทผ ์ ํ - `403 Forbidden`
+|๊ณตํต|๐ค ํ์ |ํ์๊ฐ์
, ๋ก๊ทธ์ธ, ์ ์ ์ ๋ณด ์กฐํ, ํ ํฐ ๊ฐฑ์ , ํ์ ํํด |
+|:-------------|:-------|:------------------|
+|| โ๏ธ ๋ฉ์ผ| ์ธ์ฆ ์ฝ๋ ์ ์ก, ๊ฒ์ฆ|
+|| ๐ณ ๊ฒฐ์ | ๊ฒฐ์ ๋ฐ์ดํฐ ์ ์ฅ, ๊ฒฐ์ ์น์ธ ๋ฐ ์
๊ทธ๋ ์ด๋|
+|| โ๏ธ ํฌํธํด๋ฆฌ์ค| ๋ฆฌ์คํธ ์กฐํ, ์์ธ ์กฐํ|
+|| ๐ ๊ฒฌ์ ์| ์ ์ฒด ๋ฆฌ์คํธ ์กฐํ, ๋งค์นญ๋ณ ๋ฆฌ์คํธ ์กฐํ|
+|| ๐ฏ ๋ฆฌ๋ทฐ| ํ๋๋๋ณ ๋ฆฌ๋ทฐ ์กฐํ|
+|| โค๏ธ ์ฐํ๊ธฐ| ์ฐ๋ฆฌ์คํธ ์กฐํ, ๋ฑ๋ก, ์ญ์ |
+|ํ๋๋ | โ๏ธ ํฌํธํด๋ฆฌ์ค| ๋ณธ์ธ ๊ฒ์๊ธ ์กฐํ, ๋ฑ๋ก, ์์ , ์ญ์ |
+|| ๐ ๊ฒฌ์ ์| ๊ฒฌ์ ์ ๋ฑ๋ก, ์์ , ์ญ์ , 1๊ฐ ํ์ |
+|| ๐จ๏ธ ์ฑํ
| ์ฑํ
๋ฐฉ ์์ฑ|
+|| ๐ ๋งค์นญ| ๋งค์นญ ํ์ , ๋ฆฌ๋ทฐ ์์ฑ ๊ฐ๋ฅํ ๋งค์นญ ์กฐํ|
+|์๋น ๋ถ๋ถ| ๐จ๏ธ ์ฑํ
| ์ฑํ
๋ฐฉ ์์ฑ|
+|| ๐ ๋งค์นญ| ๋งค์นญ ํ์ , ๋ฆฌ๋ทฐ ์์ฑ ๊ฐ๋ฅํ ๋งค์นญ ์กฐํ|
+|| ๐ฏ ๋ฆฌ๋ทฐ| ์ ์ฒด ๋ฆฌ์คํธ ์กฐํ, ์์ธ ์กฐํ, ๋ฑ๋ก, ์์ , ์ญ์ |
+
+
+
+### โป๏ธ Access, Refresh Token
+
+๐ช **JWT ๋์
**
+
+์ ์ ์ ๋ณด ์ธ์ฆ์ ์ํด ****JWT๋ฅผ ๋์
ํ์์ต๋๋ค. ๋ฐ๋ผ์ ์ ์ ๋ access token์ ๊ฐ์ง๊ณ ์ธ์ฆ์ ์งํํ๊ฒ ๋ฉ๋๋ค. ์ด๋, access token์ API๋ฅผ ์์ฒญํ ๋๋ง๋ค ํค๋์ ์ถ๊ฐํ์ฌ ์ ์ก๋๊ธฐ ๋๋ฌธ์ ๋คํธ์ํฌ์์ ๋ง์ด ๋
ธ์ถ๋๊ณ , ํ์ทจ๋ ํ๋ฅ ๋ ๋์ต๋๋ค.
+
+๊ทธ๋ฆฌ๊ณ ์ ์ ๊ฐ ๋ก๊ทธ์ธ์ ์์ฃผํ๋ ๋ถํธํจ ์์ด ์ค๋ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ํ ํฐ์ ์ ํจ๊ธฐ๊ฐ์ด ๊ธธ์ด์ผ ํฉ๋๋ค. ํ์ง๋ง ๊ธธ๊ฒ ์ค์ ํ๋ฉด, ํ์ทจ๋นํ ํ ํฐ์ผ๋ก ํด์ปค๋ ์ค๋ ๊ธฐ๊ฐ๋์ ์ ์ ์ ์ ๋ณด๋ฅผ ์ด์ฉํ ์ ์๊ฒ ๋ฉ๋๋ค.
+
+๋ฐ๋ผ์ access token์ ์ ํจ๊ธฐ๊ฐ์ ์งง๊ฒ ๊ฐ์ ธ๊ฐ๋ฉด์ ์๋์ ์ผ๋ก ๊ธฐ๊ฐ์ด ๊ธด refresh token์ ๋์
ํ๊ฒ ๋์์ต๋๋ค.
+
+---
+
+โ
**Refresh Token ๋์
**
+1. ์ ์ ๋ ์ต์ด ๋ก๊ทธ์ธ์ ํ๋ฉด access token, refresh token ๋๊ฐ์ง๋ฅผ ๋ฐ๊ธ๋ฐ์ต๋๋ค.
+2. ์ ์ ๋ access token๋ง์ ๊ฐ์ง๊ณ ์ธ์ฆ์ ์์ฒญํฉ๋๋ค.
+3. access token์ด ๋ง๋ฃ๋๋ฉด, ์๋ฒ์์๋ ํ ํฐ ๋ง๋ฃ ์๋ฌ๋ฅผ ์ ์กํฉ๋๋ค.
+4. ์ด๋ฅผ ๋ฐ์ ํด๋ผ์ด์ธํธ๋ access token๊ณผ refresh token์ ๊ฐ์ง๊ณ ํ ํฐ ์ฌ๋ฐ๊ธ ์์ฒญ์ ํฉ๋๋ค.
+5. ์๋ฒ๋ ๋ ํ ํฐ์ ๋ชจ๋ ์๋ก ๋ฐ๊ธํ๊ณ ์ ์ ๋ ์๋ก ๋ฐ๊ธ๋ฐ์ ๋ ํ ํฐ์ ์ ์ฅ ํ, ๋ค์ access token์ ํตํด ์ธ์ฆ ๊ณผ์ ์ ๊ฑฐ์น๊ฒ ๋ฉ๋๋ค.
+
+๋ณด์์ ๋์ด๊ธฐ ์ํด ํ์ทจ๋นํ๋ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ฏผํด ๋ณด์์ต๋๋ค.
+
+> **a. ๋ฆฌํ๋ ์ ํ ํฐ๋ง ํ์ทจ๋นํ ๊ฒฝ์ฐ**
+> - ํ ํฐ ์ฌ๋ฐ๊ธ์ ํ ๋, ์ด์ ์ ๋ฐ๊ธํ๋ access token, refresh token ๋๊ฐ๋ฅผ ๋ชจ๋ ์ฌ์ฉํด์ผ ์ฌ๋ฐ๊ธ์ด ๊ฐ๋ฅํ๋๋ก ์ค๊ณํ์ต๋๋ค. ๋ฐ๋ผ์ ๋ ์ค ํ๋์ ํ ํฐ๋ง์ ํ์ทจํ๋ค๋ฉด, ์ฌ๋ฐ๊ธ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค.
+> - ๋ฆฌํ๋ ์ ํ ํฐ๋ง ์กด์ฌํ๋ฉด ์ธ์ฆ๋ ๋ถ๊ฐ๋ฅํ๋๋ก ์ค๊ณํ์ต๋๋ค. ๋ฐ๋ผ์ ๋ฆฌํ๋ ์ ํ ํฐ๋ง์ ๊ฐ์ง๊ณ ์๋ค๋ฉด, ํด์ปค๋ ์ธ์ฆ์ ์งํํ ์ ์์ ๊ฒ์
๋๋ค.
+>
+> **b. ๋ชจ๋ ํ ํฐ์ด ํ์ทจ๋นํ ๊ฒฝ์ฐ**
+> - ๋จผ์ access token์ ์ ํจ์๊ฐ์ด ๋จ์์๋ค๋ฉด, ์ฌ๋ฐ๊ธ์ ๋ฐ์ ์ ์๋๋ก ์ค๊ณํ์ต๋๋ค.
+> - ๋ง์ฝ ๋ง๋ฃ ์๊ฐ์ ๋ง์ถ์ด ํด์ปค๊ฐ ์ฌ๋ฐ๊ธ์ ํ๋ค๋ฉด, ์๋ฒ์ ์ ์ฅ๋์ด ์๋ ํ ํฐ ์๊ณผ ์ ์ ์ ์ ๊ฐ ์ฌ๋ฐ๊ธ์ ์์ฒญํ ํ ํฐ ์์ด ๋ค๋ฅผ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ ์ ์ ์ ๋ ์ฌ๋ก๊ทธ์ธ์ ํตํด ์๋ก์ด ํ ํฐ ์์ ๋ฐ๊ธ๋ฐ์ต๋๋ค. ์ฌ๋ฐ๊ธ์ ๋ฐ๊ฒ ๋๋ฉด, ํด์ปค์ ํ ํฐ์ด ํ๊ธฐ๋๊ณ ์ ์ ๋ ์ ์์ ์ผ๋ก ๋ค์ ์ด์ฉ์ด ๊ฐ๋ฅํด์ง๋๋ค. ํด์ปค๋ ์ ํจํ์ง ์์ ํ ํฐ์์ ๊ฐ์ง๊ณ ์์ผ๋ฏ๋ก ์ฌ์ธ์ฆ ๋ฐ ์ฌ๋ฐ๊ธ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค.
+>
+> **c. ๋ก๊ทธ์ธ ์ ์๋ก์ด JWT ๋ฐ๊ธ**
+> - ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋ ํ ํฐ ์ ๋ณด๋ฅผ ๋ค์ ์ค๋ค๋ฉด, ํด์ปค๋ ํ์ด๋ฐ๋ง ๋ง์ถ๋ค๋ฉด ๋ฌดํ์ ํดํน์ด ๊ฐ๋ฅํด์ง๋๋ค. ๋ฐ๋ผ์ ๋ก๊ทธ์ธ์ ํ ๊ฒฝ์ฐ, ๊ธฐ์กด ํ ํฐ ์ ๋ณด๋ฅผ ์ญ์ ํ ์๋ก์ด ํ ํฐ ์ ๋ณด๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๋๋ก ์ค๊ณํ์ต๋๋ค.
+>
+> **d. ์ฌ๋ฐ๊ธ ์ ๋ชจ๋ ํ ํฐ์ ์๋ก ๋ฐ๊ธ**
+> - ๋ฆฌํ๋ ์ ํ ํฐ ๋ํ ์ฌ๋ฐ๊ธ์ ์์ฃผ ๋ฐ๊ฒ ๋๋ค๋ฉด ๋คํธ์ํฌ์ ์์ฐ์ค๋ฝ๊ฒ ๋ง์ด ๋
ธ์ถ๋ฉ๋๋ค. ๋ฐ๋ผ์ ํ ํฐ์ ์ฌ๋ฐ๊ธํ ๋, access token ๋ฐ refresh token ๋ ๋ค ์๋ก ๋ฐ๊ธํ๋๋ก ์ค๊ณํ์ต๋๋ค.
+
+### โ๏ธ ์ด๋ฉ์ผ ๊ฒ์ฆ
+์ ์ ์ด๋ฉ์ผ์ด ์ ํจํ์ง ๊ฒ์ฆ์ ํ ํ์๊ฐ ์์ต๋๋ค. ํ์ง ์์ ๊ฒฝ์ฐ, ์ ์ ๋ ์กด์ฌํ์ง ์๋ ๊ฐ์์ ์ด๋ฉ์ผ๋ค์ ๋ฌดํ์ ๋ง๋ค์ด ๋ผ ์ ์์ต๋๋ค. ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํ์ฌ ํ์๊ฐ์
์ ํ ์ด๋ฉ์ผ๋ก ์ธ์ฆ ์ฝ๋๋ฅผ ๋ฐ์ก, ํด๋น ์ธ์ฆ์ฝ๋๋ฅผ ์
๋ ฅํด์ผ๋ง ๊ฐ์
ํ ์ ์๋๋ก ์ค๊ณํ์ต๋๋ค.
+
+ํ์ง๋ง ํฌ๋จํด๋ฆฐ ๋ด๋ถ ์ ์ฑ
์ผ๋ก ์ธํ SMTP ํ๋กํ ์ฝ ์ฌ์ฉ ๋ถ๊ฐ๋ก ์ด๋ฉ์ผ ๋ฐ์ก์ ์ ์ธํ๊ณ ํ
์คํธ ์ฝ๋๋ก ๊ฒ์ฆํ๋๋ก ๋์ฒดํ์์ต๋๋ค.
+
+
+
+### ๐ณ ํ ์ค ํ์ด๋จผ์ธ ์ ์ฐ๊ฒฐ
+
+> ์์ ๋ฉค๋ฒ์ญ ๊ฒฐ์ ํ ์ ์ ๋ฑ๊ธ ์
๊ทธ๋ ์ด๋๋ฅผ ํ๊ธฐ ์ํด ํ ์ค ํ์ด๋จผ์ธ ์ ์ฐ๋์ ์งํํ์ต๋๋ค. (๊ฒฐ์ + ์
๊ทธ๋ ์ด๋)๋ฅผ atomicํ๊ฒ ์ฒ๋ฆฌํ์ฌ **๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ**์ ๋ณด์ฅํ์์ต๋๋ค. ์ ์ฒด ๋ก์ง์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
+
+- ๊ฒฐ์ ์์ฒญ์ ์ํ ๋ฐ์ดํฐ ์ ์ฅ
+ - orderId์ amount๋ฅผ Payment ํ
์ด๋ธ์ ์ ์ฅํฉ๋๋ค.
+- ๊ฒฐ์ ์น์ธ ์์ฒญ ๋ฐ ์
๊ทธ๋ ์ด๋
+ 1. ๊ฒ์ฆ: ์ด์ ์ ์ ์ฅํ ๋ฐ์ดํฐ์ ํ์ฌ request๋ก ๋ฐ์ ๋ฐ์ดํฐ ๋น๊ต
+ 2. ํ ์ค ํ์ด๋จผ์ธ ์น์ธ์์ฒญ: paymentKey, orderId, amount ๋ฐ์ดํฐ๋ฅผ ๋ด์ ํ ์คํ์ด๋จผ์ธ ๋ก ์น์ธ ์์ฒญ์ ๋ณด๋
๋๋ค.
+ 3. ์น์ธ ์์ฒญ์ ์ฑ๊ณตํ๋ฉด ์ ์ ๋ฑ๊ธ์ NORMAL โ PREMIUM์ผ๋ก ์
๊ทธ๋ ์ด๋ํ๊ณ ๊ฒฐ์ ์๊ฐ์ ์ ์ฅํฉ๋๋ค.
+
+
+
+### โ CORS ์ค์
+> ๋ฐฑ์๋ ์๋ฒ๋ก ๋ค์ด์ค๋ ๋ชจ๋ ์์ฒญ์ ๋ํด ์ ์ค์ ์ ์ ์ฉํ์์ต๋๋ค.
+- `GET`, `POST`, `PUT`, `DELETE` ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ 4๊ฐ์ง HTTP methods๋ฅผ ํ์ฉํ์์ต๋๋ค.
+- ๋ฐฐํฌ ํ๊ฒฝ์์ ํ๋ก ํธ ์๋์์ ํต์ ์ localhost์ 3000๋ฒ ํฌํธ๋ฅผ ํตํด ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์ `localhost:3000` ํฌํธ๋ง์ ํต์ ๋ง ํ์ฉํ์์ต๋๋ค.
+- JWT ํ ํฐ์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ์ก์ธ์ค ํ ํฐ์ ์ํ `Authorization` ํค๋, ๋ฆฌํ๋ ์ ํ ํฐ์ ์ํ `Refresh` ํค๋๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ ํค๋๋ฅผ ํด๋ผ์ด์ธํธ์์ ์ด๋ ๊ฐ๋ฅํ๋๋ก ์์ ํ์ต๋๋ค.
+- `Authorization` ํค๋๋ฅผ ํตํด ์ ์ ์ธ์ฆ์ ์งํํ๊ณ ์๊ธฐ ๋๋ฌธ์ `setAllowCredentials` ์ต์
์ `true`๋ก ํ์ฑํํ์ต๋๋ค.
+
+
+
+### โ SQLDelete
+
+
+์ ํฌ ํ
์ด๋ธ ๊ตฌ์กฐ๋ ๋งค์นญ๋ด์ญ์ ํ๋๋์ ์๋น ๋ถ๋ถ๊ฐ ํจ๊ป ๋ค์ด๊ฐ ์๋ ํํ์
๋๋ค. ์ด ๊ฒฝ์ฐ ์๋น ๋ถ๋ถ๊ฐ ํํดํ๋ฉด ์จ๋ฉ ํ๋๋๊ฐ ๊ฒฌ์ ์ ๋ฑ ์ฐ๊ด๋ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ ํฌ๋ ํฌํธํด๋ฆฌ์ค ์กฐํ์์๋ ํ๋๋์ ์ด์ ๊ฑฐ๋ ๋ด์ญ์ ์กฐํํ๊ธฐ ์ํด ๊ฒฌ์ ์ ๋ด์ฉ์ ๊ฐ์ ธ์์ผ ํ๊ธฐ ๋๋ฌธ์ Hard Delete ๋ฅผ ํ๊ฒ๋๋ฉด ์กฐํ๊ฐ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
+
+์ค๋ฌด์์ is_active์ ๊ฐ์ ์ํ๊ฐ์ ํ์ธํ ์ ์๋ ํ๋๋ฅผ ๋ง๋ค์ด SQL Delete๋ฅผ ์ฌ์ฉํ๋ค๋ ๋ฉํ ๋์ ์กฐ์ธ์ ๋ฃ๊ณ ์ ์ , ๋งค์นญ, ๊ฒฌ์ ์ ๋ฑ์์ ํ์ฑํ ์ ๋ฌด ๋ฑ์ ๊ด๋ฆฌํ๋๋ก ํ์์ต๋๋ค.
+
+๋ํ ํฌํธํด๋ฆฌ์ค๋ฅผ ํ๋๋๊ฐ ์ค์๋ก ์ญ์ ํ๊ฑฐ๋ ๊ฒฌ์ ์ ๋ฑ ์ค์ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ ๊ฒฝ์ฐ ๋ด์ฉ์ ๋ค์ ๋ณต๊ตฌํ ์ ์๋๋ก ํ์์ต๋๋ค.
+
+
+
+### โ๏ธ ํ๊ฒฝ ๋ณ์ ์ธํ
+> ์ ํฌ github์ ์ฌ๋ผ๊ฐ ์ฝ๋๋ฅผ ๋ ์์ ํ๊ฒ ๊ด๋ฆฌํ๊ธฐ ์ํด์ ๋ค์ ๋ด์ฉ์ ํ๊ฒฝ๋ณ์๋ก ๋ถ๋ฆฌํด์ ๊ด๋ฆฌํ๊ณ ์์ต๋๋ค.
+> - `EMAIL_TEST_CODE`(์ด๋ฉ์ผ ์ธ์ฆ ์ฝ๋)
+> - `SENDER`(์ด๋ฉ์ผ ์ ์ก ๊ณ์ ์ด๋ฉ์ผ)
+> - `GMAIL_PASSWORD`(์ด๋ฉ์ผ ์ ์ก ๊ณ์ ๋น๋ฐ๋ฒํธ)
+> - `TOSS_PAYMENT_SECRET`(ํ ์ค ํ์ด๋จผ์ธ ์ํฌ๋ฆฟํค)
+> - `JWT_ACCESS_SECRET`(accessํ ํฐ ์ํฌ๋ฆฟ ํค)
+> - `JWT_REFRESH_SECRET`(refreshํ ํฐ ์ํฌ๋ฆฟํค)
+
+
+
+## ์ฑ๋ฅ ์ต์ ํ
+
+### โก N๋ฒ์ Insert Query โ JDBC Batch Update
+
+์จ๋ฉ ํ๋๋๊ฐ ์์ฑํ ํฌํธํด๋ฆฌ์ค์ ํฌํธํด๋ฆฌ์ค์ ํฌํจ๋ ์ด๋ฏธ์ง, ๊ฐ๊ฒฉ ํญ๋ชฉ & ์๋น ๋ถ๋ถ๊ฐ ์์ฑํ ๋ฆฌ๋ทฐ์ ๋ฆฌ๋ทฐ์ ํฌํจ๋ ์ด๋ฏธ์ง ํญ๋ชฉ์๋ ์๋ก 1๋ N์ ๊ด๊ณ๊ฐ ์ฑ๋ฆฝํฉ๋๋ค.
+
+๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ํฌํธํด๋ฆฌ์ค ๋ฑ๋ก ์ํฉ์ด ๋ฐ์ํ๋ฉด ์๋ฒ์์๋ DB์ โํฌํธํด๋ฆฌ์คโ ํ
์ด๋ธ๊ณผ โํฌํธํด๋ฆฌ์ค ์ด๋ฏธ์งโ ํ
์ด๋ธ, โํฌํธํด๋ฆฌ์ค ๊ฐ๊ฒฉโ ํ
์ด๋ธ์ ์ ๊ทผํด์ผ ํฉ๋๋ค.
+
+์๋ฅผ ๋ค์ด, ์ฌ์ฉ์๊ฐ ํฌํธํด๋ฆฌ์ค๋ฅผ ๋ฑ๋กํ ๋ ์ด๋ฏธ์ง 4๊ฐ, ๊ฐ๊ฒฉ ํญ๋ชฉ 3๊ฐ๋ฅผ ์ถ๊ฐํ๋ฉด โํฌํธํด๋ฆฌ์คโ ํ
์ด๋ธ์ 1๊ฐ์ ๋ ์ฝ๋, โํฌํธํด๋ฆฌ์ค ์ด๋ฏธ์งโ ํ
์ด๋ธ์ 4๊ฐ์ ๋ ์ฝ๋, โํฌํธํด๋ฆฌ์ค ๊ฐ๊ฒฉโ ํ
์ด๋ธ์ 3๊ฐ์ ๋ ์ฝ๋๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
+
+**(1) JPA**
+
+ํ์ง๋ง ์ด ๋์์ JPA๋ก ์ํํ๋ฉด ์ด 8๊ฐ์ INSERT Query๊ฐ ๋ฐ์ํฉ๋๋ค.
+
+```sql
+INSERT INTO portfolio_tb VALUES (?,?,?,default);
+INSERT INTO portfolio_imageitem_tb VALUES (?,?,?,default);
+INSERT INTO portfolio_imageitem_tb VALUES (?,?,?,default);
+INSERT INTO portfolio_imageitem_tb VALUES (?,?,?,default);
+INSERT INTO portfolio_imageitem_tb VALUES (?,?,?,default);
+INSERT INTO portfolio_priceitem_tb VALUES (?,?,?,default);
+INSERT INTO portfolio_priceitem_tb VALUES (?,?,?,default);
+INSERT INTO portfolio_priceitem_tb VALUES (?,?,?,default);
+```
+
+
+์๋ํ๋ฉด JPA๋ ๊ธฐ๋ณธ์ ์ผ๋ก Batch Insert๊ฐ ๋นํ์ฑํ๋์ด ์๊ธฐ ๋๋ฌธ์
๋๋ค.
+
+```sql
+spring.jpa.properties.hibernate.order_inserts=true
+spring.jpa.properties.hibernate.order_updates=true
+spring.jpa.properties.hibernate.jdbc.batch_size=50
+```
+
+> ํ์ง๋ง ์์ ๊ฐ์ด Spring ์ค์ ๊ฐ๋ค์ ๋ณ๊ฒฝํด์ฃผ์ด๋ ์ฌ์ ํ ๋์ํ์ง ์์ต๋๋ค.
+>
+> ๊ทธ ์ด์ ๋ ๋ค์ Hibernate์ [๊ณต์ ๋ฌธ์](https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#batch-session-batch-insert)์๋ ๋์์๋ ๊ฒ์ฒ๋ผ JPA Entity์์ Primary Key์ GenerationType์ IDENTITY๋ก ์ค์ ํ ๊ฒฝ์ฐ์ Hibernate๊ฐ JDBC batch๋ฅผ ๋นํ์ฑํ์์ผ ๋ฒ๋ฆฌ๊ธฐ ๋๋ฌธ์
๋๋ค.
+>
+> ๊ทธ ์ด์ ๋ ์๋ก ํ ๋นํ Key ๊ฐ์ ๋ฏธ๋ฆฌ ์ ์ ์๋ IDENTITY ๋ฐฉ์์ ์ฌ์ฉํ ๋ Batch Support๋ฅผ ์ง์ํ๋ฉด Hibernate๊ฐ ์ฑํํ flush ๋ฐฉ์์ธ โTransactional Write Behindโ์ ์ถฉ๋์ด ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ด๋ผ๊ณ ํฉ๋๋ค.
+>
+> ๋ฐ๋ผ์ ๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๋ IDENTITY ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด Batch Insert๋ ๋์ํ์ง ์์ต๋๋ค.
+
+---
+
+**(2) JDBC Template**
+
+๊ทธ๋ ๋ค๊ณ ๋ค์ํ ์ด์ ์ด ์๋ IDENTITY ๋ฐฉ์์ ๋ณ๊ฒฝํ ์๋ ์๊ธฐ ๋๋ฌธ์ JdbcTemplate์์ Batch๋ฅผ ์ง์ํ๋ `batchUpdate` ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ํ์ต๋๋ค.
+
+```sql
+@Repository
+public class PortfolioImageItemJDBCRepositoryImpl implements PortfolioImageItemJDBCRepository {
+
+ private final JdbcTemplate jdbcTemplate;
+
+ ...
+ jdbcTemplate.batchUpdate(sql, portfolioImageItems, portfolioImageItems.size(), pss);
+
+ ...
+```
+
+์์ ๊ฐ์ด `batchUpdate`๋ฅผ ์ฌ์ฉํ๋ฉด Multi Value ํํ๋ก ์์ฑ๋ SQL Batch Insert๋ฌธ์ ์คํ์ํฌ ์ ์์ต๋๋ค.
+
+```prolog
+o.s.jdbc.core.JdbcTemplate : Executing SQL batch update [INSERT INTO portfolio_imageitem_tb ... ]
+o.s.jdbc.core.JdbcTemplate : Executing prepared SQL statement [INSERT INTO portfolio_imageitem_tb ... ]
+...
+o.s.jdbc.core.JdbcTemplate : Executing SQL batch update [INSERT INTO portfolio_priceitem_tb ... ]
+o.s.jdbc.core.JdbcTemplate : Executing prepared SQL statement [INSERT INTO portfolio_priceitem_tb ... ]
+```
+
+๊ฒฐ๊ณผ์ ์ผ๋ก Batch Insert๋ฌธ์ ์ฌ์ฉํ๊ฒ ๋๋ฉด ํ
์ด๋ธ๋ง๋ค ํ๋์ฉ ์ด 3๊ฐ์ ์ฟผ๋ฆฌ๊ฐ ์คํ๋ฉ๋๋ค.
+
+---
+
+(3) ๐ณ๏ธ ๊ฒฐ๋ก
+
+๊ตฌํ ํ ํ
์คํธ๋ฅผ ํด๋ณด์์ ๋,
+
+Batch Insert๋ฅผ ์ฌ์ฉํ์ง ์๊ณ JPA๋ก **1๋ง ๊ฑด์ ๋ฐ์ดํฐ**๋ฅผ ์ฝ์
ํ์ ๋ ์ฝ 30์ด(31263ms)์ ์๊ฐ์ด ์์๋์์ง๋ง,
+
+Batch Insert๋ฅผ ์ฌ์ฉํ๋ 935ms๋ก ์ํ ์๊ฐ์ด ๋ถ๊ณผ 1์ด๋ ๋์ง ์๋ ํผํฌ๋จผ์ค๋ฅผ ๋ณด์ฌ์ฃผ์์ต๋๋ค. **์ฝ 30๋ฐฐ ์ด์์ ์์ฒญ๋ ์ฑ๋ฅ ์ฐจ์ด**๋ฅผ ๋ณด์ด๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
+
+JDBC batchUpdate๋ ์์ (Update) ์์ฒญ ์์๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์ ์ฉํ์์ผ๋ฉฐ,
+
+์ด๋ฅผ ํตํด, ์๋น์ค ๊ณผ์ ์์ ํ๊บผ๋ฒ์ ์์ฒญ ๋ฐ๋ ๋ฐ์ดํฐ์ ํญ๋ชฉ ์๊ฐ ๋์ด๋๋ ์์ ์ ์ธ Response ์๊ฐ์ ํ๋ณดํ๋ฉฐ ํจ๊ณผ์ ์ผ๋ก ์ ๋์ฒํ ์ ์์ ๊ฒ์ผ๋ก ๊ธฐ๋ํฉ๋๋ค.
+### โ๏ธ ์ธ๋ฑ์ค
+
+> ์ ํฌ ํ๋ก์ ํธ์ ๊ถ๊ทน์ ์ธ ๋ชฉ์ ์ ์ ๋ณด ๊ณต์ ์ ์์ต๋๋ค. ๋ค๋ฅธ ์ฌ๋๋ค์ ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํด์ ํฉ๋ฆฌ์ ์ธ ์์ฌ๊ฒฐ์ ์ ๋ด๋ฆฌ๋ ๊ฒ์ ์ด์ ์ด ์๊ธฐ ๋๋ฌธ์, ์ฝ์
๋ฐ ์์ ์ ๋นํด ์กฐํ ์์ฒญ์ ๋น์จ์ด ์๋์ ์ผ๋ก ๋์ต๋๋ค. ๋ฐ๋ผ์ ์กฐํ ์ฑ๋ฅ์ ๋์ด๊ธฐ ์ํด ํ
์ด๋ธ์ ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐํ์ต๋๋ค.
+
+- `user_tb` : ์ ์ ํ
์ด๋ธ์ ๊ฒฝ์ฐ, ๊ฐ์ฅ ๋น๋ฒํ๊ฒ ๋ฐ์ํ๋ ์กฐํ ์ฟผ๋ฆฌ๋ ์ ์ ์ธ์ฆ ์์ ๋ฐ์ํ๋ email์ ํตํ ์ํฐํฐ ์กฐํ์
๋๋ค. ๋ฐ๋ผ์ email ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐํ์ต๋๋ค.
+- `token_tb` : ํ ํฐ์ ์ ์ ์์ด๋์ ํด๋นํ๋ ํ ํฐ์ ์กฐํํ๋ ๊ฒฝ์ฐ๊ฐ ์ ๋ถ์
๋๋ค. ๋ฐ๋ผ์ ์ธ๋ฑ์ค๋ก user_id๋ฅผ ์ถ๊ฐํ์ต๋๋ค.
+- `email_code_tb` : ์ด๋ฉ์ผ ์ธ์ฆ์ฝ๋์ ๊ฒฝ์ฐ, ์ด๋ฉ์ผ๋ก ์กฐํํ๋ ๊ฒฝ์ฐ ๋ฟ์
๋๋ค. ๋ฐ๋ผ์ email์ ์ธ๋ฑ์ค๋ก ์ถ๊ฐํ์ต๋๋ค.
+- `quotation_tb` : match_id ํน์ ์ ์ ์์ด๋๋ก ์กฐํํ๋ ๊ฒฝ์ฐ๊ฐ ๋๋ถ๋ถ์
๋๋ค. ๋ฐ๋ผ์ match_id๋ฅผ ์ธ๋ฑ์ค๋ก ์ถ๊ฐํ์ต๋๋ค. ์ ์ ์์ด๋๋ก์ ์กฐํ๋ Match ํ
์ด๋ธ์ด๋ฏ๋ก ์ถ๊ฐํ์ง ์์์ต๋๋ค.
+- `portfolio_tb` : ๋๋ถ๋ถ์ ๊ฒฝ์ฐ๊ฐ ํ๋๋๋ฅผ ์ด์ฉํ ์กฐํ์
๋๋ค. ๋ฐ๋ผ์ planner_id๋ฅผ ์ธ๋ฑ์ค๋ก ์ถ๊ฐํ์ต๋๋ค.
+- `portfolio_price_item_tb` , `portfolio_image_item_tb` : ํฌํธํด๋ฆฌ์ค๋ฅผ ํตํ ์กฐํ๊ฐ ์ ๋ถ์ด๊ธฐ ๋๋ฌธ๋ฐ, portoflio_id๋ฅผ ์ธ๋ฑ์ค๋ก ์ถ๊ฐํ์ต๋๋ค.
+- `payment_tb` : ์ ์ ์์ด๋๋ฅผ ์ด์ฉํ ์กฐํ๊ฐ ์ ๋ถ์ด๊ธฐ ๋๋ฌธ์ user_id๋ฅผ ์ธ๋ฑ์ค๋ก ์ถ๊ฐํ์ต๋๋ค.
+- `match_tb` : ํ๋๋, ์ปคํ, ํ๋๋์ ์ปคํ 3๊ฐ์ง ๊ฒฝ์ฐ๋ก ์กฐํ๋ฅผ ์๋ํฉ๋๋ค. ํ์ง๋ง couple์ ์ด์ฉํ ์กฐํ๊ฐ ๋๋ค์ ์ด๊ณ , ๋งค์นญ๋ด์ญ ์์ฑ์ ์ํ ํ๋๋์ ์ปคํ ๋ชจ๋๋ฅผ ์ฌ์ฉํ ์กฐํ๊ฐ ๋ค์์
๋๋ค. ํ๋๋๋ง์ ์ด์ฉํ ์กฐํ๋ ๋น๋ฒํ๊ฒ ๋ฐ์ํ์ง ์์ต๋๋ค. ๋ฐ๋ผ์ planner_id์ couple_id๋ฅผ ๋ณตํฉํค๋ก ์ธ๋ฑ์ค ์ค์ ์ ํ๊ณ , couple_id๋ฅผ ์์ ๋ฐฐ์นํ์์ต๋๋ค.
+- `favorite_tb` : ์ ์ ์์ด๋๋ฅผ ์ด์ฉํ ์กฐํ๊ฐ ์ ๋ถ์
๋๋ค. ํฌํธํด๋ฆฌ์ค๋ ํ์ํ ๊ฒฝ์ฐ๊ฐ ์์ง๋ง, ์ ์ ์์ด๋๋ง ์ด์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ์๋์ ์ด๋ผ๊ณ ํ๋จ๋์ด user_id๋ง ์ธ๋ฑ์ค๋ก ์ถ๊ฐํ์ต๋๋ค.
+- `chat_tb` : ์ฑํ
ํ
์ด๋ธ์ ๋ค๋ฅธ ํ
์ด๋ธ์์ joinํ์ฌ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋๋ถ๋ถ์
๋๋ค. ๊ทธ๋ ๊ธฐ์ id๋ง์ผ๋ก ์ถฉ๋ถํ๊ธฐ ๋๋ฌธ์, ์ถ๊ฐ์ ์ธ ์ธ๋ฑ์ค๋ฅผ ์ค์ ํ์ง ์์์ต๋๋ค.
+
+
## License
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
diff --git "a/sunsu-wedding/docs/\352\262\260\355\230\274\354\244\200\353\271\204 \354\233\271\354\202\254\354\235\264\355\212\270 Survey.pdf" "b/sunsu-wedding/docs/\352\262\260\355\230\274\354\244\200\353\271\204 \354\233\271\354\202\254\354\235\264\355\212\270 Survey.pdf"
new file mode 100644
index 0000000..5a55851
Binary files /dev/null and "b/sunsu-wedding/docs/\352\262\260\355\230\274\354\244\200\353\271\204 \354\233\271\354\202\254\354\235\264\355\212\270 Survey.pdf" differ
diff --git "a/sunsu-wedding/docs/\354\210\234\354\210\230\354\233\250\353\224\251-\352\270\260\355\232\215\354\225\210\353\260\234\355\221\234.pdf" "b/sunsu-wedding/docs/\354\210\234\354\210\230\354\233\250\353\224\251-\352\270\260\355\232\215\354\225\210\353\260\234\355\221\234.pdf"
new file mode 100644
index 0000000..f31635c
Binary files /dev/null and "b/sunsu-wedding/docs/\354\210\234\354\210\230\354\233\250\353\224\251-\352\270\260\355\232\215\354\225\210\353\260\234\355\221\234.pdf" differ
diff --git "a/sunsu-wedding/docs/\354\210\234\354\210\230\354\233\250\353\224\251-\354\265\234\354\242\205\353\260\234\355\221\234.pptx" "b/sunsu-wedding/docs/\354\210\234\354\210\230\354\233\250\353\224\251-\354\265\234\354\242\205\353\260\234\355\221\234.pptx"
new file mode 100644
index 0000000..d2d93a2
Binary files /dev/null and "b/sunsu-wedding/docs/\354\210\234\354\210\230\354\233\250\353\224\251-\354\265\234\354\242\205\353\260\234\355\221\234.pptx" differ
diff --git "a/sunsu-wedding/docs/\354\213\234\354\227\260\354\230\201\354\203\201-\355\216\270\354\247\221\353\263\270.mp4" "b/sunsu-wedding/docs/\354\213\234\354\227\260\354\230\201\354\203\201-\355\216\270\354\247\221\353\263\270.mp4"
new file mode 100644
index 0000000..c09d16f
Binary files /dev/null and "b/sunsu-wedding/docs/\354\213\234\354\227\260\354\230\201\354\203\201-\355\216\270\354\247\221\353\263\270.mp4" differ
diff --git "a/sunsu-wedding/docs/\355\205\214\354\212\244\355\212\270 \352\262\260\352\263\274 \353\263\264\352\263\240\354\204\234(BE).pdf" "b/sunsu-wedding/docs/\355\205\214\354\212\244\355\212\270 \352\262\260\352\263\274 \353\263\264\352\263\240\354\204\234(BE).pdf"
new file mode 100644
index 0000000..1691d34
Binary files /dev/null and "b/sunsu-wedding/docs/\355\205\214\354\212\244\355\212\270 \352\262\260\352\263\274 \353\263\264\352\263\240\354\204\234(BE).pdf" differ
diff --git "a/sunsu-wedding/docs/\355\205\214\354\212\244\355\212\270 \354\213\234\353\202\230\353\246\254\354\230\244 \353\263\264\352\263\240\354\204\234(BE).pdf" "b/sunsu-wedding/docs/\355\205\214\354\212\244\355\212\270 \354\213\234\353\202\230\353\246\254\354\230\244 \353\263\264\352\263\240\354\204\234(BE).pdf"
new file mode 100644
index 0000000..e221b08
Binary files /dev/null and "b/sunsu-wedding/docs/\355\205\214\354\212\244\355\212\270 \354\213\234\353\202\230\353\246\254\354\230\244 \353\263\264\352\263\240\354\204\234(BE).pdf" differ