Challenge/Project Log

Podo - Dev Log (3)

Deviloper๐Ÿ˜ˆ 2021. 12. 12. 16:16

12์›” 6์ผ (์›”)

์˜ค๋Š˜์€ ์–ด๋–ป๊ฒŒ ํ”„๋กœ์ ํŠธ์— ๊ธฐ์—ฌํ–ˆ๋‚˜์š”?

  • ์„œ๋ฒ„ ๋ฐฐํฌ ํ›„ ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ
  • ๊ณ„์ขŒ์กฐํšŒ ๋ฐ ์นด๋“œ๊ฒฐ์ œ API ๊ฒ€์ƒ‰
  • ์•„์ž„ํฌํŠธ, ์ด๋‹ˆ์‹œ์Šค API ๊ณต๋ถ€
  • API Docs์— Callback ์‚ญ์ œ ๋ฐ Response ์ˆ˜์ •
  • ์ฝ”๋“œ ์ฃผ์„ ์ถ”๊ฐ€

 

์˜ค๋Š˜์˜ ํ”„๋กœ์ ํŠธ์—์„œ ํž˜๋“  ์ ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

  • ํ”„๋กœ์ ํŠธ ์ƒ ๊ฒฐ์ œ API๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•ด์•ผ ํ•  ์ง€ ๊ฐ์„ ์žก๋Š”๋ฐ ํž˜๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

 

๋‚ด์ผ์€ ํ”„๋กœ์ ํŠธ์— ๊ธฐ์—ฌํ•˜๊ธฐ ์œ„ํ•ด ๋ฌด์—‡์„ ํ•ด์•ผ ํ•˜๋‚˜์š”?

  • ์•„์ž„ํฌํŠธ API ์ ์šฉ

 

 

 

 

12์›” 7์ผ (ํ™”)

์˜ค๋Š˜์€ ์–ด๋–ป๊ฒŒ ํ”„๋กœ์ ํŠธ์— ๊ธฐ์—ฌํ–ˆ๋‚˜์š”?

  • ์ด๋‹ˆ์‹œ์Šค ์ผ๋ฐ˜ ๊ฒฐ์ œ ํ…Œ์Šค์Šค
  • ์•„์ž„ํฌํŠธ API ์ด์šฉ ๋ฐ ๊ณ„์ขŒ์‹ค๋ช…์กฐํšŒ Function ๊ตฌํ˜„
  • ant-design ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ™œ์šฉ

์˜ค๋Š˜์˜ ํ”„๋กœ์ ํŠธ์—์„œ ์–ด๋–ค ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๊ณ , ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ–ˆ๋‚˜์š”?

  • ๊ธฐ์กด์— ๋‚˜์™€์žˆ๋Š” ๊ฒฐ์ œ ๊ด€๋ จ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด๋ณด๊ธฐ ์œ„ํ•ด ant-design library๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
    Attempted import error: 'Icon' is not exported from 'antd'.
    ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์€ ์‹คํ–‰์„ ์ž˜ํ•˜๋Š” ๊ฒƒ ๊ฐ™์•„ ํ˜น์‹œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜ ๋ฌธ์ œ์ธ๊ฐ€ ํ•ด์„œ ์žฌ์„ค์น˜ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
    ํ•œ ๋Œ“๊ธ€์„ ๋ณด๋‹ˆ Ant Design์ด v4๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ ๋œ ์ดํ›„๋กœ Icon ์‚ฌ์šฉ๋ฐฉ๋ฒ•์ด ๋ฐ”๋€Œ์–ด ์•„์ด์ฝ˜ ํ•˜๋‚˜ํ•˜๋‚˜๋ฅผ ์ง์ ‘ import๋ฅผ ํ•ด์ค˜์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

 

Before

import Icon from '@ant-design/icons';
...
<Icon type='CaretDownOutlined />

 

After

import { CaretDownOutlined } from '@ant-design/icons';
...
<CaretDownOutlined />

 

๋‚ด์ผ์€ ํ”„๋กœ์ ํŠธ์— ๊ธฐ์—ฌํ•˜๊ธฐ ์œ„ํ•ด ๋ฌด์—‡์„ ํ•ด์•ผ ํ•˜๋‚˜์š”?

  • ์นด๋“œ๊ฒฐ์ œ Function ๊ตฌํ˜„
  • ์นด๋“œ์‹ค๋ช…์กฐํšŒ Payment์—์„œ ํ™œ์šฉ
  • Headers Sent Error ์ฒ˜๋ฆฌ

 

 

 

 

12์›” 8์ผ (์ˆ˜)

์˜ค๋Š˜์€ ์–ด๋–ป๊ฒŒ ํ”„๋กœ์ ํŠธ์— ๊ธฐ์—ฌํ–ˆ๋‚˜์š”?

  • ๊ณ„์ขŒ ์‹ค๋ช… ์กฐํšŒ Function์œผ๋กœ ๋ณ€๊ฒฝ ๋ฐ enrollCard, changeCard์— ์ ์šฉ
  • ์ฝ”๋“œ์Šคํ…Œ์ด์ธ  Codeplay ํŒ€๊ณผ ๋ฏธํŒ…: ์ง„ํ–‰ ์ƒํ™ฉ ๋ฐ ๊ฐœ๋ฐœํ•˜๋ฉด์„œ ํž˜๋“ค์—ˆ๋˜ ์  ๊ณต์œ 
  • API document ์ˆ˜์ •
  • Client API test

์˜ค๋Š˜์˜ ํ”„๋กœ์ ํŠธ์—์„œ ์–ด๋–ค ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๊ณ , ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ–ˆ๋‚˜์š”?

  • async, await๋ฅผ ์‚ฌ์šฉํ•ด์„œ Promise ํ˜•ํƒœ๋กœ ๊ณ„์ขŒ ์‹ค๋ช… ์กฐํšŒ๋ฅผ ํ•˜๋Š” ๊ตฌ์กฐ๋กœ Function์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์ด function์„ Controller์ธ enrollCard, changeCard์— ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด Promise ์•ˆ์— ์žˆ๋Š” ๊ฐ’์„ ๋ณ€์ˆ˜์— ๊ฒฐ๊ณผ๊ฐ’์„ ํ• ๋‹นํ•ด์„œ ๊ฒฐ๊ณผ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋‹ˆ ์—๋Ÿฌ๊ฐ€ ๋‚ฌ์Šต๋‹ˆ๋‹ค. .then์„ ํ™œ์šฉํ•˜์—ฌ ์—๋Ÿฌ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋Š˜์˜ ํ”„๋กœ์ ํŠธ์—์„œ ํž˜๋“  ์ ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

  • ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด์ผ์€ ํ”„๋กœ์ ํŠธ์— ๊ธฐ์—ฌํ•˜๊ธฐ ์œ„ํ•ด ๋ฌด์—‡์„ ํ•ด์•ผ ํ•˜๋‚˜์š”?

  • Client API test
  • Edge Case ์ฒ˜๋ฆฌ

 

 

 

 

12์›” 9์ผ (๋ชฉ)

์˜ค๋Š˜์€ ์–ด๋–ป๊ฒŒ ํ”„๋กœ์ ํŠธ์— ๊ธฐ์—ฌํ–ˆ๋‚˜์š”?

  • Client API Test
    • Party
    • Payment
    • User
  • Edge Case ์ฒ˜๋ฆฌ
    • controller/party/joinParty: ๋™์ผ ์œ ์ €๊ฐ€ ๊ฐ™์€ ํŒŒํ‹ฐ์— ์ค‘๋ณต ๊ฐ€์ž… ๋ชปํ•˜๋„๋ก ์ฒ˜๋ฆฌ
    • controller/user/deleteUser: ์œ ์ €๊ฐ€ ํƒˆํ‡ด ์š”์ฒญ ์‹œ ๋ชจ๋“  ํŒŒํ‹ฐ์— ํƒˆํ‡ด๋˜์—ˆ๋Š”์ง€ ํ™•์ธ ํ›„ ํƒˆํ‡ด
  • API Document ๊ทธ์— ๋งž๊ฒŒ ์ˆ˜์ •

์˜ค๋Š˜์˜ ํ”„๋กœ์ ํŠธ์—์„œ ์–ด๋–ค ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๊ณ , ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ–ˆ๋‚˜์š”?

  • API Test์—์„œ Party ํ…Œ์ŠคํŠธ๊ฐ€ ์ž˜ ์ง„ํ–‰๋˜๋‹ค๊ฐ€ ์ ์‹ฌ์‹œ๊ฐ„์ด ์ง€๋‚˜๊ณ  ์‹œ๋„ํ•˜๋‹ˆ ์—๋Ÿฌ๊ฐ€ ๋‚ฌ์Šต๋‹ˆ๋‹ค.
    ์ด์ „๊ณผ ๊ฐ™์€ ์š”์ฒญ์„ ํ•ด๋„ ์—”๋“œํฌ์ธํŠธ /party๊ฐ€ ๋“ค์–ด๊ฐ€์ง€ ์•Š๋Š” ์—๋Ÿฌ์˜€์Šต๋‹ˆ๋‹ค.
    ์ฝ”๋“œ์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๊ฑด ์ค„ ์•Œ๊ณ  ๋‹ค์–‘ํ•œ ์‹œ๋„๋ฅผ ํ–ˆ๋Š”๋ฐ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
    ๋งˆ์ง€๋ง‰์œผ๋กœ server๋ฅผ ๊ป๋‹ค ๋‹ค์‹œ ์ผœ๋‹ˆ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋Š˜์˜ ํ”„๋กœ์ ํŠธ์—์„œ ํž˜๋“  ์ ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

  • ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด์ผ์€ ํ”„๋กœ์ ํŠธ์— ๊ธฐ์—ฌํ•˜๊ธฐ ์œ„ํ•ด ๋ฌด์—‡์„ ํ•ด์•ผ ํ•˜๋‚˜์š”?

  • Node Schedule ํ™œ์šฉํ•ด์„œ ๋ฐฑ๋‹จ ์ •์‚ฐ ์‹œ์Šคํ…œ ๊ตฌํ˜„

 

 

 

 

12์›” 10์ผ (๊ธˆ)

์˜ค๋Š˜์€ ์–ด๋–ป๊ฒŒ ํ”„๋กœ์ ํŠธ์— ๊ธฐ์—ฌํ–ˆ๋‚˜์š”?

  • Edge Case ์ฒ˜๋ฆฌ: ์ด๋ฏธ ๊ฐ€์ž…ํ•œ ํŒŒํ‹ฐ์˜ OTT ์ข…๋ฅ˜์™€ ๋™์ผํ•œ ํŒŒํ‹ฐ๋ฅผ ๋˜ ๋‹ค์‹œ ๊ฐ€์ž…ํ•˜๊ฑฐ๋‚˜(join) ๋งŒ๋“ค๋ ค๊ณ (create)ํ•  ๋•Œ, 422 ์—๋Ÿฌ ์ฒ˜๋ฆฌ
  • API Test์‹œ response ๋ฐ error ๋ฉ”์„ธ์ง€๊ฐ€ ๋œจ๋„๋ก JSON.stringify( ) ์ถ”๊ฐ€
  • getAllParties, getFilteredParties, updateProfileImage
    • API docs ๋ฐ˜์˜
    • DB Schema column ์ถ”๊ฐ€
    • Wiki ๋ฐ˜์˜
    • Model column ์ถ”๊ฐ€

์˜ค๋Š˜์˜ ํ”„๋กœ์ ํŠธ์—์„œ ์–ด๋–ค ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๊ณ , ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ–ˆ๋‚˜์š”?

  • ํด๋ผ์ด์–ธํŠธ ๋ฐฐํฌ ํ›„ ๋กœ๊ทธ์ธ ์ดํ›„์˜ ์„ค์ •์ด ๋ฐ˜์˜๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
    ์›์ธ์€ ๋กœ์ปฌ๊ณผ ๋ฐฐํฌ๋ฒ„์ „์˜ ํ™˜๊ฒฝ๋ณ€์ˆ˜๊ฐ€ ๋‹ฌ๋ž๊ธฐ ๋•Œ๋ฌธ์ด์—ˆ์Šต๋‹ˆ๋‹ค.
    ์•ž์œผ๋กœ ๋งค์ผ ์•„์นจ๋งˆ๋‹ค ๋ฐฐํฌ๋ฅผ ์ƒˆ๋กœ ํ•ด์ค˜์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • sequelize ์‚ฌ์šฉ์œผ๋กœ ๊ฒฐ๊ณผ๊ฐ’์ด Promise { }์œผ๋กœ ์ถœ๋ ฅ๋จ (#212 ์ฐธ๊ณ )

์˜ค๋Š˜ ์ƒˆ๋กœ ๋ฐฐ์šด ์ ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

  • prettierrc: json ํ˜•ํƒœ์ž„์—๋„ ์ œ๋Œ€๋กœ ๋ฉ”์„ธ์ง€๊ฐ€ ๋ถˆ๋ ค์ง€์ง€ ์•Š์•„ ์ฒ˜์Œ์— ๋”ฐ์˜ดํ‘œ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ prettierrc ์„ค์ • ๋•Œ๋ฌธ์— ์•„๋ฌด๋ฆฌ ์ €์žฅํ•ด๋„ ์ž๋™์œผ๋กœ ๋”ฐ์˜ดํ‘œ๊ฐ€ ์‚ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค. ๊ทธ ์„ค์ •์„ ํ•ด์ œํ•˜๊ธฐ ์œ„ํ•ด "quoteProps"๋ฅผ preserve๋กœ ๋ฐ”๊ฟ”์ค˜์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋ž˜๋„ message๋Š” ๋ถˆ๋Ÿฌ์™€์ง€์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
    ๋ ˆํผ๋Ÿฐ์Šค: prettierrc ์„ค์ •
  • response ๋ฐ error message๊ฐ€ ์ œ๋Œ€๋กœ ๋ถˆ๋ ค์˜ค๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” JSON.stringify( )๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด์ผ์€ ํ”„๋กœ์ ํŠธ์— ๊ธฐ์—ฌํ•˜๊ธฐ ์œ„ํ•ด ๋ฌด์—‡์„ ํ•ด์•ผ ํ•˜๋‚˜์š”?

  • getAllParties, getFilteredParties, updateProfileImage
    • ๊ฐ controller ์ฝ”๋“œ ๋ณ€๊ฒฝ
    • ์ตœ์ข…๊ฒฐ๊ณผ ๋ฐ˜์˜ํ•ด์„œ API docs ์ˆ˜์ •

 

 

 

 

12์›” 11์ผ (ํ† )

์˜ค๋Š˜์€ ์–ด๋–ป๊ฒŒ ํ”„๋กœ์ ํŠธ์— ๊ธฐ์—ฌํ–ˆ๋‚˜์š”?

  • getAllParties, getFilteredParties ์ˆ˜์ •
  • ํด๋ผ์ด์–ธํŠธ ์žฌ๋ฐฐํฌ

 

์˜ค๋Š˜์˜ ํ”„๋กœ์ ํŠธ์—์„œ ์–ด๋–ค ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๊ณ , ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ–ˆ๋‚˜์š”?

  • sequelize์˜ Op๋ฅผ ์ด์šฉํ•ด์„œ ์ฟผ๋ฆฌ๋ฌธ์„ ์“ฐ๋ ค๊ณ  ํ–ˆ์ง€๋งŒ ํ•ด๋‹น ์ฟผ๋ฆฌ๊ฐ€ ์ž˜ ์ƒ์„ฑ๋˜์ง€ ์•Š๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์•Œ๊ณ ๋ณด๋‹ˆ ์ผ๋ฐ˜ sequelize์™€ ๋‹ฌ๋ฆฌ Op์™€ ๊ฐ™์€ ์˜ต์…˜์„ ์ถ”๊ฐ€์ ์œผ๋กœ ์“ฐ๊ธฐ ์œ„ํ•ด์„œ๋Š” const { Op } = require("sequelize");์„ ์ƒ๋‹จ์— ๋„ฃ์–ด์ค˜์•ผํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๋‹น์ผ ๋‚ ์งœ๋ฅผ ์ž๋™์œผ๋กœ ๊ฐ€์ ธ์™€์•ผ ํ•˜๋Š”๋ฐ Javascript ์ƒ์— ๊ธฐ๋ณธ ์ƒ์„ฑ์ž Date()์—๋Š” ๋‹น์ผ ๋‚ ์งœ๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ๊ธ€๋ง์„ ํ†ตํ•ด moment๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์•Œ๊ฒŒ๋˜์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.
const date = moment().format("YYYY-MM-DD");

let allPartiesInfo = await Party.findAll({
  where: { start_date: { [Op.gt]: date }, ott_id },
  raw: true,
});

 

๋‚ด์ผ์€ ํ”„๋กœ์ ํŠธ์— ๊ธฐ์—ฌํ•˜๊ธฐ ์œ„ํ•ด ๋ฌด์—‡์„ ํ•ด์•ผ ํ•˜๋‚˜์š”?

  • updateProfileImage controller ๊ตฌํ˜„
  • ์ฃผ์„ ์ถ”๊ฐ€
  • ํด๋ผ์ด์–ธํŠธ ์žฌ๋ฐฐํฌ

 

 

 

 

12์›” 12์ผ (์ผ)

์˜ค๋Š˜์€ ์–ด๋–ป๊ฒŒ ํ”„๋กœ์ ํŠธ์— ๊ธฐ์—ฌํ–ˆ๋‚˜์š”?

  • updateProfileImage ๊ตฌํ˜„
  • ํด๋ผ์ด์–ธํŠธ API ํ…Œ์ŠคํŠธ
  • ํด๋ผ์ด์–ธํŠธ ์žฌ๋ฐฐํฌ

 

์˜ค๋Š˜์˜ ํ”„๋กœ์ ํŠธ์—์„œ ์–ด๋–ค ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๊ณ , ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ–ˆ๋‚˜์š”?

  • ํด๋ผ์ด์–ธํŠธ ํ…Œ์ŠคํŠธ params ์‚ฌ์šฉ์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์˜ต์…˜์ด ์ •ํ•ด์ ธ์žˆ๋Š” ๊ฒฝ์šฐ query๋ณด๋‹ค๋Š” params๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ๋ฐ˜์˜ํ•˜๊ธฐ ์œ„ํ•ด ๋‚˜๋ˆ„์–ด์„œ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ ๋ฐ”๋กœ ์ž˜ ์ ์šฉ์ด ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.. ์ด์™€ ๋น„์Šทํ•œ ์—๋Ÿฌ๊ฐ€ ์–ด์ œ๋ถ€ํ„ฐ getAllParties๋‚˜ getFilteredParties์—์„œ๋„ ๋‚˜์„œ ๊ณตํ†ต์ ๊ณผ ์ฐจ์ด์ ์„ ํŒŒ์•…ํ•ด๊ฐ€๋ฉฐ ์—๋Ÿฌ ์›์ธ์„ ๋ถ„์„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์›์ธ์€ ์„œ๋ฒ„์—์„œ req.params.id๋กœ ํ•ด์•ผํ•˜๋Š”๋ฐ req.params.ott_id๋กœ ํ•ด๋†“์•˜๊ธฐ ๋•Œ๋ฌธ์— ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ œ๋Œ€๋กœ ๋ฐ›์•„๋“ค์ด์ง€ ๋ชปํ–ˆ๊ธฐ ๋–„๋ฌธ์ด์—ˆ์Šต๋‹ˆ๋‹ค. params ์ด๋ฆ„์„ ์ œ๋Œ€๋กœ ๋ฐ”๊พธ๋‹ˆ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

๋‚ด์ผ์€ ํ”„๋กœ์ ํŠธ์— ๊ธฐ์—ฌํ•˜๊ธฐ ์œ„ํ•ด ๋ฌด์—‡์„ ํ•ด์•ผ ํ•˜๋‚˜์š”?

  • ์ •์‚ฐ์‹œ์Šคํ…œ ๊ตฌํ˜„
  • ํด๋ผ์ด์–ธํŠธ ์žฌ๋ฐฐํฌ