์ •์  ๋ชจ๋“ˆ vs ๋™์  ๋ชจ๋“ˆ

์ •์  ๋ชจ๋“ˆ: Nginx ์ปดํŒŒ์ผ ์‹œ ์†Œ์Šค์ฝ”๋“œ์— ํฌํ•จ๋˜์–ด ํ•จ๊ป˜ ๋นŒ๋“œ๋˜๋ฉฐ, ํ•ญ์ƒ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ๋˜์–ด ์žˆ์–ด์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐจ์ง€ํ•œ๋‹ค. ์ •์ ๋ชจ๋“ˆ์€ ์ ์šฉ ์‹œ ๋ฌด์ค‘๋‹จ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

๋™์  ๋ชจ๋“ˆ: ๋ณ„๋„์˜ .so ํŒŒ์ผ๋กœ ์ปดํŒŒ์ผ๋˜์–ด ํ•„์š”ํ•  ๋•Œ๋งŒ ๋กœ๋“œํ•˜๋ฉฐ ์œ ์—ฐ์„ฑ์ด ๋†’๊ณ  ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์ ์ด๋‹ค. ๋™์ ๋ชจ๋“ˆ์€ ์ ์šฉ ์‹œ ๋ฌด์ค‘๋‹จ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

๋™์ ๋ชจ๋“ˆ ์˜ˆ์‹œ

 

  • ngx_http_image_filter_module: ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ
  • ngx_http_geoip_module: IP ๊ธฐ๋ฐ˜ ์ง€๋ฆฌ ์ •๋ณด
  • ngx_http_xslt_module: XML/XSLT ๋ณ€ํ™˜
  • ngx_stream_module: TCP/UDP ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ
  • ngx_http_perl_module: Perl ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰

 

so ํŒŒ์ผ์€ ๋ญ˜๊นŒ?

.so ํŒŒ์ผ์€ Shared Object ํŒŒ์ผ์ด๋ฉฐ, ๋ฆฌ๋ˆ…์Šค/์œ ๋‹‰์Šค ์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋™์  ๋งํฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Dynamic Link Library) ํŒŒ์ผ์ด๋‹ค. ๋™์ ๋ชจ๋“ˆ ์ตœ์ข… ํŒŒ์ผ์ด๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

 

๋™์ ๋ชจ๋“ˆ์˜ ์žฅ์ 

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

 

1. ๋™์ ๋ชจ๋“ˆ ์†Œ์Šค ๋‹ค์šด๋กœ๋“œ

nginx version์„ ํ™•์ธํ•ด์„œ ์ด์™€ ๋งž๋Š” ๋ชจ๋“ˆ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๋‹ค์šด๋ฐ›์•„ ์„œ๋ฒ„์— ์—…๋กœ๋“œ ํ•œ ๋’ค ํŒŒ์ผ์˜ ์••์ถ•์„ ํ‘ผ๋‹ค.

๋‚˜๋Š” nginx version์ด 1.28์ด๋ผ์„œ ํ•ด๋‹น tar.gz ํŒŒ์ผ์„ ๋‹ค์šด๋ฐ›์•˜๋‹ค. (๋ฒ„์ „์ด ๋งž์ง€ ์•Š๋Š”๋‹ค๋ฉด nignx -t์—์„œ ์˜ค๋ฅ˜ ๋ฐœ์ƒํ•˜๊ธฐ์— ๋ฒ„์ „ ํ™•์ธ ํ•„์ˆ˜!)

C ํŒŒ์ผ(.c)๊ณผ ํ—ค๋” ํŒŒ์ผ(.h), config ํŒŒ์ผ ๋“ฑ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.

๊ณต์‹ ๋‹ค์šด๋กœ๋“œ ์‚ฌ์ดํŠธ: https://nginx.org/download/

tar -xzvf nginx-1.28.0.tar.gz

 

 

2. ๋™์ ๋ชจ๋“ˆ ๋นŒ๋“œ

๋™์ ๋ชจ๋“ˆ์„ ๋นŒ๋“œํ• ๋•Œ ๊ฐ์ข… ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋Š”๋ฐ ๋ณดํ†ต ์˜์กด์„ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์„ค์น˜๋˜์–ด์žˆ์ง€ ์•Š์•„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

์–ด๋–ค ๋ชจ๋“ˆ์ธ์ง€์— ๋”ฐ๋ผ ํ•„์š”ํ•œ ์˜์กด์„ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๊ฐ๊ฐ ๋‹ค๋ฅด๋ฉฐ, ์˜ค๋ฅ˜ ๋ฌธ๊ตฌ์—์„œ ๋‚˜์˜ค๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜๋ฉด ๋œ๋‹ค.

# Nginx ์†Œ์Šค ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™
cd /usr/local/src/nginx-1.28.0

# configure ์‹คํ–‰ (๋™์  ๋ชจ๋“ˆ ์ถ”๊ฐ€)
# ์˜์กด์„ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜๊ฐ€ ๋ชจ๋‘ ์™„๋ฃŒ๋˜์–ด์•ผ ์˜ค๋ฅ˜์—†์ด ์‹คํ–‰ ๊ฐ€๋Šฅ
./configure --with-compat --with-http_xslt_module=dynamic

# ๋ชจ๋“ˆ์— ๋”ฐ๋ผ ์‹คํ–‰ ๋ฌธ๋ฒ• ํ™•์ธ
./configure --help | grep {๋ชจ๋“ˆ๋ช…}

# ๋ชจ๋“ˆ๋งŒ ๋นŒ๋“œ
# ์ด ๋ช…๋ น์œผ๋กœ .so ํŒŒ์ผ(๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)์ด ์ƒ์„ฑ 
# ๋นŒ๋“œ๋œ .so ํŒŒ์ผ์€ objs/ ๋””๋ ‰ํ† ๋ฆฌ์— ์ƒ์„ฑ
make modules

# ๋นŒ๋“œ๋œ .so ํŒŒ์ผ์„ ๋ชจ๋“ˆ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ๋ณต์‚ฌ
# ๋ชจ๋“ˆ์„ ๋นŒ๋“œํ•˜๋ฉด nginx-1.28.0/objs ๋””๋ ‰ํ† ๋ฆฌ ๋ฐ‘์— so ํŒŒ์ผ์ด ์ƒ์„ฑ๋œ๋‹ค.
cp objs/ngx_http_geoip2_module.so /usr/lib64/nginx/modules/

 

โญ ๋™์ ๋ชจ๋“ˆ ๋นŒ๋“œ ์˜ต์…˜ ์„ค๋ช…

./configure

Nginx ๋นŒ๋“œ ํ™˜๊ฒฝ์„ ์„ค์ •ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ์ž…๋‹ˆ๋‹ค. Makefile์„ /usr/local/src/nginx-1.28.0 ๋””๋ ‰ํ† ๋ฆฌ ์•ˆ์— ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

--with-compat

ํ˜ธํ™˜์„ฑ ๋ชจ๋“œ ํ™œ์„ฑํ™”

  • Nginx ๋ฐ”์ด๋„ˆ๋ฆฌ์™€ ๋™์  ๋ชจ๋“ˆ ๊ฐ„์˜ ABI(Application Binary Interface) ํ˜ธํ™˜์„ฑ์„ ๋ณด์žฅ ( ์ด๋ฏธ ์„ค์น˜๋œ Nginx์— ๋‚˜์ค‘์— ๋™์  ๋ชจ๋“ˆ๋งŒ ๋”ฐ๋กœ ์ถ”๊ฐ€ํ•  ๋•Œ ํ•„์ˆ˜ ์˜ต์…˜)
  • ์ด๊ฒŒ ์—†์œผ๋ฉด ๋ชจ๋“ˆ์ด ์ œ๋Œ€๋กœ ๋กœ๋“œ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ

--with-http_xslt_module=dynamic

XSLT ๋ชจ๋“ˆ์„ ๋™์  ๋ชจ๋“ˆ๋กœ ๋นŒ๋“œ

  • ๋ชจ๋“ˆ์— ๋”ฐ๋ผ์„œ --with-{๋ชจ๋“ˆ๋ช…}=dynamic ํ˜•์‹
  • --with-http_xslt_module: XSLT ๋ชจ๋“ˆ ํฌํ•จ
  • =dynamic: ์ •์ ์ด ์•„๋‹Œ ๋™์  ๋ชจ๋“ˆ(.so ํŒŒ์ผ)๋กœ ๋นŒ๋“œํ•˜๋ผ๋Š” ์˜๋ฏธ
  • =dynamic์„ ์•ˆ ๋ถ™์ด๋ฉด ์ •์  ๋ชจ๋“ˆ๋กœ ์ปดํŒŒ์ผ๋˜๋ฉฐ, make modules์ด ์•ˆ ๋จนํžˆ๊ณ , so ํŒŒ์ผ๋„ ์•ˆ ๋งŒ๋“ค์–ด์ง„๋‹ค.

3. ๋ชจ๋“ˆ ๋กœ๋“œ ๋ฐ ์‚ฌ์šฉ

# nginx.conf ํŒŒ์ผ ์ˆ˜์ •
vi /etc/nginx/nginx.conf

# nginx.conf ํŒŒ์ผ ์ตœ์ƒ๋‹จ์— ์ถ”๊ฐ€
# ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•จ
include /usr/share/nginx/modules/*.conf;

 

/usr/share/nginx/modules/ ์•ˆ์— conf ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์„œ ๋ชจ๋“ˆ์„ ๋กœ๋“œํ•œ๋‹ค.

# conf ํŒŒ์ผ ์ƒ์„ฑ ํ›„ ํŒŒ์ผ ์•ˆ์— load_module ์ถ”๊ฐ€
vi /usr/share/nginx/modules/mod-http-image-filter.conf

# ํŒŒ์ผ ์•ˆ์— ์ถ”๊ฐ€
load_module "/usr/lib64/nginx/modules/ngx_http_image_filter_module.so";

 

4. ์„ค์ • ํ™•์ธ ๋ฐ ์žฌ์‹œ์ž‘

# ์„ค์ • ํŒŒ์ผ ๋ฌธ๋ฒ• ๊ฒ€์‚ฌ
nginx -t

# Nginx ์žฌ์‹œ์ž‘ (๋ฌด์ค‘๋‹จ)
systemctl reload nginx

 

์„ค์ •ํŒŒ์ผ ๋ฌธ๋ฒ• ๊ฒ€์‚ฌ ์‹œ, ์•„๋ž˜์™€ ๊ฐ™์ด OK์™€ successful์„ ํ™•์ธํ–ˆ๋‹ค๋ฉด ์žฌ์‹œ์ž‘ํ•œ๋‹ค.

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

 

 

์ •์ /๋™์ ์— ๋”ฐ๋ฅธ Nginx ์žฌ์‹œ์ž‘ ๋ฐฉ๋ฒ•

# ์ •์ ๋ชจ๋“ˆ: Nginx ๋ฐ”์ด๋„ˆ๋ฆฌ ์ž์ฒด๊ฐ€ ๊ต์ฒด๋˜๋ฏ€๋กœ ์žฌ์‹œ์ž‘ ํ•„์š” (์ค‘์ง€ ๋ฐœ์ƒ)
systemctl restart nginx  

# ๋™์ ๋ชจ๋“ˆ: .so ํŒŒ์ผ๋งŒ ๊ต์ฒด ํ›„ reload๋งŒ์œผ๋กœ ๊ฐ€๋Šฅ (๋ฌด์ค‘๋‹จ)
systemctl reload nginx

์šฐ์„  Nginx ์„ค์ • ํŒŒ์ผ์€ ํฌ๊ฒŒ 2๊ฐ€์ง€๋กœ ๋‚˜๋‰œ๋‹ค.

๊ตฌ์กฐ๋ฅผ ๋‚˜๋ˆ”์œผ๋กœ์จ ์šด์˜ ์˜ํ–ฅ๋„๋ฅผ ์ค„์ด๊ณ  ์„ค์ • ์ถฉ๋Œ ๋ฐฉ์ง€, ์„œ๋น„์Šค ์ถ”๊ฐ€/์‚ญ์ œ๊ฐ€ ์‰ฌ์šฐ๋ฉฐ ๋กค๋ฐฑ์ด ์‰ฝ๋‹ค.

 

nginx ์„ค์ • ๊ตฌ์กฐ

/etc/nginx/
โ”œโ”€โ”€ nginx.conf          # ๋ฉ”์ธ ์„ค์ • ํŒŒ์ผ
โ”œโ”€โ”€ conf.d/                # ์„œ๋ฒ„๋ณ„ ์„ค์ • include
โ”‚   โ”œโ”€โ”€ default.conf
โ”‚   โ””โ”€โ”€ api.conf

โ”‚   โ””โ”€โ”€ web.conf

 

 

์ˆ˜์ • ์‹œ ์˜ํ–ฅ๋„ ํ™•์ธ

  • nginx.conf ์ˆ˜์ • → nginx ์ „์ฒด ์˜ํ–ฅ
  • conf.d/*.conf ์ˆ˜์ • → ํ•ด๋‹น ์„œ๋น„์Šค๋งŒ ์˜ํ–ฅ

 

 

1. ๋ฉ”์ธ ์„ค์ • (Main Config) - /etc/nginx/nginx.conf 

-> nginx ์ „์ฒด ํ”„๋กœ์„ธ์Šค/๋™์ž‘ ๋ฐฉ์‹์„ ์ •์˜ํ•˜๋Š” ๋ฃจํŠธ ์„ค์ •

 

1-1. ์ „์—ญ(Global) ์„ค์ •

user  nginx;
worker_processes  auto;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

 

  • user : nginx ํ”„๋กœ์„ธ์Šค ์‹คํ–‰ ๊ณ„์ •
  • worker_processes : ์›Œ์ปค ํ”„๋กœ์„ธ์Šค ๊ฐœ์ˆ˜
  • error_log : ์—๋Ÿฌ ๋กœ๊ทธ
  • pid : PID ํŒŒ์ผ

2-2. ์ด๋ฒคํŠธ ๋ธ”๋ก

๋™์‹œ์— ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅํ•œ ์ปค๋„ฅ์…˜ ์ˆ˜

events {
    worker_connections  1024;
}

 

2-3. http ๋ธ”๋ก

HTTP ์„œ๋ฒ„ ์ „์—ญ ์„ค์ •

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format main '$remote_addr - $remote_user ...';
    access_log /var/log/nginx/access.log main;

    sendfile        on;
    keepalive_timeout 65;

    include /etc/nginx/conf.d/*.conf; //์„œ๋น„์Šค ์„ค์ •ํŒŒ์ผ include
    
    map $http_upgrade $connection_upgrade {
    default upgrade;   # 1์ˆœ์œ„: ์•„๋ฌด๊ฒƒ๋„ ๋งค์นญ ์•ˆ ๋˜๋ฉด ์ด๊ฑฐ
    '' close;          # 2์ˆœ์œ„: ๋นˆ ๋ฌธ์ž์—ด์ด๋ฉด ์ด๊ฑฐ
    }
}
  • MIME ํƒ€์ž…
  • ๋กœ๊ทธ ํฌ๋งท
  • gzip
  • proxy ๊ด€๋ จ ๊ธฐ๋ณธ๊ฐ’
  • SSL ๊ธฐ๋ณธ๊ฐ’
  • upstream ์ •์˜ ๊ฐ€๋Šฅ
  • ์ค‘์š”! ์„œ๋น„์Šค๋ณ„ ์„ค์ •์„ ์ง์ ‘ ๋‹ค ๋„ฃ๊ธฐ๋ณด๋‹ค๋Š” include ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ตฌ์กฐ

 

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

  ์ผ๋ฐ˜ HTTP WebSocket
์—ฐ๊ฒฐ ์š”์ฒญํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ ์—ฐ๊ฒฐ ํ•œ ๋ฒˆ ์—ฐ๊ฒฐํ•˜๋ฉด ๊ณ„์† ์œ ์ง€
๋ฐฉํ–ฅ ํด๋ผ์ด์–ธํŠธ → ์„œ๋ฒ„ (๋‹จ๋ฐฉํ–ฅ) ์–‘๋ฐฉํ–ฅ ์ž์œ ๋กญ๊ฒŒ
์‚ฌ์šฉ ์˜ˆ ์›นํŽ˜์ด์ง€, REST API, ์ด๋ฏธ์ง€ ๋กœ๋”ฉ ์ฑ„ํŒ…, ์•Œ๋ฆผ, ๊ฒŒ์ž„, ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ

 

๋งŒ์•ฝ์— WebSoket์„ ์‚ฌ์šฉํ•˜๋Š” ์‹œ์Šคํ…œ์ด๋ผ๋ฉด ์„œ๋น„์Šค ์„ค์ • ํŒŒ์ผ ์•ˆ์— ํ•ด๋‹น Proxy header๊ฐ€ ๋“ค์–ด์žˆ์„๊ฒƒ์ด๋‹ค.

       proxy_set_header Upgrade $http_upgrade;
       proxy_set_header Connection $connection_upgrade;

 

๊ทธ๋ ‡๋‹ค๋ฉด ๋ฉ”์ธ ์„ค์ • ํŒŒ์ผ์˜ http ๋ธ”๋ก ์•ˆ์— ์•„๋ž˜ ์ฝ”๋“œ๊ฐ€ ๋“ค์–ด๊ฐ€์•ผํ•˜๋ฉฐ ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์˜ค๋ฅ˜ ๋ฐœ์ƒํ•œ๋‹ค.

    map $http_upgrade $connection_upgrade {
    default upgrade;   # 1์ˆœ์œ„: ์•„๋ฌด๊ฒƒ๋„ ๋งค์นญ ์•ˆ ๋˜๊ฑฐ๋‚˜ ๋นˆ ๋ฌธ์ž์—ด์ด ์•„๋‹ˆ๋ฉด ์ด๊ฑฐ
    '' close;          # 2์ˆœ์œ„: ๋นˆ ๋ฌธ์ž์—ด์ด๋ฉด ์ด๊ฑฐ
    }

 

์ผ€์ด์Šค 1: WebSocket ์š”์ฒญ

  • $http_upgrade = "websocket" (Upgrade ํ—ค๋” ๊ฐ’)
  • ๋งค์นญ ํ™•์ธ:
    • close ๋งค์นญ โŒ (๋นˆ ๋ฌธ์ž์—ด ์•„๋‹˜)
    • default upgrade ๋งค์นญ โญ•
  • ๊ฒฐ๊ณผ: $connection_upgrade = "upgrade"

์ผ€์ด์Šค 2: ์ผ๋ฐ˜ HTTP ์š”์ฒญ

  • $http_upgrade = "" (๋นˆ ๋ฌธ์ž์—ด, Upgrade ํ—ค๋” ์—†์Œ)
  • ๋งค์นญ ํ•™์ธ:
    • close ๋งค์นญ โญ• (์—ฌ๊ธฐ์„œ ๋!)
  • ๊ฒฐ๊ณผ: $connection_upgrade = "close"
  • default๋Š” ํ™•์ธ์กฐ์ฐจ ์•ˆ ํ•จ

์ผ€์ด์Šค 3: ์ด์ƒํ•œ ๊ฐ’์ด ๋“ค์–ด์˜จ ๊ฒฝ์šฐ

  • $http_upgrade = "something-weird"
  • ๋งค์นญ ํ™•์ธ:
    • close ๋งค์นญ โŒ (๋นˆ ๋ฌธ์ž์—ด ์•„๋‹˜)
    • default upgrade ๋งค์นญ โญ•
  • ๊ฒฐ๊ณผ: $connection_upgrade = "upgrade"

 

2. ์„œ๋น„์Šค ์„ค์ • (Service / Virtual Host) - /etc/nginx/conf.d/*.conf

HTTPS + WebSocket ์˜ˆ์‹œ

์•„๋ž˜ ์ฝ”๋“œ๋Š” nginx๋ฅผ proxy server๋กœ ์‚ฌ์šฉํ•œ ์˜ˆ์‹œ์ด๋‹ค.

server {
    listen 443 ssl;
    server_name chat.example.com;
    
    # SSL ํ•ด๋…์ฒ˜๋ฆฌ๋กœ HTTPS ์—ฌ๊ธฐ์„œ ์ฒ˜๋ฆฌ!
    ssl_certificate /etc/nginx/ssl/cert.pem;
    ssl_certificate_key /etc/nginx/ssl/key.pem;
    
    location / {
        proxy_pass http://localhost:8080; # proxy server
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade; # HTTP/WebSocket ์ฒ˜๋ฆฌ
        proxy_set_header Connection $connection_upgrade; # HTTP/WebSocket ์ฒ˜๋ฆฌ
        proxy_set_header Host $host;
    }
}

 

 

1. HTTPS ์š”์ฒญ (์ผ๋ฐ˜ ์›นํŽ˜์ด์ง€)

๋ธŒ๋ผ์šฐ์ € → https://chat.example.com (443 ํฌํŠธ)
         → nginx (SSL ํ•ด๋…)
         → http://localhost:8080 (ํ‰๋ฌธ HTTP๋กœ ์ „๋‹ฌ)

 

2. WebSocket ์—ฐ๊ฒฐ (wss://)

๋ธŒ๋ผ์šฐ์ € → wss://chat.example.com (443 ํฌํŠธ)
         → nginx (SSL ํ•ด๋… + WebSocket ์—…๊ทธ๋ ˆ์ด๋“œ)
         → ws://localhost:8080 (ํ‰๋ฌธ WebSocket์œผ๋กœ ์ „๋‹ฌ)

 

Proxy Server๋ž€ ๋ญ˜๊นŒ?

-> ์ค‘๊ฐ„ ๋‹ค๋ฆฌ ์—ญํ• ์„ ํ•ด์ฃผ๋Š” ์„œ๋ฒ„์ด๋‹ค.

-> Apache (with mod_proxy), Caddy, Envoy ๊ฐ™์€ Proxy Server๊ฐ€ ์กด์žฌํ•œ๋‹ค.

 

์‚ฌ์šฉ์ž ๋ธŒ๋ผ์šฐ์ € → nginx (80ํฌํŠธ) → Node.js ์•ฑ (3000ํฌํŠธ)

 

์‚ฌ์šฉ์ž๋Š” 80, 443 ์ธํ„ฐ๋„ท ํฌํŠธ๋งŒ ์•Œ๊ณ  ์ ‘์†ํ•˜๋ฉด ์•Œ์•„์„œ ์—ฌ๋Ÿฌ ์„œ๋ฒ„์˜ ํฌํŠธ๋กœ ์—ฐ๊ฒฐ์‹œ์ผœ์ค€๋‹ค.

 

  • ๋ณด์•ˆ: ์‹ค์ œ ์„œ๋ฒ„(3000ํฌํŠธ) ์ง์ ‘ ๋…ธ์ถœ ์•ˆ ํ•จ
  • ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ: ์—ฌ๋Ÿฌ ์„œ๋ฒ„์— ํŠธ๋ž˜ํ”ฝ ๋ถ„์‚ฐ
  • SSL ์ฒ˜๋ฆฌ: nginx๊ฐ€ HTTPS ์ฒ˜๋ฆฌ, ์•ฑ์€ HTTP๋งŒ
  • ์ •์  ํŒŒ์ผ: ์ด๋ฏธ์ง€ ๊ฐ™์€ ๊ฑด nginx๊ฐ€ ์ง์ ‘ ์„œ๋น™

์™œ nginx๊ฐ€ ์ •์  ํŒŒ์ผ ์„œ๋น™์— ๋น ๋ฅผ๊นŒ?

-> ์ด๋ฏธ์ง€ ์š”์ฒญ → nginx๊ฐ€ ๋””์Šคํฌ์—์„œ ๋ฐ”๋กœ ์ฝ์–ด์„œ ์ „์†กํ•˜๊ธฐ ๋•Œ๋ฌธ!

 

  • ์—„์ฒญ ๋น ๋ฆ„: C๋กœ ์ž‘์„ฑ๋จ, ํŒŒ์ผ ์ฝ๊ธฐ์— ์ตœ์ ํ™”
  • ๋ฐฑ์—”๋“œ ๋ถ€ํ•˜ ๊ฐ์†Œ: Node.js๊ฐ€ ํŒŒ์ผ ์ฒ˜๋ฆฌ ์•ˆ ํ•ด๋„ ๋จ ( ์ด๋ฏธ์ง€ ์š”์ฒญ → nginx → Node.js → ํŒŒ์ผ ์ฝ๊ธฐ → nginx → ๋ธŒ๋ผ์šฐ์ € ) 
  • ํšจ์œจ์  ๋ฉ”๋ชจ๋ฆฌ: ํŒŒ์ผ ์บ์‹ฑ, sendfile ์‹œ์Šคํ…œ์ฝœ ์‚ฌ์šฉ

 

 

'Server > Nginx' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

nginx ๋™์ ๋ชจ๋“ˆ(dynamic module) ๋นŒ๋“œํ•ด์„œ ์ ์šฉํ•˜๊ธฐ  (0) 2026.01.25

๐Ÿ’Ž Django Framework

ํŠน์ง•

  • MVT ํŒจํ„ด
  • ORM ๊ธฐ๋ฐ˜ ํ”„๋ ˆ์ž„์›Œํฌ

 

 

MVT ํŒจํ„ด์ด๋ž€?

Model: ๋ฐ์ดํ„ฐ ๊ด€๋ จ DB

View: Model๊ณผ View๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ๋ฉฐ, ํ•จ์ˆ˜ ์ •์˜

Tamplate: ์‹ค์ œ๋กœ ํ™”๋ฉด์„ ๋ณด์—ฌ์ฃผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค

 

ORM ๊ธฐ๋ฐ˜ ํ”„๋ ˆ์ž„์›Œํฌ๋ž€?

๊ฐ์ฒด ์ง€ํ–‰ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๊ฐ์ฒด๋ผ๋Š” ๊ฐœ๋…์„ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์™€ RDB์— ์“ฐ์ด๋Š” ๋ฐ์ดํ„ฐ์ธ ํ…Œ์ด๋ธ”์„ ์ž๋™์œผ๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์œผ๋กœ SQL๋ฌธ์ด ํ•„์š” ์—†๋‹ค.

 

์žฅ๊ณ  MVT ํŒจํ„ด๊ณผ ํŒŒ์ผ ๊ตฌ์กฐ

์žฅ๊ณ ๋Š” Urls.py์—์„œ ๋„˜์–ด์˜จ ์š”์ฒญ์„ View.py์˜ ํ•จ์ˆ˜์™€ ์—ฐ๊ฒฐ๋˜๊ณ  ํ•จ์ˆ˜์—์„œ model.py์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์™€์„œ ํ•จ์ˆ˜๋ฅผ ์ˆ˜ํ–‰ํ•œ ๋’ค render ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ template์— ๋”•์…”๋„ˆ๋ฆฌ ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ฒจ์ฃผ๊ณ  ๋„˜๊ฒจ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  html์—์„œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

Django์˜ ์žฅ์ 

  1. Python์˜ ๋‹ค์–‘ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜์—ฌ ๊ฐœ๋ฐœ ์†๋„๊ฐ€ ๋น ๋ฅด๊ณ  ์ƒ์‚ฐ์„ฑ์ด ํฌ๋‹ค
  2. ์ธ์ฆ, ๊ด€๋ฆฌ์™€ ๊ฐ™์€ ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋Šฅ๋“ค์ด ๊ธฐ๋ณธ ๋ชจ๋“ˆ๋กœ ์ œ๊ณต๋œ๋‹ค. -> ํŠนํžˆ Admin์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ด€๋ฆฌ

Django์˜ ๋‹จ์ 

  1. ์ธํ„ฐํ”„๋ฆฌํ„ฐ ์–ธ์–ด๋ผ์„œ ์‹คํ–‰ ์†๋„๊ฐ€ ๋А๋ฆฌ๋‹ค. -> ์„ฑ๋Šฅ์ด ๋–จ์–ด์ง„๋‹ค
  2. Django๋Š” ํ”„๋ ˆ์ž„์›Œํฌ ํŠนํ™” ๊ธฐ๋Šฅ๋ณด๋‹ค ptython์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ํŽธ์ด๋‹ค.

 

๐Ÿ’Ž Spring Framework

์ž๋ฐ” ํ”Œ๋žซํผ์„ ์œ„ํ•œ ์˜คํ”ˆ์†Œ์Šค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋ ˆ์ž„์›Œํฌ

 

ํŠน์ง•

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

 

MVC ํŒจํ„ด์—์„œ Model์€ 3๊ฐ€์ง€๋กœ ๋ถ„๋ฆฌ โ—

    • DAO (Data Access Object) -์‹ค์ œ๋กœ DB์— ์ ‘๊ทผํ•˜๋Š” ๊ฐ์ฒด (DB(DB ์ „์šฉ ๊ฐ์ฒด)
    • DTO (Data Transfer Object) – ๋ฐ์ดํ„ฐ ๊ตํ™˜์„ ์œ„ํ•œ ์ž๋ฐ” ๊ฐ์ฒด (๋ฐ์ดํ„ฐ๋ฅผ ๋ ˆ์ด์–ด ๊ฐ„ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด ๋ชฉ์ ์œผ๋กœ ์†์„ฑ์œผ๋กœ๋Š” Setter์™€ Getter์„ ๊ฐ€์ง€๊ณ  ์žˆ์Œ
    • Service ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ๋“ค์–ด๊ฐ€๋Š” ๋ถ€๋ถ„ (Controller๊ฐ€ ์ ์ ˆํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”service๋ฅผ ์„ ํƒํ•ด์„œ ์„ ํƒ๋œ service๊ฐ€ ์ ์ ˆํ•œ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์—ฌ ๋ฐ˜ํ™˜)

๐Ÿ‘€ Spring Framework ์‹คํ–‰ ํ๋ฆ„๋„

Request -> DispatcherServlet -> HandlerMapping -> (Controller -> Service -> DAO -> DB -> DAO -> Service -> Controller) -> DispatcherServlet -> ViewResolver -> View -> DispatcherServlet -> Response

 

์ž์„ธํžˆ ๋ณด๊ธฐ

  1. ํด๋ผ์ด์–ธํŠธ๊ฐ€ Request ์š”์ฒญ ์‹œ DispatcherServlet์ด web.xml์—  ๋“ฑ๋ก๋œ ๋‚ด์šฉ์„ ๊ฐ€๋กœ์ฑˆ๋‹ค. ์ตœ์ดˆ์˜ web.xml ์—์„œ๋Š” ์ด '/' default๋ผ์„œ ์ด ๋ฒ”์œ„๋ฅผ ๋ฐ”๊ฟ”์ฃผ๋ฉด ํŠน์ • URL๋งŒ ์ ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.
  2. DispatcherServlet์ด ๊ฐ€๋กœ์ฑˆ ์š”์ฒญ์„ HandlerMapping์—๊ฒŒ ๋ณด๋‚ด ํ•ด๋‹น ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” Controller๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ
  3. ์‹ค์ œ ๋กœ์ง ์ฒ˜๋ฆฌ
  4. ๋กœ์ง ์ฒ˜๋ฆฌ ํ›„ ViewResolver๋ฅผ ํ†ตํ•ด ViewResolver๊ฐ€ view ํ™”๋ฉด์„ ์ฐพ๋Š”๋‹ค.
  5. ์ฐพ์€ View ํ™”๋ฉด์€ View์— ๋ณด๋‚ด๋ฉด ์ด ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์‹œ DispatcherServlet์—๊ฒŒ ๋ณด๋‚ด๊ณ  DispatcherServlet๋Š” ์ตœ์ข… ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „์†กํ•œ๋‹ค.

 

Spring FrameWork ์žฅ์ 

  • ํ”„๋ ˆ์ž„์›Œํฌ ํŠนํ™” ๊ธฐ๋Šฅ๋“ค์ด ๋งŽ์•„์„œ ๊ฐ„๋‹จํ•œ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ณต์žกํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Œ
  • AOP -> ์ฝ”๋“œ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์ž‘์„ฑ ๊ฐ€๋Šฅ, ์žฌ์‚ฌ์šฉ์„ฑ ์˜ฌ๋ผ๊ฐ
  • DI -> ์„ค์ • ํŒŒ์ผ ๋ถ€๋ถ„์—์„œ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ง€๊ณ  ์˜ค๋‹ˆ๊นŒ๋Š” ๋‹ค์–‘ํ•œ DB ์‚ฌ์šฉ, DB๋งˆ๋‹ค ๋ฉ”์„œ๋“œ ๋ฐ”๊ฟ€ ํ•„์š” ์—†์Œ

 

Spring FrameWork ๋‹จ์ 

  • Spring Boot๊ฐ€ ์•„๋‹ ์‹œ ์ดˆ๊ธฐ ํ™˜๊ฒฝ ๊ตฌ์ถ•์— ๋งŽ์€ ์‹œ๊ฐ„์ด ์†Œ์š”
  • ์„ค์ •์ด ๋ณต์žก
  • ์ปดํฌ๋„ŒํŠธ๋กœ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๊ฐœ๋ฐœ ๊ณต์ˆ˜๊ฐ€ ํฌ๋‹ค.

 

๐Ÿ’Ž Node.js Express Framework

Node.js Express Framework ์žฅ์ 

  • ์‹ฑ๊ธ€๊ทธ๋ ˆ๋“œ, ๋น„๋™๊ธฐ IO ์ฒ˜๋ฆฌ์— ๊ธฐ๋ฐ˜ํ•œ ๋น ๋ฅธ ์†๋„ -> CPU ๋Œ€๊ธฐ์‹œ๊ฐ„ ์ตœ์†Œํ™”, CPU ๋ถ€ํ•˜ ์ ์Œ -> ๋งŽ์€ ์ปค๋„ฅ์…˜์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๊ตฌ์กฐ์— ์ ํ•ฉ
  • Chrome์˜ V8 ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ฑ๋Šฅ์ด ๋›ฐ์–ด๋‚จ
  • ํŒŒ์ผ I/O๋‚˜ ๋„คํŠธ์›Œํฌ ์ฒ˜๋ฆฌ๋ฅผ ์ด๋ฒคํŠธ ๋“œ๋ฆฌ๋ธ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋น ๋ฅธ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•จ

 

Node.js Express Framework ๋‹จ์ 

  • ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ๋ชจ๋ธ์ด๋ผ ํ•˜๋‚˜์˜ ์ž‘์—…์— ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋ฉด ์‹œ์Šคํ…œ ์ „์ฒด์˜ ์„ฑ๋Šฅ์ด ๊ธ‰๊ฒฉํžˆ ๋‚ฎ์•„์ง„๋‹ค.
  • ๋ถˆํŽธํ•œ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ชจ๋ธ -> Async & Await ๋ชจ๋“ˆ
  • ๋ฉ€ํ‹ฐ์ฝ”์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด Cluster ๋ชจ๋“ˆ ์ด์šฉ, ์„ธ์…˜ ๊ณต์œ  ์‹œ ๋ถ€๊ฐ€์ ์ธ ์ž‘์—… ํ•„์š”

 

๋ฉ€ํ‹ฐ์ฝ”์–ด๋ฅผ ์ด์šฉํ•˜๊ณ  ๋ฌด์ค‘๋‹จ ์„œ๋ฒ„๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” PM2

exec_mode  ํ•ญ๋ชฉ๊ฐ’์„ ‘cluster’๋กœ ์„ค์ •ํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํด๋Ÿฌ์Šคํ„ฐ ๋ชจ๋“œ๋กœ ์‹คํ–‰ํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์ด๊ณ , instance  ํ•ญ๋ชฉ๊ฐ’์„ ‘0’์œผ๋กœ ์„ค์ •ํ•˜๋ฉด CPU ์ฝ”์–ด ์ˆ˜ ๋งŒํผ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑ

๐Ÿคž Node.js ์šฉ์–ด ์ •๋ฆฌ

Node.js : ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ

Express : NodeJS Framework

NPM : NodeJS package manager

PM2 : NodeJS process manager

 

 

์ฐธ๊ณ ์ž๋ฃŒ

https://devpad.tistory.com/24

https://elky.tistory.com/652

https://engineering.linecorp.com/ko/blog/pm2-nodejs/

HTTP ํ”„๋กœํ† ์ฝœ์€ ๋ฌด์ƒํƒœ ํ”„๋กœํ† ์ฝœ๋กœ์จ ์–ด๋– ํ•œ ์ƒํƒœ๋„ ์œ ์ง€ํ•˜์ง€ ์•Š๊ณ  ๋น„์—ฐ๊ฒฐ์„ฑ์ด๋‹ค. (Stateless + Connectionless)

๋”ฐ๋ผ์„œ ๋กœ๊ทธ์ธ์„ ํ•˜๋ฉด ํ…Œ์ดํ„ฐ ์š”์ฒญ์— ๋Œ€ํ•ด ์ผ์‹œ์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.

 

๊ทธ๋Ÿฌ๋ฉด ์„œ๋ฒ„์—๊ฒŒ ์ •๋ณด๋ฅผ ์š”์ฒญํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ์ด์ „์˜ ์‚ฌ์šฉ์ž์™€ ๊ฐ™์€ ์‚ฌ์šฉ์ž์ธ์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ํ•„์š”ํ•˜๋‹ค. ์ฆ‰ ์ธ์ฆ์ด ํ•„์š”ํ•œ ๊ฒƒ์ด๋‹ค.

 

์ธ์ฆ์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ โ“

โœŒ ์ธ์ฆ

API ์š”์ฒญ์— ๋Œ€ํ•ด ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ์‚ฌ์šฉ์ž์ธ์ง€ ํ™•์ธํ•˜๋Š” ์ ˆ์ฐจ๋กœ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ฃผ์žฅํ•˜๋Š” ์‚ฌ์šฉ์ž์™€ ๊ฐ™์€ ์‚ฌ์šฉ์ž์ธ์ง€ ํ™•์ธํ•œ๋‹ค.

 

โœŒ ์ธ๊ฐ€

์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ์ž์›์— ๋Œ€ํ•œ ์ ‘๊ทผ ๊ถŒํ•œ์ด ์žˆ๋Š”์ง€ ๊ถŒํ•œ์„ ์ฒดํฌํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•˜๊ณ ์ž ํ•˜๋Š” ์ž‘์—…์ด ํ•ด๋‹น ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ํ—ˆ๊ฐ€๋œ ์ž‘์—…์ธ์ง€ ํ™•์ธํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ ๋ ˆ๋ฒจ์— ๋”ฐ๋ผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์„ ์ œํ•œํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

์ธ์ฆ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋น„๊ตํ•ด๋ณด์ž โ—

์ธ์ฆ ๋ฐฉ๋ฒ• Cookie Session
์ €์žฅ ์œ„์น˜ ํด๋ผ์ด์–ธํŠธ ์„œ๋ฒ„
๋ณด์•ˆ ํด๋ผ์ด์–ธํŠธ ๋กœ์ปฌ์— ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€์งˆ๋˜๊ฑฐ๋‚˜ ์ŠคํŒŒ์ดํ•‘ ๋‹นํ•  ์ˆ˜ ์žˆ์Œ ์ฟ ํ‚ค๋ฅผ ์ด์šฉํ•ด์„œ ์„ธ์…˜ ID๋งŒ ์ €์žฅ/๊ตฌ๋ถ„ํ•ด์„œ ์„œ๋ฒ„์—์„œ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋น„๊ต์  ๋ณด์•ˆ์„ฑ ์ข‹์Œ
๋งŒ๋ฃŒ ๋งŒ๋ฃŒ ์‹œ๊ฐ„์„ ์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ข…๋ฃŒํ•ด๋„ ๊ณ„์†ํ•ด์„œ ์ •๋ณด๊ฐ€ ๋‚จ์•„ ์žˆ์Œ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ๋งŒ๋ฃŒ์‹œ๊ฐ„์— ์ƒ๊ด€์—†์ด ์‚ญ์ œ

 

๐Ÿ’ก Cookie

ํด๋ผ์ด์–ธํŠธ ๋กœ์ปฌ์— ์ €์žฅ๋˜๋Š” ํ‚ค์™€ ๊ฐ’์ด ๋“ค์–ด์žˆ๋Š” ์ž‘์€ ๋ฐ์ดํ„ฐ ํŒŒ์ผ

์ฟ ํ‚ค๋Š” ๋‹จ์ˆœํ•œ ํ‚ค - ๊ฐ’์Œ์ด๊ณ  ์ผ์ • ์‹œ๊ฐ„ ๋™์•ˆ ์ €์žฅํ•  ์ˆ˜ ์žˆ๊ณ  ํด๋ผ์ด์–ธํŠธ ์ชฝ์— 300๊ฐœ๊นŒ์ง€ ์ €์žฅ ๊ฐ€๋Šฅํ•˜๋‹ค.

์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์ฟ ํ‚ค๊ฐ€ ์˜ค๋ฉด ์›น ๋ถ€๋ผ์šฐ์ €๋Š” ์ฟ ํ‚ค๋ฅผ ์ €์žฅํ•ด ๋‘์—ˆ๋‹ค๊ฐ€ ์š”์ฒญ ์‹œ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ž๋™์œผ๋กœ ์ฟ ํ‚ค ๊ฐ™์ด ๋ณด๋ƒ„

์ฟ ํ‚ค๋Š” ์š”์ฒญ๊ณผ ์‘๋‹ต์˜ ํ—ค๋”์— ์ €์žฅ๋œ๋‹ค.

 

๐Ÿ’ก Session

์ผ์ • ์‹œ๊ฐ„ ๋™์•ˆ ๊ฐ™์€ ๋ธŒ๋ผ์šฐ์ €๋กœ๋ถ€ํ„ฐ ๋“ค์–ด์˜ค๋Š” ์ผ๋ จ์˜ ์š”๊ตฌ๋ฅผ ํ•˜๋‚˜์˜ ์ƒํƒœ๋กœ ๋ณด๊ณ  ๊ทธ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ธฐ์ˆ 

 

์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ํ†ตํ•ด ์›น ์„œ๋ฒ„์— ์ ‘์†ํ•œ ์ดํ›„๋กœ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ข…๋ฃŒํ•  ๋•Œ๊นŒ์ง€ ์œ ์ง€๋˜๋Š” ์ƒํƒœ์ด๋‹ค.

ํด๋ผ์ด์–ธํŠธ๋Š” ๋ฐœ๊ธ‰๋ฐ›์€ ์„ธ์…˜ ID๋ฅผ ์ฟ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ €์žฅํ•˜๊ณ  ์„ธ์…˜์€ ์„œ๋ฒ„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ๋‹ค.

์„œ๋ฒ„๊ฐ€ ์žฌ์‹œ์ž‘(๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ฆฌ์…‹)๋˜๋ฉด ์„ธ์…˜ ๋ฐ์ดํ„ฐ๋Š” ์‚ฌ๋ผ์ง„๋‹ค.

์„ธ์…˜์€ ์„œ๋ฒ„์˜ ์ž์›์„ ์‚ฌ์šฉํ•˜๊ธฐ์— ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ๋งŒ๋“ค๋‹ค๋ณด๋ฉด ์„œ๋ฒ„์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๊ฐ๋‹นํ•  ์ˆ˜ ์—†์–ด์งˆ ์ˆ˜ ์žˆ๊ณ  ์†๋„๊ฐ€ ๋А๋ ค์งˆ ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

 

 

AOP(Aspect Oriented Programming)๋Š” ๊ด€์  ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์œผ๋กœ ํ•˜๋‚˜์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ ๊ด€์‹ฌ์‚ฌ์™€ ํ•ต์‹ฌ์ ์ธ ๋กœ์ง์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. 

 

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

 

๐Ÿ’ก ๊ด€์‹ฌ์‚ฌ์˜ ์˜ˆ

1. ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋“ค์–ด์™”์„๊นŒ??

 

2. ์‚ฌ์šฉ์ž์˜ ์ธ์ฆ์„ ์ ์ ˆํžˆ ๋ฐ›์•„์™”์„๊นŒ??

 

3. ์ด ์ž‘์—…์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ??

 

์ฆ‰ AOP์˜ ๋ชฉํ‘œ๋Š” ํ•ต์‹ฌ์ ์ธ ๋กœ์ง์—์„œ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ์žฌ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด๊ฒƒ์„ ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ(=Separate concerns)๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ถ„๋ฆฌํ•˜๋ฉด ์ฝ”๋“œ์˜ ๋ฐ˜๋ณต์„ ์ค„์ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

AOP ๊ฐœ๋ฐœ๋ฐฉ์‹์—์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฃผ์˜ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ๋ฌด์—‡์ผ๊นŒ โ“

๊ด€์‹ฌ์‚ฌ์™€ ํ•ต์‹ฌ ๋กœ์ง์€ ์ปดํŒŒ์ผ ํ˜น์€ ์‹คํ–‰์‹œ๊ฐ„์— ๊ฒฐํ•ฉ๋˜๊ธฐ์— ์–ด๋–ค ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ถ™์ผ ๊ฒƒ์ธ์ง€๋งŒ ๊ณ ๋ คํ•˜๋ฉด ๋œ๋‹ค!!

 

๐Ÿ‘€ AOP์šฉ์–ด ์‚ดํŽด๋ณด๊ธฐ

Target : Aspect๋ฅผ ์ ์šฉํ•˜๋Š” ๊ณณ (ํด๋ž˜์Šค, ๋ฉ”์„œ๋“œ..) ์ฆ‰, ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์˜๋ฏธํ•œ๋‹ค.

Proxy : ๋‚ด๋ถ€์ ์œผ๋กœ ๊ด€์‹ฌ์‚ฌ๋“ค์„ ๊ฑฐ์ณ์„œ Target์„ ํ˜ธ์ถœํ•˜๋„๋ก ์ž๋™ ํ˜น์€ ์ˆ˜๋™์œผ๋กœ ์ž‘์„ฑํ•œ๋‹ค.

Proxy ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด Target ๊ฐ์ฒด์˜ JoinPoint์„ ํ˜ธ์ถœํ•œ๋‹ค.

JoinPoint : Target ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง€๋Š” ์—ฌ๋Ÿฌ ๋ฉ”์„œ๋“œ 

 

Aspect๊ณผ JoinPoint๊ฐ€ ๊ฒฐํ•ฉ๋˜๋Š” ๊ฒƒ์„ ์ž์„ธํžˆ ์‚ดํŽด๋ณด์ž โ—

Aspect : ํฉ์–ด์ง„ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ชจ๋“ˆํ™” ํ•œ ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

Advice : ์‹ค์งˆ์ ์ธ ๋ถ€๊ฐ€๊ธฐ๋Šฅ์„ ๋‹ด์€ ๊ตฌํ˜„์ฒด๋กœ ๊ด€์‹ฌ์‚ฌ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

Pointcut : ๊ด€์‹ฌ์‚ฌ์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ๊ฒฐํ•ฉ๋˜๋Š” ์ง€์ ์„ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์œผ๋กœ Joinpoint๊ฐ€ ๊ฐ€์ง€๋Š” ์—ฌ๋Ÿฌ ๋ฉ”์„œ๋“œ ์ค‘ ์–ด๋–ค ๋ฉ”์„œ๋“œ๋กœ ์—ฐ๊ฒฐํ• ์ง€ ์„ค์ •ํ•œ๋‹ค.

 

๐Ÿ’ก Pointcut ์„ ์–ธ Annotation

๊ตฌ๋ถ„ ์„ค๋ช…
execution(@excution) ๋ฉ”์„œ๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ Pointcut ์„ค์ •
within(@within) ํด๋ž˜์Šค๋ฅผ ๊ธฐ์ค€์œผ๋กœ Pointcut ์„ค์ •
this ์ฃผ์–ด์ง„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด์— Pointcut ์„ค์ •
args(@args) ํŠน์ •ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ฐ€์ง€๋Š” ๋Œ€์ƒ๋“ค์— Pointcut ์„ค์ •
@annotaion ํŠน์ •ํ•œ ์–ด๋…ธํ…Œ์ด์…˜์ด ์ ์šฉ๋œ ๋Œ€์ƒ๋“ค์— Pointcut ์„ค์ •

 

 

Promise์„ ์‚ฌ์šฉํ•˜์—ฌ ํ๋ฆ„์„ ์ œ์–ดํ•  ๊ฒฝ์šฐ callback hell์— ๋น ์งˆ ์ˆ˜ ์žˆ๊ณ  ์ฝ”๋“œ๋„ ๋ณต์žกํ•ด์ง„๋‹ค.

๋”ฐ๋ผ์„œ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๊ณ  Promise์˜ ๋‹จ์ ์„ ๋ณดํ™˜ ํ•˜๊ณ ์ž async์™€ await๊ฐ€ ๋‚˜์™”๋‹ค.

 

Async Promise๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ํšจ๊ณผ์ ์œผ๋กœ callback hell ํ•ด๊ฒฐ, ์•”๋ฌต์ ์œผ๋กœ promise๋ฅผ ๋ฐ˜ํ™˜
Await Promise๋ฅผ ๊ธฐ๋‹ค๋ฆผ(์„ฑ๊ณต ํ˜น์€ ์‹คํŒจ), async๋กœ ์ •์˜๋œ ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

 

๐Ÿ’ก Async์™€ Await ๊ธฐ๋ณธ ํ˜•ํƒœ

 

๐Ÿ’ก Async์™€ Await ํ™œ์šฉํ•ด๋ณด๊ธฐ

 

ํ•จ์ˆ˜๋ช…์€ Signup์œผ๋กœ ํšŒ์›๊ฐ€์ž…์„ ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ์ด๋‹ค. checkUser ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์˜ค๋Š” ๊ฒƒ์ด๊ธฐ์— ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์˜จ ํ›„์— ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜์–ด ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์—ฌ์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์•ž์— await์ด ๋ถ™์–ด Promise๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. 

 

๐Ÿ’ก Async์™€ Await ์˜ˆ์™ธ์ฒ˜๋ฆฌ

async์™€ await์˜ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋Š” try catch๋ฌธ์„ ์‚ฌ์šฉํ•œ๋‹ค. 

 

๋ฐœ๊ฒฌ๋œ ์—๋Ÿฌ๋Š” err ๊ฐ์ฒด์— ๋‹ด๊ธฐ๊ณ  ๋„คํŠธ์›Œํฌ ํ†ต์‹  ์˜ค๋ฅ˜๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ผ๋ฐ˜์ ์ธ ์˜ค๋ฅ˜๋“ค๋„ ์žก์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

'Server > Node.js' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

๋น„๋™๊ธฐ ๋ฐฉ์‹ Callback function / Promise ์•Œ์•„๋ณด๊ธฐ  (0) 2021.02.09

+ Recent posts