Web MVC
๐ฟ Servlet
ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ Servlet ํด๋์ค์ ๊ตฌํ ๊ท์น์ ์งํจ ์๋ฐ ์น ํ๋ก๊ทธ๋๋ฐ ๊ธฐ์
- ํน์ง
- ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ํด ๋์ ์ผ๋ก ์๋ํ๋ web-app Component
- html์ ์ฌ์ฉํ์ฌ ์์ฒญ์ ์๋ต
- Java Thread๋ฅผ ์ด์ฉํ์ฌ ๋์ํ๋ค.
- MVC ํจํด์ Controller๋ก ์ด์ฉ๋๋ค.
- Http ์๋น์ค๋ฅผ ์ง์ํ๋ javax.servlet.http.HttpServlet Class๋ฅผ ์์๋ฐ๋๋ค.
- UDP๋ณด๋ค ์ฒ๋ฆฌ ์๋๊ฐ ๋๋ฆฌ๋ค.
- Html ๋ณ๊ฒฝ ์ Servlet์ ์ฌ ์ปดํ์ผํด์ผํ๋ ๋จ์ ์ด ์๋ค.
์น์๋ฒ๋ ์ ์ ์ธ ํ์ด์ง๋ง์ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ผ์ ๋์ ์ธ ํ์ด์ง๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด์๋ ์น์๋ฒ๋ ๋ค๋ฅธ ๊ณณ์ ๋์์ ์์ฒญํ์ฌ ๋์ ์ธ ํ์ด์ง๋ฅผ ์์ฑํด์ผ ํจ ์น์๋ฒ๊ฐ ๋์ ์ธ ํ์ด์ง๋ฅผ ์ ๊ณตํ ์ ์๋๋ก
์ฌ๊ธฐ์ ๋์์ฃผ๋ ์ดํ๋ฆฌ์ผ์ด์ ์ด ์๋ธ๋ฆฟ์ด๋ฉฐ, ๋์ ์ธ ํ์ด์ง๋ฅผ ์์ฑํ๋ ์ดํ๋ฆฌ์ผ์ด์ ์ด CGI์ ๋๋ค.
๐ฟ Servlet Container ๋์ ๋ฐฉ์
- Client๊ฐ URL์ ์ ๋ ฅํ๋ฉด HTTP Request๊ฐ Servlet Container๋ก ์ ์ก
- ์์ฒญ์ ์ ์ก๋ฐ์ Servlet Container๋ HttpServletRequest, HttpResponse ๊ฐ์ฒด๋ฅผ ์์ฑ
- web.xml์ ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ฉ์๊ฐ ์์ฒญํ URL์ด ์ด๋ ์๋ธ๋ฆฟ์ ๋ํ ์์ฒญ์ธ์ง ์ฐพ์
- ํด๋น ์๋ธ๋ฆฟ์์ service ๋ฉ์๋ฅผ ํธ์ถํ ํ Client์ GET, POST์ ๋ฐ๋ผ doGet() doPost()๋ฅผ ํธ์ถ
- doGet() or doPost() ๋ฉ์๋๋ ๋์ ์ธ ํ์ด์ง๋ฅผ ์์ฑํ ํ HttpServletResponse ๊ฐ์ฒด์ ์๋ต์ ๋ณด๋
- ์๋ต์ด ๋๋๋ฉด HttpServletRequest, HttpServletResponse ๋ ๊ฐ์ฒด๋ฅผ ์๋ฉธ
๐ฟ Servlet ์๋ช ์ฃผ๊ธฐ
- ์๋ธ๋ฆฟ ์ปจํ
์ด๋๊ฐ ์๋ธ๋ฆฟ ์ธ์คํด์ค์ init() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์ด๊ธฐํ ํ๋ค.
- ์ต์ด ์์ฒญ์ ๋ฐ์์ ๋ ํ๋ฒ ์ด๊ธฐํ ํ๊ณ ๋๋ฉด ๊ทธ ๋ค์ ์์ฒญ๋ถํฐ๋ ์ด ๊ณผ์ ์ ์๋ตํ๋ค.
- ์๋ธ๋ฆฟ์ด ์ด๊ธฐํ ๋ ๋ค์๋ถํฐ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฐจ๋ฆฌํ ์ ์๋ค. ๊ฐ ์์ฒญ์ ๋ณ๋์ ์ฐ๋ ๋๋ก ์ฒ๋ฆฌํ๊ณ ์ด๋ ์๋ธ๋ฆฟ ์ธ์คํด์ค์ service() ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
- ์ด ์์์ HTTP ์์ฒญ์ ๋ฐ๊ณ Client๋ก ๋ณด๋ผ HTTP ์๋ต์ ๋ง๋ ๋ค.
- service()๋ ๋ณดํต HTTP Method์ ๋ฐ๋ผ doGet(), doPost() ๋ฑ์ผ๋ก ์ฒ๋ฆฌ๋ฅผ ์์ํ๋ค.
- ๋ฐ๋ผ์ ๋ณดํต doGet() ๋๋ doPost()๋ฅผ ๊ตฌํํ๋ค.
- ์๋ธ๋ฆฟ ์ปจํ ์ด๋ ํ๋จ์ ๋ฐ๋ผ ํด๋น ์๋ธ๋ฆฟ์ ๋ฉ๋ชจ๋ฆฌ์์ ๋ด๋ ค์ผ ํ ์์ ์ destroy()๋ฅผ ํธ์ถํ๋ค.
๐ฟ Servlet Mapping
์๋ ๋ฐฐํฌ์์ ์(Deployment Descriptor)๋ฅผ ์ฌ์ฉํ ๋ฐฉ๋ฒ
- web.xml ํ์ผ์ ๋ง๋ค๊ณ web-app ํ๊ทธ ๋ด๋ถ์ ์๋ธ๋ฆฟ์ ์ ์
- ์ด๊ฒ๋ค์ ์๋ธ๋ฆฟ์ผ๋ก ํฐ์บฃ์ด ์คํํ๊ฒ ๋ฉ๋๋ค.
ํ์ง๋ง servlet3.0๋ถํฐ Annotation์ ์ง์ํ๋ฉด์ ๋ฐฐํฌ์์ ์ ์์ด๋ ์๋ธ๋ฆฟ ๋งคํ ๊ฐ๋ฅ
ํด๋์ค ์์ ์ด๋ ธํ ์ด์ ์ ์ด์ฉํด์ URL ๋งคํ์ ์๋ฃํ๊ณ HttpServlet ํด๋์ค๋ฅผ ์์๋ฐ์ ํด๋์ค๋ฅผ ๋ง๋ค๊ณ ์ฌ๊ธฐ์๋ doGet() ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋
๊ทธ๋ฐ๋ฐ out.println() ์ผ๋ก HTML ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ ์์ฑํ๊ธฐ๋ ๋ถํธํ๊ณ ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ ๋๋ ์๋ก์ด ์๊ตฌ์ฌํญ์ด ์ถ๊ฐ ๋์์ ๋ ์์ ์ ํ๊ธฐ๋ ์ด๋ ค์ธ ์ ๋ฐ์ ์์ต๋๋ค. ์๋ฐ ์ฝ๋ ์์์ HTML ํ๊ทธ๋ฅผ ๋ฃ๋๊ฒ์ด ์๋๋ผ ๋ฐ๋๋ก HTML ์์ ์๋ฐ ์ฝ๋๋ฅผ ๋ฃ์ ์ ์๋ค๋ฉด ์ด๋ฐ ๋ฌธ์ ๋ค์ด ํด๊ฒฐ๋ ์ ์์ ๊ฒ์ ๋๋ค. ๊ทธ ์ญํ ์ ํด ์ฃผ๋ ๊ฒ์ด ๋ฐ๋ก JSP ์ ๋๋ค.
๐ฟ CGI & WAS
๋ณ๋๋ก ์ ์๋ ์น์๋ฒ์ ํ๋ก๊ทธ๋จ ๊ฐ์ ๊ตํ๋ฐฉ์.
- ์ด๋ ํ ํ๋ก๊ทธ๋๋ฐ์ธ์ด๋ก๋ ๊ตฌํ์ด ๊ฐ๋ฅํ๋ฉฐ ๋ณ๋๋ก ๋ง๋ค์ด ๋์ ํ๋ก๊ทธ๋จ์ HTML์ GET, POST ๋ฐฉ์์ผ๋ก Client์ ๋ฐ์ดํฐ๋ฅผ ํ๊ฒฝ๋ณ์๋ก ์ ๋ฌํ๊ณ , ํ๋ก๊ทธ๋จ์ ํ์ค ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ํด๋ผ์ด์ธํธ์๊ฒ ์ ์กํ๋ ๊ฒ
WAS์ CGI
์น์๋ฒ: ์์ฒญ์ ๋ํ ์ ์ ์ธ ๋ฆฌ์์ค๋ฅผ ์๋ตํ๋ ๋ชฉ์ ์ผ๋ก ๋ง๋ค์ด์ง ์๋ฒ
- Apache, Nginx ๋ฑ์ด ์์
CGI (Common Gate Interface): ์น์๋ฒ์ WAS ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๊ท์น์ ํต์ผํ ๊ท์ฝ. ์ด์ ๋ฐ๋ผ ๋ง๋ค์ด์ง ํ๋ก๊ทธ๋จ์ CGI ํ๋ก๊ทธ๋จ์ด๋ผ ํจ(์๋ ์ ๋์ด)
WAS (Web Application Server): ๋์ ์ธ ์ฒ๋ฆฌ๋ฅผ ํ๊ณ ์น์๋ฒ๋ก ๋ฆฌํดํ๋ ๋ชฉ์ ์ผ๋ก ๋ง๋ ์๋ฒ
- ์น์๋ฒ์ WAS๋ ๋ค๋ฅธ ์ธ์ด, ์ฒด๊ณ๋ก ๋ง๋ค์ด์ก๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ ๊ตํ์ด ์ด๋ ค์
- Tomcat์ด๋ Zeus๋ฑ์ด ์์
WAS์ ์คํ ์ ํ
- Interpreter
- ํํ: .php, .pl, .js, .py ๋ฑ
- Script ์์ง์ด ํ์: ์น์๋ฒ๊ฐ ์คํฌ๋ฆฝํธ ์์ง์ ์คํํ๊ณ ์คํฌ๋ฆฝํธ ์์ง์ด ์คํฌ๋ฆฝํธ๋ฅผ ํด์ -> ๋ฐ์ดํฐ ๋ฆฌํด
- Compile
- ๊ธฐ๊ณ์ด๊ฐ ์ต์ข ๋ณธ, ์น์๋ฒ๊ฐ ๋ฐ๋ก ์คํ
- ์๋ฐ์ CGI ํ๋ก๊ทธ๋จ
- .class๋ก ๋ ์น์ฑ: .class๋ ๋ฐ์ดํธ์ฝ๋(jvm์ ์ํด ๊ธฐ๊ณ์ด๋ก ๋ฒ์ญ๋จ)
- ์น์๋ฒ๊ฐ ์น์ฑ ์คํ ๋ถ๊ฐ: .class๋ jvm์ ์ํด ๋ฒ์ญ, ์คํ๋์ด์ผ ํจ
- ์น์๋ฒ๊ฐ jvm์? -> jvm์ ์ด์์ฒด์ ์ ์ข ์์
- ๊ทธ๋ฌ๋ฉด jvm์ด ์คํ๋๊ณ ๊ทธ ์์์ ์๋ฐ ํ๋ก๊ทธ๋จ ๊ด๋ฆฌ์๋ฒ(Tomcat)์ ๋ง๋ค๊ณ ์คํํ์
- Tomcat: JSP ํ๊ฒฝ์ ํฌํจํ๊ณ ์๋ Servlet ์ปจํ ์ด๋(๊ด๋ฆฌ์๋ฒ)
๋ฐ๋ผ์
- Client๋ก ๋ถํฐ ์น์๋ฒ๊ฐ ์์ฒญ์ ๋ฐ์ผ๋ฉด ์๋ฐ ํ๋ก๊ทธ๋จ ๊ด๋ฆฌ ์๋ฒ(CGI) ์คํ
- ์๋ฐ ํ๋ก๊ทธ๋จ ๊ด๋ฆฌ ์๋ฒ(CGI)๋ ์๋ฐ ํ๋ก๊ทธ๋จ(jvm์์์) ์คํ
- ๋ฆฌํด๋ฐ์ ๊ฐ์ ์๋ฐ ํ๋ก๊ทธ๋จ ๊ด๋ฆฌ ์๋ฒ๊ฐ ๊ฒฐ๊ณผ๊ฐ์ ์น์๋ฒ๋ก: ๋ฐ์ดํฐ ์ ๋ฌํด์ฃผ๋ ์ญํ ์ํ
์๋ธ๋ฆฟ ์ปจํ ์ด๋๋
- ์๋ฐ ํ๋ก๊ทธ๋จ ๊ด๋ฆฌ ์๋ฒ์ ์ด๋ฆ
- ์๋ฐ ํ๋ก๊ทธ๋จ์ ์๋ธ๋ฆฟ์ด๋ผ ํจ: .class, ์น์ฑ
- ์์ฒญ์ด ์ค๋ฉด ํธ์ถ(์์ฑ, ์คํ)๋ฟ ์๋๋ผ ์๋ฉธ๊น์ง ๊ด๋ฆฌ: lifeCycle ๊ด๋ฆฌ
- ์คํฌ๋ฆฝํธ์ ๊ฒฝ์ฐ ใ ใ ใ ์์ง์ด๋ผ ํจ
- ์ฌ๋ฌ ์์ฒญ: ํ๋์ ํ๋ก์ธ์ค์์ ๋ฉํฐ ์ฐ๋ ๋ ์ฒ๋ฆฌ๋ฑ app ๊ด๋ฆฌ ๊ธฐ๋ฅ๊น์ง
- ๋ํ์ ์ผ๋ก ํฐ์บฃ(์ํ์น ์๋), ์ ์ฐ์ค, ์น๋ก์ง ๋ฑ์ด ์์
- WAS๋ผ์ ํจ: ์น์๋ฒ๋ก ๋ถํฐ ์์ฒญ์ ์ ๋ฌ๋ฐ๊ณ ์น์ฑ(์๋ธ๋ฆฟ)์ ์คํ์ํค๊ณ ์ป์ ๊ฒฐ๊ณผ๊ฐ์ ์น์๋ก ์ ๋ฌํด ์ฃผ๋ ์ญํ
Http๋ฅผ ์ด์ฉํ Server ์ Client์ ํต์
- ํด๋ผ์ด์ธํธ๋ ์ ๋ณด๋ฅผ ์ป๊ธฐ ์ํด ์๋ฒ๋ก HTTP ์์ฒญ์ ์ ์กํ๊ณ ,
- ์๋ฒ๋ ์ด๋ฅผ ํด์ํ์ฌ ์ ์ ์์์ ๋ํ ์์ฒญ์ผ ๊ฒฝ์ฐ ์์์ ๋ฐํํด์ฃผ๊ณ , ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ CGI ํ๋ก๊ทธ๋จ์ ์คํ์์ผ ํด๋น ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํด
- ์ด๋ ์๋ฒ๋ CGI ํ๋ก๊ทธ๋จ์๊ฒ ์์ฒญ์ ์ ๋ฌํด์ฃผ๊ณ , ๊ฒฐ๊ณผ๋ฅผ ์ ๋ฌ๋ฐ๊ธฐ ์ํ ํ์ดํ๋ผ์ธ์ ์ฐ๊ฒฐํฉ๋๋ค.
- CGI ํ๋ก๊ทธ๋จ์ ์ ๋ ฅ์ ๋ํ ์๋น์ค๋ฅผ ์ํํ๊ณ , ๊ฒฐ๊ณผ๋ฅผ ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌํ๊ธฐ ์ํด ๊ฒฐ๊ณผ ํ์ด์ง์ ํด๋นํ๋ MIME ํ์ ์ ์ปจํ ์ธ ๋ฐ์ดํฐ๋ฅผ ์น ์๋ฒ์ ์ฐ๊ฒฐ๋ ํ์ดํ๋ผ์ธ์ ์ถ๋ ฅํ์ฌ ์๋ฒ์ ์ ๋ฌํฉ๋๋ค.
- ์๋ฒ๋ ํ์ดํ๋ผ์ธ์ ํตํด CGI ํ๋ก๊ทธ๋จ์์ ์ถ๋ ฅํ ๊ฒฐ๊ณผ ํ์ด์ง์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด, HTTP ์๋ตํค๋๋ฅผ ์์ฑํ์ฌ ๋ฐ์ดํฐ๋ฅผ ํจ๊ป ๋ฐํํด์ค๋๋ค.
๐ฟ Tomcat Container
Stand-alone servlet containers(Tomcat์ ๊ธฐ๋ณธ ๋ชจ๋)
- ๋ด์ฅ๋ ์น์๋ฒ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ๊ฒ
- ๊ธฐ๋ฅ๋ฉด์์ JavaWebServer์ ๋ถ๋ถ์ธ Serlvet ์ปจํ ์ด๋์ Java ๊ทผ๊ฐ ์น ์๋ฒ๋ฅผ ์ฌ์ฉ
In-process servlet containers
- Servlet ์ปจํ ์ด๋๋ ์น์๋ฒ ํ๋ฌ๊ทธ์ธ๊ณผ Java ์ปจํ ์ด๋ ๊ตฌํ
- ์น์๋ฒ ํ๋ฌ๊ทธ์ธ์ ์น์๋ฒ์ ์ฃผ์ ๊ณต๊ฐ ๋ด์ JVM์ ์ด๊ณ ๊ทธ ์์์ JAVA ์ปจํ ์ด๋๊ฐ ์คํ๋๋๋ก ํ๋ค.
- ๋ค์ค ์ค๋ ๋์ ๋จ์ผ ํ๋ก์ธ์ค ์๋ฒ์ ์ ๋นํ๊ณ ํผํฌ๋จผ์ค๋ ์ข์ง๋ง ํ์ฅ์ฑ์ ํ๊ณ๊ฐ ์์
Out-of-process servlet containers
- ์น์๋ฒ ํ๋ฌ๊ทธ์ธ๊ณผ ์น์๋ฒ์ ์ธ๋ถ JVM์์ ์คํํ๋ JAVA ์ปจํ ์ด๋ ๊ตฌํ
- ์น์๋ฒ ํ๋ฌ๊ทธ์ธ๊ณผ JAVA ์ปจํ ์ด๋ JVM์ ๋ช๋ช IPC(๋ณดํต์ TCP/IP ์์ผ)๋ฅผ ์ฌ์ฉํด์ ํต์
- Out-of-process ์์ง์ ๋ฐ์ ์๊ฐ์ in-process ๋งํผ ์ข์ง ์์ง๋ง out-of-process ์์ง์ ํ์ฅ์ฑ๊ณผ ์์ ์ฑ ๋ฉด์ In-process๋ณด๋ค ์ข๋ค.
๐ฟ Servlet ๊ตฌ์กฐ
- ์๋ธ๋ฆฟ:
- ์น์๋ฒ๋ ์ ์ ์ธ ํ์ด์ง๋ฅผ ์ ๊ณตํ๋ ์ญํ ๋ง ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ค์๊ฐ์ผ๋ก ์์ฑ๋ ํ์ด์ง๋ฅผ ์ ๊ณตํ๊ฑฐ๋ ์๋ฒ ์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ์ผ์ ์น์๋ฒ๊ฐ ํ ์ ์์
- ๋ฐ๋ผ์ ์น์๋ฒ๋ ์์ฒญ์ servlet์ ์์ฒญ์ ์ ๋ฌํ๊ธฐ๋ง ํ๋ฉด ๋จ
- ์ปจํ
์ด๋:
- ์์ฒญ์ด ๋ค์ด์ค๋ฉด ์์ฒญ์ ์ฒ๋ฆฌํ ์๋ก์ด ์ค๋ ๋๋ฅผ ๋ง๋ค์ด์ผ ํ๊ณ ์๋ธ๋ฆฟ์์ ํ์ํ ๋ฉ์๋๋ฅผ ํธ์ถํด์ผ ํจ
- ์น์๋ฒ๋ ์์ฒญ์ ์ปจํ ์ด๋๋ก ๋ณด๋ด๊ณ Container๋ ์๋ธ๋ฆฟ์ ์ฐพ์ ํ์ํ ๋ฉ์๋๋ฅผ ํธ์ถ(doGet(), doPost())