๐Ÿ’โ€โ™‚๏ธ blegram v 3.0.0

๋ฐ•์ƒ์€ยท2022๋…„ 6์›” 5์ผ
0

๐Ÿƒ blegram

๋ชฉ๋ก ๋ณด๊ธฐ
1/20

๐Ÿ‘‰ blegram ์ž‘๋ช… ์ด์œ 

์ ‘๋‘์‚ฌ์ธ ble๋Š” GitHub์˜ ๋‹‰๋„ค์ž„( 1-blue )์—์„œ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค.
๊ทธ๋ƒฅ blue๋Š” ๋„ˆ๋ฌด ์œ ๋ช…ํ•œ ๋‹จ์–ด๋ผ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ด๋ฏธ ๋„๋ฉ”์ธ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์–ด์„œ blue ์ค‘์— ์กฐํ•ฉํ•ด์„œ ble๋งŒ ์ถ”์ถœํ•ด์„œ ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์˜ ์ ‘๋‘์‚ฌ๋กœ ์‚ฌ์šฉ ์ค‘์ž…๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  gram์€ instargram์—์„œ ๊ฐ€์ ธ์™€์„œ ble์™€ gram์„ ํ•ฉ์ณ์„œ ํ”„๋กœ์ ํŠธ๋ช…์œผ๋กœ ์ž‘๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ํ”„๋ก ํŠธ์šฉ๊ณผ ๋ฐฑ์—”๋“œ์šฉ์œผ๋กœ ๋‘ ๊ฐœ๋ฅผ ์‚ฌ์šฉ ์ค‘์ด๋ผ ํ•œ ๋‹ฌ ๋‚ด๋‚ด ์‚ฌ์šฉํ•˜๋ฉด ๊ณผ๊ธˆ์ด ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งค๋‹ฌ 1์ผ ~ 15์ผ๊นŒ์ง€๋งŒ ํŽ˜์ด์ง€๋ฅผ ์—ด์–ด๋‘˜ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ› ๏ธ ํ”„๋ก ํŠธ์—์„œ ์‚ฌ์šฉํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

1. Next.js

SNS์ธ ๋งŒํผ ๊ฒ€์ƒ‰์—”์ง„์— ์˜ํ•ด ํฌ๋กค๋ง ๋˜๋„๋ก ์ฒ˜๋ฆฌํ•ด์ค˜์•ผ ํ•˜๋ฏ€๋กœ SSR๊ณผ SSG๋ฅผ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” Next.js๋ฅผ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ํŽ˜์ด์ง€ ๋ผ์šฐํŒ…, ์ด๋ฏธ์ง€ ์ตœ์ ํ™” ๋“ฑ๋“ฑ ๋งŽ์€ ๊ธฐ๋Šฅ์„ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
( + Next.js ์‚ฌ์šฉ๋ฒ• ๊ณต๋ถ€๋ฅผ ์œ„ํ•ด์„œ )

2. Redux + Redux-saga

์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด์„œ Redux๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์™€ ๊ฐ์ข… ์œ ์šฉํ•œ ์ดํŽ™ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด redux-saga๋ฅผ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

Flux ํŒจํ„ด์— ๋Œ€ํ•ด ์ดํ•ดํ•˜๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ–ˆ๊ณ , Next.js์— Redux๋ฅผ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ตฌ๊ธ€๋ง๊ณผ ์ธํ”„๋Ÿฐ - nodebird๋ฅผ ๋ณด๊ณ  ํ•™์Šตํ–ˆ์Šต๋‹ˆ๋‹ค.

Redux-Toolkit ์‚ฌ์šฉ์œผ๋กœ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

Flux ํŒจํ„ด์ด๋ž€ action์„ dispatchํ•ด์„œ reducer์—์„œ ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์šด state๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ์‹์„ ๋งํ•ฉ๋‹ˆ๋‹ค.
๋‹จ๋ฐฉํ–ฅ์œผ๋กœ๋งŒ ๋ฐ์ดํ„ฐ๊ฐ€ ํ๋ฅด๊ณ , ํŠน์ • ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด์„œ๋งŒ state๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์ด ๊ผฌ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

3. styled-components

์œ ๋ช…ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ธฐ๋„ ํ•˜๊ณ  theme์ด๋‚˜ globalStyle๊ฐ™์€ ์ข‹์€ ๊ธฐ๋Šฅ๋„ ์ œ๊ณตํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— styled-components๋ฅผ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

์ฒ˜์Œ์— ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์ •๋ง ํŽธํ•˜๊ณ  ์ข‹์•˜๋Š”๋ฐ ์‚ฌ์šฉํ• ์ˆ˜๋ก JS ์ฝ”๋“œ๊ฐ€ ๋งŽ์•„์ ธ์„œ ๋ถˆํŽธํ•จ์ด ๋Š๊ปด์กŒ์Šต๋‹ˆ๋‹ค.
( ์ตœ๊ทผ์— tailwindCSS๋ฅผ ๊ณต๋ถ€ํ•˜๊ณ  ์‚ฌ์šฉํ•ด๋ดค๋Š”๋ฐ ๋„ˆ๋ฌด ์ข‹์•„์„œ styled-components ์‚ฌ์šฉํ•˜๋ฉด์„œ ๋„ˆ๋ฌด ๋ถˆํŽธํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Œ )

4. TypeScript

์ด์ „๊นŒ์ง€๋Š” ์ „๋ถ€ JavaScript๋กœ ๊ฐœ๋ฐœํ–ˆ์ง€๋งŒ, ์ตœ๊ทผ์— TypeScript๋ฅผ ๊ณต๋ถ€ํ•˜๊ธฐ๋„ ํ–ˆ๊ณ , 4๊ฐœ์›” ์ •๋„ ์ง€๋‚˜์„œ ์ •๋ฆฌ๋ฅผ ์œ„ํ•ด ๋‹ค์‹œ ์ฝ”๋“œ๋ฅผ ๋ดค์„ ๋•Œ ๋„ˆ๋ฌด ์ฝ”๋“œ ์ฝ๊ธฐ๊ฐ€ ํž˜๋“ค์–ด์„œ ์ด์ „ ์ฝ”๋“œ๋Š” ์ „๋ถ€ ๋ฒ„๋ฆฌ๊ณ  TypeScript๋ฅผ ์ ์šฉํ•ด์„œ ๋‹ค์‹œ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ( ๋‹ค์‹œ ๋งŒ๋“ค ๋•Œ ๋Œ€๋ถ€๋ถ„ TypeScript๋ฅผ ์ ์šฉํ•ด์„œ ์žฌ์‚ฌ์šฉ ํ–ˆ์Œ )

TypeScript๋กœ ๊ฐœ๋ฐœํ•˜๊ฒŒ ๋˜๋ฉด ์ž๋™์™„์„ฑ์„ ์ง€์›ํ•ด์ฃผ๊ธฐ๋„ ํ•˜๊ณ  ๋ฐ์ดํ„ฐ์˜ ํ˜•ํƒœ๋ฅผ ์‰ฝ๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์–ด์„œ ์ด๋ฒˆ์— ์ ์šฉํ•˜๋ฉด ๋‹ค์Œ์— ์ฝ์„ ๋•Œ๋„ ๋งŽ์ด ๋„์›€ ๋  ๊ฑฐ๋ผ๊ณ  ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.

5. ๋‚˜๋จธ์ง€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค

  1. react-toastify: ํ† ์ŠคํŠธ ๋ฉ”์‹œ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ์„ ํƒ
  2. react-slick, slick-carousel: carousel๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์„ ํƒ
  3. react-hook-form: form ๊ด€๋ จ ์ฒ˜๋ฆฌ๋ฅผ ์‰ฝ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์„ ํƒ
  4. socket.io-client: DM์„ ์œ„ํ•ด์„œ ์„ ํƒ

โš’๏ธ ๋ฒก์—”๋“œ์—์„œ ์‚ฌ์šฉํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

1. express

์„œ๋ฒ„๋ฅผ ๋”์šฑ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

2. sequelize

ORM์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.
JavaScript๋งŒ์„ ์ด์šฉํ•ด์„œ DB๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ณ  ๋ชจ๋ธ๋ง, ๊ด€๊ณ„, ํ—ฌํผ ํ•จ์ˆ˜ ๋“ฑ์˜ ๋งŽ์€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด์ค˜์„œ ์‚ฌ์šฉ๋ฒ•๋งŒ ์ตํžˆ๋ฉด ์ •๋ง ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ตœ๊ทผ์— prisma๋ฅผ ์‚ฌ์šฉํ•ด๋ดค๋Š”๋ฐ prisma studio๊ฐ€ ๋„ˆ๋ฌด ์œ ์šฉํ•˜๊ณ  ๋ชจ๋ธ๋ง๋„ ๋” ํŽธํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  typescript์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋ฉด ์ •๋ง ํŽธํ•ด์„œ ์•ž์œผ๋กœ๋Š” sequelize๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค.

3. passport

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

4. multer, multer-s3, aws-sdk, AWS-S3

์ธ์Šคํƒ€๊ทธ๋žจ ํด๋ก ์ธ ๋งŒํผ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ด๋ฏธ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.
multer๋ฅผ ์ด์šฉํ•ด์„œ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ณด๋‚ธ ์ด๋ฏธ์ง€๋ฅผ ๋ฐ›๊ณ  multer-s3, aws-sdk๋ฅผ ํ†ตํ•ด์„œ ์ •์ ์ธ ์ด๋ฏธ์ง€๋ฅผ AWS-S3์— ์ €์žฅํ•˜๊ณ  ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

5. socket.io

DM ๊ธฐ๋Šฅ ์ฆ‰ ์ฑ„ํŒ…์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.
์•„์ง webSocket์„ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๋ ค๊ณ  ๊ณต๋ถ€ํ•˜์ง€ ์•Š์•„์„œ ๋‹จ์ˆœํ•œ 1 : 1 ์ฑ„ํŒ… ๊ธฐ๋Šฅ(ํ…์ŠคํŠธ)๋งŒ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.
์ดํ›„์— ์ถ”๊ฐ€๋กœ ์ž‘์—…ํ•  ๋•Œ ์ด๋ฏธ์ง€ ์ฒจ๋ถ€ ๋ฐ ๋‹ค์ˆ˜์˜ ์ฑ„ํŒ…๋ฐฉ์— ๋Œ€ํ•œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด๋ณผ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค.

๐Ÿ‘€ ๊ตฌํ˜„ํ•œ ๊ธฐ๋Šฅ

๋‚˜์ค‘์— ๊ฐ๊ฐ gif๋กœ ๋งŒ๋“ค์–ด์„œ ์—…๋กœ๋“œํ•  ์˜ˆ์ •

  1. ์œ ์ € CRUD
  2. ๊ฒŒ์‹œ๊ธ€ CRD
  3. ๋Œ“๊ธ€/๋‹ต๊ธ€ CRD
  4. ๊ฒŒ์‹œ๊ธ€/๋Œ“๊ธ€/๋‹ต๊ธ€ ์ข‹์•„์š” CRD
  5. ๋ถ๋งˆํฌ CRD
  6. ํ•ด์‹œํƒœ๊ทธ CR
  7. ํŒ”๋กœ์šฐ CRD
  8. ์ฑ„ํŒ…๋ฐฉ CRD
  9. ์ฑ„ํŒ… CR

๐Ÿš€ ๋ฐฐํฌ

๋ฌด๋ฃŒ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” AWS-EC2๋ฅผ ์ด์šฉํ•ด์„œ ๋ฐฐํฌํ–ˆ์Šต๋‹ˆ๋‹ค.
ubuntu 20.04๋ฅผ ์„ ํƒํ–ˆ๊ณ , Git/GitHub๊ณผ Node/NPM์„ ์ด์šฉํ•ด์„œ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์™”๊ณ , nginx์™€ certbot์„ ์ด์šฉํ•ด์„œ HTTPS๋ฅผ ์ ์šฉํ•˜๊ณ , Mysql์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

1. node ์„ค์น˜ ( ์ฐธ๊ณ  )

curl -sL https://deb.nodesource.com/setup_16.x | sudo bash -E -
sudo apt install -y nodejs

2. mysql ์„ค์น˜ ( ์ฐธ๊ณ  )

sudo apt install mysql-server

3. nginx ์„ค์น˜ ( ์ฐธ๊ณ  )

sudo apt-get install nginx

4. certbot ์„ค์น˜ ( ์ฐธ๊ณ  )

sudo snap install certbot --classic

5. https ์ ์šฉ ( ์ฐธ๊ณ  )

sudo certbot --nginx

6. nginx ์„ค์ •

# nginx ์„ค์ • ํŒŒ์ผ ์—ด๊ธฐ
sudo vim /etc/nginx/nginx.conf

# "http { ... }" ๋‚ด๋ถ€์— ์•„๋ž˜ ์ฝ”๋“œ ์ž‘์„ฑ
server {
    server_name blegram.com; # ์—ฌ๊ธฐ์— ์‚ฌ์šฉํ•  ๋„๋ฉ”์ธ ์ž‘์„ฑ
}
# ์œ„ ์ฝ”๋“œ๋งŒ ์ž‘์„ฑํ–ˆ๋‹ค๋ฉด "sudo certbot --nginx"๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ์ž๋™์œผ๋กœ URL์„ ์ธ์‹ํ•ด์„œ ์„ ํƒํ•˜๋„๋ก ๋ณด๊ธฐ๋ฅผ ์ œ๊ณตํ•จ
# ๊ตณ์ด ์œ„์— ์ฝ”๋“œ๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ  ์ง์ ‘ URL์„ ์ ์–ด์ค˜๋„ ์ƒ๊ด€์—†์Œ

# sudo certbot --nginx ๋ช…๋ น์–ด ์‹คํ–‰ ํ›„ ์„ฑ๊ณตํ–ˆ๋‹ค๋ฉด "server { ... }"์— ์•„๋ž˜ ์ฝ”๋“œ ์ถ”๊ฐ€
listen 80;
location / {
	proxy_set_header HOST $host;
	# proxy_pass "https๋กœ ์ ‘๊ทผ์ด ์˜ค๋ฉด ๋ณด์—ฌ์ค„ ํฌํŠธ";
	proxy_pass http://127.0.0.1:3000;  # ์—ฌ๊ธฐ์— ํ˜„์žฌ ์‚ฌ์šฉํ•˜๋Š” ํฌํŠธ ์ž‘์„ฑ
	proxy_redirect off;
    
    # socket.io ( webSocket )์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์•„๋ž˜ ์ฝ”๋“œ๋„ ์ž‘์„ฑ
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

# ์ด๋ฏธ์ง€ ๊ฐ™์€ ํŒŒ์ผ์„ ์ฒ˜๋ฆฌํ•ด์•ผํ•ด์„œ ์ „์†ก ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์„ ๊ฒฝ์šฐ http { ... }์— ์•„๋ž˜ ์ฝ”๋“œ ์ž‘์„ฑ
client_max_body_size 20M;	# ์›ํ•˜๋Š” ํฌ๊ธฐ๋กœ ์„ค์ •

# nginx.conf๋ฅผ ๋ฐ”๊ฟจ๋‹ค๋ฉด nginx๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•ด์ค˜์•ผ ์ ์šฉ/์—๋Ÿฌ๊ฐ€ ์ ์šฉ๋จ

# ์ธ์ฆ์„œ ์žฌ๋ฐœ๊ธ‰ ( ํ…Œ์ŠคํŠธ / ์žฌ๋ฐœ๊ธ‰ )
sudo certbot renew --dry-run
sudo certbot renew

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