[Servlet] Servlet

Minit88·2023년 1월 9일
0

[Web]

목록 보기
1/9
post-thumbnail

Servlet

서버 사이드 프로그래밍

서버 사이드 프로그래밍은 서버 쪽에서 프로그래밍을 통해 데이터를 처리할 수 있도록 구성하는 것을 의미한다. 개발할 때는 다음과 같은 점들을 고려해야 한다.

  • 동시에 여러 요청이 들어온다면 어떻게 처리해야 하는가?
  • 서버에 문제가 생기면 이를 어떻게 처리하는 지
  • 어떤 방법으로 데이터 전송을 최적화 할 지
  • 분산 환경이나 분산 처리와 같은 문제

만일 새로운 서비스를 개발할 때마다 이런 고민을 새로 해야 한다면 엄청나게 많은 개발 비용과 시간을 소모하게 된다.
자바의 병우 이러한 처리를 JavaEE라는 기술 스펙으로 정리해 두었고, Servlet과 JSP는 JavaEE의 여러 기술 중에 하나이다.

Servlet

서블릿 기술은 쉽게 말해 서버에서 동적으로 요청과 응답을 처리할 수 있는 API들을 정의한 것이다.

  • 클라이언트의 요청에 동적으로 응답하는 웹 어플리케이션 컴포넌트
  • HTML을 사용하여 응답한다.
  • JAVA의 쓰레드를 이용한다.
  • MVC 패턴의 Controller 역할을 맡는다.
  • HTTP 프로토콜 서비스를 지원하는 javax.servlet.http.HttpServlet 클래스를 상속받는다.
  • UDP보다 처리 속도가 느리다.
  • HTML 변경 시 서블릿을 재 컴파일해야 한다는 단점이 존재한다.

Servlet Container

서블릿 컨테이너란 말 그대로 서블릿을 담고 관리해주는 컨테이너


[그림1] 서블릿 컨테이너
출처

서블릿 컨테이너는 구현되어 있는 서블릿 클래스의 규칙에 맞게 서블릿을 관리해주며 클라이언트에서 요청을 하면 컨테이너는 HttpServletRequest, HttpServletResponse 두 객체를 생성하며 post,get 여부에 따라 동적인 페이지를 생성하여 응답을 보낸다.

  • HttpServletRequest :
    http프로토콜의 request정보를 서블릿에게 전달하기 위한 목적으로 사용하며 헤더 정보, 파라미터, 쿠키, URI, URL 등의 정보를 읽어 들이는 메서드와 Body의 Stream을 읽어 들이는 메서드를 가지고 있습니다.
  • HttpServletResponse :
    WAS는 어떤 클라이언트가 요청을 보냈는지 알고 있고, 해당 클라이언트에게 응답을 보내기 위한 HttpServleResponse 객체를 생성하여 서블릿에게 전달하고 이 객체를 활용하여 content type, 응답 코드, 응답 메시지 등을 전송합니다.

HttpServletRequest의 주요 기능

getParameter() :

  • HttpServletRequest 가장 빈번하게 사용되는 메소드로 '?name=AAA&age=20'과 같은 쿼리 스트링에서 'name'이나 'age'라는 키(key)를 이용해서 값을 얻는 역할을 위해서 사용한다.
  • 명심해야 하는 점은 getParameter()의 결과는 항상 String 이라는 점이다. 만일 해당 파라미터가 존재하지 않는다면 null을 반환할 수 있다. 문자열로 반환되기 때문에 숫자를 처리할 때는 예외가 발생할 수 있으므로 주의할 필요가 있다.

getParameterValues() :

getParameter() 와 유사하게 getParameterValues() 는 동일한 이름의 파라미터가 여러개 있는 경우에 사용한다. 예를 들어 name이라는 이름의 파라미터가 여러 개 존재한다면 getParameterValus()를 이용해서 String[] 타입으로 반환된다.

setAttribute() :

setAttribute()는 JSP로 전달할 데이터를 추가할 때 사용한다. setAttribute() 는 '키'와 '값' 형태로 데이터를 저장할 수 있다. 이때 키는 문자열로 지정하고, 값은 모든 객체 타입을 이용할 수 있다. JSP에는 서블릿에서 setAttribute()로 전달된 데이터를 화면에 출력하게 된다.

RequestDispatcher

웹 MVC 구조에서는 HttpServletRequest와 getRequestDispatcher()를 이용해서 ReqeustDispatcher 타입의 객체를 구할 수 있다. ReqeustDispatcher 는 현재의 요청을 다른 서버의 자원(JSP 또는 서블릿)에게 전달하는 용도로 사용한다. ReqeustDispatcher에는 2개의 메서드가 존재한다.

  • forward() : 현재까지의 모든 응답 내용은 무시하고 JSP가 작성하는 내용만을 브라우저로 전달
  • include() : 지금까지 만들어진 응답내용 + JSP가 만든 내용을 브라우저로 전달

HttpServletResponse의 주요 기능

기능메소드설명
MIME 타입SetContentType()응답 데이터의 종류를 지정(이미지/html/xml 등)
상태 관련setStatus()404,200,500 등 읍답 상태 코드 지정
출력 관련getWriter()PrintWriter를 이용해서 응답메시지 작성
헤더 관련setHeader()특정 이름의 HTTP 헤더 지정
쿠키 관련addCookie()응답 시에 특정 쿠키 추가
전달 관련sendRedirect()브라우저에 이동을 지시

웹 사이트가 클라이언트에게 보이는 과정

(1) 클라이언트는 호스트에게 원하는 웹 페이지를 요청.
요청할 때에는 원하는 페이지의 URL을 적어서 보낸다

(2) 사용자의 요청이 톰캣(WAS)에 도착 Apache-Tomcat에 등록되어있는 URL매핑들중 일치하는 자원을 찾는다.

(3) 등록된 자원들 중 사용자의 요청에 따라 다른 결과들이 나오는 페이지를 동적 웹 페이지라고 한다.

(4) 클라이언트의 요청이 올바른 요청이라면(톰캣에 등록된 자원이 맞다면)
해당 자원을 만들거나 이미 있는 자원을 응답한다.(Servlet 프로그램 실행)
(5) 서블릿 내부에서는 GET/POST에 맞게 doGet()/dePost() 등의 메소드를 실행한다. 이 후 동일한 주소의 호출이 있을 때 서블릿은 동일한 객체 하나만을 이용해서 이를 처리한다.

(6) 웹 서버에서 응답한 자원이 요청 보냈던 클라이언트의 웹 브라우저에 도착한다.
웹 브라우저는 응답받은 내용을 해석하여 사용자에게 보여준다.

Servlet 생성

MyServlet 이라는 이름으로 새로운 class를 생성한다.

HttpServlet 상속,url패턴 설정 , HTML 작성
@WebServlet은 브라우저의 경로와 해당 서블릿을 연결하는 설정을 위해 사용
doGet()은 브라우저의 주소를 직접 변경해서 접근하는 경우에 호출되는 메소드

@WebServlet(name = "myServlet",urlPatterns = "/my")
public class MyServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException{
        resp.setContentType("text/html");

        PrintWriter out = resp.getWriter();
        out.println("<html<body>");
        out.println("<h1>MyServlet</h1>");
        out.println("</body></html>");
    }

}

이후 실행된 서블릿

Reference

Servlet

profile
" To be BE "

0개의 댓글