Skip to content

Blog-Paper-Project/BE

Folders and files

NameName
Last commit message
Last commit date

Latest commit

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

Repository files navigation

ํ™”์ƒ์œผ๋กœ ์†Œํ†ตํ•˜๋Š” ๋ธ”๋กœ๊ทธ ํ”Œ๋žซํผ

์ž์‹ ์˜ ์ƒ๊ฐ์„ ๊ธ€๋กœ ์ ์–ด๋ณด์•„์š”.

๊ณต๊ฐ ๊ฐ€๋Š” ๊ธ€์„ ์ฝ๊ณ  ๋ธ”๋กœ๊ฑฐ ์ฃผ์ธ๊ณผ ์†Œํ†ตํ•˜๊ณ  ์‹ถ๋‚˜์š”?

๋‚˜์˜ ์ƒ๊ฐ์„ ๊ณต์œ ํ•ด ๋‚˜๋ญ‡์žŽ์„ ๋ชจ์œผ๊ณ  ๋Œ“๊ธ€๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ™”์ƒ์ฑ„ํŒ…์œผ๋กœ ์†Œํ†ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž์‹ ๋งŒ์˜ ์ด์•ผ๊ธฐ๋กœ ์†Œํ†ตํ•  ์ˆ˜ ์žˆ๋Š” ๋ธ”๋กœ๊ทธ PAPER


๐Ÿ“† ํ”„๋กœ์ ํŠธ ๊ธฐ๊ฐ„

  • 2022.06.24 - 2022.08.06

๐Ÿงฑ ์•„ํ‚คํƒ์ฒ˜

  • ๋ฐฑ์—”๋“œ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๋Š” Node.js์™€ Express๋กœ ๊ตฌ์ถ•

  • Nginx์— SSL์ธ์ฆ์„ ๋„์ž…ํ•ด WebRTC ์‹ค์‹œ๊ฐ„ ํ™”์ƒ ํ†ตํ™” ๊ตฌํ˜„ ๋ฐ ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ์„ค์ •์„ ํ†ตํ•ด ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์— ์ง์ ‘์ ์ธ ์ ‘๊ทผ์„ ์ฐจ๋‹จํ•˜์—ฌ ๋ณด์•ˆ ๊ฐ•ํ™”

  • ๊นƒํ—ˆ๋ธŒ ์•ก์…˜ CI-CD๋ฅผ ํ†ตํ•ด Docker Image๋ฅผ ๋นŒ๋“œํ•˜์—ฌ ๋™์ผํ•œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์œผ๋กœ ์ž๋™ํ™” ๋ฐฐํฌ

  • ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๋ฐ์ดํ„ฐ์˜ ๋ฌด๊ฒฐ์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด RDS์˜ Mysql์™€ ORM์ธ Sequelize ์‚ฌ์šฉ

  • ์ธ๋ฉ”๋ชจ๋ฆฌ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ์ €์žฅ์†Œ์ธ Redis์—๋Š” I/O์ด ๋นˆ๋ฒˆํ•˜๊ฑฐ๋‚˜ ์ผํšŒ์„ฑ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์†๋„๋ฅผ ํฌ๊ฒŒ ๊ฐœ์„ 

  • ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ๋Š” Multer ๋ฏธ๋“ค์›จ์–ด๋ฅผ ํ†ตํ•ด Multipart/form-data๋กœ ๋ฐ›์•„์˜ค๊ณ  S3 ๋ฒ„ํ‚ท์— ์ €์žฅ, ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„

  • ์‚ฌ์šฉ์ž์˜ ๊ฐ„ํŽธํ•œ ๋กœ๊ทธ์ธ์„ ์œ„ํ•ด passport๋ฅผ ์ด์šฉํ•ด ์นด์นด์˜ค ๋กœ๊ทธ์ธ ๊ตฌํ˜„


๐Ÿœ ERD


๐Ÿ›  ๊ธฐ์ˆ  ์Šคํƒ

JavaScript TypeScript NodeJS Express.js
Jest Eslint Passport WebRTC Socket.io
Mysql Sequelize Redis S3
AWS Docker Nginx


๐Ÿ•น๏ธ ์ฃผ์š” ๊ธฐ๋Šฅ

  1. ๋กœ๊ทธ์ธ/ํšŒ์›๊ฐ€์ž…
  • ์นด์นด์˜ค ์†Œ์…œ ๋กœ๊ทธ์ธ
  • ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ
  1. ๋ธ”๋กœ๊ทธ
  • ๊ฒŒ์‹œ๊ธ€(+์ด๋ฏธ์ง€), ๋Œ“๊ธ€์„ ์กฐํšŒ, ์ž‘์„ฑ, ์ˆ˜์ •, ์‚ญ์ œ
  • 1์ฃผ์ผ๊ฐ„ ์ข‹์•„์š”๋ฅผ ๋งŽ์ด ๋ฐ›์€ ์ธ๊ธฐ ๊ฒŒ์‹œ๊ธ€๊ณผ ์œ ์ € ์ถ”์ฒœ
  • ์ข‹์•„์š”, ๊ตฌ๋…
  • ํ‚ค์›Œ๋“œ๋กœ ๊ฒŒ์‹œ๊ธ€ ๊ฒ€์ƒ‰
  • ์นดํ…Œ๊ณ ๋ฆฌ, ํƒœ๊ทธ๋ณ„๋กœ ๊ฒŒ์‹œ๊ธ€ ์กฐํšŒ
  1. ์˜ˆ์•ฝํ•˜๊ธฐ
  • ์˜ˆ์•ฝ ์‹ ์ฒญ ๋ฐ ์ทจ์†Œ
  1. ํ™”์ƒ ํ†ตํ™” ๋ฐ ์ฑ„ํŒ…
  • ๋ฐฉ ์ž…์žฅ์„ ํ†ตํ•œ ๋ธ”๋กœ๊ฑฐ์™€ 1๋Œ€1 ๋Œ€ํ™”

๐Ÿ“– ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

์ด๋ฆ„ ์„ค๋ช… ๋ฒ„์ „
sequelize ๊ฐ์ฒด์ง€ํ–ฅ์ ์ธ ์ฝ”๋“œ๋กœ ์ธํ•ด ์ง๊ด€์ ์ด๊ณ  ๋กœ์ง์— ๋” ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๊ณ  ํ…Œ์ด๋ธ” ๊ฐ„ ๊ด€๊ณ„์„ค์ •์„ SQL์— ๋น„ํ•ด ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ๋•Œ๋ฌธ์— ๋Œ€ํ‘œ์ ์ธ ORM์ธ Sequelize๋ฅผ ์„ ํƒ 6.21.1
redis ํด๋ผ์ด์–ธํŠธ์—์„œ ๋™์ผํ•œ ์š”์ฒญ์ด ๊ณ„์† ์˜ฌ๋•Œ ์„œ๋ฒ„์—์„œ ์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์œผ๋ฉด ์ƒ๋‹นํžˆ ๋น„ํšจ์œจ์ ์ด๊ณ  ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ์— ๋”ฐ๋ผ ์‘๋‹ต์†๋„๊ฐ€ ๋А๋ ค์ง. ์ด๋•Œ ์š”์ฒญ๊ฒฐ๊ณผ๋ฅผ ๋ฏธ๋ฆฌ ์ €์žฅํ•ด ๋‘์—ˆ๋‹ค๊ฐ€, ๋™์ผํ•œ ๋ฐ์ดํ„ฐ ์š”์ฒญ์ด ์˜ค๋ฉด ๋ฐ”๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋„๋ก redis๋ฅผ ์‚ฌ์šฉ 4.2.0
bcrypt ํ•ด์‹œ ํ•จ์ˆ˜๋“ค์€ ๋ฌด๊ฒฐ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์œ„ํ•ด ๋น ๋ฅธ ์†๋„๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ, ํ•ด์ปค๊ฐ€ DB๋ฅผ ํƒˆ์ทจ ํ–ˆ์„๋•Œ ๋น ๋ฅธ ์†๋„๋กœ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ์Œ. ํŒจ์Šค์›Œ๋“œ ์ €์žฅ์—์„œ์˜ ํ•ด์‹œ ํ•จ์ˆ˜์˜ ๋ฌธ์ œ์ ์„ ๋ณด์™„ํ•ด์„œ ๋‚˜์˜จ๊ฒƒ์ด pbkfd2. 8๊ธ€์ž ๋ถ€ํ„ฐ๋Š” ๋™์ผ ์‹œ์Šคํ…œ์—์„œ bcrypt๊ฐ€ pbkfd2๋ณด๋‹ค 4๋ฐฐ ์ด์ƒ์˜ ์‹œ๊ฐ„์„ ์†Œ๋ชจํ•ด์•ผ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณด์•ˆ์„ฑ์„ ์œ„ํ•ด ์‚ฌ์šฉ 5.0.1
passport-kakao passport๋Š” express ํ”„๋ ˆ์ž„์›Œํฌ ์ƒ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ธ์ฆ ๋ฏธ๋“ค์›จ์–ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ. strategies๋กœ ์•Œ๋ ค์ ธ ์žˆ๋Š” ์ธ์ฆ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊ฐ ๋ชจ๋“ˆ๋กœ ํŒจํ‚ค์ง€ํ™”ํ•ด์„œ ์ œ๊ณต. ์ฆ‰, ์•ฑ์€ passport์—์„œ ์ง€์›ํ•˜๋Š” ์ „๋žต์„ ์„ ํƒํ•ด ์˜์กด์„ฑ ์—†์ด ๋…๋ฆฝ์ ์œผ๋กœ ์ด์šฉ ๊ฐ€๋Šฅํ•จ 1.0.1
nodemailer ์ด๋ฉ”์ผ ์ธ์ฆ์„ ์œ„ํ•ด์„œ ์ด๋ฉ”์ผ ์ „์†ก์— ํ•„์š”ํ•œ ๋„คํŠธ์›Œํฌ ํ”„๋กœํ† ์ฝœ์ธ SMTP(์šฐํŽธ ์ „์†ก ํ”„๋กœํ† ์ฝœ)์„ ์‚ฌ์šฉํ•ด์•ผ ํ•จ. Node.js SMTP๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐœ๋ฐœ๋œ ์ „์šฉ ๋ชจ๋“ˆ์ธ nodemailer๋Š” ์‚ฌ์šฉ๋ฒ•์ด ๋งค์šฐ ๊ฐ„๋‹จํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ฒŒ ๋จ 6.7.5
multer Multipart/form-data๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฏธ๋“ค์›จ์–ด๋กœ ์„œ๋กœ ๋‹ค๋ฅธ Content-type์ธ ์ด๋ฏธ์ง€ ํŒŒ์ผ๊ณผ ํ…์ŠคํŠธ๋ฅผ ๊ฐ™์ด ์ „์†กํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ. aws-sdk, sharp์™€ ๊น‰์ด ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๊ตฌํ˜„๋˜์–ด ์žˆ์Œ 1.4.5-lts.1
dayjs javascript์˜ ๋‚ ์งœ ๊ด€๋ จ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ค‘์—์„œ ๊ฐ€์žฅ ๊ฐ€๋ฒผ์›€. Date ๊ฐ์ฒด๋Š” ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ์ฝ”๋“œ๋„ ๋งŽ๊ณ  ์ถœ๋ ฅ ํฌ๋งท์„ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ์ง์ ‘ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง 1.11.3
joi ๋กœ๊ทธ์ธ, ํšŒ์›๊ฐ€์ž…, ๊ฒŒ์‹œ๊ธ€ ๋“ฑ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์œ„ํ•ด joi๋ฅผ ์‚ฌ์šฉ, ์Šคํ‚ค๋งˆ๋ฅผ ํ™œ์šฉํ•ด ๊ฐ€๋…์„ฑ์ด ์ข‹๊ณ  ๋ชจ๋“ˆ๋กœ์„œ ํ™œ์šฉ๋„ ์ข‹์•„ Joi๋ฅผ ์„ ํƒ 17.6.0
node-cron ํ•ญ์ƒ ์‹คํ–‰๋˜์–ด ์žˆ๋Š” App์—์„œ ์ผ์ • ์‹œ๊ฐ„๋งˆ๋‹ค ํŠน์ • ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด node-cron์„ ํ™œ์šฉ. node-schedule๋ณด๋‹ค ์ ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉ 3.0.1
eslint ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•ด ๋ฌธ๋ฒ•์ ์ธ ์˜ค๋ฅ˜๋ฅผ ์ฐพ์•„์ฃผ๊ฑฐ๋‚˜ ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ ์ผ๊ด€๋œ ์ฝ”๋“œ ์Šคํƒ€์ผ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ. ํ”„๋กœ์ ํŠธ์—๋Š” Airbnb์˜ ์ฝ”๋”ฉ ์ปจ๋ฒค์…˜์„ ์ ์šฉ. 8.19.0
socket.io ๋ธ”๋กœ๊ฑฐ์™€ 1๋Œ€1 ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ… ๋ฐ WebRTC signaling server๋กœ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด Socket.io๋ฅผ ์‚ฌ์šฉ. ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์— ๋งž๊ฒŒ ๊ฐ€์žฅ ์ ํ•ฉํ•œ ํ†ต์‹  ๋ฐฉ์‹์„ ์•Œ์•„์„œ ์„ ํƒํ•˜๊ณ  WebSocket์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” namespace, room ๊ธฐ๋Šฅ, ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ์ „์†ก ๊ฐ€๋Šฅ ๋“ฑ์„ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— Socket.io๋ฅผ ์„ ํƒ 4.5.1
artillery ์ฝ”๋“œ์˜ ๋ณ€ํ™”์— ๋”ฐ๋ฅธ ์„ฑ๋Šฅ์„ ๋น„๊ตํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ. ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋ฅผ ํŒŒ์ผ๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Œ 2.0.0-20
jest ๋ฐฐํฌ ์ „ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๊ฐ€ ์˜ˆ์ƒํ•œ ๋Œ€๋กœ ์‹คํ–‰ํ•˜๋Š”์ง€ ์ฒดํฌํ•˜๊ณ  ์ฝ”๋“œ ํ’ˆ์งˆ ํ–ฅ์ƒ ๋ฐ ์ฝ”๋“œ ๋ฌธ์„œํ™”๋ฅผ ์œ„ํ•ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑ. ์—ฌ๋Ÿฌ ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ ์ค‘ Jest๋Š” ์ฝ”๋“œ ์ž‘์„ฑ์ด ์‹ฌํ”Œํ•˜๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•ด ํ…Œ์ŠคํŠธ ์‹คํ–‰ ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์–ด ์„ ํƒ 28.1.2

โœ ์ปค๋ฐ‹ ๋ฉ”์„ธ์ง€ ๊ทœ์น™

  • feat : ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€
  • fix : ๋นŒ๋“œ ๊ด€๋ จ ํŒŒ์ผ ์ˆ˜์ •
  • build : ๋นŒ๋“œ ๊ด€๋ จ ํŒŒ์ผ ์ˆ˜์ •
  • chore : ๊ทธ ์™ธ ์ž์ž˜ํ•œ ์ˆ˜์ •
  • ci : CI ๊ด€๋ จ ์„ค์ • ์ˆ˜์ •
  • docs : ๋ฌธ์„œ ์ˆ˜์ •
  • style : ์ฝ”๋“œ ์Šคํƒ€์ผ ํ˜น์€ ํฌ๋งท ์ˆ˜์ •
  • refactor : ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง
  • test : ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ˆ˜์ •

๐Ÿ”ฅ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…

โœ”๏ธ ๋ฉ”์ธํŽ˜์ด์ง€ ๋กœ๋”ฉ ์†๋„ ๊ฐœ์„ 

๋ฌธ์ œ์ 

  1. ๋ฉ”์ธ ํŽ˜์ด์ง€๋Š” ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•˜๋Š” ๋ชจ๋“  ์œ ์ €๋“ค์ด ๋ฐฉ๋ฌธํ•˜๊ธฐ ๋•Œ๋ฌธ์— API ์‚ฌ์šฉ๋Ÿ‰์ด ๋งค์šฐ ๋งŽ๋‹ค.
  2. DB์—์„œ ๋ชจ๋“  ๊ฒŒ์‹œ๊ธ€์„ ์กฐํšŒํ•˜๊ณ  1์ฃผ์ผ๊ฐ„ ์ข‹์•„์š”๋ฅผ ๋งŽ์ด ๋ฐ›์€ ์ˆœ์„œ๋กœ ์ •๋ ฌํ•˜๋Š” ๋กœ์ง์„ ๋งค๋ฒˆ ์‹คํ–‰ํ•œ๋‹ค.
  3. ๋А๋ฆฐ ๋กœ๋”ฉ ์†๋„๋กœ ์œ ์ €๊ฐ€ ๋А๋ผ๋Š” ๋ถˆํŽธํ•จ์„ ๊ฐœ์„ ํ•˜๊ณ  ์šด์˜ ์ธก๋ฉด์—์„œ๋„ ์„œ๋ฒ„ ๋น„์šฉ์„ ๊ฐ์ถ•ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

ํ•ด๊ฒฐ๋ฐฉ์•ˆ

  1. ๋ ˆ๋””์Šค์— ๊ฐ€๊ณต๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฏธ๋ฆฌ ์ €์žฅํ•˜๊ณ  API ํ˜ธ์ถœ ์‹œ DB์— ์ ‘๊ทผํ•˜์ง€ ์•Š๊ณ  ๋ ˆ๋””์Šค์—์„œ ๋ฐ”๋กœ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•œ๋‹ค.
  2. 10๋ถ„ ๋‹จ์œ„๋กœ ์บ์‹œ์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.

๊ฒฐ๊ณผ

Artillery๋กœ ํ…Œ์ŠคํŠธํ•ด๋ณธ ๊ฒฐ๊ณผ, ๊ธฐ์กด ๋ฐฉ์‹์— ๋น„ํ•ด ๋ ˆ๋””์Šค๋ฅผ ๊ฐ™์ด ํ™œ์šฉํ–ˆ์„ ๋•Œ ์„œ๋ฒ„ ์‘๋‹ต ์†๋„๊ฐ€ 70% ๊ฐ€๋Ÿ‰ ๋‹จ์ถ•๋˜์—ˆ๋‹ค.

์•„์‰ฌ์šด์ 

10๋ถ„๋งˆ๋‹ค ์ธ๊ธฐ ๊ฒŒ์‹œ๊ธ€์„ ์—…๋ฐ์ดํŠธ ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์‹œ๊ฐ„์œผ๋กœ ์—…๋ฐ์ดํŠธ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์—†๋‹ค๋Š” ํ•œ๊ณ„์ ์ด ์žˆ๋‹ค.

์‘์šฉ

  1. ์ผ์ผ ์กฐํšŒ์ˆ˜๋ฅผ ๋ ˆ๋””์Šค์— ์ €์žฅํ•˜๊ณ  ์˜ค์ „ 12์‹œ์— ํ•ฉ์‚ฐํ•˜์—ฌ DB์— ์—…๋ฐ์ดํŠธํ•œ๋‹ค. ๋ ˆ๋””์Šค์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž… set์„ ํ™œ์šฉํ•˜์—ฌ ์ค‘๋ณต ์ง‘๊ณ„๋ฅผ ๋ฐฉ์ง€ํ•œ๋‹ค.
  2. ๋ ˆ๋””์Šค๋ฅผ ์„ธ์…˜ ์ €์žฅ์†Œ๋กœ ํ™œ์šฉํ•˜์—ฌ JWT ํ† ํฐ์„ ์ €์žฅํ•˜๊ณ  ์ค‘๋ณต ๋กœ๊ทธ์ธ์„ ๋ฐฉ์ง€ํ•œ๋‹ค.

โœ”๏ธ ์ƒ์„ธํŽ˜์ด์ง€ ๋กœ๋”ฉ ์†๋„ ๊ฐœ์„ 

๋ฌธ์ œ์ 

  1. 1:N์˜ ๊ด€๊ณ„๋ฅผ ๊ฐ–๋Š” ๋ฐ์ดํ„ฐ(๊ฒŒ์‹œ๊ธ€ : ๋Œ“๊ธ€, ์ข‹์•„์š”, ํƒœ๊ทธ ๋“ฑ) ์กฐํšŒ์— Eager Loading์„ ํ™œ์šฉํ•œ๋‹ค.
  2. ์—ฌ๋Ÿฌ ๋ฒˆ์˜ ํ…Œ์ด๋ธ” JOIN์œผ๋กœ ์„ฑ๋Šฅ ์ €ํ•˜๋œ๋‹ค.

ํ•ด๊ฒฐ๋ฐฉ์•ˆ

  1. Lazy Loading์„ ํ™œ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ๊ฐ ํ…Œ์ด๋ธ”์—์„œ ์กฐํšŒํ•œ๋‹ค.

๊ฒฐ๊ณผ

  1. ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์ด ์ข‹์•„์กŒ๋‹ค.
// Eager Loading
const paper = await Paper.findOne({
    where: { postId },
    include: [
        {
            model: Comment,
            include: {
                model: User,
                as: 'Users',
                attributes: ['userId', 'blogId', 'nickname', 'profileImage'],
            },
        },
        { model: Tag, attributes: ['name'] },
        { model: User, as: 'Users', attributes: ['blogId', 'nickname', 'profileImage'] },
        { model: User, as: 'Likes', attributes: ['blogId'] },
    ],
});
// Lazy Loading
const paper = await Paper.findOne({ where: { postId } })
const comments = await Comment.findAll({
    where: { postId },
    include: {
        model: User,
        as: 'Users',
        attributes: ['userId', 'blogId', 'nickname', 'profileImage'],
    },
});
const tags = await paper.getTags({ attributes: ['name'] });
const user = await paper.getUsers({ attributes: ['blogId', 'nickname', 'profileImage'] });
const likes = await paper.getLikes({ attributes: ['blogId'] });
  1. ๊ธฐ์กด ๋ฐฉ์‹์— ๋น„ํ•ด ์„œ๋ฒ„ ์‘๋‹ต ์†๋„๊ฐ€ 50% ๊ฐ€๋Ÿ‰ ๋‹จ์ถ•๋˜์—ˆ๋‹ค.

โœ”๏ธ ๋„์ปค ๋„์ž…

๋ฌธ์ œ์ 

๋กœ์ปฌ์—์„œ ๋ฌธ์ œ์—†์ด ๋Œ์•„๊ฐ€๋˜ ์„œ๋ฒ„๊ฐ€ ๋ฐฐํฌ ํ›„ ์‹คํ–‰์„ ํ•˜๋ฉด reify fsevents ํ”„๋ฆฌ์ง• ๋ฌธ์ œ ๋ฐœ์ƒ

๊ตฌ๊ธ€๋ง์„ ํ†ตํ•ด ๋…ธ๋“œ ๋ฒ„์ „ ๋ฌธ์ œ๋กœ ์ธํ•œ ์—๋Ÿฌ๋ผ๋Š” ์‚ฌ์‹ค ๋ฐœ๊ฒฌ

ํ•ด๊ฒฐ๋ฐฉ์•ˆ

  1. ๋…ธ๋“œ ๋ฒ„์ „์„ ๋กœ์ปฌํ™˜๊ฒฝ๊ณผ ๋งž์ถฐ์ฃผ๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์ง€๋งŒ ์ถ”๊ฐ€ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋งˆ๋‹ค ๋งž์ถฐ์ค˜์•ผํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€ ๋ฐœ์ƒ
  2. ๋กœ์ปฌํ™˜๊ฒฝ์˜ ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•ด ์ธ์Šคํ„ด์Šค์—์„œ ์‹คํ–‰

๊ฒฐ๊ณผ

๋กœ์ปฌ์— ์ž‘์—…ํ•œ ๊ฑธ ์ด๋ฏธ์ง€๋กœ ๋นŒ๋“œํ•ด ์‹คํ–‰ํ•˜๋‹ˆ ๋ฐฐํฌํ™˜๊ฒฝ์—์„œ ๋ฒ„์ „ ์ด์Šˆ ๋“ฑ์œผ๋กœ ์ธํ•œ ์—๋Ÿฌ๋ฅผ ๊ฑฑ์ •ํ•˜์ง€ ์•Š๊ณ  ๋ฐฐํฌ ๊ฐ€๋Šฅ


โœ”๏ธ S3 ๋ฏธ์‚ฌ์šฉ ์ด๋ฏธ์ง€ ๊ด€๋ฆฌ ๋ฌธ์ œ

๋ฌธ์ œ์ 

์ด๋ฏธ์ง€๋ฅผ ์ฒจ๋ถ€(์—…๋กœ๋“œ)ํ•˜๊ณ  ๊ฒŒ์‹œ๊ธ€์„ ์ž‘์„ฑํ•˜๋‹ค๊ฐ€ ์ค‘๊ฐ„์— ํŽ˜์ด์ง€๋ฅผ ๋ฒ—์–ด๋‚œ๋‹ค๋ฉด ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ด๋ฏธ์ง€๊ฐ€ S3์— ๋‚จ์•„์žˆ๊ฒŒ ๋จ ๊ฒŒ์‹œ๊ธ€์„ ์ˆ˜์ •ํ•˜๋ฉด์„œ ๊ธฐ์กด์— ์‚ฌ์šฉํ•œ ์ด๋ฏธ์ง€๋ฅผ ์‚ญ์ œํ•  ๋•Œ๋„ ๋˜‘๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์ƒ๊น€

ํ•ด๊ฒฐ๋ฐฉ์•ˆ

  1. image ํ…Œ์ด๋ธ”์„ ์ถ”๊ฐ€
  2. ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ์‹œ image ํ…Œ์ด๋ธ”์— postId๊ฐ€ null์ธ ์ƒํƒœ๋กœ ์ถ”๊ฐ€
  3. ๊ฒŒ์‹œ๊ธ€ ๋™๋ก ์‹œ ๋ณธ๋ฌธ์— ์ •๊ทœ์‹์œผ๋กœ ์ด๋ฏธ์ง€ url๋“ค์„ ํ•„ํ„ฐ๋งํ•˜๊ณ  ๋ฐฐ์—ด์— ์ €์žฅ ๋ฐฐ์—ด ๋‚ด ๊ฐ’๋“ค๊ณผ ์ผ์น˜ํ•˜๋Š” row๋“ค์€ postId๋ฅผ ๋ถ€์—ฌ
  4. node-cron์œผ๋กœ postId๊ฐ€ null์ด๊ณ  updateAt์ด ํ•˜๋ฃจ ์ „ ์ด์ƒ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ ์‚ญ์ œ

๐Ÿง‘โ€๐Ÿ’ป ํŒ€ ๊ตฌ์„ฑ

Backend
๋ฌธ๊ด‘๋ฏผ ์†ก๋ฏผ์ง€ ๋ฐ•์„ ์šฐ ๊น€์„ฑ์ค€
Frontend
๊ตฌ์ž๋• ์ž„์šด์ฒ  ์ •๋Œ€๊ทœ

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 4

  •  
  •  
  •  
  •