Servlet 기술의 정의 (Enterprise spec)
WAS는 web server + container라고 볼 수 있다.
하지만 container의 개념이 더 강하다!
✔︎브라우저에서 요청하면,
먼저 모든 요청은 웹 서버(web server)로 들어간다.
그럼 정적인 파일(css, js, png, mp3...)에 요청하고, 다시 그대로 반환하여
브라우저에서 띄운다.
✔︎하지만 프로그램이 실행되는 영역(동적)으로 요청을 더 하고싶을 때에는
즉, container/Engine/WAS와 같은 영역(java!!!)으로 더 들어간다.
여기서 container는 "프로그램이 돌아가는 영역" / 자바는 딱 두가지 클래스만 존재. DAO & VO
이제 서블릿이 무엇인가?
** 브라우저에서 요청하는 것을 처리해서 DAO에 요청하는 곳**
**프론트엔드와 백엔드를 연결하는, controller(중개자)**라고 한다.
❗️요청 순서
브라우저 ➡️ web server ➡️ servlet ➡️ DAO ➡️ DB
서블릿은 container 중, 가장 프론트에 가까운 개념이다. 여기서 프론트는 상대적인 단어이다.
✔︎ 브라우저의 디자인, 눈에 보이는 것을 프론트라 할 수 있고,
✔︎ 서블릿이 (서버 사이드에서) 프론트라 할 수 있다. "서버 사이드에서의 클라이언트" 라고 정의할 수 있다.
❗️서블릿 VS DAO
공통점
1. container(플랫폼)안에 있다. 즉 동적이다.
2. 베이스가 자바로 되어있다. 그래서 클래스라고 볼 수 있다.
차이점
1. 브라우저(http통신)에서 들어오는 요청을 처리하는 것은 서블릿이고, DAO는 그 요청을 DB로 보내는 것
2. 서블릿도 자바 클래스인데, ee급의 자바 클래스이다. 그래서 객체 생성을 개발자가 직접 하지 않고 컨테이너가 알아서 생성한다.
https://tomcat.apache.org/tomcat-5.5-doc/servletapi/index.html
위의 링크로 들어가서 다운로드
새로운 워크스페이스에서 이제 Servlet을 실습해보자.
그냥 Dynamic 프로젝트를 생성하면, 이렇게 서버가 없는 것을 볼 수 있다.
Apache Server를 추가해준다.
Servlet 4.대를 사용할 것이기 때문에, Tomcat v9.0 서버를 연결했다.
이제 다시 프로젝트를 생성해보자.
java를 했을 때 처럼 src 바로 아래에 생기는 것이 아니라, main/java 아래에 생기는 것을 볼 수 있다. (더 구체화됨)
한 번 아래 체크박스를 체크하고 생성해보자. 이는 배치 문서이다
프로젝트를 생성하면 다음과 같이 문서를 확인해볼 수 있다.
java 코드는 무조건 Java Resources안에 넣고,
html 코드는 무조건 src 안에 넣는다.
즉, java 코드를 배포하고 싶으면 src를 건들이면 안된다!!
project에서 다음과 같이 서블릿 클래스를 생성해보자.
이렇게 만들면 그냥 java class이다
이 자바뿐인 클래스를 Servlet으로 레벨업 시켜보자.
Servlet이 구현되어 있는 것을 상속하면 된다.
package web01_GenericServlet;
import java.io.IOException;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class MyServlet extends GenericServlet{
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
// TODO Auto-generated method stub
}
}
서블릿은 추상 클래스 HttpServlet을 상속받아 구현되며,
클라이언트의 요청을 처리하는 service() 메소드를 오버라이딩해야 한다.
이 메소드에는 요청 정보가 담긴 HttpServletRequest 객체와,
응답을 작성할 HttpServletResponse 객체가 전달되며,
요청의 종류에 따라 어떤 서비스를 실행할지를 결정하고, 그 결과를 클라이언트에게 응답하는 것이 서블릿의 핵심 역할이다.
간단한 문장을 출력하는 코드를 생성하고 실행해보자
package web.generic.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class MyGenericServlet extends GenericServlet{
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
PrintWriter out=res.getWriter();
out.println("<html><body><>h2");
out.println("Hello MyServlet");
out.println("</h2></body></html>");
}
}
Run on Server하면 이렇게 오류가 뜬다.
Run AS 로 이클립스가 한 번에 하는 일
1. 프로젝트 단위로 웹 서버에 배포
2. 서버를 가동
3. 브라우저에 서블릿을 직접 호출
하지만 안되는 이유는?
http://localhost:8888/web01_GenericServlet/web.generic.servlet.MyGenericServlet
경로가 잘못되어서 우선 경로를 바꿔준다.
그런데도 안되는 이유는?
컨테이너에 서블릿이 올라가있고, 경로도
로 제대로 설정해도 404 에러가 뜨는 이유는...
서블릿 인스턴스를 만들지 않아서, 즉 JVM에 올라가지 않아서이다.
아래 web.xml이 배치 문서이다.
소스코드로 바꾸면
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
<display-name>web01_GenericServlet</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.jsp</welcome-file>
<welcome-file>default.htm</welcome-file>
</welcome-file-list>
</web-app>
안에 내용물을 지우고 주문서를 작성해보자
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
<servlet>
<!-- 1. 서버내부이름 매핑 -->
<servlet-name>MyGenericServlet</servlet-name>
<servlet-class>web.generic.servlet.MyGenericServlet</servlet-class>
</servlet>
<!-- 2. 클라이언트 매핑 -->
<servlet-mapping>
<servlet-name>MyGenericServlet</servlet-name>
<url-pattern>/MGS</url-pattern>
</servlet-mapping>
</web-app>
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
<servlet>
<!-- 1. 서버내부이름 매핑 -->
<servlet-name>MyGenericServlet</servlet-name>
<servlet-class>web.generic.servlet.MyGenericServlet</servlet-class>
</servlet>
<!-- 2. 클라이언트 매핑 -->
<servlet-mapping>
<servlet-name>MyGenericServlet</servlet-name>
<url-pattern>/MGS</url-pattern>
</servlet-mapping>
</web-app>
이렇게 매핑 하고 아까 서블릿 클래스 실행하면 잘 실행이된다.
이번에는 배치 문서를 생성하지 말고 프로젝트를 생성해보자
처음에 만들면 패키지만 만들어지고, 똑같이 한 번 더 생성해주면 된다.
그 다음 클래스 내용을 이전에 했던 코드를 복붙한다.
package web.generic.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
/**
* Servlet implementation class MyServlet
*/
@WebServlet("/MGS")
public class MyServlet extends GenericServlet {
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
PrintWriter out=arg1.getWriter();
out.println("<html><body><h2>");
out.println("Hello MyServlet");
out.println("</h2></body></html>");
}
}
@WebServlet은 **서블릿(Servet)을 등록하는 어노테이션(annotation)**으로,
web.xml을 사용하지 않고도 서블릿을 매핑할 수 있게 해주는 기능
즉 저 어노테이션 하나가
이 xml 코드(주문서)를 대신한다고 생각하면 된다!
결국 (어노테이션을 사용한) 최종 로직은 이렇게 된다.
'KOSA FullStack 교육 > java' 카테고리의 다른 글
KOSA fullstack 교육(ConnectionPooling) (3) | 2025.07.02 |
---|---|
KOSA fullstack 교육(Servlet API 2) (0) | 2025.06.30 |
KOSA fullstack 교육(Lambda, Collection Stream) (0) | 2025.05.14 |
KOSA fullstack 교육(Compile Exception, abstract Class) (0) | 2025.05.03 |
KOSA fullstack 교육 (Collection API 심화, 예외처리) (0) | 2025.04.30 |