Skip to content

Latest commit

ย 

History

History
399 lines (308 loc) ยท 23.8 KB

README.md

File metadata and controls

399 lines (308 loc) ยท 23.8 KB

Calog-Backend

๐Ÿ˜“ ์˜ค๋Š˜ ๋‚ด๊ฐ€ ๋จน์€ ์นผ๋กœ๋ฆฌ๊ฐ€ ๊ฑฑ์ • ๋ ๋•Œ๋Š”??

๐Ÿ˜ Calog๊ฐ€ ๊ทธ ๊ฑฑ์ • ํ•ด๊ฒฐ ํ•ด๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค!!

Calog๋กœ ์นผ๋กœ๋ฆฌ๋ฅผ

  • ๐Ÿณ ์ฐพ์•„๋ณด๊ณ 
  • โœ ๊ธฐ๋กํ•˜๊ณ 
  • ๐Ÿฑ ๋‚˜๋งŒ์˜ ์‹๋‹จ์„ ๋งŒ๋“ค์–ด ๋ณด์„ธ์š”!!!
    image

โ“๊ธฐํš์˜๋„

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

๐Ÿ˜† Calog ์ด๋Ÿฐ ๋ถ„๋“ค์—๊ฒŒ ์œ ์šฉ ํ•ด์š”!!

  • ์›ฐ๋น™๊ณผ ์‹๋‹จ์— ๊ด€์‹ฌ์žˆ๋Š” 2040 ๋Œ€ํ•™์ƒ ๋ฐ ์ง์žฅ์ธ
  • ์นผ๋กœ๋ฆฌ๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ์Œ์‹๋ฉ”๋‰ด๋ฅผ ๊ฒฐ์ • ํ•˜์‹œ๊ณ ์ž ํ•˜๋Š” ๋ถ„
  • ๋ณธ์ธ์ด ์„ญ์ทจํ•œ ์นผ๋กœ๋ฆฌ๋ฅผ ๋งค์ผ ๊ธฐ๋กํ•˜๋ฉฐ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๋ถ„
  • ์นผ๋กœ๋ฆฌ๋ฅผ ๋งž์ถฐ ์‹๋‹จ์„ ๊ตฌ์„ฑ ํ•˜์‹œ๊ณ ์ž ํ•˜๋Š” ๋ถ„

โœจ Calog ์ฃผ์š” ๊ธฐ๋Šฅ โœจ

1.์ผ๋ฐ˜ ๋กœ๊ทธ์ธ ๋ฐ ์‚ฌ์šฉ์ž ํŽธ์˜๋ฅผ ์œ„ํ•œ ์†Œ์…œ ๋กœ๊ทธ์ธ(๊ตฌ๊ธ€, ๋„ค์ด๋ฒ„, ์นด์นด์˜ค) ๊ธฐ๋Šฅ

JWT Token์„ ํ†ตํ•ด ๋กœ๊ทธ์ธ ์ธ์ฆ ๋ฐ Passport Module์„ ํ†ตํ•ด ์†Œ์…œ๋กœ๊ทธ์ธ ๊ตฌํ˜„

2.์•ฝ 6๋งŒ์—ฌ๊ฐœ์˜ ์Œ์‹ ๋ฐ์ดํ„ฐ(์‹์•ฝ์ฒ˜ ์ œ๊ณต ๋ฐ์ดํ„ฐ)๋ฅผ 3๋ฒˆ์˜ ๋ฐ์ดํ„ฐ ๊ฐ€๊ณต์„ ํ†ตํ•ด Data Base ๊ตฌ์ถ•

image

3. Mongo Atlas๋ฅผ ํ†ตํ•˜์—ฌ FTS(Full Text Search) ๊ตฌํ˜„

Mongo Atlas์—์„œ ํ•œ๊ธ€ FTS๋ฅผ ์ง€์›ํ•œ๋Š” lucene nori๋ฅผ ํ†ตํ•ด Full text search ๊ตฌํ˜„์— ์„ฑ๊ณต

4.๊ฒ€์ƒ‰์†๋„ ๊ฐœ์„ 

Mongo Atlas ์„œ๋ฒ„์˜ ์ง€์—ญ์ด ๋ฏธ๊ตญ ๋ฒ„์ง€๋‹ˆ์•„๋กœ ์„ค์ • ๋˜์–ด์žˆ์–ด ์„œ๋ฒ„ ์ง€์—ญ์„ ์‹ฑ๊ฐ€ํด๋กœ ๋ณ€๊ฒฝ ๋ฐ $limit ๊ธฐ๋Šฅ์„ ์ด์šฉํ•˜์—ฌ 1000๊ฐœ์˜ ๋ฐ์ดํ„ฐ๊นŒ์ง€๋งŒ ์ถœ๋ ฅ๋˜๋„๋ก ์ œํ•œ์„ ๊ฑธ์–ด ๊ฒ€์ƒ‰ ์†๋„๊ฐœ์„ 

5.CI/CD ๊ตฌํ˜„

image ๋ฐฑ์—”๋“œ ๊นƒ๊ณผ travis๋ฅผ ์—ฐ๋™ํ•ด์„œ travis๊ฐ€ CI ๋ถ€๋ถ„์„ ๋งก๊ณ ์žˆ๊ณ  CD๋Š” S3์— ๋นŒ๋“œํŒŒ์ผ์„ ์ €์žฅํ•œ๋’ค codedeploy์„ ํ†ตํ•ด์„œ ๋ฐฐํฌ, ๋ฐฐํฌ๋ฐฉ์‹์€ ๋„์ปค๋ฅผ ์ด์šฉํ•˜์—ฌ blue and green๋ฐฉ์‹์œผ๋กœ ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ ๊ตฌํ˜„

6. ๋ณด์•ˆ

CSRF ๊ณต๊ฒฉ์— ๋Œ€ํ•œ ๋ณด์•ˆ ๋Œ€์ฑ…์œผ๋กœ Security Token ์„ ๋ฐœ๊ธ‰ํ•˜์—ฌ ๊ฒ€์ฆํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉ

โš™Node & npm Version

node: v14.17.1
npm: 6.14.13

๐Ÿ’ป๊ธฐ์ˆ ์Šคํƒ/๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

๊ธฐ์ˆ ์Šคํƒ

์ข…๋ฅ˜ ์ด๋ฆ„
์„œ๋ฒ„ ํ”„๋ ˆ์ž„์›Œํฌ Express
Database MongoDB, AtlasDB
์„œ๋ฒ„ ๋ชจ๋‹ˆํ„ฐ๋ง netData
์—๋Ÿฌ ๋ชจ๋‹ˆํ„ฐ๋ง sentry
CI travis CI
CD CodeDeploy
๋นŒ๋“œํŒŒ์ผ ์ €์žฅ์†Œ S3
Application ๊ตฌ์ถ• software Docker
๋กœ๋“œ๋ฐธ๋Ÿฐ์Šค nginx
๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ Appliance
dotenv ํฌํŠธ๊ฐ’์™ธ ์ค‘์š”ํ•œ๊ฐ’ ๋ณด์•ˆ์ฒ˜๋ฆฌ
Mongoose MongoDB ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง
Cors Request Resource ์ œํ•œ
passport,passport-google-oauth20,passport-kakao,passport-naver ์†Œ์…œ ๋กœ๊ทธ์ธ
bcrypt ์•”ํ˜ธํ™”
jsonwebtoken ์•”ํ˜ธํ™”
eslint ํด๋ฆฐ์ฝ”๋“œ
prettier ํด๋ฆฐ์ฝ”๋“œ
eslint-config-prettier,eslint-plugin-prettier eslint, prettier ์ถฉ๋Œ๋ฐฉ์ง€
validator,express-validator ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ

๐ŸŽฏ Backend Trouble Shooting

์นผ๋กœ๋ฆฌ ํ†ต๊ณ„๋ฅผ ๋ณด์—ฌ์ค„๋•Œ ๋ชธ๋ฌด๊ฒŒ์— ๋”ฐ๋ฅธ ๊ธฐ์ดˆ๋Œ€์‚ฌ๋Ÿ‰์„ ๋ฒ ์ด์Šค๋กœ ๋ณด์—ฌ์ฃผ๋Š”๋ฐ ์˜ˆ๋ฅผ ๋“ค์–ด ์˜ค๋Š˜ ๋ชธ๋ฌด๊ฒŒ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ์–ด์ œ ๋จน์—ˆ๋˜ ์Œ์‹์„ ๊ธฐ๋กํ•ด์•ผํ•œ๋‹ค๋ฉด ํ˜„์žฌ ๋ชธ๋ฌด๊ฒŒ๊ฐ€ ์•„๋‹Œ ์–ด์ œ์˜ ๋ชธ๋ฌด๊ฒŒ๊ฐ€ ๋“ค์–ด๊ฐ€์•ผํ•˜๋Š”๋ฐ ์–ด๋–ป๊ฒŒ ์–ด์ œ์˜ ๋ชธ๋ฌด๊ฒŒ๋ฅผ ์•Œ์ˆ˜์žˆ์„๊นŒ?


๋ชธ๋ฌด๊ฒŒ๋ฅผ ์ˆ˜์ •ํ• ๋•Œ๋งˆ๋‹ค ์ˆ˜์ •ํ•œ ๋‚ ์งœ์™€ ๋ชธ๋ฌด๊ฒŒ๋ฅผ ๊ฐ™์ด ์ €์žฅ์„ ํ•˜์ž.

mongoDB ํ•œ๊ธ€์ธ์‹ ๋ฌธ์ œ

์Œ์‹ name ํ•„๋“œ์— "text"์ธ๋ฑ์‹ฑ์„ ํ•ด์ค€ํ›„ $text $search๋กœ ๊ฒ€์ƒ‰์„ํ•˜๋ฉด ๋” ๋น ๋ฅด์ง€๋งŒ ๊ฒ€์ƒ‰๋ฒ”์œ„๊ฐ€ ๋„ˆ๋ฌด ์ข์•„์ง„๋‹ค. ์ด์œ ๋Š” ๋ชฝ๊ณ DB default_language๊ฐ€ ์˜์–ด๋ผ์„œ ๋ฒ”์œ„๋ฅผ ์ปค๋ฒ„๋ฅผ ๋ชปํ•œ๋‹ค. ๊ทธ๋ž˜์„œ default_language: ngram์„ ํ•ด์ค˜์•ผํ•˜๋Š”๋ฐ ngram์€ full text search ๋ณด๋‹ค ๊ฒ€์ƒ‰์†๋„๊ฐ€ ๋Š๋ฆฌ๋‹ค.

image

๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์˜ ์†๋„์™€ ์ •ํ™•์„ฑ ๊ฐœ์„  ๊ณผ์ •

์šฐ์„  ์ฒ˜์Œ์— ๊ฒ€์ƒ‰๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ ์žˆ์–ด ์ •๊ทœ์‹๊ณผ levenshtein ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์†๋„์ ์ธ ๋ถ€๋ถ„๊ณผ ์—ฐ๊ด€๋„ ๋ถ€๋ถ„์— ์žˆ์–ด ์•„์‰ฌ์šด ๋ถ€๋ถ„์„ ์ฐพ์„ ์ˆ˜ ์žˆ์—ˆ๊ณ  ๋ชฝ๊ณ DB์˜ ์ธ๋ฑ์‹ฑ์„ ์ด์šฉํ•˜๊ฒŒ ๋์Šต๋‹ˆ๋‹ค.

image

(levenshtein๊ณผ ์ •๊ทœ์‹ ์ด์šฉํ–ˆ์„ ๋•Œ์˜ ์†๋„)

createIndex๋ฅผ ํ†ตํ•ด ์Œ์‹ name ํ•„๋“œ์— ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ค๊ณ  $search์™€ $meta score ๋“ฑ์„ ์ด์šฉํ•ด์„œ ๊ฒ€์ƒ‰์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.ย  ์ •๊ทœ์‹๊ณผ levenshtein์—์„œ ์•„์‰ฌ์› ๋˜ ์†๋„์ ์ธ ๋ถ€๋ถ„์€ ์›”๋“ฑํžˆ ์ƒ์Šนํ–ˆ์ง€๋งŒ, ์•„์‰ฝ๊ฒŒ๋„ ํ•œ๊ธ€ ํ’€ ํ…์ŠคํŠธ ์„œ์น˜๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์•„, ์ด๋ฒˆ์—” ์ •ํ™•์„ฑ์ด ๊ฑธ๋ฆผ๋Œ์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. (๊ตญ ๊ฒ€์ƒ‰์‹œ ๋งŽ์€ ๋ฐ์ดํ„ฐ๋“ค์ด ์•ˆ๋‚˜์˜ค๊ณ  โ€˜๋ชฝ๊ณ  ๊ฐ„์žฅ ๊ตญโ€™ ํ•˜๋‚˜๋งŒ ์ถœ๋ ฅ๋จ) Default languae ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ ค๊ณ  ํ–ˆ์ง€๋งŒ, ํ•œ๊ตญ์–ด๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์•„์„œ ํ•œ๊ธ€ ํ’€ ํ…์ŠคํŠธ ์„œ์น˜๋ฅผ ์ง€์›ํ•˜๋Š” ํˆด์„ ์ฐพ๊ฒŒ๋์Šต๋‹ˆ๋‹ค.

image

(createIndex์™€ $search๋ฅผ ์ด์šฉํ–ˆ์„ ๋•Œ์˜ ์†๋„)

๊ทธ ๊ฒฐ๊ณผ ์—˜๋ผ์Šคํ‹ฑ ์„œ์น˜๋ฅผ ์•Œ๊ฒŒ๋๊ณ  lucene nori๋ฅผ ํ†ตํ•ด ํ•œ๊ธ€ ํ’€ ํ…์ŠคํŠธ ์„œ์น˜๋ฅผ ์ง€์›ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ๋์Šต๋‹ˆ๋‹ค. 

์†๋„์— ์žˆ์–ด์„œ๋„ ์—˜๋ผ์Šคํ‹ฑ ์„œ์น˜๊ฐ€ ์›”๋“ฑํ•œ ์„ฑ๋Šฅ์„ ๋ณด์ธ๋‹ค๋Š” ๊ฒƒ๋„ ์•Œ๊ฒŒ๋์Šต๋‹ˆ๋‹ค. ์œ ํŠœ๋ธŒ์™€ ๊ตฌ๊ธ€๋ง, ์ธํ”„๋Ÿฐ ๋“ฑ ์˜จ๊ฐ– ์ˆ˜๋‹จ์„ ๋™์›ํ•˜์—ฌ ์—˜๋ผ์Šคํ‹ฑ ์„œ์น˜์™€ ํ‚ค๋ฐ”๋‚˜๋ฅผ ์„ค์น˜ํ•˜๋ ค ํ–ˆ์ง€๋งŒ, ๋ฒˆ๋ฒˆํžˆ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์ฃผ๋กœ ๊ฒช์—ˆ๋˜ ์˜ค๋ฅ˜๋Š” ์—˜๋ผ์Šคํ‹ฑ ์„œ์น˜๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ํ‚ค๋ฐ”๋‚˜๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์—†๊ฒŒ๋˜๋Š”๋ฐ, โ€˜kibana server is not ready yetโ€™ ์ด๋ผ๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋–ด๊ณ  ์ด์— ๊ตฌ๊ธ€๋ง์„ ํ†ตํ•ด ํ‚ค๋ฐ”๋‚˜์™€ ์—˜๋ผ์Šคํ‹ฑ ์„œ์น˜์˜ ๋ฒ„์ „์„ ๊ฐ™๊ฒŒํ•ด๋ดค์ง€๋งŒ ๋ฌธ์ œ๊ฐ€ ์—ฌ์ „ํžˆ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ โ€˜job for elasticsearch.service failed because a fatal signal was delivered to the control processโ€™ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ๊ตฌ๊ธ€๋ง์„ ํ•ด๋ณด๋‹ˆ log๋ฅผ ์ฐ์–ด๋ณด๋ž˜์„œ status๋ฅผ ํ†ตํ•ด ํ™•์ธํ•ด๋ณด๋‹ˆ โ€˜elasticsearch.service: failed with result 'timeoutโ€™.โ€™ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์— ๊ตฌ๊ธ€๋ง์„ ํ†ตํ•ด timeoutSec์„ ๋Š˜๋ ค๋ดค์ง€๋งŒ, ์—ฌ์ „ํžˆ ์•„๋ฌด๋Ÿฐ ํšจ๊ณผ๋„ ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. 5์ผ ์ •๋„์˜ ์‹œ๊ฐ„์„ ๋“ค์˜€์ง€๋งŒ, ์•„๋ฌด๋Ÿฐ ์ง„์ „์ด ์—†์—ˆ๊ณ  ec2 ์„œ๋ฒ„์™€์˜ ์—ฐ๊ฒฐ๊นŒ์ง€ ๊ณ„์† ๋Š์–ด์ง€์ž ํŠœํ„ฐ๋‹˜๊ป˜ ๋ฌธ์˜๋ฅผ ๋“œ๋ฆฌ๊ฒŒ ๋์Šต๋‹ˆ๋‹ค. ๋ฌธ์˜ ๊ฒฐ๊ณผ ec2์˜ ์‚ฌ์–‘์ด ๋ถ€์กฑํ•œ ๊ฒƒ์ด ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค. ํŒ€์›๋“ค๊ณผ ์˜๋…ผํ•ด๋ณธ ๊ฒฐ๊ณผ ์ด๋ฏธ ๋„ˆ๋ฌด ๋งŽ์€ ์‹œ๊ฐ„์„ ์—˜๋ผ์Šคํ‹ฑ ์„œ์น˜์˜ ์„ค์น˜์— ์‚ฌ์šฉํ–ˆ๊ณ  EC2๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œ ํ•˜๊ธฐ ์œ„ํ•œ ์›” 54000์›์˜ ๋น„์šฉ๋„ ํ˜„์‹ค์ ์œผ๋กœ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ํŒ๋‹จํ•˜์—ฌ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์ฐพ์•„๋ณด๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ฒŒ ๋งˆ์ง€๋ง‰์œผ๋กœ ๋ชฝ๊ณ DB ์•„ํ‹€๋ผ์Šค๋ฅผ ๋„์ „ํ•ด๋ณด๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์—˜๋ฆฌ์Šคํ‹ฑ ์„œ์น˜์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ lucene ๊ธฐ๋ฐ˜์œผ๋กœ

nori๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด ํ•œ๊ธ€ ํ’€ ํ…์ŠคํŠธ ์„œ์น˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. search Index์— ์–ธ์–ด ๋ถ„์„๊ธฐ๋กœ ๋…ธ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ–ˆ๊ณ  aggregate๋ฅผ ํ†ตํ•ด ์ธ๋ฑ์‹ฑ์—๋„ ์„ฑ๊ณตํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋ฉด ๋ณด๋‹ค ์†๋„๊ฐ€ 3๋ฐฐ ์ด์ƒ ๋Š๋ฆฌ๋‹ค๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ ์˜คํƒ€ ์ž๋™ ์ˆ˜์ • ๋“ฑ์˜ ๊ธฐ๋Šฅ๋“ค๋„ ์™„๋ฒฝํ•˜๊ฒŒ ๊ตฌํ˜„๋˜์ง€ ์•Š์•„ ์ •ํ™•์„ฑ๋„ ์•ฝ๊ฐ„์€ ๋–จ์–ด์ง€๋Š” ๋ชจ์Šต์„ ๋ณด์˜€์Šต๋‹ˆ๋‹ค.

image

(๋ชฝ๊ณ DB ์•„ํ‹€๋ผ์Šค๋ฅผ ์ด์šฉํ–ˆ์„ ๋•Œ์˜ ๊ฒ€์ƒ‰ ์†๋„)

์šฐ์„  ์†๋„์ ์ธ ๋ถ€๋ถ„์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋ช‡๊ฐ€์ง€ ๊ฐ€๋Šฅ์„ฑ์„ ์ƒ๊ฐํ•ด๋ดค์Šต๋‹ˆ๋‹ค.

*1. DB๊ฐ€ ํด๋ผ์šฐ๋“œ์— ์žˆ์–ด ๋Š๋ฆฐ๊ฐ€?*

*2. Nori ํ˜•ํƒœ์†Œ ๋ถ„์„๊ธฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋Š๋ฆฐ๊ฐ€?*

์šฐ์„  ์•„ํ‹€๋ผ์Šค์—์„œ ์˜์–ด๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ดค์ง€๋งŒ , ํ•œ๊ธ€๋กœ ํ–ˆ์„๋•Œ์™€ ๋น„์Šทํ•œ ์†๋„๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ๊ณ  

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

image

image (๋ฒ„์ง€๋‹ˆ์•„์™€ ์‹ฑ๊ฐ€ํฌ๋ฅด์˜ ๊ฒ€์ƒ‰ ์†๋„ ๋น„๊ต)

๋‘๋ฒˆ์งธ๋กœ ์ •ํ™•์„ฑ ๋ถ€๋ถ„์€ ์•„์ง ํ•ด๊ฒฐํ•˜๋Š” ์ค‘์ด์ง€๋งŒ, ์˜คํƒ€ ์ž๋™ ์ˆ˜์ • ๊ธฐ๋Šฅ์ด ํ•œ๊ธ€์„ ์™„๋ฒฝํžˆ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์‚ฌ์‹ค์„ ํŒŒ์•…ํ–ˆ์Šต๋‹ˆ๋‹ค.

์–ด๋–ป๊ฒŒ ํ•„ํ„ฐ๋ฅผ ์ฃผ๋Š๋ƒ์— ๋”ฐ๋ผ์„œ ์–ด๋–ค ํ‚ค์›Œ๋“œ๋Š” ์ •ํ™•์„ฑ์ด ์˜ฌ๋ผ๊ฐ€์ง€๋งŒ, ๋‹ค๋ฅธ ํ‚ค์›Œ๋“œ์˜ ์ •ํ™•์„ฑ์€ ์˜คํžˆ๋ ค ๋–จ์–ด์ง€๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋˜ ๊ธฐ์กด์— ์‚ฌ์šฉํ•˜๋˜ ์ •๊ทœ์‹๊ณผ ์ธ๋ฑ์‹ฑ์„ ๋™์‹œ์— ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ โ€˜๊ฟฉโ€™๊ณผ ๊ฐ™์€ ํ•œ๊ธ€์ž ํ‚ค์›Œ๋“œ๋ฅผ ์ž…๋ ฅํ• ๋•Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋ฐœ๊ฒฌํ–ˆ๊ณ ย  ์ •๊ทœ์‹์„ ์ง€์šฐ๋Š” ๋ฐฉ์‹์„ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ–ฅํ›„ ์ถ”๊ฐ€์ ์œผ๋กœ ํ•ด๊ฒฐํ•  ๋ฌธ์ œ๋Š” ์—ฌ์ „ํžˆ ์ •ํ™•๋„์™€ ์†๋„์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

๋” ํšจ์œจ์ ์œผ๋กœ ์ธ๋ฑ์‹ฑ์„ ํ•˜์—ฌ ์†๋„๋ฅผ ๋†’์ด๊ณ  ์•„์ง ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์— ์žˆ์–ด์„œ ์—ฐ๊ด€๋„๊ฐ€ ๋„ˆ๋ฌด ๋–จ์–ด์ง€๋Š” ๊ฒฐ๊ณผ๋“ค๊นŒ์ง€ ์ถœ๋ ฅ๋˜๋Š”๋ฐ ์ด๋ฅผ ์ˆ˜์ •ํ•˜๋Š”๊ฒƒ์— ์ดˆ์ ์„ ๋งž์ถœ ๊ณ„ํš์ž…๋‹ˆ๋‹ค.

                                                             **โ€”์ค‘๊ฐ„๋ฐœํ‘œํ›„โ€”**

์ถ”๊ฐ€์ ์ธ ์†๋„๋ฅผ ํ–ฅ์ƒ์„ ์œ„ํ•ด์„œ ๋‘๊ฐ€์ง€ ๋„์ „์„ ๋”ํ•ด๋ดค์Šต๋‹ˆ๋‹ค.ย  Region์„ ์‹ฑ๊ฐ€ํด๋กœ ์˜ฎ๊ธด๊ฒƒ๋งŒ์œผ๋กœ๋„ 

2๋ฐฐ์˜ ์†๋„ํ–ฅ์ƒ์ด ์žˆ์—ˆ๋Š”๋ฐ ๋งŒ์•ฝ์— ์„œ์šธ๋กœ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์–ผ๋งˆ๋‚˜ ๋” ์†๋„๊ฐ€ ์˜ฌ๋ผ ๊ฐˆ๊นŒ๋ผ๋Š” ์ƒ๊ฐ์„ ํ•˜๊ฒŒ ๋์Šต๋‹ˆ๋‹ค. ์šฐ์„  ์•„ํ‹€๋ผ์Šค์—์„œ ์ง€์—ญ์„ ์„œ์šธ๋กœํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์•ˆ์ด ์žˆ์–ด ์ด๋ฅผ ์‹œ๋„ํ–ˆ์ง€๋งŒ, ์•„์‰ฝ๊ฒŒ๋„ ์ €ํฌ๊ฐ€ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” M0 ํ”„๋ฆฌํ‹ฐ์–ด์—์„œ๋Š” ์„œ์šธ์„ ์„ ํƒํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ฐจ์„ ์ฑ…์œผ๋กœ ๋‹ค๋ฅธ VPC๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” Peering์„ ํ†ตํ•ด ์•„ํ‹€๋ผ์Šค์™€ ์ €ํฌ ์„œ๋ฒ„ EC2๋ฅผ ์—ฐ๊ฒฐํ•˜๋ ค ํ–ˆ์ง€๋งŒ, Peering ๊ธฐ๋Šฅ๋„ ํ”„๋ฆฌํ‹ฐ์–ด์—์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋‘˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ตœ์†Œํ•œ ์›” 72000์› ์ •๋„์˜ ๊ธˆ์•ก์„ ์ง€๋ถˆํ•ด์•ผํ–ˆ๊ณ  ์—˜๋ผ์Šคํ‹ฑ ์„œ์น˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ์ด์œ ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ด๋Š” ํฌ๊ธฐํ•  ์ˆ˜ ๋ฐ–์— ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

์œ„์˜ ๋ฌธ์ œ๋“ค์— ๋”ํ•ด ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ๋Š”๋ฐ, ๋ช‡๋ช‡ ํ‚ค์›Œ๋“œ๋“ค, ํŠนํžˆ ๋ฐฅ, ์น˜ํ‚จ, ํ”ผ์ž ์ฒ˜๋Ÿผ ๋น„๊ต์  ํฌ๊ด„์ ์ธ ํ‚ค์›Œ๋“œ๋“ค์€ ๊ฒ€์ƒ‰๊ฒฐ๊ณผ๊ฐ€ 

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

image image ($limit: 1000 ์„ค์ • ์œ ๋ฌด์— ๋”ฐ๋ฅธ ์†๋„ ๋น„๊ต)

๋‹ค์Œ์œผ๋กœ ์ •ํ™•๋„ ๊ฐœ์„ ์„ ์œ„ํ•ด์„œ ์„ธ ๊ฐ€์ง€ ๋ฐฉ์•ˆ์„ ๊ตฌ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฒซ๋ฒˆ์งธ๋กœ ์ •๊ทœ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. 

ํ•˜์ง€๋งŒ ์ •๊ทœ์‹์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ lucene์„ nori๊ฐ€ ์•„๋‹Œ keyword๋กœ ์‚ฌ์šฉํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ์ž‘๋ถ€ํ„ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์„๊ฒƒ์ด๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค . ์•„๋‹ˆ๋‚˜ ๋‹ค๋ฅผ๊นŒ ์•„๋ž˜์˜ ์‚ฌ์ง„์„ ๋ณด๋ฉด lucene nori๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋ณด๋‹ค ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์˜ ์ •ํ™•๋„๊ฐ€ ๋งค์šฐ ๋–จ์–ด์ง€๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

image image ($regex๋ฅผ ์‚ฌ์šฉ ์œ ๋ฌด์— ๋”ฐ๋ฅธ ์ •ํ™•๋„ ๋น„๊ต)

๋‘๋ฒˆ์งธ๋กœ fuzzy๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜คํƒ€๋ฅผ ์ˆ˜์ •ํ•จ์œผ๋กœ์จ ๊ฒ€์ƒ‰ ์ •ํ™•๋„๋ฅผ ์˜ฌ๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•ด๋ดค์Šต๋‹ˆ๋‹ค. 

maxEdits ๊ธฐ๋Šฅ์€ 1๊ฐœ ํ˜น์€ 2๊ฐœ๋ฅผ ์˜ต์…˜์œผ๋กœ ์„ ํƒํ•˜์—ฌ ๊ทธ ๊ฐœ์ˆ˜๋งŒํผ ์˜คํƒ€์˜ ํŽธ์ง‘์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. prefixLength ๊ธฐ๋Šฅ์€ ์ถœ๋ ฅ ๊ฐ’์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์—์„œ๋ถ€ํ„ฐ ์ •ํ™•ํžˆ ์ผ์น˜ํ•ด์•ผํ•˜๋Š” ๊ธ€์ž ์ˆ˜๋ฅผ ์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ €๋Š” ์ด ๋ถ€๋ถ„์„ ๋‹ค์–‘ํ•˜๊ฒŒ ์„ค์ •ํ•˜๋ฉฐ ์—ฌ๋Ÿฌ ์‹œ๋„๋ฅผ ํ•ด๋ดค์ง€๋งŒ, Lucene nori์—์„œ๋Š” ์ด ๊ธฐ๋Šฅ์ด ์ ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™๋‹ค๋Š” ๊ฒฐ๋ก ์— ๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค.

image (fuzzy๋ฅผ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ, ์ ์šฉ์ด ์ž˜ ์•ˆ๋œ ๋“ฏํ•œ ๊ฒฐ๊ณผ๋ฌผ)

๊ทธ๋ž˜์„œ ๋งˆ์ง€๋ง‰์œผ๋กœ ์ €ํฌ๊ฐ€ ๊ฒช๊ณ  ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ๊ทผ๋ณธ์ ์œผ๋กœ ์ƒ๊ฐํ•ด๋ดค์Šต๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰ ์ •ํ™•๋„๊ฐ€ ๋–จ์–ด์ง„๋‹ค๊ณ  

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

๋‘๊ฐœ์˜ DB๋ฅผ ๋‹ค์ค‘ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์„๊นŒ


์•„ํ‹€๋ผ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ๊ฑฑ์ •ํ–ˆ๋˜ ์ ์ด ์•„ํ‹€๋ผ์Šค์˜ ์†๋„๊ฐ€ ์ผ๋ฐ˜ mongo db๋ณด๋‹ค ๋Š๋ฆฌ๋‹ค๋Š” ๊ฒƒ์ธ๋ฐ, ๊ทธ๋ ‡๋‹ค๋ฉด ์Œ์‹ ์ปฌ๋ ‰์…˜๋งŒ ์•„ํ‹€๋ผ์Šค๋ฅผ ์ด์šฉํ•˜๊ณ  ๋‚˜๋จธ์ง€ ์ปฌ๋ ‰์…˜๋“ค์€ ๊ธฐ์กด์˜ mongo db๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ดค๋‹ค.

์•„๋ž˜์˜ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ์‰ฝ๊ฒŒ ๋‘๊ฐœ์˜ DB๋ฅผ ๋‹ค์ค‘์—ฐ๊ฒฐํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

image image image ์œ„์™€๊ฐ™์€ ํ˜•ํƒœ๋กœ models/index.js๋ฅผ ๋‘๊ฐœ๋กœ ๋‚˜๋ˆ ์„œ 'export const ๋ณ€์ˆ˜๋ช… = mongoose.createConnection(mongodb ์ฃผ์†Œ)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ models์—์„œ ํ•„์š”ํ•œ DB์— ๋งž๊ฒŒ ๋ณ€์ˆ˜๋ฅผ importํ•˜์—ฌ์‚ฌ์šฉํ•˜๋ฉด ๋‘๊ฐœ์˜ ๋‹ค๋ฅธ DB๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

ํŠธ๋ž˜ํ”ฝ ์ฒ˜๋ฆฌ & ๊ณผ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ
์„œ๋น„์Šค๋Š” ์ง€์†์ ์œผ๋กœ ์ œ๊ณตํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š”๋ฐ ์„œ๋ฒ„๊ฐ€ ๋ป—์–ด ๋ฒ„๋ฆฌ๊ฑฐ๋‚˜ ์˜ˆ๊ธฐ์น˜๋ชปํ•œ ์˜ค๋ฅ˜๋กœ ์ธํ•ด์„œ ์„œ๋ฒ„๊ฐ€ ๋‹ค์šด๋˜๋ฉด?

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

์˜คํ†  ๋ฆฌ์Šคํƒ€ํŠธ or ์…€ํ”„ํž๋ง

docker ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋„์šธ๋•Œ restart์˜ต์…˜ "โ€”restart on-failure[:maxretries]" ๋ฅผ ์ ์šฉํ•˜์—ฌ exit 0(์ •์ƒ์ ์ธ ์ข…๋ฃŒ)์ด ์•„๋‹๊ฒฝ์šฐ ์•Œ์•„์„œ ๋‹ค์‹œ ๋ฆฌ์Šคํƒ€ํŠธ ํ• ์ˆ˜์žˆ๋„๋ก ์„ค์ •ํ•ด๋†“๊ณ  sentry๋กœ ์—๋Ÿฌ๊ฐ€ ๋‚ฌ์„์‹œ ์—๋Ÿฌ๋กœ๊ทธ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  slack์œผ๋กœ ์•Œ๋ ค์ค„์ˆ˜ ์žˆ๊ฒŒ ์„ค์ •ํ•ด์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ๋ฐฉํ–ฅ.

์˜คํ†  ์Šค์ผ€์ผ๋ง

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

image

image

loader.io๋ฅผ ํ†ตํ•œ ๊ฐ„๋‹จํ•œ ๋กœ๋“œ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ, 15์ดˆ ๊ธฐ์ค€ ์„œ๋น„์Šค ์ด์šฉ์ž 2400๋ช…๋ถ€ํ„ฐ ์—๋Ÿฌ์™€ ๊ณผ๋ถ€ํ•˜๊ฐ€ ์‹œ์ž‘๋๋˜๊ฒŒ์ธ์Šคํ„ด์Šค ํ•œ๊ฐœ์— ๋งค๋‹ˆ์ €๋…ธ๋“œ 2๋Œ€๋ฅผ ๋” ์—ฐ๊ฒฐํ•˜๊ณ  ๋„์ปค์Šค์›œ์„์ ์šฉํ•œ ์„œ๋ฒ„์—๋Š” ๋ฆฌ๋ฐ‹์ด 3300๋ช…๊นŒ์ง€ ๋Š˜์—ˆ๋‹ค.

DB ๋ฐ์ดํ„ฐ๊ฐ€ ์ค‘๋ณต๋  ๊ฒฝ์šฐ ์ธ๋ฑ์‹ฑ์ด ์ž˜๋ ๊นŒ?


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

image

image

(๊ฟฉ๋ถˆ๊ณ ๊ธฐ๋ฅผ 200๊ฐœ ๋งŒ๋“ค์–ด ์ค‘๋ณต๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์„๋•Œ์˜ ์†๋„์™€ ์ค‘๋ณต๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„๋•Œ์˜ ์†๋„ ๋น„๊ต)

ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ ์†๋„์—๋Š” ํฐ ์ฐจ์ด๊ฐ€ ์—†์—ˆ๊ณ  ์šฐ๋ฆฌ๋Š” brand ํ•„๋“œ๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์„œ name ํ•„๋“œ์— ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค. 

๊ทธ๋ ‡๊ฒŒ name๊ณผ brand์— ๊ฐ™์ด ์ธ๋ฑ์‹ฑ์„ ์ฃผ์—ˆ๋Š”๋ฐ ์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ๋‹ค. name, brand ์–ด๋Š ๊ฒƒ์— ์šฐ์„  ์ˆœ์œ„๋ฅผ ๋‘๋”๋ผ๋„ ๊ฒ€์ƒ‰ ์ •ํ™•๋„๊ฐ€ ํ˜„์ €ํžˆ ๋–จ์–ด์กŒ๋‹ค. image (์ด๋ฆ„์— ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋‘๊ณ  ํ”ผ์ž๋ฅผ ๊ฒ€์ƒ‰ํ–ˆ์ง€๋งŒ, ํ”ผ์ž๋ผ๋Š” generalํ•œ ๊ฐ’๋ณด๋‹ค brand์™€ name ํ•„๋“œ์— ๋ชจ๋‘ ํ”ผ์ž๊ฐ€ ํฌํ•จ๋œ ๊ฐ’๋“ค์ด ๊ฐ€์žฅ ๋†’์€ ์šฐ์„ ์ˆœ์œ„๋กœ ์ถœ๋ ฅ๋จ)

์œ„์™€๊ฐ™์€ ๋ฌธ์ œ์  ๋•Œ๋ฌธ์— name ํ•„๋“œ์— ๋ธŒ๋žœ๋“œ ์ด๋ฆ„์„ ๋ถ™์—ฌ์ฃผ๋Š” ์ž‘์—…์„ ๋ฐ์ดํ„ฐ 2์ฐจ ๊ฐ€๊ณต๋•Œ ์ง„ํ–‰ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.

๐Ÿ˜Ž About Us

BackEnd

์ด๊ฒฝ์› ์˜ค์ธ์›… ๋ฐ•์ง„ํ™

FrontEnd

๊น€๋‚˜์˜ ์ตœ์ง€ํ˜ ๋ฐ•์šฉํƒœ

Designer(UI/UX)

๊น€๋ฏผ๊ฒฝ ์ด๊ฒฝ๋ฏธ