Spring/SpringMVC

Hello 서블릿

느리지만 꾸준하게 2022. 4. 21. 18:13

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

 

  • 서블릿은 톰캣 같은 웹 애플리케이션 서버를 직접 설치해서 서블릿 코드를 클래스 파일로 빌드해서 올리고 톰캣 서버를 실행하면되지만 매우 번거롭다.
  • 스프링 부트는 톰캣 서버를 내장하고 있어서 톰캣 서버 설치 없이 편리하게 서블릿 코드를 실행 할 수 있다.

코드를 작성해보자. ServletApplication에서는 

@ServletComponentScan // 서블릿 자동 등록

을 넣어주고

package hello.setvlet;

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


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

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

}

 

basic 패키지를 만들어준 다음 HelloServlet를 넣어준다.

package hello.setvlet.basic;


import javax.servlet.annotation.WebServlet;

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

 

ctrl o를 누른 다음  Select Methods to Override/implement에서

자물쇠 잠겨있는 거를 선택하자.

 

HelloServlet를 다 작성한 다음 돌려주고 localhost 8080에서 /hello를 넣어서 확인하면 오류가 없는 빈화면이 나온다.

package hello.setvlet.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 req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("HelloServlet.service");
    }
}

실행창에서 로그를 확인하면 HelloServlet.service를 확인 할 수 있다.

 

 

request와 response를 작성을하고 http://localhost:8080/hello에 들어가서 출력로그를 확인해주면

아래와 같이 뜨게 된다.

package hello.setvlet.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 {

    // was가 request response 만들어서 servletdㅔ 던져준다.
    @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);

    }
}
HelloServlet.service
request = org.apache.catalina.connector.RequestFacade@56c59598
response = org.apache.catalina.connector.ResponseFacade@6acbd9a2

 

 

 

여기서 HttpServletRequest HttpServletResponse 둘 다 interface이다.

protected void service(HttpServletRequest request, HttpServletResponse response)
HttpServletRequest
public interface HttpServletRequest extends ServletRequest {
HttpServletResponse
public interface HttpServletResponse extends ServletResponse {

 

 

쿼리 파라미터를 넣어보자(http://localhost:8080/hello?username=kim )

작성해서 다시 돌려주면

package hello.setvlet.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 {

    // was가 request response 만들어서 servletdㅔ 던져준다.
    @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);

    }
}

username이 잘 출력이 된다.

HelloServlet.service
request = org.apache.catalina.connector.RequestFacade@60f419db
response = org.apache.catalina.connector.ResponseFacade@2613a838
username = kim

 

 

 

응답 메세지를 한 번 보내보자.

package hello.setvlet.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 {

    // was가 request response 만들어서 servletdㅔ 던져준다.
    @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);

        // content type header 정보에 들어간다.
        response.setContentType("text/plain");
        response.setCharacterEncoding("utf-8");
        // write라고하면 http mssage body에 들어간다,
        response.getWriter().write("hello " + username);

    }
}

 

실행을 시키고 개발자 도구를 확인해보자.

Response Headers를 확인해주자.(Request Headers는 Browser이 보내는 작업이다.)

Content-Type은 utf-8

 

 

`@WebServlet` 서블릿 애노테이션

아래 두개는 중복이 있으면 안된다.

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

 

application.properties에서 아래 코드를 작성하고 재시작해서 요청을 해보면  

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

로그에 utf-8로 인코딩된 정보가 나오게 되고

2022-04-21 18:03:15.857 DEBUG 28348 --- [nio-8080-exec-2] o.a.coyote.http11.Http11InputBuffer      : Received [GET /hello?username=%EA%B9%80 HTTP/1.1

 

헤더 정보들이 나오게 된다.

Host: localhost:8080
Connection: keep-alive
Cache-Control: max-age=0
sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="100", "Google Chrome";v="100"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "macOS"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.88 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: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Accept-Language: en,ko;q=0.9,ko-KR;q=0.8,en-US;q=0.7

 

  • 운영서버에 모든 요청 정보를 다 남기면 성능저하가 발생하게 된다. 개발 단계에서만 적용하자.

 

 

 

 

 

 

 

 

 

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

 

welcome 페이지도 만들어주자.

index.html과 basic.html을 차례대로 만들어주자.

<!-- 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>
<!-- 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>
                <li><a href="/basic/hello-form.html">POST - HTML Form</a></
                <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>

localhost:8080으로 그냥 들어가서 확인해주고 앞으로 공부할 여러 항목들이 나오게 된다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

<출처 김영한: 스프링 MVC 1편 - 벡앤드 웹 개발 핵심 기술>

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

 

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의

웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., -

www.inflearn.com

 

'Spring > SpringMVC' 카테고리의 다른 글

HTTP 요청 데이터 - 개요  (0) 2022.04.21
HttpServletRequest - 기본 사용법  (0) 2022.04.21
HttpServletRequest - 개요  (0) 2022.04.21
서블릿 - 프로젝트 생성  (0) 2022.04.21
자바 백엔드 웹 기술 역사  (0) 2022.04.21