Skip to content

geongeongeon/StudyWith-backend

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

25 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ง ์Šคํ„ฐ๋”” ๋งค์นญ ํ”Œ๋žซํผ :: Study With


๋กœ๊ณ 


๐Ÿ“‹ ๋ชฉ์ฐจ



๐Ÿ“ข ์†Œ๊ฐœ ๋ฐ ๋ชฉ์ 


  • StudyWith๋Š” ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ, ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๊ณผ ์–ด๋–ค ๋ถ„์•ผ๋ฅผ ํ•จ๊ป˜ ๊ณต๋ถ€ํ•  ์ˆ˜ ์žˆ๋Š” ์Šคํ„ฐ๋”” ๊ทธ๋ฃน์„ ๊ตฌํ•˜๋Š” ํ”Œ๋žซํผ์ด๋‹ค.

    • ๊ฒ€์ƒ‰์„ ํ†ตํ•ด ๊ด€์‹ฌ์‚ฌ์™€ ์ง€์—ญ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งž์ถคํ˜• ์Šคํ„ฐ๋”” ๊ทธ๋ฃน์„ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ์Šคํ„ฐ๋”” ๊ทธ๋ฃน์„ ์ง์ ‘ ๊ฐœ์„คํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๊ฐ™์€ ์Šคํ„ฐ๋”” ๊ทธ๋ฃน ๋‚ด ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๋“ค๊ณผ ์†Œํ†ตํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์‚ฌ์šฉ์ž ์นœํ™”์ ์ธ UI/UX๋ฅผ ์ œ๊ณตํ•˜๊ณ  ํ™”๋ฉด ํฌ๊ธฐ์— ๋”ฐ๋ผ ์ตœ์ ํ™” ์„ค๊ณ„๊ฐ€ ๋˜์–ด ์žˆ๋‹ค.
  • ๊ทธ๋™์•ˆ ๋‹จ์ˆœํžˆ ์–ด๋–ค ๊ฒƒ์— ๋Œ€ํ•ด ๊ณต๋ถ€๋ฅผ ํ•˜๊ณ  ์™„์„ฑ๋œ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•ด๋ณธ ๊ฒฝํ—˜์ด ๋ถ€์กฑํ•˜๋‹ค๊ณ  ๋А๊ปด, ์‹ค์ œ๋กœ ํ•˜๋‚˜์˜ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค.

  • ์‹ค๋ฌด์™€ ์œ ์‚ฌํ•œ ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ ๊ฒฝํ—˜์„ ์Œ“๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋ถ€ํ„ฐ ํ…Œ์ŠคํŠธ ๋ฐ ๋ฐฐํฌ๊นŒ์ง€ ์ „์ฒด ๊ฐœ๋ฐœ ๊ณผ์ •์„ ์ง์ ‘ ์ฒดํ—˜ํ•ด๋ณด๊ณ ์ž ๋ณธ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค.


๐Ÿ‘จโ€๐Ÿ’ป ํŒ€์›


  • ์ด 1๋ช…
์ด๊ฑดํฌ
์ด๊ฑดํฌ
@geongeongeon

๐Ÿ“… ๊ฐœ๋ฐœ ์ผ์ •


  • ๋ฐฑ์•ค๋“œ : 2025. 04. 11 ~ 2025. 08. 06
  • ํ”„๋ก ํŠธ์•ค๋“œ : 2025. 04. 07 ~ 2025. 08. 06

๐Ÿ–ฅ๏ธ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ


  • Language
    JAVA HTML5 CSS3 JavaScript

  • Database
    MySQL Redis

  • Framework
    Spring Boot Spring Security Vue.js

  • Version Control & Deployment
    Git GitHub Docker


๐Ÿ“ ์ปจ๋ฒค์…˜


  • 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 ํ˜•ํƒœ๋กœ ํ•œ๋‹ค.
  • Commit Convention

    • ๋ชจ๋“  ์ปค๋ฐ‹ ๋ฉ”์„ธ์ง€๋Š” ์ปค๋ฐ‹ ํƒ€์ž…์œผ๋กœ ์‹œ์ž‘ํ•˜๊ณ , ๋‚ด์šฉ์€ ์˜์–ด๋กœ ์ž‘์„ฑํ•œ๋‹ค.
    • init: ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ๋ฐ ๊ธฐ๋ณธ ์„ค์ •์„ ์ถ”๊ฐ€ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
    • feat: ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
    • fix: ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
    • refactor: ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ–ˆ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
    • chore: ๋นŒ๋“œ ๋ฐ ์„ค์ • ํŒŒ์ผ์„ ์ˆ˜์ •ํ–ˆ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
    • docs: ๋ฌธ์„œ ํŒŒ์ผ์„ ์ˆ˜์ •ํ–ˆ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

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


  • ๋ฐฑ์•ค๋“œ ๐Ÿ”—๋ฐฑ์•ค๋“œ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ๋ณด๊ธฐ

    ๋ฐฑ์•ค๋“œ๋Š” ๊ทœ๋ชจ๊ฐ€ ํฌ๊ณ  ๋ณต์žกํ•œ ๋กœ์ง์„ ๋„๋ฉ”์ธ๋ณ„๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ, ๊ฐ ๋„๋ฉ”์ธ ๊ฐ„ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ์ฑ…์ž„์„ ๋ช…ํ™•ํžˆ ํ•˜์—ฌ ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋„๋ก ๋„๋ฉ”์ธ ์ค‘์‹ฌ ๊ตฌ์กฐ(Domain-Driven Design)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ค๊ณ„ํ–ˆ๋‹ค.

  • ํ”„๋ก ํŠธ์•ค๋“œ ๐Ÿ”—ํ”„๋ก ํŠธ์•ค๋“œ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ๋ณด๊ธฐ

    ํ”„๋ก ํŠธ์•ค๋“œ๋Š” ์ƒ๋Œ€์ ์œผ๋กœ ๊ทœ๋ชจ๊ฐ€ ์ž‘๊ณ  ๋‹จ์ˆœํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ณ„์ธต๋ณ„๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์ „์ฒด ๊ตฌ์กฐ๋ฅผ ์ง๊ด€์ ์œผ๋กœ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ „ํ†ต์ ์ธ ๊ณ„์ธตํ˜• ๊ตฌ์กฐ(Layered Architecture)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ค๊ณ„ํ–ˆ๋‹ค.


๐Ÿ’พ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค๊ณ„


  • ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค MySQL ๐Ÿ”—SQL ๋ณด๊ธฐ

    • Entity-Relationship Diagram(ERD)
    • ์„œ๋น„์Šค์˜ ํ•ต์‹ฌ ๋ฐ์ดํ„ฐ์ธ ํšŒ์›, ์Šคํ„ฐ๋””, ์ชฝ์ง€์™€ ๊ด€๋ จ๋œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋“ค์„ ์ €์žฅํ•œ๋‹ค.
    • ๋‹ค๋Œ€๋‹ค ๊ด€๊ณ„๋Š” ์ค‘๊ฐ„ ํ…Œ์ด๋ธ”์„ ํ†ตํ•ด ๋‹ค๋Œ€์ผ, ์ผ๋Œ€๋‹ค ๊ด€๊ณ„๋กœ ์„ค๊ณ„ํ–ˆ๋‹ค.
  • ๋น„๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค Redis

    • ๋น ๋ฅธ ์กฐํšŒ๋ฅผ ์œ„ํ•œ ์บ์‹œ, ํšŒ์› ๊ฐ€์ž… ๋“ฑ์— ํ•„์š”ํ•œ ์ž„์‹œ ๋ฐ์ดํ„ฐ, ์‚ฌ์šฉ์ž ์ธ์ฆ ํ† ํฐ๊ณผ ๊ด€๋ จ๋œ ๋ฐ์ดํ„ฐ๋“ค์„ ์ €์žฅํ•œ๋‹ค.
    • key - value ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ , ์„ค์ •๋œ TTL์ด ๋งŒ๋ฃŒ๋˜๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ์ž๋™์œผ๋กœ ์‚ญ์ œ๋œ๋‹ค.

๐Ÿšฉ ์•ค๋“œํฌ์ธํŠธ ๋ฐ ๋ผ์šฐํ„ฐ


  • ์•ค๋“œํฌ์ธํŠธ
    Base URL: http://api.studywith.site:8080

    ๋ฉ”์„œ๋“œ ๊ฒฝ๋กœ ์„ค๋ช…
    1 GET /connection/test ์„œ๋ฒ„ ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ
    2 GET /oauth2/authorization/{provider} OAuth2 ๋กœ๊ทธ์ธ ์š”์ฒญ
    3 POST /auth/token/refresh ํ† ํฐ ์žฌ๋ฐœ๊ธ‰ ์š”์ฒญ
    4 POST /auth/logout ๋กœ๊ทธ์•„์›ƒ ์š”์ฒญ
    5 GET /members ํšŒ์› ๋ชฉ๋ก ์กฐํšŒ
    6 GET /members/{id} ํŠน์ • ํšŒ์›({id}) ์กฐํšŒ
    7 GET /members/me ๋ณธ์ธ ์ •๋ณด ์กฐํšŒ
    8 GET /members/exists?nickname={nickname} ๋‹‰๋„ค์ž„ ์ค‘๋ณต ์—ฌ๋ถ€ ์กฐํšŒ
    9 POST /members ํšŒ์› ๊ฐ€์ž…
    10 PUT /members/{id} ํŠน์ • ํšŒ์›({id}) ์ •๋ณด ์ˆ˜์ •
    11 PUT /members/me ๋ณธ์ธ ์ •๋ณด ์ˆ˜์ •
    12 DELETE /members/{id} ํŠน์ • ํšŒ์›({id}) ์ถ”๋ฐฉ
    13 DELETE /members/me ๋ณธ์ธ ํšŒ์› ํƒˆํ‡ด
    14 GET /studies ์Šคํ„ฐ๋”” ๋ชฉ๋ก ์กฐํšŒ
    15 GET /studies/{id} ํŠน์ • ์Šคํ„ฐ๋””({id}) ์กฐํšŒ
    16 GET /studies/my ๋ณธ์ธ์ด ๊ฐ€์ž…ํ•œ ์Šคํ„ฐ๋”” ๋ชฉ๋ก ์กฐํšŒ
    17 GET /studies/{id}/members ํŠน์ • ์Šคํ„ฐ๋””({id}) ํšŒ์› ๋ชฉ๋ก ์กฐํšŒ
    18 GET /studies/{id}/join-requests ํŠน์ • ์Šคํ„ฐ๋””({id}) ๊ฐ€์ž… ์š”์ฒญ ๋ชฉ๋ก ์กฐํšŒ
    19 POST /studies ์Šคํ„ฐ๋”” ์ƒ์„ฑ
    20 POST /studies/{id}/join-requests ํŠน์ • ์Šคํ„ฐ๋””({id}) ๊ฐ€์ž… ์š”์ฒญ ์ œ์ถœ
    21 POST /studies/{id}/join-requests/{memberId}/accept ํŠน์ • ์Šคํ„ฐ๋””({id}) ํšŒ์›({memberId}) ๊ฐ€์ž… ์Šน์ธ
    22 PUT /studies/{id}/manager ์Šคํ„ฐ๋”” ๋ถ€๊ด€๋ฆฌ์ž์—๊ฒŒ ์ด๊ด€๋ฆฌ์ž ๊ถŒํ•œ์„ ์œ„์ž„
    23 PUT /studies/{id}/sub-manager/{memberId} ํŠน์ • ์Šคํ„ฐ๋””({id}) ํšŒ์›({memberId})๋ฅผ ๋ถ€๊ด€๋ฆฌ์ž๋กœ ์„ค์ •
    24 PUT /studies/{id}/recruitment ์Šคํ„ฐ๋”” ๋ชจ์ง‘ ์ƒํƒœ ๋ณ€๊ฒฝ
    25 DELETE /studies ์Šคํ„ฐ๋”” ์‚ญ์ œ
    26 DELETE /studies/{id}/sub-manager ์Šคํ„ฐ๋”” ๋ถ€๊ด€๋ฆฌ์ž ๊ถŒํ•œ ํ•ด์ œ
    27 DELETE /studies/{id}/join-requests/{memberId} ํŠน์ • ๊ฐ€์ž… ์š”์ฒญ({memberId}) ๊ฑฐ์ ˆ
    28 DELETE /studies/{id}/members ํŠน์ • ์Šคํ„ฐ๋””({id}) ๋ชจ๋“  ํšŒ์› ์ถ”๋ฐฉ
    29 DELETE /studies/{id}/members/{memberId} ํŠน์ • ์Šคํ„ฐ๋””({id}) ํšŒ์›({memberId}) ์ถ”๋ฐฉ
    30 DELETE /studies/{id}/members/me ๋ณธ์ธ ์Šคํ„ฐ๋”” ํƒˆํ‡ด
    31 GET /messages ์ชฝ์ง€ ๋ชฉ๋ก ์กฐํšŒ
    32 GET /messages/{id} ํŠน์ • ์ชฝ์ง€({id}) ์กฐํšŒ
    33 POST /messages ์ชฝ์ง€ ์ „์†ก
    34 DELETE /messages ๋ชจ๋“  ์ชฝ์ง€ ์‚ญ์ œ
    35 DELETE /messages/{id} ํŠน์ • ์ชฝ์ง€({id}) ์‚ญ์ œ
  • ๋ผ์šฐํ„ฐ
    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 ์Šคํ„ฐ๋”” ์ƒ์„ฑ ํŽ˜์ด์ง€

โœจ ๊ธฐ๋Šฅ ์ƒ์„ธ


๊ธฐ๋Šฅ ํŽ˜์ด์ง€ ์„ค๋ช…
ํ™ˆ ํ—ค๋”์—๋Š” ๋กœ๊ทธ์ธ ์ƒํƒœ์— ๋”ฐ๋ผ ๋กœ๊ทธ์ธ / ํ”„๋กœํ•„ ์‚ฌ์ง„, ๋ณ„๋ช…, ์ชฝ์ง€ํ•จ, ๋กœ๊ทธ์•„์›ƒ์ด ํ‘œ์‹œ๋œ๋‹ค.
๋กœ๊ทธ์ธ ๋ณธ์ธ์˜ ๊ตฌ๊ธ€, ๋„ค์ด๋ฒ„, ์นด์นด์˜ค ๊ณ„์ •์„ ํ†ตํ•ด ๋กœ๊ทธ์ธ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.
ํšŒ์› ๊ฐ€์ž…-1 ์„œ๋น„์Šค ์ด์šฉ ์‹œ์— ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ์ •๋ณด๋“ค๋งŒ ํ•„์ˆ˜๋กœ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค.
ํšŒ์› ๊ฐ€์ž…-2 ์„ ํƒ์ ์œผ๋กœ ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ์ž…๋ ฅ ๋ฐ›์œผ๋ฉฐ, ์ž…๋ ฅํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๊ฐ€์ž…๋œ๋‹ค.
์Šคํ„ฐ๋”” ๋ชฉ๋ก ์Šคํ„ฐ๋””๋ช… ยท ๋‚ด์šฉ ยท ์ง€์—ญ ยท ํƒœ๊ทธ๋กœ ์Šคํ„ฐ๋””๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ชจ์ง‘ ์ƒํƒœ ํ•„ํ„ฐ์™€ ์ธ๊ธฐ์ˆœ / ์ตœ์‹ ์ˆœ ์ •๋ ฌ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
์Šคํ„ฐ๋”” ์ •๋ณด ์Šคํ„ฐ๋””์˜ ์ƒ์„ธ ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ณ , ๊ฐ€์ž… ์ƒํƒœ์— ๋”ฐ๋ผ ๊ฐ€์ž… ์š”์ฒญ ๋ฒ„ํŠผ์ด ํ‘œ์‹œ๋œ๋‹ค.
์Šคํ„ฐ๋”” ํšŒ์› ๋ชฉ๋ก ์Šคํ„ฐ๋””์˜ ํšŒ์› ๋ชฉ๋ก์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ณ , ๊ถŒํ•œ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ํšŒ์›์—๊ฒŒ ๊ถŒํ•œ ์„ค์ • ยท ์ชฝ์ง€ ยท ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.
์Šคํ„ฐ๋”” ๊ฐ€์ž… ์š”์ฒญ ๋ชฉ๋ก ์Šคํ„ฐ๋””์— ๊ฐ€์ž…์„ ์š”์ฒญํ•œ ํšŒ์› ๋ชฉ๋ก์„ ํ™•์ธํ•˜๊ณ  ์Šน์ธ ๋ฐ ๊ฑฐ์ ˆ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.
์Šคํ„ฐ๋”” ํƒˆํ‡ด ์ฒดํฌ ๋ฐ•์Šค๋ฅผ ํด๋ฆญํ•˜๋ฉด ์ƒ๊ธฐ๋Š” ์ž…๋ ฅ ์ฐฝ์— 'ํƒˆํ‡ดํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค'๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์Šคํ„ฐ๋””์—์„œ ํƒˆํ‡ด๋œ๋‹ค.
๊ฐ€์ž…ํ•œ ์Šคํ„ฐ๋”” ๋ณธ์ธ์ด ๊ฐ€์ž…ํ•œ ์Šคํ„ฐ๋””๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐ ์Šคํ„ฐ๋”” ์นด๋“œ๋ฅผ ํด๋ฆญํ•˜๋ฉด ํ•ด๋‹นํ•˜๋Š” ์Šคํ„ฐ๋”” ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•œ๋‹ค.
ํšŒ์› ์ •๋ณด ๋ณธ์ธ์˜ ํšŒ์› ์ •๋ณด๋ฅผ ํ™•์ธํ•˜๊ณ  ์ผ๋ถ€ ํ•„๋“œ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
ํšŒ์› ํƒˆํ‡ด ์ฒดํฌ ๋ฐ•์Šค๋ฅผ ํด๋ฆญํ•˜๋ฉด ์ƒ๊ธฐ๋Š” ์ž…๋ ฅ ์ฐฝ์— 'ํƒˆํ‡ดํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค'๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์‚ฌ์ดํŠธ์—์„œ ํƒˆํ‡ด๋œ๋‹ค.
์ชฝ์ง€ ๋ชฉ๋ก ๋‹ค๋ฅธ ํšŒ์›๋“ค๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ์ชฝ์ง€๋“ค์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐ ์ชฝ์ง€๋ฅผ ํด๋ฆญํ•˜๋ฉด ๋‚ด์šฉ์ด ํ‘œ์‹œ๋˜๋ฉฐ, ํœด์ง€ํ†ต ๋ฒ„ํŠผ์„ ํ†ตํ•ด ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‹ค.
์ชฝ์ง€ ์ž‘์„ฑ ์ชฝ์ง€๋Š” ๊ฐ™์€ ์Šคํ„ฐ๋””์— ์žˆ๋Š” ํšŒ์›๋ผ๋ฆฌ๋งŒ ์ฃผ๊ณ  ๋ฐ›์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŠน์ • ํšŒ์›์—๊ฒŒ ์ชฝ์ง€ ๋ณด๋‚ด๊ธฐ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ์Šคํ„ฐ๋””์™€ ๋ฐ›๋Š” ์‚ฌ๋žŒ์ด ์ž๋™์œผ๋กœ ์„ค์ •๋œ๋‹ค.

๐Ÿ’ก ๊ธฐ์ˆ ์  ์˜์‚ฌ ๊ฒฐ์ •


  • ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ ๋ฐฉ์‹

    • Spring Security์—์„œ ์„ธ์…˜์„ STATELESS(๋ฌด์ƒํƒœ)๋กœ ์„ค์ •ํ•˜๊ณ  ์ƒ๋Œ€์ ์œผ๋กœ ์„œ๋ฒ„ ๋ถ€ํ•˜๊ฐ€ ์ ์€ ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ์„ ์ ์šฉํ–ˆ๋‹ค.
    • OAuth2 ๋กœ๊ทธ์ธ์ด ์„ฑ๊ณตํ•˜๋ฉด ๊ฐ ์†Œ์…œ ์‚ฌ์ดํŠธ์—์„œ ๋ฐœ๊ธ‰๋ฐ›์€ ์•ก์„ธ์Šค ํ† ํฐ์„ ํ—ค๋”์— ๋‹ด๊ณ , ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์„ SET_COOKIE์— ๋‹ด์•„ ์‘๋‹ตํ–ˆ๋‹ค.
    • ์‹ค์ œ API ์š”์ฒญ ์‹œ ์ธ์ฆ ์ˆ˜๋‹จ์œผ๋กœ ์•ก์„ธ์Šค ํ† ํฐ์„ ์‚ฌ์šฉํ•˜๊ณ , ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์€ ์•ก์„ธ์Šค ํ† ํฐ ์žฌ๋ฐœ๊ธ‰์— ์‚ฌ์šฉํ–ˆ๋‹ค.
    • ์•ก์„ธ์Šค ํ† ํฐ์˜ ์œ ํšจ ์‹œ๊ฐ„์€ 30๋ถ„์œผ๋กœ ์งง๊ฒŒ ์„ค์ •ํ•˜๊ณ , ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์˜ ์œ ํšจ ์‹œ๊ฐ„์€ 7์ผ๋กœ ๊ธธ๊ฒŒ ์„ค์ •ํ–ˆ๋‹ค.
  • JPA ๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ

    • ๊ฐœ๋ฐœ ์ค‘์— ์ง์ ‘ SQL์„ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅ ยท ์ˆ˜์ • ยท ์‚ญ์ œ ๋ฐ ์กฐํšŒ ์ž‘์—…์ด ๊ฐ€๋Šฅํ•˜๊ณ , ๋ฐ˜๋ณต์ ์ธ SQL ์ž‘์„ฑ์— ์‚ฌ์šฉ๋˜๋Š” ์‹œ๊ฐ„์„ ์ค„์ด๊ณ  ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๊ฐœ๋ฐœ์— ์ง‘์ค‘ํ•˜๊ธฐ ์œ„ํ•ด JPA๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.
    • ๊ฐ„๋‹จํ•œ ์ž‘์—…์€ Repository์— findBy~์ฒ˜๋Ÿผ ๊ทœ์น™์— ๋งž๋Š” ์ด๋ฆ„์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์„ ์–ธํ•˜์—ฌ ๋‚ด๋ถ€์ ์œผ๋กœ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ด์šฉํ–ˆ๋‹ค.
    • ๊ทธ๋ฆฌ๊ณ  ๊ฒ€์ƒ‰์ฒ˜๋Ÿผ ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๊ฐ€ ํ•„์š”ํ•  ๊ฒฝ์šฐ์—๋Š” QueryDSL์„ ์‚ฌ์šฉํ•ด์„œ ์ž๋ฐ” ์ฝ”๋“œ๋ฅผ ์‹ค์ œ SQL ๋ฌธ๋ฒ•๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ์ž‘์„ฑํ–ˆ๋‹ค.
    • ์ƒ๋Œ€์ ์œผ๋กœ ๋ณต์žก๋„๋Š” ๋‚ฎ์ง€๋งŒ ํŠน์ • ์กฐ๊ฑด ๋“ฑ์„ ์„ธ๋ฐ€ํ•˜๊ฒŒ ๋‹ค๋ค„์•ผ ํ•  ๊ฒฝ์šฐ์—๋Š” JPQL์„ ์ด์šฉํ–ˆ๋‹ค.
  • ์‘๋‹ต ์„ฑ๋Šฅ ์ตœ์ ํ™”

    • ์ž์ฃผ ์š”์ฒญ๋˜๋Š” ๋ฐ์ดํ„ฐ๋Š” Redis์— ์บ์‹œ๋ฅผ ์ €์žฅํ•˜์—ฌ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์กฐํšŒ ํšŸ์ˆ˜๋ฅผ ์ตœ์†Œํ™”ํ•ด ์„œ๋ฒ„ ๋ถ€ํ•˜๋ฅผ ์ค„์ด๊ณ  ์‘๋‹ต ์†๋„๋ฅผ ๊ฐœ์„ ํ–ˆ๋‹ค.
    • TTL์„ ์„ค์ •ํ•˜๊ณ , ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์‹œ ์บ์‹œ๋ฅผ ๊ฐฑ์‹ ํ•˜์—ฌ ๋ฐ์ดํ„ฐ์˜ ์ตœ์‹  ์ƒํƒœ๋ฅผ ์œ ์ง€ํ–ˆ๋‹ค.
  • ํด๋ผ์šฐ๋“œ ๊ฐ์ฒด ์Šคํ† ๋ฆฌ์ง€

    • ํŒŒ์ผ์€ AWS์—์„œ ์ œ๊ณตํ•˜๋Š” ํด๋ผ์šฐ๋“œ ๊ฐ์ฒด ์Šคํ† ๋ฆฌ์ง€์ธ S3์— ์ €์žฅํ•˜์—ฌ ์„œ๋ฒ„ ์ €์žฅ ๊ณต๊ฐ„๊ณผ ๋ถ€ํ•˜๋ฅผ ์ค„์ด๊ณ , ํ™•์žฅ์„ฑ๊ณผ ์•ˆ์ •์„ฑ์ด ๋›ฐ์–ด๋‚œ ํŒŒ์ผ ์ €์žฅ ํ™˜๊ฒฝ์„ ๊ตฌํ˜„ํ–ˆ๋‹ค.
    • API ์š”์ฒญ ์‹œ MultipartFile ํ˜•ํƒœ๋กœ ๋ฐ›์€ ํŒŒ์ผ์„ ๋žœ๋คํ•œ UUID๋ฅผ key๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์ €์žฅํ•˜๊ฑฐ๋‚˜, ํ•ด๋‹นํ•˜๋Š” key๋ฅผ ์ด์šฉํ•˜์—ฌ ํŒŒ์ผ์„ ์‚ญ์ œํ–ˆ๋‹ค.
    • ์„œ๋ฒ„์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—๋Š” ํŒŒ์ผ์ด ์ €์žฅ๋œ URL์„ ์ €์žฅํ•˜์—ฌ, ์„œ๋ฒ„์˜ ์ง์ ‘์ ์ธ ํŒŒ์ผ ๊ด€๋ฆฌ ๋ถ€๋‹ด์„ ์ค„์˜€๋‹ค.
  • ์ผ๊ด€๋œ ์‘๋‹ต ์ฒ˜๋ฆฌ

    • ๋ชจ๋“  API ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์€ HTTP ์ƒํƒœ ์ฝ”๋“œ, ๋ฉ”์„ธ์ง€, ๋ฐ์ดํ„ฐ ํ˜•ํƒœ๋กœ ํ•˜์—ฌ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ–ˆ๋‹ค.
    • ์„ฑ๊ณต์— ๋Œ€ํ•œ ์‘๋‹ต์€ SuccessResponseUtil์—์„œ ์ฒ˜๋ฆฌํ•˜๊ณ , ์‹คํŒจ์— ๋Œ€ํ•œ ์‘๋‹ต์€ FailureResponseUtil์—์„œ ์ฒ˜๋ฆฌํ–ˆ๋‹ค.
  • ๊ณ„์ธตํ™”๋œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ

    • ์„œ๋น„์Šค์—์„œ ์‹ค์ œ๋กœ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ˆ์™ธ๋“ค์„ ๊ฐ๊ฐ ์ปค์Šคํ…€ ์˜ˆ์™ธ ํด๋ž˜์Šค๋กœ ์ •์˜ํ•˜์—ฌ, ๋ช…ํ™•ํ•˜๊ณ  ๊ตฌ์ฒด์ ์ธ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ–ˆ๋‹ค.
    • ๋„๋ฉ”์ธ๋ณ„ 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๋ฅผ ํ™•์ธํ•œ ํ›„ ์•ก์„ธ์Šค ํ† ํฐ๋„ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค.

๐Ÿ’ฌ ํ”„๋กœ์ ํŠธ ํšŒ๊ณ 


  • ์•„์‰ฌ์šด ์  ยท ๊ฐœ์„ ํ•  ์ 

    1. ๋ฐ˜์‘ํ˜• ๋ ˆ์ด์•„์›ƒ
      • ๋ถ€ํŠธ์ŠคํŠธ๋žฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ˜์‘ํ˜• ๋ ˆ์ด์•„์›ƒ ์„ค๊ณ„๋‚˜ ๋””์ž์ธ ๋“ฑ ์ „์ฒด์ ์ธ ๋ถ€๋ถ„์—์„œ ๋งŽ์€ ๋„์›€์„ ๋ฐ›์•˜์ง€๋งŒ, ์ผ๋ถ€ ๋งˆ์Œ์— ๋“ค์ง€ ์•Š๋Š” ์š”์†Œ๋“ค์ด ์žˆ์–ด ์ง์ ‘ ๋””์ž์ธ ํ–ˆ์ง€๋งŒ ์ผ๋ถ€ ํŽ˜์ด์ง€์—์„œ ๋ฐ˜์‘ํ˜•์ด ๊นจ์ง„ ๋ถ€๋ถ„์ด ๊ฐ€์žฅ ์•„์‰ฌ์šด ๊ฒƒ ๊ฐ™๋‹ค.
    2. ์บ์‹œ ์ „๋žต
      • ์ผ๋ถ€ ๋„๋ฉ”์ธ์—์„œ ์บ์‹œ๋ฅผ ํ†ตํ•ด ์กฐํšŒ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ธด ํ–ˆ์ง€๋งŒ ์บ์‹œ ์œ ์ง€์™€ ์ตœ์‹  ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™” ์‚ฌ์ด์—์„œ ๊ณ ๋ฏผ์„ ์ •๋ง ๋งŽ์ด ํ–ˆ๋Š”๋ฐ, ์ตœ์ข…์ ์œผ๋กœ ์ตœ์„ ์˜ ์ „๋žต์„ ์„ธ์šฐ์ง€ ๋ชปํ•œ ๊ฒƒ์ด ์•„์‰ฝ๋‹ค.
    3. Git ๊ด€๋ฆฌ
      • ํ”„๋กœ์ ํŠธ ์ดˆ๋ฐ˜์—๋Š” ์„ธ๋ถ„ํ™”ํ•ด์„œ Git ๊ด€๋ฆฌ๋ฅผ ํ–ˆ์ง€๋งŒ, ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ๋ผ๋Š” ์•ˆ์ผํ•จ ๋•Œ๋ฌธ์— ํ›„๋ฐ˜์—๋Š” ํ•œ ๋ฒˆ์— ๋ชฐ์•„์„œ ์ปค๋ฐ‹ํ•˜๋Š” ๋“ฑ Git ๊ด€๋ฆฌ๋ฅผ ์†Œํ™€ํžˆ ํ•œ ์ ์ด ์•„์‰ฝ๋‹ค.
  • ์ถ”๊ฐ€ ๊ฐœ๋ฐœ ๊ณ„ํš

    1. ์Šคํ„ฐ๋”” ๊ธฐ๋Šฅ ์ถ”๊ฐ€
      • ์Šคํ„ฐ๋”” ๋งค์นญ ํ”Œ๋žซํผ์ด๋ผ๋Š” ์ฃผ์ œ์— ๋งž์ถฐ, ๊ฐ€์žฅ ๋จผ์ € ์ถ”๊ฐ€ ํ•ด์•ผํ•  ๊ฒƒ์€ ๋ฐ”๋กœ ์Šคํ„ฐ๋””์˜ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
      • ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์‹œ๋กœ, ๋ฌธ์ œ ํ’€์ด๋‚˜ ํ›„๊ธฐ ์ž‘์„ฑ์„ ์œ„ํ•œ ๊ฒŒ์‹œํŒ์„ ๋งŒ๋“ค์–ด ์—ฌ๋Ÿฌ ์‚ฌ๋žŒ๋“ค๊ณผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•  ๊ฒƒ์ด๋‹ค.
    2. ์Šคํ„ฐ๋”” ๊ฒ€์ƒ‰ ํ•„ํ„ฐ ์กฐ๊ฑด ๋‹ค์–‘ํ™”
      • ํ˜„์žฌ ๊ตฌํ˜„๋œ ์Šคํ„ฐ๋”” ๊ฒ€์ƒ‰ ํ•„ํ„ฐ์—๋Š” ๋ชจ์ง‘ ์ƒํƒœ์— ๊ด€๋ จ๋œ ์กฐ๊ฑด๋ฐ–์— ์—†๋Š”๋ฐ, ์—ฐ๋ น, ์„ฑ๋ณ„ ๋“ฑ๊ณผ ๊ด€๋ จ๋œ ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ข€ ๋” ์„ธ๋ฐ€ํ•œ ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•  ๊ฒƒ์ด๋‹ค.
    3. ์ง€๋„ API ์‚ฌ์šฉ
      • ๊ฐ€์ž…ํ•  ๋•Œ ํ™œ๋™ ์ง€์—ญ์„ ์‹œ ยท ๊ตฐ ยท ๊ตฌ ๋‹จ์œ„๋กœ ์ž…๋ ฅ ๋ฐ›๊ณ  ์žˆ๋Š”๋ฐ, ์ง€๋„ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋” ์ •ํ™•ํ•œ ์œ„์น˜๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  ์ฃผ๋ณ€ ์Šคํ„ฐ๋””๋“ค์„ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•  ๊ฒƒ์ด๋‹ค.
    4. ์‚ฌ์ดํŠธ ๊ด€๋ฆฌ์ž ๊ธฐ๋Šฅ ์ถ”๊ฐ€
      • ์‚ฌ์ดํŠธ ๊ด€๋ฆฌ์ž ๊ธฐ๋Šฅ์„ ๋„์ž…ํ•˜์—ฌ ์‚ฌ์ดํŠธ์˜ ๊ด€๋ฆฌ์ž์ธ ๋‚ด๊ฐ€ SQL์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ๋„ ์‚ฌ์ดํŠธ๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•  ๊ฒƒ์ด๋‹ค.
  • ํ›„๊ธฐ

    ์ผ๋‹จ ๊ทธ๋™์•ˆ ์–ด๋–ค ๊ฒƒ์— ๋Œ€ํ•ด์„œ ๋ฐฐ์šฐ๋ฉด ๋ฏธ๋‹ˆ ํ”„๋กœ์ ํŠธ๋กœ ๊ทธ๊ฒƒ์„ ์ ์šฉํ•ด๋ณด๊ธด ํ–ˆ์ง€๋งŒ ํ•˜๋‚˜์˜ ์™„์„ฑ๋œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์–ด ๋ณธ ๊ฒฝํ—˜์ด ์˜ค๋žœ๋งŒ์ธ ๊ฒƒ ๊ฐ™์•„ ๋งŒ์กฑ์Šค๋Ÿฝ๊ณ  ์žฌ๋ฏธ์žˆ์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํŒ€ ํ”„๋กœ์ ํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ธฐํš๋ถ€ํ„ฐ ๊ฐœ๋ฐœ ๋ฐ ๋ฐฐํฌ๊นŒ์ง€ ๋ชจ๋“  ๊ฒƒ์„ ํ˜ผ์ž ํ•˜๋ฉด์„œ ๋ง‰ํžˆ๋Š” ๋ถ€๋ถ„์ด ์ƒ๊ธธ ๊ฒฝ์šฐ ์‹ค์งˆ์ ์œผ๋กœ ๋„์›€์„ ์š”์ฒญํ•  ์‚ฌ๋žŒ์ด ์—†์–ด์„œ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ •๋ง ๊ณ ์ƒํ•œ ๊ฒƒ ๊ฐ™๋‹ค. ๋‚ด๊ฐ€ ์ƒ๊ฐํ–ˆ๋˜ ๊ฒƒ๋ณด๋‹ค ํ”„๋กœ์ ํŠธ ๊ธฐ๊ฐ„์ด ๊ต‰์žฅํžˆ ์˜ค๋ž˜ ๊ฑธ๋ ธ์ง€๋งŒ, ๊ตฌ๊ธ€๋ง์„ ํ•˜๊ณ  ์ธ๊ฐ•์„ ๋ณด๋ฉฐ ๋๊นŒ์ง€ ํฌ๊ธฐํ•˜์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฒƒ์œผ๋กœ๋„ ๋งŒ์กฑ์Šค๋Ÿฝ๊ฒŒ ์ƒ๊ฐํ•œ๋‹ค. ํŒ€ ํ”„๋กœ์ ํŠธ๊ฐ€ ์•„๋‹ˆ์—ฌ์„œ ์‹ค์ œ๋กœ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๊ณผ ํ˜‘์—…ํ•  ์ˆ˜๋Š” ์—†์—ˆ๋˜ ๊ฒƒ์ด ์•„์‰ฌ์› ์ง€๋งŒ ๊ตฌ๊ธ€๋ง๊ณผ ํ˜„์—…์ž ์นœ๊ตฌ์—๊ฒŒ ์‹ค๋ฌด์—์„œ๋Š” ์–ด๋–ค ์‹์œผ๋กœ ๊ฐœ๋ฐœํ•˜๋Š”์ง€ ์กฐ์–ธ์„ ๋“ค์œผ๋ฉฐ ์ตœ๋Œ€ํ•œ ์‹ค๋ฌด์ฒ˜๋Ÿผ ํ•ด๋ณด๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ ์ •๋ณด์ฒ˜๋ฆฌ๊ธฐ์‚ฌ๋ฅผ ๊ณต๋ถ€ํ•˜๋ฉฐ ๋””์ž์ธ ํŒจํ„ด์„ ์—ด์‹ฌํžˆ ์•”๊ธฐํ•  ๋•Œ '์‹ค์ œ๋กœ ๊ฐœ๋ฐœํ•  ๋–„ ์ด๋Ÿฐ ๊ฒƒ๋“ค์ด ๋‹ค ์“ฐ์ด๊ธฐ๋Š” ํ•˜๋Š” ๊ฑธ๊นŒ?' ํ•˜๋Š” ์ƒ๊ฐ์„ ํ•˜๊ณค ํ–ˆ์—ˆ๋Š”๋ฐ ์‹ค์ œ๋กœ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋””์ž์ธ ํŒจํ„ด์ด ์‚ฌ์šฉ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ์‹ค๋ฌด ํ‰๋‚ด๋ฅผ ๋‚ด๊ธฐ ์œ„ํ•ด ๋ฐฐ์šด ๊ฒƒ๋“ค์„ ํ•œ๋ฒˆ์— ์ตœ๋Œ€ํ•œ ์ ์šฉํ•ด๋ณด๋‹ค ๋ณด๋‹ˆ ๋ถ„๋ช…ํžˆ ๋ฏธ์ˆ™ํ•œ ์ ์ด ๋งŽ์ง€๋งŒ ๊ทธ ๊ณผ์ •์—์„œ์˜ ์„ฑ์žฅ์„ ์˜๋ฏธ์žˆ๊ฒŒ ์ƒ๊ฐํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  API๋ฅผ ๊ฐœ๋ฐœํ•˜๊ณ  Postman์„ ์‚ฌ์šฉํ•ด ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ๋Š”๋ฐ, ๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜์ง€ ๋ชปํ–ˆ๋˜ ์˜ˆ์™ธ๋“ค์ด ๋๋„ ์—†์ด ๋ฐœ์ƒํ•ด์„œ ๋†€๋ž๋‹ค. ๋๋„ ์—†๋Š” ์˜ˆ์™ธ๋“ค์„ ํ•˜๋‚˜ํ•˜๋‚˜ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํ…Œ์ŠคํŠธ๊ฐ€ ๊ต‰์žฅํžˆ ์ค‘์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ซ๊ฒŒ ๋˜์—ˆ๋‹ค. ์‹ค์ œ๋กœ ์‹ค๋ฌด์—์„œ๋Š” ๊ฐœ๋ฐœ ์‹œ๊ฐ„๋ณด๋‹ค ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ž‘์„ฑํ•˜๋Š” ๋ฐ์— ์‹œ๊ฐ„์„ ๋” ์“ด๋‹ค๋Š” ๋ง์„ ๋“ค์€ ์ ์ด ์žˆ๋Š”๋ฐ ๊ทธ ์ด์œ ๋ฅผ ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ธฐํšŒ๋กœ ์•Œ๊ฒŒ๋œ ๊ฒƒ ๊ฐ™๋‹ค. ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ํ†ตํ•ด ๋А๋‚€ ์•„์‰ฌ์›€์„ ๋ฐœํŒ ์‚ผ์•„, ๋‹ค์Œ์—๋Š” ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ๊ผผ๊ผผํžˆ ์ž‘์„ฑํ•˜๋ฉฐ ์™„์„ฑ๋„๋ฅผ ๋†’์ด๊ณ  ์•„์‰ฌ์› ๋˜ ์ ๋“ค์„ ๊ฐœ์„ ํ•ด๊ฐˆ ๊ฒƒ์„ ๋‹ค์ง์œผ๋กœ ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งˆ๋ฌด๋ฆฌํ•œ๋‹ค.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors