[MVC][2-1] 서블릿

kiteB·2021년 9월 8일
0

Spring 강의노트

목록 보기
22/24
post-thumbnail

[ 👋🏻 Hello 서블릿 ]

스프링 부트 환경에서 서블릿을 등록하고 사용해보자!

1. 스프링 부트 서블릿 환경 구성

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

1) @ServletComponentScan 추가

  • hello.servlet.ServletApplication.java
package hello.servlet;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;

@ServletComponentScan //서블릿 자동 등록
@SpringBootApplication
public class ServletApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServletApplication.class, args);
    }
}

ServletApplication을 실행해보면 아직은 아무것도 안 뜨는 것이 맞다!


2) 서블릿 등록하기

실제로 동작하는 서블릿 코드를 등록해보자.

  • hello.servlet.basic.HelloServlet.java
package hello.servlet.basic;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("HelloServlet.service");
        System.out.println("request = " + request);
        System.out.println("response = " + response);

        String username = request.getParameter("username");
        System.out.println("username = " + username);
    }
}

💡 @WebServlet 서블릿 어노테이션

@WebServlet 어노테이션은 해당 클래스를 서블릿으로 사용할 수 있게 해주는 어노테이션이다!

  • name: 서블릿 이름
  • urlPatterns: URL 매핑

HTTP 요청을 통해 매핑된 URL이 호출되면 서블릿 컨테이너는 다음 메서드를 실행한다.
protected void service(HttpServletRequest request, HttpServletResponse response)


3) 실행 결과

HelloServlet.service
request = org.apache.catalina.connector.RequestFacade@6b9269e0
response = org.apache.catalina.connector.ResponseFacade@2498f1e5
username = yeonju

🔗 전체 코드 확인하기


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

내장 톰캣 서버 생성

  • 스프링 부트 내부에 포함된 내장 톰캣이 띄워지면서 가지고 있는 서블릿 컨테이너를 통해 서블릿을 생성하고 등록해준다.

HTTP 요청, HTTP 응답 메시지

  • 웹 브라우저에서 HTTP 요청 포맷을 만들어서 서버에 요청한다.
  • 서버에서 동작을 마치면 HTTP 응답 메시지를 만들어 웹 브라우저에 전달한다.

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

  • 서버에서 요청받은 HTTP 요청 메시지를 기반으로 request, response 객체를 생성한다.
  • 서블릿 컨테이너에서 싱글톤으로 등록된 서블릿 중 매핑되는 서블릿을 호출하며 생성된 request, response 객체를 전달한다.
  • 전달받은 response를 기반으로 HTTP 응답 메시지를 생성해서 웹 브라우저로 전송한다.

[ HttpServletRequest - 개요 ]

1. HttpServletRequest 역할

서블릿은 개발자가 HTTP 요청 메시지를 편리하게 사용할 수 있도록 개발자 대신에 HTTP 요청 메시지를 파싱한다. 그리고 그 결과를 HttpServletRequest 객체에 담아서 제공한다.

HttpServletRequest를 사용하면 다음과 같은 HTTP 요청 메시지를 편리하게 조회할 수 있다.


2. HttpServletRequest 부가 기능

1) 임시 저장소 기능

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

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

2) 세션 관리 기능

  • request.getSession(create: true)

[ HttpServletRequest - 기본 사용법 ]

🔗 코드 확인하기

위의 코드를 입력한 뒤,

위 사진과 같이, postman에서 POST localhost:8080/request-header 입력, Bodyhello!를 입력한 뒤 send를 하면

이렇게 정보가 뜬다!
여기에서 주목할 부분은 [Content 편의 조회] - request.getContentLength() = 6 부분!
이 값이 6으로 뜨는 이유는 hello!Body에 입력해서 보냈기 때문이다!


[ HTTP 요청 데이터 - 개요 ]

HTTP 요청 메시지를 통해 클라이언트에서 서버로 데이터를 전달하는 방법을 알아보자.

주로 다음 3가지 방법을 사용한다.

  • GET - 쿼리 파라미터
  • POST - HTML Form
  • HTTP message body에 데이터를 직접 담아서 요청

1. GET - 쿼리 파라미터

💡 url?keyA=valueA&keyB=valueB

  • Ex) /url?username=hello&age=20
  • 메시지 바디 없이, URL의 쿼리 파라미터에 데이터를 포함해서 전달하는 방식이다.
  • Ex) 검색, 필터, 페이징 등에서 많이 사용하는 방식

2. POST - HTML Form

  • content-type: application/x-www-form-urlencoded
  • 메시지 바디에 쿼리 파리미터 형식으로 전달하는 방식이다.
    • username=hello&age=20
    • Ex) 회원 가입, 상품 주문, HTML Form 사용

3. HTTP message body에 데이터를 직접 담아서 요청

  • HTTP API에서 주로 사용한다.
  • JSON, XML, TEXT 등이 있는데 주로 JSON을 사용한다.
profile
🚧 https://coji.tistory.com/ 🏠

0개의 댓글