Spring MVC/서블릿

[Spring MVC] 서블릿 - Hello 서블릿 등록 및 사용

Boradoris 2023. 1. 25. 18:40

Hello 서블릿

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

 

참고
서블릿은 톰캣 같은 웹 애플리케이션 서버를 직접 설치하고,
그 위에 서블릿 코드를 클래스 파일로 빌드해서 올린 후에 톰캣 서버를 실행하면 된다.
하지만 이 과정은 매우 번거롭다.
스프링 부트는 톰캣 서버를 내장하고 있으므로, 톰캣 서버 설치 없이 편리하게 서블릿 코드를 실행할 수 있다.

 

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

@ServletComponentScan

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

다음과 같이 추가하자.

 

hello.servlet.ServletApplication

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);
	}
}

 

서블릿 등록하기

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

 

hello.servlet.basic.HelloServlet

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);

        //헤더 정보
        response.setContentType("text/plain"); //text 타입으로 설정
        response.setCharacterEncoding("utf-8"); //인코딩 언어 설정

        //HTTP 메시지 바디에 들어갈 데이터
        response.getWriter().write("hello " + username);
    }
}

 

  • @WebServlet 서블릿 애노테이션
    • name : 서블릿 이름
    • urlPatterns : URL 매핑

 

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

protected void service(HttpServletRequest request, HttpServletResponse response)

 

  • 웹 브라우저 실행
    • http://localhost:8080/hello?username=world
    • 결과: hello world
  • 콘솔 실행 결과
HelloServlet.service
request = org.apache.catalina.connector.RequestFacade@5e4e72
response = org.apache.catalina.connector.ResponseFacade@37d112b6
username = world

 

주의
IntelliJ 무료 버전을 사용하는데, 서버가 정상 실행되지 않는다면

프로젝트 생성 > IntelliJ Gradle 대신에 자바 직접 실행에 있는 주의 사항을 읽어보자.

 

 

HTTP 요청 메시지 로그로 확인하기

 

다음 설정을 추가해 보자.

logging.level.org.apache.coyote.http11=debug

 

서버를 다시 시작하고, 요청해 보면 서버가 받은 HTTP 요청 메시지를 출력하는 것을 확인할 수 있다.

...o.a.coyote.http11.Http11InputBuffer: Received [GET /hello?username=servlet
HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Cache-Control: max-age=0
sec-ch-ua: "Chromium";v="88", "Google Chrome";v="88", ";Not A Brand";v="99" sec-ch-ua-mobile: ?0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_1) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/ webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Referer: http://localhost:8080/basic.html
Accept-Encoding: gzip, deflate, br
Accept-Language: ko,en-US;q=0.9,en;q=0.8,ko-KR;q=0.7

]

 

참고
운영서버에 이렇게 모든 요청 정보를 다 남기면 성능저하가 발생할 수 있다. 개발 단계에서만 적용하자.

 

 

서블릿 컨테이너 동작 방식 설명

내장 톰캣 서버 생성

 

 

참고
HTTP 응답에서 Content-Length는 웹 애플리케이션 서버가 자동으로 생성해 준다.

 

 

welcome 페이지 추가

지금부터 개발할 내용을 편리하게 참고할 수 있도록 welcome 페이지를 만들어두자.

 

webapp 경로에 index.html을 두면 http://localhost:8080 호출 시 index.html 페이지가 열린다.

 

 

 

main/webapp/index.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<ul>
    <li><a href="basic.html">서블릿 basic</a></li>
</ul>
</body>
</html>

 

main/webapp/basic.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<ul>
    <li>hello 서블릿 <ul>
        <li><a href="/hello?username=servlet">hello 서블릿 호출</a></li>
    </ul>
    </li>
    <li>HttpServletRequest
        <ul>
            <li><a href="/request-header">기본 사용법, Header 조회</a></li>
            <li>HTTP 요청 메시지 바디 조회
                <ul>
                    <li><a href="/request-param?username=hello&age=20">GET -
                        쿼리 파라미터</a></li>
                    <li><a href="/basic/hello-form.html">POST - HTML Form</a></
                    li>
                    <li>HTTP API - MessageBody -> Postman 테스트</li>
                </ul>
            </li>
        </ul>
    </li>
    <li>HttpServletResponse
        <ul>
            <li><a href="/response-header">기본 사용법, Header 조회</a></li>
            <li>HTTP 응답 메시지 바디 조회
                <ul>
                    <li><a href="/response-html">HTML 응답</a></li>
                    <li><a href="/response-json">HTTP API JSON 응답</a></li>
                </ul>
            </li>
        </ul>
    </li>
</ul>
</body>
</html>

 

 

http://localhost:8080/

 

http://localhost:8080/basic.html

 

 


출처 : https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1