๐ง ๋ค์ด๊ฐ๊ธฐ์
์ต๊ทผ์ k6๋ก ๋ถํ ํ ์คํธ๋ฅผ ์งํํ๋ฉด์, ์์ฒญ์ด ๋ชฐ๋ฆด ๋ ํฐ์บฃ์ด ๋ฐ๋ฆฌ๋ฉฐ ์๋ต ์๋๊ฐ ๋๋ ค์ง๋ ํ์์ ํ์ธํ ์ ์์๋ค. ํ์ ์์ฒด๋ ์ดํด๊ฐ ๊ฐ์ง๋ง, ์ ์ 'ํฐ์บฃ์ด ๋ฐ๋ฆฐ๋ค'๋ ๊ฒ ์ ํํ ์ด๋ค ๊ตฌ์กฐ์ ์ธ ์ด์ ์์ ๋น๋กฏ๋ ๊ฑด์ง๋ ์ ๋ชจ๋ฅด๊ฒ ๋ค๋ ์๊ฐ์ด ๋ค์๋ค. ํฐ์บฃ์ด ๋ญ๊ฐ ์ฒ๋ฆฌ๋ฅผ ๋ชปํ๊ณ ๋๊ธฐ์ด์ด ์์ด๋ ๊ฑด ์๊ฒ ๋๋ฐ, ๊ทธ ์์์ ์๋ธ๋ฆฟ์ ์ด๋ค ์ญํ ์ ํ๊ณ , ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์ด๋๊น์ง ์ฑ ์์ง๋์ง ๋ฑ ๊ธฐ๋ณธ์ ์ธ ๊ฐ๋ ์ด ๋ชจํธํ๊ฒ ๋๊ปด์ก๋ค. ๊ทธ๋์ ์ด๋ฒ ๊ธฐํ์ ํฐ์บฃ์ ๋์ ์๋ฆฌ๋ฅผ ์ค์ฌ์ผ๋ก, ๊ทธ ํต์ฌ ๊ตฌ์ฑ ์์์ธ ์๋ธ๋ฆฟ๊ณผ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ๋ํด ์ ๋๋ก ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํ๋ค.
๐ธServlet(์๋ธ๋ฆฟ)
1๏ธโฃ ์๋ธ๋ฆฟ์ด๋?
์๋ฐ ๊ธฐ๋ฐ์ ์น ์์ฒญ ์ฒ๋ฆฌ์ฉ ์๋ฒ ์ฌ์ด๋ ์ปดํฌ๋ํธ๋ก,
HTTP ์์ฒญ์ ๋ฐ์ ์ฒ๋ฆฌํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ HTTP ์๋ต์ผ๋ก ๋๋๋ ค์ฃผ๋ ์ญํ ์ ํ๋ค.
์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๋ค ๋ณด๋ฉด, ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ฐ์ ์ฒ๋ฆฌํ ๋ค, ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ์๋ต์ผ๋ก ๋๋๋ ค์ฃผ๋ ๊ตฌ์กฐ๋ฅผ ์์ฃผ ๋ณด๊ฒ ๋๋ค. ์๋ฐ ์ง์์์๋ ์ด ์ญํ ์ ์๋ธ๋ฆฟ(Servlet)์ด ๋ด๋นํ๋ค.
์ฐ๋ฆฌ๊ฐ ํํ ์ฌ์ฉํ๋ API ์์ฒญ, ์๋ฅผ ๋ค์ด GET์ด๋ POST ์์ฒญ์ ์๊ฐํด๋ณด์.
- GET ์์ฒญ์ ์๋ฒ๋ก๋ถํฐ ์ ๋ณด๋ฅผ ์กฐํํ๋ ๋ฐ ์ฌ์ฉ๋๊ณ ,
- POST ์์ฒญ์ ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๊ฑฐ๋ ์์ฑํ ๋ ์ฃผ๋ก ์ฌ์ฉ๋๋ค.
๋ ์์ฒญ ๋ชจ๋ ์กฐํํ๊ณ ์ ํ๋ ๊ฐ์ด๋, ์ฑ๊ณตํ๋ค๋ ๊ฐ์ ์๋ต์ผ๋ก ๋ฐ๋๋ค. ์ฆ ์์ฒญ์ด ์์ผ๋ฉด ์๋ต๋ ์๋ค.
ํด๋ผ์ด์ธํธ๊ฐ ์ด๋ค ์์ฒญ์ ๋ณด๋ด๋ฉด, ๊ทธ ์์ฒญ์ ๋ถ์ํ๊ณ ์ฒ๋ฆฌํ ๋ค, ๊ทธ์ ๋ง๋ ์๋ต์ ๋ค์ ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌํด์ฃผ๋ ๊ฒ์ด ๋ฐ๋ก ์๋ธ๋ฆฟ์ ์ญํ ์ด๋ค.
2๏ธโฃ ์๋ธ๋ฆฟ์ ํน์ง
- ์์ฒญ์ ๋ํ ์๋ต์ HTML ๋ฑ ์น ๋ฌธ์ ํ์์ผ๋ก ์์ฑํด ๋ฐํํ๋ค.
- Java Thread๋ฅผ ์ด์ฉํด ๋ฉํฐ์ค๋ ๋ ๋ฐฉ์์ผ๋ก ๋์ํ๋ฉฐ, ๋์์ ์ฌ๋ฌ ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์๋ค.
- MVC ํจํด์์ Controller ์ญํ ์ ์ํํ๋ค.
- ์๋ธ๋ฆฟ ์ปจํ ์ด๋์์ ์คํ๋๋ฉฐ, ์์ฒญ ์๋ช ์ฃผ๊ธฐ ์ ๋ฐ์ ๊ด๋ฆฌ๋ฐ๋๋ค.
- UDP๋ณด๋ค ์ ๋ขฐ์ฑ์ ๋์ง๋ง, ์๋์ ์ผ๋ก ์ฒ๋ฆฌ ์๋๋ ๋๋ฆฌ๋ค (TCP ๊ธฐ๋ฐ์ด๊ธฐ ๋๋ฌธ)
์๋ธ๋ฆฟ์ ๋จ์ํ HTTP ์ฒ๋ฆฌ๊ธฐ๋ฅผ ๋์ด์, ์น ์๋ฒ์ ํด๋ผ์ด์ธํธ ์ฌ์ด์ ๋ชจ๋ ํ๋ฆ์ ๋ด๋นํ๋ ํต์ฌ ์ปดํฌ๋ํธ๋ค.
์คํ๋ง ๋ถํธ๋ฅผ ์ฐ๋ , JSP๋ฅผ ์ฐ๋ , ๊ฒฐ๊ตญ ๊ทธ ์๋์์ ์์ฒญ์ ๋ฐ์ ์๋ต์ ๋ณด๋ด๋ ์ผ์ ์๋ธ๋ฆฟ์ด ํ๊ณ ์๋ค.
3๏ธโฃ ์๋ธ๋ฆฟ์ ๋์ ๊ณผ์
1. ํด๋ผ์ด์ธํธ ์์ฒญ (HTTP Request)
2. ์๋ธ๋ฆฟ ์ปจํ ์ด๋ ๋์ ์์
3. init() ํธ์ถ - ์ด๊ธฐํ
4. service() → doGet() / doPost()
5. ์๋ต ๋ฐํ (HTTP Response)
6. destroy()
๐น1. ํด๋ผ์ด์ธํธ ์์ฒญ (HTTP Request)
์ฌ์ฉ์๊ฐ ์น ๋ธ๋ผ์ฐ์ ๋ ์ฑ์์ ํน์ URL๋ก ์์ฒญ์ ๋ณด๋ธ๋ค.
์ด ์์ฒญ์ HTTP ํ๋กํ ์ฝ์ ํตํด ์๋ฒ(WAS, Web Application Server)๋ก ์ ๋ฌ๋๋ค.
๐น2. ์๋ธ๋ฆฟ ์ปจํ ์ด๋ ๋์ ์์
WAS ๋ด๋ถ์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์ด ์์ฒญ์ ๊ฐ์งํ๊ณ , ๋ค์ ๊ณผ์ ์ ์๋์ผ๋ก ์ํํ๋ค.
์์ฒญ ๋ฐ ์๋ต์ ์ฌ์ฉ๋๋ ๊ฐ์ฒด๋ HttpServletRequest, HttpServletResponse์ด๋ค.
์ปจํ ์ด๋๊ฐ ์์ฒญ๋ง๋ค ์ด ๊ฐ์ฒด๋ค์ ์๋์ผ๋ก ์์ฑํด์ ์๋ธ๋ฆฟ์ ์ ๋ฌํ๋ค.
- web.xml ํ์ธ
์์ฒญ๋ URL์ด ์ด๋ค ์๋ธ๋ฆฟ๊ณผ ๋งคํ๋์ด ์๋์ง ํ์ธํ๋ค.
์ต๊ทผ์๋ ์ ๋ ธํ ์ด์ (@WebServlet)์ผ๋ก ๋งคํํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ง๋ง, ์ ํต์ ์ธ ๋ฐฉ์์ web.xml์ ์ด์ฉ - ์๋ธ๋ฆฟ ํด๋์ค ๋ก๋ฉ ๋ฐ ์คํ
ํด๋น ์์ฒญ์ ๋์ํ๋ ์๋ธ๋ฆฟ ํด๋์ค๊ฐ ์ฒ์ ์์ฒญ๋ ๊ฒฝ์ฐ, ์ปจํ ์ด๋๋ ํด๋น ํด๋์ค๋ฅผ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ก๋ฉํ๊ณ , ์๋ธ๋ฆฟ ๊ฐ์ฒด๋ฅผ ๋จ ํ ๋ฒ๋ง ์์ฑ
๐น3. init() ํธ์ถ (์ด๊ธฐํ)
์๋ธ๋ฆฟ์ด ์ฒ์ ์์ฑ๋ ๋, ์ปจํ ์ด๋๋ ํ ๋ฒ๋ง init() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์๋ธ๋ฆฟ์ ์ด๊ธฐํํ๋ค.
๐น4. ์์ฒญ ์ฒ๋ฆฌ: service() → doGet() / doPost()
์ปจํ
์ด๋๋ ํด๋น ์๋ธ๋ฆฟ์ service() ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
์ด ๋ฉ์๋๋ ์์ฒญ์ HTTP ๋ฉ์๋(GET, POST ๋ฑ)๋ฅผ ํ๋ณํ์ฌ, ๊ทธ์ ๋ง๋ doGet() ๋๋ doPost() ๊ฐ์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
- GET ์์ฒญ → doGet() ํธ์ถ
- POST ์์ฒญ → doPost() ํธ์ถ
๊ฐ ๋ฉ์๋ ๋ด๋ถ์์ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๊ณ , ์๋ต์ HttpServletResponse ๊ฐ์ฒด์ ๋ณด๋ด์ ํด๋ผ์ด์ธํธ์ ์ ๋ฌํ๋ค.
๐น5. ์๋ต ๋ฐํ (HTTP Response)
HttpServletResponse๊ฐ์ฒด๋ฅผ ํตํ ์๋ต
์์ฒญ์ ๋ํ ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋๋ฉด, ๊ฒฐ๊ณผ๋ HTTP ์๋ต ํํ๋ก ํด๋ผ์ด์ธํธ์ ๋ฐํํ๋ค.
๐น6. destroy() ํธ์ถ (์ข ๋ฃ ์)
์๋ธ๋ฆฟ์ด ๋ ์ด์ ํ์ ์์ด์ง๊ฑฐ๋, ์๋ฒ๊ฐ ์ข ๋ฃ๋ ๋, ์ปจํ ์ด๋๋ destroy() ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
HttpServletRequest, HttpServletResponse ๋ ๊ฐ์ฒด ์๋ฉธ
๐ธServlet Container(์๋ธ๋ฆฟ ์ปจํ ์ด๋)
1๏ธโฃ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋?
์๋ธ๋ฆฟ์ ๊ด๋ฆฌํด์ฃผ๋ ์ปจํ ์ด๋
์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์๋ฐ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ์๋ธ๋ฆฟ ๊ธฐ๋ฐ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ํต์ฌ ์์ง์ด๋ค. HTTP ์์ฒญ์ ๋ฐ๊ณ , ์ ์ ํ ์๋ธ๋ฆฟ์ผ๋ก ์ฐ๊ฒฐํ๊ณ , ์๋ต์ ๋ฐํํ๊ธฐ๊น์ง์ ์ ๊ณผ์ ์ ๋ด๋นํ๋ค.
2๏ธโฃ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ์ญํ
๐น1. ์น์๋ฒ์์ ํต์ ์ง์
ํด๋ผ์ด์ธํธ ์์ฒญ์ ๋ฐ์๋ค์ฌ HTTP ํ๋กํ ์ฝ์ ํด์ํ๊ณ ์ฒ๋ฆฌํ ์ ์๋๋ก ์ค๋น
์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์น์๋ฒ์ ํตํฉ๋๊ฑฐ๋ ๋ด์ฅ๋์ด, ํด๋ผ์ด์ธํธ๋ก๋ถํฐ HTTP ์์ฒญ์ ์์ ํ๋ค.
์ผ๋ฐ์ ์ผ๋ก๋ Apache, Nginx ๊ฐ์ ์น์๋ฒ๊ฐ ์์ฒญ์ ๋ฐ์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ์ ๋ฌํ๊ฑฐ๋, Tomcat๊ณผ ๊ฐ์ด ์น์๋ฒ์ ์ปจํ ์ด๋๊ฐ ํตํฉ๋ ํํ๋ ์กด์ฌํ๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ๋คํธ์ํฌ ํต์ ์ ์ํด์๋ ๊ฐ๋ฐ์๊ฐ ์ง์ ์์ผ์ ์์ฑํ๊ณ , listen(), accept() ๋ฑ์ ๊ตฌํํด์ผ ํ์ง๋ง, ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์ด๋ฌํ ์ ์์ค ๋คํธ์ํฌ ์ฒ๋ฆฌ ๊ณผ์ ์ ๋ด๋ถ์ ์ผ๋ก ์๋ํํ๋ค. ์ฆ, ๊ฐ๋ฐ์๋ ๋ณต์กํ ๋คํธ์ํฌ ์ค์ ์ด๋ HTTP ํ๋กํ ์ฝ ์ฒ๋ฆฌ๋ฅผ ์ ๊ฒฝ ์ธ ํ์ ์์ด, ์๋ธ๋ฆฟ์ ๋น์ฆ๋์ค ๋ก์ง ๊ตฌํ์๋ง ์ง์คํ ์ ์๊ฒ ๋๋ค.
๐น2. ์๋ธ๋ฆฟ ๊ฐ์ฒด ์์ฑ ๋ฐ ์๋ช ์ฃผ๊ธฐ ๊ด๋ฆฌ
์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์๋ธ๋ฆฟ ํด๋์ค๋ฅผ ๋ก๋ํ๊ณ , ํด๋น ๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋ (init(), service(), destroy())๋ฅผ ๊ด๋ฆฌํ๋ค.
- ์์ฒญ์ด ์ฒ์ ์ค๋ฉด ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ init() ํธ์ถ
- ํด๋ผ์ด์ธํธ ์์ฒญ์ด ๋ค์ด์ค๋ฉด ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ํด๋น ์๋ธ๋ฆฟ ํด๋์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋๋์ด ์๋์ง ํ์ธํ๋ค.
- ์๋ธ๋ฆฟ์ด ์์ง ์์ฑ๋์ง ์์๋ค๋ฉด, ์ปจํ ์ด๋๋ ์๋ธ๋ฆฟ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , init() ๋ฉ์๋๋ฅผ ๋จ ํ ๋ฒ ํธ์ถํ์ฌ ์ด๊ธฐํ ์์ ์ ์ํํ๋ค.
- init()์ ์๋ธ๋ฆฟ์ ์ด๊ธฐ ์ค์ , ๊ณตํต ๋ฆฌ์์ค ์ด๊ธฐํ ๋ฑ์ ํ์ฉ๋๋ฉฐ, ํ ๋ฒ๋ง ํธ์ถ๋ฉ๋๋ค.
- ์์ฒญ๋ง๋ค service() ๋ฉ์๋ ์คํ
- init()์ด ์๋ฃ๋ ์ดํ๋ถํฐ ํด๋ผ์ด์ธํธ ์์ฒญ์ด ๋ค์ด์ฌ ๋๋ง๋ค, ์ปจํ ์ด๋๋ service() ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
- ์ด ๋ฉ์๋๋ ์์ฒญ ๋ฐฉ์์ ๋ฐ๋ผ ์๋์ผ๋ก doGet(), doPost() ๋ฑ์ ๋ฉ์๋๋ก ๋ถ๊ธฐ ์ฒ๋ฆฌํ๋ค.
- ์ปจํ ์ด๋๋ ์ด๋ ์์ฒญ๊ณผ ์๋ต ๊ฐ์ฒด(HttpServletRequest, HttpServletResponse)๋ ํจ๊ป ์ ๋ฌํ๋ค.
- ์๋ฒ ์ข
๋ฃ ์ destroy() ํธ์ถ
- ์๋ฒ๊ฐ ์ข ๋ฃ๋๊ฑฐ๋, ํด๋น ์๋ธ๋ฆฟ์ด ๋ณ๊ฒฝ๋์ด ๋ค์ ๋ก๋ฉ๋ ๊ฒฝ์ฐ ์ปจํ ์ด๋๋ ์๋ธ๋ฆฟ์ ์ ๊ฑฐ(destroy)ํ๋ค.
- ์ด๋ destroy() ๋ฉ์๋๋ฅผ ๋จ ํ ๋ฒ ํธ์ถํ์ฌ ์ ๋ฆฌ ์์ ์ ์ํํ๋ค.
- destroy()๋ ๋ณดํต ๋ฆฌ์์ค ํด์ , ์ฐ๊ฒฐ ์ข ๋ฃ, ๋ก๊ทธ ์ฒ๋ฆฌ ๋ฑ์ ์ฌ์ฉ๋๋ค.
๐น3. ๋ฉํฐ์ค๋ ๋ ์ฒ๋ฆฌ
์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์๋ธ๋ฆฟ์ ์์ฑํ ์ดํ, ํ๋์ ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ฅผ ์ฌ๋ฌ ์์ฒญ์ด ๋์์ ์ฌ์ฉํ ์ ์๋๋ก ๋ฉํฐ์ค๋ ๋ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ๋ค. ๊ฐ HTTP ์์ฒญ๋ง๋ค ๋ณ๋์ ์ค๋ ๋๋ฅผ ์์ฑํ์ฌ service() ๋ฉ์๋๋ฅผ ํธ์ถํจ์ผ๋ก์จ, ๋์ ์ ์ ์ฒ๋ฆฌ์ ์ฑ๋ฅ ํฅ์์ ๊ฐ๋ฅํ๊ฒ ํ๋ค.
๊ณผ๊ฑฐ์๋ ์น์๋ฒ๊ฐ ๋์ ์ธ ์ฝํ
์ธ ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด CGI(Common Gateway Interface)๋ผ๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
CGI๋ ์น์๋ฒ์ ์ธ๋ถ ํ๋ก๊ทธ๋จ ๊ฐ์ ๋ฐ์ดํฐ ํต์ ์ ์ํ ํ์ค ๊ท๊ฒฉ์ผ๋ก, C๋ Perl๋ก ์์ฑ๋ ํ๋ก๊ทธ๋จ์ด ๋ํ์ ์ด๋ค.
ํ์ง๋ง ์ด CGI ๋ฐฉ์์ ์์ฒญ๋ง๋ค ๋ณ๋์ ํ๋ก์ธ์ค๋ฅผ ์์ฑํ์ฌ ์ฒ๋ฆฌํ๋ ๊ตฌ์กฐ์๊ธฐ ๋๋ฌธ์, ๋ค์๊ณผ ๊ฐ์ ์ค๋ํ ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ์์๋ค.
- ์์ฒญ๋ง๋ค ์๋ก์ด ํ๋ก์ธ์ค๊ฐ ์์ฑ๋๊ณ , ์์ ํ์๋ ์ข ๋ฃ๋์ด์ผ ํจ
- ์ด ๊ณผ์ ์์ ๋ฉ๋ชจ๋ฆฌ์ CPU ์์ ์๋ชจ๊ฐ ํผ
- ๋์ ์์ฒญ์ด ๋ง์์ง๋ฉด ์๋ฒ ๊ณผ๋ถํ๋ก ์ด์ด์ง
์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์ด๋ฌํ CGI ๋ฐฉ์์ ๋นํจ์จ์ ๋ฉํฐ์ค๋ ๋ ๊ธฐ๋ฐ ์์ฒญ ์ฒ๋ฆฌ ๋ฐฉ์์ผ๋ก ํด๊ฒฐํ์๋ค.
- ํ๋์ ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ฅผ ์์ฑ
- ๋ค์ด์ค๋ ๊ฐ ์์ฒญ๋ง๋ค ์๋ก์ด ์ค๋ ๋๋ฅผ ์์ฑํด service() ๋ฉ์๋๋ฅผ ์คํ
๐น4. ๋ณด์ ๊ด๋ฆฌ
์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ๊ธฐ๋ณธ์ ์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ๋ณด์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
- ์ธ์ฆ(Authentication)๊ณผ ์ธ๊ฐ(Authorization) ์ฒ๋ฆฌ
- HTTPS ์ง์
- URL ์ ๊ทผ ์ ์ด
- ์ธ์ ์ฟ ํค ๊ด๋ฆฌ
์ด๋ฅผ ํตํด ์ดํ๋ฆฌ์ผ์ด์ ๋ ๋ฒจ ๋ณด์ ๋ก์ง ์์ด๋ ์์ ์ ์ธ ๋ณด์ ํ๊ฒฝ์ ๊ตฌํํ ์ ์๋ค.
๐ธ ํฐ์บฃ (Tomcat)
ํฐ์บฃ์ ๋ํ์ ์ผ๋ก ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ์ข ๋ฅ ์ค ํ๋์ด๋ค.
๋ฐ๋ผ์ ์์์ ์ดํด๋ณธ ๊ฒ๊ณผ ๊ฐ์ด ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด ๋ค์ด์ค๋ฉด ์์ฒญ๋ง๋ค ์ค๋ ๋๋ฅผ ํ ๋นํ์ฌ ์๋ธ๋ฆฟ์ service() ๋ฉ์๋๋ฅผ ์คํํ๋ค.
โถ๏ธ ํฐ์บฃ์ด ์ฐ๋ ๋๋ฅผ ํ ๋นํ๋ ๊ตฌ์กฐ
๊ณผ๊ฑฐ์๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด ๋ค์ด์ฌ ๋๋ง๋ค ์๋ก์ด ์ค๋ ๋๋ฅผ ์์ฑํ์ฌ ์๋ธ๋ฆฟ์ ์คํํ๊ณ , ์์ฒญ์ด ๋๋๋ฉด ์ค๋ ๋๋ฅผ ์๋ฉธํ๋ ๋ฐฉ์์ ์ฌ์ฉํ์๋ค. ํ์ง๋ง ์ด๋ฐ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ ๋จ์ ์ ๊ฐ์ง๊ณ ์๋ค.
- ์ค๋ ๋ ์์ฑ๊ณผ ์๋ฉธ์๋ ๋น์ฉ์ด ํผ (CPU, JVM, OS ๋ฆฌ์์ค ์๋ชจ)
- ๋งค ์์ฒญ๋ง๋ค ์ค๋ ๋๋ฅผ ์๋ก ๋ง๋ค๋ฉด ์์ ๋ญ๋น๊ฐ ์ฌํจ
- ๋์์ ๋ง์ ์์ฒญ์ด ๋ค์ด์ฌ ๊ฒฝ์ฐ, ์ค๋ ๋ ์๊ฐ ํญ์ฆํด ์์คํ ์ด ์ฝ๊ฒ ๊ณผ๋ถํ ์ํ์ ๋น ์ง ์ ์์
์์ ๊ฐ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Tomcat์ ์ฐ๋ ๋ ํ์ ์ฌ์ฉํ๋ค.
๐นํฐ์บฃ ์ฐ๋ ๋ํ์ ๋์์๋ฆฌ
์์ฒญ โถ ์์
ํ โถ idle ์ค๋ ๋ ์ฒ๋ฆฌ
โ โฒ
โผ โ
ํ ๊ฐ๋์ฐจ๋ฉด → ์ค๋ ๋ ์ถ๊ฐ ์์ฑ (max size๊น์ง)
โ
max + queue ํ๊ณ ์ด๊ณผ → ์์ฒญ ๊ฑฐ๋ถ
- ์์ฒญ ์์: ์ด๊ธฐ ์ค๋ ๋ ์์ฑ
- ์ฒซ ์์ฒญ์ด ๋ค์ด์ค๋ฉด, ์ค๋ ๋ ํ์ ์ค์ ๋ core size๋งํผ์ ์ค๋ ๋๋ฅผ ๋ฏธ๋ฆฌ ์์ฑํ๋ค.
- ์์
ํ์ ์์ฒญ ์ ์ฅ
- ์ ์ ์์ฒญ(HTTP ์์ฒญ, ์์ผ ์ฐ๊ฒฐ)์ ๋จผ์ ์์ ํ์ ์ ์ฅ๋๋ค.
- ์ ํด ์ค๋ ๋๊ฐ ์์
์ ์ฒ๋ฆฌ
- core size ์ค๋ ๋ ์ค idle(์ ํด) ์ํ์ธ ์ค๋ ๋๊ฐ ์๋ค๋ฉด, ์์ ํ์์ ์์ ์ ๊บผ๋ด ํด๋น ์ค๋ ๋์ ํ ๋นํ์ฌ ์์ฒญ์ ์ฒ๋ฆฌํ๋ค.
- ์ ํด ์ค๋ ๋ ์์ → ํ์์ ๋๊ธฐ
- ๋ชจ๋ core ์ค๋ ๋๊ฐ ์์ ์ค์ด๋ฉด, ์๋ก ๋ค์ด์จ ์์ฒญ์ ์์ ํ์์ ๋๊ธฐํ๋ค.
- ์์
ํ๊ฐ ๊ฐ๋ ์ฐจ๋ฉด ์ค๋ ๋ ์ถ๊ฐ ์์ฑ
- ์์ ํ๊ฐ ๊ฐ๋ ์ฐจ๋ฉด, ์ค๋ ๋ ํ์ maximum pool size๊น์ง ์ค๋ ๋๋ฅผ ์ถ๊ฐ ์์ฑํ์ฌ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ค ์๋ํ๋ค.
- ์ต๋ ์ค๋ ๋ + ํ ์ด๊ณผ → ์์ฒญ ๊ฑฐ๋ถ
- ์ต๋ ์ค๋ ๋ ์์ ๋๋ฌํ๊ณ ์์ ํ๋ ๊ฐ๋ ์ฐฌ ์ํ๋ผ๋ฉด, ์ถ๊ฐ ์์ฒญ์ ๊ฑฐ๋ถ๋๊ณ ํด๋ผ์ด์ธํธ๋ connection refused ๋๋ 503 Service Unavailable ์ค๋ฅ๋ฅผ ๋ฐ๊ฒ ๋๋ค.
- ์์
์๋ฃ ํ → ์ ํด ์ํ๋ก ์ ํ
- ์์ ์ ๋ง์น ์ค๋ ๋๋ ๋ค์ ์ ํด ์ํ๋ก ๋์๊ฐ๋ฉฐ, ๋ค์ ์์ฒญ์ ๋๊ธฐํ๋ค.
- ๋ถํ์ํ ์ค๋ ๋ ์ ๊ฑฐ
- ์์ ํ๊ฐ ๋น์ด ์๊ณ , core size ์ด์์ผ๋ก ์์ฑ๋ ์ค๋ ๋๊ฐ ์๋ค๋ฉด, ์ผ์ ์๊ฐ์ด ์ง๋๋ฉด ํด๋น ์ค๋ ๋๋ฅผ ์ ๊ฑฐํ๋ค.
์ค๋ ๋ ํ์ ์ ์ ํ ์ค๋ ๋ ์์ ํ๋ฅผ ๊ด๋ฆฌํ๋ฉฐ, ์์ฒญ์ ํจ์จ์ ์ผ๋ก ๋ถ์ฐ ์ฒ๋ฆฌํ๋ค๊ฐ ๋ฆฌ์์ค ํ๊ณ๋ฅผ ๋์ผ๋ฉด ์์ฒญ์ ๊ฑฐ๋ถํ์ฌ ์๋ฒ๋ฅผ ๋ณดํธํ๋ค.
๐นServer.xml
๊ทธ๋ ๋ค๋ฉด ์ด๊ธฐ์ ํฐ์บฃ์ ์ค๋ ๋ ์์, ์ต๋ ์ค๋ ๋ ์๋ ์ด๋์ ์ ์ํ ๊น?
$TOMCAT_HOME/conf/server.xml
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxThreads="200"
minSpareThreads="10"
acceptCount="100" />
- ์ด๊ธฐ ์์ฑ๋๋ ์ค๋ ๋ ์ → minSpareThreads
- ์ต๋ ์ค๋ ๋ ์ (์ค๋ ๋ ํ์ max size) → maxThreads
- ๋๊ธฐ ํ ํฌ๊ธฐ → acceptCount
์์ ๊ฐ์ด Server.xml์ ํตํด์ Tomcat์ ์ค์ ํ๋ค.
๐ฏ ์์ฒญ ๋ถํ → ํฐ์บฃ์ด ๋ฐ๋ฆฌ๋ ์ด์ ?
์ด์ , ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด ๋ค์ด์์ ๋ ํฐ์บฃ์ด ์ด๋ป๊ฒ ์ฐ๋ ๋๋ฅผ ํ ๋นํ๊ณ ์๋ธ๋ฆฟ์ ์ฒ๋ฆฌํ๋์ง์ ๋ํ ๊ตฌ์กฐ๋ฅผ ์ดํดํ์์ผ๋ฏ๋ก, ๋ถํํ ์คํธ๋ฅผ ํ ๋ ํฐ์บฃ์ด ๋ฐ๋ฆฌ๋ ์ด์ ์ ๋ํด ์ดํดํ ์ ์๋ค.
๋ค์์ ํด๋ผ์ด์ธํธ ์์ฒญ์ด ๋ง์์ก์ ๋, ํฐ์บฃ์ด ๋ฐ๋ฆฌ๋ ๊ณผ์ ์ด๋ค.
1. ์ด๊ธฐ ์ํ
- ํฐ์บฃ์ minSpareThreads๋งํผ์ ์ ํด ์ค๋ ๋๋ฅผ ๋ฏธ๋ฆฌ ์ค๋นํ๋ค.
2. ์์ฒญ์ด ์ฆ๊ฐ
- ์ ํด ์ค๋ ๋๊ฐ ๋ถ์กฑํด์ง๋ฉด ํฐ์บฃ์ maxThreads๊น์ง ์ค๋ ๋๋ฅผ ์ ์ง์ ์ผ๋ก ์์ฑํ๋ฉฐ ์์ฒญ์ ์ฒ๋ฆฌํ๋ค.
3. ์ ํด์ง maxThreads๋ฅผ ์ด๊ณผํ ์์ฒญ ๋ฐ์
- ๋์์ ์์ฒญ์ด maxThreads(์: 200)๋ฅผ ๋์ผ๋ฉด, ํฐ์บฃ์ ๋ ์ด์ ์ค๋ ๋๋ฅผ ์์ฑํ์ง ์๋๋ค.
- ์ฒ๋ฆฌํ์ง ๋ชปํ ์์ฒญ์ acceptCount(์: 100) ๋งํผ ๋๊ธฐ ํ์ ์ผ์์ ์ผ๋ก ์ ์ฅ๋๋ค.
4. ํ๊น์ง ๊ฐ๋ ์ฐจ๋ฉด?
- maxThreads์ acceptCount๊น์ง ๋ชจ๋ ์ด๊ณผ๋๋ฉด ํฐ์บฃ์ ๋ ์ด์ ์์ฒญ์ ๋ฐ์ ์ ์๋ค.
- ์ถ๊ฐ ์์ฒญ์ ๋ํด "connection refused", "503 Service Unavailable", ํน์ ํ์์์ ๋ฐ์
์ฆ ํฐ์บฃ์ ์์ฒญ ์ฒ๋ฆฌ ํ๊ณ๋ฅผ ์ด๊ณผํ์ฌ ๋๊ธฐ ํ๊ฐ ๊ฐ๋ ์ฐจ๊ณ ์๋ก์ด ์์ฒญ์ด ์ฒ๋ฆฌ๋์ง ๋ชปํ๋ ์ํ๊ฐ ๋๋ฉฐ ํฐ์บฃ์ด ๋ฐ๋ฆฌ๋ ๊ฒ์ด๋ค.
๐กํด๊ฒฐ ๋ฐฉ๋ฒ
- maxThreads, acceptCount ๊ฐ์ ์๋น์ค ๊ท๋ชจ์ ๋ง๊ฒ ์กฐ์
- ๋น๋๊ธฐ ์ฒ๋ฆฌ, Non-blocking I/O ๋์
- ์์ฒญ ์ฒ๋ฆฌ ์๊ฐ์ ์ค์ด๋ ๊ตฌ์กฐ ๊ฐ์ (์: DB ํ๋, ์บ์ฑ)
- ์ค์ผ์ผ ์์ -> ์ฌ๋ฌ ํฐ์บฃ ์ธ์คํด์ค๋ก ๋ถํ ๋ถ์ฐ
๐ ์ถ์ฒ
https://mangkyu.tistory.com/14
https://velog.io/@jihoson94/Servlet-Container-%EC%A0%95%EB%A6%AC
'Java & Kotlin' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Kotlin + SpringBoot] Flowise + LLM ์๋ฌ๋ถ์ ์๋ํ ์ ์ฉ๊ธฐ (3) | 2025.06.26 |
---|