Skip to content

๐Ÿงญ ์œ„์น˜๊ธฐ๋ฐ˜ ์นดํŽ˜/์‹๋‹น ์ถ”์ฒœ ์›น ์„œ๋น„์Šค with node.js

Notifications You must be signed in to change notification settings

gkqkehs7/to1step-Backend

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

28 Commits
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿ“Ž Link

์ฝ”๋ง›์ง‘

๐Ÿ“Ž Souce Code

https://github.com/to1step/backend


โš’๏ธย Project Architecture


๐Ÿ” Node.js (v16)

nvm์„ ํ†ตํ•œ ๋ฒ„์ „ ์ผ์น˜

ํŒ€์›๋“ค์ด ๊ฐ์ž์˜ ๋กœ์ปฌ์—์„œ ๊ฐœ๋ฐœ์„ ํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ์ž ๋ฐ์Šคํฌํ†ฑ์˜ node.js๋ฒ„์ „์ด ๋‹ฌ๋ผ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด nvm์„ ํ†ตํ•ด node.js์˜ ๋ฒ„์ „์„ 16์œผ๋กœ ์ผ์น˜์‹œ์ผฐ์Šต๋‹ˆ๋‹ค.

โœ๏ธ nvm์„ ์ด์šฉํ•œ node.js ๋ฒ„์ „ ๊ด€๋ฆฌ


REST์˜ ์›์น™์„ ์ง€ํ‚ค๋Š” API์„ค๊ณ„

REST์˜ ์›์น™์„ ์ง€์ผœ ๊ฐ„๊ฒฐํ•˜๊ณ  ๊ฐ€๋…์„ฑ์ด ์ข‹์€ API๋ฅผ ์„ค๊ณ„ํ•˜์˜€๊ณ , UI์— ๋ฌถ์ด์ง€ ์•Š๋Š” API๋ฅผ ์„ค๊ณ„ํ•˜์—ฌ API์˜ ํ™•์žฅ์„ฑ์„ ๋†’์˜€์Šต๋‹ˆ๋‹ค.

โœ๏ธ REST API๋ž€? | โœ๏ธ REST ์›์น™์„ ์ง€ํ‚ค๋ฉฐ API๋ฅผ ์„ค๊ณ„ํ•˜์ž | โœ๏ธ API๋Š” UI์— ์ข…์†๋˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค


MVCํŒจํ„ด ์ ์šฉ

Node.js๋Š” ์ž์œ ๋„๊ฐ€ ๋งค์šฐ ๋†’๊ธฐ ๋•Œ๋ฌธ์—, Controller๋‚˜ Service๊ฐ€ ๋”ฐ๋กœ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด์— MVC ํŒจํ„ด์„ ์ ์šฉํ•˜์—ฌ Controller์™€ Service ๋ถ„๋ฆฌํ•˜๊ณ  ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ, ํ™•์žฅ์„ฑ, ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ฑ์„ ํ–ฅ์ƒ์‹œ์ผฐ์Šต๋‹ˆ๋‹ค.

โœ๏ธ MVC ํŒจํ„ด์ด๋ž€?


class-validator๋ฅผ ํ†ตํ•œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ

class-validator ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์ž…๋ ฅ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋‚˜ ์™ธ๋ถ€์—์„œ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ฆํ•˜์—ฌ ์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜์˜€์Šต๋‹ˆ๋‹ค.


Dev-dependency ๋ถ„๋ฆฌ๋ฅผ ํ†ตํ•œ ๋นŒ๋“œ ๊ฒฝ๋Ÿ‰ํ™”

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


Day.js๋ฅผ ์ด์šฉํ•œ ์‹œ๊ฐ„ ํ†ต์ผ

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


Cutsom Error๋ฅผ ํ†ตํ•œ Front-end์™€์˜ ์†Œํ†ต

์„œ๋ฒ„์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์—๋Ÿฌ๋ฅผ BadRequestError , UnauthorizedError , ForbiddenError , InternalServerError , NotFoundError ๋กœ ๋‚˜๋ˆ„์–ด classํ™” ํ•˜๊ณ  Front-end๊ฐ€ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์—๋Ÿฌ๋“ค์— ๋Œ€ํ•ด์„  ErrorCode๋“ค์„ ๋ฏธ๋ฆฌ enum type์œผ๋กœ ์ •์˜ํ•ด ๋‘” ๋‹ค์Œ, ํ•ด๋‹น ์—๋Ÿฌ์— ๋งž๋Š” class๋กœ mappingํ•˜์—ฌ Front-end์™€ ์†Œํ†ตํ•˜์˜€์Šต๋‹ˆ๋‹ค.

โœ๏ธ Custom Error๋ฅผ ์ด์šฉํ•œ Front-end์™€์˜ ์†Œํ†ต


Winston.js๋ฅผ ํ†ตํ•œ ๋กœ๊ทธ ๊ธฐ๋ก

Winston.js๋ฅผ ์ด์šฉํ•˜์—ฌ ์„œ๋ฒ„์— ๋“ค์–ด์˜ค๋Š” ๋ชจ๋“  ์š”์ฒญ, ์„œ๋ฒ„์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ชจ๋“  ์—๋Ÿฌ์— ๋Œ€ํ•ด ํŒŒ์ผ๋กœ ๊ธฐ๋กํ•˜์˜€์Šต๋‹ˆ๋‹ค.

โœ๏ธ Winston.js๋ฅผ ํ†ตํ•œ ๋กœ๊ทธ ๊ธฐ๋กํ•˜๊ธฐ


Discord.js๋ฅผ ํ†ตํ•œ Exception Error ํ•ธ๋“ค๋ง๊ณผ API ๊ฐœ์„ 

์„œ๋ฒ„์—์„œ ๋ฐœ์ƒํ•˜๋Š” Exception Error์— ๋Œ€ํ•ด Discord.js๋ฅผ ํ†ตํ•ด Discord๋กœ ๋ฉ”์„ธ์ง€๋ฅผ ๋ณด๋‚ด๊ฒŒ ํ•˜์—ฌ ๋ฐ”๋กœ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์˜€๊ณ , API์†Œ์š”์‹œ๊ฐ„์„ ๊ณ„์‚ฐํ•˜์—ฌ 2000ms ์ด์ƒ ๊ฑธ๋ฆฌ๋Š” API์— ๋Œ€ํ•ด์„œ Discord๋กœ ๋ฉ”์„ธ์ง€๋ฅผ ๋ณด๋‚ด ๋กœ์ง์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

โœ๏ธ API์†Œ์š”์‹œ๊ฐ„ ๊ณ„์‚ฐํ•˜๊ธฐ | โœ๏ธ Discord.js๋ฅผ ํ†ตํ•œ Error-bot ๋งŒ๋“ค๊ธฐ


๐Ÿ” Typescript (v5.1.3)

Node.js ๋Š” ๋น ๋ฅด๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ API๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์— ๊ฐ•์ ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์„œ๋ฒ„๋Š” ์•ˆ์ •์„ฑ์ด ์ตœ์šฐ์„ ์ด๋ฏ€๋กœ, TypeScript๋ฅผ ํ†ตํ•ด ๋™์ ํƒ€์ž… ์–ธ์–ด์ธ Javascript ์—์„œ๋Š” ๊ฒ€์‚ฌํ•˜์ง€ ๋ชปํ–ˆ๋˜ ๋ณ€์ˆ˜, ํ•จ์ˆ˜, ์ธํ„ฐํŽ˜์ด์Šค ๋“ฑ์˜ ํƒ€์ž… ์˜ค๋ฅ˜๋ฅผ ์‚ฌ์ „์— ์ตœ๋Œ€ํ•œ ์ฐจ๋‹จํ•˜์˜€๊ณ . ์ด๋กœ ์ธํ•ด ๋Ÿฐํƒ€์ž„ ์‹œ์ ์˜ ํƒ€์ž… ๊ด€๋ จ ๋ฒ„๊ทธ๋ฅผ ์‚ฌ์ „์— ๋ฐฉ์ง€ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.


๐Ÿ” Prettier

์ฝ”๋“œ ์Šคํƒ€์ผ์„ ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ํ”ํžˆ ๋ฐœ์ƒํ•˜๋Š” ์‹ค์ˆ˜๋‚˜ ์ž ์žฌ์ ์ธ ์˜ค๋ฅ˜๋ฅผ ์‚ฌ์ „์— ๊ฐ์ง€ํ•˜๊ธฐ ์œ„ํ•ด prettier๋ฅผ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.

"lint-staged": {
  "./src/**/*.{ts,tsx,js,jsx}": [
    "eslint --fix"
  ]
}

๐Ÿ” Husky

์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š” ์ฝ”๋“œ๋‚˜ lint์— ๋งž์ง€ ์•Š๋Š” ์ฝ”๋“œ๊ฐ€ ์˜ฌ๋ผ์™€ develop์— merge๋˜๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ์œ„ํ•ด Husky ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ commit๊ณผ push์— ์ •์ฑ…์„ ์ ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.

pre-commit

> npm run lint-staged

lint-staged ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ๋ณ€๊ฒฝ๋œ ํŒŒ์ผ๋“ค๋งŒ ๋Œ€์ƒ์œผ๋กœ lint๋ฅผ ์‹คํ–‰ํ•˜์—ฌ commit ์ „์— ์—๋Ÿฌ๋ฅผ ํ™•์ธํ•˜์˜€์Šต๋‹ˆ๋‹ค.

pre-push

> tsc --noEmit

tsc --noEmit ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด TypeScript ํŒŒ์ผ์„ ์ปดํŒŒ์ผํ•˜์—ฌ JavaScript ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ , ํƒ€์ž… ๊ฒ€์‚ฌ๋งŒ ์ˆ˜ํ–‰ํ•œ ๋‹ค์Œ, ํ†ต๊ณผํ•˜๋ฉด push๊ฐ€ ๋˜๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

โœ๏ธ Husky๋ฅผ ์ด์šฉํ•œ git hook ์ ์šฉํ•˜๊ธฐ


๐Ÿ” Jest

Jest๋ฅผ ํ†ตํ•œ ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ

Jest ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•˜์—ฌ API๋ฅผ ์ž‘์„ฑํ• ๋•Œ ํ•ด๋‹น API์— ๋Œ€ํ•ด์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ๋ฒ„๊ทธ๋ฅผ ๋น ๋ฅด๊ฒŒ ๊ฐ์ง€ํ•˜๊ณ  ์ฝ”๋“œ์˜ ์•ˆ์ •์„ฑ์„ ๋†’์˜€์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ husky๋ฅผ ํ†ตํ•ด push์ „์— ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜์—ฌ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜์ง€ ๋ชปํ•œ API๊ฐ€ ์žˆ์„์‹œ์— ์ฝ”๋“œ๊ฐ€ ๋ณ‘ํ•ฉ๋˜์ง€ ์•Š๊ฒŒ ์กฐ์น˜ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

โœ๏ธ Jest๋ฅผ ํ†ตํ•œ ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ


๐Ÿ” Docker

์ผ๊ด€์„ฑ ์žˆ๋Š” ๋ฐฐํฌ

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


ํšจ์œจ์ ์ธ ์ž์› ๊ด€๋ฆฌ

Docker๋Š” ํ˜ธ์ŠคํŠธ OS์™€ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ณต์œ ํ•˜์—ฌ ์‹คํ–‰๋˜์–ด ๊ฐ€์ƒํ™” ๋ฐฉ์‹์— ๋น„ํ•ด ๋” ์ ์€ ๋ฆฌ์†Œ์Šค๋ฅผ ์†Œ๋น„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ์˜ ์„œ๋น„์Šค๋ฅผ Docker๋กœ ์ปจํ…Œ์ด๋„ˆํ™” ํ•˜์—ฌ ๋” ํšจ์œจ์ ์ธ ์ž์› ๊ด€๋ฆฌ์™€ ๋†’์€ ์„œ๋ฒ„ ํ™œ์šฉ๋ฅ ์„ ์–ป์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

โœ๏ธ Docker๋ž€ ๋ฌด์—‡์ด๊ณ  ์™œ ์‚ฌ์šฉํ• ๊นŒ?


.dockerignore๋ฅผ ์ด์šฉํ•œ ์ด๋ฏธ์ง€ ๊ฒฝ๋Ÿ‰ํ™”

.dockerignore ์— Docker ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•  ๋•Œ ํฌํ•จํ•˜์ง€ ์•Š์„ ํŒŒ์ผ์ด๋‚˜ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ง€์ •ํ•˜์—ฌ, ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋ฅผ ๊ฒฝ๋Ÿ‰ํ™” ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

โœ๏ธ Docker ์ด๋ฏธ์ง€ ๊ฒฝ๋Ÿ‰ํ™” ํ•˜๊ธฐ


Docker-compose๋ฅผ ์ด์šฉํ•œ ์ปจํ…Œ์ด๋„ˆ ๊ด€๋ฆฌ

docker-compose.yml ํŒŒ์ผ์— ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ๋„คํŠธ์›Œํฌ, ๋ณผ๋ฅจ, ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋“ฑ์„ ์ •์˜ํ•˜์—ฌ. ๊ฐ€๋…์„ฑ์ด ์ข‹๊ฒŒ ํ•˜์˜€๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์„ฑ์„ ์ดํ•ดํ•˜๊ณ  ๊ณต์œ ํ•˜๊ธฐ ์‰ฝ๊ฒŒ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.


๐Ÿ” Github action

CI

docker/build-push-action@v4 ๋ฅผ ์ด์šฉํ•˜์—ฌ DockerFile์— ์ž‘์„ฑ๋œ ๋Œ€๋กœ ์šฐ๋ฆฌ์˜ ์„œ๋น„์Šค๋ฅผ ์ด๋ฏธ์ง€๋กœ ๋งŒ๋“ค์–ด Github packages์— ์ €์žฅ๋˜๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค.


CD

Github packages์— ์ €์žฅ๋œ ์ด๋ฏธ์ง€๋ฅผ appleboy/ssh-action@master ๋ฅผ ์ด์šฉํ•˜์—ฌ ์šฐ๋ฆฌ์˜ ํด๋ผ์šฐ๋“œ ์„œ๋ฒ„์— ์ ‘๊ทผํ•˜์—ฌ ์ด๋ฏธ์ง€๋ฅผ ์ปจํ…Œ์ด๋„ˆํ™” ํ•˜์—ฌ ์„œ๋น„์Šค๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.


Action secrets์„ ํ†ตํ•œ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๊ด€๋ฆฌ

Action secrets์— ์šฐ๋ฆฌ์˜ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋“ค์„ ๋„ฃ์–ด์„œ ์ด๋ฏธ์ง€๊ฐ€ ๋นŒ๋“œ๋ ๋•Œ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ์ฃผ์ž…ํ•˜์—ฌ .giitignore์— ํฌํ•จ๋˜์–ด GIthub์— ๋กœ๋“œ ๋˜์ง€ ์•Š๋˜ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋“ค์„ ๊ด€๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค.

โœ๏ธ Github-action์„ ํ†ตํ•œ CI/CD


๐Ÿ” Filebeat

Filebeat๋ฅผ ์ด์šฉํ•œ ๋กœ๊ทธ ์„œ๋น™

Winston.js๋กœ ๊ธฐ๋กํ•œ ์šฐ๋ฆฌ ์„œ๋ฒ„์˜ ๋กœ๊ทธ๋“ค์„ ๊ธฐ๋กํ•œ ํด๋”๋ฅผ volume์— ์—ฐ๊ฒฐํ•˜๊ณ  Filebeat ๋˜ํ•œ ์ปจํ…Œ์ด๋„ˆ๋กœ ์‹คํ–‰ํ•œ ๋‹ค์Œ volume์œผ๋กœ ์—ฐ๊ฒฐํ•˜์—ฌ ๋กœ๊ทธ๊ฐ€ ์Œ“์ผ๋•Œ๋งˆ๋‹ค Filebeat๊ฐ€ Elasticsearch๋กœ ์šฐ๋ฆฌ๋“ค์˜ ๋กœ๊ทธ๋ฅผ ๋ณด๋‚ด๊ฒŒ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

โœ๏ธ Filebeat๋ฅผ ์ด์šฉํ•ด ์„œ๋ฒ„ ๋กœ๊ทธ ์„œ๋น™ํ•˜๊ธฐ


๐Ÿ” Nginx

WAS์˜ ๋ถ€๋‹ด ์ค„์ด๊ธฐ

nginx ๋ฅผ ๋„์ž…ํ•˜์—ฌ ์ •์ ์ธ ์ปจํ…Œ์ธ ์— ๋Œ€ํ•ด์„  nginx ๊ฐ€ ์ฒ˜๋ฆฌํ•ด ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— Node.js๋กœ ๊ตฌ๋™๋˜๊ณ  ์žˆ๋Š” WAS์— ๋Œ€ํ•ด ๋ถ€๋‹ด์„ ์ค„์˜€์Šต๋‹ˆ๋‹ค.


Reverse proxy

nginx ๋ฅผ ์ด์šฉํ•ด http๋กœ 80๋ฒˆ port์— ๋“ค์–ด์˜จ ์š”์ฒญ๋“ค์— ๋Œ€ํ•ด์„œ ๋Œ€๋ฆฌ๋กœ ๋ฐ›์€ ๋‹ค์Œ, 443๋ฒˆ port๋กœ redirect์‹œ์ผœ์„œ ๋ณด๋‚ด์ฃผ๊ณ . reverse-proxy ๋ฅผ ์ด์šฉํ•ด 4000๋ฒˆ์—์„œ ์ž‘๋™ํ•˜๊ณ  ์žˆ๋Š” node.js์„œ๋ฒ„๋กœ ์š”์ฒญ์ด ๊ฐ€๊ฒŒ ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒย ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ๋Š”(reverse-proxy)๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„๋ฅผ ๊ฐ์ถ”๊ณ , SSL/TLS ์•”ํ˜ธํ™”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ „์†กํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

โœ๏ธ Http์™€ Https ๊ทธ๋ฆฌ๊ณ  SSL์€ ๊ฐ๊ฐ ๋ฌด์—‡์ผ๊นŒ? | โœ๏ธ Nginx๋ž€ ๋ฌด์—‡์ด๊ณ  ์™œ ์‚ฌ์šฉํ• ๊นŒ? | โœ๏ธ Nginx ์„ค์น˜ ๋ฐ Https ์ ์šฉํ•˜๊ธฐ


โš’๏ธย ๋ฌธ์ œํ•ด๊ฒฐ / ๊ฐœ์„ ์‚ฌํ•ญ

Redis์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋งค์ผ ๋‚ ๋ผ๊ฐ€๋ฒ„๋ฆฌ๋˜ ๋ฌธ์ œ ํ•ด๊ฒฐ

6379 port ์—์„œ ์ž‘๋™ํ•˜๊ณ  ์žˆ๋Š” redis ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์™ธ๋ถ€์˜ ์ ‘๊ทผ์„ ๋ฐ›์•„, ์ˆ˜์‹œ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ชจ๋‘ ๋‚ ๋ผ๊ฐ€ ๋ฒ„๋ฆฌ๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ•˜์˜€์Šต๋‹ˆ๋‹ค.

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

โœ๏ธ ๋ฐฉํ™”๋ฒฝ ์„ค์ • ๋•Œ๋ฌธ์— redis์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ญ์ œ๋˜๋˜ ๋ฌธ์ œ ํ•ด๊ฒฐ


์„œ๋ฒ„ ๋ฐฉํ™”๋ฒฝ ๊ฐ•ํ™”

๋ฐฉํ™”๋ฒฝ์„ ์ฐจ๋‹จํ•˜์—ฌ๋„, ๊ณ„์†ํ•ด์„œ ๊ณต๊ฒฉ์ด ๋“ค์–ด์™€ cloud๋‹จ๊ณผ os๋‹จ์˜ ๋ฐฉํ™”๋ฒฝ ๊ทœ์น™์„ ๊ฐ•ํ™”ํ•˜์—ฌ ์„œ๋ฒ„์— ์ ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.

โœ๏ธ ์„œ๋ฒ„ ๋ฐฉํ™”๋ฒฝ ์ •์ฑ… ๊ฐ•ํ™”ํ•˜๊ธฐ


static ๋ณ€์ˆ˜ ์„ ์–ธ ๋•Œ๋ฌธ์— ํ™˜๊ฒฝ๋ณ€์ˆ˜๊ฐ€ ๋กœ๋“œ๋˜์ง€ ์•Š๋˜ ๋ฌธ์ œ ํ•ด๊ฒฐ

dotenv.config()๋ฅผ ํ”„๋กœ์ ํŠธ ์ตœ์ƒ๋‹จ์— ์„ ์–ธํ•˜์˜€์ง€๋งŒ, ์‹ฑ๊ธ€ํ„ด์œผ๋กœ ์ž‘์„ฑํ•œ Redis๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€

dotenv.config() ๋ณด๋‹ค ๋จผ์ € ์‹คํ–‰๋˜์–ด, Redis์— ์—ฐ๊ฒฐ์ด ๋˜์ง€ ์•Š๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ•˜์˜€์Šต๋‹ˆ๋‹ค.

JavaScript์—์„œ static ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ํด๋ž˜์Šค๊ฐ€ ๋กœ๋“œ๋  ๋•Œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ดˆ๊ธฐํ™” ๋œ๋‹ค๋Š” ์‚ฌ

์‹ค์„ ์•Œ์•˜๊ณ , ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋กœ ์ˆ˜์ •ํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์˜€์Šต๋‹ˆ๋‹ค.

โœ๏ธ staic์œผ๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ์–ธ์ œ ๋กœ๋“œ๋˜๋Š”๊ฐ€?


4000ms ์†Œ์š”๋˜๋˜ API 1000ms๋กœ ๋‹จ์ถ•

Discord.js๋กœ 2000ms ์ด์ƒ ์†Œ์š”๋˜๋Š” API์— ๋Œ€ํ•ด ์•Œ๋ฆผ์„ ๋ณด๋‚ด๋„๋ก ํ•˜์˜€๋Š”๋ฐ, ์•Œ๋ฆผ์ด ์˜จ ๋ฌธ์ œ์˜ API์— ๋Œ€ํ•ด

์ƒ์„ฑ/์ˆ˜์ • ๋ณด๋‹จ ์กฐํšŒ๊ฐ€ ๋งŽ์ด ์ผ์–ด๋‚˜๋Š” ์„œ๋น„์Šค์ž„์„ ๊ฐ์•ˆํ•˜์—ฌ, ์ƒ์„ฑ๋‹จ์—์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—…์€ Database

table์— ์ƒˆ column์„ ์ถ”๊ฐ€ํ•˜๋Š” ์ž‘์—…์„ ํ†ตํ•ด ์ƒ์„ฑ ๋ฐ ์ˆ˜์ •์‹œ์— ์ฒ˜๋ฆฌํ•˜์˜€๊ณ , Promise.all์˜ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ์ด์šฉ

ํ•˜์—ฌ API ์ˆ˜ํ–‰์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

โœ๏ธ Promise.all๊ณผ DB column์ถ”๊ฐ€๋กœ ์ธํ•œ API ์†Œ์š”์‹œ๊ฐ„ ๋‹จ์ถ•

About

๐Ÿงญ ์œ„์น˜๊ธฐ๋ฐ˜ ์นดํŽ˜/์‹๋‹น ์ถ”์ฒœ ์›น ์„œ๋น„์Šค with node.js

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published