์ ์ ์์ฒญ vs ๋์ ์์ฒญ
๊ฐ์
์ ์ ์์ฒญ์ ์๋ฒ์ ์ด๋ฏธ ์ ์ฅ๋ ํ์ผ์ ๊ทธ๋๋ก ์ ๋ฌํ๋ ๊ฒ์ด๊ณ , ๋์ ์์ฒญ์ ์๋ฒ๊ฐ ์ค์๊ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํด ์ ๋ฌํ๋ ๊ฒ์ด๋ค.
์น ์๋ฒ์ ๋ค์ด์ค๋ ์์ฒญ์ ํฌ๊ฒ ๋ ์ข
๋ฅ๋ก ๋๋์ด์. ์ ์ (Static) ์์ฒญ๊ณผ ๋์ (Dynamic) ์์ฒญ์ด์์.
๋น์ ๋ฅผ ๋ค๋ฉด ์ด๋์: ํธ์์ ์์ ์ด๋ฏธ ๋ง๋ค์ด์ ธ ์๋ ์ผ๊ฐ๊น๋ฐฅ์ ์ฌ๋ ๊ฑด ์ ์ ์์ฒญ, ์๋น์์ ์ฃผ๋ฌธํ๋ฉด ๊ทธ๋ ์๋ฆฌํด์ ๋์ค๋ ๊ฑด ๋์ ์์ฒญ์ด์์. ๋ ๋ค ์์์ ๋ฐ๋ ๊ฑด ๊ฐ์ง๋ง, ๊ณผ์ ์ด ์์ ํ ๋ค๋ฅด์ฃ !
์ ์ ์์ฒญ vs ๋์ ์์ฒญ ํ๋์ ๋น๊ต
๊ตฌ๋ถ | ์ ์ ์์ฒญ (Static) | ๋์ ์์ฒญ (Dynamic) |
์ ์ | ๋ฏธ๋ฆฌ ๋ง๋ค์ด์ง ํ์ผ์ ๊ทธ๋๋ก ์ ๋ฌ | ์์ฒญ๋ง๋ค ์๋ฒ๊ฐ ์ค์๊ฐ์ผ๋ก ๊ฒฐ๊ณผ ์์ฑ |
์ฒ๋ฆฌ ์ฃผ์ฒด | ์น ์๋ฒ ๋จ๋
(Nginx, Apache) | ์น ์๋ฒ + ์ ํ๋ฆฌ์ผ์ด์
์๋ฒ (WAS) |
์๋ต ์๋ | ||
์๋ฒ ๋ถํ | ๋ฎ์ | ๋์ |
์บ์ฑ | ์ฌ์ | ์ด๋ ค์ (๋ฐ์ดํฐ๊ฐ ๊ณ์ ๋ณํ๋ฏ๋ก) |
์ฝํ
์ธ ์์ | HTML, CSS, JS, ์ด๋ฏธ์ง, ํฐํธ | ๋ก๊ทธ์ธ ๊ฒฐ๊ณผ, ๊ฒ์ ๊ฒฐ๊ณผ, ๊ฒ์ํ ๊ธ ๋ชฉ๋ก |
URL ์์ | /images/logo.png | /api/users?id=123 |
๋น์ | ํธ์์ ์ผ๊ฐ๊น๋ฐฅ | ์๋น ์ฃผ๋ฌธ ์๋ฆฌ |
์ ์ ์์ฒญ ์ฒ๋ฆฌ ํ๋ฆ
sequenceDiagram
participant ๋ธ๋ผ์ฐ์ as ๐ค ๋ธ๋ผ์ฐ์
participant Nginx as ๐ฅ๏ธ Nginx (์น ์๋ฒ)
participant ํ์ผ as ๐ ํ์ผ ์์คํ
๋ธ๋ผ์ฐ์ ->>Nginx: GET /index.html
Nginx->>ํ์ผ: /var/www/html/index.html ์ฐพ๊ธฐ
ํ์ผ-->>Nginx: ํ์ผ ๋ด์ฉ ๋ฐํ
Nginx-->>๋ธ๋ผ์ฐ์ : HTTP 200 + index.html
Note over Nginx: ์น ์๋ฒ ํผ์์ ์ฒ๋ฆฌ ์๋ฃ!<br/>๋ณ๋ ํ๋ก๊ทธ๋จ ์คํ ์์Mermaid
๋ณต์ฌ
์ ์ ์์ฒญ์ ์ ๋ง ์ฌํํด์. ๋ธ๋ผ์ฐ์ ๊ฐ "์ด ํ์ผ ์ฃผ์ธ์!" ํ๋ฉด, Nginx๊ฐ ํ์ผ ์์คํ
์์ ํด๋น ํ์ผ์ ์ฐพ์์ ๊ทธ๋๋ก ์ ๋ฌํ๋ฉด ๋์ด์์. ์ค๊ฐ์ ์ด๋ค ํ๋ก๊ทธ๋จ์ ์คํํ๊ฑฐ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์กฐํํ๊ฑฐ๋ ํ๋ ๊ณผ์ ์ด ์ ํ ์์ด์.
๊ทธ๋์ ์๋๊ฐ ์์ฒญ ๋น ๋ฅด๊ณ , ์๋ฒ ๋ถํ๋ ๊ฑฐ์ ์์ด์. Nginx๊ฐ ์ ์ ํ์ผ ์๋น์ ํนํ ๋ฐ์ด๋ ์ด์ ์ด๊ธฐ๋ ํด์!
๋์ ์์ฒญ ์ฒ๋ฆฌ ํ๋ฆ
sequenceDiagram
participant ๋ธ๋ผ์ฐ์ as ๐ค ๋ธ๋ผ์ฐ์
participant Nginx as ๐ฅ๏ธ Nginx (์น ์๋ฒ)
participant WAS as โ๏ธ WAS (Spring Boot ๋ฑ)
participant DB as ๐๏ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค
๋ธ๋ผ์ฐ์ ->>Nginx: GET /api/users/123
Nginx->>WAS: ์์ฒญ ์ ๋ฌ (๋ฆฌ๋ฒ์ค ํ๋ก์)
WAS->>DB: SELECT * FROM users WHERE id=123
DB-->>WAS: ์ ์ ๋ฐ์ดํฐ ๋ฐํ
WAS-->>Nginx: JSON ์๋ต ์์ฑ
Nginx-->>๋ธ๋ผ์ฐ์ : HTTP 200 + JSON ๋ฐ์ดํฐ
Note over Nginx,WAS: ์น ์๋ฒ๊ฐ WAS์๊ฒ ๋๊ธฐ๊ณ <br/>WAS๊ฐ DB ์กฐํ ํ ์๋ต ์์ฑMermaid
๋ณต์ฌ
๋์ ์์ฒญ์ ๊ณผ์ ์ด ์ข ๋ ๋ณต์กํด์. Nginx๊ฐ ํผ์์๋ ์ฒ๋ฆฌํ ์ ์๊ณ , ๋ค์ ์๋ ์ ํ๋ฆฌ์ผ์ด์
์๋ฒ(WAS)์๊ฒ ์ผ์ ๋๊ฒจ์ผ ํด์.
์๋ฅผ ๋ค์ด "123๋ฒ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ณด์ฌ์ค!"๋ผ๋ ์์ฒญ์ด ์ค๋ฉด, Nginx๋ ์ด๊ฑธ Spring Boot ๊ฐ์ WAS์๊ฒ ์ ๋ฌํ๊ณ , WAS๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ 123๋ฒ ์ฌ์ฉ์๋ฅผ ์กฐํํด์, ๊ทธ ๊ฒฐ๊ณผ๋ฅผ JSON ํํ๋ก ๋ง๋ค์ด Nginx๋ฅผ ํตํด ๋ธ๋ผ์ฐ์ ์๊ฒ ๋ณด๋ด์ฃผ๋ ๊ฑฐ์์.
์ ์ฒด ์ํคํ
์ฒ์์์ ์์น
graph LR
A[๐ค ๋ธ๋ผ์ฐ์ ] --> B[๐ฅ๏ธ Nginx<br/>์น ์๋ฒ]
B -->|์ ์ ์์ฒญ| C[๐ ์ ์ ํ์ผ<br/>HTML/CSS/JS/์ด๋ฏธ์ง]
B -->|๋์ ์์ฒญ| D[โ๏ธ WAS<br/>Spring Boot<br/>Node.js<br/>Django]
D --> E[๐๏ธ Database<br/>MySQL/PostgreSQL]
style C fill:#90EE90
style D fill:#FFB366
style E fill:#87CEEBMermaid
๋ณต์ฌ
์ด ๊ตฌ์กฐ๋ฅผ ๋ณด๋ฉด Nginx์ ์ญํ ์ด ํ์คํ ๋ณด์ด์ฃ ? Nginx๋ ๊ตํต์ ๋ฆฌ ๋ด๋น์ด์์!
โข
์ ์ ํ์ผ ์์ฒญ์ด ์ค๋ฉด โ ์ง์ ํ์ผ์ ์ฐพ์์ ์ ๋ฌ (์ด๋ก์ ๊ฒฝ๋ก)
โข
๋์ ์์ฒญ์ด ์ค๋ฉด โ WAS์๊ฒ ๋๊ธฐ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์์ ์ ๋ฌ (์ฃผํฉ์ ๊ฒฝ๋ก)
์ด๋ ๊ฒ Nginx๊ฐ ์๋จ์์ ์์ฒญ์ ๋ถ๋ฅํด์ฃผ๋ ์ญํ ์ ๋ฆฌ๋ฒ์ค ํ๋ก์(Reverse Proxy)๋ผ๊ณ ํด์. ์ด๊ฑด ๋์ค์ ๋ ์์ธํ ๋ฐฐ์ธ ๊ฑฐ์์!
์ ์ ํ์ผ์ ์ข
๋ฅ
ํ์ผ ์ ํ | ํ์ฅ์ | ์ญํ | Content-Type |
HTML | .html | ํ์ด์ง ๊ตฌ์กฐ | text/html |
CSS | .css | ์คํ์ผ, ๋์์ธ | text/css |
JavaScript | .js | ๋์ ๊ธฐ๋ฅ | application/javascript |
์ด๋ฏธ์ง | .png, .jpg, .gif, .webp | ์๊ฐ ์๋ฃ | image/png ๋ฑ |
ํฐํธ | .woff, .woff2, .ttf | ๊ธ๊ผด | font/woff2 ๋ฑ |
๋์์ | .mp4, .webm | ๋ฏธ๋์ด | video/mp4 |
JSON ํ์ผ | .json | ์ค์ , ๋ฐ์ดํฐ | application/json |
ํ๋น์ฝ | favicon.ico | ํญ ์์ด์ฝ | image/x-icon |
์ฌ๊ธฐ์ ์ฃผ์ํ ์ ! JavaScript ํ์ผ(.js)์ ์ ์ ํ์ผ์ด์์. "JavaScript๊ฐ ๋์ ์ธ์ด ์๋๊ฐ์?"๋ผ๊ณ ์๊ฐํ ์ ์๋๋ฐ, ์๋ฒ ์
์ฅ์์๋ .js ํ์ผ ์์ฒด๋ ์ด๋ฏธ ๋ง๋ค์ด์ ธ ์๋ ํ์ผ์ด๋ผ ๊ทธ๋๋ก ์ ๋ฌ๋ง ํ๋ฉด ๋ผ์. ๊ทธ JS ํ์ผ์ด ๋ธ๋ผ์ฐ์ ์์ ์คํ๋๋ฉด์ ๋์ ์ธ ๋์์ ํ๋ ๊ฑฐ์ง, ์๋ฒ๊ฐ ๋์ ์ผ๋ก ์์ฑํ๋ ๊ฑด ์๋๊ฑฐ๋ ์!
Nginx ์ค์ ์์
server {
listen 80;
server_name example.com;
# ์ ์ ํ์ผ ์ฒ๋ฆฌ - Nginx๊ฐ ์ง์ ์ฒ๋ฆฌ
location / {
root /var/www/html;
index index.html;
try_files $uri $uri/ /index.html;
}
# ์ ์ ๋ฆฌ์์ค - ์บ์ฑ ์ ์ฉ
location ~* \\.(css|js|png|jpg|gif|ico|woff2)$ {
root /var/www/html;
expires 30d; # 30์ผ๊ฐ ์บ์ฑ
add_header Cache-Control "public, immutable";
}
# ๋์ ์์ฒญ - WAS๋ก ์ ๋ฌ (๋ฆฌ๋ฒ์ค ํ๋ก์)
location /api/ {
proxy_pass <http://localhost:8080>; # Spring Boot ์๋ฒ
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
Plain Text
๋ณต์ฌ
์ด ์ค์ ์ ๋ณด๋ฉด, Nginx๊ฐ URL ๊ฒฝ๋ก์ ๋ฐ๋ผ ์์ฒญ์ ๋ค๋ฅด๊ฒ ์ฒ๋ฆฌํ๋ ๊ฒ ๋ณด์ด์ฃ ?
โข
/ ๊ฒฝ๋ก โ ์ ์ ํ์ผ(React ๋น๋ ๊ฒฐ๊ณผ๋ฌผ)์ ์ง์ ์๋น
โข
/api/ ๊ฒฝ๋ก โ Spring Boot(WAS)๋ก ์์ฒญ ์ ๋ฌ
ํต์ฌ ์ ๋ฆฌ
์ ์ ์์ฒญ = ๋ฏธ๋ฆฌ ๋ง๋ค์ด์ง ํ์ผ์ ๊ทธ๋๋ก ์ ๋ฌ (๋น ๋ฅด๊ณ , ์๋ฒ ๋ถํ ์ ์)
๋์ ์์ฒญ = ์๋ฒ๊ฐ ์ค์๊ฐ์ผ๋ก ์ฒ๋ฆฌํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ์์ฑ (DB ์กฐํ, ๋น์ฆ๋์ค ๋ก์ง)
Nginx๋ ์ ์ ํ์ผ ์๋น์ ๋งค์ฐ ๋ฐ์ด๋๊ณ , ๋์ ์์ฒญ์ ๋ฆฌ๋ฒ์ค ํ๋ก์๋ก WAS์ ์ ๋ฌ
์ค๋ฌด์์๋ ์ ์ /๋์ ์์ฒญ์ ๋ถ๋ฆฌํ์ฌ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ฑ๋ฅ ์ต์ ํ์ ๊ธฐ๋ณธ!




