Notice
Recent Posts
Recent Comments
Link
관리 메뉴

look-forest

Servlet을 이용한 웹 개발 본문

Spring/Spring MVC - 웹 개발 핵심 기술

Servlet을 이용한 웹 개발

studyHub 2021. 6. 23. 17:38

예전엔 Servlet을 이용해 웹 개발을 했었다.

앞서 보았듯, Servlet은 Http 스펙을 편리하게 사용하게 해준다. 개발자는 비즈니스 로직만 구현하면 된다.

(하지만 개발자의 욕심은 끝이 없어, 지금은 더 편리한 MVC 프레임워크을 사용하고 있다)

 

이번 시간에는 고대의 웹 개발 방식, Servlet을 이용한 웹 개발에 대해서 알아보자.

 


 

서블릿 등록 및 사용

서블릿 등록 (in Springboot)

스프링 부트는 서블릿을 직접 등록해서 사용할 수 있도록 @ServletComponentScan을 지원한다.

 

컴포넌트 스캔처럼 하위 패키지의 서블릿 클래스를 읽어 서블릿 컨테이너에 등록한다.

 

서블릿 코드 등록

- 서블릿은 HttpServlet를 상속받아야 한다.

 

- @WebServlet ▶서블릿 애노테이션

   (name: 서블릿 이름 urlPatterns: URL 매핑)

 

- HTTP 요청을 통해 매핑된 URL이 호출되면 서블릿 컨테이너는 service 메서드를 실행한다.

@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
    //WAS가 reqeust, response 객체를 만들고 서블릿을 호출.서블릿이 호출되면 service 메소드가 호출된다
    @Override
    protected void service(HttpServletRequest reqeust, HttpServletResponse response) throws ServletException, IOException {
        //WAS 별 서블릿 표준 스펙의 구현체
        System.out.println("reqeust = " + reqeust);
        System.out.println("response = " + response);

        //서블릿은 HTTP 쿼리 파라미터를 쉽게 읽도록 지원
        String username = reqeust.getParameter("username");
        System.out.println("username = " + username);

        response.setContentType("text/plain"); //header 정보
        response.setCharacterEncoding("utf-8");
        response.getWriter().write("hello "+username);//http message body에 data가 들어감
    }
}

 

서블릿 컨테이너의 동작 방식

내장 톰캣 서버 → 서블릿 컨테이너 생성

스프링 부트가 실행될 때 내장 톰캣 서버를 띄우고, 톰캣은 서블릿 컨테이너에 서블릿 객체를 생성해둔다.

 

웹 애플리케이션 서버의 요청 응답 구조

WAS가 HTTP Request, Response 객체를 생성해 서블릿에게 던져준다.

서블릿은 그 객체를 이용해 HTTP 스펙을 편리하게 이용한다.

 

 


HttpServletRequest, HttpServletResponse

서블릿이 HTTP 요청 메시지, HTTP 응답 메시지를 편리하게 사용하도록 도와주는 객체

WAS가 이 표준 인터페이스를 구현해서 서블릿에게 전달한다.

개발자가 직접 HTTP 요청 메시지를 파싱하거나 응답 메시지를 생성하는 불편을 해소해준다.

HttpServletRequest 역할

1. HTTP 요청 메시지를 파싱한 결과를 HttpServletRequest 객체에 담아서 제공

  • Start line - ex) request.getMethod(), request.getRequestURL()
  • Header - ex) request.getContentType(), request.getCookies()
  • Body - ex) request.getParameter(), request.getInputStream()

※ HTTP 요청 메시지를 통해 데이터를 전달하는 3가지 방법 

더보기
1. GET - 쿼리 파라미터
메시지 바디 없이, URL의 쿼리 파라미터에 데이터를 포함해서 전달 (content-type이 없다)

2. POST - HTML Form
메시지 바디에 쿼리 파리미터 형식으로 전달 (username=hello&age=20)
content-type: application/x-www-form-urlencoded

▷ 1,2번은 서버 입장에서는 형식이 같기 때문에, 둘 다 request.getParameter()로 조회한다

3. HTTP message body에 데이터를 직접 담아서 요청 (브라우저가 해주는 것이 아님)
HTTP API에서 주로 사용, 데이터 형식은 주로 JSON 사용

HTTP 메시지 바디의 데이터를 request.getInputStream()을 사용해서 직접 읽을 수 있다.
  읽은 바이트코드를 문자열로 변환 후, JSON 형식이라면 파싱해서 객체를 만들면 된다.

 

 

2. 해당 HTTP 요청이 시작부터 끝날 때까지 유지되는 임시 저장소 기능

  • 저장: request.setAttribute(name, value)
  • 조회: request.getAttribute(name)

3. 세션 관리 기능

  • request.getSession(create: true)

HttpServletResponse 역할

1. HTTP 응답 메시지 생성

  • status-line - ex) response.setStatus()
  • header - response.setHeader()
  • body - response.getWriter().write() //문자열이든 HTML이든 JSON이든 다 문자열로 보낸다. Content-type으로 해석

 

2. 편의 기능 제공

편의 메서드 ex) response.setContentType(), response.sendRedirect(), response.addCookie()

 

 

 


 

참고 자료 & 이미지 출처
스프링 MVC 1편(김영한 님)