๐ŸŒ…

1์›” 2์ผ ํšŒ์˜

ํšŒ์˜ ๊ธฐํ•œ
โ€ฃ

ํšŒ์˜ ์ฃผ์ œ


โ˜๐Ÿป
API ๋ช…์„ธ์„œ ํšŒ์˜๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค.
  • ๊ฐ์ž ๋จธ์“ฑ๋ ˆํ„ฐ์˜ API ๋ฅผ ์กฐ์‚ฌํ•ด์˜จ๋‹ค.
    • ํ•„๋“œ๋ช… ํ†ต์ผํ™”, ๊ณตํ†ต API ๋ฌถ๊ธฐ,
  • queryOptions ๋กœ queryKey ๊ด€๋ฆฌ
api-docs ๋ฅผ ๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•
yarn api-docs start
 
โœŒ๐Ÿป
express ๊ณต๋ถ€ํ•œ๊ฑฐ ๊ณต์œ ํ•˜๊ธฐ
  • ์ƒํ™œ์ฝ”๋”ฉ express ๊ฐ•์˜ ๋“ฃ๊ณ  ๊ณต์œ 
โœŒ๐Ÿป
์˜คํ”„๋‹˜ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๊ฐ•์˜
     
     
     

    ํ˜„์žฌ ๋ช‡ ๊ฐ€์ง€ ํ•ด๋†“์€ ์ž‘์—…์— ๋Œ€ํ•ด์„œ..

    Express ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ

    ์ƒ์„ธ ๋‚ด์šฉ์€.. ์ด PR ์—์„œ ํ™•์ธ ๊ฐ€๋Šฅ.
    (๋ฆฌํŒฉํ† ๋ง ์™„๋ฃŒ ์‹œ ์ œ๊ฑฐ๋  ํŒŒ์ผ์ด๋‚˜ ๋””๋ ‰ํ† ๋ฆฌ์—๋Š” ์–ธ๋”๋ฐ”๋ฅผ ๋ถ™ํ˜€ ๋†“์•˜์Œ!)
    ๐Ÿ“‚ src ๐Ÿ“‚ _apis: ๊ธฐ์กด์— ๊ตฌํ˜„๋œ SNS API, ์Šฌ๋ž™ API ๋“ฑ ์™ธ๋ถ€ ์„œ๋น„์Šค์— ๋Œ€ํ•œ ๋กœ์ง (์ถ”ํ›„ ์ œ๊ฑฐ๋  ์˜ˆ์ •..) ๐Ÿ“‚ _handlers: ๊ธฐ์กด์— ๊ตฌํ˜„๋œ ์Šฌ๋ž™ ๊ด€๋ จ ์ปจํŠธ๋กค๋Ÿฌ ๋กœ์ง (์ถ”ํ›„ ์ œ๊ฑฐ๋  ์˜ˆ์ •...) ๐Ÿ“‚ config: ๊ฐ์ข… ์„ค์ • ๋กœ์ง ๐Ÿ“‚ domains: ๊ฐ ๋„๋ฉ”์ธ์— ๋Œ€ํ•œ ์†Œ์Šค์ฝ”๋“œ (์šฐ์„  REST API์˜ ๊ฐ€์žฅ ์•ž ๋ถ€๋ถ„์— ํ•ด๋‹น๋˜๋Š” ๊ฒƒ๋“ค๋กœ ๋ฌถ์–ด ๋†“์•˜์–ด์š”.) ๐Ÿ“„[domain].controller.ts: ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณณ ๐Ÿ“„[domain].service.ts: ๋„๋ฉ”์ธ์— ๋Œ€ํ•œ ๊ฐ์ข… ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ๋“ค์–ด๊ฐ€๋Š” ๊ณณ ๐Ÿ“„[domain].repository.ts: DB์— ์•ก์„ธ์Šคํ•˜๋Š” ์ง์ ‘์ ์ธ ๋กœ์ง์ด ๋“ค์–ด๊ฐ€๋Š” ๊ณณ ๐Ÿ“„[domain].validator.ts: ํด๋ผ์ด์–ธํŠธ์˜ Request ๊ฐ์ฒด์— ๋Œ€ํ•œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋กœ์ง์„ ์ž‘์„ฑํ•˜๋Š” ๊ณณ ๐Ÿ“‚ middlewares: ํŠน์ • ๋„๋ฉ”์ธ์— ์ข…์†๋˜์ง€ ์•Š๊ณ  ์ „์—ญ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” Express ๋ฏธ๋“ค์›จ์–ด (์œ ํšจ์„ฑ ๊ฒ€์‚ฌ, ๋กœ๊ทธ์ธ ๊ฒ€์‚ฌ ๋“ฑ) ๐Ÿ“‚ models: TypeORM ์Šคํ‚ค๋งˆ (๊ทธ๋Œ€๋กœ DB์— ์ ์šฉ) ๐Ÿ“‚ types: ๊ฐ์ข… ํƒ€์ž… ๐Ÿ“‚ utils: ๊ฐ์ข… ์œ ํ‹ธ์„ฑ ๋กœ์ง
     

    ํšŒ์›๊ฐ€์ž… ๊ธฐ๋Šฅ ๊ตฌํ˜„

    ์šฐ์„  ๊ฐ„๋‹จํ•˜๊ฒŒ accessToken๋งŒ ๋ฐœ๊ธ‰ ๋ฐ›๋„๋ก ํ•ด ๋†“์•˜์Œ..
     

    Express์— Jest ์„ค์น˜

    Jest ์„ค์น˜ํ•˜๊ณ , ๊ฐ„๋‹จํ•˜๊ฒŒ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ๋ช‡ ๊ฐœ ์ž‘์„ฑํ•ด๋ณด์•˜์Œ.. (auth service, ๋ฏธ๋“ค์›จ์–ด ๋“ฑ๋“ฑ)
     

    Express๋ฅผ ๋กœ์ปฌ์— ๋„์šฐ๊ธฐ ์œ„ํ•ด์„œ..

    • Express ์„œ๋ฒ„์—์„œ MySQL, Redis๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ž ์ปดํ“จํ„ฐ์— ์„ค์น˜๊ฐ€ ํ•„์š”..
    • ๊ฐ์ž ๋กœ์ปฌ์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ณ„์ •๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํ™˜๊ฒฝ๋ณ€์ˆ˜ .env์—์„œ ๋ณ€๊ฒฝํ•˜๋Š” ๊ณผ์ • ํ•„์š”
    • (์›๋ž˜ Docker ์ปจํ…Œ์ด๋„ˆ๋กœ ํ™˜๊ฒฝ์„ ๋งŒ๋“ค์–ด ๋†“์„ ์ˆ˜ ์žˆ์„ ๊ฑฐ ๊ฐ™์€๋ฐ.. ์•„์ง ๊ทธ ์ชฝ๊นŒ์ง€ ํ•™์Šต์„ ๋ชปํ•ด์„œ ํ•ด๋†“์ง€ ๋ชปํ–ˆ์Œ.. ๐Ÿ˜‚)
    • env ํŒŒ์ผ์€ ํšŒ์˜์šฉ ๋””์Šค์ฝ”๋“œ ์ฑ„๋„์— ์—…๋กœ๋“œํ•ด๋†“์•˜์Œ
     
     
     
     

    ํšŒ์˜ ๊ฒฐ๊ณผ

    ์Šคํ‚ค๋งˆ

    • User ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ
      • username โ†’ email
      • image_name โ†’ image_url
    • Comment ์Šคํ‚ค๋งˆ
      • author โ†’ author_id (์‚ญ์ œ ๊ธฐ๋Šฅ ๋•Œ๋ฌธ์— FK ์—ฐ๊ฒฐํ•ด์•ผํ•จ.)
      • nickname ์ถ”๊ฐ€ (๋‹‰๋„ค์ž„ ํ•„๋“œ)
      • updated_at ์ œ๊ฑฐ
     

    API

    • PUT /users/{userId}
      • ์•ก์„ธ์Šค ํ† ํฐ header์— ์ถ”๊ฐ€ ์™„๋ฃŒ.
    • GET /posts
      • ์ž‘์„ฑ์ž ์ด๋ฆ„ ๋“ค์–ด๊ฐ€์•ผ ํ•จ.
        • โ†’ authorId, authorName ํ•„๋“œ ์ž‘์„ฑ ์™„๋ฃŒ.
      • comments ๋ฐฐ์—ด ๋Œ€์‹ ์— commentCount๋งŒ ์žˆ์–ด๋„ ๋จ. (FE๋„ ์ˆ˜์ • ์‚ฌํ•ญ ๋ฐ˜์˜)
        • โ†’ commentCount ๋กœ ๋ณ€๊ฒฝ ์™„๋ฃŒ.
    • GET /posts/{postId}
      • ์•ก์„ธ์Šค ํ† ํฐ ์—†์–ด๋„ ๋จ.
      • โ†’ ์•ก์„ธ์Šค ํ† ํฐ ์‚ญ์ œ ์™„๋ฃŒ.
    • POST /posts/{postId}/comments
      • ๋น„ํšŒ์› ์ „์šฉ์ด๋ž‘, ํšŒ์› ์ „์šฉ์ด๋ž‘ ๊ตฌ๋ถ„ํ•ด์„œ API ํฌ์ธํŠธ ์ž‘์„ฑํ•˜๊ธฐ.
      • โ†’ ๊ฐ™์€ API์— query ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ asSignedUser=true | false ๊ฐ’์— ๋”ฐ๋ผ์„œ ๋น„ํšŒ์›๊ณผ ํšŒ์› ์ „์šฉ์„ ๊ตฌ๋ถ„ํ–ˆ์Œ. ์™„๋ฃŒ.
    • ํŽธ์ง€ ์‚ญ์ œ API ์ถ”๊ฐ€ํ•ด์•ผ ํ•จ.
      • โ†’ DELETE /comments/{commentId} ์™„๋ฃŒ.
    • ๋กœ๊ทธ์ธ API์—์„œ validation ์•ˆ๋ณด๋‚ด์ฃผ๊ธฐ.
      • validationFilter์— ์ธ์ž ํ•˜๋‚˜ ๋ณด๋‚ด์„œ.. validation ํ•„๋“œ ์ค„์ง€ ์•ˆ์ค„์ง€ ์ˆ˜์ •ํ•˜๊ธฐ
     
     

    (2์ฃผ) ์ž‘์—… ๋ถ„๋ฐฐ

    • ์ƒํ›ˆ: ์ธํ”„๋ผ, ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €, ์ž๋™ํ™”, Github Actions, โ€ฆ ๋“ฑ๋“ฑ ํ•ด๋ณด๊ณ  ์‹ถ์Œ
        1. PR ๋นŒ๋“œ ์‹คํŒจ ์ฒดํฌํ•˜๊ธฐ.
        1. ERD-cloud๋กœ ERD ์˜ฎ๊ธฐ๊ธฐ
        1. ์˜ค๋Š˜ ์˜๋…ผํ•œ ๋‚ด์šฉ ๋ฐ”ํƒ•์œผ๋กœ API DOCS ์—…๋ฐ์ดํŠธํ•˜๊ธฐ.
        1. ์˜ค๋Š˜ ์˜๋…ผํ•œ ๋‚ด์šฉ ๋ฐ”ํƒ•์œผ๋กœ DB, Auth ๋กœ์ง ๋ณ€๊ฒฝํ•˜๊ธฐ
        1. TanStack Query V5 ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ (๋‹จ์ˆœํžˆ ๋ฒ„์ „๋งŒ ์˜ฌ๋ฆฌ๊ธฐ)
        1. Query Key Factory ํŒจํ„ด์œผ๋กœ queryOptions ์ •๋ฆฌ (์ƒˆ๋กœ์šด API ์ ์šฉ)
        1. ๋ฐฑ์—”๋“œ API
            • /auth ๊ด€๋ จ API
            • PUT /users/{userId}/slack} ์Šฌ๋ž™ ๊ณ„์ • ์—ฐ๋™
            • POST /slack/verification ์Šฌ๋ž™ DM์œผ๋กœ ์ธ์ฆ ๋งํฌ ์ „์†ก
        1. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๊ณต๋ถ€โ€ฆ. (ํ•  ์ˆ˜ ์žˆ์œผ๋ ค๋‚˜ ใ… 0ใ… )
    • ์ฃผ์—ฐ
        1. ํฐํŠธ ๊ด€๋ จ ์ตœ์ ํ™”
        1. ํ…Œ์ŠคํŠธ์ฝ”๋“œ ๊ณต๋ถ€ โ‡’ ํŠนํžˆ msw์™€ ์–ด๋–ป๊ฒŒ ํ…Œ์ŠคํŠธํ• ์ง€์— ํŠนํ™”ํ•ด์„œ ๊ณต๋ถ€ํ•˜๊ณ ์‹ถ์Œ
        1. ๋ฐฑ์—”๋“œ ๊ณต๋ถ€ + api
          1. GET /users ์‚ฌ์šฉ์ž ๋ชฉ๋ก ์กฐํšŒ
          2. GET /posts/{postId}/comments ๋Œ“๊ธ€ ๋‹ค๊ฑด ์กฐํšŒ
          3. GET /comments/{commentId} ๋Œ“๊ธ€ ๋‹จ๊ฑด ์กฐํšŒ
    • ํ˜ธ์›
        1. Post, Comment api ์ดˆ์•ˆ ๊ตฌํ˜„
          1. GET /posts/{postId} ๋จธ์“ฑ์ด ์ƒ์„ธ ์กฐํšŒ
          2. DELETE /posts/{postId} ๋จธ์“ฑ์ด ์‚ญ์ œ
          3. POST /posts/{postId}/comments ํŠน์ • ๋จธ์“ฑ์ด์—๊ฒŒ ํŽธ์ง€ ์ž‘์„ฑ
        1. Tanstack Query ์‚ฌ์šฉ ํŒจํ„ด ๊ณต๋ถ€
        1. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๊ณต๋ถ€
    • ํ˜ธ์ˆ˜:
        1. ๋ฐฑ์—”๋“œ API ๊ตฌํ˜„
            • /posts ๋จธ์“ฑ์ด ๋ชฉ๋ก ์กฐํšŒ
            • /posts ๋จธ์“ฑ์ด ์ƒ์„ฑ
        1. ์ตœ์‹ ์ˆœ, ์ธ๊ธฐ์ˆœ โ€˜ํ† ๊ธ€๋ฒ„ํŠผโ€™ ๋จธ์“ฑ์ด ๋ชฉ๋ก ์กฐํšŒ
        1. ๋จธ์“ฑ ์ƒ์„ฑ react hook form ์ ์šฉ (๊นŒ๋จน๊ณ ์žˆ์—ˆ..)
        1. ๋ฐฐํฌ ๊ณผ์ • ์ฝ”๋“œ , API ์š”์ฒญ ํ›„ DB ํ™•์ธ
    • ํ˜„์ง€
        1. ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ useSuspenseQuery ํ›…์œผ๋กœ ๋ณ€๊ฒฝ
        1. ์„œ๋ฒ„ API ๊ตฌํ˜„ (ํ”„๋กœํ•„ ์ด๋ฏธ์ง€ s3 ์—…๋กœ๋“œ ๊ณต๋ถ€ํ•˜๊ธฐ )
          1. GET /users/{userId} ํŠน์ • ์‚ฌ์šฉ์ž์˜ ์ •๋ณด ์กฐํšŒ
          2. PUT /users/{userId} ์‚ฌ์šฉ์ž์˜ ์ •๋ณด ์ˆ˜์ •
          3. PUT /users/{userId}/photo ์‚ฌ์šฉ์ž์˜ ํ”„๋กœํ•„ ์ด๋ฏธ์ง€ ์ˆ˜์ •
     
     

    ๊ทœ์น™

    1. 2์ฃผ์— 1๋ฒˆ ํ…Œํฌ์ŠคํŽ™ ์ž‘์„ฑํ•˜๊ธฐ(๊ฐœ์ธ ๋ธ”๋กœ๊ทธ์— ์ž‘์„ฑํ•˜๊ณ  ๊นƒํ—ˆ๋ธŒ wiki์— ๋ธ”๋กœ๊ทธ url ๋˜๋Š” ๋‚ด์šฉ ๋ณต๋ถ™ํ•˜๊ธฐ)
    1. PR ๋ฆฌ๋ทฐ ๊ทœ์น™
      1. ์ด์Šˆ ์˜ฌ๋ฆฌ๊ณ  ๋ธŒ๋žœ์น˜ ๋งŒ๋“ค๊ธฐ
      2. PR ์˜ฌ๋ฆด ๋•Œ D-3, D-1 ๋ผ๋ฒจ ๋‹ฌ๊ณ  PR ์˜ฌ๋ ธ๋‹ค๊ณ  ์นดํ†ก๋ฐฉ์— ์˜ฌ๋ฆฌ๊ธฐ
      3. ์ตœ.๋Œ€.ํ•œ ๋ชจ๋“  ์ธ์›์ด ์ฝ”๋“œ๋ฆฌ๋ทฐ ํ•ด์ฃผ๊ธฐ
      4. PR ๊ผญ ์ชผ๊ฐœ์„œ ์˜ฌ๋ ค์ฃผ์„ธ์š”. ํ•œ๊บผ๋ฒˆ์— ์˜ฌ๋ฆฌ๋ฉด Merge X
    1. ์Šคํฌ๋Ÿผ ํšŒ์˜ - ์ฃผ 1ํšŒ
      1. ๊ถ๊ธˆํ•œ ์ ์€ ๋””์ฝ”์—์„œ ์‹ค์‹œ๊ฐ„ or ๋น„๋™๊ธฐ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜
    1. ๋จธ์“ฑ ๋ ˆํ„ฐ ์ž‘์—… ์ค‘์—๋Š” ๋””์ฝ”์— ๋“ค์–ด์™€์žˆ๊ธฐ!