ํด๋ผ์ด์ธํธ(Client):
์๋ฒ(Server):
์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ (WAS - Web Application Server):
RDBMS (Relational Database Management System):
์ด ์ํคํ ์ฒ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ํด๋ผ์ด์ธํธ-์๋ฒ ๊ฐ์ ์ํธ์์ฉ์ ๊ตฌ์กฐ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ฉฐ, ๋น์ฆ๋์ค ๋ก์ง ๊ด๋ฆฌ ๋ฐ ๋ฐ์ดํฐ์ ์ง์์ ์ธ ๊ด๋ฆฌ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ํํ๋ ๋ฐฉ์์ ๋๋ค.
๋ค์์ Dynamic Web Project์ context root
, ๋ฐฐํฌ ๊ณผ์ , ๋น๋ ๊ณผ์ , ์ค์ ๋ฐฉ๋ฒ์ ๋ํ ์์ธํ ์ค๋ช
์ ํฌํจํ ๋ด์ฉ์
๋๋ค. ์ด์ ์ค๋ช
์์ ๋๋ฝ๋ ๋ถ๋ถ์ ๋ชจ๋ ์ถ๊ฐํ์ฌ ์ ๋ฆฌํ์ต๋๋ค.
Dynamic Web Project๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๊ณ ๋ฐฐํฌํ๋ ํ์ค์ ์ธ ๋ฐฉ๋ฒ์ ๋ฐ๋ฅด๋ ํ๋ก์ ํธ ๊ตฌ์กฐ์ ๋๋ค. ์ด ๊ตฌ์กฐ๋ Java ์๋ธ๋ฆฟ, JSP, Spring ํ๋ ์์ํฌ ๋ฑ์ ๊ธฐ๋ฐ์ผ๋ก ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ํจ๊ณผ์ ์ผ๋ก ๊ฐ๋ฐํ๊ณ ์๋ฒ์ ๋ฐฐํฌํ๋ ๋ฐ ์ต์ ํ๋์ด ์์ต๋๋ค.
Context Root:
Context Root
๋ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฃจํธ ๋๋ ํฐ๋ฆฌ๋ก, ์น ์๋ฒ์์ ํด๋น ์ ํ๋ฆฌ์ผ์ด์
์ด ์ ๊ทผ๋๋ ๊ธฐ๋ณธ URL ๊ฒฝ๋ก๋ฅผ ์ ์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, http://localhost:8080/myapp
์์ myapp
์ด context root์
๋๋ค.Context Root
์์๋ HTML, CSS, JavaScript, JSP ํ์ผ์ด ํฌํจ๋์ด ์์ด ํด๋ผ์ด์ธํธ๊ฐ ์ง์ ์ ๊ทผํ ์ ์๋ ๋ฆฌ์์ค๋ค์ ์ ๊ณตํฉ๋๋ค.๋ฐฐํฌ ๊ณผ์ :
WAR (Web Application Archive)
ํ์ผ ํ์์ผ๋ก ํจํค์ง๋์ด ๋ฐฐํฌ๋ฉ๋๋ค. WAR ํ์ผ์ ๋ชจ๋ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ํ์ผ๋ค์ ํ๋๋ก ๋ฌถ์ด์ฃผ๋ ์์ถ ํ์ผ์
๋๋ค.Context Root
๋๋ ํฐ๋ฆฌ ๊ตฌ์กฐ๋ก ๋ณํํฉ๋๋ค. ์ด ๊ณผ์ ์ ํตํด ์ ํ๋ฆฌ์ผ์ด์
์ด ์คํ๋ ์ค๋น๊ฐ ๋ฉ๋๋ค.๋น๋ ๊ณผ์ :
Java ์์ค ํ์ผ์ src/main/java
๋๋ ํฐ๋ฆฌ์์ ์์ฑ๋ฉ๋๋ค.
์์ฑ๋ Java ํ์ผ๋ค์ ์ปดํ์ผ๋์ด build/classes
๋๋ ํฐ๋ฆฌ์ ์์นํ๊ฒ ๋ฉ๋๋ค. ์ด ๋๋ ํฐ๋ฆฌ๋ ํ๋ก์ ํธ ๋ด๋ถ์์ ์์ ์ ์ฅ์ ์ญํ ์ ํฉ๋๋ค.
WEB-INF/classes
๋ก ๋ณต์ฌ: ์ปดํ์ผ๋ ํด๋์ค ํ์ผ๋ค์ WEB-INF/classes
๋๋ ํฐ๋ฆฌ๋ก ๋ณต์ฌ๋ฉ๋๋ค. ์ด ์์น๋ ์น ์ ํ๋ฆฌ์ผ์ด์
์ด ์๋ฒ์์ ์คํ๋ ๋ ์ฐธ์กฐํ๋ ์ฃผ์ ๋๋ ํฐ๋ฆฌ์
๋๋ค. ์ด ๊ณผ์ ์ ํตํด ์ ํ๋ฆฌ์ผ์ด์
์๋ฒ๋ ์ต์ ์ ์ปดํ์ผ๋ ์ฝ๋๋ฅผ ์คํํ๊ฒ ๋ฉ๋๋ค.
JRE(Java Runtime Environment): JRE ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ Java ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๋๋ฐ ํ์ํ ๊ธฐ๋ณธ์ ์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์๋ฐ ๊ฐ์ ๋จธ์ (JVM)์ ํฌํจํฉ๋๋ค. JRE ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์๋ฒ๊ฐ ์ด๋ฏธ ์ค์น๋ ํ๊ฒฝ์ ์ผ๋ถ๋ก ๊ฐ์ฃผ๋์ด ๋ฐฐํฌ ํ์ผ(WAR ํ์ผ)์ ํฌํจ๋์ง ์์ต๋๋ค.
Tomcat Library (Server Runtime): Apache Tomcat ์๋ฒ๊ฐ ์ ๊ณตํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ์ฃผ๋ก servlet-api.jar์ ๊ฐ์ ์๋ธ๋ฆฟ ๊ด๋ จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํฌํจํ๊ณ ์์ผ๋ฉฐ, ์๋ฒ์ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ์ ์ฐ๋์ ์ง์ํฉ๋๋ค.
Webapp ๋๋ ํฐ๋ฆฌ (webapp): ์ด ๋๋ ํฐ๋ฆฌ๋ HTML, CSS, JavaScript, JSP ํ์ผ ๋ฑ ํด๋ผ์ด์ธํธ์๊ฒ ์ ๊ณต๋๋ ์น ๋ฆฌ์์ค ํ์ผ๋ค์ด ์์นํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ๋ฅผ ํตํด ์ฌ์ฉ์์๊ฒ ํ๋ฉด์ ๊ตฌ์ฑํ๊ณ ๋ฐ์ดํฐ๋ฅผ ์๊ฐ์ ์ผ๋ก ํํํ๋ ์ญํ ์ ํฉ๋๋ค.
META-INF: ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฉํ๋ฐ์ดํฐ์ ๊ด๋ จ๋ ์ค์ ํ์ผ๋ค์ ๋ด๊ณ ์๋ ๋๋ ํฐ๋ฆฌ์ ๋๋ค. ๋ณดํต JAR ๋๋ WAR ํ์ผ์ ๊ตฌ์กฐ๋ฅผ ์ ์ํ๋๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
WEB-INF
ํฐ์บฃ ์๋ฒ ๋ฐฐํฌ:
WEB-INF/classes
๋๋ ํฐ๋ฆฌ์ lib
๋๋ ํฐ๋ฆฌ์ ์๋ .jar
ํ์ผ๋ค์ ๋ก๋ํ์ฌ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ก์ง์ ์คํํฉ๋๋ค. ์ด ๊ตฌ์กฐ๋ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ํด๋์ค ๋ก๋๊ฐ ํ์ผ์ ๋ถ๋ฌ์ค๋ ํ์ค ์์น๋ก, ์๋ฒ์์ ์์ ํ๊ฒ ์คํ๋ ์ ์๋๋ก ํฉ๋๋ค.์ปจํ ์ด๋์ ์ค์ ๊ด๋ฆฌ:
Annotation
์ ์ฌ์ฉํ์ฌ ์๋ธ๋ฆฟ, ํํฐ, ๋ฆฌ์ค๋ ๋ฑ์ ์ค์ ์ ์ง์ Java ์ฝ๋ ๋ด์์ ์ ์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, @WebServlet
์ด๋
ธํ
์ด์
์ ์ฌ์ฉํ๋ฉด XML ํ์ผ ์์ด ์๋ธ๋ฆฟ ๋งคํ์ ํ ์ ์์ต๋๋ค.web.xml
ํ์ผ์ ํตํด ์ ํ๋ฆฌ์ผ์ด์
์ ๋์ ๋ฐฉ์์ ์ ์ํฉ๋๋ค. ์ด ํ์ผ์๋ ์๋ธ๋ฆฟ ๋งคํ, ํํฐ ์ค์ , ๋ฆฌ์ค๋ ์ ์ ๋ฑ ๋ค์ํ ์ค์ ์ด ํฌํจ๋ฉ๋๋ค.์ปจํ ์ด๋์์ ์ํต:
ํด๋ผ์ด์ธํธ ์์ฒญ๊ณผ Context Root:
WAR ํ์ผ ๋ฐฐํฌ:
๋น๋ ๋ฐ ํด๋์ค ๋ฐฐํฌ:
WEB-INF/classes
๋ก ๋ณต์ฌ๋๋ฉฐ, Tomcat ์๋ฒ๋ ์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์
์ ์คํํฉ๋๋ค. ์ด ๊ณผ์ ์ ์ต์ ์ฝ๋๋ฅผ ๋ฐ์ํ๋ ๋ฐ ์ค์ํฉ๋๋ค.์ค์ ๊ณผ ์คํ:
์ปจํ ์ด๋๋ Java ์น ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ์์ ์๋ธ๋ฆฟ(Servlet), JSP(JavaServer Pages)์ ๊ฐ์ ์น ์ปดํฌ๋ํธ๋ฅผ ๊ด๋ฆฌํ๊ณ ์คํํ๋ ํ๊ฒฝ์ ์ ๊ณตํฉ๋๋ค. ์ปจํ ์ด๋๋ Java ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋ ๋ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ์๋ต์ ์์ฑํ๋ฉฐ, ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค. ์น ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ, ์๋ฅผ ๋ค์ด Apache Tomcat, JBoss, WebLogic, WebSphere ๋ฑ์ ์๋ฒ๊ฐ ๋ํ์ ์ธ ์ปจํ ์ด๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ปจํ ์ด๋์ ์ ์:
์ปจํ ์ด๋์ ์ฃผ์ ๊ธฐ๋ฅ:
์๋ธ๋ฆฟ ์ปจํ ์ด๋(Servlet Container):
์น ์ปจํ ์ด๋(Web Container):
EJB ์ปจํ ์ด๋:
init()
๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์ด๊ธฐํํฉ๋๋ค.service()
๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ , ์๋ธ๋ฆฟ์ ์์ฒญ์ ๋ง๋ doGet()
, doPost()
๋ฉ์๋๋ฅผ ์คํํ์ฌ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํฉ๋๋ค.destroy()
๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์๋ธ๋ฆฟ์ ์ข
๋ฃํฉ๋๋ค.์ค์ ํ์ผ (web.xml ๋๋ Annotation):
web.xml
ํ์ผ์ ํตํด ์๋ธ๋ฆฟ์ ๋งคํ, ํํฐ ์ค์ , ๋ฆฌ์ค๋ ์ค์ ๋ฑ์ ์ฝ๊ณ ์ ํ๋ฆฌ์ผ์ด์
์ ๋์ ๋ฐฉ์์ ์ค์ ํฉ๋๋ค. ๋ํ, ์ต๊ทผ์๋ Annotation์ ์ฌ์ฉํ์ฌ ์ฝ๋ ๋ด๋ถ์์ ์ง์ ์ค์ ํ ์ ์์ต๋๋ค.WAR ํ์ผ ๋ฐฐํฌ:
Servlet์ Java ๊ธฐ๋ฐ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ์๋ต์ ์์ฑํ๋ ์๋ฒ ์ธก ํ๋ก๊ทธ๋จ์ ๋๋ค. Servlet ํ์ผ์ ์์ฑํ๊ณ , Tomcat ์๋ฒ๋ฅผ ํตํด ์คํํ์ฌ ๋ธ๋ผ์ฐ์ ์์ ํ์ธํ๋ ์ ์ฒด ๊ณผ์ ์ ๋จ๊ณ๋ณ๋ก ์ค๋ช ํ๊ฒ ์ต๋๋ค.
์ Servlet ํ์ผ ์์ฑํ๊ธฐ:
src/main/java
๋๋ src
ํด๋ ํ์์ ํจํค์ง์ ์์ฑํฉ๋๋ค.URL Mapping ์ค์ :
/hello
๋ก ๋งคํํ๋ฉด http://localhost:8080/yourapp/hello
๋ก ์ ๊ทผ ์ ํด๋น ์๋ธ๋ฆฟ์ด ์คํ๋ฉ๋๋ค.@WebServlet("/path")
์ด๋
ธํ
์ด์
์ผ๋ก ์ฝ๊ฒ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.Service Method ์ ํ ๋ฐ ๊ตฌํ:
doGet
, doPost
)๋ฅผ ์ ํํ ์ ์์ต๋๋ค.doGet()
์ GET ์์ฒญ์, doPost()
๋ POST ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค.ํ์ผ ์ ๋ฆฌ:
Service Method ๊ตฌํ:
service()
๋ฉ์๋์
๋๋ค. doGet()
์ด๋ doPost()
๋ฉ์๋์ HTTP ์์ฒญ์ ์ฒ๋ฆฌํ ๋ก์ง์ ๊ตฌํํฉ๋๋ค.Tomcat ์๋ฒ ์คํ:
localhost:8080
ํฌํธ๋ฅผ ์ฌ์ฉํ๋ฉฐ, ํ๋ก์ ํธ์ Context Root์ Servlet์ URL ๋งคํ์ ํตํด ์ ๊ทผํ ์ ์์ต๋๋ค.๋ธ๋ผ์ฐ์ ์์ ํ์ธ:
http://localhost:8080/yourapp/hello
๋ค์์ ๊ฐ๋จํ "Hello World" Servlet์ ์์ฑํ๊ณ , doGet()
๋ฉ์๋๋ฅผ ๊ตฌํํ๋ ์์ ์
๋๋ค.
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
// URL ๋งคํ ์ค์ - ๋ธ๋ผ์ฐ์ ์์ http://localhost:8080/yourapp/hello ๋ก ์ ๊ทผ ๊ฐ๋ฅ
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
// GET ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ฉ์๋ ๊ตฌํ
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// ์๋ต ์ฝํ
์ธ ํ์
์ค์
response.setContentType("text/html");
// ์๋ต์ ์ถ๋ ฅํ๊ธฐ ์ํ PrintWriter ์์ฑ
PrintWriter out = response.getWriter();
// HTML ์๋ต ์์ฑ
out.println("<html>");
out.println("<head><title>Hello Servlet</title></head>");
out.println("<body>");
out.println("<h1>Hello, World!</h1>");
out.println("<p>Welcome to my first Servlet example.</p>");
out.println("</body>");
out.println("</html>");
}
}
http://localhost:8080/yourapp/hello
๋ฅผ ์
๋ ฅํ์ฌ HelloServlet
์ด ์ ์์ ์ผ๋ก ์๋ํ๋์ง ํ์ธํฉ๋๋ค.@WebServlet("/hello")
: ์๋ธ๋ฆฟ์ URL ๋งคํ์ ์ ์ํฉ๋๋ค. ํด๋ผ์ด์ธํธ๊ฐ /hello
๋ก ์์ฒญ์ ๋ณด๋ด๋ฉด ์ด ์๋ธ๋ฆฟ์ด ์คํ๋ฉ๋๋ค.doGet()
๋ฉ์๋: GET ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ฉ์๋์
๋๋ค. ์ด ๋ฉ์๋์์ ํด๋ผ์ด์ธํธ๋ก HTML ํ์์ ์๋ต์ ์์ฑํฉ๋๋ค.PrintWriter
: PrintWriter
๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ํด๋ผ์ด์ธํธ์๊ฒ ์๋ตํ HTML ์ฝํ
์ธ ๋ฅผ ์์ฑํฉ๋๋ค.์ด ์์ ๋ ๊ธฐ๋ณธ์ ์ธ Servlet ํ์ผ ์์ฑ๋ถํฐ, ๋ฉ์๋ ๊ตฌํ, Tomcat ์๋ฒ ์คํ๊น์ง์ ๊ณผ์ ์ ๋ณด์ฌ์ฃผ๋ฉฐ, ์ด๋ฅผ ํตํด Servlet์ด ์์ฒญ์ ๋ฐ์ ์ฒ๋ฆฌํ๊ณ , ์๋ต์ ์์ฑํ๋ ์ ์ฒด ํ๋ฆ์ ์ดํดํ ์ ์์ต๋๋ค.
Java Servlet์ ๋ํ ์ค๋ช ์ ๋ ์์ธํ ๋ค๋ฃจ์ด ๋ณด๊ฒ ์ต๋๋ค. Servlet์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋์ ์ผ๋ก ์น ํ์ด์ง๋ฅผ ์์ฑํ๋ ์๋ฒ ์ธก ํ๋ก๊ทธ๋จ์ผ๋ก, Java๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํ๋ฉ๋๋ค. ์๋์์ Servlet์ ๊ฐ๋ , ๋์ ๋ฐฉ์, ์ฅ์ , Servlet๊ณผ JSP์ ์ฐจ์ด, ๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ๊ธฐ์ ๋ค๊ณผ์ ๋น๊ต์ ๋ํด ์ค๋ช ํฉ๋๋ค.
Java Servlet์ ์๋ฒ ์ธก์์ ์คํ๋๋ Java ํ๋ก๊ทธ๋จ์ผ๋ก, ํด๋ผ์ด์ธํธ์ ์์ฒญ(์ฃผ๋ก HTTP ์์ฒญ)์ ๋ฐ์ ์ฒ๋ฆฌํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋์ ์ผ๋ก ์์ฑํ์ฌ ์๋ตํ๋ ์ญํ ์ ํฉ๋๋ค. Servlet์ Java EE(Enterprise Edition) ์ฌ์์ ์ผ๋ถ๋ถ์ผ๋ก, ์ฃผ๋ก ๋ณต์กํ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฑ์๋๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
์ด๊ธฐํ ๋จ๊ณ (Initialization):
init()
๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์ด๊ธฐํํฉ๋๋ค. ์ด ๋จ๊ณ๋ ์๋ธ๋ฆฟ์ด ์ต์ด ํธ์ถ๋ ๋ ํ ๋ฒ๋ง ์ํ๋ฉ๋๋ค.์์ฒญ ์ฒ๋ฆฌ ๋จ๊ณ (Request Handling):
service()
๋ฉ์๋๋ฅผ ํธ์ถํฉ๋๋ค. ์ด ๋ฉ์๋๋ ์์ฒญ์ ์ข
๋ฅ(GET, POST ๋ฑ)์ ๋ฐ๋ผ doGet()
, doPost()
, doPut()
๋ฑ์ ๋ฉ์๋๋ฅผ ์คํํฉ๋๋ค.HttpServletRequest
๊ฐ์ฒด๋ก ์ ๋ฌ๋๋ฉฐ, ์๋ต ๋ฐ์ดํฐ๋ HttpServletResponse
๊ฐ์ฒด๋ฅผ ํตํด ํด๋ผ์ด์ธํธ์๊ฒ ๋ฐํ๋ฉ๋๋ค.์ข ๋ฃ ๋จ๊ณ (Termination):
destroy()
๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์๋ธ๋ฆฟ์ ์ข
๋ฃํฉ๋๋ค. ์ด ๋ฉ์๋๋ ์๋ธ๋ฆฟ์ ์์์ ์ ๋ฆฌํ๊ณ ์ข
๋ฃํ ๋ ํ์ํ ์์
์ ์ํํฉ๋๋ค.์ฑ๋ฅ:
์์ ์ฑ:
์ฌ์ฌ์ฉ์ฑ:
ํ๋ซํผ ๋ ๋ฆฝ์ฑ:
ํ์ฅ์ฑ ๋ฐ ํตํฉ:
CGI (Common Gateway Interface):
PHP, ASP ๋ฑ ์คํฌ๋ฆฝํธ ์ธ์ด:
์๋๋ ์ฌ์ฉ์์ ์์ฒญ์ ๋ฐ์ "Hello, Servlet!" ๋ฉ์์ง๋ฅผ ๋ฐํํ๋ ๊ฐ๋จํ Servlet ์์ ์ ๋๋ค.
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
// ์๋ธ๋ฆฟ ๋งคํ์ ์ํ URL ๊ฒฝ๋ก ์ค์
@WebServlet("/helloServlet")
public class HelloServlet extends HttpServlet {
// GET ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ฉ์๋
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// ์๋ต ์ฝํ
์ธ ํ์
์ค์
response.setContentType("text/html");
// ์๋ต์ ์ถ๋ ฅํ๊ธฐ ์ํ PrintWriter ๊ฐ์ฒด ์์ฑ
PrintWriter out = response.getWriter();
// HTML ํํ์ ์๋ต ์์ฑ
out.println("<html>");
out.println("<head><title>Servlet Example</title></head>");
out.println("<body>");
out.println("<h1>Hello, Servlet!</h1>");
out.println("</body>");
out.println("</html>");
}
}
@WebServlet("/helloServlet")
์ด๋
ธํ
์ด์
์ ์ฌ์ฉํ์ฌ ์ด ์๋ธ๋ฆฟ์ด /helloServlet
๊ฒฝ๋ก๋ก ์์ฒญ์ด ์์ ๋ ์คํ๋๋๋ก ์ค์ ํฉ๋๋ค.PrintWriter
๊ฐ์ฒด๋ฅผ ์ด์ฉํด HTTP ์๋ต์ผ๋ก HTML ์ฝํ
์ธ ๋ฅผ ์์ฑํ๊ณ ํด๋ผ์ด์ธํธ์๊ฒ ์ ์กํฉ๋๋ค.์ด ์์ ๋ ๊ธฐ๋ณธ์ ์ธ Servlet์ ๋์ ๋ฐฉ์์ ๋ณด์ฌ์ฃผ๋ฉฐ, ์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ๋ ๋ณต์กํ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋ฑ์ ์ํํ๊ฒ ๋ฉ๋๋ค. Servlet์ ์๋ฒ ์ฑ๋ฅ์ ๋์ด๊ณ , ๋ค์ํ ํ๋ซํผ์์ ์์ ์ ์ผ๋ก ๋์ํ๋ ๊ฐ๋ ฅํ ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ ๋๊ตฌ์ ๋๋ค.
Servlet์ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ฐ์ ํ์ํ ๋ก์ง์ ์ํํ๊ณ , ๊ฒฐ๊ณผ๋ฅผ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฐํํ๋ ์๋ฒ ์ธก ํ๋ก๊ทธ๋จ์ ๋๋ค. ์ด๋ฏธ์ง์์ ์ค๋ช ๋ Servlet ๋์์ ์ฃผ์ ๋จ๊ณ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
http://localhost:8080/myapp/hello
์ ์ ์ํ๋ฉด, ๋ธ๋ผ์ฐ์ ๋ ์ด URL์ ํด๋นํ๋ ์์ฒญ์ ์๋ฒ์ ์ ์กํฉ๋๋ค.Web Application Server:
Servlet์ ์ญํ :
๋ฐ์ดํฐ ์์ (Data Get):
HttpServletRequest
๊ฐ์ฒด๋ฅผ ํตํด ์์ ํฉ๋๋ค. ์ฌ๊ธฐ์๋ ์์ฒญ ํ๋ผ๋ฏธํฐ, ํค๋ ์ ๋ณด, ์ธ์
์ ๋ณด ๋ฑ์ด ํฌํจ๋ฉ๋๋ค.๋น์ฆ๋์ค ๋ก์ง ์ฒ๋ฆฌ (Logic - Business):
์๋ต ํ์ด์ง ์์ฑ (Response Page):
HttpServletResponse
๊ฐ์ฒด๋ฅผ ํตํด ์์ฑ๋๋ฉฐ, ๋ธ๋ผ์ฐ์ ๊ฐ ์ด๋ฅผ ๋ ๋๋งํ์ฌ ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ค๋๋ค.HttpServletResponse
๊ฐ์ฒด๋ฅผ ํตํด ํด๋ผ์ด์ธํธ๋ก ์ ๋ฌ๋ฉ๋๋ค.์ด๋ฏธ์ง์์ ๋ณด์ฌ์ฃผ๋ ๊ตฌ์กฐ๋ Java Servlet API์ ์์ ๊ด๊ณ๋ฅผ ๋ํ๋ด๊ณ ์์ต๋๋ค. Servlet์ Java EE ์ฌ์์ ์ผ๋ถ๋ก, ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ํด๋ผ์ด์ธํธ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ์๋ต์ ์์ฑํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ด ๊ตฌ์กฐ๋ฅผ ์ดํดํ๋ฉด ์๋ธ๋ฆฟ์ ๋์ ์๋ฆฌ์ ๊ฐ ํด๋์ค ๋ฐ ์ธํฐํ์ด์ค์ ์ญํ ์ ๋ช ํํ ํ์ ํ ์ ์์ต๋๋ค.
Servlet
์ธํฐํ์ด์ค๋ ๋ชจ๋ ์๋ธ๋ฆฟ์ด ๊ตฌํํด์ผ ํ๋ ๊ธฐ๋ณธ ์ธํฐํ์ด์ค์
๋๋ค. Servlet์ ์๋ช
์ฃผ๊ธฐ ๋ฉ์๋์ธ init()
, service()
, destroy()
, getServletConfig()
, getServletInfo()
๋ฉ์๋๋ฅผ ์ ์ํ๊ณ ์์ต๋๋ค.GenericServlet
ํด๋์ค๋ Servlet
์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ์ถ์ ํด๋์ค์
๋๋ค. ํ๋กํ ์ฝ์ ๋
๋ฆฝ์ ์ด๋ฉฐ, service()
๋ฉ์๋๋ฅผ ์ ์ธํ ๋๋จธ์ง ๋ฉ์๋๋ฅผ ๊ธฐ๋ณธ ๊ตฌํ์ผ๋ก ์ ๊ณตํฉ๋๋ค. HttpServlet
์ด ์ฃผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.HttpServlet
์ GenericServlet
์ ์์๋ฐ์ HTTP ํ๋กํ ์ฝ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ์๋ธ๋ฆฟ์ ์์ฑํ๊ธฐ ์ํ ํด๋์ค์
๋๋ค. ์ด ํด๋์ค๋ HTTP ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ฐ ํ์ํ doGet()
, doPost()
, doPut()
, doDelete()
๋ฑ์ ๋ฉ์๋๋ฅผ ์ ๊ณตํฉ๋๋ค.MyServlet
์ HttpServlet
์ ์์๋ฐ์ ์ฌ์ฉ์๊ฐ ์ง์ ๊ตฌํํ๋ ์๋ธ๋ฆฟ์
๋๋ค. doGet()
, doPost()
๋ฑ์ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํ์ฌ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค.ServletRequest
์ธํฐํ์ด์ค๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ ์ ๋ณด๋ฅผ ์๋ธ๋ฆฟ์ ์ ๋ฌํ๋ ์ญํ ์ ํฉ๋๋ค. ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์ ๋ฌ๋ ๋ฐ์ดํฐ, ์์ฒญ ํ๋ผ๋ฏธํฐ, ํ๋กํ ์ฝ ์ ๋ณด ๋ฑ์ ์ ๊ณตํฉ๋๋ค.HttpServletRequest
๊ฐ ์ด๋ฅผ ์์ํ์ฌ HTTP ์์ฒญ์ ํนํ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํฉ๋๋ค.HttpServletRequest
๋ ServletRequest
๋ฅผ ํ์ฅํ์ฌ HTTP ํ๋กํ ์ฝ๊ณผ ๊ด๋ จ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ธํฐํ์ด์ค์
๋๋ค. ์์ฒญ ๋ฉ์๋(GET, POST ๋ฑ), ํค๋ ์ ๋ณด, ์ธ์
์ ๋ณด ๋ฑ์ ์ฒ๋ฆฌํ ์ ์๋ ๋ฉ์๋๋ฅผ ์ ๊ณตํฉ๋๋ค.ServletResponse
์ธํฐํ์ด์ค๋ ์๋ธ๋ฆฟ์ด ํด๋ผ์ด์ธํธ์๊ฒ ์๋ต์ ์ ์กํ ๋ ์ฌ์ฉํ๋ ์ธํฐํ์ด์ค์
๋๋ค. ์๋ต์ ์ฝํ
์ธ ํ์
์ค์ , ์ถ๋ ฅ ์คํธ๋ฆผ ์ ๊ณต ๋ฑ์ ๋ด๋นํฉ๋๋ค.HttpServletResponse
๋ ServletResponse
๋ฅผ ํ์ฅํ์ฌ HTTP ์๋ต์ ํนํ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ธํฐํ์ด์ค์
๋๋ค. ์๋ต ์ฝ๋ ์ค์ , ์ฟ ํค ์ถ๊ฐ, ๋ฆฌ๋ค์ด๋ ํธ ์ฒ๋ฆฌ ๋ฑ์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.Servlet์ ๋ฐฐํฌ๋ web.xml
ํ์ผ์ ์ฌ์ฉํ์ฌ ์ค์ ํ๊ฑฐ๋, ์ด๋
ธํ
์ด์
์ธ @WebServlet
์ ์ฌ์ฉํ์ฌ ์ค์ ํ ์ ์์ต๋๋ค. ์ด ์ค์ ๋ค์ Servlet์ ๋์๊ณผ ์ด๊ธฐํ ๋ฐฉ์์ ์ ์ํ๋ ์ค์ํ ๋ถ๋ถ์
๋๋ค.
web.xml
ํ์ผ์ ๊ตฌ์กฐ์ ์ญํ web.xml
์ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฐฐํฌ ์ค์ ์ ์ ์ํ๋ XML ํ์ผ๋ก, ๊ฐ Servlet์ ์ด๊ธฐํ์ URL ๋งคํ์ ์ค์ ํฉ๋๋ค. ์ฃผ์ ํ๊ทธ๋ <servlet>
, <servlet-mapping>
, <load-on-startup>
์
๋๋ค.
servlet ํ๊ทธ:
<servlet>
<description>A simple example Servlet</description>
<display-name>ExampleServlet</display-name>
<servlet-name>exampleServlet</servlet-name>
<servlet-class>com.example.web.ExampleServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-name>
: ์๋ธ๋ฆฟ์ ์ด๋ฆ์ผ๋ก, <servlet-mapping>
์์ ์ด ์ด๋ฆ์ ์ฌ์ฉํ์ฌ ์๋ธ๋ฆฟ์ ์ฐธ์กฐํฉ๋๋ค.<servlet-class>
: ์๋ธ๋ฆฟ์ ์ค์ ํด๋์ค ๊ฒฝ๋ก๋ฅผ ์ง์ ํฉ๋๋ค. ์ด ๊ฒฝ๋ก๋ฅผ ํตํด ์๋ฒ๋ ํด๋น ํด๋์ค๋ฅผ ์ฐพ์ ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค.<load-on-startup>
:1
๋ก ์ค์ ํ๋ฉด ์๋ฒ๊ฐ ์์๋ ๋ ์๋ธ๋ฆฟ์ด ๋ฐ๋ก ๋ก๋๋๊ณ ์ด๊ธฐํ๋ฉ๋๋ค.servlet-mapping ํ๊ทธ:
<servlet-mapping>
<servlet-name>exampleServlet</servlet-name>
<url-pattern>/example</url-pattern>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<servlet-name>
: ๋งคํ๋ ์๋ธ๋ฆฟ์ ์ด๋ฆ์ ์ง์ ํ์ฌ <servlet>
ํ๊ทธ์ ์ฐ๊ฒฐํฉ๋๋ค.<url-pattern>
: ํด๋ผ์ด์ธํธ ์์ฒญ์ ๋ฐ์ URL ํจํด์ ์ ์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, /example
๋ก ์์ํ๊ฑฐ๋ .do
๋ก ๋๋๋ ๋ชจ๋ ์์ฒญ์ด ์ด ์๋ธ๋ฆฟ์ผ๋ก ์ ๋ฌ๋ฉ๋๋ค.@WebServlet:
web.xml
๋์ ์๋ธ๋ฆฟ ํด๋์ค์ ์ง์ ์ด๋
ธํ
์ด์
์ ์ฌ์ฉํ์ฌ ์ค์ ํ ์ ์์ต๋๋ค. ์ด๋
ธํ
์ด์
์ ์ฝ๋์์ ์๋ธ๋ฆฟ ๋งคํ๊ณผ ์ด๊ธฐํ๋ฅผ ์ค์ ํ ์ ์๊ฒ ํด์ค๋๋ค.
์์:
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "exampleServlet", urlPatterns = {"/example", "*.do"})
public class ExampleServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("text/html");
response.getWriter().println("<h1>Hello from ExampleServlet!</h1>");
}
}
name
: ์๋ธ๋ฆฟ์ ์ด๋ฆ์ ์ง์ ํฉ๋๋ค.
urlPatterns
: ์๋ธ๋ฆฟ์ด ์ฒ๋ฆฌํ URL ํจํด์ ์ค์ ํฉ๋๋ค. ์ด ์ค์ ์ ํตํด ํน์ URL๋ก์ ์์ฒญ์ด ๋ค์ด์์ ๋ ์ด ์๋ธ๋ฆฟ์ด ํด๋น ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค.
์ด๊ธฐํ ์์ ์ค์ :
<load-on-startup>
ํ๊ทธ๋ ์๋ธ๋ฆฟ์ด ์๋ฒ ์์ ์ ์ฆ์ ์ด๊ธฐํ๋ ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. init()
)๊ฐ ํธ์ถ๋ฉ๋๋ค. ์ด๋ ์์ฒญ ์ ์ด๊ธฐํ๋๋ ์๋ธ๋ฆฟ๋ณด๋ค ๋น ๋ฅธ ์๋ต์ ์ ๊ณตํ ์ ์๋ ์ฅ์ ์ด ์์ต๋๋ค.์คํ ์์:
load-on-startup
์ด ์ค์ ๋ ์๋ธ๋ฆฟ์ ์๋ฒ๊ฐ ์์๋ ๋ ๋ฐ๋ก ์คํ๋์ด ์๋ธ๋ฆฟ์ด ์ค๋น๋ฉ๋๋ค. ์ค์ ์ด ์์ผ๋ฉด ์๋ธ๋ฆฟ์ ์ฒซ ์์ฒญ์ด ์์ ๋ ๋ก๋๋ฉ๋๋ค.web.xml
ํ์ผ์ ์ฝ๊ณ ์๋ธ๋ฆฟ ์ค์ ์ ๋ก๋ํฉ๋๋ค.<load-on-startup>
์ด ์ค์ ๋ ์๋ธ๋ฆฟ์ ์๋ฒ ์์ ์ ์ฆ์ ์ด๊ธฐํ๋์ด ์ค๋น๋ฉ๋๋ค.Servlet์ ์๋ช ์ฃผ๊ธฐ๋ Servlet Container(Tomcat, Jetty ๋ฑ)์ ์ํด ๊ด๋ฆฌ๋ฉ๋๋ค. Container๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ฐ์ ์๋ธ๋ฆฟ์ ์์ฑ, ์ด๊ธฐํ, ์์ฒญ ์ฒ๋ฆฌ, ์๋ฉธ๊น์ง์ ๋ชจ๋ ๊ณผ์ ์ ๊ด๋ฆฌํฉ๋๋ค. ์๋ธ๋ฆฟ์ ์๋ช ์ฃผ๊ธฐ๋ ๋ค์๊ณผ ๊ฐ์ ์ฃผ์ ๋จ๊ณ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค:
load-on-startup
์ค์ ์ด ์๋ ๊ฒฝ์ฐ, ์๋ฒ๊ฐ ์์๋ ๋ ์๋ธ๋ฆฟ ์ปจํ
์ด๋๊ฐ ์๋ธ๋ฆฟ ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค.init()
๋ฉ์๋init()
๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์๋ธ๋ฆฟ์ ์ด๊ธฐํํฉ๋๋ค. init()
๋ฉ์๋๋ ์๋ธ๋ฆฟ์ด ์ฒ์ ๋ก๋๋ ๋ ํ ๋ฒ๋ง ํธ์ถ๋ฉ๋๋ค.init()
๋ฉ์๋๊ฐ ์๋ฃ๋๋ฉด ์๋ธ๋ฆฟ์ ์์ฒญ์ ๋ฐ์ ์ค๋น๊ฐ ๋ ์ํ๊ฐ ๋ฉ๋๋ค. ์ดํ์ ๋ชจ๋ ์์ฒญ์ ์ด๊ธฐํ๋ ์ํ์ ์๋ธ๋ฆฟ์์ ์ฒ๋ฆฌ๋ฉ๋๋ค.service()
๋ฉ์๋์์ฒญ ์ฒ๋ฆฌ ๋จ๊ณ:
service()
๋ฉ์๋๋ฅผ ํธ์ถํฉ๋๋ค. ์ด ๋ฉ์๋๋ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ์๋ต์ ์์ฑํ๋ ํต์ฌ ์ญํ ์ ํฉ๋๋ค.service()
๋ฉ์๋๋ ์์ฒญ์ ํ์
(GET, POST ๋ฑ)์ ๋ฐ๋ผ doGet()
, doPost()
, doPut()
, doDelete()
๋ฑ์ ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค.ํน์ง:
service()
๋ฉ์๋๋ ์์ฒญ์ด ์์ ๋๋ง๋ค ๋ฐ๋ณต์ ์ผ๋ก ํธ์ถ๋๋ฉฐ, ์๋ธ๋ฆฟ ๊ฐ์ฒด๊ฐ ์กด์ฌํ๋ ํ ๊ณ์ํด์ ์คํ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์์ฒญ๋ง๋ค ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ์ง ์๊ณ , ๊ธฐ์กด ๊ฐ์ฒด๊ฐ ์์ฒญ์ ์ฒ๋ฆฌํ๊ฒ ๋ฉ๋๋ค.destroy()
๋ฉ์๋์๋ฉธ ๋จ๊ณ:
destroy()
๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์๋ธ๋ฆฟ์ ์๋ฉธ์ํต๋๋ค.destroy()
๋ฉ์๋๋ ์๋ธ๋ฆฟ์ด ์ข
๋ฃ๋๊ธฐ ์ ๋ฆฌ์์ค๋ฅผ ํด์ ํ๊ฑฐ๋ ์ข
๋ฃ ์์
์ ์ํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ํด์ , ํ์ผ ๋ซ๊ธฐ ๋ฑ์ ์์
์ ์ฒ๋ฆฌํฉ๋๋ค.ํน์ง:
destroy()
๋ฉ์๋๋ ์๋ธ๋ฆฟ์ ์๋ช
์ฃผ๊ธฐ ๋์ ํ ๋ฒ๋ง ํธ์ถ๋๋ฉฐ, ํธ์ถ๋ ํ ์๋ธ๋ฆฟ ๊ฐ์ฒด๋ Garbage Collector์ ์ํด ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋ฉ๋๋ค.์์ฑ ๋ฐ ์ด๊ธฐํ๋ ํ ๋ฒ๋ง:
๋ฐ๋ณต์ ์ธ ์์ฒญ ์ฒ๋ฆฌ:
service()
๋ฉ์๋๋ ์ฌ๋ฌ ๋ฒ ํธ์ถ๋๋ฉฐ, ์๋ธ๋ฆฟ์ ์ฌ๋ฌ ์์ฒญ์ ๋จ์ผ ๊ฐ์ฒด๋ฅผ ํตํด ์ฒ๋ฆฌํฉ๋๋ค. ์ด๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ต์ ํํ๊ณ ์๋ต ์๋๋ฅผ ํฅ์์ํค๋ ๋ฐ ๊ธฐ์ฌํฉ๋๋ค.์๋ธ๋ฆฟ ์๋ฉธ:
destroy()
๋ฉ์๋๋ฅผ ํตํด ํ์ํ ์ ๋ฆฌ ์์
์ ์ํํ๊ณ ๊ฐ์ฒด๊ฐ ์๋ฉธ๋ฉ๋๋ค.์ด๋ฏธ์ง๋ HTTP์ ๋ ๊ฐ์ง ์ฃผ์ ๋ฐ์ดํฐ ์ ์ก ๋ฐฉ์์ธ GET๊ณผ POST์ ํน์ง, ์ฅ์ , ๋จ์ ์ ๋น๊ตํ๊ณ ์์ต๋๋ค. ์ด ์ ์ก ๋ฐฉ์์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ๋ฐ์ดํฐ ์ ์ก์ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. ์ฌ๊ธฐ์๋ GET๊ณผ POST ๋ฐฉ์์ ์ฐจ์ด์ , ๊ฐ๊ฐ์ ์ฌ์ฉ ์ฌ๋ก, ๊ทธ๋ฆฌ๊ณ ์ด๋ฏธ์ง๋ฅผ ๋ฐํ์ผ๋ก ์ค๋ช ๋ ๋ด์ฉ์ ์์ธํ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
GET ๋ฐฉ์์ ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ๋, ๋ฐ์ดํฐ๋ฅผ URL ๋ค์ Query String ํํ๋ก ์ ์กํ๋ ๋ฐฉ๋ฒ์
๋๋ค. ๋ณดํต URL์ ?
๊ธฐํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๊ฐ ์ ๋ฌ๋ฉ๋๋ค.
http://example.com/page?name=John&age=30
๊ณผ ๊ฐ์ด URL์ ํ๋ผ๋ฏธํฐ๊ฐ ํฌํจ๋ฉ๋๋ค.<a>
ํ๊ทธ)์ ๊ฐ์ ๋งํฌ๋ฅผ ํตํด ์์ฒญํ ์ ์์ต๋๋ค.HTTP Method (HTTP ๋ฉ์๋):
GET
์ ์์ฒญ ๋ฉ์๋๋ฅผ ๋ํ๋ด๋ฉฐ, ์๋ฒ์์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๊ณ ์ ํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.์๋ฒ ์์ฒญ Target (์๋ฒ ์์ฒญ ํ๊ฒ):
GET
๋ฉ์๋ ์ค๋ฅธ์ชฝ์ ์์นํ /servlet/com.ktds.controller.HelloServlet
.HelloServlet
์ด๋ผ๋ ์๋ธ๋ฆฟ์ ์์ฒญํ๊ณ ์์ต๋๋ค.Parameter (ํ๋ผ๋ฏธํฐ):
?
๋ก ์์ํ๋ ๋ถ๋ถ (?user=java&pw=java
).user
์ pw
๋ผ๋ ๋ ๊ฐ์ ํ๋ผ๋ฏธํฐ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.HTTP Version (HTTP ๋ฒ์ ):
HTTP/1.0
.HTTP Request (HTTP ์์ฒญ):
GET /servlet/com.ktds.controller.HelloServlet?user=java&pw=java HTTP/1.0
.HTTP Header (HTTP ํค๋):
Browser (๋ธ๋ผ์ฐ์ ์ ๋ณด):
Connection
, User-Agent
, Host
๋ก ํ์๋ ๋ถ๋ถ.Connection: Keep-Alive
๋ ์ฐ๊ฒฐ์ ์ง์ํ๋๋ก ์์ฒญ.User-Agent
๋ ๋ธ๋ผ์ฐ์ ์ ์ด์์ฒด์ ๋ฅผ ์๋ณํฉ๋๋ค.Host
๋ ์์ฒญ์ ๋ณด๋ด๋ ์๋ฒ์ ์ฃผ์์ ํฌํธ๋ฅผ ์ง์ ํฉ๋๋ค.Accepted MIME Types (์๋ฝ ๊ฐ๋ฅํ MIME ์ ํ):
Accept: image/gif, image/x-xbitmap, image/jpeg, image/png, */*
.Accept-Encoding (์๋ฝ ๊ฐ๋ฅํ ์ธ์ฝ๋ฉ):
Accept-Encoding: gzip
.Accept-Language (์๋ฝ ๊ฐ๋ฅํ ์ธ์ด):
Accept-Language: kr
.Accept-Charset (์๋ฝ ๊ฐ๋ฅํ ๋ฌธ์ ์ธํธ):
Accept-Charset: iso-8859-1,*,utf-8
.Blank Line (๋น ์ค):
POST ๋ฐฉ์์ ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ๋, ๋ฐ์ดํฐ๋ฅผ HTTP ์์ฒญ์ ๋ณธ๋ฌธ(body)์ ๋ด์ ์ ์กํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์ด๋ GET ๋ฐฉ์๊ณผ๋ ๋ฌ๋ฆฌ URL์๋ ๋ฐ์ดํฐ๊ฐ ํ์๋์ง ์์ต๋๋ค.
์ด๋ฏธ์ง์์ ์ค๋ช ํ๋ ๋ด์ฉ์ HTTP POST ์์ฒญ์ ๊ตฌ์กฐ๋ก, POST ๋ฐฉ์์์์ ์์ฒญ ๋ฉ์์ง ๊ฐ ๋ถ๋ถ์ ๊ตฌ์ฒด์ ์ผ๋ก ๋๋์ด ๋ณด์ฌ์ฃผ๊ณ ์์ต๋๋ค. ๊ฐ ์์๋ฅผ ๊ทธ๋ฆผ์ ํ์๋ ๋ด์ฉ์ ๋ง์ถ์ด ์ค๋ช ํ๊ฒ ์ต๋๋ค.
POST
๋ก ํ์๋์ด ์์ต๋๋ค.POST
๋ฉ์๋ ์ค๋ฅธ์ชฝ์ ์๋ /servlet/com.ktds.controller.HelloServlet
.HelloServlet
์ด๋ผ๋ ์๋ธ๋ฆฟ์ ํธ์ถํ๋ ๊ฒฝ๋ก์
๋๋ค.HTTP/1.0
.POST /servlet/com.ktds.controller.HelloServlet HTTP/1.0
.์์น: ์์ฒญ ๋ผ์ธ ์๋์ ์ฌ๋ฌ ์ค์ด ํค๋์ ํด๋นํฉ๋๋ค.
์ค๋ช : ์์ฒญ์ ๋ํ ์ถ๊ฐ ์ ๋ณด๋ฅผ ํฌํจํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ์ ๋ณด, MIME ํ์ , ์ธ์ฝ๋ฉ ๋ฐฉ์, ์ธ์ด ์ค์ ๋ฑ์ ๋ด๊ณ ์์ต๋๋ค.
Mozilla/4.76
์ด SunOS
์์ ์คํ ์ค์).localhost:8080
).Connection
, User-Agent
, Host
์ ๊ฐ์ ํค๋ ํญ๋ชฉ๋ค.Accept: image/gif, image/x-xbitmap, image/jpeg, image/png, */*
.Accept-Encoding: gzip
.Accept-Language: kr
.Accept-Charset: iso-8859-1,*,utf-8
.user=java&pw=java
๋ก ํ์๋ ๋ถ๋ถ.user
์ pw
๋ผ๋ ํ๋ผ๋ฏธํฐ๊ฐ ๋ณธ๋ฌธ์ ํฌํจ๋์ด ์๋ฒ๋ก ์ ๋ฌ๋ฉ๋๋ค.GET ๋ฐฉ์ ์ฌ์ฉ ์ฌ๋ก
<a>
ํ๊ทธ): <a href="http://example.com/page?name=John">Click here</a>
์ฒ๋ผ ๋งํฌ๋ฅผ ํตํด ํ์ด์ง๋ฅผ ์ด๋ํ ๋ ์ฌ์ฉ.<form method="get">
์ ์ฌ์ฉํ ํผ ์ ์ถ ์.POST ๋ฐฉ์ ์ฌ์ฉ ์ฌ๋ก
<form method="post">
๋ฅผ ์ฌ์ฉํ์ฌ ํผ ๋ฐ์ดํฐ๋ฅผ ์ ์ถํ ๋. ์๋ฅผ ๋ค์ด, ๋ก๊ทธ์ธ ์ ๋ณด ์ ์ถ, ๋๊ธ ์์ฑ ๋ฑ.Servlet์ ๋์ ์๋ฆฌ๋ฅผ ๋จ๊ณ๋ณ๋ก ์ค๋ช ๋๋ฆฌ๊ฒ ์ต๋๋ค:
isLoaded?
ํ์ธ:init()
๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์ด๊ธฐํ ์์
์ ์ํํฉ๋๋ค. ์ด ๊ณผ์ ์ Servlet์ด ์ฒ์ ๋ก๋๋ ๋ ํ ๋ฒ๋ง ์คํ๋ฉ๋๋ค.service()
๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค. service()
๋ฉ์๋๋ GET
, POST
๋ฑ์ HTTP ์์ฒญ์ ๋ฐ๋ผ ํด๋น ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์ฒ๋ฆฌํฉ๋๋ค.service()
๋ฉ์๋๋ ์์ฒญ์ ์ฒ๋ฆฌํ ํ, ํด๋ผ์ด์ธํธ์๊ฒ ๋ณด๋ผ ์๋ต ๋ฉ์์ง๋ฅผ ์์ฑํฉ๋๋ค.์์ฒญ ํ๋กํ ์ฝ ํด์ ํ Web Container์ ์ ๋ฌ:
HttpServletRequest์ HttpServletResponse ๊ฐ์ฒด ์์ฑ:
HttpServletRequest
์ HttpServletResponse
๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ, ์์ฒญ ์ ๋ณด์ ์๋ต์ ์ฒ๋ฆฌํฉ๋๋ค.service ๋ฉ์๋ ํธ์ถ ์ argument๋ก ์ ๋ฌ:
service()
๋ฉ์๋๋ฅผ ํธ์ถํ ๋, HttpServletRequest
์ HttpServletResponse
๊ฐ์ฒด๋ฅผ ์ธ์๋ก ์ ๋ฌํ์ฌ ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค.์๋ต ๋ด์ฉ ์ค์ ํ ํด๋ผ์ด์ธํธ๋ก ์ ๋ฌ:
String getParameter(String name)
String getParameter(String name)
name
: ์์ฒญ ํ๋ผ๋ฏธํฐ์ ์ด๋ฆ (ํผ์ input ์์์ name
์์ฑ).null
์ ๋ฐํํฉ๋๋ค.์๋ฅผ ๋ค์ด, ํด๋ผ์ด์ธํธ๊ฐ ๋ค์๊ณผ ๊ฐ์ ํผ์ ์ ์ถํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค:
<form action="/process" method="GET">
<input type="text" name="username" value="john_doe">
<input type="submit" value="Submit">
</form>
์๋ธ๋ฆฟ์์ ์ด๋ฅผ ์ฒ๋ฆฌํ๋ ์์ :
@WebServlet("/process")
public class ParameterExampleServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
// getParameter()๋ก 'username' ํ๋ผ๋ฏธํฐ ๊ฐ์ ๊ฐ์ ธ์ด
String username = request.getParameter("username"); // "john_doe" ๋ฐํ
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<h1>Username: " + username + "</h1>");
}
}
String[] getParameterValues(String name)
String[] getParameterValues(String name)
name
: ์์ฒญ ํ๋ผ๋ฏธํฐ์ ์ด๋ฆ (ํผ์ input ์์์ name
์์ฑ).null
์ ๋ฐํํฉ๋๋ค.๋ค์์ ์ฌ๋ฌ ์ฒดํฌ๋ฐ์ค์์ ์ ํ๋ ๊ฐ์ ์ฒ๋ฆฌํ๋ ์์ ์ ๋๋ค:
<form action="/process" method="POST">
<input type="checkbox" name="interest" value="sports"> Sports<br>
<input type="checkbox" name="interest" value="music"> Music<br>
<input type="checkbox" name="interest" value="movies"> Movies<br>
<input type="submit" value="Submit">
</form>
์๋ธ๋ฆฟ์์ ์ด๋ฅผ ์ฒ๋ฆฌํ๋ ์์ :
@WebServlet("/process")
public class ParameterValuesServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
// getParameterValues()๋ก 'interest' ํ๋ผ๋ฏธํฐ์ ๋ชจ๋ ๊ฐ์ ๊ฐ์ ธ์ด
String[] interests = request.getParameterValues("interest");
response.setContentType("text/html");
PrintWriter out = response.getWriter();
if (interests != null) {
out.println("<h2>Selected Interests:</h2>");
for (String interest : interests) {
out.println("<p>" + interest + "</p>"); // ๊ฐ๊ฐ์ ์ ํ๋ ๊ฐ ์ถ๋ ฅ (e.g., Sports, Music ๋ฑ)
}
} else {
out.println("<h2>No interests selected.</h2>");
}
}
}
getParameter(String name)
: ๋จ์ผ ๊ฐ๋ง ๊ฐ์ ธ์ด. ๊ฐ์ ์ด๋ฆ์ ์ฌ๋ฌ ํ๋ผ๋ฏธํฐ๊ฐ ์์ ๋ ์ฒซ ๋ฒ์งธ ๊ฐ๋ง ๋ฐํ.getParameterValues(String name)
: ๊ฐ์ ์ด๋ฆ์ผ๋ก ์ ๋ฌ๋ ๋ชจ๋ ๊ฐ์ ๋ฐฐ์ด๋ก ๊ฐ์ ธ์ด. ์ฌ๋ฌ ๊ฐ์ ์
๋ ฅ์ ์ฒ๋ฆฌํ ๋ ์ฌ์ฉ.null
์ ๋ฐํํ๋ฏ๋ก, ๋ฐ๋์ ๊ฐ์ด ์กด์ฌํ๋์ง ํ์ธ ํ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.Servlet์ Presentation Layer์ Controller ์ญํ ์ ๋ด๋นํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ํ ๊ตฌ์ฑ ์์์ ๋๋ค. ์ด ์ญํ ์ ์ดํดํ๊ธฐ ์ฝ๊ฒ ์ค๋ช ๋๋ฆฌ๊ฒ ์ต๋๋ค.
Presentation Layer (ํ๋ ์ ํ ์ด์ ๊ณ์ธต):
Controller (์ปจํธ๋กค๋ฌ):
Adapter Pattern (์ด๋ํฐ ํจํด)์ ์ํํธ์จ์ด ๋์์ธ ํจํด ์ค ํ๋๋ก, ์๋ก ํธํ๋์ง ์๋ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ง ํด๋์ค๋ค์ด ํจ๊ป ๋์ํ ์ ์๋๋ก ํด์ฃผ๋ ์ญํ ์ ํฉ๋๋ค. ์ด๋ฅผ ํตํด ๊ธฐ์กด ์ฝ๋์ ์์ ์์ด ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ฑฐ๋, ์๋ก ๋ค๋ฅธ ํด๋์ค ๊ฐ์ ์ํธ์์ฉ์ ๊ฐ๋ฅํ๊ฒ ๋ง๋ญ๋๋ค.
Adapter Pattern์ ์ฃผ๋ก ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์ฑ ์์๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค:
Target (๋ชฉํ ์ธํฐํ์ด์ค):
Client (ํด๋ผ์ด์ธํธ):
Adaptee (์ ์ ๋์, ๊ธฐ์กด ํด๋์ค):
Adapter (์ด๋ํฐ ํด๋์ค):
๋ค์์ Adapter Pattern์ ๋์ ์์๋ฅผ ํตํด ์ค๋ช ํฉ๋๋ค.
Target
์ธํฐํ์ด์ค์ request()
๋ฉ์๋๋ฅผ ํธ์ถํ๋ ค๊ณ ํฉ๋๋ค.Adaptee
ํด๋์ค๋ specificRequest()
๋ผ๋ ๋ฉ์๋๋ง ์ ๊ณตํ๊ณ ์์ด, ํด๋ผ์ด์ธํธ๊ฐ ๊ธฐ๋ํ๋ ๋ฉ์๋๋ฅผ ์ ๊ณตํ์ง ์์ต๋๋ค.Target ์ธํฐํ์ด์ค ์ ์:
// ํด๋ผ์ด์ธํธ๊ฐ ๊ธฐ๋ํ๋ ์ธํฐํ์ด์ค
interface Target {
void request();
}
Adaptee ํด๋์ค ์ ์:
// ๊ธฐ์กด ํด๋์ค, ํด๋ผ์ด์ธํธ๊ฐ ์ง์ ์ฌ์ฉํ ์ ์๋ ํํ
class Adaptee {
void specificRequest() {
System.out.println("Specific request executed.");
}
}
Adapter ํด๋์ค ๊ตฌํ:
// ์ด๋ํฐ ํด๋์ค, Target ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์ฌ Adaptee๋ฅผ ๊ฐ์ธ๋ ์ญํ ์ ํจ
class Adapter implements Target {
private Adaptee adaptee;
// Adaptee ๊ฐ์ฒด๋ฅผ ์์ฑ์ ์ฃผ์
์ ํตํด ์ฌ์ฉ
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
// ํด๋ผ์ด์ธํธ๊ฐ ๊ธฐ๋ํ๋ ๋ฉ์๋๋ฅผ ๊ตฌํํ๋ฉด์ Adaptee์ ๋ฉ์๋๋ฅผ ํธ์ถ
@Override
public void request() {
// Adaptee์ ๊ธฐ๋ฅ์ ํด๋ผ์ด์ธํธ๊ฐ ๊ธฐ๋ํ๋ ๋ฐฉ์์ผ๋ก ํธ์ถ
adaptee.specificRequest();
}
}
ํด๋ผ์ด์ธํธ ์ฝ๋ ์ฌ์ฉ ์์ :
public class AdapterPatternDemo {
public static void main(String[] args) {
// ๊ธฐ์กด์ Adaptee ํด๋์ค ์ธ์คํด์ค ์์ฑ
Adaptee adaptee = new Adaptee();
// ์ด๋ํฐ๋ฅผ ์ฌ์ฉํด Target ์ธํฐํ์ด์ค๋ก ๋ณํํ์ฌ ์ฌ์ฉ
Target target = new Adapter(adaptee);
// ํด๋ผ์ด์ธํธ๋ Target ์ธํฐํ์ด์ค์ ๋ฉ์๋๋ฅผ ํธ์ถ
target.request(); // Output: Specific request executed.
}
}
Target
์ธํฐํ์ด์ค์ request()
๋ฉ์๋๋ฅผ ํธ์ถํฉ๋๋ค.Target
์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์ฌ Adaptee
ํด๋์ค์ specificRequest()
๋ฅผ ํธ์ถํ๋ ๋ฐฉ์์ผ๋ก, ์ธํฐํ์ด์ค๋ฅผ ๋ณํํฉ๋๋ค.specificRequest()
๊ฐ ํธ์ถ๋๋ฉด์, ์ค์ ๊ธฐ๋ฅ์ด ์คํ๋ฉ๋๋ค.Target
์ธํฐํ์ด์ค๋ฅผ ํตํด ๊ธฐ์กด ํด๋์ค์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๊ฒ ๋ฉ๋๋ค.