- ์ด๋์ ์ ํ์ด ์๋ ํ์! ํผ์๊ฐ ์๋ ๋ค๊ฐ์ด ํ์~!
- ์ฌ์ฉ์์๊ฒ ์ฝ๊ณ ๊ฐ๋จํ ์ด๋๋ฉ์ดํธ๋ฅผ ์ฐพ์ ์ ์๊ฒ ํ๋ ์๋น์ค ์ ๊ณต!
- ์๋ก์ด ์ง์ญ์์๋ ์ด๋์ผ๋ก ์ด์๋ค๊ณผ ์นํด์ง๊ณ ์ํ์ฒด์ก ํ์ฑํ ๊ธฐ๋!
- ๋ฉ์์ด์ฌ์์ฒ๋ผ๐ฆ ๋ฐฑ์๋์ค์ฟจ 2๊ธฐ ํํ๋ก์ ํธ
- ๋ ธ์ ํ์ด์ง : ํ ๋ ธ์ ํ์ด์ง
- ์๊ตฌ์ฌํญ ๋ช ์ธ์ : ์๊ตฌ์ฌํญ ๋ช ์ธ์
- WBS ์ํธ : WBS ์ํธ
- Swagger : ์ค์จ๊ฑฐ
- ์๋ํฐ : Intellij Ultimate
- ๊ฐ๋ฐ ํด : SpringBoot 2.7.7
- ์๋ฐ : JAVA 11
- ๋น๋ : Gradle
- ์๋ฒ : AWS EC2, AWS RDS, AWS S3
- CI/CD : Docker, Gitlab
- ๋ฐ์ดํฐ๋ฒ ์ด์ค : MySql, Redis
- ํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ : Spring Data JPA, Lombok, Spring Security, thymeleaf, JWT, WebSocket, OAuth2.0, Email
- ETC : Git, IntelliJ, JS, KakaoMap API
- ๋ก๊ทธ์ธ
- ID/PW ์ด์ฉํ ๊ธฐ๋ณธ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ
- OAuth ๋ก๊ทธ์ธ (๊ตฌ๊ธ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ)
- JWT๋ฅผ ์ฟ ํค์ ๋ด์ ์ธ์ฆ, ์ธ๊ฐ์ฒ๋ฆฌ ์งํ
- ํ์๊ฐ์
- ์ด๋ฉ์ผ ์ธ์ฆ์ ํตํ ๊ธฐ๋ณธ ํ์ ๊ฐ์ (ID, PW, Email, ์ด๋ฆ, ์ฃผ์ ๋ฑ)
- OAuth ํ์๊ฐ์ (๊ตฌ๊ธ ํ์๊ฐ์ ๊ธฐ๋ฅ)
- ID/PW ์ฐพ๊ธฐ
- ๊ฐ์ ํ ์ด๋ฉ์ผ์ ํตํด์ ์ธ์ฆ๋ฒํธ๊ฐ ๋ฐ์ก๋๋ฉฐ, ์ธ์ฆ๋จ์ ๋ฐ๋ผ PW ๋ณ๊ฒฝ ๊ฐ๋ฅ
- ํฌ๋ฃจ CRUD ๊ธฐ๋ฅ
- ์ง์ญ๋ณ, ์นดํ ๊ณ ๋ฆฌ๋ณ ๋ฐ์ดํฐ๋ฅผ ์ ์งํ๋ฉด์ ์ํ๋ ๊ฒ์๊ธ ์กฐํ
- ๊ฒ์์ด๋ฅผ ์ ์งํ๋ฉด์ ํ์ด์ง ์ฒ๋ฆฌ ๊ธฐ๋ฅ
- ํ์์ ํํด์ ์์ฑ ๊ฐ๋ฅ
- ์์ฑ์๋ง ์์ , ์ญ์ ๊ฐ๋ฅ
- ํฌ๋ฃจ ๋๊ธ/๋๋๊ธ
- ๋๊ธ, ๋๋๊ธ CRUD ๊ธฐ๋ฅ
- ํ์ ํํด์ ์์ฑ ๊ฐ๋ฅ
- ์์ฑ์ ํํด์ ์์ , ์ญ์ ๊ฐ๋ฅ
- ํฌ๋ฃจ ์ข์์
- ๊ฒ์๊ธ ์ข์์, ์ทจ์ ๊ธฐ๋ฅ
- ์์ธ ํ์ด์ง ์์ฑ
- ์ ๋ชฉ, ๋ด์ฉ, ์์น(์นด์นด์ค๋งต API), ๋ ์ง(Date/TimePicker), ์นดํ ๊ณ ๋ฆฌ, ์ด๋ฏธ์ง ์ ๋ก๋(S3) ํ์ฉ
- ์์ธ ํ์ด์ง ์กฐํ
- ํฌ๋ฃจ ์ ๋ณด์ ๋ํ ์์ธ ์ ๋ณด ์กฐํ
- ์ด์ ๊ธ, ๋ค์๊ธ ์กฐํ ๊ธฐ๋ฅ
- ํฌ๋ฃจ ์ฐธ์ฌ ์น์ธ/๊ฑฐ์ /๋ฐ๋ ค
- ํ์์ ํ๋์ ์ฐธ์ฌํ๊ณ ์ถ์ ํฌ๋ฃจ์ ์ฐธ์ฌ ์ ์ฒญ์ํ์ฌ ์น์ธ์ ๋ฐ์ ์์
- ๊ฑฐ์ , ๋ฐ๋ ค ์ ์์ ๋ ์ ์์
- ์ฐธ์ฌ์ ๋ช
๋จ ์กฐํ
- ํ๋์ ํฌ๋ฃจ์ ์ฐธ์ฌํ ํ์๋ค์ ์ฐธ์ฌ ์ฌ๋ถ๋ฅผ ํตํด ๋ช ๋จ์ ์กฐํ
- ํฌ๋ฃจ ์ข
๋ฃ ์ ํ๊ธฐ ํ๊ฐ ๋ฐ ๋ฉ์ธ์ง ์์ฑ
- ์ฐธ์ฌํ ํ์๋ค์ ํํด์ ์ํธ ํ๊ฐ ๊ธฐ๋ฅ (1~5์ ๋ถ์ฌ)
- ์จ๋์ง์ ์ฒดํฌ
- ํ๊ฐํ ์ ์๋ฅผ ํ ๋๋ก ํธ์ฐจ๋ฅผ 36.5 ๊ธฐ์ค์ผ๋ก ์ ์ ๋ฐ์
- ํ๊ธฐ ์กฐํ
- ํฌ๋ฃจ ์ข ๋ฃ ํ ์์ฑ๋ ํ๊ธฐ๋ค์ ๋ชจ์ ๋ณผ ์ ์๋ ๊ธฐ๋ฅ
- ์๋ฆผ ๊ธฐ๋ฅ
- SSE๋ฅผ ํตํ ์๋ฆผ ๊ธฐ๋ฅ ๊ตฌํ
- ๋๊ธ, ๋๋๊ธ, ์ข์์, ํ๋ก์ฐ, ์ฐธ์ฌ ์ ์ฒญ ๋ฐ ์น์ธ, ์ด์ฉ์ ํ๊ธฐ, ์ค์๊ฐ ๋งค์นญ์ ๋ํ ์๋ฆผ์ด ๋ฐ์
- ์ค์๊ฐ ๋งค์นญ๊ธฐ๋ฅ
- ์ด๋ ์ข ๋ชฉ๋ณ ์ค์๊ฐ ๋งค์นญ ๊ธฐ๋ฅ
- ๋งค์นญ ์ฑ๊ณต ์ดํ ์๋ฆผ์ฒ๋ฆฌํ์ฌ ์ฑํ ๋ฐฉ ์ด๋ ๊ธฐ๋ฅ
- ์ค์๊ฐ ์ฑํ
- ํ๋์ ํฌ๋ฃจ๋ง๋ค ์ค์๊ฐ ์ฑํ ๊ธฐ๋ฅ ์ ๊ณต
- ์ฐธ์ฌํ ํ์์ ํํด์ ์ฑํ ๋ฐฉ ์ ์ฅ ๊ฐ๋ฅ
- ์ ์์ ํ์ธ
- ์ค์๊ฐ์ผ๋ก ์ฐธ์ฌ์ค์ธ ํ์์ ๋ณด๋ค์ ๋ํด์ ๋ฆฌ์คํธ์ ๋ฐ์
- ์ฑํ
๋ด์ญ ์กฐํ
- ํด๋น ์ฑํ ๋ฐฉ์์ ์ฃผ๊ณ ๋ฐ์ ๋ด์ฉ๋ค์ ๋ํด์ ์กฐํ
- ์ฝ์ ์ฒ๋ฆฌ
- ํด์ฅํ DateTime ๊ธฐ์ค ๋จ์ฒด ์ฑํ ๋ฐฉ ๋ด ๊ฐ๊ฐ์ ์ฌ์ฉ์์ ๋ฐ๋ฅธ ์ฝ์ ๋ด์ญ ์ ๊ณต
- ์ฑํ ๊ณผ ๋์ ํฌ๋ฃจ ์์ธ๋ด์ญ ์ ๊ณต (์นด์นด์ค๋งต API ์ ์ฉ)
- ํ๋ก์ฐ
- ๋ค๋ฅธ ํ์์ ํ๋ก์ฐ, ํ๋ก์ฐ ์ทจ์
- ํ๋ก์ฐ ๋ชฉ๋ก ์กฐํ
- ๋๋ฅผ ํ๋ก์ฐ ํ ์ ์ (ํ๋ก์), ๋ด๊ฐ ํ๋ก์ฐํ ์ ์ (ํ๋ก์) ์กฐํ ๊ธฐ๋ฅ
- ๋ง์ดํ๋กํ ์กฐํ
- ๋ง์ดํ๋กํ ์์
- ์ด๋ฆ, ๋๋ค์, ๊ด์ฌ์ข ๋ชฉ, ์ฃผ์, ๊ฐ์ธ์ ๋ณด(์ด๋ฉ์ผ, ์ ํ๋ฒํธ, ์ฑ๋ณ) ์์ ๊ธฐ๋ฅ ์ ๊ณต
- ๊ฐ์ธ์ฌ์ง ๋ฑ๋ก
- ๊ฐ์ธ USER ๋ง๋ค ํ๋กํ ์ฌ์ง ๋ฑ๋ก/์์ ๊ธฐ๋ฅ
- ์ ๋ณด์ ๊ณต
- ํ์ฌ ์ฐธ์ฌ์ค์ธ ํฌ๋ฃจ์ ๋ํ ์ ๋ณด ์ ๊ณต ๊ธฐ๋ฅ
- ํ์ฌ ์ข ๋ฃ๋ ํฌ๋ฃจ์ ๋ํ ์ ๋ณด ์ ๊ณต ๊ธฐ๋ฅ
- ๋ฐ์ ํ๊ธฐ์ ๋ํด์ ์กฐํ ๊ธฐ๋ฅ
- ์ฌ์ฉ์ ์ ์ฒด ์กฐํ
- ์ ์ฒด ์ด์ฉ์ ์กฐํ, Redis์ ๊ธฐ๋ก๋ ํ์ฌ ์ ์์ค์ธ ์ด์ฉ์ ์กฐํ
- ํฌ๋ฃจ ์ ์ฒด ๊ด๋ฆฌ
- ํฌ๋ฃจ ์ ์ฒด ์กฐํ, ์ญ์ ๊ธฐ๋ฅ
- ์์ธํ์ด์ง ๋ด ์ด์ฉ์ ๊ฐํด ๊ธฐ๋ฅ
- SockJS๋ฅผ ์ด์ฉํ STOMP ๋ฐฉ์ ์ค์๊ฐ ์ฑํ ๊ธฐ๋ฅ
- ๊ฐ๊ฐ์ ์ฑํ
๋ฐฉ์
/sub + id๋ก ๊ตฌ๋ถํ์ฌ/pub๋ฉ์์ง๋ก ๊ตฌ๋ ํ endpoint ์ ์ฑํ ์ ๋ฌํ๋ค. - ์
/ํด์ฅ ์
/pub๋ฉ์์ง ๋ฅผ ๋ณด๋ด ํ์ฌ์ฐธ์ฌ์ ํํฉ์ ๋ํ ์ต์ ํ์์ฑํ ๋ด์ญ๋ค์ ์ ์ฅํ๋ฉฐ์ฝ์๋ ์๊ฐ๋๋ฅผ ์ ์ฅํ๋ค- ์ฐธ์ฌ์ ํํฉ ์ต์ ํ๋ ์ปจํธ๋กค๋ฌ๋จ์์
UserID KEY๊ฐ์ผ๋ก ํ๊ณ์ฑํ ๋ฐฉ ID ๋ฅผ Value๋ก ํ์ฌ ๋ฐ์ดํฐ์ ๋ํ ์ ๋ณด๋ฅผ ๋ด์์ ๋ณด๋ธ๋ค. - ์ฑํ
๋ด์ญ๋ค์
/pub๋ฉ์์ง ๋ณด๋ผ๋ ๋ง๋คajaxํต์ ์ ํ์ฌfetch๋ฐฉ์์ผ๋ก ์ ์ฅํ๋ API๋ฅผ ํธ์ถํด ํด๋น ์ฑํ ๋ด์ญ์ ์ ์ฅํ๋ค.
- ์ฐธ์ฌ์ ํํฉ ์ต์ ํ๋ ์ปจํธ๋กค๋ฌ๋จ์์
- ์
์ฅ ์ ํด๋น ์ฑํ
๋ฐฉ ๋ด์ญ์ ๋ํ ์ ๋ณด๋ฅผ ๋ถ๋ฌ์์ ์ฌ์ฉ์๊ฐ ์ฝ์๋ ์๊ฐ๋์
๋น๊ตํ์ฌ ๊ฐ์ฅ ์ต๊ทผ์ ์ฝ์ ์์น๊น์ง์คํฌ๋กค๋งํ๋ค.- ์ฑํ
๋ฐฉ ํด์ฅ์ ํ์ฌ์๊ฐ์
chat-config-entity์ ์ ์ฅํ๋ฉฐ ์ดํ ์ฑํ ๋ฐฉ ์ฌ์ ์ฅ ์ ํ์ฌ ์๊ฐ๊ณผ ๋น๊ตํ์ฌ ์ฝ์๋ ์์น๋ฅผ ์ฐพ๋๋ค.
- ์ฑํ
๋ฐฉ ํด์ฅ์ ํ์ฌ์๊ฐ์
- SSE๋ฅผ ์ด์ฉํ ์ค์๊ฐ ์ฌ์ฉ์ ์๋ฆผ ๊ธฐ๋ฅ
- JavaScript ์์ ํ์ด์ง๋ฅผ ์ด๋ SSE ์๋ฒ๋ก ์ฐ๊ฒฐ ํ๋ค.
/sse + userId SSE Controller์์ ํด๋น UserID ์ ๋ํ ์ ๋ณด๋ฅผ ํตํด ์๋ก์ดEmitter๋ฅผ ์์ฑํ๋ฉฐ,static Map์KEY(UserID):VALUE(emitter)๋ฐฉ์์ผ๋ก ์ ์ฅํ๋ค.- ํด๋น Emitter๋ฅผ
Controller์์ return ํด์ฃผ๊ณJavaScript์์ ๋ฐ์ดํฐ์์ค๋ก ์๋ ์๋ฆผ์ ๋ํ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ๋ฑ๋กํ๋ค. - ๋๊ธ, ๋๋๊ธ, ์ข์์, ํ๋ก์ฐ, ์ฐธ์ฌ ์ ์ฒญ ๋ฐ ์น์ธ, ์ด์ฉ์ ํ๊ธฐ, ์ค์๊ฐ ๋งค์นญ์ ๋ํ ์๋ฆผ์ด ๋ฐ์
- JavaScript ์์ ํ์ด์ง๋ฅผ ์ด๋ SSE ์๋ฒ๋ก ์ฐ๊ฒฐ ํ๋ค.
- ์ค์๊ฐ ๋งค์นญ ๊ธฐ๋ฅ *
-
์์ธ ์กฐํ
- ์์ธ ์กฐํ ์ ๋จผ์ CREW ๊ฐ ์ข ๋ฃ๋์๋๊ฐ ํ์ธํ๋ค.
- ํด๋น
USER์CREW์ ๊ด๊ณ๋ฅผPARTICIPATION์ผ๋ก ๊ตฌ๋ถํ์ฌ Status๋ฅผ ๋ํ๋ธ๋ค.0 or null: ์ฐธ์ฌํ์ง์์1: ์ ์ฒญ๋๊ธฐ2: ์ฐธ์ฌ์ค3: ์ข ๋ฃ๋จ- Status ์ ๋ฐ๋ฅธ ์์ธ์กฐํ ํ์ด์ง์ ๋ฒํผ์ด ๋ณ๊ฒฝ๋๋ค.
์ฐธ์ฌํ์ง ์์๊ณผ ์ ์ฒญ๋๊ธฐ์ํ์์๋ ํฌ๋ฃจ ์์ฑ์์ ์ฐธ์ฌ ์น์ธ ์ ๊น์ง์ด์ฉ ๋ถ๊ฐํ๋ค.์ฐธ์ฌ์ค์ธ ์ํ์์๋ ์ฑํ ๋ฐฉ ์ด์ฉ๊ณผ ํ์ฌ ์ฐธ์ฌํUserListํ์ธํ ์ ์๋ค.์ข ๋ฃ๋จ ์ํ์์๋ ์ฐธ์ฌํ User์ ๋ํReview๋ฅผ ๋จ๊ธธ ์ ์๋ค.
-
์นดํ ๊ณ ๋ฆฌ๋ณ ์ด๋์ข ๋ชฉ๋ณ ์กฐํ ๊ธฐ๋ฅ
- GET ๋ฐฉ์์ผ๋ก View ์์
์ง์ญ๊ฒ์, ์ด๋์ข ๋ชฉ ์ ํ ๋ณ์๋ค์ Controller ์ ๋ฐ๋๋ค. - ๋ฐ์ ๋ฐ์ดํฐ๋ก ๊ฒ์๋ฌผ์ ์กฐํ ํ๋ค.
- ์กฐํ ์ดํ ์ ์ง๋ฅผ ์ํด
View์ ๋ค์ ๊ฒ์์ด๋ฅผ ๋๊ธด๋ค.- View ์์
๊ฒ์์ด(์ง์ญ,์ด๋์ข ๋ชฉ) ๋ณ๊ฒฝ์ด ์์ ๊ฒฝ์ฐ ๋๊ฒจ ๋ฐ์๋ ๋ฐ์ดํฐ๋ฅผ ๋๊ธฐ๋ฉฐ - ๋ณ๊ฒฝ์ด ์์ ๊ฒฝ์ฐ ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ๋ฅผ Controller ์ ๋๊ธด๋ค.
- ์๋ฅผ ๋ฐ๋ณต์ผ๋ก ์กฐํํ๋ค.
- View ์์
- ์ฒ์ ๋ก๊ทธ์ธ์์๋ ์ ์ ์
์ ์ฅ๋ ์ง์ญ, ์ ํธ ์ด๋ ์ข ๋ชฉ์ ์ฐพ์View์ ๋๊ธด๋ค.- ๊ฒ์์ด ์ ์ง๋ฅผ ํ๋ฉด์
๋ก๊ทธ์ธ ์ํ ๋ณ์๋ฅผ ํ๋ ๋ง๋ค์ด false๋ฅผ ์ ์งํ๋ค - ๋ก๊ทธ์ธ ์ true ๋ก ๋ฐ๋์ด ์ ์ ์ ๋ณด๋ฅผ View ์ ๋ณด์ฌ์ค๋ค.
- ๊ฒ์์ด ์ ์ง๋ฅผ ํ๋ฉด์
- GET ๋ฐฉ์์ผ๋ก View ์์
- S3 ๋ฅผ ํ์ฉํ
์ด๋ฏธ์ง ๋ฐ์ดํฐ ์กฐํ ๋ฐ ์ ์ฅ๊ธฐ๋ฅ - ์ด๋ฏธ์ง
์ ๋ก๋- ์ด๋ฏธ์ง ์ด๋ฆ + ๋๋คํ ๊ธ์ ๋ฅผ KEY ๋ก ํ์ฌ
S3์DataBase์ ์ ์ฅํ๋ค.- UUID๋ก ์งํ์ ๋ฐ๋ฅธ
crpto.uuid ์ธ์์ ๋ํ ๋ฌธ์ ๋ก ์ธํ Math.random(20)์ผ๋ก ํด์ 20์ง์๋ก ์ซ์๋ฅผ ์์ฑํด์(0~9์ ์ํ๋ฒณ) substring ์ผ๋ก๋๋ค๊ฐ์ ๋ถ์ฌํ๋ค.
- UUID๋ก ์งํ์ ๋ฐ๋ฅธ
- ์ด๋ฏธ์ง ์ด๋ฆ + ๋๋คํ ๊ธ์ ๋ฅผ KEY ๋ก ํ์ฌ
- ์ด๋ฏธ์ง
์กฐํ- ๋ถ๋ฌ์ค๊ณ ์ถ์ ์ด๋ฏธ์ง์ KEY ๋ฅผ
DataBase์์ ์กฐํํ๋ค. - JavaScript ๋ก ์ฌ์ฉ์ ํ์ธํ๋ ํ๋ผ๋ฏธํฐ์ KEY ๋ฅผ ๋ฃ๋๋ค.
- S3 ์์ ํด๋น ์ด๋ฏธ์ง์ ๋ํ URL์ ๋ฐ์ id ๊ฐ์ ์ด์ฉํด html ์ ํํํ๋ค.
- ๋ถ๋ฌ์ค๊ณ ์ถ์ ์ด๋ฏธ์ง์ KEY ๋ฅผ


