8000 GitHub - everydaycono/walking-distance
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

everydaycono/walking-distance

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

walking-distance

๋ชฉ์ฐจ

  1. ๋ฐฐํฌ ๋ฐ ๋„๋ฉ”์ธ ์ •๋ณด
  2. ํ”„๋กœ์ ํŠธ ํ˜‘์—… ๊ตฌ์กฐ
  3. ์„œ๋ฒ„ ์•„ํ‚คํ…์ณ
  4. ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ
  5. ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ปฌ ํ™˜๊ฒฝ ์‹คํ–‰
  6. API ๋ช…์„ธ์„œ
  7. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์กฐ
  8. ๋ฐฐํฌ
  9. CI / CD ํŒŒ์ดํ”„๋ผ์ธ

1. ๋ฐฐํฌ ๋ฐ ๋„๋ฉ”์ธ ์ •๋ณด


2. ํ”„๋กœ์ ํŠธ ํ˜‘์—… ๊ตฌ์กฐ

  • ํ”„๋กœ์ ํŠธ๋Š” ๋ฐฑ์—”๋“œ์™€ ํ”„๋ก ํŠธ์—”๋“œ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ๊ฐœ๋ฐœ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ด๋Š” ๋ฐฑ์—”๋“œ์™€ ํ”„๋ก ํŠธ์—”๋“œ๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ ๊ฐœ๋ฐœ๋˜๋ฉฐ, ๊ฐ๊ฐ์˜ ์—ญํ• ๊ณผ ์ฑ…์ž„์„ ๊ฐ€์ง€๊ณ  ํ˜‘์—…ํ•˜๊ณ  ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

    1. ๋ฐฑ์—”๋“œ (Backend)

    • ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์€ ๊น€๋ฏผ์ง€์— ์˜ํ•ด ๋‹ด๋‹น๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    • ๋ฐฑ์—”๋“œ๋Š” NestJS์™€ TypeORM MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์ถ•๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    • API ์—”๋“œํฌ์ธํŠธ ๋ฐ ๋กœ์ง์€ ๋ฐฑ์—”๋“œ GitHub ์ €์žฅ์†Œ ๋งํฌ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๋ฐฑ์—”๋“œ๋Š” ์„œ๋ฒ„์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ ๋ฐ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•˜๋ฉฐ, ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
    • API ๋ฌธ์„œ๋Š” API ๋ฌธ์„œ ๋งํฌ์—์„œ ํ™•์ธ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ด๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํ”„๋ก ํŠธ์—”๋“œ ๊ตฌํ˜„์„ ์ง„ํ–‰ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

    2. ํ”„๋ก ํŠธ์—”๋“œ (Frontend)

    • ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์€ ์ด์ค€ํ˜„์— ์˜ํ•ด ๋‹ด๋‹น๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    • ํ”„๋ก ํŠธ์—”๋“œ๋Š” Nest.js๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
    • ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๋Š” ๋ฐฑ์—”๋“œ API์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๊ณ  ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐœ๋ฐœํ•˜๋ฉฐ, ๋ฐฑ์—”๋“œ์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.
    • ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์ •๋ณด๋Š” ํ”„๋ก ํŠธ์—”๋“œ GitHub ์ €์žฅ์†Œ ๋งํฌ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    3. ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ

    • ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด GitHub Projects๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ด๋ฅผ ํ†ตํ•ด ์ž‘์—… ํ•ญ๋ชฉ ๋ฐ- ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ ์ƒํ™ฉ์„ ์‹œ๊ฐ์ ์œผ๋กœ ์ถ”์ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
    • ํ‹ฐ์ผ“(์ด์Šˆ)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ, ๋ฒ„๊ทธ ์ˆ˜์ •, ์ž‘์—… ๋“ฑ์˜ ์ž‘์—… ํ•ญ๋ชฉ์„ ์ž‘์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
    • ์ž‘์—… ํ•ญ๋ชฉ์€ GitHub Projects์˜ ๋‹ค์–‘ํ•œ ์—ด(์นธ๋ฐ˜ ๋ณด๋“œ)์— ๋ฐฐ์น˜ํ•˜์—ฌ ์ž‘์—…์ด ์ง„ํ–‰๋˜๋Š” ์ƒํƒœ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    4. PR ๋ฐ ํ˜‘์—…

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

  • ์ด๋Ÿฌํ•œ ํ˜‘์—… ํ”„๋กœ์„ธ์Šค์™€ ์˜์‚ฌ ์†Œํ†ต ๋ฐฉ๋ฒ•์„ ๋ช…์‹œํ•˜๋ฉด์„œ ํ”„๋กœ์ ํŠธ์˜ ํ˜‘์—… ํ™˜๊ฒฝ์„ ์ดํ•ดํ•˜๊ณ  ๊ฐœ๋ฐœ์ž ๊ฐ„์˜ ์›ํ™œํ•œ ํ˜‘์—…์„ ์ด‰์ง„ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.


3. ์„œ๋ฒ„ ์•„ํ‚คํ…์ณ

  • WalkDi์˜ ๋ฐฑ์—”๋“œ๋Š” NestJS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์ถ•๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  • Planet Scale์—์„œ ํ˜ธ์ŠคํŒ…๋˜๋Š” MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • WalkDi์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” Planet Scale์—์„œ ํ˜ธ์ŠคํŒ…๋˜๋ฉฐ, ๋‹ค์–‘ํ•œ Entity์— ๋”ฐ๋ผ ์Šคํ‚ค๋งˆ๊ฐ€ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์Šคํ‚ค๋งˆ๋Š” ํ…Œ์ด๋ธ”, ์ปฌ๋Ÿผ ๋ฐ ๊ด€๊ณ„๋ฅผ ์ •์˜ํ•˜๊ณ , ๋ฐ์ดํ„ฐ์˜ ๊ตฌ์กฐ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

  • ์•„๋ž˜๋Š” ์ฃผ์š” ์ปดํฌ๋„ŒํŠธ์™€ ๋ชจ๋“ˆ ๊ตฌ์„ฑ์ž…๋‹ˆ๋‹ค.

    1. User Module

    • User Module : ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค.
    • User Entity : ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” Entity๋กœ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์‚ฌ์šฉ์ž ํ…Œ์ด๋ธ”๊ณผ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.
    • User Controller : ์‚ฌ์šฉ์ž์™€ ๊ด€๋ จ๋œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ์ž…๋‹ˆ๋‹ค.
    • User Service : ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์กฐํšŒ, ์ƒ์„ฑ, ์ˆ˜์ • ๋ฐ ์‚ญ์ œํ•˜๋Š” ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.
    • User DTO : ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ ์ „์†ก ๊ฐ์ฒด๋กœ, ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„ ๋ฐ์ดํ„ฐ ๊ตํ™˜์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

    2. Auth Module

    • Auth Module : ์ธ์ฆ๊ณผ ๊ด€๋ จ๋œ ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค.
    • Auth Decorators : ์ธ์ฆ ๊ด€๋ จ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋กœ, ์—‘์„ธ์Šค ํ† ํฐ, ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ, ์—ญํ• (Role)๋“ฑ์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
    • Auth Guards : ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž์˜ ์—”๋“œํฌ์ธํŠธ ์•ก์„ธ์Šค๋ฅผ ์ œ์–ดํ•˜๋Š” ๊ฐ€๋“œ๋กœ, ์—ญํ• (Role) ๋ฐ๊ถŒํ•œ์— ๋”ฐ๋ฅธ ์•ก์„ธ์Šค ์ œํ•œ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
    • Auth Strategies : ์ธ์ฆ ์ „๋žต์œผ๋กœ, GitHub ๋กœ๊ทธ์ธ๊ณผ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ๋กœ๊ทธ์ธ ์ „๋žต์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
    • Auth Controller : ์ธ์ฆ ๊ด€๋ จ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ์ž…๋‹ˆ๋‹ค.
    • Auth Service : ์‚ฌ์šฉ์ž ๋กœ๊ทธ์ธ, ํšŒ์›๊ฐ€์ž… ๋ฐ ์ธ์ฆ์— ๊ด€ํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

    3. Article Module

    • Article Module : ๊ธฐ์‚ฌ ๊ด€๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค.
    • Article Entity : ๊ธฐ์‚ฌ ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” Entity๋กœ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ธฐ์‚ฌ ํ…Œ์ด๋ธ”๊ณผ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.
    • Article Controller : ๊ธฐ์‚ฌ์™€ ๊ด€๋ จ๋œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ์ž…๋‹ˆ๋‹ค.
    • Article Service : ๊ธฐ์‚ฌ ์ƒ์„ฑ, ์กฐํšŒ, ์ˆ˜์ • ๋ฐ ์‚ญ์ œ์™€ ๊ด€๋ จ๋œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

    4. Category Module

    • Category Module : ์นดํ…Œ๊ณ ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค.
    • Category Entity : ์นดํ…Œ๊ณ ๋ฆฌ ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” Entity๋กœ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์นดํ…Œ๊ณ ๋ฆฌ ํ…Œ์ด๋ธ”๊ณผ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.
    • Category Controller : ์นดํ…Œ๊ณ ๋ฆฌ์™€ ๊ด€๋ จ๋œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ์ž…๋‹ˆ๋‹ค.
    • Category Service : ์นดํ…Œ๊ณ ๋ฆฌ ์ƒ์„ฑ, ์กฐํšŒ, ์ˆ˜์ • ๋ฐ ์‚ญ์ œ์™€ ๊ด€๋ จ๋œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

    5. Comment Module

    • Comment Module : ๋Œ“๊ธ€ ๊ด€๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค.
    • Comment Entity : ๋Œ“๊ธ€ ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” Entity๋กœ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋Œ“๊ธ€ ํ…Œ์ด๋ธ”๊ณผ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.
    • Comment Controller : ๋Œ“๊ธ€๊ณผ ๊ด€๋ จ๋œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ์ž…๋‹ˆ๋‹ค.
    • Comment Service : ๋Œ“๊ธ€ ์ƒ์„ฑ, ์กฐํšŒ, ์ˆ˜์ • ๋ฐ ์‚ญ์ œ์™€ ๊ด€๋ จ๋œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

    6. Mail Module

    • Mail Module : ๋กœ๊ทธ์ธ ๋ฐ ํšŒ์›๊ฐ€์ž…๊ณผ ๊ฐ™์€ ์‚ฌ์šฉ์ž ์ธ์ฆ ํ”„๋กœ์„ธ์Šค๋ฅผ ์œ„ํ•œ ๋ฉ”์ผ ์„œ๋น„์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค.
    • Mail Service : ์ด ๋ชจ๋“ˆ์€ ๋ฉ”์ผ ์ „์†ก ๋ฐ ๊ด€๋ฆฌ์™€ ๊ด€๋ จ๋œ ๋ชจ๋“  ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
    • Mail Controller : ๋ฉ”์ผ๊ณผ ๊ด€๋ จ๋œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ์ž…๋‹ˆ๋‹ค.

    7. Search Module

    • Search Module : ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ชจ๋“ˆ๋กœ, ์‚ฌ์šฉ์ž๊ฐ€ ๊ธฐ์‚ฌ, ์‚ฌ์šฉ์ž, ๋Œ“๊ธ€ ๋“ฑ์„ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค๋‹ˆ๋‹ค.
    • Search Controller : ๊ฒ€์ƒ‰ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์ ์ ˆํ•œ ์„œ๋น„์Šค๋กœ ๋ผ์šฐํŒ…ํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ์ž…๋‹ˆ๋‹ค.
    • Search Service : ์‹ค์ œ ๊ฒ€์ƒ‰ ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์„œ๋น„์Šค๋กœ, ๊ฒ€์ƒ‰์–ด์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ ์ ˆํ•œ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    8. Tag Module

    • Tag Module : ๊ธฐ์‚ฌ๋‚˜ ์‚ฌ์šฉ์ž ํ”„๋กœํ•„๊ณผ ๊ฐ™์€ ์ฝ˜ํ…์ธ ์— ํƒœ๊ทธ๋ฅผ ๋ถ€์—ฌํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค.
    • Tag Entity : ํƒœ๊ทธ ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” Entity๋กœ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํƒœ๊ทธ ํ…Œ์ด๋ธ”๊ณผ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.
    • Tag Controller : ํƒœ๊ทธ์™€ ๊ด€๋ จ๋œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ์ž…๋‹ˆ๋‹ค.
    • Tag Service : ํƒœ๊ทธ ์ƒ์„ฑ, ์ˆ˜์ •, ์‚ญ์ œ, ์กฐํšŒ์™€ ๊ด€๋ จ๋œ ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.

4. ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ

WalkDi๋Š”์š” !

์‚ฌ์šฉ์ž๋“ค์—๊ฒŒ ๋” ๋‚˜์€ ๊ฑด๊ฐ•๊ณผ ์‚ถ์˜ ์งˆ์„ ์ œ๊ณตํ•˜๋Š” ํ˜์‹ ์ ์ธ ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค. WalkDi๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฃผ์š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์—ฌ ์‚ฌ์šฉ์ž๋“ค์˜ ๊ฑด๊ฐ•๊ณผ ํ™œ๋™์„ ์ฆ์ง„์‹œํ‚ค๊ณ  ์†Œํ†ต์„ ์ด‰์ง„ํ•ฉ๋‹ˆ๋‹ค.

  1. ๋กœ๊ทธ์ธ ๋ฐ ํšŒ์›๊ฐ€์ž… : ์‚ฌ์šฉ์ž๋“ค์€ ์•ˆ์ „ํ•˜๊ฒŒ ๋กœ๊ทธ์ธํ•˜๊ณ  ํšŒ์›๊ฐ€์ž…ํ•˜์—ฌ WalkDi์˜ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  2. ๋‚˜์˜ Article ์ž‘์„ฑ : ์‚ฌ์šฉ์ž๋“ค์€ ์ž์‹ ๋งŒ์˜ ๊ณต๊ฐ„์—์„œ ๋‹ค์–‘ํ•œ ์ฃผ์ œ๋กœ ๊ธ€์„ ์ž‘์„ฑํ•˜๊ณ  ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์œ ๋กœ์šด ๊ธ€ ์ž‘์„ฑ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•˜์—ฌ ๋‹ค์–‘ํ•œ ์ด์•ผ๊ธฐ๋ฅผ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  3. ํ•ด์‹œํƒœ๊ทธ ๊ธฐ๋Šฅ : ๊ฒŒ์‹œ๋ฌผ์— ํ•ด์‹œํƒœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ฒŒ์‹œ๋ฌผ์„ ์นดํ…Œ๊ณ ๋ฆฌํ™”ํ•˜๊ณ  ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž๋“ค์€ ๊ด€์‹ฌ ์žˆ๋Š” ์ฃผ์ œ๋ฅผ ์‰ฝ๊ฒŒ ์ฐพ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  4. Article ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ : ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ๋‹ค์–‘ํ•œ ์ฃผ์ œ์™€ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒŒ์‹œ๋ฌผ์„ ์†์‰ฝ๊ฒŒ ์ฐพ์•„๋ณด๋Š” ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.


5. ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ปฌ ํ™˜๊ฒฝ ์‹คํ–‰

  1. docker ํ™˜๊ฒฝ์„ ๋‹ค์šด๋ฐ›์•„ docker๋กœ mysql์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ local mysql์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  2. git clone

    git clone https://github.com/everydaycono/walking-distance
    
  3. .env.dev ํŒŒ์ผ ์ƒ์„ฑ

    touch .env.dev
    
  4. .env.dev ํŒŒ์ผ ๊ตฌ์„ฑ ์˜ˆ์ œ

    NODE_ENV=dev
    PORT = 8000
    
    # JWT ENV  ###########
    JWT_SECRET=JWT_SECRET
    JWT_REFRESH_SECRET=JWT_REFRESH_SECRET
    
    # APP CONFIG  ###########
    SERVER_API_URL=http://localhost:8000/api
    # APP CONFIG
    
    ## MAIL ENV START ###########
    SMTP_MAIL_SERVICE_HOST=SMTP_MAIL_SERVICE_HOST
    SMTP_MAIL_SERVICE_USER=SMTP_MAIL_SERVICE_USER
    SMTP_MAIL_SERVICE_PASS=SMTP_MAIL_SERVICE_PASS
    SMTP_MAIL_SERVICE_FROM='"No Reply" <noreply@example.com>'
    
    
    # SOCIAL LOGIN ##############
    GITHUB_SOCIAL_LOGIN_CLIENT_ID=
    GITHUB_SOCIAL_LOGIN_SECRET=
    GITHUB_SOCIAL_LOGIN_CALLBACK_URL=
    
    
    # ENV FILE #######
    AWS_BUCKET_NAME=AWS_BUCKET_NAME
    ACCESS_ID=ACCESS_ID
    AWS_SECRET_KEY=AWS_SECRET_KEY
    
    # DB CONFIG
    DB_HOST=localhost
    DB_PORT=3306
    DB_USERNAME=username
    DB_PASSWORD=wdpassword
    DB_NAME=walkdi
    
  5. docker compose ํŒŒ์ผ up ์‹œ์ผœ์„œ mysql ์„œ๋ฒ„ ์ƒ์„ฑํ•ด์„œ ์—ฐ๊ฒฐ

    docker compose up -f docker-compose.dev.yml -d
    
  6. ์„œ๋ฒ„ ์‹œ์ž‘ ์‹œํ‚ค๊ธฐ

    yarn & yarn start:dev
            or
    npm i & npm run start:dev
    

6. API ๋ช…์„ธ์„œ

1. Auth

api ๋ช…์„ธ์„œ ์ฐธ๊ณ  swagger

  • 1. create user
    • End point:

        POST /api/auth/register
      
    • Request

       {
          "email": "test@gmail.com",
          "password": "password",
          "firstName": "firstName",
          "lastName": "lastName"
      }
      
    • Success Response

      • 201 Created => ์œ ์ € ์„ฑ๊ณต์ ์œผ๋กœ ์ƒ์„ฑ, ์œ ์ € ์ƒ์„ฑํ–ˆ๋‹ค๋Š” ๋ฌธ๊ตฌ ๋ฐ˜ํ™˜
    • Error Response

      • 400 Bad Request => ์š”์ฒญ์ด ์ž˜๋ชป or ํ•„์ˆ˜ ์ •๋ณด ๋ˆ„๋ฝ or ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ํƒˆ๋ฝ
      • 409 Conflict Error => ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ์œ ์ € ์—๋Ÿฌ

  • 2. login user
    • End point:
        POST /api/auth/login
      
    • Request
       {
          "email": "test@gmail.com",
          "password": "password"
      }
      
    • Success Response
      • 200 OK
    • Error Response
      • 400 Bad Request => ์š”์ฒญ์ด ์ž˜๋ชป or ํ•„์ˆ˜ ์ •๋ณด ๋ˆ„๋ฝ or ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ํƒˆ๋ฝ
      • 401 Unauthorized Error => username์ด๋‚˜ password๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์„๋•Œ
      • 403 Forbidden Error => account๊ฐ€ locked์ผ๋•Œ ์—๋Ÿฌ

  • 3. social login user
    • End point:
        POST /api/auth/social-login
      
    • Success Response
      • 200 OK => github login ์œ ์ € ์ •๋ณด ๋ฐ˜ํ™˜
    • Error Response
      • 500 Intenal server errror

2. User

  • 1. get my all articles
    • End point:
        GET /api/user/my/articles
      
    • Authorization - JWT accessToken ํ•„์š”
    • Success Response
      • 200 OK => my articles ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ ์„ฑ๊ณต
    • Error Response
      • 401 Unauthorized => ์ธ์ฆ ๊ถŒํ•œ ์‹คํŒจ

  • 2. get other person articles
    • End point:
        GET /api/user/{userId}/articles
      
    • Authorization - JWT accessToken ํ•„์š”
    • required parameter - userId ํ•„์š”
    • Success Response
      • 200 OK => other person's articles ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ ์„ฑ๊ณต
    • Error Response
      • 401 Unauthorized => ์ธ์ฆ ๊ถŒํ•œ ์‹คํŒจ

3. Article

  • 1. create article
    • End point:
        POST /api/article
      
    • Authorization - JWT accessToken ํ•„์š”
    • Success Response
      • 201 CREATED => article ์ƒ์„ฑ ์„ฑ๊ณต
    • Error Response
      • 401 Unauthorized => ๊ถŒํ•œ ์ธ์ฆ ์‹คํŒจ
      • 400 Bad Request => ํ•„์ˆ˜ ์ž…๋ ฅ ๋ชฉ๋ก ์‹คํŒจ

  • 2. get other person articles
    • End point:
        GET /api/article
      
    • required parameter - userId ํ•„์š”
    • Success Response
      • 200 OK => other person's articles ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ ์„ฑ๊ณต
    • Error Response
      • 400 Bad Request => status์— ๋”ฐ๋ฅธ ๊ฒฐ๊ณผ๊ฐ’์ด ์—†์„๋•Œ ์—๋Ÿฌ

  • 2. get single article
    • End point:
        GET /api/article/{id}
      
    • required parameter - articleID ํ•„์š”
    • Success Response
      • 200 OK => single articles ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ ์„ฑ๊ณต
    • Error Response
      • 400 Bad Request => article id์— ๋”ฐ๋ฅธ ๊ฒŒ์‹œ๋ฌผ์„ ๋ชป ์ฐพ์•˜์„๋•Œ

  • 2. edit single article
    • End point:
        PATCH /api/article/{id}
      
    • Authorization - JWT accessToken ํ•„์š”
    • required parameter - articleID ํ•„์š”
    • Success Response
      • 200 OK => single articles ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ ์„ฑ๊ณต
    • Error Response
      • 404 Not Fount => article id์— ๋”ฐ๋ฅธ ๊ฒŒ์‹œ๋ฌผ์„ ๋ชป ์ฐพ์•˜์„๋•Œ
      • 401 Unauthorized => ๊ถŒํ•œ ์ธ์ฆ ์‹คํŒจ

  • 2. delete single article
    • End point:
        DELETE /api/article/{id}
      
    • Authorization - JWT accessToken ํ•„์š”
    • required parameter - articleID ํ•„์š”
    • Success Response
      • 200 OK => article ์‚ญ์ œ ์„ฑ๊ณต
    • Error Response
      • 404 Not Fount => article id์— ๋”ฐ๋ฅธ ๊ฒŒ์‹œ๋ฌผ์„ ๋ชป ์ฐพ์•˜์„๋•Œ
      • 401 Unauthorized => ๊ถŒํ•œ ์ธ์ฆ ์‹คํŒจ

4. Category

  • 1. get all category
    • End point:
        GET /api/category
      
    • Success Response
      • 200 OK => ๋ชจ๋“  category ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์„ฑ๊ณต

  • 2. get single category
    • End point:
        GET /api/category/{label}
      
    • required parameter : label
    • Success Response
      • 200 OK => label๋ณ„๋กœ category ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์„ฑ๊ณต
    • Error Response
      • 404 Not Fount => article label์„ 8000 ๋ชป ๋ถˆ๋Ÿฌ์™”์„๋•Œ

5. Tag

  • 1. find all tags
    • End point:
        GET /api/tag
      
    • option parameter : ?label={label} ์˜ต์…˜์œผ๋กœ ์ •๋ณด ์ œ๊ณต
    • Success Response
      • 200 OK => ๋ชจ๋“  tags ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์„ฑ๊ณต

  • 2. find single tag
    • End point:
        GET /api/tag/{id}
      
    • required parameter : tagId
    • Success Response
      • 200 OK => single tag ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์„ฑ๊ณต
    • Error Response
      • 400 Not Fount => article tag๋ฅผ ๋ชป ๋ถˆ๋Ÿฌ์™”์„๋•Œ

6. Comment

  • 1. create comment
    • End point:
        POST /api/comment/{articleId}
      
    • Authorization - JWT accessToken ํ•„์š”
    • required parameter - articleId ํ•„์š”
    • Success Response
      • 201 CREATED => comment ์ƒ์„ฑ ์„ฑ๊ณต
    • Error Response
      • 401 Unauthorized => ๊ถŒํ•œ ์ธ์ฆ ์‹คํŒจ
      • 400 Bad Request => ํ•„์ˆ˜ ์ž…๋ ฅ ๋ชฉ๋ก ์‹คํŒจ

  • 2. Find all comments by article
    • End point:
        GET /api/comment/article/{articleId}
      
    • required parameter - articleId ํ•„์š”
    • Success Response
      • 200 OK => ํ•ด๋‹น article์— ๋Œ€ํ•œ all comments ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์„ฑ๊ณต

  • 3. Find comment by id
    • End point:
        GET /api/comment/{commentId}
      
    • required parameter - commentId ํ•„์š”
    • Success Response
      • 200 OK => single commnet ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์„ฑ๊ณต

  • 4. edit single comment
    • End point:
        PATCH /api/comment/{commentId}
      
    • Authorization - JWT accessToken ํ•„์š”
    • required parameter - commentId ํ•„์š”
    • Success Response
      • 200 OK => single comment ์—…๋ฐ์ดํŠธ ์„ฑ๊ณต
    • Error Response
      • 403 Forbidden => ์œ ์ €๊ฐ€ ๋Œ“๊ธ€์˜ ์ž‘์„ฑ์ž๊ฐ€ ์•„๋‹๋–„ ์—๋Ÿฌ
      • 401 Unauthorized => ๊ถŒํ•œ ์ธ์ฆ ์‹คํŒจ
      • 400 Bad Request => comment update ์—๋Ÿฌ

  • 5. delete single comment
    • End point:
        DELETE /api/comment/{commentId}
      
    • Authorization - JWT accessToken ํ•„์š”
    • required parameter - articleID ํ•„์š”
    • Success Response
      • 200 OK => comment ์‚ญ์ œ ์„ฑ๊ณต
    • Error Response
      • 404 Not Found => comment ์ฐพ์„ ์ˆ˜ ์—†์„ ๋•Œ
      • 403 Forbidden => ์œ ์ €๊ฐ€ ๋Œ“๊ธ€์˜ ์ž‘์„ฑ์ž๊ฐ€ ์•„๋‹๋–„ ์—๋Ÿฌ
      • 401 Unauthorized => ๊ถŒํ•œ ์ธ์ฆ ์‹คํŒจ

7. Search

  • 1. search article by title or content
    • End point:
      GET /api/search/article
      
    • required parameter - ?keyword=title&keyword=content
    • Success Response
      • 200 OK => title์ด๋‚˜ content keyword๊ฐ€ ๋“ค์–ด์žˆ๋Š” article ๊ฒ€์ƒ‰ ์„ฑ๊ณต

  • 2. search article by category
    • End point:
      GET /api/search/article/category
      
    • required parameter - ?label=hobby
    • Success Response
      • 200 OK => label์— ๋”ฐ๋ฅธ category ๊ฒ€์ƒ‰ ์„ฑ๊ณต
    • Error Response
      • 404 Not Found => ํ•ด๋‹น label์˜ category๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์„๋•Œ

  • 2. search article by tag
    • End point:
      GET /api/search/article/tag
      
    • required parameter - ?label=hobby
    • Success Response
      • 200 OK => label์— ๋”ฐ๋ฅธ tag ๊ฒ€์ƒ‰ ์„ฑ๊ณต
    • Error Response
      • 400 Bad Reuqest => ํ•ด๋‹น label์˜ tag ์ฐพ์„ ์ˆ˜ ์—†์„๋•Œ

7. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์กฐ

1. ERD

2. entity ๊ตฌ์กฐ

1. Article Entity

  • id: ๊ณ ์œ ํ•œ ์•„์ด๋”” (UUID)๋กœ ๊ธฐ๋ณธ ํ‚ค
  • title: ๊ธ€์˜ ์ œ๋ชฉ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž์—ด
  • content: ๊ธ€์˜ ๋‚ด์šฉ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ค‘๋Œ€ํ•œ ํ…์ŠคํŠธ
  • thumbnail: ๊ธ€์— ์ฒจ๋ถ€๋œ ์ธ๋„ค์ผ ์ด๋ฏธ์ง€ ๊ฒฝ๋กœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž์—ด
  • status:
    • ๊ธ€์˜ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž์—ด (draft, publish, onlyme ์ค‘ ํ•˜๋‚˜)
    • ๊ธฐ๋ณธ๊ฐ’์€ draft
  • views: ๊ธ€์˜ ์กฐํšŒ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜, ๊ธฐ๋ณธ๊ฐ’์€ 0
  • likes: ๊ธ€์˜ ์ข‹์•„์š” ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜, ๊ธฐ๋ณธ๊ฐ’์€ 0
  • category:
    • ๊ธ€์ด ์†ํ•œ ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์™ธ๋ž˜ ํ‚ค
    • Category ์—”ํ„ฐํ‹ฐ์™€์˜ ๊ด€๊ณ„ ์„ค์ •
  • tags: ๊ธ€์— ๋ถ€์—ฌ๋œ ํƒœ๊ทธ ๋ชฉ๋ก. Tag ์—”ํ„ฐํ‹ฐ์™€ ๋‹ค๋Œ€๋‹ค ๊ด€๊ณ„ ์„ค์ •
  • isRecommended: ๊ธ€์„ ์ถ”์ฒœํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ถ€์šธ ๊ฐ’, ๊ธฐ๋ณธ๊ฐ’์€ false
  • createAt: ๊ธ€์˜ ์ƒ์„ฑ ์‹œ๊ฐ„์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„ ์ •๋ณด
  • updateAt: ๊ธ€์˜ ์ตœ๊ทผ ์ˆ˜์ • ์‹œ๊ฐ„์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„ ์ •๋ณด
  • comments: ๊ธ€์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€ ๋ชฉ๋ก. Comment ์—”ํ„ฐํ‹ฐ์™€ ์ผ๋Œ€๋‹ค ๊ด€๊ณ„ ์„ค์ •
  • user:
    • ๊ธ€์„ ์ž‘์„ฑํ•œ ์‚ฌ์šฉ์ž ์ •๋ณด
    • User ์—”ํ„ฐํ‹ฐ์™€์˜ ๊ด€๊ณ„ ์„ค์ •

2. Category Entity

  • id: ๊ณ ์œ ํ•œ ์•„์ด๋”” (UUID)๋กœ ๊ธฐ๋ณธ ํ‚ค
  • label: ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋ ˆ์ด๋ธ”์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž์—ด
  • articles: ํ•ด๋‹น ์นดํ…Œ๊ณ ๋ฆฌ์— ์†ํ•œ ๊ธ€ ๋ชฉ๋ก, Article ์—”ํ„ฐํ‹ฐ์™€์˜ ์ผ๋Œ€๋‹ค ๊ด€๊ณ„ ์„ค์ •
  • createAt: ์นดํ…Œ๊ณ ๋ฆฌ์˜ ์ƒ์„ฑ ์‹œ๊ฐ„์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„ ์ •๋ณด
  • updateAt: ์นดํ…Œ๊ณ ๋ฆฌ์˜ ์ตœ๊ทผ ์ˆ˜์ • ์‹œ๊ฐ„์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„ ์ •๋ณด

3. Comment Entity

  • id: ๊ณ ์œ ํ•œ ์•„์ด๋”” (autoincrement)๋กœ ๊ธฐ๋ณธ ํ‚ค
  • content: ๋Œ“๊ธ€ ๋‚ด์šฉ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž์—ด
  • createAt: ๋Œ“๊ธ€์˜ ์ƒ์„ฑ ์‹œ๊ฐ„์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„ ์ •๋ณด
  • updateAt: ๋Œ“๊ธ€์˜ ์ตœ๊ทผ ์ˆ˜์ • ์‹œ๊ฐ„์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„ ์ •๋ณด
  • pass: ๋Œ“๊ธ€์˜ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ถ€์šธ ๊ฐ’ (true ๋˜๋Š” false), ๊ธฐ๋ณธ๊ฐ’์€ true
  • user: ๋Œ“๊ธ€์„ ์ž‘์„ฑํ•œ ์‚ฌ์šฉ์ž ์ •๋ณด, User ์—”ํ„ฐํ‹ฐ์™€์˜ ๊ด€๊ณ„ ์„ค์ •
  • article: ๋Œ“๊ธ€์ด ์†ํ•œ ๊ธ€ ์ •๋ณด, Article ์—”ํ„ฐํ‹ฐ์™€์˜ ๊ด€๊ณ„ ์„ค์ •
  • parent: ๋Œ“๊ธ€์˜ ๋ถ€๋ชจ ๋Œ“๊ธ€ ์ •๋ณด (์ž๊ธฐ ์ฐธ์กฐ ๊ด€๊ณ„), Comment ์—”ํ„ฐํ‹ฐ์™€์˜ ๊ด€๊ณ„ ์„ค์ •
  • children: ๋Œ“๊ธ€์˜ ์ž์‹ ๋Œ“๊ธ€ ๋ชฉ๋ก (์ž๊ธฐ ์ฐธ์กฐ ๊ด€๊ณ„), Comment ์—”ํ„ฐํ‹ฐ์™€์˜ ๊ด€๊ณ„ ์„ค์ •

4. Tag Entity

  • id: ๊ณ ์œ ํ•œ ์•„์ด๋”” (UUID)๋กœ ๊ธฐ๋ณธ ํ‚ค
  • label: ํƒœ๊ทธ์˜ ๋ ˆ์ด๋ธ”์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž์—ด
  • articles: ํ•ด๋‹น ํƒœ๊ทธ์™€ ์—ฐ๊ฒฐ๋œ ๊ธ€ ๋ชฉ๋ก, Article ์—”ํ„ฐํ‹ฐ์™€์˜ ๋‹ค๋Œ€๋‹ค ๊ด€๊ณ„ ์„ค์ •
  • createAt: ํƒœ๊ทธ์˜ ์ƒ์„ฑ ์‹œ๊ฐ„์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„ ์ •๋ณด
  • updateAt: ํƒœ๊ทธ์˜ ์ตœ๊ทผ ์ˆ˜์ • ์‹œ๊ฐ„์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„ ์ •๋ณด

5. User Entity

  • id: ๊ณ ์œ ํ•œ ์•„์ด๋”” (UUID)๋กœ ๊ธฐ๋ณธ ํ‚ค
  • firstName: ์‚ฌ์šฉ์ž์˜ ์ด๋ฆ„์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž์—ด

8. ๋ฐฐํฌ ๊ณผ์ •

  • ํ”„๋กœ์ ํŠธ๋ฅผ PlanetScale MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ Digital Ocean Ubuntu ์„œ๋ฒ„์— ๋ฐฐํฌํ–ˆ์Šต๋‹ˆ๋‹ค.
  1. PlanetScale MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค์ •

    • PlanetScale์— ๊ณ„์ •์„ ์ƒ์„ฑํ•˜๊ณ , MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    • ํด๋Ÿฌ์Šคํ„ฐ ์—ฐ๊ฒฐ ์ •๋ณด๋ฅผ ํš๋“ํ•˜๊ณ , ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋˜๋Š” ์„ค์ • ํŒŒ์ผ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  2. Digital Ocean ์„œ๋ฒ„ ์„ค์ •

    • Digital Ocean์— ๊ณ„์ •์„ ์ƒ์„ฑํ•˜๊ณ , Ubuntu ์„œ๋ฒ„๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    • ์„œ๋ฒ„์— SSH๋กœ ์ ‘์†ํ•˜๊ณ  ํ•„์š”ํ•œ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
  3. ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ ๋ฐฐํฌ

    • ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ๋ฅผ ์„œ๋ฒ„๋กœ ๋ณต์ œํ•ฉ๋‹ˆ๋‹ค.
    • ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •: ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    • .env ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  4. Docker์™€ Docker Compose ์„ค์น˜

    • ์„œ๋ฒ„์— Docker์™€ Docker Compose๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
  5. Nginx ์„ค์ •

    • Nginx๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์„ค์ • ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜์—ฌ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋กœ์˜ ์š”์ฒญ์„ ํ”„๋ก์‹œํ•ฉ๋‹ˆ๋‹ค.
  6. ๋„๋ฉ”์ธ ๋ฐ SSL ์„ค์ • (์˜ต์…˜)

    • ๋„๋ฉ”์ธ์„ ๊ตฌ๋งคํ•˜๊ณ  DNS ์„ค์ •์„ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
    • Let's Encrypt ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ SSL์„ ํ™œ์„ฑํ™” ํ–ˆ์Šต๋‹ˆ๋‹ค.
  7. Docker Compose๋กœ ์„œ๋น„์Šค ์‹คํ–‰

    • ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ์—์„œ docker-compose.yml ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋น„์Šค๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
    docker-compose up -d
    

9. CI / CD ํŒŒ์ดํ”„๋ผ์ธ

  • ํ”„๋กœ์ ํŠธ๋Š” CI/CD ํŒŒ์ดํ”„๋ผ์ธ์„ ํ†ตํ•ด ์ง€์†์ ์ธ ํ†ตํ•ฉ๊ณผ ๋ฐฐํฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด ํŒŒ์ดํ”„๋ผ์ธ์€ ์†Œ์Šค ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ž๋™์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜๊ณ  ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  1. CI (Continuous Integration)
  • ๋ชจ๋“  ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ CI ์„œ๋ฒ„์—์„œ ์ž๋™์œผ๋กœ ๋นŒ๋“œ ๋ฐ ํ…Œ์ŠคํŠธ๋ฉ๋‹ˆ๋‹ค.
  • CI ํŒŒ์ดํ”„๋ผ์ธ์€ ์ฝ”๋“œ ํ’ˆ์งˆ, ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ ๋“ฑ์„ ๊ฒ€์‚ฌํ•˜๊ณ  ์ด์ƒ์ด ๊ฐ์ง€๋˜๋ฉด ๋นŒ๋“œ๋ฅผ ์ค‘๋‹จํ•˜๊ณ  ํ†ต์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • GitHub Actions๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ CI๋ฅผ ์„ค์ •ํ•˜์˜€์œผ๋ฉฐ, .github/workflows ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ๊ด€๋ จ ์›Œํฌํ”Œ๋กœ์šฐ ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  1. CD (Continuous Deployment)
  • ์ฝ”๋“œ๊ฐ€ CI๋ฅผ ํ†ต๊ณผํ•˜๊ณ  ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์— ๋ณ‘ํ•ฉ๋˜๋ฉด CD ํŒŒ์ดํ”„๋ผ์ธ์ด ์ž๋™์œผ๋กœ ๋ฐฐํฌ ์ž‘์—…์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  • ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ ๋ชจ๋‘ ์ž๋™ ๋ฐฐํฌ๊ฐ€ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ, ์‹ค์ œ ์„œ๋ฒ„์— ์ž๋™์œผ๋กœ ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค.
  • Docker ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํŒจํ‚ค์ง•ํ•˜๊ณ , Nginx ๋˜๋Š” ๋‹ค๋ฅธ ์›น ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐํฌ ์„œ๋ฒ„์—์„œ ํ˜ธ์ŠคํŒ…ํ•ฉ๋‹ˆ๋‹ค.

About

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •  
0