# SSAFAST Project
## ๐Ÿ‘ช ๊ฐœ๋ฐœ ๋ฉค๋ฒ„ ์†Œ๊ฐœ


๐Ÿ‘‘ ์ด์ˆ˜๋ จ
(Back-End)



๐Ÿ˜† ๋ฏผ์ดˆํ˜„
(Back-End)



๐Ÿ˜ถ ์ž„์„ฑ๋ฏผ
(Back-End)



๐Ÿ™„ ๊ถŒ์šฉ์žฌ
(Front">
# SSAFAST Project
## ๐Ÿ‘ช ๊ฐœ๋ฐœ ๋ฉค๋ฒ„ ์†Œ๊ฐœ


๐Ÿ‘‘ ์ด์ˆ˜๋ จ
(Back-End)



๐Ÿ˜† ๋ฏผ์ดˆํ˜„
(Back-End)



๐Ÿ˜ถ ์ž„์„ฑ๋ฏผ
(Back-End)



๐Ÿ™„ ๊ถŒ์šฉ์žฌ
(Front">
# SSAFAST Project
## ๐Ÿ‘ช ๊ฐœ๋ฐœ ๋ฉค๋ฒ„ ์†Œ๊ฐœ


๐Ÿ‘‘ ์ด์ˆ˜๋ จ
(Back-End)



๐Ÿ˜† ๋ฏผ์ดˆํ˜„
(Back-End)



๐Ÿ˜ถ ์ž„์„ฑ๋ฏผ
(Back-End)



๐Ÿ™„ ๊ถŒ์šฉ์žฌ
(Front">
<div align="center">
	 <img src="<https://github.com/angly97/DoLearnDoLearn/assets/70613905/8ef87700-4a2b-42f0-982b-4a8dd4f594b8>" width="50%"/>
</div>

<br/>

# SSAFAST Project

<br>

## ๐Ÿ‘ช ๊ฐœ๋ฐœ ๋ฉค๋ฒ„ ์†Œ๊ฐœ

<table> <tr> <td height="140px" align="center"> <a href="<https://github.com/dolpongg>"> <img src="<https://avatars.githubusercontent.com/u/96533697?v=4>" width="140px" /> <br><br> ๐Ÿ‘‘ ์ด์ˆ˜๋ จ <br>(Back-End) </a> <br></td> <td height="140px" align="center"> <a href="<https://github.com/xswaqz>"> <img src="<https://avatars.githubusercontent.com/u/70613905?v=4>" width="140px" /> <br><br> ๐Ÿ˜† ๋ฏผ์ดˆํ˜„ <br>(Back-End) </a> <br></td> <td height="140px" align="center"> <a href="<https://github.com/mickeyshoes>"> <img src="<https://avatars.githubusercontent.com/u/49228132?v=4"width="140px>" /> <br><br> ๐Ÿ˜ถ ์ž„์„ฑ๋ฏผ <br>(Back-End) </a> <br></td> <td height="140px" align="center"> <a href="<https://github.com/YongjaeKwon>"> <img src="<https://avatars.githubusercontent.com/u/109266749?v=4>" width="140px" /> <br><br> ๐Ÿ™„ ๊ถŒ์šฉ์žฌ <br>(Front-End) </a> <br></td> <td height="140px" align="center"> <a href="<https://github.com/moxnox63>"> <img src="<https://avatars.githubusercontent.com/u/71482583?v=4>" width="140px" /> <br><br> ๐Ÿ˜ ์žฅ์—„์ง€ <br>(Front-End) </a> <br></td> <td height="140px" align="center"> <a href="<https://github.com/HanKyeon>"> <img src="<https://avatars.githubusercontent.com/u/109321867?v=4>" width="140px" /> <br><br> ๐Ÿ™‚ ํ•œ๊ธฐํ˜„ <br>(Front-End) </a> <br></td> </tr> 
<tr> <td align="center">OverloadTest<br/>Workspace<br/>Figma<br/>APISpec<br/>GCP<br/>GCP SDK<br/>Spring Boot<br/>JPA<br/>MySQL<br/>Redis<br/>
<td align="center">CI/CD<br/>UsecaseTest<br/>APIExec<br/>Auth<br/>Member<br/>JavaPoet<br/>SpringSecurity<br/>Spring Boot<br/>JPA<br/>MySQL<br/>MongoDB<br/>Redis</td> 
<td align="center">APISpec<br/>DtoSpec<br/>Spring Boot<br/>JPA<br/>MySQL<br/>MongoDB</td>
<td align="center">UI/UX<br/>NextJS<br/>React<br/>ReactHookForm<br/>Typescript<br/>Redux<br/>Tailwind<br/></td>
<td align="center">UI/UX<br/>NextJS<br/>React<br/>Typescript<br/>Redux<br/>ReduxTookKit<br/>Tailwind<br/></td>
<td align="center">NextJS<br/>React<br/>Typescript<br/>ReactQuery<br/>Redux<br/>ReduxTookKit<br/>Tailwind<br/>FigmaAPI<br/>Y.JS<br/></td></tr> </table>

<br />

## ๐Ÿ“† ํ”„๋กœ์ ํŠธ ๊ธฐ๊ฐ„

### 23.04.10. ~ 23.05.19

- ๊ธฐํš ๋ฐ ์„ค๊ณ„ : 23.04.10 ~ 23.04.24
- ํ”„๋กœ์ ํŠธ ๊ตฌํ˜„ : 23.04.24 ~ 23.05.18
- ๋ฒ„๊ทธ ์ˆ˜์ • ๋ฐ ์‚ฐ์ถœ๋ฌผ ์ •๋ฆฌ : 23.05.15 ~ 23.05.18

<br />

## ๐Ÿ’ก ์„œ๋น„์Šค ์†Œ๊ฐœ

### SSAFAST

> ํ”„๋กœ์ ํŠธ ์„ค๊ณ„ใ†ํ…Œ์ŠคํŠธ ๋‹จ๊ณ„์—์„œ์˜ ๋” ๋†’์€ ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜์„ ์œ„ํ•œ ์˜คํ”ˆ์†Œ์Šค<br /><br />Figma, Notion, Postman, Swagger, Locust ๋“ฑ<br /> ์ˆ˜๋งŽ์€ ๊ฐœ๋ฐœ ํ”Œ๋žซํผ์˜ ์ด๋™์„ ์ตœ์†Œํ™”ํ•จ์œผ๋กœ์จ, ์—…๋ฌด ์ง‘์ค‘๋ ฅ์„ ๋†’์ž…๋‹ˆ๋‹ค!<br /><br />๊ฐœ๋ฐœ์ž๋“ค์ด ํ”„๋กœ์ ํŠธ์— ์ฐธ์—ฌํ•˜๋ฉฐ ๋А๋‚„ ์ˆ˜ ์žˆ๋Š” ํฌ๊ณ  ์ž‘์€ ๋ถˆํŽธํ•จ์„ ํ•ด์†Œํ•˜๊ณ ์ž ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

### ๋ถˆํŽธํ•จ์„ ํ•ด์†Œํ•˜์—ฌ ๊ฐœ๋ฐœ ์†๋„๋ฅผ ๋”์šฑ ๋น ๋ฅด๊ฒŒ, SSAFAST

<br/>

## ๐Ÿ› ๏ธ ๊ธฐ์ˆ  ์Šคํƒ

#### Front

<img src="<https://img.shields.io/badge/Next.js-000000?style=for-the-badge&logo=Next.js&logoColor=white>" style="height : auto; margin-left : 10px; margin-right : 10px;"/><img src="<https://img.shields.io/badge/React-61DAFB?style=for-the-badge&logo=React&logoColor=black>" style="height : auto; margin-left : 10px; margin-right : 10px;"/><img src="<https://img.shields.io/badge/Typescript-3178C6?style=for-the-badge&logo=Typescript&logoColor=white>" style="height : auto; margin-left : 10px; margin-right : 10px;"/><img src="<https://img.shields.io/badge/ReactQuery-FF4154?style=for-the-badge&logo=React%20Query&logoColor=white>" style="height : auto; margin-left : 10px; margin-right : 10px;"/><img src="<https://img.shields.io/badge/React> Hook Form-EC5990?style=for-the-badge&logo=React-hook-form&logoColor=white" style="height : auto; margin-left : 10px; margin-right : 10px;"/><img src="<https://img.shields.io/badge/Tailwind-06B6D4?style=for-the-badge&logo=Tailwind%20CSS&logoColor=white>" style="height : auto; margin-left : 10px; margin-right : 10px;"/><img src="<https://img.shields.io/badge/Redux-764ABC?style=for-the-badge&logo=Redux&logoColor=white>" style="height : auto; margin-left : 10px; margin-right : 10px;"/><img src="<https://img.shields.io/badge/Reduxtoolkit-764ABC?style=for-the-badge&logo=Redux&logoColor=white>" style="height : auto; margin-left : 10px; margin-right : 10px;"/><img src="<https://img.shields.io/badge/Axios-5A29E4?style=for-the-badge&logo=Axios&logoColor=white>" style="height : auto; margin-left : 10px; margin-right : 10px;"/><img src="<https://img.shields.io/badge/Y.JS-7FEB7E?style=for-the-badge&logo=yjs&logoColor=white>" style="height : auto; margin-left : 10px; margin-right : 10px;"/>

#### Back

<img src="<https://img.shields.io/badge/Java-007396?style=for-the-badge&logo=Java&logoColor=#007396>" style="height : auto; margin-left : 10px; margin-right : 10px;"/> <img src="<https://img.shields.io/badge/Spring> Boot-6DB33F?style=for-the-badge&logo=Spring Boot&logoColor=white" style="height : auto; margin-left : 10px; margin-right : 10px;"/> <img src="<https://img.shields.io/badge/Spring> Security-6DB33F?style=for-the-badge&logo=Spring Security&logoColor=white" style="height : auto; margin-left : 10px; margin-right : 10px;"/> <img src="<https://img.shields.io/badge/JSON> Web Tokens-000000?style=for-the-badge&logo=JSON Web Tokens&logoColor=white" style="height : auto; margin-left : 10px; margin-right : 10px;"/> <br/> <img src="<https://img.shields.io/badge/MongoDB-FFEEEEE?style=for-the-badge&logo=MongoDB&logoColor=white>" style="height : auto; margin-left : 10px; margin-right : 10px;"/> <img src="<https://img.shields.io/badge/Redis-000000?style=for-the-badge&logo=Redis&logoColor=white>" style="height : auto; margin-left : 10px; margin-right : 10px;"/> <img src="<https://img.shields.io/badge/MySQL-4479A1?style=for-the-badge&logo=mysql&logoColor=white>" style="height : auto; margin-left : 10px; margin-right : 10px;"/><img src="<https://img.shields.io/badge/GCP> SDK-BBBBBB?style=for-the-badge&logo=GCPSDK&logoColor=white" style="height : auto; margin-left : 10px; margin-right : 10px;"/> <img src="<https://img.shields.io/badge/OAuth2-2496ED?style=for-the-badge&logo=OAuth2&logoColor=white>" style="height : auto; margin-left : 10px; margin-right : 10px;"/> <img src="<https://img.shields.io/badge/GCP-2496ED?style=for-the-badge&logo=Ubuntu&logoColor=white>" style="height : auto; margin-left : 10px; margin-right : 10px;"/><img src="<https://img.shields.io/badge/Gradle-02303A?style=for-the-badge&logo=Gradle&logoColor=white>" style="height : auto; margin-left : 10px; margin-right : 10px;"/>

#### CI/CD
<img src="<https://img.shields.io/badge/Nginx-009639?style=for-the-badge&logo=NGINX&logoColor=white>" style="height : auto; margin-left : 10px; margin-right : 10px;"/> <img src="<https://img.shields.io/badge/Docker-2496ED?style=for-the-badge&logo=Docker&logoColor=white>" style="height : auto; margin-left : 10px; margin-right : 10px;"/> <img src="<https://img.shields.io/badge/Jenkins-D24939?style=for-the-badge&logo=Jenkins&logoColor=white>" style="height : auto; margin-left : 10px; margin-right : 10px;"/>

#### ๊ธฐํƒ€

<img src="<https://img.shields.io/badge/Java> Poet-E25A1C?style=for-the-badge&logo=JavaPoet&logoColor=white" style="height : auto; margin-left : 10px; margin-right : 10px;"/> <img src="<https://img.shields.io/badge/Vegeta-3776AB?style=for-the-badge&logo=Vegeta&logoColor=white>" style="height : auto; margin-left : 10px; margin-right : 10px;"/> 

#### ํ˜‘์—… ํˆด

<img src="<https://img.shields.io/badge/Jira-0052CC?style=for-the-badge&logo=Jira&logoColor=white>" style="height : auto; margin-left : 10px; margin-right : 10px;"/> <img src="<https://img.shields.io/badge/GitLab-FC6D26?style=for-the-badge&logo=GitLab&logoColor=white>" style="height : auto; margin-left : 10px; margin-right : 10px;"/> <img src="<https://img.shields.io/badge/Mattermost-0058CC?style=for-the-badge&logo=Mattermost&logoColor=white>" style="height : auto; margin-left : 10px; margin-right : 10px;"/>

<details><summary> <b> ์ƒ์„ธ ๊ธฐ์ˆ ์Šคํƒ ๋ฐ ๋ฒ„์ „</b> </summary>

| ๊ตฌ๋ถ„     | ๊ธฐ์ˆ ์Šคํƒ                   | ์ƒ์„ธ๋‚ด์šฉ                   | ๋ฒ„์ „      |
| -------- | -------------------------- | -------------------------- | --------- |
| ๊ณตํ†ต     | Gitlab                     | ํ˜•์ƒ๊ด€๋ฆฌ                   | \\-        |
|          | Jira                       | ์ด์Šˆ๊ด€๋ฆฌ                   | \\-        |
|          | Mattermost, Notion         | ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜               | \\-        |
| BackEnd  | MySQL                      | DBMS                       | 8.0.21    |
|          | MongoDB                   |DBMS, DataBase               | 6.0.5     |
|          | Java                       | OpenJDK                    | 1.8.0_362 |
|          | Spring Boot                | Java Server Framework      | 2.7.6     |
|          | Spring Security            |                            | \\-        |
|          | JPA                        |                            | \\-        |
|          | IntelliJ                   | IDE                        | \\-        |
|          | Java Poet                  | Code Generator             | 1.13.0     |
|          | OAuth2                     |                            | 2.6.2     |
|          | Vegeta                     | ๋ถ€ํ•˜ํ…Œ์ŠคํŠธ ์˜คํ”ˆ์†Œ์Šค         | 8.0.0    |
|          | Redis                      | ์ธ๋ฉ”๋ชจ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค       | 7.0.11   |
|          | Gradle                     | Build                     | 7.6.1     |
| FrontEnd | Next.JS                    | ํ”„๋ก ํŠธ ํ”„๋ ˆ์ž„์›Œํฌ         | 13.3.0        |
|          | React                      |                            | 18.0.35        |
|          | Typescript                 |                            | 5.0.4        |
|          | ReactQuery               | ์„œ๋ฒ„ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ       | 0.17.6    |
|          | React Hook Form         | ํผ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ          | 7.43.9     |
|          | Redux ToolKit                 | ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ | 1.9.3     |
|          | Tailwind                    | CSS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ     | 3.3.1       |
|          | axios                      | API ํ†ต์‹  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ        | 1.2.3     |
|          | IDE                        | Visual Studio Code         | 1.75.1    |
| Server   | AWS EC2                    | Server                     | \\-        |
|          | Nginx                      |                            | 1.23.3    |
|          | Docker                     |                            | 23.0.1    |
| Test     | test            | Postman              | 10.9.4            |
|          | test            | JUnit5               | \\-                |
|          | test            | Mockito              | \\-                |
|          | test            | Jacoco               | toolVersion 0.8.7 |

</details>

<br />

## ๐Ÿ—‚๏ธ ํ”„๋กœ์ ํŠธ ๊ตฌ์„ฑ

์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜

---

![์•„ํ‚คํ…์ฒ˜](./exec/Architecture.png)

---

์„œ๋น„์Šค ํ๋ฆ„๋„

---

![์„œ๋น„์Šค ํ๋ฆ„๋„](./exec/ServiceFlow.png)

---

<details>
<summary>FE ํด๋” ๊ตฌ์กฐ</summary>

```Plain Text
โ”œโ”€โ”€ components
โ”‚ย ย  โ”œโ”€โ”€ apis
โ”‚ย ย  โ”œโ”€โ”€ canvas
โ”‚ย ย  โ”œโ”€โ”€ common
โ”‚ย ย  โ”œโ”€โ”€ create
โ”‚ย ย  โ”œโ”€โ”€ forms
โ”‚ย ย  โ”œโ”€โ”€ preview
โ”‚ย ย  โ””โ”€โ”€ work
โ”‚ย ย      โ”œโ”€โ”€ APIConnectContainer
โ”‚ย ย      โ”œโ”€โ”€ APIDocsContainer
โ”‚ย ย      โ”‚ย ย  โ””โ”€โ”€ formComponent
โ”‚ย ย      โ”œโ”€โ”€ APIEditContainer
โ”‚ย ย      โ””โ”€โ”€ APITestContainer
โ”‚ย ย          โ””โ”€โ”€ usecase
โ”œโ”€โ”€ hooks
โ”‚ย ย  โ””โ”€โ”€ queries
โ”œโ”€โ”€ nginx
โ”œโ”€โ”€ pages
โ”‚ย ย  โ”œโ”€โ”€ api
โ”‚ย ย  โ””โ”€โ”€ space
โ”‚ย ย      โ””โ”€โ”€ [spaceId]
โ”œโ”€โ”€ public
โ”‚ย ย  โ””โ”€โ”€ assets
โ”‚ย ย      โ”œโ”€โ”€ fonts
โ”‚ย ย      โ””โ”€โ”€ images
โ”œโ”€โ”€ store
โ”œโ”€โ”€ styles
โ””โ”€โ”€ utils

</details> <details> <summary>BE ํด๋” ๊ตฌ์กฐ</summary>

โ”œโ”€โ”€ gradle
โ”‚ย ย  โ””โ”€โ”€ wrapper
โ””โ”€โ”€ src
    โ”œโ”€โ”€ main
    โ”‚ย ย  โ””โ”€โ”€ java
    โ”‚ย ย      โ””โ”€โ”€ com
    โ”‚ย ย          โ””โ”€โ”€ rocket
    โ”‚ย ย              โ””โ”€โ”€ ssafast
    โ”‚ย ย                  โ”œโ”€โ”€ apiexec
    โ”‚ย ย                  โ”‚ย ย  โ”œโ”€โ”€ controller
    โ”‚ย ย                  โ”‚ย ย  โ”œโ”€โ”€ domain
    โ”‚ย ย                  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ document
    โ”‚ย ย                  โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ element
    โ”‚ย ย                  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ entity
    โ”‚ย ย                  โ”‚ย ย  โ”œโ”€โ”€ dto
    โ”‚ย ย                  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ request
    โ”‚ย ย                  โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ element
    โ”‚ย ย                  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ response
    โ”‚ย ย                  โ”‚ย ย  โ”œโ”€โ”€ repository
    โ”‚ย ย                  โ”‚ย ย  โ””โ”€โ”€ service
    โ”‚ย ย                  โ”œโ”€โ”€ apispec
    โ”‚ย ย                  โ”‚ย ย  โ”œโ”€โ”€ controller
    โ”‚ย ย                  โ”‚ย ย  โ”œโ”€โ”€ domain
    โ”‚ย ย                  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ Document
    โ”‚ย ย                  โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ element
    โ”‚ย ย                  โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ temp
    โ”‚ย ย                  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ Entity
    โ”‚ย ย                  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ Enum
    โ”‚ย ย                  โ”‚ย ย  โ”œโ”€โ”€ dto
    โ”‚ย ย                  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ request
    โ”‚ย ย                  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ response
    โ”‚ย ย                  โ”‚ย ย  โ”œโ”€โ”€ repository
    โ”‚ย ย                  โ”‚ย ย  โ””โ”€โ”€ service
    โ”‚ย ย                  โ”œโ”€โ”€ auth
    โ”‚ย ย                  โ”‚ย ย  โ”œโ”€โ”€ controller
    โ”‚ย ย                  โ”‚ย ย  โ”œโ”€โ”€ domain
    โ”‚ย ย                  โ”‚ย ย  โ”œโ”€โ”€ dto
    โ”‚ย ย                  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ request
    โ”‚ย ย                  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ response
    โ”‚ย ย                  โ”‚ย ย  โ”œโ”€โ”€ handler
    โ”‚ย ย                  โ”‚ย ย  โ”œโ”€โ”€ jwt
    โ”‚ย ย                  โ”‚ย ย  โ””โ”€โ”€ service
    โ”‚ย ย                  โ”œโ”€โ”€ config
    โ”‚ย ย                  โ”œโ”€โ”€ dtospec
    โ”‚ย ย                  โ”‚ย ย  โ”œโ”€โ”€ Enum
    โ”‚ย ย                  โ”‚ย ย  โ”œโ”€โ”€ controller
    โ”‚ย ย                  โ”‚ย ย  โ”œโ”€โ”€ domain
    โ”‚ย ย                  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ element
    โ”‚ย ย                  โ”‚ย ย  โ”œโ”€โ”€ dto
    โ”‚ย ย                  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ request
    โ”‚ย ย                  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ response
    โ”‚ย ย                  โ”‚ย ย  โ”œโ”€โ”€ repository
    โ”‚ย ย                  โ”‚ย ย  โ””โ”€โ”€ service
    โ”‚ย ย                  โ”œโ”€โ”€ exception
    โ”‚ย ย                  โ”œโ”€โ”€ figma
    โ”‚ย ย                  โ”‚ย ย  โ”œโ”€โ”€ domain
    โ”‚ย ย                  โ”‚ย ย  โ”œโ”€โ”€ dto
    โ”‚ย ย                  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ request
    โ”‚ย ย                  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ response
    โ”‚ย ย                  โ”‚ย ย  โ”œโ”€โ”€ repository
    โ”‚ย ย                  โ”‚ย ย  โ””โ”€โ”€ service
    โ”‚ย ย                  โ”œโ”€โ”€ member
    โ”‚ย ย                  โ”‚ย ย  โ”œโ”€โ”€ controller
    โ”‚ย ย                  โ”‚ย ย  โ”œโ”€โ”€ domain
    โ”‚ย ย                  โ”‚ย ย  โ”œโ”€โ”€ dto
    โ”‚ย ย                  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ response
    โ”‚ย ย                  โ”‚ย ย  โ”œโ”€โ”€ repository
    โ”‚ย ย                  โ”‚ย ย  โ””โ”€โ”€ service
    โ”‚ย ย                  โ”œโ”€โ”€ overload
    โ”‚ย ย                  โ”‚ย ย  โ”œโ”€โ”€ controller
    โ”‚ย ย                  โ”‚ย ย  โ”œโ”€โ”€ domain
    โ”‚ย ย                  โ”‚ย ย  โ”œโ”€โ”€ dto
    โ”‚ย ย                  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ request
    โ”‚ย ย                  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ response
    โ”‚ย ย                  โ”‚ย ย  โ”œโ”€โ”€ repository
    โ”‚ย ย                  โ”‚ย ย  โ””โ”€โ”€ service
    โ”‚ย ย                  โ”œโ”€โ”€ tmp
    โ”‚ย ย                  โ”‚ย ย  โ”œโ”€โ”€ controller
    โ”‚ย ย                  โ”‚ย ย  โ”œโ”€โ”€ domain
    โ”‚ย ย                  โ”‚ย ย  โ”œโ”€โ”€ dto
    โ”‚ย ย                  โ”‚ย ย  โ”œโ”€โ”€ repository
    โ”‚ย ย                  โ”‚ย ย  โ””โ”€โ”€ service
    โ”‚ย ย                  โ”œโ”€โ”€ usecase
    โ”‚ย ย                  โ”‚ย ย  โ”œโ”€โ”€ controller
    โ”‚ย ย                  โ”‚ย ย  โ”œโ”€โ”€ domain
    โ”‚ย ย                  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ document
    โ”‚ย ย                  โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ element
    โ”‚ย ย                  โ”‚ย ย  โ”‚ย ย  โ”‚ย ย      โ”œโ”€โ”€ request
    โ”‚ย ย                  โ”‚ย ย  โ”‚ย ย  โ”‚ย ย      โ””โ”€โ”€ response
    โ”‚ย ย                  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ entity
    โ”‚ย ย                  โ”‚ย ย  โ”œโ”€โ”€ dto
    โ”‚ย ย                  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ request
    โ”‚ย ย                  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ response
    โ”‚ย ย                  โ”‚ย ย  โ”œโ”€โ”€ repository
    โ”‚ย ย                  โ”‚ย ย  โ””โ”€โ”€ service
    โ”‚ย ย                  โ”œโ”€โ”€ utils
    โ”‚ย ย                  โ””โ”€โ”€ workspace
    โ”‚ย ย                      โ”œโ”€โ”€ controller
    โ”‚ย ย                      โ”œโ”€โ”€ domain
    โ”‚ย ย                      โ”œโ”€โ”€ dto
    โ”‚ย ย                      โ”‚ย ย  โ”œโ”€โ”€ request
    โ”‚ย ย                      โ”‚ย ย  โ””โ”€โ”€ response
    โ”‚ย ย                      โ”œโ”€โ”€ repository
    โ”‚ย ย                      โ””โ”€โ”€ service
    โ””โ”€โ”€ test

</details>


<br/>

๐ŸŽจ Figma

<img src="https://github.com/angly97/DoLearnDoLearn/assets/70613905/8c673930-6578-4b7c-9692-a997a5431e9f" width=50%>

<br />

๐Ÿ—‚ ERD

<img src="https://file.notion.so/f/s/65004c33-5176-4ce7-b5df-91b34e6019b0/erd_img.png?id=bd9f93a2-79fb-4c9f-9a7b-49da2175d713&table=block&spaceId=26ae456f-746f-4803-abcb-5d882cacc221&expirationTimestamp=1684242755170&signature=iSQRQUoqWIUW35DaYXgNk8xTTLuq0tyCk8pBRDPZivA&downloadName=erd+img.png" width="50%"></div>

<br />

๐Ÿ–ฅ๏ธ ์ฃผ์š”๊ธฐ๋Šฅ

๊ฐœ์š”

  • API ๋ช…์„ธ
    • ํ™”๋ฉด ๋ณ„ UI ๋””์ž์ธ์„ ๋ณด๋ฉฐ ํ•„์š”ํ•œ ์š”์ฒญ/์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธํ•˜์—ฌ ๊ฐ™์€ ๊ณต๊ฐ„์—์„œ API ์„ค๊ณ„
      • API ๋ช…์„ธ ์ž‘์„ฑ์„ ์œ„ํ•ด Figma ํ™”๋ฉด๊ณผ ๋ช…์„ธ ์ž‘์„ฑ ๋ฌธ์„œ๋ฅผ ๋ฒˆ๊ฑฐ๋กญ๊ฒŒ ์ด๋™ํ•ด์•ผํ•˜๋Š” ๋ถˆํŽธํ•จ ํ•ด์†Œ
      • Postman, Swagger์™€ ๋‹ฌ๋ฆฌ Request ๊ฐ’ ์ œ์•ฝ์กฐ๊ฑด์˜ ์ œ์•ฝ์กฐ๊ฑด๊ณผ Response ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์ฃผ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•จ์œผ๋กœ์จ ๊ฐœ๋ฐœ ๊ณผ์ •์˜ ์˜คํ•ด๋ฅผ ์ตœ์†Œํ™”
    • ๊ฐ ํ™”๋ฉด๋งˆ๋‹ค ํ•„์š”ํ•œ API ๋ชฉ๋ก ์—ฐ๊ฒฐ ๊ฐ€๋Šฅ
      • ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์„ ์œ„ํ•ด ํ™”๋ฉด๋ณ„๋กœ ์–ด๋–ค API๊ฐ€ ํ•„์š”ํ•œ์ง€ ํ•œ๋ˆˆ์— ํ™•์ธ ๊ฐ€๋Šฅ
    • code generator
  • API ์š”์ฒญ
    • ํ™”๋ฉด๋ณ„๋กœ ์—ฐ๊ฒฐ๋œ API ๋ชฉ๋ก์„ ํ•œ๋ˆˆ์— ํ™•์ธํ•˜๊ณ  ๊ฐ™์€ ๊ณต๊ฐ„์—์„œ ์š”์ฒญ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•จ์œผ๋กœ์จ, ํ•ด๋‹น ํ™”๋ฉด์— ํ•„์š”ํ•œ API๋“ค์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ์‰ฝ๊ฒŒ ํ™•์ธ ๊ฐ€๋Šฅ
    • API ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ์ €์žฅํ•จ์œผ๋กœ์จ, ์„ฑ๊ณต ์‘๋‹ต๊ณผ ์‹คํŒจ ์‘๋‹ต ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์‘๋‹ต์„ ๋ณด๋ƒˆ์„ ๋•Œ์˜ ์š”์ฒญ๊ฐ’ ์ •๋ณด๋ฅผ ํ™•์ธ ๊ฐ€๋Šฅ
  • ์œ ์Šค์ผ€์ด์Šค ํ…Œ์ŠคํŠธ
    • ํ•˜๋‚˜์˜ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์œ„ํ•ด ์‹คํ–‰๋˜์–ด์•ผํ•˜๋Š” API๋“ค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์œ ๊ธฐ์ ์œผ๋กœ ์š”์ฒญํ•˜์—ฌ, ํ•ด๋‹น ๊ธฐ๋Šฅ์ด ์„ฑ๊ณต์ ์œผ๋กœ ๊ตฌํ˜„๋˜์—ˆ๋Š”์ง€ ์‰ฝ๊ฒŒ ํ™•์ธ
      • ex. ๋Œ“๊ธ€ ์ž‘์„ฑ ์œ ์Šค์ผ€์ด์Šค ํ…Œ์ŠคํŠธ
        1. ๋กœ๊ทธ์ธ API ํ˜ธ์ถœ์„ ์œ„ํ•ด, ๊ณ„์ • ์ •๋ณด๋ฅผ ์ž…๋ ฅ
        2. ๊ธ€ ์ž‘์„ฑ API ํ˜ธ์ถœ์„ ์œ„ํ•ด, ์ œ๋ชฉ๊ณผ ๋‚ด์šฉ์„ ์ž…๋ ฅํ•˜๊ณ  1๋ฒˆ API ์‘๋‹ต ํ—ค๋”์˜ Access Token๋ฅผ 2๋ฒˆ API ์š”์ฒญ ํ—ค๋”์˜ Authorization์— ๋งคํ•‘
        3. ํ•ด๋‹น ๊ธ€์— ๋Œ€ํ•œ ๋Œ“๊ธ€ ์ž‘์„ฑ API ํ˜ธ์ถœ์„ ์œ„ํ•ด, ๋Œ“๊ธ€ ๋‚ด์šฉ์„ ์ž…๋ ฅํ•˜๊ณ  2๋ฒˆ API ์‘๋‹ต์˜ ๊ธ€ ID๋ฅผ 3๋ฒˆ API์˜ ์š”์ฒญ ๋ฐ”๋””์˜ ๊ธ€ id์— ๋งคํ•‘
        4. ์œ ์Šค์ผ€์ด์Šค ํ…Œ์ŠคํŠธ ์‹คํ–‰ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ, ์œ„์˜ API๋“ค์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰ ๋งˆ์ง€๋ง‰์œผ๋กœ ํ˜ธ์ถœ๋œ API ์‘๋‹ต์„ ํ™•์ธ
  • ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ
    • ํ…Œ์ŠคํŠธํ•˜๊ณ ์ž ํ•˜๋Š” api, duration, ์ดˆ๋‹น request ์ˆ˜๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋™์ ์œผ๋กœ ํ…Œ์ŠคํŠธ ์„œ๋ฒ„๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์„ฑ๋Šฅํ…Œ์ŠคํŠธ๋ฅผ ๋Œ€๋ฆฌ ์ˆ˜ํ–‰ํ•จ
    • GCP SDK๋ฅผ ์ด์šฉํ•˜์—ฌ ํด๋ผ์šฐ๋“œ ์„œ๋ฒ„ ๋™์  ์ƒ์„ฑ
      • vegeta ์˜คํ”ˆ์†Œ์Šค๋กœ ์„ฑ๋Šฅํ…Œ์ŠคํŠธ ์ˆ˜ํ–‰

<br />

I. ์›Œํฌ์ŠคํŽ˜์ด์Šค ์ƒ์„ฑ

image


  • 1๋‹จ๊ณ„ : ํŒ€์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ํ”ผ๊ทธ๋งˆ url์„ ์ž…๋ ฅํ•˜๋ฉด ํ”ผ๊ทธ๋งˆ API๋ฅผ ์ด์šฉํ•ด ํ”ผ๊ทธ๋งˆ ์ •๋ณด๋ฅผ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค.
  • 2๋‹จ๊ณ„ : ํ”„๋กœ์ ํŠธ์˜ ์ •๋ณด๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฆ„, ์„ค๋ช…, ๊ธฐ๊ฐ„ ๋“ฑ์„ ์ž…๋ ฅํ•˜๊ณ , ํŒ€์›๋„ ์ดˆ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.
  • 3๋‹จ๊ณ„ : ํŒ€์—์„œ ์‚ฌ์šฉํ•  ํ”ผ๊ทธ๋งˆ ์„น์…˜ ๋ชฉ๋ก์„ ์„ ํƒํ•˜๊ณ  ์›Œํฌ์ŠคํŽ˜์ด์Šค ์ƒ์„ฑ์„ ๋งˆ๋ฌด๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

<br />

II. ์›Œํฌ์ŠคํŽ˜์ด์Šค ํ™ˆํ™”๋ฉด

<img src="https://github.com/angly97/DoLearnDoLearn/assets/70613905/d9abe420-1ad9-457b-b1b9-88a51e660359" width="50%"/>


  • ์™ผ์ชฝ ์ƒ๋‹จ์€ ์›Œํฌ์ŠคํŽ˜์ด์Šค ์ƒ์„ฑ์‹œ ์ž‘์„ฑํ•œ ํ”„๋กœ์ ํŠธ ์ •๋ณด์ž…๋‹ˆ๋‹ค.
  • ์™ผ์ชฝ ํ•˜๋‹จ์€ ๋ช…์„ธํ•œ API ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค.
  • ์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ์€ ์ „์ฒด API ๋ชฉ๋ก์ค‘ ํ…Œ์ŠคํŠธ๊ฐ€ ์™„๋ฃŒ๋œ API ๊ฐฏ์ˆ˜์™€ ๋น„์œจ์ž…๋‹ˆ๋‹ค.
  • ์˜ค๋ฅธ์ชฝ ํ•˜๋‹จ์€ ํŒ€์› ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค.

<br />

III. DTO ๋ช…์„ธ & API ๋ช…์„ธ

image


  • ์˜ค๋ฅธ์ชฝ์—์„œ DTO ๋ช…์„ธ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ํ•„๋“œ์˜ ์ด๋ฆ„๊ณผ ํƒ€์ž…, ์ œ์•ฝ์กฐ๊ฑด๊นŒ์ง€ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ๋“ฑ๋กํ•œ DTO๋Š” ์™ผ์ชฝ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ DTO ์ฝ”๋“œ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋ช…์„ธํ•œ ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ƒ์„ฑ๋œ DTO ํด๋ž˜์Šค ์ฝ”๋“œ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

image


  • ์™ผ์ชฝ์€ ํ”ผ๊ทธ๋งˆ์—์„œ ์ž‘์„ฑํ•œ ์„น์…˜์ž…๋‹ˆ๋‹ค. ํ”ผ๊ทธ๋งˆ๋ฅผ ๋ณด๋ฉฐ ์˜ค๋ฅธ์ชฝ์—์„œ API ๋ช…์„ธ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ช…์„ธ์—๋Š” param, path variable, header, body ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  • body์— ๊ฐ์ฒด ํ˜•ํƒœ์˜ ํ•„๋“œ๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค๋ฉด ๋ช…์„ธํ–ˆ๋˜ DTO๋ฅผ ๋ถˆ๋Ÿฌ์™€ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<br />

IV. Figma ํ™”๋ฉด๋ณ„ ์‚ฌ์šฉ๋˜๋Š” API ์—ฐ๊ฒฐ

image


  • ํ™”๋ฉด๋ณ„๋กœ ์‚ฌ์šฉ๋  API๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค.
  • ์™ผ์ชฝ ํ”ผ๊ทธ๋งˆ ์„น์…˜์ค‘ ํ•˜๋‚˜๋ฅผ ๊ณจ๋ผ API ์ „์ฒด ๋ชฉ๋ก์ค‘ ์‚ฌ์šฉํ•  API๋“ค์„ ์„ ํƒํ•ด ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

<br />

V. API ์š”์ฒญ ๋ฐ Axios ์š”์ฒญ ๊ฐ์ฒด ์ฝ”๋“œ ๋ฐ˜ํ™˜

image


  • ๋ช…์„ธํ–ˆ๋˜ ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค.
  • ๋ช…์„ธ ์ •๋ณด๋ฅผ ํ™•์ธํ•˜๋ฉฐ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•œ ํ›„ ๋ฐ”๋กœ ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์š”์ฒญํ•œ ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ Axios ์š”์ฒญ ๊ฐ์ฒด ์ฝ”๋“œ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<br />

VI. ์œ ์Šค์ผ€์ด์Šค ํ…Œ์ŠคํŠธ

image


  • ์œ ์Šค์ผ€์ด์Šค ๊ฒ€์ฆ์— ํ•„์š”ํ•œ API ๋ชฉ๋ก์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  • API ๋ช…์„ธ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ ์ ˆํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ณ€์ˆ˜ ๊ด€๊ณ„ ์„ค์ • : "Response ์—ฐ๊ฒฐ" ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ์˜ค๋ฅธ์ชฝ์˜ ์ด์ „ ์‘๋‹ต ๋ฐ์ดํ„ฐ ์ค‘ ํ•˜๋‚˜๋ฅผ ๊ณจ๋ผ ๋ณ€์ˆ˜ ๊ด€๊ณ„๋ฅผ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.
  • ์œ ์Šค์ผ€์ด์Šค ์„ฑ๊ณต์‹œ์—๋Š” ๋งˆ์ง€๋ง‰ API์˜ ์š”์ฒญ ๊ฒฐ๊ณผ๊ฐ€, ์‹คํŒจ์‹œ์—๋Š” ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์œผ๋กœ ์š”์ฒญ๋œ API ์š”์ฒญ ๊ฒฐ๊ณผ๊ฐ€ ๋œน๋‹ˆ๋‹ค.

<br />

VII. ์„ฑ๋Šฅํ…Œ์ŠคํŠธ


  • ์„œ๋ฒ„ ์†Œ์œ  ์ธ์ฆ : ์ƒ๋‹จ์˜ ์ฝ”๋“œ ์ค‘ ์„œ๋ฒ„์˜ ํ”„๋ ˆ์ž„์›Œํฌ์™€ ์ผ์น˜ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ์„œ๋ฒ„์— ๋ถ™์ž…๋‹ˆ๋‹ค. ์ด๋•Œ ์š”์ฒญ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ๊ฐ€ "[server_url]/api/ssfast" ์ธ์ง€ ๊ผญ ํ™•์ธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ์„œ๋ฒ„์— ๋Œ€ํ•œ ์ธ์ฆ์ด ์™„๋ฃŒ๋˜์–ด์•ผ ์„ฑ๋Šฅํ…Œ์ŠคํŠธ๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ…Œ์ŠคํŠธํ•˜๊ณ ์ž ํ•˜๋Š” API๋ฅผ ์„ ํƒํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ  ์ดˆ๋‹น ์š”์ฒญ ํšŸ์ˆ˜, duration์„ ์ž…๋ ฅํ•˜๊ณ  ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

<br />

๐ŸŽฅ UCC ๋ณด๋Ÿฌ๊ฐ€๊ธฐ

<br />

<div id="6"></div>

๐Ÿ‘ฅ ํ˜‘์—… ๊ด€๋ฆฌ

I. Git

git flow

git work flow

git convention

<br />

II. Notion

<a href="https://magical-sweatshirt-a0d.notion.site/93d9ef3bac7f448089c1096c304fad54" target="_blank">Link</a>

<br />