๐Ÿ“ŒWAS ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ ํŒŒํ—ค์น˜๊ธฐ

devdoยท2022๋…„ 1์›” 3์ผ
3

JSP/Servelt

๋ชฉ๋ก ๋ณด๊ธฐ
2/3

WAS์˜ ์ •์ฒด

์ž, WAS(Web Application Server)์˜ ์ •์ฒด๋ฅผ ์•Œ์•„๋ณด์ž.

Web Server ์ค‘๊ฐ„์— Application์ด ๋“ค์–ด๊ฐ„ ๊ฒƒ์ด WAS์ด๋‹ค. ์ค‘๊ฐ„์— Application์ด ๋“ค์–ด๊ฐ„ ์ด์œ ๋Š”, ์›น ์„œ๋ฒ„์˜ ์—ญํ• ์„ ํ•˜๋ฉด์„œ ์ถ”๊ฐ€๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋“œ๋„ ์ˆ˜ํ–‰ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
์ •๋ฆฌํ•˜๋ฉด ์›น(HTTP)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ์„œ๋ฒ„์ธ๋ฐ, ์ด ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด์„œ ํ”„๋กœ๊ทธ๋žจ์˜ ์ฝ”๋“œ๋„ ๊ฐ™์ด ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋ฒ„๋ผ๋Š” ๋œป์ด๋‹ค.

์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ์ฝ”๋“œ๋Š” ๋ฐ”๋กœ ์•ž์„œ ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ ์„œ๋ธ”๋ฆฟ ๊ตฌํ˜„์ฒด๋“ค์ด๋‹ค.
์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ ์„œ๋ฒ„๋Š” HTTP ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ, ์ด๋•Œ ํ”„๋กœ๊ทธ๋žจ์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด์„œ HTTP ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„(WAS)์ด๋‹ค

๊ทธ๋ฆฌ๊ณ  WAS๋Š” web server + ์ปจํ…Œ์ด๋„ˆ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์‘? ์ปจํ…Œ์ด๋„ˆ? ์ด๊ฒŒ ๋ญ˜๊นŒ?

was์˜ ์ •์ฒด๋ฅผ ์•Œ๋ ค๋ฉด, ์„œ๋ธ”๋ฆฟ ์ฆ‰, ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๋ผ๋Š” ๊ฐœ๋…์„ ์ž˜ ์•Œ์•„์•ผ ํ•œ๋‹ค!

(์ •ํ™•ํ•˜๊ฒŒ๋Š”, ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ = Servlet + JSP + EJB ์ปจํ…Œ์ด๋„ˆ)

์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์›น์„œ๋ฒ„์™€ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ์†Œ์ผ“์„ ์ƒ์„ฑํ•˜๊ณ , ํŠน์ • ํฌํŠธ์— ๋ฆฌ์Šค๋‹ํ•˜๊ณ , ์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑํ•˜๋Š” ๋“ฑ์˜ ๋ณต์žกํ•œ ์ผ๋“ค์„ ํ•  ํ•„์š”๊ฐ€ ์—†๊ฒŒ ํ•ด์ฃผ๋Š”, ์ž๋ฐ” ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋™์  ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ๋Š” ๊ธฐ์ˆ ์ด๋‹ค.(์›๋ž˜ ์†Œ์ผ“, ์ŠคํŠธ๋ฆผ ๋“ฑ, TCP/IP ๊ธฐ์ˆ ๋กœ ํ†ต์‹ ํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Œ..)


๐Ÿ’ก Spring๊ณผ ๊ฐ™์ด ๋„“๊ฒŒ ๋ณด์ž!
WAS์˜ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์‹œ๊ฐ€ Tomcat ์ด๋‹ค.

์ด Tomcat์€ Java๋กœ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ๋Š”๋ฐ, Servlet์ด๋ผ๋Š” ์ตœ์ƒ์œ„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๊ณ , Tomcat์—๊ฒŒ Reqeust๊ฐ€ ์˜ค๋ฉด, Tomcat์ด ์ถ”๊ฐ€์ ์œผ๋กœ ๋‚ด์žฅํ•˜๊ณ  ์žˆ๋Š” WS(์›น์„œ๋ฒ„)์—๊ฒŒ ์ •์ ์ธ ํŽ˜์ด์ง€๋ฅผ ์š”์ฒญํ•˜๊ณ , ์ถ”๊ฐ€์ ์œผ๋กœ ๋™์ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ, Servlet์—๊ฒŒ ์ฑ…์ž„์„ ๋– ๋„˜๊ธด๋‹ค!(ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰-WAS์˜ ์—ญํ• !)

๊ทธ๋Ÿผ Spring ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ธ ๊ฒฝ์šฐ๋ฅผ ๋ณด์ž, Spring ๋‚ด๋ถ€์—๋Š” Dispatcher Servlet์ด๋ž€ ๊ฒƒ์ด ์žˆ๋‹ค. ์ด Dispatcher Servlet์€ ์•ž์—์„œ ๋งํ•œ Servelt์„ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค๋กœ, ์ž‘๋™flow๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

WS์—๊ฒŒ ์ •์ ์ธ ํŽ˜์ด์ง€ ์š”์ฒญ OR ๋™์ ์ธ ํŽ˜์ด์ง€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ WAS์—๊ฒŒ ์š”์ฒญ

1) WAS(tomcat)๋Š” ์š”์ฒญ์˜ ์ฒ˜๋ฆฌ ์ฑ…์ž„์„ Servelt์—๊ฒŒ ์œ„์ž„
2) Spring์˜ Dispatcher Servelt์ด ์ž‘๋™
3) FrontController์ธ Dispatcher Servelt์ด ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ตฌํ˜„ํ•œ Controller๋“ค์„ ํƒ์ƒ‰, ์ฒ˜๋ฆฌ ์ฑ…์ž„ ์œ„์ž„(์ปค๋ฉ˜ํŠธํŒจํ„ด)


Servlet์ด๋ž€?

  • ์„œ๋ธ”๋ฆฟ ์ž๋ฐ” ์ฝ”๋“œ
@WebServlet(name = "helloServelt", urlPatterns = "/hello")
public class HelloServelt extends HttpServelt {
	@Overrride
    protected void service(HttpServeltRequest request, HttpServeltResponse response){ 
    // ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ง
    }
}
  • urlPattern(/hello)์˜ URL์ด ํ˜ธ์ถœ๋˜๋ฉด ์„œ๋ธ”๋ฆฟ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋œ๋‹ค.
  • ๊ฐœ๋ฐœ์ž๋Š” ์„œ๋ธ”๋ฆฟ์„ ํ†ตํ•ด Http ์ŠคํŽ™์„ ๋งค์šฐ ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋๋‹ค.

Servelt์ด๋ž€ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ JAVA ํด๋ž˜์Šค ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„ ์ž๋ฐ” ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋ž˜์ž„์ด๋‹ค. ์ด๊ฒƒ์ด ์™œ ํ•„์š”ํ•˜๋ƒ๋ฉด ์›นํŽ˜์ด์ง€๋ฅผ ์„œ๋ฒ„์—์„œ ๋™์ (ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰)์œผ๋กœ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.

์ปจํ…Œ์ด๋„ˆ์— ์˜ํ•ด ์‹คํ–‰๋˜๋ฉด, ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž„์˜๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ํŠน์ • ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์•„ ๊ตฌํ˜„์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ด ์ฃผ๋Š” ๊ตฌ์กฐ์ด๋‹ค. ๊ทธ๋ž˜์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ ํŽธํ•˜๊ฒŒ ์›น๊ตฌ๋™์„ ์œ„ํ•œ ๊ฐœ๋ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ Request ์š”์ฒญ(HttpServletRequest)์ด๋‚˜, Response ์‘๋‹ต(HttpServletResponse)์„ ์œ„ํ•œ Servelt ๊ฐ์ฒด๋“ค์€ javax.servlet.http.HttpServelt ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์•„ ๊ตฌํ˜„ํ•œ๋‹ค.


์ปจํ…Œ์ด๋„ˆ๋ž€?

์ปจํ…Œ์ด๋„ˆ๋ž€ ์„œ๋ธ”๋ฆฟ ๊ฐ์ฒด์˜ ์ƒ์„ฑ, ์ดˆ๊ธฐํ™”, ํ˜ธ์ถœ, ์†Œ๋ฉธ๊นŒ์ง€์˜ ์ธ์ƒ์ฃผ๊ธฐ(Life Cycle)๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

โญ ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๋Š” ๊ฐ€์žฅ ํ•ต์‹ฌ์ ์ธ flow๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค!

1) ์š”์ฒญ(Request)์ด ๋“ค์–ด์˜ฌ ๋•Œ๋งˆ๋‹ค
2) ์ƒˆ๋กœ์šด ์ž๋ฐ” ์Šค๋ ˆ๋“œ๋ฅผ ๋งŒ๋“ ๋‹ค!
3) ๊ทธ๋ฆฌ๊ณ  ์ด ์Šค๋ ˆ๋“œ๊ฐ€ servlet์„ ํ˜ธ์ถœํ•œ๋‹ค. (-> ํ–ฅํ›„ ์Šค๋ ˆ๋“œ Pool์„ ๋งŒ๋“ค์–ด์„œ ์Šค๋ ˆ๋“œ ์ƒ์„ฑ ๋น„์šฉ์„ ์ค„์ธ๋‹ค.)


์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ์˜ ๊ธฐ๋ณธ 5๊ฐ€์ง€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

1) ๋„คํŠธ์›Œํฌ ํ†ต์‹ 
2) ์„œ๋ธ”๋ฆฟ ๊ฐ์ฒด ์ธ์ƒ์ฃผ๊ธฐ ๊ด€๋ฆฌ
3) ์„œ๋ธ”๋ฆฟ ๊ฐ์ฒด ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๊ด€๋ฆฌ
4) JSP๋„ ์„œ๋ธ”๋ฆฟ์œผ๋กœ ๋ณ€ํ™˜ ๋˜์–ด์„œ ์‚ฌ์šฉ
5) ๋™์‹œ ์š”์ฒญ์„ ์œ„ํ•œ ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ ์ฒ˜๋ฆฌ ์ง€์›

์šฐ๋ฆฌ๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” ๋Œ€ํ‘œ์ ์ธ Servlet Container๊ฐ€ ์žˆ๋‹ค. ๋ฐ”๋กœ WAS์˜ ๋Œ€ํ‘œ์ฃผ์ž, Tomcat์ด๋‹ค~

์ง€๊ธˆ๊นŒ์ง€ ์‚ฌ์šฉ ๋งŽ์ด ํ•œ ํ†ฐ์บฃ์€
warํŒŒ์ผ์„ javaํŒŒ์ผ์—์„œ Class๋กœ ๋งŒ๋“ค๊ณ  ์ปดํŒŒ์ผํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ ค servlet๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์—ˆ๋˜ ๊ฒƒ์ด๋‹ค.


์„œ๋ธ”๋ฆฟ ๋™์ž‘๊ณผ์ •

์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๋Š” ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์š”์ฒญ์„ ๋ฐ›์„ ๋•Œ ๋งˆ๋‹ค ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.(์š”์ฒญ request : 1 Thread)

๊ทธ๋ฆฌ๊ณ  ๊ทธ ์Šค๋ ˆ๋“œ์—์„œ ํ•„์š”ํ•œ ์„œ๋ธ”๋ฆฟ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋ ‡๋‹ค๊ณ  ํ•ด์„œ ์Šค๋ ˆ๋“œ๋ฅผ ๋ฌด์ œํ•œ์œผ๋กœ ์ƒ์„ฑํ•˜๊ธฐ๋งŒ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๊ณ (๋ฉ”๋ชจ๋ฆฌ ๋น„์šฉ์ด ๋งŽ์ด ๋“ค๊ธฐ๋•Œ๋ฌธ์—) ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์— Thread Pool(์Šค๋ ˆ๋“œํ’€)์— ์Šค๋ ˆ๋“œ๋ฅผ ๋ฏธ๋ฆฌ ํ• ๋‹นํ•˜๊ณ , ์š”์ฒญํ•  ๋•Œ ๊บผ๋‚ด ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

โœณ๏ธ ์ฐธ๊ณ ๋กœ, Tomcat์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ๋ฐ›์„ ๋ฐ›๊ธฐ ์œ„ํ•ด 200๊ฐœ์˜ Thread๋ฅผ Thread Pool(์Šค๋ ˆ๋“œํ’€)์— ์ƒ์ƒํ•ด ๋‘”๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์„œ๋ธ”๋ฆฟ ๊ฐ์ฒด๋Š” ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๊ด€๋ฆฌ๋œ๋‹ค.
์ด๊ฒƒ๋„ ์š”์ฒญ์ด ์˜ฌ๋•Œ๋งˆ๋‹ค ๊ณ„์† ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š”๊ฒƒ์€ ๋น„ํšจ์œจ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

โœ… ์„œ๋ธ”๋ฆฟ ๋ฉ”๋ชจ๋ฆฌ ๋น„ํšจ์œจ์„ ๋ง‰๊ธฐ ์œ„ํ•œ ์žฅ์น˜
1) ์Šค๋ ˆ๋“œํ’€
2) ์‹ฑ๊ธ€ํ†ค

์ฆ‰, ์ตœ์ดˆ ๋กœ๋”ฉ ์‹œ์ ์— ์„œ๋ธ”๋ฆฟ ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด ๋‘๊ณ  ์žฌํ™œ์šฉ(์Šค๋ ˆ๋“œํ’€)ํ•˜๋ฉฐ ๋ชจ๋“  ์š”์ฒญ์€ ๋™์ผํ•œ ์„œ๋ธ”๋ฆฟ ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค(์‹ฑ๊ธ€ํ†ค)์— ์ ‘๊ทผํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


<๊น€์˜ํ•œ ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ was ๊ตฌ์กฐ>

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

// ์„œ๋ธ”๋ฆฟ์„ ๋งคํ•‘ํ•  URL ํŒจํ„ด ์ง€์ •
@WebServlet("/example")
public class ExampleServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    // GET ์š”์ฒญ ์ฒ˜๋ฆฌ
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // ์š”์ฒญ์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ
        String name = request.getParameter("name");
        if (name == null) {
            name = "Guest"; // ๊ธฐ๋ณธ๊ฐ’ ์„ค์ •
        }

        // ์‘๋‹ต์˜ ์ฝ˜ํ…์ธ  ํƒ€์ž… ์„ค์ •
        response.setContentType("text/html");

        // ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ HTML ์‘๋‹ต ์ž‘์„ฑ
        response.getWriter().write("<html><body>");
        response.getWriter().write("<h1>Hello, " + name + "!</h1>");
        response.getWriter().write("</body></html>");
    }

    // POST ์š”์ฒญ ์ฒ˜๋ฆฌ
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // ์š”์ฒญ์—์„œ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ (์˜ˆ: ํผ ๋ฐ์ดํ„ฐ)
        String data = request.getParameter("data");

        // ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋กœ์ง์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Œ
        System.out.println("Received data: " + data);

        // ํด๋ผ์ด์–ธํŠธ์— ์‘๋‹ต ๋ณด๋‚ด๊ธฐ
        response.setContentType("text/plain");
        response.getWriter().write("Data received successfully: " + data);
    }
}

์„ค๋ช…

1) ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ ์ˆ˜์‹ :
์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ HTTP ์š”์ฒญ์„ ๋ฐ›์•„ HttpServletRequest ๊ฐ์ฒด์™€ HttpServletResponse ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

2) ์Šค๋ ˆ๋“œ ์ฒ˜๋ฆฌ:
์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•ด ์„œ๋ธ”๋ฆฟ์˜ doGet ๋˜๋Š” doPost ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

3) ์„œ๋น„์Šค ๋กœ์ง ์ˆ˜ํ–‰:
request ๊ฐ์ฒด์—์„œ ์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด ์ฒ˜๋ฆฌํ•˜๊ณ , response ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ์— ์‘๋‹ต์„ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.

์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ์˜ ๋™์ž‘ ๋ฐฉ์‹

๋‹ค์‹œ ์ •๋ฆฌํ•˜์ž๋ฉด,

1) ์‚ฌ์šฉ์ž๊ฐ€ URL์„ ํด๋ฆญํ•˜๋ฉด HTTP Request๋ฅผ Servlet Container์— ๋ณด๋‚ธ๋‹ค.
2) Servlet Container๋Š” HttpServletRequest, HttpServletResponse ๋‘ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
3) ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•œ URL์„ ๋ถ„์„ํ•˜์—ฌ ์–ด๋А ์„œ๋ธ”๋ฆฟ์— ๋Œ€ํ•œ ์š”์ฒญ์ธ์ง€ ์ฐพ๋Š”๋‹ค.
4) ์ปจํ…Œ์ด๋„ˆ๋Š” ์„œ๋ธ”๋ฆฟ service()๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉฐ, POST/GET ์—ฌ๋ถ€์— ๋”ฐ๋ผ doGet() ๋˜๋Š” doPost()๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.
5) doGet()์ด๋‚˜ doPost() ๋ฉ”์†Œ๋“œ๋Š” ๋™์ ์ธ ํŽ˜์ด์ง€๋ฅผ ์ƒ์„ฑํ•œ ํ›„ HttpServletResponse ๊ฐ์ฒด์— ์‘๋‹ต์„ ๋ณด๋‚ธ๋‹ค.
6) ์‘๋‹ต์ด ์™„๋ฃŒ๋˜๋ฉด HttpServletRequest, HttpServletResponse ๋‘ ๊ฐ์ฒด๋ฅผ ์†Œ๋ฉธ์‹œํ‚จ๋‹ค.


์Šค๋ ˆ๋“œ ์ฒ˜๋ฆฌํ•˜๋Š” ๋‚ด๋ถ€์ ์ธ ์„œ๋ธ”๋ฆฟ ์ฝ”๋“œ

์„œ๋ธ”๋ฆฟ ๋‚ด๋ถ€์˜ ์Šค๋ ˆ๋“œ ์ฒ˜๋ฆฌ ์ฝ”๋“œ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ(์˜ˆ: Tomcat, Jetty)๊ฐ€ ์ด๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๋Š” ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์Šค๋ ˆ๋“œ ํ’€์„ ์‚ฌ์šฉํ•˜์—ฌ ํšจ์œจ์ ์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ ์Šค๋ ˆ๋“œ ์ฒ˜๋ฆฌ ์ฝ”๋“œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ง์ ‘ ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์Šค๋ ˆ๋“œ ํ’€์„ ์‚ฌ์šฉํ•˜์—ฌ ๋น„์Šทํ•œ ๋™์ž‘์„ ๊ตฌํ˜„ํ•˜๋Š” ์ž๋ฐ” ์ฝ”๋“œ๋Š” ์œ ์ถ”๋ฅผ ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์„ ๊ฒƒ์ด๋‹ค.

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadHandlingExample {
    private static final int THREAD_POOL_SIZE = 10;
    private ExecutorService threadPool = Executors.newFixedThreadPool(THREAD_POOL_SIZE);

    public void handleRequest(String request) {
        threadPool.submit(() -> {
            // ์š”์ฒญ ์ฒ˜๋ฆฌ ๋กœ์ง
            System.out.println("Handling request: " + request + " by thread " + Thread.currentThread().getName());
            try {
                // ์ฒ˜๋ฆฌ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ (์˜ˆ: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—… ๋˜๋Š” ํŒŒ์ผ ์ฒ˜๋ฆฌ)
                Thread.sleep(1000); 
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
            System.out.println("Finished processing request: " + request);
        });
    }

    public static void main(String[] args) {
        ThreadHandlingExample example = new ThreadHandlingExample();

        // ์—ฌ๋Ÿฌ ์š”์ฒญ ์ฒ˜๋ฆฌ ์‹œ๋ฎฌ๋ ˆ์ด์…˜
        for (int i = 1; i <= 20; i++) {
            example.handleRequest("Request " + i);
        }

        example.threadPool.shutdown(); // ๋ชจ๋“  ์ž‘์—… ์™„๋ฃŒ ํ›„ ์Šค๋ ˆ๋“œ ํ’€ ์ข…๋ฃŒ
    }
}

์„ค๋ช…)
์Šค๋ ˆ๋“œ ํ’€: Executors.newFixedThreadPool์„ ์‚ฌ์šฉํ•ด ์ •ํ•ด์ง„ ์ˆ˜์˜ ์Šค๋ ˆ๋“œ(์˜ˆ: 10๊ฐœ)๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
๋น„๋™๊ธฐ ์ž‘์—… ์ œ์ถœ: ๊ฐ ์š”์ฒญ์€ threadPool.submit()์„ ํ†ตํ•ด ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ: ๊ฐ ์Šค๋ ˆ๋“œ๋Š” ์š”์ฒญ์„ ๋…๋ฆฝ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, ์„œ๋กœ ๊ฐ„์„ญํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ์˜ ๋‚ด๋ถ€์ ์ธ ๊ตฌํ˜„์€ ์ด์™€ ์œ ์‚ฌํ•œ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜์ง€๋งŒ, ํ›จ์”ฌ ๋” ๋ณต์žกํ•˜๊ณ  ์ตœ์ ํ™”๋œ ์Šค๋ ˆ๋“œ ๊ด€๋ฆฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.


์„œ๋ธ”๋ฆฟ ์ƒ์„ฑ์ฃผ๊ธฐ(Servlet Lifecycle)

init(): ์„œ๋ฒ„๊ฐ€ ์ผœ์งˆ ๋•Œ ํ•œ๋ฒˆ๋งŒ ์‹คํ–‰
service(): ๋ชจ๋“  ์œ ์ €๋“ค์˜ ์š”์ฒญ๋“ค์„ ๋ฐ›๋Š”๋‹ค.
destroy(): ์„œ๋ฒ„๊ฐ€ ๊บผ์งˆ ๋•Œ ํ•œ๋ฒˆ๋งŒ ์‹คํ–‰

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

init() ํ•ด๋‹น ์‚ฌ์šฉ์ž ์„œ๋ธ”๋ฆฟ์ด ์ตœ์ดˆ ์ƒ์„ฑ๋˜๊ณ  ๋ฐ”๋กœ ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์†Œ๋“œ์ด๋‹ค.

service() ์ตœ์ดˆ์˜ ์š”์ฒญ์ด๋“  2๋ฒˆ์งธ ์š”์ฒญ์ด๋“  ๊ณ„์† ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์†Œ๋“œ์ด๋‹ค.

์—ฌ๊ธฐ์—์„œ ์„œ๋ธ”๋ฆฟ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋œ๋‹ค๋ฉด ์‚ฌ์šฉ์ž ์ •์˜ HttpServlet์˜ destroy()๊ฐ€ ํ˜ธ์ถœ๋  ๊ฒƒ์ด๋‹ค.


์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๋Š” IoC ์ปจํ…Œ์ด๋„ˆ

์„œ๋ธ”๋ฆฟ์˜ ์‹คํ–‰ ์ˆœ์„œ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š”๊ฒŒ ์•„๋‹Œ ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ด€๋ฆฌ๋ฅผ ํ•œ๋‹ค. ์ฆ‰ ์„œ๋ธ”๋ฆฟ์— ์˜ํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ•œ ์„œ๋ธ”๋ฆฟ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ํ˜ธ์ถœ๋˜๊ณ  ์‚ฌ๋ผ์ง„๋‹ค.

์ด๋ ‡๊ฒŒ ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹Œ ํ”„๋กœ๊ทธ๋žจ์— ์˜ํ•ด ๊ฐ์ฒด๋“ค์ด ๊ด€๋ฆฌ๋˜๋Š” ๊ฒƒ์„ IoC(Inversion of Control)์ด๋ผ๊ณ  ํ•œ๋‹ค.


์„œ๋ธ”๋ฆฟ ์ธํ„ฐํŽ˜์ด์Šค

1) Servlet

Servlet์€ ์„œ๋ธ”๋ฆฟ ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐœ๋ฐœํ•  ๋•Œ ๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์„ ์–ธํ•˜๊ณ  ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค. ์ด ํ‘œ์ค€์„ ๊ตฌํ˜„ํ•ด์•ผ ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ•ด๋‹น ์„œ๋ธ”๋ฆฟ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

2) GenericServlet

GenericServlet์€ Servlet์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†ํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ํ™˜๊ฒฝ์—์„œ ์„œ๋ฒ„๋‹จ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ์„œ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ ์ถ”์ƒ ํด๋ž˜์Šค์ด๋‹ค. service()๋ฉ”์†Œ๋“œ๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜์—ฌ ์ ์ ˆํ•œ ๊ธฐ๋Šฅ์œผ๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค. GenericServletํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ”„๋กœํ† ์ฝœ์— ๋”ฐ๋ผ ๋ฉ”์„œ๋“œ ์žฌ์ •์˜ ๊ตฌ๋ฌธ์„ ์ ์šฉํ•ด์•ผ ํ•œ๋‹ค.

3) HttpServlet

์ผ๋ฐ˜์ ์œผ๋กœ ์„œ๋ธ”๋ฆฟ์ด๋ผํ•˜๋ฉด ๊ฑฐ์˜ ๋Œ€๋ถ€๋ถ„ HttpServlet์„ ์ƒ์†๋ฐ›๋Š” ์„œ๋ธ”๋ฆฟ์„ ์˜๋ฏธํ•œ๋‹ค. HttpServlet์€ GenericServlet์„ ์ƒ์†๋ฐ›์•˜์œผ๋ฉฐ, GenericServlet์˜ ์œ ์ผํ•œ ์ถ”์ƒ ๋ฉ”์„œ๋“œ์ธ service๋ฅผ HTTP ํ”„๋กœํ† ์ฝœ ์š”์ฒญ ๋ฉ”์„œ๋“œ์— ์ ํ•ฉํ•˜๊ฒŒ ์žฌ๊ตฌํ˜„ํ•ด๋†จ๋‹ค.

์ด๋ฏธ DELETE, GET, HEAD, OPTIONS, POST, TRACE๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ๋ชจ๋‘ ์ •์˜๋˜์–ด ์žˆ๋‹ค.



์ฐธ๊ณ 

profile
๋ฐฐ์šด ๊ฒƒ์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

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