- ๋ฐฐํฌ URL : http://www.studywith.site
- ํ๋ก ํธ์ค๋ URL : https://github.com/geongeongeon/StudyWith-frontend
- ์๊ฐ ๋ฐ ๋ชฉ์
- ํ์
- ๊ฐ๋ฐ ์ผ์
- ๊ฐ๋ฐ ํ๊ฒฝ
- ์ปจ๋ฒค์
- ํ๋ก์ ํธ ๊ตฌ์กฐ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๊ณ
- ์ค๋ํฌ์ธํธ ๋ฐ ๋ผ์ฐํฐ
- ๊ธฐ๋ฅ ์์ธ
- ๊ธฐ์ ์ ์์ฌ ๊ฒฐ์
- ํธ๋ฌ๋ธ ์ํ
- ํ๋ก์ ํธ ํ๊ณ
-
StudyWith๋ ์ด๋ฆ ๊ทธ๋๋ก, ๋ค๋ฅธ ์ฌ๋๋ค๊ณผ ์ด๋ค ๋ถ์ผ๋ฅผ ํจ๊ป ๊ณต๋ถํ ์ ์๋ ์คํฐ๋ ๊ทธ๋ฃน์ ๊ตฌํ๋ ํ๋ซํผ์ด๋ค.
- ๊ฒ์์ ํตํด ๊ด์ฌ์ฌ์ ์ง์ญ์ ๊ธฐ๋ฐ์ผ๋ก ๋ง์ถคํ ์คํฐ๋ ๊ทธ๋ฃน์ ๊ฒ์ํ ์ ์๋ค.
- ์ฌ์ฉ์๊ฐ ์ํ๋ ์คํฐ๋ ๊ทธ๋ฃน์ ์ง์ ๊ฐ์คํ๊ณ ๊ด๋ฆฌํ ์ ์๋ค.
- ๊ฐ์ ์คํฐ๋ ๊ทธ๋ฃน ๋ด ๋ค๋ฅธ ์ฌ์ฉ์๋ค๊ณผ ์ํตํ ์ ์๋ค.
- ์ฌ์ฉ์ ์นํ์ ์ธ UI/UX๋ฅผ ์ ๊ณตํ๊ณ ํ๋ฉด ํฌ๊ธฐ์ ๋ฐ๋ผ ์ต์ ํ ์ค๊ณ๊ฐ ๋์ด ์๋ค.
-
๊ทธ๋์ ๋จ์ํ ์ด๋ค ๊ฒ์ ๋ํด ๊ณต๋ถ๋ฅผ ํ๊ณ ์์ฑ๋ ํ๋ก์ ํธ์ ์ ์ฉํด๋ณธ ๊ฒฝํ์ด ๋ถ์กฑํ๋ค๊ณ ๋๊ปด, ์ค์ ๋ก ํ๋์ ํ๋ก์ ํธ์ ์ ์ฉํด๋ณด๊ณ ์ ํ๋ค.
-
์ค๋ฌด์ ์ ์ฌํ ํ๋ก์ ํธ ์งํ ๊ฒฝํ์ ์๊ธฐ ์ํด ์ค๊ณ๋ถํฐ ํ ์คํธ ๋ฐ ๋ฐฐํฌ๊น์ง ์ ์ฒด ๊ฐ๋ฐ ๊ณผ์ ์ ์ง์ ์ฒดํํด๋ณด๊ณ ์ ๋ณธ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ค.
- ์ด 1๋ช
![]() |
|---|
| ์ด๊ฑดํฌ |
| @geongeongeon |
- ๋ฐฑ์ค๋ : 2025. 04. 11 ~ 2025. 08. 06
- ํ๋ก ํธ์ค๋ : 2025. 04. 07 ~ 2025. 08. 06
-
Backend Naming Convention
- ๋ชจ๋ ์ด๋ฆ์ ๊ธฐ๋ฅ๊ณผ ์ฐ๊ด๋ ์์ด ๋จ์ด๋ฅผ ์ฌ์ฉํ๊ณ , ์ถ์ฝ ์์ด ์์ฑํ๋ค.
- ํจํค์ง๋ช
์
lowercase๋ฅผ ๋ฐ๋ฅด๋ฉฐ, ๊ฐ ๋จ์ด๋ ์ (.)์ผ๋ก ๊ตฌ๋ถํ๋ค. - ํด๋์ค๋ช
๊ณผ ์ธํฐํ์ด์ค๋ช
์
PascalCase๋ฅผ ๋ฐ๋ฅธ๋ค. - ๋ฉ์๋๋ช
์
camelCase๋ฅผ ๋ฐ๋ฅธ๋ค. - ๋ณ์๋ช
์
camelCase๋ฅผ ๋ฐ๋ฅธ๋ค. - ์์๋ช
์
SCREAMING_SNAKE_CASE๋ฅผ ๋ฐ๋ฅธ๋ค. - ๊ธฐํ ๋ฆฌ์์ค ํ์ผ๋ช
์
kebab-case๋ฅผ ๋ฐ๋ฅธ๋ค.
-
Frontend Naming Convention
- ๋ชจ๋ ์ด๋ฆ์ ๊ธฐ๋ฅ๊ณผ ์ฐ๊ด๋ ์์ด ๋จ์ด๋ฅผ ์ฌ์ฉํ๋ค.
- ๋๋ ํ ๋ฆฌ๋ช
์
lowercase๋ฅผ ๋ฐ๋ฅธ๋ค. - ์ปดํฌ๋ํธ ํ์ผ๋ช
์
PascalCase๋ฅผ ๋ฐ๋ฅธ๋ค. - CSS ํ์ผ๋ช
์
kebab-case๋ฅผ ๋ฐ๋ฅธ๋ค. - JS ํ์ผ๋ช
์
kebab-case๋ฅผ ๋ฐ๋ฅธ๋ค. - Pinia ๊ด๋ จ ํ์ผ๋ช
์
camelCase๋ฅผ ๋ฐ๋ฅธ๋ค. - HTML ๊ฐ ํ๊ทธ์ id๋ช
๊ณผ class๋ช
์ ๋ถํธ์คํธ๋ฉ๊ณผ ๊ตฌ๋ถํ๊ธฐ ์ํด
snake_case๋ฅผ ๋ฐ๋ฅธ๋ค. - ํจ์๋ช
์
camelCase๋ฅผ ๋ฐ๋ฅธ๋ค. - ๋ณ์๋ช
์
camelCase๋ฅผ ๋ฐ๋ฅธ๋ค. - ์์๋ช
์
SCREAMING_SNAKE_CASE๋ฅผ ๋ฐ๋ฅธ๋ค.
-
RESTful API Design Convention
- URI๋ ๋์ฌ ์ฌ์ฉ์ ์ง์ํ๊ณ
๋ณต์ํ ๋ช ์ฌ์ฌ์ฉ์ ์งํฅํ๋ฉฐ ์๋ฌธ์๋ก ์์ฑํ๋ค. - ๋์์ HTTP ๋ฉ์๋์ธ
GET, POST, PUT, DELETE๋ฅผ ํตํด ํํํ๋ค. ์ฌ๋์(/)๋ฅผ ํตํด ๊ณ์ธต์ ์ธ๋ถํํ๊ณ , URI์ ๋์๋ ์ฌ์ฉํ์ง ์๋๋ค.- ์ธ๋์ค์ฝ์ด(_)๋ฅผ ์ฌ์ฉํ์ง ์๊ณ
ํ์ดํ(-)์ ์ฌ์ฉํ๋ค. - ์์ฒญ ์ ๋ณด์์ด ํ์ํ ๋ฐ์ดํฐ๋ฅผ URI์ ๋ ธ์ถ์ํค์ง ์๋๋ค.
- ์๋ต์
HTTP ์ํ ์ฝ๋, ๋ณธ๋ฌธ, ๋ฉ์ธ์ง๋ฅผ ํฌํจํ JSON ํํ๋ก ํ๋ค.
- URI๋ ๋์ฌ ์ฌ์ฉ์ ์ง์ํ๊ณ
-
Commit Convention
- ๋ชจ๋ ์ปค๋ฐ ๋ฉ์ธ์ง๋ ์ปค๋ฐ ํ์ ์ผ๋ก ์์ํ๊ณ , ๋ด์ฉ์ ์์ด๋ก ์์ฑํ๋ค.
init:ํ๋ก์ ํธ ์์ฑ ๋ฐ ๊ธฐ๋ณธ ์ค์ ์ ์ถ๊ฐํ ๋ ์ฌ์ฉํ๋ค.feat:์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ ๋ ์ฌ์ฉํ๋ค.fix:๋ฒ๊ทธ๋ฅผ ์์ ํ ๋ ์ฌ์ฉํ๋ค.refactor:์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋งํ์ ๋ ์ฌ์ฉํ๋ค.chore:๋น๋ ๋ฐ ์ค์ ํ์ผ์ ์์ ํ์ ๋ ์ฌ์ฉํ๋ค.docs:๋ฌธ์ ํ์ผ์ ์์ ํ์ ๋ ์ฌ์ฉํ๋ค.
-
๋ฐฑ์ค๋ ๐๋ฐฑ์ค๋ ํ๋ก์ ํธ ๊ตฌ์กฐ ๋ณด๊ธฐ
๋ฐฑ์ค๋๋ ๊ท๋ชจ๊ฐ ํฌ๊ณ ๋ณต์กํ ๋ก์ง์ ๋๋ฉ์ธ๋ณ๋ก ๋ถ๋ฆฌํ์ฌ, ๊ฐ ๋๋ฉ์ธ ๊ฐ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๊ณ ์ฑ ์์ ๋ช ํํ ํ์ฌ ์ ์ง๋ณด์์ฑ๊ณผ ํ์ฅ์ฑ์ ๋์ผ ์ ์๋๋ก
๋๋ฉ์ธ ์ค์ฌ ๊ตฌ์กฐ(Domain-Driven Design)๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ค๊ณํ๋ค. -
ํ๋ก ํธ์ค๋ ๐ํ๋ก ํธ์ค๋ ํ๋ก์ ํธ ๊ตฌ์กฐ ๋ณด๊ธฐ
ํ๋ก ํธ์ค๋๋ ์๋์ ์ผ๋ก ๊ท๋ชจ๊ฐ ์๊ณ ๋จ์ํ๊ธฐ ๋๋ฌธ์, ๊ณ์ธต๋ณ๋ก ๋ถ๋ฆฌํ์ฌ ์ ์ฒด ๊ตฌ์กฐ๋ฅผ ์ง๊ด์ ์ผ๋ก ํ์ ํ ์ ์๋๋ก ์ ํต์ ์ธ
๊ณ์ธตํ ๊ตฌ์กฐ(Layered Architecture)๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ค๊ณํ๋ค.
-
๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค
MySQL๐SQL ๋ณด๊ธฐ- Entity-Relationship Diagram(
ERD)
- ์๋น์ค์ ํต์ฌ ๋ฐ์ดํฐ์ธ ํ์, ์คํฐ๋, ์ชฝ์ง์ ๊ด๋ จ๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ค์ ์ ์ฅํ๋ค.
- ๋ค๋๋ค ๊ด๊ณ๋ ์ค๊ฐ ํ ์ด๋ธ์ ํตํด ๋ค๋์ผ, ์ผ๋๋ค ๊ด๊ณ๋ก ์ค๊ณํ๋ค.
- Entity-Relationship Diagram(
-
๋น๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค
Redis- ๋น ๋ฅธ ์กฐํ๋ฅผ ์ํ ์บ์, ํ์ ๊ฐ์ ๋ฑ์ ํ์ํ ์์ ๋ฐ์ดํฐ, ์ฌ์ฉ์ ์ธ์ฆ ํ ํฐ๊ณผ ๊ด๋ จ๋ ๋ฐ์ดํฐ๋ค์ ์ ์ฅํ๋ค.
- key - value ํํ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ , ์ค์ ๋ TTL์ด ๋ง๋ฃ๋๋ฉด ๋ฐ์ดํฐ๊ฐ ์๋์ผ๋ก ์ญ์ ๋๋ค.
-
์ค๋ํฌ์ธํธ
Base URL:http://api.studywith.site:8080 -
๋ผ์ฐํฐ
Base URL:http://www.studywith.site๊ฒฝ๋ก ์ค๋ช 1 / ํ ํ์ด์ง 2 /auth/login ๋ก๊ทธ์ธ ํ์ด์ง 3 /auth/signup/step1 ํ์๊ฐ์ 1๋จ๊ณ ํ์ด์ง 4 /auth/signup/step2 ํ์๊ฐ์ 2๋จ๊ณ ํ์ด์ง 5 /members/me ๋ณธ์ธ ์ ๋ณด ํ์ด์ง 6 /studies ์คํฐ๋ ๋ชฉ๋ก ํ์ด์ง 7 /studies/:id ํน์ ์คํฐ๋(:id) ์ ๋ณด ํ์ด์ง 8 /studies/create ์คํฐ๋ ์์ฑ ํ์ด์ง
-
ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ ๋ฐฉ์
- Spring Security์์ ์ธ์
์
STATELESS(๋ฌด์ํ)๋ก ์ค์ ํ๊ณ ์๋์ ์ผ๋ก ์๋ฒ ๋ถํ๊ฐ ์ ์ ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ์ ์ ์ฉํ๋ค. - OAuth2 ๋ก๊ทธ์ธ์ด ์ฑ๊ณตํ๋ฉด ๊ฐ ์์
์ฌ์ดํธ์์ ๋ฐ๊ธ๋ฐ์
์ก์ธ์ค ํ ํฐ์ํค๋์ ๋ด๊ณ ,๋ฆฌํ๋ ์ ํ ํฐ์SET_COOKIE์ ๋ด์ ์๋ตํ๋ค. - ์ค์ API ์์ฒญ ์
์ธ์ฆ ์๋จ์ผ๋ก ์ก์ธ์ค ํ ํฐ์ ์ฌ์ฉํ๊ณ , ๋ฆฌํ๋ ์ ํ ํฐ์ ์ก์ธ์ค ํ ํฐ์ฌ๋ฐ๊ธ์ ์ฌ์ฉํ๋ค. - ์ก์ธ์ค ํ ํฐ์ ์ ํจ ์๊ฐ์ 30๋ถ์ผ๋ก ์งง๊ฒ ์ค์ ํ๊ณ , ๋ฆฌํ๋ ์ ํ ํฐ์ ์ ํจ ์๊ฐ์ 7์ผ๋ก ๊ธธ๊ฒ ์ค์ ํ๋ค.
- Spring Security์์ ์ธ์
์
-
JPA ๊ธฐ๋ฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ
- ๊ฐ๋ฐ ์ค์ ์ง์ SQL์ ์์ฑํ์ง ์๊ณ ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ ยท ์์ ยท ์ญ์ ๋ฐ ์กฐํ ์์
์ด ๊ฐ๋ฅํ๊ณ , ๋ฐ๋ณต์ ์ธ SQL ์์ฑ์ ์ฌ์ฉ๋๋ ์๊ฐ์ ์ค์ด๊ณ
๋น์ฆ๋์ค ๋ก์ง ๊ฐ๋ฐ์ ์ง์คํ๊ธฐ ์ํด JPA๋ฅผ ์ฌ์ฉํ๋ค. - ๊ฐ๋จํ ์์
์ Repository์
findBy~์ฒ๋ผ ๊ท์น์ ๋ง๋ ์ด๋ฆ์ ๋ฉ์๋๋ฅผ ์ ์ธํ์ฌ ๋ด๋ถ์ ์ผ๋ก ์๋์ผ๋ก ์์ฑ๋๋ ์ฟผ๋ฆฌ๋ฅผ ์ด์ฉํ๋ค. - ๊ทธ๋ฆฌ๊ณ ๊ฒ์์ฒ๋ผ ๋ณต์กํ ์ฟผ๋ฆฌ๊ฐ ํ์ํ ๊ฒฝ์ฐ์๋
QueryDSL์ ์ฌ์ฉํด์ ์๋ฐ ์ฝ๋๋ฅผ ์ค์ SQL ๋ฌธ๋ฒ๊ณผ ์ ์ฌํ๊ฒ ์์ฑํ๋ค. - ์๋์ ์ผ๋ก ๋ณต์ก๋๋ ๋ฎ์ง๋ง ํน์ ์กฐ๊ฑด ๋ฑ์ ์ธ๋ฐํ๊ฒ ๋ค๋ค์ผ ํ ๊ฒฝ์ฐ์๋
JPQL์ ์ด์ฉํ๋ค.
- ๊ฐ๋ฐ ์ค์ ์ง์ SQL์ ์์ฑํ์ง ์๊ณ ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ ยท ์์ ยท ์ญ์ ๋ฐ ์กฐํ ์์
์ด ๊ฐ๋ฅํ๊ณ , ๋ฐ๋ณต์ ์ธ SQL ์์ฑ์ ์ฌ์ฉ๋๋ ์๊ฐ์ ์ค์ด๊ณ
-
์๋ต ์ฑ๋ฅ ์ต์ ํ
- ์์ฃผ ์์ฒญ๋๋ ๋ฐ์ดํฐ๋ Redis์
์บ์๋ฅผ ์ ์ฅํ์ฌ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์กฐํ ํ์๋ฅผ ์ต์ํํด ์๋ฒ ๋ถํ๋ฅผ ์ค์ด๊ณ ์๋ต ์๋๋ฅผ ๊ฐ์ ํ๋ค. - TTL์ ์ค์ ํ๊ณ , ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ ์บ์๋ฅผ ๊ฐฑ์ ํ์ฌ ๋ฐ์ดํฐ์ ์ต์ ์ํ๋ฅผ ์ ์งํ๋ค.
- ์์ฃผ ์์ฒญ๋๋ ๋ฐ์ดํฐ๋ Redis์
-
ํด๋ผ์ฐ๋ ๊ฐ์ฒด ์คํ ๋ฆฌ์ง
- ํ์ผ์ AWS์์ ์ ๊ณตํ๋ ํด๋ผ์ฐ๋ ๊ฐ์ฒด ์คํ ๋ฆฌ์ง์ธ
S3์ ์ ์ฅํ์ฌ ์๋ฒ ์ ์ฅ ๊ณต๊ฐ๊ณผ ๋ถํ๋ฅผ ์ค์ด๊ณ , ํ์ฅ์ฑ๊ณผ ์์ ์ฑ์ด ๋ฐ์ด๋ ํ์ผ ์ ์ฅ ํ๊ฒฝ์ ๊ตฌํํ๋ค. - API ์์ฒญ ์
MultipartFileํํ๋ก ๋ฐ์ ํ์ผ์ ๋๋คํUUID๋ฅผ key๋ก ์ฌ์ฉํ์ฌ ์ ์ฅํ๊ฑฐ๋, ํด๋นํ๋ key๋ฅผ ์ด์ฉํ์ฌ ํ์ผ์ ์ญ์ ํ๋ค. - ์๋ฒ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์๋ ํ์ผ์ด ์ ์ฅ๋ URL์ ์ ์ฅํ์ฌ, ์๋ฒ์ ์ง์ ์ ์ธ ํ์ผ ๊ด๋ฆฌ ๋ถ๋ด์ ์ค์๋ค.
- ํ์ผ์ AWS์์ ์ ๊ณตํ๋ ํด๋ผ์ฐ๋ ๊ฐ์ฒด ์คํ ๋ฆฌ์ง์ธ
-
์ผ๊ด๋ ์๋ต ์ฒ๋ฆฌ
- ๋ชจ๋ API ์์ฒญ์ ๋ํ ์๋ต์
HTTP ์ํ ์ฝ๋,๋ฉ์ธ์ง,๋ฐ์ดํฐํํ๋ก ํ์ฌ ์ผ๊ด์ฑ์ ์ ์งํ๋ค. - ์ฑ๊ณต์ ๋ํ ์๋ต์
SuccessResponseUtil์์ ์ฒ๋ฆฌํ๊ณ , ์คํจ์ ๋ํ ์๋ต์FailureResponseUtil์์ ์ฒ๋ฆฌํ๋ค.
- ๋ชจ๋ API ์์ฒญ์ ๋ํ ์๋ต์
-
๊ณ์ธตํ๋ ์์ธ ์ฒ๋ฆฌ
- ์๋น์ค์์ ์ค์ ๋ก ๋ฐ์ํ ์ ์๋ ์์ธ๋ค์ ๊ฐ๊ฐ ์ปค์คํ ์์ธ ํด๋์ค๋ก ์ ์ํ์ฌ, ๋ช ํํ๊ณ ๊ตฌ์ฒด์ ์ธ ์์ธ ์ฒ๋ฆฌ๋ฅผ ๊ตฌํํ๋ค.
๋๋ฉ์ธ๋ณ ControllerAdvice๋ฅผ ์ ์ํ์ฌ ๊ฐ ๋๋ฉ์ธ๋ง๋ค ๋ฐ์ํ ์ ์๋ ์์ธ๋ค์ ๋ถ๋ฆฌํ์ฌ ์ฒ๋ฆฌํ๋ค.๊ธ๋ก๋ฒ ControllerAdvice๋ฅผ ์ ์ํ์ฌ ์๊ธฐ์น ๋ชปํ ์์ธ๋ ๊ณตํต์ ์ผ๋ก ๋ฐ์ํ ์ ์๋ ์์ธ๋ฅผ ์ฒ๋ฆฌํ๊ณ ์ผ๊ด๋ ์๋ต์ ์ ๊ณตํ๋ค.
-
ํตํฉ ํ ์คํธ
- ์คํ๋ง๋ถํธ ํ
์คํธ ํ๊ฒฝ์์
JUnit์ ํ์ฉํ์ฌ ํตํฉ ํ ์คํธ๋ฅผ ์งํํ๋ค. @BeforeEach๋ฅผ ํตํด ๊ฐ ํ ์คํธ ์ ์ด๊ธฐ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๊ณ ,@Transactional์ ํตํด ๊ฐ ํ ์คํธ๋ง๋ค ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํ๋ฅผ ์ด๊ธฐํํ์ฌ ๋ ๋ฆฝ์ ์ธ ํ ์คํธ ํ๊ฒฝ์ ๋ณด์ฅํ๋ค.- ์์๋๋ ์์ธ๋
assertThatThrownBy()๋ฅผ ์ฌ์ฉํด ์ ์ ํ ์์ธ๊ฐ ๋ฐ์ํ๋์ง ๊ฒ์ฆํ๋ค.
- ์คํ๋ง๋ถํธ ํ
์คํธ ํ๊ฒฝ์์
-
์ฑ๊ธ ํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์
- ๋ ๋น ๋ฅธ ํ๋ฉด ์ ํ๊ณผ ์ฑ๋ฅ ํฅ์์ ํตํด ์ฌ์ฉ์์๊ฒ ๋์ ์ธ ๊ฒฝํ์ ์ค ์ ์๋ SPA ๋ฐฉ์์ ์ ํํ๋ค.
- Vue 3๊ณผ
Composition API๋ฅผ ํ์ฉํ์ฌ ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ๊ณผ ๊ฐ๋ ์ฑ์ ๋์ฌ, ๋ณต์กํ ์ปดํฌ๋ํธ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค์๋ค. - ์๋ก๊ณ ์นจ ์์ด ํ๋์ ํ์ด์ง ๋ด์์
Axios๋ฅผ ํ์ฉํ ๋น๋๊ธฐ์ ํต์ ์ผ๋ก ํ์ํ ๋ฐ์ดํฐ๋ง ๊ฐฑ์ ํ์ฌ ์๋ฒ ๋ถํ๋ฅผ ์ค์ด๊ณ ์๋ต ์๋๋ฅผ ๋์๋ค.
-
SPA ์ํ ๊ด๋ฆฌ ๊ด๋ จ ์ด์
- ์ฑ๊ธ ํ์ด์ง์ ํน์ฑ ์ ํ๋ฉด์ ๋ฐ์ดํฐ๊ฐ ๋ ๋๋ง๋ ๋์๋ง ๋ฉ๋ชจ๋ฆฌ์ ์ ์ง๋๊ณ , ์๋ก๊ณ ์นจ์ ํ ํ์๋ ๋ฉ๋ชจ๋ฆฌ์ ์์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ค์ด ๋ชจ๋ ์ญ์ ๋๋ค.
- ์์ ๋ก๊ทธ์ธ์ ํ ์ค์ ๋ ๋ฆฌ๋ค์ด๋ ํธ URL๋ก ์ด๋ํ๋ ๊ณผ์ ์์, ์๋ก๊ณ ์นจ์ด ๋ฐ์ํด ๋ก๊ทธ์ธ ์ํ๊ฐ ์ฌ๋ผ์ง๊ณ ์ ์์ ์ธ ๋ก๊ทธ์ธ ์ฒ๋ฆฌ๊ฐ ๋์ง ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
- ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด
Pinia๋ผ๋ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋์ ํ์ฌ ๋ก๊ทธ์ธ ์ํ๋ฅผ ์ ์ฅํ๊ธฐ๋ก ํ๋ค. - ๊ทธ๋ ๊ฒ ์๋ก๊ณ ์นจ์ ํ ํ ๋ก๊ทธ์ธ ์ํ๋ ์ ์ง๋์์ผ๋ ํ ํฐ์ด ์์ด ๋ค๋ฅธ API ์์ฒญ์ ์คํจํ๋ ์ํ์ ๋น ์ง๊ฒ ๋์๋ค.
- ๊ทธ๋์ ๋ก๊ทธ์ธ ์ฑ๊ณต ์ ์๋ฒ์์ ์๋ต์ ์ก์ธ์ค ํ ํฐ์
์๋ต ํค๋์ ๋ด๊ณ , ๋ฆฌํ๋ ์ ํ ํฐ์SET_COOKIE์ ๋ด์์ ์ ๋ฌํ์๋ ์ ๋ต์ ์ธ์ ๋ค. - ํ๋ก ํธ์ค๋์์๋ ์๋ต์์ ๋ ํ ํฐ์ ๊ฐ๊ฐ ์ถ์ถํ์ฌ ๋ก๊ทธ์ธ ์ํ์ ํจ๊ป Pinia์ ์ ์ฅํจ์ผ๋ก์จ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
-
OAuth2 ํ ํฐ ๊ด๋ จ ์์ฒญ ์ด์
- ๋ชจ๋ API ์์ฒญ์ ๋จผ์
AuthenticationFilter๋ฅผ ๊ฑฐ์น๋๋ฐ, ์ก์ธ์ค ํ ํฐ์ด ์์ ๊ฒฝ์ฐ ๋ฆฌํ๋ ์ ํ ํฐ์ ํตํด ์๋์ผ๋ก ์ก์ธ์ค ํ ํฐ ์ฌ๋ฐ๊ธ API๋ฅผ ํธ์ถํ๋ค. - ๋ค์ด๋ฒ ๋ก๊ทธ์ธ์ ๊ฒฝ์ฐ ์งง์ ์๊ฐ์ ๋ง์ ์์ฒญ์ ๋ณด๋ด๋ฉด ์ผ์์ ์ธ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค๋ ๊ฒ์ ํ์ธํ๋ค.
- ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ก๊ทธ์ธํ ์ฌ๋์ ID๋ฅผ key๋ก ํ์ฌ Redis์ ์ก์ธ์ค ํ ํฐ์ ์ผ์ ์๊ฐ๋์ ์ ์ฅํ๊ณ ์ก์ธ์ค ํ ํฐ์ด ๋จ์ ์์ ๊ฒฝ์ฐ
์ฌ์ฌ์ฉํ์๋ ์ ๋ต์ ์ธ์ ๋ค. - AuthenticationFilter์์ ๋ก๊ทธ์ธํ ์ฌ๋์ ID๋ฅผ ์์์ผ ํ๋๋ฐ, ์์ฒญ ์ ID๋ฅผ ํจ๊ป ๋ณด๋ด๋ฉด ๋๊ฒ ๋ค๊ณ ์๊ฐํ๋ค.
- ํ์ง๋ง Spring Security๊ฐ ๋จผ์ ์์ฒญ์ ๊ฐ๋ก์ฑ AuthenticationFilter๋ก ๋ณด๋ด๊ธฐ ๋๋ฌธ์ ํ ํฐ ๊ฒ์ฆ ์ ์๋ ์์ฒญ ๋ด์ฉ์ ํ์ธํ ์ ์์๋ค.
- ๊ทธ๋์ ๋ฆฌํ๋ ์ ํ ํฐ์ key๋ก ํด์ Redis์ ๋ก๊ทธ์ธํ ์ฌ๋์ ID๋ฅผ ์ ์ฅํ๊ณ , ๋ฆฌํ๋ ์ ํ ํฐ๋ง์ผ๋ก ID๋ฅผ ํ์ธํ ํ ์ก์ธ์ค ํ ํฐ๋ ํ์ธํ๋ ๋ฐฉ๋ฒ์ ํตํด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
- ๋ชจ๋ API ์์ฒญ์ ๋จผ์
-
์์ฌ์ด ์ ยท ๊ฐ์ ํ ์
๋ฐ์ํ ๋ ์ด์์- ๋ถํธ์คํธ๋ฉ์ ์ฌ์ฉํ์ฌ ๋ฐ์ํ ๋ ์ด์์ ์ค๊ณ๋ ๋์์ธ ๋ฑ ์ ์ฒด์ ์ธ ๋ถ๋ถ์์ ๋ง์ ๋์์ ๋ฐ์์ง๋ง, ์ผ๋ถ ๋ง์์ ๋ค์ง ์๋ ์์๋ค์ด ์์ด ์ง์ ๋์์ธ ํ์ง๋ง ์ผ๋ถ ํ์ด์ง์์ ๋ฐ์ํ์ด ๊นจ์ง ๋ถ๋ถ์ด ๊ฐ์ฅ ์์ฌ์ด ๊ฒ ๊ฐ๋ค.
์บ์ ์ ๋ต- ์ผ๋ถ ๋๋ฉ์ธ์์ ์บ์๋ฅผ ํตํด ์กฐํ ์ฑ๋ฅ์ ํฅ์์ํค๊ธด ํ์ง๋ง ์บ์ ์ ์ง์ ์ต์ ๋ฐ์ดํฐ ๋๊ธฐํ ์ฌ์ด์์ ๊ณ ๋ฏผ์ ์ ๋ง ๋ง์ด ํ๋๋ฐ, ์ต์ข ์ ์ผ๋ก ์ต์ ์ ์ ๋ต์ ์ธ์ฐ์ง ๋ชปํ ๊ฒ์ด ์์ฝ๋ค.
Git ๊ด๋ฆฌ- ํ๋ก์ ํธ ์ด๋ฐ์๋ ์ธ๋ถํํด์ Git ๊ด๋ฆฌ๋ฅผ ํ์ง๋ง, ๊ฐ์ธ ํ๋ก์ ํธ๋ผ๋ ์์ผํจ ๋๋ฌธ์ ํ๋ฐ์๋ ํ ๋ฒ์ ๋ชฐ์์ ์ปค๋ฐํ๋ ๋ฑ Git ๊ด๋ฆฌ๋ฅผ ์ํํ ํ ์ ์ด ์์ฝ๋ค.
-
์ถ๊ฐ ๊ฐ๋ฐ ๊ณํ
์คํฐ๋ ๊ธฐ๋ฅ ์ถ๊ฐ- ์คํฐ๋ ๋งค์นญ ํ๋ซํผ์ด๋ผ๋ ์ฃผ์ ์ ๋ง์ถฐ, ๊ฐ์ฅ ๋จผ์ ์ถ๊ฐ ํด์ผํ ๊ฒ์ ๋ฐ๋ก ์คํฐ๋์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ๊ฒ์ด๋ค.
- ๋ํ์ ์ธ ์์๋ก, ๋ฌธ์ ํ์ด๋ ํ๊ธฐ ์์ฑ์ ์ํ ๊ฒ์ํ์ ๋ง๋ค์ด ์ฌ๋ฌ ์ฌ๋๋ค๊ณผ ๊ณต์ ํ ์ ์๋๋ก ํ ๊ฒ์ด๋ค.
์คํฐ๋ ๊ฒ์ ํํฐ ์กฐ๊ฑด ๋ค์ํ- ํ์ฌ ๊ตฌํ๋ ์คํฐ๋ ๊ฒ์ ํํฐ์๋ ๋ชจ์ง ์ํ์ ๊ด๋ จ๋ ์กฐ๊ฑด๋ฐ์ ์๋๋ฐ, ์ฐ๋ น, ์ฑ๋ณ ๋ฑ๊ณผ ๊ด๋ จ๋ ์กฐ๊ฑด์ ์ถ๊ฐํ์ฌ ์ข ๋ ์ธ๋ฐํ ๊ฒ์์ด ๊ฐ๋ฅํ๋๋ก ํ ๊ฒ์ด๋ค.
์ง๋ API ์ฌ์ฉ- ๊ฐ์ ํ ๋ ํ๋ ์ง์ญ์ ์ ยท ๊ตฐ ยท ๊ตฌ ๋จ์๋ก ์ ๋ ฅ ๋ฐ๊ณ ์๋๋ฐ, ์ง๋ API๋ฅผ ์ฌ์ฉํ์ฌ ๋ ์ ํํ ์์น๋ฅผ ๊ณ์ฐํ๊ณ ์ฃผ๋ณ ์คํฐ๋๋ค์ ๊ฒ์ํ ์ ์๋๋ก ํ ๊ฒ์ด๋ค.
์ฌ์ดํธ ๊ด๋ฆฌ์ ๊ธฐ๋ฅ ์ถ๊ฐ- ์ฌ์ดํธ ๊ด๋ฆฌ์ ๊ธฐ๋ฅ์ ๋์ ํ์ฌ ์ฌ์ดํธ์ ๊ด๋ฆฌ์์ธ ๋ด๊ฐ SQL์ ์ฌ์ฉํ์ง ์๊ณ ๋ ์ฌ์ดํธ๋ฅผ ํธ๋ฆฌํ๊ฒ ๊ด๋ฆฌํ ์ ์๋๋ก ํ ๊ฒ์ด๋ค.
-
ํ๊ธฐ
์ผ๋จ ๊ทธ๋์ ์ด๋ค ๊ฒ์ ๋ํด์ ๋ฐฐ์ฐ๋ฉด ๋ฏธ๋ ํ๋ก์ ํธ๋ก ๊ทธ๊ฒ์ ์ ์ฉํด๋ณด๊ธด ํ์ง๋ง ํ๋์ ์์ฑ๋ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค์ด ๋ณธ ๊ฒฝํ์ด ์ค๋๋ง์ธ ๊ฒ ๊ฐ์ ๋ง์กฑ์ค๋ฝ๊ณ ์ฌ๋ฏธ์์๋ค. ๊ทธ๋ฆฌ๊ณ ํ ํ๋ก์ ํธ๊ฐ ์๋๋ผ ๊ธฐํ๋ถํฐ ๊ฐ๋ฐ ๋ฐ ๋ฐฐํฌ๊น์ง ๋ชจ๋ ๊ฒ์ ํผ์ ํ๋ฉด์ ๋งํ๋ ๋ถ๋ถ์ด ์๊ธธ ๊ฒฝ์ฐ ์ค์ง์ ์ผ๋ก ๋์์ ์์ฒญํ ์ฌ๋์ด ์์ด์ ํด๊ฒฐํ๊ธฐ ์ํด ์ ๋ง ๊ณ ์ํ ๊ฒ ๊ฐ๋ค. ๋ด๊ฐ ์๊ฐํ๋ ๊ฒ๋ณด๋ค ํ๋ก์ ํธ ๊ธฐ๊ฐ์ด ๊ต์ฅํ ์ค๋ ๊ฑธ๋ ธ์ง๋ง, ๊ตฌ๊ธ๋ง์ ํ๊ณ ์ธ๊ฐ์ ๋ณด๋ฉฐ ๋๊น์ง ํฌ๊ธฐํ์ง ์์๋ค๋ ๊ฒ์ผ๋ก๋ ๋ง์กฑ์ค๋ฝ๊ฒ ์๊ฐํ๋ค. ํ ํ๋ก์ ํธ๊ฐ ์๋์ฌ์ ์ค์ ๋ก ๋ค๋ฅธ ์ฌ๋๋ค๊ณผ ํ์ ํ ์๋ ์์๋ ๊ฒ์ด ์์ฌ์ ์ง๋ง ๊ตฌ๊ธ๋ง๊ณผ ํ์ ์ ์น๊ตฌ์๊ฒ ์ค๋ฌด์์๋ ์ด๋ค ์์ผ๋ก ๊ฐ๋ฐํ๋์ง ์กฐ์ธ์ ๋ค์ผ๋ฉฐ ์ต๋ํ ์ค๋ฌด์ฒ๋ผ ํด๋ณด๋ ค๊ณ ๋ ธ๋ ฅํ๋ค. ์ด ๊ณผ์ ์์ ์ ๋ณด์ฒ๋ฆฌ๊ธฐ์ฌ๋ฅผ ๊ณต๋ถํ๋ฉฐ ๋์์ธ ํจํด์ ์ด์ฌํ ์๊ธฐํ ๋ '์ค์ ๋ก ๊ฐ๋ฐํ ๋ ์ด๋ฐ ๊ฒ๋ค์ด ๋ค ์ฐ์ด๊ธฐ๋ ํ๋ ๊ฑธ๊น?' ํ๋ ์๊ฐ์ ํ๊ณค ํ์๋๋ฐ ์ค์ ๋ก ์ฌ๋ฌ๊ฐ์ง ๋์์ธ ํจํด์ด ์ฌ์ฉ๋๋ค๋ ๊ฒ์ ์๊ฒ ๋์๋ค. ์ค๋ฌด ํ๋ด๋ฅผ ๋ด๊ธฐ ์ํด ๋ฐฐ์ด ๊ฒ๋ค์ ํ๋ฒ์ ์ต๋ํ ์ ์ฉํด๋ณด๋ค ๋ณด๋ ๋ถ๋ช ํ ๋ฏธ์ํ ์ ์ด ๋ง์ง๋ง ๊ทธ ๊ณผ์ ์์์ ์ฑ์ฅ์ ์๋ฏธ์๊ฒ ์๊ฐํ๋ค. ๊ทธ๋ฆฌ๊ณ API๋ฅผ ๊ฐ๋ฐํ๊ณ Postman์ ์ฌ์ฉํด ํ ์คํธ๋ฅผ ์งํํ๋๋ฐ, ๋ด๊ฐ ์๊ฐํ์ง ๋ชปํ๋ ์์ธ๋ค์ด ๋๋ ์์ด ๋ฐ์ํด์ ๋๋๋ค. ๋๋ ์๋ ์์ธ๋ค์ ํ๋ํ๋ ์ฒ๋ฆฌํ๊ธฐ ์ํด ํ ์คํธ๊ฐ ๊ต์ฅํ ์ค์ํ๋ค๋ ๊ฒ์ ๊นจ๋ซ๊ฒ ๋์๋ค. ์ค์ ๋ก ์ค๋ฌด์์๋ ๊ฐ๋ฐ ์๊ฐ๋ณด๋ค ํ ์คํธ ์ผ์ด์ค ์์ฑํ๋ ๋ฐ์ ์๊ฐ์ ๋ ์ด๋ค๋ ๋ง์ ๋ค์ ์ ์ด ์๋๋ฐ ๊ทธ ์ด์ ๋ฅผ ์ด๋ฒ ํ๋ก์ ํธ๋ฅผ ๊ธฐํ๋ก ์๊ฒ๋ ๊ฒ ๊ฐ๋ค. ์ด๋ฒ ํ๋ก์ ํธ๋ฅผ ํตํด ๋๋ ์์ฌ์์ ๋ฐํ ์ผ์, ๋ค์์๋ ํ ์คํธ ์ผ์ด์ค๋ฅผ ๊ผผ๊ผผํ ์์ฑํ๋ฉฐ ์์ฑ๋๋ฅผ ๋์ด๊ณ ์์ฌ์ ๋ ์ ๋ค์ ๊ฐ์ ํด๊ฐ ๊ฒ์ ๋ค์ง์ผ๋ก ์ด๋ฒ ํ๋ก์ ํธ๋ฅผ ๋ง๋ฌด๋ฆฌํ๋ค.















