java 기반 웹 애플리케이션을 개발하기 위한 기술을 말하며 단순하게 표현하면 브라우저에서 실행되는 자바 클래스를 말한다. 웹 애플리케이션은 클라이언트와 서버 사이에서 요청을 받고 응답하는 방식으로 작동하는데 이 때 클라이언트가 사용하는 것이 브라우저가 된다.
이 때 서블릿에 대한 클라이언트의 요청이 발생해도 서블릿은 단독으로 수행할 수 없는데 서블릿은 자바 클래스라고 해도 main 메소드를 포함하지 않기 때문이다. 클라이언트의 요청이 발생하면 서블릿을 실행시키는 역할을 Servlet-Container(서블릿 컨테이너)가 한다.
컨테이너의 서블릿에 대한 설정은 배포 서술자인 web.xml
을 이용한다.
배포 서술자(Deployment Descriptor)라고 하며 어플리케이션에 대한 전체 설정 정보를 가지고 있는 파일을 말한다. 해당 파일의 정보를 가지고 웹 컨테이너가 서블릿을 구동시킨다.
설정할 정보로는 Servlet에 대한 정의, Servlet 초기화 파라미터, Servlet/JSP 매핑, MIME type 매핑, 보안 설정 등이 있다.
<web-app>
: 루트 속성, 문법 식별자 및 버전 정보를 속성 값으로 설정한다.
<context-param>
: 웹 어플리케이션에서 공유하기 위한 파라미터를 설정한다. 서버의 전역 변수 역할을 하는 것으로 key:value 형태로 저장된다.
<servlet>
안의 ,와 <servlet-mapping>
안의 , : 해당하는 서블릿을 매핑해서 servlet을 서버에 등록할 때 사용한다.
<mime-mapping>
: 특정 파일을 다운로드 했을 때 파일이 깨지는 현상을 방지하기 위해 설정한다.
💡 web.xml을 수정한 경우 서버를 내렸다가 다시 올리는 작업을 수행해야 변경사항이 제대로 적용된다.
먼저 HTTP프로토콜을 사용하는 서블릿으로 만들기 위해 javax.servlet.GenericServlet을 상속한 클래스인 HttpServlet을 상속 받아서 서블릿을 생성한다.
그리고 서블릿을 생성하면 HttpServlet에 정의되어있는 메소드를 재정의(오버라이드)한다.
doGet()
: 클라이언트가 get방식으로 요청한 내용을 처리하는 메소드
doPost()
: 클라이언트가 post방식으로 요청한 내용을 처리하는 메소드
두 메소드 모두 ServletException, IOException에 대한 처리를 해줘야 하는 메소드들로 throws로 넘길 수 있다.
마지막으로 서버에 요청을 받을 수 있게 등록을 해줘야 한다. 이 과정을 서블릿 매핑(Servlet-mapping)이라고 한다. 먼저 생성한 서블릿 클래스를 서버에 등록하고 해당하는 서블릿이 실행할 주소를 매핑한다.
public class MemberSearchAllServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public MemberSearchAllServlet() {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//get방식으로 요청이 들어올 때 실행되는 메소드
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//post 방식으로 요청이 들어올 때 실행되는 메소드
doGet(request, response);
}
}
web.xml에서 작성하거나 어노테이션 방식으로 작성하는 두 가지 방법이 존재한다. 어노테이션 방식으로 많이 작성하지만 서블릿이 많아지는 경우 구별이 어렵다는 단점이 존재한다.
web.xml에 서블릿을 매핑할 때는 작성하는 프로젝트에서 하게 되는데 이때 파일에 있는 <welcome-file>
은 주석 처리 하거나 가독성을 위해 삭제해도 무방하다. 어차피 Server 파일에 web.xml이 있기 때문에 프로젝트에 존재하는 부분을 삭제해도 Server에 있는 파일에서 적용한다.
<servlet-name>
: 서블릿을 구분하는 식별자를 지정한다. 해당하는 이름으로 서블릿을 구분하기 때문에 중복되는 경우 원하는 서블릿이 매핑되지 않을 수 있기 때문에 주의한다.
<servlet-class>
: 해당 하는 식별자에서 실행될 서블릿을 지정한다.
<url-pattern>
: 해당 하는 식별자에서 사용할 url 패턴을 지정한다. 브라우저의 url 창에 뜨는 문구를 지정한다. 마찬가지로 해당 url을 가지고 주소를 식별하기 때문에 url 패턴은 중복될 수 없다. 컴퓨터가 중복된 url 패턴 중에 어떤 url을 사용하려고 하는지 스스로 구분할 수 없기 때문이다.
<servlet>
<servlet-name>basicservlet</servlet-name>
<servlet-class>com.servlet.controller.BasicServletController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>basicservlet</servlet-name>
<url-pattern>/basicrequest.do</url-pattern>
</servlet-mapping>
어노테이션 방식으로 servlet을 등록할 때는 class선언부에 @WebServlet라는 어노테이션을 선언한다. 선언 후 annotation.WebServlet을 임포트해야 한다.
@WebServlet 어노테이션의 속성 설정으로 urlPatterns
, name
을 설정할 수 있다. 해당 설정은 매개변수로 받는다.
name에는 web.xml에서 작성했던 servlet-name을 작성하고, urlPatterns도 마찬가지로 작성한다. urpPatterns는 배열로 작성 가능하지만 단일 값인 경우 { } 안에 문자열로 해당하는 url패턴을 작성해도 된다.
외부에서 가져오는 servlet을 사용할 때는 수정이 불가능하기 때문에 해당 방법을 이용할 수 없다.
import javax.servlet.annotation.WebServlet; //임포트하기
//단일 urlPattern 사용시
@WebServlet(name = "paramdata",urlPatterns = "/testperson.do")
//다수의 urlPatterns 사용 시
@WebServlet(name = "paramdata",urlPatterns = {"/testperson.do","/testserver.do"})
----------------------------------------------------------------
@WebServlet("/memberall.do") //url패턴만 작성도 가능하다
public class MemberSearchAllServlet extends HttpServlet {
//생략
}