Ver3.0 ๐ ์น ์๋ฒ์ ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ์ ์ฐจ์ด์ ์๋ฒฝ ์ ๋ณต! Nginx, Apache, Tomcat ๋น๊ต ๋ถ์ ๐

๐ ์น ์๋ฒ์ ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ์ ์ฐจ์ด์ ์๋ฒฝ ์ ๋ณต! Nginx, Apache, Tomcat ๋น๊ต ๋ถ์ ๐
์น๊ตฌ์ฒ๋ผ ์ฝ๊ฒ ํ์ด์ฃผ๋ ์๋ฒ ์ด์ผ๊ธฐ
์๋
! ๐ ์ค๋์ ๊ฐ๋ฐ์๋ผ๋ฉด ๊ผญ ์์์ผ ํ๋ ์น ์๋ฒ์ ์ ํ๋ฆฌ์ผ์ด์
์๋ฒ์ ์ฐจ์ด์ ๋ํด ์ด์ผ๊ธฐํด๋ณผ๊ฒ. Nginx, Apache, Tomcat... ์ด๋ฆ์ ๋ง์ด ๋ค์ด๋ดค๋๋ฐ ์ ํํ ๋ญ๊ฐ ๋ค๋ฅธ์ง ํท๊ฐ๋ฆฌ์ง ์์? ๐
๊ฑฑ์ ๋ง! ์ค๋ ์ด ๊ธ์ ๋ค ์ฝ๊ณ ๋๋ฉด ์น๊ตฌ๋คํํ
์์ ์๊ฒ ์ค๋ช
ํ ์ ์์ ๊ฑฐ์ผ. ์ปคํผ ํ ์ โ ์ค๋นํ๊ณ ํธํ๊ฒ ์ฝ์ด๋ด!
๐ฏ ์น ์๋ฒ vs ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ: ํต์ฌ๋ถํฐ ํ์ ํ๊ธฐ
์, ๋จผ์ ๊ฐ์ฅ ์ค์ํ ๊ฐ๋
๋ถํฐ ์ ๋ฆฌํ๊ณ ๊ฐ์! ๋ง์ ์ฌ๋๋ค์ด ์น ์๋ฒ์ ์ ํ๋ฆฌ์ผ์ด์
์๋ฒ๋ฅผ ํท๊ฐ๋ คํ๋๋ฐ, ์ฌ์ค ์ญํ ์ด ์์ ํ ๋ค๋ฅด๊ฑฐ๋ . ๐ค
๊ฐ๋จํ๊ฒ ๋น์ ํ์๋ฉด, ์น ์๋ฒ๋ "๋ฐฐ๋ฌ์"์ด๊ณ ์ ํ๋ฆฌ์ผ์ด์
์๋ฒ๋ "์๋ฆฌ์ฌ"๋ผ๊ณ ์๊ฐํ๋ฉด ๋ผ!
๐ ์น ์๋ฒ (Web Server)๋?
์น ์๋ฒ๋ ํด๋ผ์ด์ธํธ(๋ธ๋ผ์ฐ์ )์ ์์ฒญ์ ๋ฐ์์ ์ ์ ์ธ ์ฝํ
์ธ ๋ฅผ ์ ๊ณตํ๋ ์ญํ ์ ํด. ์ฌ๊ธฐ์ ์ ์ ์ฝํ
์ธ ๋ ๋ญ๊น? ๐คทโโ๏ธ
โข HTML ํ์ผ ๐
โข CSS ์คํ์ผ์ํธ ๐จ
โข JavaScript ํ์ผ โก
โข ์ด๋ฏธ์ง ํ์ผ (JPG, PNG, GIF) ๐ผ๏ธ
โข ๋น๋์ค, ์ค๋์ค ํ์ผ ๐ฌ
์ด๋ฐ ํ์ผ๋ค์ ์ด๋ฏธ ๋ง๋ค์ด์ ธ ์์ด์ ๊ทธ๋ฅ ๊ฐ์ ธ๋ค ์ฃผ๊ธฐ๋ง ํ๋ฉด ๋๋ ๊ฑฐ์ผ. ๋ง์น ํธ์์ ์์ ์ด๋ฏธ ํฌ์ฅ๋ ์๋์์น๋ฅผ ์ฌ๋ ๊ฒ์ฒ๋ผ ๋ง์ด์ผ! ๐ฅช
๐ ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ (Application Server)๋?
์ ํ๋ฆฌ์ผ์ด์
์๋ฒ๋ ๋์ ์ธ ์ฝํ
์ธ ๋ฅผ ์์ฑํ๊ณ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๋ ์ญํ ์ ๋ด๋นํด. ๋์ ์ฝํ
์ธ ๋ ์ฌ์ฉ์์ ์์ฒญ์ ๋ฐ๋ผ ์ค์๊ฐ์ผ๋ก ๋ง๋ค์ด์ง๋ ๊ฑฐ์ผ. ๐
์๋ฅผ ๋ค์ด๋ณผ๊ฒ:
โข ๋ก๊ทธ์ธ ์ฒ๋ฆฌ ๐
โข ๋ฐ์ดํฐ๋ฒ ์ด์ค ์กฐํ ๋ฐ ์์ ๐พ
โข ๊ฒฐ์ ์ฒ๋ฆฌ ๐ณ
โข ๊ฐ์ธํ๋ ์ถ์ฒ ์์คํ
๐ฏ
โข ๋ณต์กํ ๊ณ์ฐ ๋ฐ ๋ฐ์ดํฐ ๊ฐ๊ณต ๐งฎ
์ด๋ฐ ์์
๋ค์ ๊ทธ๋๊ทธ๋ ์ํฉ์ ๋ง๊ฒ ์ฒ๋ฆฌํด์ผ ํ์์? ๋ง์น ๋ ์คํ ๋์์ ์ฃผ๋ฌธ์ ๋ฐ์ ์๋ฆฌ๋ฅผ ๋ง๋๋ ๊ฒ์ฒ๋ผ! ๐จโ๐ณ
โ๏ธ ์น ์๋ฒ vs ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ ๋น๊ตํ
| ๊ตฌ๋ถ | ์น ์๋ฒ | ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ |
|---|---|---|
| ์ฃผ์ ์ญํ | ์ ์ ์ฝํ ์ธ ์ ๊ณต | ๋์ ์ฝํ ์ธ ์์ฑ ๋ฐ ๋น์ฆ๋์ค ๋ก์ง ์ฒ๋ฆฌ |
| ํ๋กํ ์ฝ | HTTP/HTTPS | HTTP/HTTPS + ๋ค์ํ ํ๋กํ ์ฝ |
| ์ฒ๋ฆฌ ๋ด์ฉ | ํ์ผ ์ ์ก | ํ๋ก๊ทธ๋จ ์คํ, DB ์ฐ๋ |
| ๋ํ ์์ | Nginx, Apache HTTP Server | Tomcat, JBoss, WebLogic |
| ๋ฆฌ์์ค ์ฌ์ฉ | ์๋์ ์ผ๋ก ์ ์ | ์๋์ ์ผ๋ก ๋ง์ |
๐ Nginx: ํ๋์ ์ด๊ณ ๋น ๋ฅธ ์น ์๋ฒ์ ๊ฐ์
Nginx(์์ง์์ค๋ผ๊ณ ์ฝ์ด)๋ 2004๋
์ ๋ฌ์์ ๊ฐ๋ฐ์ Igor Sysoev๊ฐ ๋ง๋ ์น ์๋ฒ์ผ. ์ฒ์์๋ C10K ๋ฌธ์ (๋์์ 10,000๊ฐ์ ์ฐ๊ฒฐ์ ์ฒ๋ฆฌํ๋ ๋ฌธ์ )๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ง๋ค์ด์ก์ด. ๐
์์ฆ ์น ๊ฐ๋ฐ ํธ๋ ๋์์ Nginx๋ ์ ๋ง ํซํ ์ ํ์ด์ผ! ์ ๊ทธ๋ด๊น?
๐ช Nginx์ ๊ฐ๋ ฅํ ์ฅ์ ๋ค
1. ์ด๋ฒคํธ ๊ธฐ๋ฐ ๋น๋๊ธฐ ์ํคํ
์ฒ โก
Nginx๋ ์ด๋ฒคํธ ๊ธฐ๋ฐ(Event-Driven) ๋ฐฉ์์ผ๋ก ๋์ํด. ์ด๊ฒ ๋ฌด์จ ๋ง์ด๋๋ฉด, ํ ๋ช
์ ์ง์์ด ์ฌ๋ฌ ์๋์ ๋์์ ์๋ํ ์ ์๋ค๋ ๊ฑฐ์ผ!
์ ํต์ ์ธ ๋ฐฉ์(Apache์ ํ๋ก์ธ์ค ๊ธฐ๋ฐ)์ ์๋ ํ ๋ช
๋น ์ง์ ํ ๋ช
์ ๋ฐฐ์นํ๋ ๊ฑฐ๋ผ๋ฉด, Nginx๋ ํ ๋ช
์ ์ง์์ด ์ฌ๋ฌ ์๋์ ์ฃผ๋ฌธ์ ๋ฐ๊ณ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ด์ง. ํจ์ฌ ํจ์จ์ ์ด์ง? ๐
2. ์ ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ๐พ
๋์ ์ ์์๊ฐ 10,000๋ช
์ด์ด๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ๊ฒ ๋จน์ด. ์ด๊ฑด ์๋ฒ ๋น์ฉ ์ ๊ฐ์ ์์ฒญ๋ ๋์์ด ๋ผ!
3. ๋ฐ์ด๋ ์ ์ ํ์ผ ์ฒ๋ฆฌ ์ฑ๋ฅ ๐
์ด๋ฏธ์ง, CSS, JavaScript ๊ฐ์ ์ ์ ํ์ผ์ ์ ๊ณตํ๋ ์๋๊ฐ ์ ๋ง ๋นจ๋ผ. ํนํ ๋์ฉ๋ ํ์ผ์ ๋ง์ด ์๋น์คํ๋ ๊ฒฝ์ฐ Nginx๊ฐ ์ต๊ณ ์ผ!
4. ๋ฆฌ๋ฒ์ค ํ๋ก์ ๊ธฐ๋ฅ ๐
Nginx๋ ๋ฆฌ๋ฒ์ค ํ๋ก์๋ก๋ ๋ง์ด ์ฌ์ฉ๋ผ. ํด๋ผ์ด์ธํธ ์์ฒญ์ ๋ฐ์์ ๋ค์ ์๋ ์ ํ๋ฆฌ์ผ์ด์
์๋ฒ๋ก ์ ๋ฌํ๋ ์ค๊ฐ ๋ค๋ฆฌ ์ญํ ์ ํ๋ ๊ฑฐ์ง.
5. ๋ก๋ ๋ฐธ๋ฐ์ฑ โ๏ธ
์ฌ๋ฌ ๋์ ์๋ฒ๋ก ํธ๋ํฝ์ ๋ถ์ฐ์ํฌ ์ ์์ด. ์๋ฒ ํ ๋๊ฐ ์ฃฝ์ด๋ ์๋น์ค๊ฐ ๊ณ์ ๋์๊ฐ๊ฒ ๋ง๋ค ์ ์์ง!
๐ Nginx ์ค์ ์์
๊ฐ๋จํ Nginx ์ค์ ํ์ผ์ ํ๋ฒ ๋ณผ๊น?
server {
listen 80;
server_name example.com;
location / {
root /var/www/html;
index index.html;
}
location /api {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
location ~* \.(jpg|jpeg|png|gif|css|js)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
}
์ด ์ค์ ์ ๋ญ ํ๋ ๊ฑธ๊น? ๐ค
โข 80๋ฒ ํฌํธ๋ก ๋ค์ด์ค๋ ์์ฒญ์ ๋ฐ์
โข ์ผ๋ฐ ์์ฒญ์ /var/www/html ํด๋์ ํ์ผ์ ๋ณด์ฌ์ฃผ๊ณ
โข /api๋ก ์์ํ๋ ์์ฒญ์ 8080ํฌํธ์ ์ ํ๋ฆฌ์ผ์ด์
์๋ฒ๋ก ์ ๋ฌํ๊ณ
โข ์ด๋ฏธ์ง๋ CSS, JS ํ์ผ์ 30์ผ๊ฐ ์บ์ํ๋๋ก ์ค์ ํ ๊ฑฐ์ผ!
๐ก ์ค๋ฌด ํ: Nginx๋ ์ค์ ์ด ์ง๊ด์ ์ด๊ณ ๊ฐ๋จํด์ ์ด๋ณด์๋ ์ฝ๊ฒ ๋ฐฐ์ธ ์ ์์ด. ์ฌ๋ฅ๋ท ๊ฐ์ ํ๋ซํผ์์ Nginx ์ ๋ฌธ๊ฐ๋ฅผ ์ฐพ์ 1:1 ๋ฉํ ๋ง์ ๋ฐ์ผ๋ฉด ๋ ๋น ๋ฅด๊ฒ ์ค๋ ฅ์ ํค์ธ ์ ์์ง! ๐ฏ
๐ฅ Apache HTTP Server: ๊ฒ์ฆ๋ ์น ์๋ฒ์ ์ ์ค
Apache๋ 1995๋
์ ํ์ํ ์น ์๋ฒ์ ํ ์๋ฒ์ง ๊ฐ์ ์กด์ฌ์ผ. ๐ด ์ค๋๋๋ค๊ณ ๋ฌด์ํ๋ฉด ์ ๋ผ! ์ง๊ธ๋ ์ ์ธ๊ณ ์๋ง์ ์น์ฌ์ดํธ๊ฐ Apache๋ฅผ ์ฌ์ฉํ๊ณ ์๊ฑฐ๋ .
Apache์ ์ ์ ์ด๋ฆ์ "Apache HTTP Server"์ธ๋ฐ, ์ํ์น ์ฌ๋จ(Apache Software Foundation)์์ ๊ด๋ฆฌํ๊ณ ์์ด.
๐ฏ Apache์ ํน์ง๊ณผ ์ฅ์
1. ํ๋ก์ธ์ค ๊ธฐ๋ฐ ์ํคํ
์ฒ ๐๏ธ
Apache๋ ๊ธฐ๋ณธ์ ์ผ๋ก MPM(Multi-Processing Module) ๋ฐฉ์์ ์ฌ์ฉํด. ์์ฒญ์ด ๋ค์ด์ค๋ฉด ํ๋ก์ธ์ค๋ ์ค๋ ๋๋ฅผ ์์ฑํด์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ด์ผ.
โข Prefork MPM: ๊ฐ ์์ฒญ๋ง๋ค ๋ณ๋์ ํ๋ก์ธ์ค ์์ฑ
โข Worker MPM: ์ค๋ ๋ ๊ธฐ๋ฐ์ผ๋ก ๋ ํจ์จ์
โข Event MPM: ์ด๋ฒคํธ ๊ธฐ๋ฐ์ผ๋ก Nginx์ ๋น์ทํ ๋ฐฉ์
2. ๊ฐ๋ ฅํ ๋ชจ๋ ์์คํ
๐งฉ
Apache์ ์ง์ง ๊ฐ์ ์ ๋ฐ๋ก ๋ชจ๋์ด์ผ! ํ์ํ ๊ธฐ๋ฅ์ ๋ชจ๋๋ก ์ถ๊ฐํ ์ ์์ด์ ์์ฒญ๋๊ฒ ์ ์ฐํด.
โข mod_rewrite: URL ์ฌ์์ฑ (SEO์ ํ์!)
โข mod_ssl: HTTPS ์ง์
โข mod_security: ์น ๋ฐฉํ๋ฒฝ ๊ธฐ๋ฅ
โข mod_php: PHP๋ฅผ Apache์ ์ง์ ํตํฉ
3. .htaccess ํ์ผ ์ง์ ๐
์ด๊ฑด Apache๋ง์ ๋
ํนํ ๊ธฐ๋ฅ์ด์ผ. ๋๋ ํ ๋ฆฌ๋ณ๋ก ์ค์ ์ ๋ค๋ฅด๊ฒ ํ ์ ์์ด์ ๊ณต์ ํธ์คํ
ํ๊ฒฝ์์ ํนํ ์ ์ฉํด!
4. ๊ด๋ฒ์ํ ๋ฌธ์์ ์ปค๋ฎค๋ํฐ ๐
20๋
๋๊ฒ ์ฌ์ฉ๋๋ค ๋ณด๋ ๋ฌธ์๊ฐ ์ ๋ง ๋ฐฉ๋ํด. ์ด๋ค ๋ฌธ์ ๋ ๊ฒ์ํ๋ฉด ํด๊ฒฐ์ฑ
์ด ๋์! ์ด๋ณด์์๊ฒ๋ ์ด๊ฒ ํฐ ์ฅ์ ์ด์ง.
๐ Apache vs Nginx ์ฑ๋ฅ ๋น๊ต
๋ง์ ์ฌ๋๋ค์ด ๊ถ๊ธํดํ๋ ๋ถ๋ถ์ด์ง? ์ค์ ๋ก ์ด๋ค ์ฐจ์ด๊ฐ ์์๊น? ๐
์ ์ ์ฝํ
์ธ ์ฒ๋ฆฌ:
โข Nginx: ์ด๋น ์ฝ 12,000 ์์ฒญ ์ฒ๋ฆฌ ๊ฐ๋ฅ โก
โข Apache: ์ด๋น ์ฝ 4,000 ์์ฒญ ์ฒ๋ฆฌ ๊ฐ๋ฅ ๐ข
โ Nginx๊ฐ ์ฝ 3๋ฐฐ ๋น ๋ฆ!
๋์ ์ ์ ์ฒ๋ฆฌ:
โข Nginx: 10,000๊ฐ ์ฐ๊ฒฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฝ 2.5MB ์ฌ์ฉ ๐ช
โข Apache (Prefork): 10,000๊ฐ ์ฐ๊ฒฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฝ 500MB ์ฌ์ฉ ๐ฐ
โ Nginx๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ 200๋ฐฐ ์ ๊ฒ ์ฌ์ฉ!
ํ์ง๋ง! ๐ค
๋์ ์ฝํ
์ธ ์ฒ๋ฆฌ๋ ๋ณต์กํ ์ค์ ์ด ํ์ํ ๊ฒฝ์ฐ, Apache์ ๋ชจ๋ ์์คํ
์ด ๋ ํธํ ์ ์์ด. ํนํ PHP ์ ํ๋ฆฌ์ผ์ด์
์ Apache์ ๊ถํฉ์ด ์ข์ง!
๐ Apache ์ค์ ์์
<VirtualHost *:80>
ServerName example.com
DocumentRoot /var/www/html
<Directory /var/www/html>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
์ด ์ค์ ์:
โข ๊ฐ์ ํธ์คํธ๋ฅผ ์ค์ ํ๊ณ
โข ๋๋ ํ ๋ฆฌ ๊ถํ์ ๋ถ์ฌํ๊ณ
โข HTTP๋ฅผ HTTPS๋ก ์๋ ๋ฆฌ๋ค์ด๋ ํธํ๊ณ
โข ๋ก๊ทธ๋ฅผ ๊ธฐ๋กํ๋ ๊ฑฐ์ผ!
โ Apache Tomcat: ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ๋ ํ ํํธ๋
์, ์ด์ ์ ํ๋ฆฌ์ผ์ด์
์๋ฒ ์ด์ผ๊ธฐ๋ฅผ ํด๋ณผ๊น! Tomcat์ Apache ์ฌ๋จ์์ ๋ง๋ ์๋ธ๋ฆฟ ์ปจํ
์ด๋์ผ. ๐ฏ
"์๋ธ๋ฆฟ ์ปจํ
์ด๋๊ฐ ๋ญ์ผ?" ํ๊ณ ๋ฌผ์ด๋ณผ ์ ์๋๋ฐ, ์ฝ๊ฒ ๋งํ๋ฉด ์๋ฐ๋ก ๋ง๋ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ์คํ์์ผ์ฃผ๋ ํ๊ฒฝ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋ผ!
๐ฏ Tomcat์ ํต์ฌ ๊ฐ๋
1. ์๋ธ๋ฆฟ(Servlet)์ด๋? ๐ค
์๋ธ๋ฆฟ์ ์๋ฐ๋ก ์์ฑ๋ ์๋ฒ ์ธก ํ๋ก๊ทธ๋จ์ด์ผ. ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ฐ์์ ์ฒ๋ฆฌํ๊ณ ์๋ต์ ๋ง๋ค์ด์ฃผ๋ ์ญํ ์ ํด.
2. JSP(JavaServer Pages) ๐
JSP๋ HTML ์์ ์๋ฐ ์ฝ๋๋ฅผ ๋ฃ์ ์ ์๊ฒ ํด์ฃผ๋ ๊ธฐ์ ์ด์ผ. Tomcat์ JSP๋ฅผ ์๋ธ๋ฆฟ์ผ๋ก ๋ณํํด์ ์คํ์์ผ์ค.
3. ์๋ธ๋ฆฟ ์ปจํ
์ด๋์ ์ญํ ๐ญ
โข ์๋ธ๋ฆฟ์ ์๋ช
์ฃผ๊ธฐ ๊ด๋ฆฌ (์์ฑ, ์ด๊ธฐํ, ์คํ, ์๋ฉธ)
โข ๋ฉํฐ์ค๋ ๋ฉ ์ง์
โข ์ ์ธ์ ๋ณด์ ๊ด๋ฆฌ
โข JSP ์ง์
โข ์น ์ ํ๋ฆฌ์ผ์ด์
๋ฐฐํฌ ๋ฐ ๊ด๋ฆฌ
๐ Tomcat์ ์ฅ์
1. ๊ฐ๋ณ๊ณ ๋น ๋ฅธ ์์ ๐
๋ค๋ฅธ WAS(WebLogic, JBoss)์ ๋นํด ํจ์ฌ ๊ฐ๋ณ๊ณ ๋น ๋ฅด๊ฒ ์์๋ผ. ๊ฐ๋ฐํ ๋ ์ ๋ง ํธํด!
2. ๋ฌด๋ฃ ์คํ์์ค ๐ฐ
์์ ๋ฌด๋ฃ์ผ! ์์
์ฉ์ผ๋ก ์ฌ์ฉํด๋ ๋ผ์ด์ ์ค ๋น์ฉ์ด ์์ด. ์คํํธ์
์ด๋ ๊ฐ์ธ ๊ฐ๋ฐ์์๊ฒ ์ต๊ณ ์ง!
3. ๊ฐ๋จํ ์ค์ โ๏ธ
XML ํ์ผ๋ก ์ค์ ์ ๊ด๋ฆฌํ๋๋ฐ, ๊ตฌ์กฐ๊ฐ ์ง๊ด์ ์ด์ด์ ๋ฐฐ์ฐ๊ธฐ ์ฌ์.
4. ๋๋ฆฌ ์ฌ์ฉ๋๋ ํ์ค ๐
์ ์ธ๊ณ์ ์ผ๋ก ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ์๋ธ๋ฆฟ ์ปจํ
์ด๋์ผ. ๊ทธ๋งํผ ์๋ฃ๋ ๋ง๊ณ ์ปค๋ฎค๋ํฐ๋ ํ๋ฐํด!
5. Spring Boot์ ์๋ฒฝํ ํธํ ๐ฑ
์์ฆ ์๋ฐ ๊ฐ๋ฐ์ ํ์ค์ธ Spring Boot๋ ๋ด์ฅ Tomcat์ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉํด. ๋ณ๋ ์ค์น ์์ด ๋ฐ๋ก ์คํ ๊ฐ๋ฅ!
๐ Tomcat ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ ์ดํดํ๊ธฐ
tomcat/
โโโ bin/ # ์คํ ํ์ผ๋ค (startup.sh, shutdown.sh)
โโโ conf/ # ์ค์ ํ์ผ๋ค
โ โโโ server.xml # ๋ฉ์ธ ์ค์ ํ์ผ
โ โโโ web.xml # ์น ์ ํ๋ฆฌ์ผ์ด์
๊ธฐ๋ณธ ์ค์
โ โโโ tomcat-users.xml # ์ฌ์ฉ์ ๊ถํ ์ค์
โโโ lib/ # Tomcat ๋ผ์ด๋ธ๋ฌ๋ฆฌ
โโโ logs/ # ๋ก๊ทธ ํ์ผ๋ค
โโโ temp/ # ์์ ํ์ผ
โโโ webapps/ # ์น ์ ํ๋ฆฌ์ผ์ด์
๋ฐฐํฌ ๋๋ ํ ๋ฆฌ
โ โโโ ROOT/ # ๊ธฐ๋ณธ ์ ํ๋ฆฌ์ผ์ด์
โ โโโ myapp/ # ์ฌ์ฉ์ ์ ํ๋ฆฌ์ผ์ด์
โโโ work/ # JSP๋ฅผ ์๋ธ๋ฆฟ์ผ๋ก ๋ณํํ ํ์ผ๋ค
webapps ํด๋๊ฐ ํต์ฌ์ด์ผ! ๐ฏ
์ฌ๊ธฐ์ WAR ํ์ผ์ ๋ฃ์ผ๋ฉด ์๋์ผ๋ก ๋ฐฐํฌ๋ผ. ์๋ฅผ ๋ค์ด myapp.war๋ฅผ ๋ฃ์ผ๋ฉด http://localhost:8080/myapp ์ผ๋ก ์ ์ํ ์ ์์ด!
๐ ๊ฐ๋จํ ์๋ธ๋ฆฟ ์์
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<body>");
out.println("<h1>Hello, Tomcat!</h1>");
out.println("</body>");
out.println("</html>");
}
}
์ด ์๋ธ๋ฆฟ์ GET ์์ฒญ์ ๋ฐ์ผ๋ฉด "Hello, Tomcat!" ๋ฉ์์ง๋ฅผ HTML๋ก ์๋ตํด์ฃผ๋ ๊ฐ๋จํ ์์ ์ผ. ์ค์ ๋ก๋ ์ด๋ ๊ฒ ์ง์ HTML์ ์์ฑํ์ง ์๊ณ JSP๋ ํ ํ๋ฆฟ ์์ง์ ์ฌ์ฉํ์ง๋ง, ์๋ฆฌ๋ฅผ ์ดํดํ๋ ๋ฐ๋ ์ด๊ฒ ์ต๊ณ ์ผ! ๐
๐ ์น ์๋ฒ์ ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ์ ํ์
์ค๋ฌด์์๋ ์น ์๋ฒ์ ์ ํ๋ฆฌ์ผ์ด์
์๋ฒ๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์. ์ ๊ทธ๋ด๊น? ๐ค
๊ฐ์์ ์ฅ์ ์ ์ด๋ ค์ ๋ ํจ์จ์ ์ธ ์์คํ
์ ๋ง๋ค ์ ์๊ธฐ ๋๋ฌธ์ด์ผ!
๐ฏ Nginx + Tomcat ์กฐํฉ์ ์ฅ์
1. ์ญํ ๋ถ๋ด์ผ๋ก ์ฑ๋ฅ ์ต์ ํ โก
โข Nginx: ์ด๋ฏธ์ง, CSS, JS ๊ฐ์ ์ ์ ํ์ผ ์ฒ๋ฆฌ
โข Tomcat: ๋น์ฆ๋์ค ๋ก์ง, DB ์ฐ๋ ๊ฐ์ ๋์ ์ฒ๋ฆฌ
โ ๊ฐ์ ์ํ๋ ์ผ๋ง ํ๋๊น ์ ์ฒด ์ฑ๋ฅ์ด ์ฌ๋ผ๊ฐ!
2. ๋ณด์ ๊ฐํ ๐
Nginx๋ฅผ ์๋จ์ ๋๋ฉด Tomcat์ ์ธ๋ถ์ ์ง์ ๋
ธ์ถ์ํค์ง ์์๋ ๋ผ. ๋ฐฉํ๋ฒฝ ์ญํ ์ ํ๋ ๊ฑฐ์ง!
3. ๋ก๋ ๋ฐธ๋ฐ์ฑ โ๏ธ
Nginx๊ฐ ์ฌ๋ฌ ๋์ Tomcat ์๋ฒ๋ก ์์ฒญ์ ๋ถ์ฐ์ํฌ ์ ์์ด. ํธ๋ํฝ์ด ๋ง์์ ธ๋ ๊ฑฑ์ ์์ด!
4. SSL/TLS ์ฒ๋ฆฌ ๐
HTTPS ์ํธํ/๋ณตํธํ๋ฅผ Nginx์์ ์ฒ๋ฆฌํ๋ฉด Tomcat์ ๋ถ๋ด์ด ์ค์ด๋ค์ด.
5. ์บ์ฑ ๐พ
์์ฃผ ์์ฒญ๋๋ ์ฝํ
์ธ ๋ฅผ Nginx์์ ์บ์ฑํ๋ฉด Tomcat๊น์ง ๊ฐ ํ์๊ฐ ์์ด์ ์๋ต ์๋๊ฐ ๋นจ๋ผ์ ธ!
๐ Nginx์์ Tomcat์ผ๋ก ํ๋ก์ ์ค์ ํ๊ธฐ
upstream tomcat_servers {
server localhost:8080 weight=3;
server localhost:8081 weight=2;
server localhost:8082 weight=1;
}
server {
listen 80;
server_name example.com;
# ์ ์ ํ์ผ์ Nginx๊ฐ ์ง์ ์ฒ๋ฆฌ
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
root /var/www/static;
expires 30d;
add_header Cache-Control "public, immutable";
}
# ๋์ ์์ฒญ์ Tomcat์ผ๋ก ์ ๋ฌ
location / {
proxy_pass http://tomcat_servers;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# ํ์์์ ์ค์
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
# API ์์ฒญ์ ํน์ Tomcat์ผ๋ก
location /api {
proxy_pass http://localhost:8080;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}
์ด ์ค์ ์ ํต์ฌ ํฌ์ธํธ: ๐ฏ
โข upstream์ผ๋ก ์ฌ๋ฌ Tomcat ์๋ฒ๋ฅผ ์ ์ํ๊ณ ๊ฐ์ค์น ๋ถ์ฌ
โข ์ ์ ํ์ผ์ Nginx๊ฐ ์ง์ ์๋น
โข ๋์ ์์ฒญ์ ๋ก๋ ๋ฐธ๋ฐ์ฑ์ผ๋ก ๋ถ์ฐ
โข ์ ์ ํ ํค๋์ ํ์์์ ์ค์ ์ผ๋ก ์์ ์ฑ ํ๋ณด
๐ช ์ค์ ์๋๋ฆฌ์ค: ์ด๋ค ์ํฉ์ ๋ญ ์จ์ผ ํ ๊น?
์ด๋ก ์ ์ถฉ๋ถํ ๋ฐฐ์ ์ผ๋, ์ด์ ์ค์ ์ํฉ๋ณ๋ก ์ด๋ค ์ ํ์ ํด์ผ ํ๋์ง ์์๋ณด์! ๐ผ
๐ฑ ์๋๋ฆฌ์ค 1: ๊ฐ๋จํ ์ ์ ์น์ฌ์ดํธ
์ํฉ: HTML, CSS, JavaScript๋ก๋ง ์ด๋ฃจ์ด์ง ํฌํธํด๋ฆฌ์ค ์ฌ์ดํธ๋ ํ์ฌ ์๊ฐ ํ์ด์ง
์ถ์ฒ ์๋ฃจ์
: Nginx ๋จ๋
์ฌ์ฉ โ
์ด์ :
โข ๋์ ์ฒ๋ฆฌ๊ฐ ํ์ ์์ผ๋ ์ ํ๋ฆฌ์ผ์ด์
์๋ฒ๋ ๋ถํ์ํด
โข Nginx์ ๋น ๋ฅธ ์ ์ ํ์ผ ์๋น ๋ฅ๋ ฅ์ 100% ํ์ฉ
โข ์ค์ ์ด ๊ฐ๋จํ๊ณ ๋ฉ๋ชจ๋ฆฌ๋ ์ ๊ฒ ๋จน์ด
โข ๋น์ฉ ์ ๊ฐ ํจ๊ณผ ์ต๊ณ ! ๐ฐ
๐ ์๋๋ฆฌ์ค 2: ์ ์์๊ฑฐ๋ ์ฌ์ดํธ
์ํฉ: ์ํ ๋ชฉ๋ก, ์ฅ๋ฐ๊ตฌ๋, ๊ฒฐ์ , ํ์ ๊ด๋ฆฌ ๋ฑ ๋ณต์กํ ๊ธฐ๋ฅ์ด ํ์ํ ์ผํ๋ชฐ
์ถ์ฒ ์๋ฃจ์
: Nginx + Tomcat (๋๋ Spring Boot) โ
์ด์ :
โข ์ํ ์ด๋ฏธ์ง ๊ฐ์ ์ ์ ํ์ผ์ Nginx๊ฐ ์ฒ๋ฆฌ
โข ์ฃผ๋ฌธ ์ฒ๋ฆฌ, ์ฌ๊ณ ๊ด๋ฆฌ ๊ฐ์ ๋น์ฆ๋์ค ๋ก์ง์ Tomcat์์
โข ํธ๋ํฝ์ด ๋ง์ ๋ Nginx์ ๋ก๋ ๋ฐธ๋ฐ์ฑ ํ์ฉ
โข ๋ณด์์ ์ํด Tomcat์ ๋ด๋ถ๋ง์ ์จ๊ธธ ์ ์์ด
์ํคํ
์ฒ:
Client โ Nginx (80/443) โ Tomcat (8080) โ Database
๐ ์๋๋ฆฌ์ค 3: ์๋ํ๋ ์ค ๋ธ๋ก๊ทธ
์ํฉ: PHP ๊ธฐ๋ฐ์ ์๋ํ๋ ์ค๋ก ๋ธ๋ก๊ทธ ์ด์
์ถ์ฒ ์๋ฃจ์
: Nginx + PHP-FPM ๋๋ Apache + mod_php โ
์ด์ :
โข ์๋ํ๋ ์ค๋ PHP๋ก ๋ง๋ค์ด์ ธ์ Tomcat์ ํ์ ์์ด
โข Nginx + PHP-FPM: ์ฑ๋ฅ ์ค์ (์ถ์ฒ!) โก
โข Apache + mod_php: ์ค์ ๊ฐํธ, .htaccess ํ์ฉ ๊ฐ๋ฅ
์ฑ๋ฅ ํ:
โข Nginx์์ ์ด๋ฏธ์ง ์บ์ฑ ์ค์
โข Redis๋ Memcached๋ก DB ์ฟผ๋ฆฌ ์บ์ฑ
โข CDN ํ์ฉ์ผ๋ก ์ ์ ํ์ผ ๋ถ์ฐ
๐ข ์๋๋ฆฌ์ค 4: ๋๊ท๋ชจ ์ํฐํ๋ผ์ด์ฆ ์ ํ๋ฆฌ์ผ์ด์
์ํฉ: ์์ฒ ๋ช
์ ์ง์์ด ์ฌ์ฉํ๋ ERP, CRM ์์คํ
์ถ์ฒ ์๋ฃจ์
: Nginx + ์ฌ๋ฌ ๋์ Tomcat + DB ํด๋ฌ์คํฐ โ
์ํคํ
์ฒ:
โข L4/L7 ๋ก๋ ๋ฐธ๋ฐ์
โข Nginx ํด๋ฌ์คํฐ (๊ณ ๊ฐ์ฉ์ฑ)
โข Tomcat ํด๋ฌ์คํฐ (์ธ์
ํด๋ฌ์คํฐ๋ง)
โข DB ๋ง์คํฐ-์ฌ๋ ์ด๋ธ ๊ตฌ์กฐ
โข Redis ์ธ์
์ ์ฅ์
๊ณ ๋ ค์ฌํญ:
โข ๋ฌด์ค๋จ ๋ฐฐํฌ ์ ๋ต (Blue-Green, Rolling)
โข ๋ชจ๋ํฐ๋ง ์์คํ
(Prometheus, Grafana)
โข ๋ก๊ทธ ์์ง ๋ฐ ๋ถ์ (ELK Stack)
โข ๋ฐฑ์
๋ฐ ์ฌํด ๋ณต๊ตฌ ๊ณํ
๐ ์๋๋ฆฌ์ค 5: ์คํํธ์ MVP ๊ฐ๋ฐ
์ํฉ: ๋น ๋ฅด๊ฒ ํ๋กํ ํ์
์ ๋ง๋ค์ด์ ์์ฅ ๋ฐ์์ ํ
์คํธํ๊ณ ์ถ์ด
์ถ์ฒ ์๋ฃจ์
: Spring Boot ๋ด์ฅ Tomcat โ
์ด์ :
โข ๋ณ๋ ์๋ฒ ์ค์น ์์ด JAR ํ์ผ ํ๋๋ก ์คํ ๊ฐ๋ฅ
โข ๊ฐ๋ฐ๋ถํฐ ๋ฐฐํฌ๊น์ง ๋น ๋ฅด๊ฒ ์งํ
โข ์ด๊ธฐ์๋ ํธ๋ํฝ์ด ์ ์ผ๋ ๋จ์ํ ๊ตฌ์กฐ๋ก ์์
โข ๋์ค์ ํธ๋ํฝ์ด ๋๋ฉด Nginx๋ฅผ ์์ ์ถ๊ฐํ๋ฉด ๋ผ!
๋ฐฐํฌ ๋ช
๋ น์ด:
java -jar myapp.jar ๋! ๐
์ฌ๋ฅ๋ท ๊ฐ์ ํ๋ซํผ์์ ๊ฒฝํ ๋ง์ ๊ฐ๋ฐ์์๊ฒ ์ํคํ
์ฒ ์ค๊ณ ์กฐ์ธ์ ๋ฐ์ผ๋ฉด ์ํ์ฐฉ์ค๋ฅผ ์ค์ผ ์ ์์ด!
โ๏ธ ์ฑ๋ฅ ์ต์ ํ ํ๊ณผ ๋ฒ ์คํธ ํ๋ํฐ์ค
์๋ฒ๋ฅผ ์ ์ ํํ๋ค๋ฉด, ์ด์ ์ ๋๋ก ํ์ฉํ๋ ๋ฐฉ๋ฒ์ ์์์ผ๊ฒ ์ง? ์ค๋ฌด์์ ๋ฐ๋ก ์ธ ์ ์๋ ํ๋ค์ ๊ณต์ ํ ๊ฒ! ๐ฏ
๐ Nginx ์ฑ๋ฅ ์ต์ ํ
1. Worker ํ๋ก์ธ์ค ์ค์
worker_processes auto; # CPU ์ฝ์ด ์๋งํผ ์๋ ์ค์
worker_connections 1024; # ๋์ ์ฐ๊ฒฐ ์
2. ์บ์ฑ ์ค์
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m
max_size=1g inactive=60m use_temp_path=off;
location / {
proxy_cache my_cache;
proxy_cache_valid 200 60m;
proxy_cache_use_stale error timeout http_500 http_502 http_503;
add_header X-Cache-Status $upstream_cache_status;
}
3. Gzip ์์ถ ํ์ฑํ
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/plain text/css text/xml text/javascript
application/json application/javascript application/xml+rss;
์ด๋ ๊ฒ ์ค์ ํ๋ฉด ํ ์คํธ ๊ธฐ๋ฐ ํ์ผ๋ค์ด ์์ถ๋์ด ์ ์ก๋ผ์ ๋์ญํญ์ 70% ์ด์ ์ ์ฝํ ์ ์์ด! ๐
โ Tomcat ์ฑ๋ฅ ์ต์ ํ
1. ์ปค๋ฅํฐ ์ค์ (server.xml)
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
maxThreads="200"
minSpareThreads="25"
maxConnections="10000"
acceptCount="100"
enableLookups="false"
compression="on"
compressionMinSize="2048"
noCompressionUserAgents="gozilla, traviata"
compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript"/>
์ฃผ์ ํ๋ผ๋ฏธํฐ ์ค๋ช
: ๐
โข maxThreads: ๋์ ์ฒ๋ฆฌ ๊ฐ๋ฅํ ์ต๋ ์์ฒญ ์
โข maxConnections: ์ต๋ ์ฐ๊ฒฐ ์
โข acceptCount: ๋๊ธฐ ํ ํฌ๊ธฐ
โข compression: ์๋ต ์์ถ ํ์ฑํ
2. JVM ๋ฉ๋ชจ๋ฆฌ ์ค์
CATALINA_OPTS="-Xms2048m -Xmx4096m -XX:MetaspaceSize=256m
-XX:MaxMetaspaceSize=512m -XX:+UseG1GC"
โข Xms: ์ด๊ธฐ ํ ๋ฉ๋ชจ๋ฆฌ
โข Xmx: ์ต๋ ํ ๋ฉ๋ชจ๋ฆฌ
โข UseG1GC: G1 ๊ฐ๋น์ง ์ปฌ๋ ํฐ ์ฌ์ฉ (Java 9 ์ด์ ๊ถ์ฅ)
3. ์ธ์
ํ์์์ ์ค์ (web.xml)
<session-config>
<session-timeout>30</session-timeout>
</session-config>
๋ถํ์ํ๊ฒ ๊ธด ์ธ์ ํ์์์์ ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น์ผ. ์ ์ ํ ์๊ฐ(๋ณดํต 30๋ถ)์ผ๋ก ์ค์ ํ์! โฐ
๐ ๋ชจ๋ํฐ๋ง๊ณผ ๋ก๊ทธ ๊ด๋ฆฌ
Nginx ๋ก๊ทธ ๋ถ์:
# ์ ์ ํต๊ณ ํ์ธ
cat access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -10
# ์๋ต ์๊ฐ์ด ๊ธด ์์ฒญ ์ฐพ๊ธฐ
cat access.log | awk '$NF > 1.0 {print $0}' | tail -20
# 404 ์๋ฌ ํ์ธ
grep "404" access.log | awk '{print $7}' | sort | uniq -c | sort -rn
Tomcat ๋ก๊ทธ ๋ชจ๋ํฐ๋ง:
โข catalina.out: ํ์ค ์ถ๋ ฅ ๋ก๊ทธ
โข localhost_access_log: ์ ๊ทผ ๋ก๊ทธ
โข localhost.log: ์ ํ๋ฆฌ์ผ์ด์
๋ก๊ทธ
์ค์๊ฐ ๋ก๊ทธ ํ์ธ: tail -f catalina.out ๐ด
๐ก๏ธ ๋ณด์ ๊ณ ๋ ค์ฌํญ
์ฑ๋ฅ๋ ์ค์ํ์ง๋ง ๋ณด์์ ๋ ์ค์ํด! ํดํน๋นํ๋ฉด ๋ชจ๋ ๊ฒ ๋ฌผ๊ฑฐํ์ด ๋๋๊น. ๐ฑ
์ค๋ฌด์์ ๊ผญ ์ฑ๊ฒจ์ผ ํ ๋ณด์ ์ค์ ๋ค์ ์์๋ณด์!
๐ Nginx ๋ณด์ ์ค์
1. ์๋ฒ ์ ๋ณด ์จ๊ธฐ๊ธฐ
server_tokens off; # Nginx ๋ฒ์ ์ ๋ณด ์จ๊น
more_clear_headers Server; # Server ํค๋ ์์ ์ ๊ฑฐ
2. SSL/TLS ์ค์ (HTTPS)
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/nginx/ssl/cert.pem;
ssl_certificate_key /etc/nginx/ssl/key.pem;
# ์ต์ TLS ํ๋กํ ์ฝ๋ง ํ์ฉ
ssl_protocols TLSv1.2 TLSv1.3;
# ๊ฐ๋ ฅํ ์ํธํ ์ค์ํธ
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
ssl_prefer_server_ciphers on;
# HSTS ํค๋ ์ถ๊ฐ
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# ๊ธฐํ ๋ณด์ ํค๋
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
}
3. Rate Limiting (DDoS ๋ฐฉ์ด)
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
server {
location /api {
limit_req zone=mylimit burst=20 nodelay;
}
}
์ด ์ค์ ์ IP๋น ์ด๋น 10๊ฐ์ ์์ฒญ๋ง ํ์ฉํ๊ณ , ์๊ฐ์ ์ผ๋ก 20๊ฐ๊น์ง ๋ฒ์คํธ๋ฅผ ํ์ฉํด. DDoS ๊ณต๊ฒฉ์ ํจ๊ณผ์ ์ผ๋ก ๋ง์ ์ ์์ด! ๐ก๏ธ
๐ Tomcat ๋ณด์ ์ค์
1. ๊ด๋ฆฌ์ ํ์ด์ง ๋ณดํธ
๊ธฐ๋ณธ ๊ด๋ฆฌ์ ํ์ด์ง(/manager, /host-manager)๋ ๋ฐ๋์ ์ ๊ทผ ์ ํ์ ๊ฑธ์ด์ผ ํด!
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.0\.0\.1|192\.168\.1\.\d+" />
2. ๋ถํ์ํ ๊ธฐ๋ณธ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฑฐ
โข docs, examples, host-manager, manager ๋๋ ํ ๋ฆฌ ์ญ์
โข ํ๋ก๋์
ํ๊ฒฝ์์๋ ์ ๋ ํ์ ์์ด!
3. ์๋ฌ ํ์ด์ง ์ปค์คํฐ๋ง์ด์ง
๊ธฐ๋ณธ ์๋ฌ ํ์ด์ง๋ Tomcat ๋ฒ์ ์ ๋ณด๋ฅผ ๋
ธ์ถ์์ผ. ์ปค์คํ
์๋ฌ ํ์ด์ง๋ฅผ ๋ง๋ค์!
<error-page>
<error-code>404</error-code>
<location>/error/404.html</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/error/500.html</location>
</error-page>
4. HTTPS ๋ฆฌ๋ค์ด๋ ํธ ๊ฐ์
<security-constraint>
<web-resource-collection>
<web-resource-name>Entire Application</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
๐ก ๋ณด์ ์ฒดํฌ๋ฆฌ์คํธ:
โ
์ต์ ๋ฒ์ ์ฌ์ฉ (๋ณด์ ํจ์น ์ ์ฉ)
โ
๊ธฐ๋ณธ ํฌํธ ๋ณ๊ฒฝ ๊ณ ๋ ค
โ
๋ฐฉํ๋ฒฝ ์ค์ (ํ์ํ ํฌํธ๋ง ์คํ)
โ
์ ๊ธฐ์ ์ธ ๋ก๊ทธ ๋ชจ๋ํฐ๋ง
โ
๋ฐฑ์
์๋ํ
โ
SSL ์ธ์ฆ์ ๋ง๋ฃ์ผ ์ฒดํฌ
โ
์ทจ์ฝ์ ์ค์บ ์ ๊ธฐ ์ค์
๐ ํ์ต ๋ก๋๋งต๊ณผ ์ถ์ฒ ์๋ฃ
์ฌ๊ธฐ๊น์ง ์ฝ์๋ค๋ฉด ์ด๋ฏธ ๋ง์ ๊ฑธ ๋ฐฐ์ด ๊ฑฐ์ผ! ๐ ํ์ง๋ง ์ค๋ฌด์์ ์ ๋๋ก ํ์ฉํ๋ ค๋ฉด ๊ณ์ ๊ณต๋ถํ๊ณ ์ค์ตํด์ผ ํด. ๋จ๊ณ๋ณ ํ์ต ๋ก๋๋งต์ ์ ์ํด์ค๊ฒ!
๐ ์ด๊ธ ๋จ๊ณ (1-2๊ฐ์)
๋ชฉํ: ๊ธฐ๋ณธ ๊ฐ๋
์ดํดํ๊ณ ๊ฐ๋จํ ์๋ฒ ๊ตฌ์ถํ๊ธฐ
ํ์ต ๋ด์ฉ:
1๏ธโฃ HTTP ํ๋กํ ์ฝ ๊ธฐ์ด
โข ์์ฒญ/์๋ต ๊ตฌ์กฐ
โข ์ํ ์ฝ๋ (200, 404, 500 ๋ฑ)
โข ํค๋์ ์ญํ
2๏ธโฃ Nginx ๊ธฐ๋ณธ
โข ์ค์น ๋ฐ ๊ธฐ๋ณธ ์ค์
โข ์ ์ ํ์ผ ์๋น
โข ๊ฐ์ ํธ์คํธ ์ค์
3๏ธโฃ Tomcat ๊ธฐ๋ณธ
โข ์ค์น ๋ฐ ์คํ
โข WAR ํ์ผ ๋ฐฐํฌ
โข ๊ฐ๋จํ ์๋ธ๋ฆฟ ์์ฑ
์ค์ต ํ๋ก์ ํธ:
โข ๊ฐ์ธ ํฌํธํด๋ฆฌ์ค ์ฌ์ดํธ๋ฅผ Nginx๋ก ํธ์คํ
โข ๊ฐ๋จํ ๋ฐฉ๋ช
๋ก ์ ํ๋ฆฌ์ผ์ด์
์ Tomcat์ผ๋ก ๊ฐ๋ฐ
๐ ์ค๊ธ ๋จ๊ณ (3-4๊ฐ์)
๋ชฉํ: ์ค๋ฌด ์์ค์ ์ํคํ
์ฒ ๊ตฌ์ฑํ๊ธฐ
ํ์ต ๋ด์ฉ:
1๏ธโฃ Nginx ๊ณ ๊ธ
โข ๋ฆฌ๋ฒ์ค ํ๋ก์ ์ค์
โข ๋ก๋ ๋ฐธ๋ฐ์ฑ
โข SSL/TLS ์ค์
โข ์บ์ฑ ์ ๋ต
2๏ธโฃ Tomcat ๊ณ ๊ธ
โข ์ปค๋ฅํฐ ํ๋
โข JVM ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ
โข ์ธ์
ํด๋ฌ์คํฐ๋ง
โข JNDI ๋ฐ์ดํฐ์์ค ์ค์
3๏ธโฃ ํตํฉ ์ํคํ
์ฒ
โข Nginx + Tomcat ์ฐ๋
โข ๋ฌด์ค๋จ ๋ฐฐํฌ ์ ๋ต
โข ๋ชจ๋ํฐ๋ง ์์คํ
๊ตฌ์ถ
์ค์ต ํ๋ก์ ํธ:
โข ์ผํ๋ชฐ ์ฌ์ดํธ ๊ตฌ์ถ (Spring Boot + Nginx + MySQL)
โข ๋ก๋ ๋ฐธ๋ฐ์ฑ ํ๊ฒฝ ๊ตฌ์ฑ ๋ฐ ํ
์คํธ
๐ ๊ณ ๊ธ ๋จ๊ณ (6๊ฐ์ ์ด์)
๋ชฉํ: ๋๊ท๋ชจ ํธ๋ํฝ ์ฒ๋ฆฌ ๋ฐ ์ต์ ํ
ํ์ต ๋ด์ฉ:
1๏ธโฃ ์ฑ๋ฅ ์ต์ ํ
โข ๋ณ๋ชฉ ์ง์ ๋ถ์
โข ์บ์ฑ ์ ๋ต ๊ณ ๋ํ
โข CDN ํ์ฉ
โข DB ์ฟผ๋ฆฌ ์ต์ ํ
2๏ธโฃ ๊ณ ๊ฐ์ฉ์ฑ ๊ตฌ์ฑ
โข Active-Active ํด๋ฌ์คํฐ
โข ์๋ ์ฅ์ ๋ณต๊ตฌ
โข ํฌ์ค ์ฒดํฌ ์ค์
3๏ธโฃ DevOps ํตํฉ
โข Docker ์ปจํ
์ด๋ํ
โข Kubernetes ์ค์ผ์คํธ๋ ์ด์
โข CI/CD ํ์ดํ๋ผ์ธ
โข ์ธํ๋ผ ์๋ํ (Ansible, Terraform)
์ค์ต ํ๋ก์ ํธ:
โข ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ
์ฒ ๊ตฌ์ถ
โข ์ด๋น 10,000 ์์ฒญ ์ฒ๋ฆฌ ๊ฐ๋ฅํ ์์คํ
์ค๊ณ
๐ ์ถ์ฒ ํ์ต ์๋ฃ
๊ณต์ ๋ฌธ์:
โข Nginx ๊ณต์ ๋ฌธ์: nginx.org/en/docs/
โข Apache ๊ณต์ ๋ฌธ์: httpd.apache.org/docs/
โข Tomcat ๊ณต์ ๋ฌธ์: tomcat.apache.org/tomcat-9.0-doc/
์จ๋ผ์ธ ๊ฐ์:
โข Udemy: "Nginx Fundamentals"
โข Coursera: "Web Application Technologies and Django"
โข ์ธํ๋ฐ: "์คํ๋ง ๋ถํธ์ AWS๋ก ํผ์ ๊ตฌํํ๋ ์น ์๋น์ค"
์ฑ
:
โข "Nginx HTTP Server" - Clรฉment Nedelcu
โข "Tomcat: The Definitive Guide" - Jason Brittain
โข "High Performance Browser Networking" - Ilya Grigorik
์ปค๋ฎค๋ํฐ:
โข Stack Overflow
โข Reddit r/nginx, r/java
โข ํ๊ตญ ์คํ๋ง ์ฌ์ฉ์ ๋ชจ์
์ฌ๋ฅ๋ท์์ ์ค๋ฌด ๊ฒฝํ์ด ํ๋ถํ ๋ฉํ ๋ฅผ ์ฐพ์ 1:1 ์ฝ์นญ์ ๋ฐ๋ ๊ฒ๋ ์ ๋ง ํจ๊ณผ์ ์ด์ผ! ํผ์ ๊ณต๋ถํ๋ค ๋งํ ๋ ๋ฐ๋ก ์ง๋ฌธํ๊ณ ๋ต์ ์ป์ ์ ์๊ฑฐ๋ . ๐ฏ
๐ง ํธ๋ฌ๋ธ์ํ : ์์ฃผ ๋ฐ์ํ๋ ๋ฌธ์ ์ ํด๊ฒฐ๋ฒ
์ค๋ฌด์์ ์์ฃผ ๋ง์ฃผ์น๋ ๋ฌธ์ ๋ค๊ณผ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํด๋ดค์ด. ์ด๊ฑฐ ์์๋๋ฉด ์ง์ง ๋์ ๋ง์ด ๋ผ! ๐ช
๐จ Nginx ๊ด๋ จ ๋ฌธ์
๋ฌธ์ 1: "502 Bad Gateway" ์๋ฌ
์์ธ: Nginx๋ ์ ์์ด์ง๋ง ๋ค์ ์ ํ๋ฆฌ์ผ์ด์
์๋ฒ(Tomcat)๊ฐ ์๋ตํ์ง ์์
ํด๊ฒฐ:
โข Tomcat์ด ์คํ ์ค์ธ์ง ํ์ธ: ps aux | grep tomcat
โข ํฌํธ๊ฐ ์ด๋ ค์๋์ง ํ์ธ: netstat -tlnp | grep 8080
โข ๋ฐฉํ๋ฒฝ ์ค์ ํ์ธ
โข Nginx ๋ก๊ทธ ํ์ธ: tail -f /var/log/nginx/error.log
๋ฌธ์ 2: "413 Request Entity Too Large" ์๋ฌ
์์ธ: ์
๋ก๋ ํ์ผ ํฌ๊ธฐ๊ฐ ์ ํ์ ์ด๊ณผ
ํด๊ฒฐ:
client_max_body_size 100M; # nginx.conf์ ์ถ๊ฐ
๋ฌธ์ 3: ์ ์ ํ์ผ์ด ์
๋ฐ์ดํธ๋์ง ์์
์์ธ: ๋ธ๋ผ์ฐ์ ๋ Nginx ์บ์
ํด๊ฒฐ:
โข ๋ธ๋ผ์ฐ์ ์บ์ ํด๋ฆฌ์ด (Ctrl + Shift + R)
โข Nginx ์บ์ ์ญ์ : rm -rf /var/cache/nginx/*
โข ํ์ผ๋ช
์ ๋ฒ์ ์ถ๊ฐ: style.css?v=1.2
๐จ Tomcat ๊ด๋ จ ๋ฌธ์
๋ฌธ์ 1: "OutOfMemoryError: Java heap space"
์์ธ: JVM ํ ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ
ํด๊ฒฐ:
# catalina.sh ๋๋ setenv.sh์ ์ถ๊ฐ
CATALINA_OPTS="-Xms2048m -Xmx4096m"
๋ฌธ์ 2: Tomcat์ด ์์๋์ง ์์
์์ธ: ํฌํธ ์ถฉ๋ ๋๋ ์ค์ ์ค๋ฅ
ํด๊ฒฐ:
โข ํฌํธ ์ฌ์ฉ ํ์ธ: lsof -i :8080
โข ๋ก๊ทธ ํ์ธ: tail -f logs/catalina.out
โข server.xml ๋ฌธ๋ฒ ์ค๋ฅ ์ฒดํฌ
๋ฌธ์ 3: ์ ํ๋ฆฌ์ผ์ด์
๋ฐฐํฌ ํ 404 ์๋ฌ
์์ธ: Context Path ์ค์ ๋ฌธ์
ํด๊ฒฐ:
โข WAR ํ์ผ๋ช
ํ์ธ (myapp.war โ /myapp)
โข server.xml์ Context ์ค์ ํ์ธ
โข webapps ํด๋ ๊ถํ ํ์ธ: chmod 755 webapps
๐จ ์ฑ๋ฅ ๋ฌธ์
๋ฌธ์ : ์๋ต ์๋๊ฐ ๋๋ฆผ
์ง๋จ ๋ฐฉ๋ฒ:
# Nginx ์๋ต ์๊ฐ ๋ก๊ทธ์ ์ถ๊ฐ
log_format timed '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$request_time $upstream_response_time';
access_log /var/log/nginx/access.log timed;
ํด๊ฒฐ ์ ๋ต:
1๏ธโฃ ๋ณ๋ชฉ ์ง์ ํ์
โข DB ์ฟผ๋ฆฌ๊ฐ ๋๋ฆฐ๊ฐ? โ ์ธ๋ฑ์ค ์ถ๊ฐ, ์ฟผ๋ฆฌ ์ต์ ํ
โข ๋คํธ์ํฌ๊ฐ ๋๋ฆฐ๊ฐ? โ CDN ์ฌ์ฉ, ์์ถ ํ์ฑํ
โข ์๋ฒ ๋ฆฌ์์ค ๋ถ์กฑ? โ ์ค์ผ์ผ ์
/์์
2๏ธโฃ ์บ์ฑ ์ ์ฉ
โข ๋ธ๋ผ์ฐ์ ์บ์ฑ
โข Nginx ํ๋ก์ ์บ์ฑ
โข ์ ํ๋ฆฌ์ผ์ด์
๋ ๋ฒจ ์บ์ฑ (Redis, Memcached)
3๏ธโฃ ๋น๋๊ธฐ ์ฒ๋ฆฌ
โข ๋ฌด๊ฑฐ์ด ์์
์ ๋ฐฑ๊ทธ๋ผ์ด๋๋ก
โข ๋ฉ์์ง ํ ํ์ฉ (RabbitMQ, Kafka)
๐ ์ค๋ฌด ์ฌ๋ก ์ฐ๊ตฌ
์ด๋ก ๋ง ์์์๋ ๋ถ์กฑํด! ์ค์ ๊ธฐ์ ๋ค์ด ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง ์์๋ณด์. ๐ข
๐ฑ ์ฌ๋ก 1: ๋ทํ๋ฆญ์ค (Netflix)
์ํคํ
์ฒ:
โข ํ๋ก ํธ์๋: Nginx (์ ์ ์ฝํ
์ธ , SSL ์ข
๋ฃ)
โข ๋ฐฑ์๋: Spring Boot + Tomcat (๋ง์ดํฌ๋ก์๋น์ค)
โข ์คํธ๋ฆฌ๋ฐ: ์ ์ฉ CDN
ํต์ฌ ์ ๋ต:
โข ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ
์ฒ๋ก ์๋น์ค ๋ถ๋ฆฌ
โข Zuul API Gateway๋ก ๋ผ์ฐํ
โข Hystrix๋ก ์ฅ์ ๊ฒฉ๋ฆฌ
โข ์ ์ธ๊ณ CDN์ผ๋ก ์ฝํ
์ธ ๋ถ์ฐ
๋ฐฐ์ธ ์ :
์๋น์ค๋ฅผ ์์ ๋จ์๋ก ๋๋๊ณ , ๊ฐ ์๋น์ค๋ฅผ ๋
๋ฆฝ์ ์ผ๋ก ๋ฐฐํฌ/ํ์ฅํ ์ ์๊ฒ ๋ง๋ค์ด์ผ ํด! ๐ฏ
๐ ์ฌ๋ก 2: ์ฟ ํก (Coupang)
์ํคํ
์ฒ:
โข L4/L7 ๋ก๋ ๋ฐธ๋ฐ์
โข Nginx ํด๋ฌ์คํฐ (์๋ฐฑ ๋)
โข Spring Boot ์ ํ๋ฆฌ์ผ์ด์
์๋ฒ (์์ฒ ๋)
โข ๋ถ์ฐ ์บ์ (Redis Cluster)
โข ์ค๋ฉ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค
ํต์ฌ ์ ๋ต:
โข ํผํฌ ํ์(๋ก์ผ๋ฐฐ์ก ์์ ์๊ฐ) ๋๋น ์คํ ์ค์ผ์ผ๋ง
โข ์ค์๊ฐ ์ฌ๊ณ ๊ด๋ฆฌ๋ฅผ ์ํ ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ํคํ
์ฒ
โข ๊ฒ์ ์ฑ๋ฅ ํฅ์์ ์ํ Elasticsearch ํ์ฉ
๋ฐฐ์ธ ์ :
๋๊ท๋ชจ ํธ๋ํฝ์ ์ฒ๋ฆฌํ๋ ค๋ฉด ์ํ ํ์ฅ(Scale-out)์ด ํ์! ๊ทธ๋ฆฌ๊ณ ์บ์ฑ ์ ๋ต์ด ์ ๋ง ์ค์ํด. ๐ก
๐ฐ ์ฌ๋ก 3: ๋ค์ด๋ฒ (Naver)
์ํคํ
์ฒ:
โข Nginx ๊ธฐ๋ฐ ์ปค์คํ
์น ์๋ฒ
โข ์์ฒด ๊ฐ๋ฐ WAS (nGrinder, Arcus)
โข ๋ถ์ฐ ์บ์ ์์คํ
โข ๋ง์ดํฌ๋ก์๋น์ค ํ๋ซํผ
ํต์ฌ ์ ๋ต:
โข ์์ฒด ๊ฐ๋ฐ ๋๊ตฌ๋ก ์ต์ ํ
โข A/B ํ
์คํธ ํ๋ซํผ์ผ๋ก ์ง์์ ๊ฐ์
โข ์ค์๊ฐ ๋ชจ๋ํฐ๋ง ๋ฐ ์๋ฆผ ์์คํ
๋ฐฐ์ธ ์ :
ํ์ค ๋๊ตฌ๋ฅผ ์ ํ์ฉํ๋, ํ์ํ๋ฉด ์ปค์คํฐ๋ง์ด์งํ๊ฑฐ๋ ์์ฒด ๊ฐ๋ฐ๋ ๊ณ ๋ คํด์ผ ํด! ๐ง
๐ ๋ฏธ๋ ํธ๋ ๋์ ๋ฐ์ ๋ฐฉํฅ
๊ธฐ์ ์ ๊ณ์ ๋ฐ์ ํ๊ณ ์์ด. ์์ผ๋ก ์ด๋ค ๋ณํ๊ฐ ์ฌ์ง ์์๋ณด์! ๐ฎ
โ๏ธ ํด๋ผ์ฐ๋ ๋ค์ดํฐ๋ธ ์๋
1. ์ปจํ
์ด๋ํ (Docker)
์ ํต์ ์ธ ์๋ฒ ์ค์น ๋ฐฉ์์์ ์ปจํ
์ด๋ ๊ธฐ๋ฐ์ผ๋ก ์ ํ ์ค์ด์ผ.
Dockerfile ์์:
FROM nginx:alpine
COPY nginx.conf /etc/nginx/nginx.conf
COPY dist/ /usr/share/nginx/html/
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
2. Kubernetes ์ค์ผ์คํธ๋ ์ด์
์๋ฐฑ, ์์ฒ ๊ฐ์ ์ปจํ
์ด๋๋ฅผ ์๋์ผ๋ก ๊ด๋ฆฌํด์ฃผ๋ ์์คํ
์ด์ผ.
โข ์๋ ์ค์ผ์ผ๋ง
โข ์๊ฐ ์น์ (์ปจํ
์ด๋ ์ฃฝ์ผ๋ฉด ์๋ ์ฌ์์)
โข ๋ก๋ ๋ฐธ๋ฐ์ฑ
โข ๋ฌด์ค๋จ ๋ฐฐํฌ
3. ์๋ฒ๋ฆฌ์ค (Serverless)
์๋ฒ ๊ด๋ฆฌ ์์ด ์ฝ๋๋ง ๋ฐฐํฌํ๋ ๋ฐฉ์!
โข AWS Lambda
โข Google Cloud Functions
โข Azure Functions
ํ์ง๋ง ์์ ํ ์๋ฒ๋ฆฌ์ค๋ก ๊ฐ๊ธฐ๋ ์ด๋ ต๊ณ , ํ์ด๋ธ๋ฆฌ๋ ์ํคํ
์ฒ๊ฐ ๋์ธ๊ฐ ๋ ๊ฑฐ์ผ! ๐ฏ
โก HTTP/3์ QUIC
HTTP/2 ๋ค์์ HTTP/3์ผ! QUIC ํ๋กํ ์ฝ ๊ธฐ๋ฐ์ผ๋ก ๋ ๋น ๋ฅด๊ณ ์์ ์ ์ด์ง.
์ฃผ์ ํน์ง:
โข UDP ๊ธฐ๋ฐ (TCP๋ณด๋ค ๋น ๋ฆ)
โข ์ฐ๊ฒฐ ๋ง์ด๊ทธ๋ ์ด์
(Wi-Fi โ 4G ์ ํ ์์๋ ๋๊น ์์)
โข ํฅ์๋ ๋ณด์
โข ๋ ๋์ ๋ฉํฐํ๋ ์ฑ
Nginx๋ ์ด๋ฏธ HTTP/3๋ฅผ ์ง์ํ๊ณ ์์ด! ์กฐ๋ง๊ฐ ํ์ค์ด ๋ ๊ฑฐ์ผ. ๐
๐ค AI/ML ํตํฉ
์๋ฒ ๊ด๋ฆฌ์๋ AI๊ฐ ๋ค์ด์ค๊ณ ์์ด!
โข ์๋ ์ฑ๋ฅ ํ๋
โข ์ด์ ํธ๋ํฝ ํ์ง
โข ์์ธก ๊ธฐ๋ฐ ์ค์ผ์ผ๋ง
โข ์ง๋ฅํ ์บ์ฑ
์์ผ๋ก๋ ์๋ฒ๊ฐ ์ค์ค๋ก ํ์ตํ๊ณ ์ต์ ํํ๋ ์๋๊ฐ ์ฌ ๊ฑฐ์ผ! ๐ง
๐ ํต์ฌ ์์ฝ ์ ๋ฆฌ
์, ๊ธด ์ฌ์ ์ด์์ง? ๐
ํต์ฌ๋ง ๋ค์ ์ ๋ฆฌํด๋ณผ๊ฒ!
๐ฏ ์น ์๋ฒ vs ์ ํ๋ฆฌ์ผ์ด์
์๋ฒ
โข ์น ์๋ฒ: ์ ์ ์ฝํ
์ธ ์ ๊ณต (HTML, CSS, JS, ์ด๋ฏธ์ง)
โข ์ ํ๋ฆฌ์ผ์ด์
์๋ฒ: ๋์ ์ฝํ
์ธ ์์ฑ, ๋น์ฆ๋์ค ๋ก์ง ์ฒ๋ฆฌ
๐ Nginx
โข ์ด๋ฒคํธ ๊ธฐ๋ฐ ๋น๋๊ธฐ ์ํคํ
์ฒ
โข ๋์ ๋์ ์ ์ ์ฒ๋ฆฌ ๋ฅ๋ ฅ
โข ์ ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ
โข ๋ฆฌ๋ฒ์ค ํ๋ก์, ๋ก๋ ๋ฐธ๋ฐ์ฑ ๊ธฐ๋ฅ
โข ํ๋์ ์ธ ์น ์๋น์ค์ ์ต์
๐ฅ Apache
โข ํ๋ก์ธ์ค/์ค๋ ๋ ๊ธฐ๋ฐ ์ํคํ
์ฒ
โข ๊ฐ๋ ฅํ ๋ชจ๋ ์์คํ
โข .htaccess ์ง์
โข ๋ฐฉ๋ํ ๋ฌธ์์ ์ปค๋ฎค๋ํฐ
โข PHP ์ ํ๋ฆฌ์ผ์ด์
๊ณผ ๊ถํฉ ์ข์
โ Tomcat
โข ์๋ฐ ์๋ธ๋ฆฟ ์ปจํ
์ด๋
โข ๊ฐ๋ณ๊ณ ๋น ๋ฅธ ์์
โข ๋ฌด๋ฃ ์คํ์์ค
โข Spring Boot์ ์๋ฒฝํ ํธํ
โข ์๋ฐ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ํ์ค
๐ ์ค๋ฌด ๋ฒ ์คํธ ํ๋ํฐ์ค
โข ์ ์ ํ์ผ์ ์น ์๋ฒ(Nginx)๊ฐ ์ฒ๋ฆฌ
โข ๋์ ์์ฒญ์ ์ ํ๋ฆฌ์ผ์ด์
์๋ฒ(Tomcat)๋ก ์ ๋ฌ
โข ๋ก๋ ๋ฐธ๋ฐ์ฑ์ผ๋ก ํธ๋ํฝ ๋ถ์ฐ
โข ์บ์ฑ ์ ๋ต์ผ๋ก ์ฑ๋ฅ ํฅ์
โข ๋ณด์ ์ค์ ํ์ (HTTPS, ํค๋, Rate Limiting)
โข ์ง์์ ์ธ ๋ชจ๋ํฐ๋ง๊ณผ ์ต์ ํ
๐ก ํ์ต ํ
โข ๊ณต์ ๋ฌธ์๋ฅผ ๊ผผ๊ผผํ ์ฝ์
โข ์ง์ ์ค์นํ๊ณ ์ค์ตํด๋ณด์
โข ์์ ํ๋ก์ ํธ๋ถํฐ ์์ํ์
โข ์ปค๋ฎค๋ํฐ์ ์ฐธ์ฌํ์
โข ์ฌ๋ฅ๋ท ๊ฐ์ ํ๋ซํผ์์ ๋ฉํ ๋ฅผ ์ฐพ์ ๋ฐฐ์ฐ์!
๊ธฐ์ตํด! ์๋ฒฝํ ์ํคํ
์ฒ๋ ์์ด. ์ํฉ์ ๋ง๋ ์ต์ ์ ์ ํ์ด ์ค์ํด. ๐ฏ
์ฒ์์๋ ์ด๋ ต๊ฒ ๋๊ปด์ง๊ฒ ์ง๋ง, ํ๋์ฉ ์ฐจ๊ทผ์ฐจ๊ทผ ๋ฐฐ์ฐ๋ค ๋ณด๋ฉด ์ด๋์ ์ ๋ฌธ๊ฐ๊ฐ ๋์ด ์์ ๊ฑฐ์ผ!
๐ ๋ง๋ฌด๋ฆฌํ๋ฉฐ
์! ์ฌ๊ธฐ๊น์ง ์ฝ์๋ค๋ฉด ์ ๋ง ๋๋จํด! ๐๐๐
์น ์๋ฒ์ ์ ํ๋ฆฌ์ผ์ด์
์๋ฒ์ ์ฐจ์ด, Nginx, Apache, Tomcat์ ํน์ง๊ณผ ํ์ฉ๋ฒ๊น์ง ๋ชจ๋ ๋ค๋ค๋ดค์ด. ์ด์ ์น๊ตฌ๋คํํ
์์ ์๊ฒ ์ค๋ช
ํ ์ ์๊ฒ ์ง? ๐
์ด ์ง์์ ๋ฐํ์ผ๋ก ๋ฉ์ง ์น ์๋น์ค๋ฅผ ๋ง๋ค์ด๋ณด๊ธธ ๋ฐ๋ผ! ๊ทธ๋ฆฌ๊ณ ๋งํ๋ ๋ถ๋ถ์ด ์๋ค๋ฉด ์ฌ๋ฅ๋ท์์ ๊ฒฝํ ๋ง์ ๊ฐ๋ฐ์๋ค์๊ฒ ๋์์ ๋ฐ๋ ๊ฒ๋ ์ข์ ๋ฐฉ๋ฒ์ด์ผ. ํผ์ ๊ณ ๋ฏผํ๋ ์๊ฐ์ ์ค์ด๊ณ ๋ ๋น ๋ฅด๊ฒ ์ฑ์ฅํ ์ ์๊ฑฐ๋ ! ๐
๊ธฐ์ ์ ๊ณ์ ๋ฐ์ ํ๋๊น, ํญ์ ๋ฐฐ์ฐ๋ ์์ธ๋ฅผ ์ ์งํ์. ์ค๋ ๋ฐฐ์ด ๋ด์ฉ๋ ๋ช ๋
ํ์๋ ๋ ๋ฌ๋ผ์ง ์ ์์ด. ํ์ง๋ง ๊ธฐ๋ณธ ์๋ฆฌ๋ฅผ ์ดํดํ๊ณ ์๋ค๋ฉด ์ด๋ค ๋ณํ๋ ๋๋ ต์ง ์์ ๊ฑฐ์ผ! ๐ช
์ง๋ฌธ์ด๋ ํผ๋๋ฐฑ์ด ์๋ค๋ฉด ์ธ์ ๋ ํ์์ด์ผ! ํจ๊ป ์ฑ์ฅํ๋ ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ๋ฅผ ๋ง๋ค์ด๊ฐ์! ๐
ํ๋ณตํ ์ฝ๋ฉ ๋๊ธธ ๋ฐ๋ผ! Happy Coding! ๐จโจ
๐ ์ด ๊ธ์ด ๋์์ด ๋์๋ค๋ฉด ๊ณต์ ํด์ฃผ์ธ์! ๐
๋ ๋ง์ ๊ฐ๋ฐ ์ง์์ ์ฌ๋ฅ๋ท '์ง์์ธ์ ์ฒ'์์ ๋ง๋์! ๐
๊ด๋ จ ํค์๋
๋๊ธ ์์ฑ
์ด ๊ธ์ ๋ํ ์ฌ๋ฌ๋ถ์ ์๊ฐ์ ๋ค๋ ค์ฃผ์ธ์
๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค
๋๊ธ์ ์์ฑํ๋ ค๋ฉด ๋จผ์ ๋ก๊ทธ์ธํด์ฃผ์ธ์.
๋๊ธ 0
์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์์ง ๋๊ธ์ด ์์ต๋๋ค.