๐Ÿคธโ€โ™€๏ธ[SOPT 27th] ์†์ปคํ†ค ํ›„๊ธฐ

๊ฐ€์˜ยท2020๋…„ 11์›” 24์ผ
4
post-thumbnail

์ด ๊ธ€์€ ์ด ์ˆœ์„œ๋กœ ์ผ์–ด์š”.

  1. ์†์ปคํ†ค ์†Œ๊ฐœ
  2. FISHING ์†Œ๊ฐœ
  3. ์„œ๋ฒ„ ์„ค๊ณ„
  4. ๊ฐœ๋ฐœ ๊ณผ์ •๊ณผ ๊ฒฐ๊ณผ๋ฌผ
  5. ๋Š๋‚€ ์ ๐Ÿฅฐ

2020.11.21 (ํ† ) ~ 2020.11.22 (์ผ)

์ €๋ฒˆ ์ฃผ๋ง 27๊ธฐ ์†์ปคํ†ค์ด ์žˆ์—ˆ๋‹ค! ์„œ๋ฒ„ YB์ธ ๋‚˜๋Š” ์‹œ์ž‘ํ•˜๊ธฐ ์ „๋ถ€ํ„ฐ ๋‹ค๋ฅธ ํŒŒํŠธ์›๋“ค๊ณผ์˜ ํ˜‘์—…์„ ํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ธฐ๋Œ€๊ฐ์ด ์ปธ์—ˆ๋‹ค!


โšก Theme & Ideation

์ด๋ฒˆ ์†์ปคํ†ค์˜ ์ฃผ์ œ๋Š” ๋ฐ”๋กœ '์ค‘๋…'์ด์—ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ฃผ์ œ๋ฅผ ๋ณด๊ณ  ๋– ์˜ค๋ฅด๋Š” ์•„์ด๋””์–ด๋“ค์„ Notion์— ๋‹ค๊ฐ™์ด ์ ์œผ๋ฉด์„œ ์•„์ด๋””์–ด ํšŒ์˜๋ฅผ ์ง„ํ–‰ํ–ˆ๋‹ค.

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

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ์ค‘๋…์ด ๋˜๊ณ  ์‹ถ์€ ๊ฒƒ์— ๋Œ€ํ•ด์„œ๋„ ํ•œ ๋ฒˆ ์ƒ๊ฐํ•ด๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.

  • ๊ณต๋ถ€ ์ค‘๋…
  • ์šด๋™ ์ค‘๋…
  • ์ผ ์ค‘๋… (์›Œ์ปคํ™€๋ฆญ)

๋“ฑ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์šฐ๋ฆฌ๋Š” ์ด ์ค‘์—์„œ๋„ ์ผ ์ค‘๋…์— ๋Œ€ํ•ด ์ข€ ๋” ๊นŠ์€ ์ด์•ผ๊ธฐ๋ฅผ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

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


๐ŸŸ FISHING

ํŒ€์›๋“ค์ด ์žฅ๋‚œ์Šค๋ ˆ ์ œ์•ˆํ•œ ์ด ๋‚š์‹œ์งˆ์€ ์ƒ๊ฐ๋ณด๋‹ค ๊ดœ์ฐฎ์•˜๋‹ค.

For Ideal Sopt Hitchhiking - FISHING

  • ์ผ ์ค‘๋… SOPT์ธ๋“ค์„ ์œ„ํ•œ reference/article ์ €์žฅ์†Œ

๋กœ ์‚ฌ๋žŒ๋“ค์„ ์†์ด๊ณ , ๊ทธ ๋’ค์— ์‚ฌ๋žŒ๋“ค์„ ๋‚š๊ณ  ํž๋งํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•ด๋ดค๋‹ค. ๊ณ„์†ํ•ด์„œ ์‚ฌ์šฉํ•  ์„œ๋น„์Šค๋ผ๊ธฐ๋ณด๋‹ค๋Š” ์ผํšŒ์„ฑ์˜ ์ด๋ฒคํŠธ ํ˜•์‹์ด๊ธด ํ–ˆ์ง€๋งŒ ์†์ปคํ†ค์šฉ์œผ๋กœ๋Š” ๊ดœ์ฐฎ์€ ๊ท€์—ฌ์šด ์•„์ด๋””์–ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค!

์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค ์ดˆ์•ˆ์€ ์ด๋žฌ์—ˆ๋‹ค.


  1. ์ด๋ฆ„๊ณผ ํŒŒํŠธ๋ฅผ ์ž…๋ ฅํ•œ๋‹ค.
  2. ํŒŒํŠธ๋ณ„๋กœ ๋‚˜๋‰˜์–ด์žˆ๋Š” ์•„ํ‹ฐํด ํŽ˜์ด์ง€์— ์ ‘์†ํ•œ๋‹ค. (๊ฐ€์งœ)
  3. ์‹œ๊ฐ„์ด ํ๋ฅด๋‹ค๊ฐ€ ์‹œ๊ฐ„ ๋ฉˆ์ถค์ด๋ผ๋Š” ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์‹œ๊ฐ„์ด ๋ฉˆ์ถ”๊ณ  ๋žœ๋ค ํž๋ง ์‚ฌ์ง„์ด ๋‚˜์˜จ๋‹ค.
  4. ์›ํ•˜๋Š” ๊ฒฝ์šฐ ์ž์‹ ์˜ ํœด์‹ ๋ฐฉ๋ฒ•์„ ์‚ฌ์ง„๊ณผ ํ•จ๊ป˜ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  5. ์ด ์ „์˜ ์‚ฌ์šฉ์ž๋“ค์ด ๋‚จ๊ฒจ๋‘” ํœด์‹๋ฐฉ๋ฒ•/ํœด์‹๋ชจ์Šต์„์ฐ์€์‚ฌ์ง„์„ ๋ณด๊ณ  ๊ณต๊ฐ์„ ๋ˆ„๋ฅผ ์ˆ˜ ์žˆ๋‹ค.

์ฃผ์ œ ์„ ์ • ํ›„ ๊ธฐํš ํ”ผ๋“œ๋ฐฑ์—์„œ ์šด์˜์ง„๋ถ„๋“ค๊ป˜์„œ ์•„์ด๋””์–ด๊ฐ€ ์ข‹๊ณ , ์ž˜ ์‚ด๋ฆฌ๋ฉด ๋Œ€๋ฐ•์ด ๋‚  ๊ฒƒ๊ฐ™๋‹ค๋Š” ๋ง์”€์„ ํ•ด์ฃผ์…”์„œ ์šฐ๋ฆฌ ํŒ€์€ ์ข‹์€ ๊ธฐ์šด์„ ๊ฐ€์ง€๊ณ  ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค!


๐Ÿงพ Design

์šฐ์„  Fishing์„ ์„ค๊ณ„ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ง€๋‚œ ๋ช‡ ์ฃผ๋™์•ˆ ๋ฐฐ์› ๋˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค๊ณ„๋ฅผ ์จ๋จน์–ด ๋ณผ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ผ๋‹จ ์šฐ๋ฆฌ๋Š” ์„ธ๋ฏธ๋‚˜๋งŒ ๋”ฐ๋ผํ•˜๊ธฐ ๊ธ‰๊ธ‰ํ•œ ์™•์ดˆ๋ณด ์„ญ๋ฆฐ์ด์˜€๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ RDS๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด์•ผํ•˜๋‚˜, ์•„๋‹ˆ๋ฉด ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ƒ์„ฑํ•ด์•ผํ•˜๋‚˜ ๊ณ ๋ฏผํ–ˆ๋‹ค. ์•ˆ ๊ทธ๋ž˜๋„ ๋ฐ”์œ ํŒŒํŠธ์žฅ๋‹˜ํ•œํ…Œ ์นดํ†ก์œผ๋กœ ์—„์ฒญ ์งˆ๋ฌธํ•ด์„œ ๊ดด๋กญํžˆ๊ธฐ๋„ ํ–ˆ๋‹ค. ๊ทผ๋ฐ ๊ฒฐ๋ก ์€, ๊ฑ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ƒˆ๋กœ์šด ์Šคํ‚ค๋งˆ๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๋˜๋Š” ๊ฑฐ์˜€๋‹ค ใ…‹ใ…‹

์šฐ์„  ์šฐ๋ฆฌ๋Š” ์ฒ˜์Œ์— User์™€ Post ํ…Œ์ด๋ธ”๋งŒ ์ƒ๊ฐ์„ ํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ ๊ธฐ๋”” ๋ถ„๋“ค์ด ๋กœ๊ทธ์ธ๊ธฐ๋Šฅ์„ ๋งŒ๋“œ๋Š”๊ฒŒ ๋ณ„๋กœ๋ผ๊ณ  ํ•ด์„œ ์œ ์ € ์ผํšŒ์šฉ์œผ๋กœ ์ƒ๊ฐํ•˜๊ณ  Post ์ •๋ณด์— ํ•„์š”ํ•œ ๋žœ๋ค ๋‹‰๋„ค์ž„๊ณผ ํŒŒํŠธ๋ฅผ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ตณ์ด ์œ ์ € ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค์—ˆ๋‹ค. ์ข‹์•„์š”(๊ณต๊ฐ) ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ๋กœ ํ•ด์„œ Like ํ…Œ์ด๋ธ”๋„ ์ƒ๊ธฐ๊ฒŒ ๋˜์—ˆ๋‹ค.

์ดˆ๋ฐ˜์— ์œ ์ €์˜ ์„ธ์…˜์„ ์œ ์ง€ํ• ๊นŒ ๋ง๊นŒ ๊ณ ๋ฏผํ–ˆ์—ˆ๋Š”๋ฐ ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ๋„ ์—†๋Š”๋ฐ ๋”ฑํžˆ ํ•„์š”๊ฐ€ ์žˆ์„๊นŒ๋ผ๋Š” ์ƒ๊ฐ์— ํ† ํฐ์„ ๋ฐœ๊ธ‰ํ•˜์ง€ ์•Š์•˜๋‹ค. ์ด๊ฑด ์ข€ ์‹ค์ˆ˜์˜€๋˜๊ฒŒ, like๋„ ๋ˆ„๋ฅธ ์งํ›„์—๋งŒ ์ทจ์†Œํ•  ์ˆ˜ ์žˆ๋Š” ์ด์ƒํ•œ ๋ฐฉ์‹์ด ๋ผ๋ฒ„๋ฆฌ๊ณ  ๋ง์•˜๋‹ค.

์šฐ๋ฆฌ ์„œ๋ฒ„ํŒŒํŠธ๋“ค์€ ๋‘˜ ๋‹ค YB์—ฌ์„œ ์•„์˜ˆ ๋„์šฐ์ง€๋„ ๋ชปํ• ๊นŒ๋ด ๋ถ€๋‹ด์ด ์ปค์„œ ์–ด๋–ป๊ฒŒ๋Š” ์„ค๊ณ„๋ถ€ํ„ฐ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ฐ€๋ ค๊ณ  ํ–ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค. ์‹œ๊ฐ„์ด ์ ˆ๋Œ€ ์ ์€ ๊ฒŒ ์•„๋‹ˆ๋ผ๋Š” ๊ฑธ ์•Œ์•˜๋”๋ผ๋ฉด ์œ ์ €๋ชจ๋ธ๋„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์—ˆ์„ ๊ฒƒ ๊ฐ™๊ธฐ๋„ ํ•˜๋‹ค.

1์ฐจ ์ œ์ถœ๋ฌผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•˜๋‹ค.

  • ERD
  • API ๋ช…์„ธ์„œ

์ด ๋‘ ๊ฐ€์ง€๋งŒ ์ œ์ถœํ•˜๋ฉด ๋์—ˆ๋Š”๋ฐ, ERD๋Š” mySQL ์›Œํฌ๋ฒค์น˜์—์„œ ๋งŒ๋“ค์–ด ์ฃผ๋Š” ๊ฑฐ๋ผ ํ…Œ์ด๋ธ”๊ณผ ๊ด€๊ณ„๋งŒ ์„ค์ •ํ•ด์ฃผ๋ฉด ๋˜๊ณ , API๋„ ์šฐ๋ฆฌ๊ฐ€ ์„ธ๋ฏธ๋‚˜ ๋•Œ ๋ฐฐ์› ๋˜ ๊ฒƒ๋“ค์„ ํ™œ์šฉํ•˜๋ฉด ๊ธˆ๋ฐฉ์ด์–ด์„œ ๋ถ€๋‹ด์ด ์ ์—ˆ๋‹ค. ์ด ๋•Œ๊ฐ€ ์˜คํ›„ 11์‹œ 12์‹œ? ์˜€๋˜ ๊ฒƒ ๊ฐ™์€๋ฐ 1์ฐจ ์ œ์ถœ์ด 5์‹œ๋ผ๊ณ  ์•Œ๊ณ ์žˆ์—ˆ์–ด์„œ, ์—ฌ์œ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.


๐Ÿ’ป Development

์„œ๋ฒ„๋ฅผ ๊ฐ™์ด ํ•˜๋Š” ์šฐ์˜ ์˜ค๋น ๊ฐ€ ๊ธฐ์กด์— ์‚ฌ์šฉํ•˜๋˜ RDS ์ธ์Šคํ„ด์Šค์— ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ DB๋ฅผ ์—ฐ๊ฒฐํ•˜๊ณ  ๋ผ์šฐํŒ…, Models, Sequelize ์„ค์ •์„ ์™„๋ฃŒํ–ˆ๋‹ค. ๊ธฐ์กด์— ์„ธ๋ฏธ๋‚˜์—์„œ ์ž‘์„ฑํ–ˆ๋˜ ๊ฒƒ๋“ค์„ ๊ฑฐ์˜ ๋น„์Šทํ•˜๊ฒŒ ๊ฐ€์ ธ์™€์„œ ์ •๋ง ์‹œ๊ฐ„์ด ์–ผ๋งˆ ์•ˆ ๊ฑธ๋ ธ๋‹ค. ๊ทธ๋ฆฌ๊ณ  api๋„ ๊ธˆ๋ฐฉ๊ธˆ๋ฐฉ ๋งŒ๋“ค๊ณ  ๊ฑฑ์ •์ด ํ•˜๋‚˜๋„ ์—†์—ˆ๋‹ค. postman์œผ๋กœ ์š”์ฒญ์„ ๋ณด๋ƒˆ์„ ๋•Œ ์‘๋‹ต๋„ ์ œ๋Œ€๋กœ ์™”๋‹ค.

๋‚ด๊ฐ€ ๋งŒ๋“  api๋Š” User ์ƒ์„ฑ, ์ด๋ฏธ์ง€ ๋žœ๋ค ์„ ํƒ ์š”๊ฑฐ ๋‘ ๊ฐœ์ด๋‹ค.

๊ท€์—ฝ์ฃ 

์—ฌ์œ ๋กญ๊ฒŒ ๋†€๋˜ ์™€์ค‘์— (์ƒˆ๋ฒฝ 2์‹œ 40๋ถ„์ด์—ˆ๋‹ค.) ๊ฐ‘์ž๊ธฐ ์˜ค๋น ๊ฐ€ 3์‹œ๊นŒ์ง€ 1์ฐจ ์ œ์ถœ์„ ํ•ด์•ผํ•œ๋‹ค๋ฉด์„œ ๋‹ค๊ธ‰ํ•ดํ•˜๋Š” ๊ฑฐ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜๋„ ๋ฉ๋‹ฌ์•„ ๋†€๋ผ์„œ ๋ถ€๋žด๋ถ€๋žด ํŒŒํŠธ์žฅ๋‹˜์ด ์˜ฌ๋ ค์ค€ ํฌ๋งท์— ๋งž์ถฐ ๋งˆํฌ๋‹ค์šด์„ ์ผ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋”ฑ 3์‹œ์— ์ œ์ถœ์„ ํ–ˆ๋Š”๋ฐ ๋‹คํ–‰ํžˆ๋„ ์ œ์ถœ๋œ ํŒ€์— ์†ํ•ด์žˆ์—ˆ๋‹ค๐Ÿ˜‚ ์ด๊ฑด ๋‚˜์ค‘์— ์•ˆ ๊ฑด๋ฐ ์ด ๋•Œ ์šฐ๋ฆฌ๊ฐ€ ํŒŒํŠธ์žฅ๋‹˜์ด ์จ๋†“์€ ๋ฆฌ๋“œ๋ฏธ๋ฅผ ๋”ฐ๋ผ ์จ์„œ ์ œ์ถœํ•œ ๊ฒŒ 1์ฐจ ์ œ์ถœ๋ฌผ์ด ์•„๋‹ˆ๋ผ ์ตœ์ข… ์ œ์ถœ๋ฌผ์ด์—ˆ๋˜ ๊ฒƒ์ด๋‹ค. ๊ฒฐ๋ก ์ ์œผ๋กœ ์šฐ๋ฆฌ๋Š” 8์‹œ์— ์ œ์ถœํ•˜๋ฉด ๋˜๋Š” ์ตœ์ข… ์ œ์ถœ๋ฌผ์„ 3์‹œ์— ์ œ์ถœํ•œ๊ฑฐ๋‹ค. ์ด ๋•Œ๋ถ€ํ„ฐ ํ•  ์ผ์ด ์—†์–ด์กŒ๋‹ค๊ณ  ์ƒ๊ฐํ•ด์„œ ์ง„์งœ ์‹ฌ์‹ฌํ–ˆ๋‹ค.

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

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


์‹ค์ˆ˜

์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋‚ฌ๋˜ ์˜ค๋ฅ˜ ์ค‘ ๊ธฐ์–ต์— ๋‚จ๋Š” ๊ฒƒ๋“ค์ด ์žˆ๋‹ค. ํ•˜๋‚˜๋Š” ๋˜๊ฒŒ ๊ฐ„๋‹จํ•˜๊ณ  ์–ด์ด ์—†๋Š” ๊ฑด๋ฐ ์‚ฌ๋žŒ๋“ค์ด ๋งŽ์ด ํ•˜๋Š” ์‹ค์ˆ˜์ธ ๊ฒƒ ๊ฐ™์€ sequelize synchronization ์˜ต์…˜์ด๋‹ค. ์ด ์˜ต์…˜์„ false๋กœ ๋‘๊ณ  ๋ชจ๋ธ ๊ตฌ์กฐ๋ฅผ ๋ฐ”๊พธ๋ฉด ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋ธ์— ๋Œ€ํ•œ ๊ฒƒ์„ ๋ฐ”๊พธ๊ณ ๋‚˜์„œ๋Š” true๋กœ ๊ผญ ๋ฐ”๊ฟ”์ค˜์•ผ ํ•œ๋‹ค.

// app.js
const { sequelize } = require("./models");

sequelize
  .sync({ force: false })
  .then(() => {
    console.log("๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์„ฑ๊ณต!");
  })
  .catch((error) => {
    console.error(error);
  });

์šฐ๋ฆฌ๊ฐ€ ์ด๋ฏธ์ง€ url์„ ์ €์žฅํ•˜๋Š” ์ปฌ๋Ÿผ์˜ ์ž๋ฃŒํ˜•์„ STRING(100)์œผ๋กœ ์„ค์ •ํ•ด๋†”์„œ url์ด ์ž˜๋ ค์„œ ์ €์žฅ๋˜๋Š” ๋ถˆ์ƒ์‚ฌ๊ฐ€ ์ผ์–ด๋‚ฌ์—ˆ๋Š”๋ฐ, ์šฐ๋ฆฌ๊ฐ€ ์•„๋ฌด๋ฆฌ ๊ธ€์ž์ˆ˜๋ฅผ ๋Š˜๋ ค๋„ ๋™๊ธฐํ™” ์˜ต์…˜์„ false๋กœ ํ•ด๋†“์•„์„œ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—๋Š” url์˜ ๊ธธ์ด๊ฐ€ 100์ธ ๊ฒƒ์ด์—ˆ๋‹ค. ์‚ฌ์†Œํ•œ ์‹ค์ˆ˜์˜€๋Š”๋ฐ ๋‹ค๊ธ‰ํ•ด์„œ ์—„์ฒญ ๋‹นํ™ฉํ–ˆ๋˜ ๊ธฐ์–ต์ด ๋‚œ๋‹ค.


์šฐ๋ฆฌ์˜ ์ตœ์ข…์ œ์ถœ๋ฌผ์€ ๋ฐœํ‘œ์ž๋ฃŒ์™€ ์‹œ์—ฐ๋™์˜์ƒ์ด์—ˆ๋Š”๋ฐ, ๋งˆ์ง€๋ง‰์— ๊ฐ‘์ž๊ธฐ ์„œ๋ฒ„์—์„œ ํฌ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์š”์ฒญ์„ ์ œ๋Œ€๋กœ ๋ฐ›์ง€ ๋ชปํ•ด 500 ์—๋Ÿฌ๊ฐ€ ๊ณ„์†๋‚ฌ๋‹ค. ์—๋Ÿฌ์•ผ, ์ œ๋Œ€๋กœ ์•„๋Š” ๊ฑฐ ํ•˜๋‚˜ ์—†๋Š” ๋‚˜์—๊ฒŒ๋Š” ์ต์ˆ™ํ•˜๊ณ  ๋ณ„๋กœ ๋Œ€์ˆ˜๋กญ์ง€ ์•Š์€๋ฐ๋„ ์ด ๋•Œ ๋„ˆ๋ฌด ๋‹นํ™ฉํ–ˆ๋˜ ์ด์œ ๋Š” postman์—์„œ๋Š” ์—๋Ÿฌ๊ฐ€ ์ „ํ˜€ ๋‚˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ด์—ˆ๋‹ค. ํ”„๋ก ํŠธ์˜ postSharePage์—์„œ multipart/form data ์˜ค๋ฅ˜๊ฐ€ ๋‚ฌ๋‹ค.

์–ด๋–ค ์—๋Ÿฌ์ธ์ง€ ์ •ํ™•ํžˆ ๋ณด๋ ค๊ณ  ๋กœ์ปฌ์—์„œ ์„œ๋ฒ„๋ฅผ ๋Œ๋ ธ๋Š”๋ฐ ์š”์ฒญ์€ ์ž˜ ๋„์ฐฉํ•˜๋Š”๋ฐ 500์—๋Ÿฌ๊ฐ€ ๋‚˜์„œ ๋ญ”๊ฐ€ ์‹ถ์—ˆ๋‹ค. ๋‚˜์ค‘์— ์˜ค๋น ๊ฐ€ ์ด๋งˆ ํƒ ์น˜๋ฉด์„œ ์„ค๋งˆํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ–ˆ๋Š”๋ฐ ๋ฐ”๋กœ ์ž˜ ๋Œ์•„๊ฐ”๋‹ค. ์‚ฌ์‹ค ์ฒ˜์Œ์— ์šฐ๋ฆฌ๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ๊ณ ์น˜๊ธฐ ๊ท€์ฐฎ๋‹ค๊ณ  ๋„˜์–ด๊ฐ„ ๋ถ€๋ถ„์ด ์žˆ์—ˆ๋Š”๋ฐ

// server: postRouter.js
const postsRouter = express.Router();
postsRouter.post("/", upload.single("postImageUrl"), postController.createPost); //!

์šฐ๋ฆฌ๋Š” multer๋กœ ๋‹จ์ผ ์ด๋ฏธ์ง€๋ฅผ s3์— ์—…๋กœ๋“œํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ upload๋กœ ์ •์˜ ํ–ˆ๋Š”๋ฐ, ์ด๋ฏธ์ง€ ์ž์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํ‚ค์˜ ์ด๋ฆ„์„postImageUrl๋กœ ์„ค์ •ํ•ด๋ฒ„๋ ธ๋˜ ๊ฒƒ์ด๋‹ค. ์ดˆ๋ฐ˜์— postRoute ์ฝ”๋“œ ์ฝ๊ณ  ์ด ๋ถ€๋ถ„์„ ๋ฐœ๊ฒฌํ–ˆ์„ ๋•Œ ๊ท€์ฐฎ์œผ๋‹ˆ๊นŒ ๊ทธ๋ƒฅ ๋‘์ง€ ๋ญ ํ•˜๋ฉด์„œ ๋Œ€์ˆ˜๋กญ์ง€ ์•Š๊ฒŒ ๋„˜์–ด๊ฐ”์—ˆ๋Š”๋ฐ

// front: PostSharePage.js
const handleSubmitButton = async () => {
   let fileData = new FormData();
   try {
     console.log(contentsInput.value);
     fileData.append("image", image); //!
     fileData.append("contents", contentsInput.value);
     fileData.append("nickname", "first");
     ...
   }
   ...
}

์œ„์™€ ๊ฐ™์ด ํ”„๋ก ํŠธ์—์„œ image๋ผ๋Š” ํ‚ค๋กœ ํผ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„์—์„œ ์ธ์‹ํ•˜์ง€ ๋ชปํ–ˆ๋˜ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ž˜์„œ ์ € ๋ถ€๋ถ„์„ image -> postImageUrl๋กœ ๋ฐ”๊ฟ”์ฃผ๋‹ˆ๊นŒ ๋ฐ”๋กœ ๋Œ์•„๊ฐ”๋‹ค. ์ฒ˜์Œ์— ์ €๊ฑฐ ํ•˜๋‚˜ ๊ณ ์ณค์œผ๋ฉด ์—๋Ÿฌ ์žก์„ ์‹œ๊ฐ„์— ๋” ๋งŽ์€ ๊ฑธ ํ•  ์ˆ˜ ์žˆ์—ˆ์„๊ฑฐ๋ž€ ์ƒ๊ฐ์— ์•„์‰ฌ์›€์ด ๋‚จ์•˜๋‹ค.

์•„๋ฌดํŠผ ์ด ํ›„์—๋Š” ๊ฑฐ์˜ ๋งˆ๋ฌด๋ฆฌ๊ฐ€ ๋˜์–ด์„œ ์›นํŒŒํŠธ ๋ถ„๋“ค์ด ์—ด์ผํ•ด์„œ ํ€„๋ฆฌํ‹ฐ ๋†’์ด๋‹ค๊ฐ€ ๋ฐœํ‘œ์‹œ๊ฐ„์ด ์™”์—ˆ๋˜ ๊ฒƒ๊ฐ™๋‹ค.


โœจ FISHING - Demo

์ฒ˜์Œ์—๋Š” ์•„ํ‹ฐํด/๋ ˆํผ๋Ÿฐ์Šค ๋ชจ์Œ์ง‘๊ฐ™์€ ๋Š๋‚Œ! ๋‹‰๋„ค์ž„๊ณผ ํŒŒํŠธ๋ฅผ ์„ค์ •ํ•˜๊ณ  ๋“ค์–ด๊ฐ„๋‹ค.

์œ„์˜ ํŒŒํŠธ ๋ณ„ ์„น์…˜์„ ํด๋ฆญํ•˜๋ฉด ํ˜„์žฌ ์‹œ๊ฐ„์„ ๋ณด์—ฌ์ฃผ๊ณ  ๋ฉˆ์ถ”๋ฉด ๋น„๋กœ์†Œ ๋ณด์ด๋Š” ๊ฒƒ๋“ค์„ ํด๋ฆญํ•˜๋ฉด ์‰ฌ๋ผ๋Š” ๋ฌธ๊ตฌ๊ฐ€ ๋‚˜์˜จ๋‹ค (ใ…‹ใ…‹ใ…‹)

๊ทธ๋ฆฌ๊ณ  ์ž์‹ ์˜ ํœด์‹ ๋ฐฉ๋ฒ•์„ ์—…๋กœ๋“œํ•˜๊ณ , ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์—…๋กœ๋“œํ•œ ํฌ์ŠคํŠธ๋“ค์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค!


๋Š๋‚€ ์ 

  1. ๋ณต์Šต ๋” ๋ฏธ๋ฃจ๋ฉด ํฐ์ผ๋‚˜๊ฒ ๋‹ค - ์„ธ๋ฏธ๋‚˜๋Š” ๋‚˜์—๊ฒŒ ์•„๋ฌด๊ฒƒ๋„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค. ๊ฐ€๋งŒํžˆ ๋“ฃ๊ณ  ๋”ฐ๋ผ๋งŒ ํ•˜๋Š” ์‚ฌ๋žŒ์€ ๋ฐœ์ „์ด ์—†๋‹ค. ๊ธฐ๋ณธ์ ์ธ ์ฝ”๋“œ๋„ ์†์— ์ต์ง€ ์•Š์•˜๋‹ค๋‹ˆ. ์†์ปคํ†ค ๋‚ด๋‚ด ๋ฐ˜์„ฑํ–ˆ๋‹ค. ์†์ปคํ†ค์—์„œ๋Š” ๊ทธ๋‚˜๋งˆ ๊ตฌํ˜„ํ•˜๊ธฐ ์‰ฌ์šด api๋ฅผ ์ผ์œผ๋‹ˆ ๋‹คํ–‰์ด์—ˆ์ง€ ๋‚˜์ค‘๊ฐ€์„œ ์–ด๋ ค์›€์„ ๊ฒช์„ ๊ฒƒ ๊ฐ™์•˜๋‹ค. ์„ธ๋ฏธ๋‚˜ ๋ณต์Šตํ•ด์•ผ์ง€! ๐Ÿ˜

  2. ์กฐ๊ธ‰ํ•ดํ•˜์ง€ ๋ง์•„์•ผ์ง€ - ๋ชปํ•˜๋ฉด ๊ฐ€๋งŒํžˆ๋ผ๋„ ์žˆ์—ˆ์–ด์•ผ ํ–ˆ๋Š”๋ฐ, ํ˜ผ์ž ํฅ๋ถ„ํ•ด์„œ ๋ชจ๋‹ˆํ„ฐ ๋•Œ๋ฆฌ๊ณ  ์Œ๋ฃŒ์ˆ˜ ์Ÿ๊ณ . ์ฐฝํ”ผํ–ˆ๋‹ค. ์•„๋‹ˆ ์‚ฌ์‹ค ๊ฐ€๋งŒํžˆ ์žˆ๊ธฐ๋ณด๋‹จ ์ž˜ํ•˜๋ ค๊ณ  ๋” ๋ชฐ์ž…ํ•˜๊ณ  ์ ๊ทน์ ์œผ๋กœ ์ฐธ์—ฌํ•ด์•ผํ•˜๋Š” ๊ฒŒ ๋งž๊ธด ํ•œ๋ฐ ์ด๋ฒˆ์—” ์˜์š•๋งŒ ๋„ˆ๋ฌด ์•ž์„œ์„œ ํฅ๋ถ„ํ•œ ๊ฒŒ ํ›„ํšŒ๋œ๋‹ค. ๊ณต๋ถ€ํ•ด์„œ ์—ฌ์œ ๋กญ๊ณ  ์ฐจ๋ถ„ํ•œ ์‚ฌ๋žŒ์ด ๋˜์ž

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

  4. ์–ผ๋ฅธ ์•ฑ์žผ ํ•˜๊ณ ์‹ถ๋‹ค! - ์ด๋ฒˆ์— ๋ฐ˜์„ฑ ์ข€ ํ–ˆ์œผ๋‹ˆ ๋งŒํšŒํ•  ๊ธฐํšŒ๊ฐ€ ์•ฑ์žผ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค. 1๋ฐ•2์ผ ํ•ด์ปคํ†ค์—์„œ๋„ ์ด๋ ‡๊ฒŒ ๋งŽ์€ ๊ฒƒ๋“ค์„ ๋Œ์•„๋ณด๊ณ  ์–ป์€๊ฒŒ ๋งŽ์€๋ฐ ์•ฑ์žผ์€ ๋˜ ์–ผ๋งˆ๋‚˜ ์žฌ๋ฐŒ์„๊นŒ ๊ธฐ๋Œ€๊ฐ€ ๋œ๋‹ค๐Ÿ˜†

1๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2021๋…„ 3์›” 9์ผ

๋„ˆ๋ฌด ๋ฉ‹์žˆ์–ด์š”! ํ•™์ƒ๋“ค๋ผ๋ฆฌ ๋ชจ์—ฌ์„œ ๋งŒ๋“ค์–ด์ง„ ๊ทธ๋ฃน์ธ๊ฐ€์š”?

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ