목차
서론
첫 서블릿을 만들어봅시다.
서블릿을 실행하기 위해서는
- 톰캣과 같은 WAS를 직접 설치
- WAS에 서블릿 코드를 클래스 파일로 빌드한 후 업로드
- 톰캣 서버 실행
과정을 거쳐야 합니다. 이 과정은 너무 번거롭고 불필요합니다.
스프링 부트는 톰캣 서버를 내장하고 있으므로 톰캣 서버의 설치없이 서블릿 코드를 실행할 수 있습니다. 따라서 현재 예제에서는 스프링 부트를 사용하여 구현합니다.
스프링 부트 서블릿 환경 구성
@ServletComponentScan
스프링 부트는 서블릿을 직접 등록해서 사용할 수 있도록 @ServletComponentScan 어노테이션을 지원합니다.
@ServletComponentScan
@SpringBootApplication
public class ServletApplication {
public static void main(String[] args) {
SpringApplication.run(ServletApplication.class, args);
}
}
서블릿 등록하기
처음으로 실제 동작하는 서블릿 코드를 작성해봅시다.
hello.servlet.basic.HelloServlet
@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("reqeust = " + request);
System.out.println("response = " + response);
//요청
String username = request.getParameter("username");
System.out.println("useranme = " + username);
//응답
response.setContentType("text/plain"); //헤더
response.setCharacterEncoding("utf-8"); //헤더
response.getWriter().write("hello " + username); //바디
}
}
- @WebServlet
- name은 서블릿의 이름을 나타냅니다.
- urlPatterns는 URL 매핑을 의미합니다. HTTP 요청을 통해 매핑된 URL이 호출되면 서블릿 컨테이너는 다음 메서드를 실행합니다.
protected void service(HttpServletRequest request, HttpServletResponse response)
실행
http://localhost:8080/hello?username=주희
출력
HelloServlet.service
reqeust = org.apache.catalina.connector.RequestFacade@2619651b
response = org.apache.catalina.connector.ResponseFacade@5166a599
useranme = 주희
서블릿 컨테이너 동작 방식
- 내장 톰캣 서버 생성
- 톰캣 서버는 서블릿 컨테이너를 가지고 있습니다.
- 서블릿 컨테이너를 통해 서블릿을 생성하고 관리합니다.
웹 애플리케이션 서버의 요청 응답 구조
WAS가 request와 response 객체를 만들어줍니다.
참고
HTTP 응답의 Content-Length 헤더는 WAS가 자동으로 생성해줍니다.
HTTP 요청, HTTP 응답 메시지
참고) HTTP 요청을 메시지 로그로 확인하기
다음 설정을 추가합니다.
application.properties
logging.level.org.apache.coyote.http11=debug
서버를 다시 시작한 후, 요청을 보내면 서버가 받은 HTTP 요청 메시지를 출력하는 것을 확인할 수 있습니다.
Host: localhost:8080
Connection: keep-alive
Cache-Control: max-age=0
sec-ch-ua: "Not/A)Brand";v="99", "Google Chrome";v="115", "Chromium";v="115"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 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.7
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
]
HelloServlet.service
reqeust = org.apache.catalina.connector.RequestFacade@625623c0
response = org.apache.catalina.connector.ResponseFacade@12ce4ca8
useranme = 주희
참고
운영 서버에 이렇게 모든 요청 정보를 다 남기면 성능 저하가 발생할 수 있으므로, 개발 단계에서만 적용합시다.
다음 글에서 Servlet이 제공하는 HttpServletRequest와 HttpServletResponse에 대해 알아보도록 하겠습니다.
https://wngml56.tistory.com/236
출처
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard
'Backend > Spring | SpringBoot' 카테고리의 다른 글
[Servlet] 회원관리 웹 애플리케이션 만들기1 (+JSP, MVC 패턴) (0) | 2023.08.17 |
---|---|
[Servlet] HttpServletRequest, HttpServletResponse (0) | 2023.08.17 |
[Servlet] 서블릿과 WAS의 역할, 멀티 스레드 (0) | 2023.08.03 |
[Spring] 웹 서버, 웹 애플리케이션 서버, 웹 시스템 구성 (0) | 2023.08.03 |
[Spring] 스프링 예제 - 주문과 할인2 (SRP, OCP, DIP 적용) (0) | 2023.07.28 |