Spring Boot & Thymeleaf 시리즈는 김영한 님의 "스프링 MVC 2편 - 백엔드 웹 개발 활용 기술" 강의를 정리한 글입니다. 글에 첨부된 사진은 해당 강의의 강의 자료에서 캡쳐한 것입니다. 제 Github에만 올려뒀다가, 정보 공유와 강의 홍보(?)를 위해 블로그에도 업로드합니다.
마크다운 형식으로 작성한 글을 블로그에 다시 올리는 거라 가독성이 많이 떨어집니다. 조금더 편하게 보시려면 아래의 Github repository에서 보시면 됩니다.
서블릿 등록과 사용 (스프링 부트 환경)
서블릿은 스프링과 관계 없이 등록하고 사용할 수 있다. Tomcat 같은 WAS를 직접 설치하고, 그 위에 서블릿 코드를 클래스 파일로 빌드해서 올린 다음, Tomcat 서버를 실행하면 된다. 하지만 이 과정은 매우 번거롭다. 스프링 부트를 사용하면 내장 Tomcat 서버를 활용해서 편리하게 서블릿 코드를 실행할 수 있다.
Spring Boot 서블릿 환경 구성
@ServletComponentScan
Spring boot는 서블릿을 직접 등록해서 사용할 수 있도록 @ServletComponentScan
을 지원한다. 현재 패키지를 포함한 하위 패키지의 모든 서블릿을 찾아서 등록해준다.
ServletApplication.java
package com.kloong.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);
}
}
서블릿 등록하기
HelloServlet.java
package com.kloong.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"); //Content-Type 헤더 설정
response.setCharacterEncoding("utf-8"); //Content-Type 헤더 설정
response.getWriter().write("Hello " + username); //응답 메시지 바디
}
}
@WebServlet(name = "helloServlet", urlPatterns = "/hello")
- name: 서블릿 이름
- urlPatterns: Mapping 할 URL
- name과 urlPatterns은 다른 서블릿과 중복되어선 안된다.
Mapping해둔 URL로 HTTP 요청이 오면 서블릿 컨테이너는 해당 서블릿의 다음 메소드를 호출한다.protected void service(HttpServletRequest request, HttpServletResponse response)
localhost:8080/hello?username=kloong
요청에 대한 실행 결과는 다음과 같다.
실행 결과 - 콘솔
HelloServlet.service
request = org.apache.catalina.connector.RequestFacade@2b6f38b3
response = org.apache.catalina.connector.ResponseFacade@bf59210
username = kloong
HttpServletRequest
객체와HttpServletResponse
객체를 직접 출력하면 구현체에 대한 정보가 출력된다.HttpServletRequest
와HttpServletResponse
는 자바 진영에서의 표준 인터페이스이다.- 두 인터페이스에 대한 여러 구현체가 있지만, Spring boot에는 Tomcat이 내장되어 있으므로 Tomcat이 사용하는 구현 클래스 정보가 나타나는 것이다.
- 쿼리 파라미터로 보내진
username=kloong
이 잘 출력되는 것을 확인할 수 있다.
실행 결과 - 웹 브라우저
- 웹 브라우저 화면에는
response.getWriter().write("Hello " + username)
에 의해 응답 메시지 바디에 들어간 "Hello kloong"이 그대로 출력된다. - 응답 헤더를 보면
Content-Type
헤더가 의도한 대로 잘 설정된 것을 확인할 수 있다.
참고: HTTP request 메시지 전문을 로그로 확인하기
프로젝트의 application.properties에 다음 설정을 추가하면 된다.
application.properties
logging.level.org.apache.coyote.http11=debug
요청을 보내보면 서버가 받은 HTTP request 메시지 전문이 콘솔에 출력되는 것을 확인할 수 있다. 물론 개발 단계에서 유용하게 쓰이는 것일 뿐, 실제 운영 서버에서 이와 같이 모든 요청 정보를 로깅하면 성능 저하를 발생시킬 수 있다.
서블릿 컨테이너 동작 방식
내장 Tomcat 서버
- Spring boot로 어플리케이션을 실행을 하면 (
ServletApplication
에@SpringBootApplication
annotation이 붙어있는 것을 확인할 수 있다) Spring boot가 내장 Tomcat 서버를 같이 올린다. - Tomcat 서버는 내부에 서블릿 컨테이너를 가지고 있다. 따라서 Tomcat이 실행되면서 서블릿 컨테이너에 서블릿을 생성한다.
HTTP 요청 메시지에 대한 응답
- Tomcat이 HTTP 요청을 기반으로
HttpServletRequest
,HttpServletResponse
객체를 만든다. - 서블릿 컨테이너에 싱글톤으로 생성되어 있는 서블릿의
service
method를 호출하면서, 해당 객체를 파라미터로 넘겨준다. - 서블릿에서 로직을 실행하며 response 객체에 값을 설정해서 응답 메시지를 만든다.
- Tomcat이 response 객체 정보로 HTTP 응답 메시지를 만들어 반환한다.
참고: HTTP 응답에서 Content-Length는 WAS가 자동으로 생성해준다.
참고: Welcome page 추가
앞으로 개발할 기능들을 웹 브라우저에서 편하게 확인할 수 있도록 welcome 페이지를 만들어두자.
프로젝트의 src/main/webapp/
디렉토리에 index.html
과 basic.html
을 추가해두자.
'Spring > Spring MVC' 카테고리의 다른 글
[Spring MVC] 8. HTTP 요청 데이터 - 개요 (0) | 2022.11.23 |
---|---|
[Spring MVC] 7. HttpServletRequest (0) | 2022.11.23 |
[Spring MVC] 5. Java 진영 Web 기술의 역사 (0) | 2022.11.23 |
[Spring MVC] 4. HTML, HTTP, API, CSR, SSR (1) | 2022.11.23 |
[Spring MVC] 3. Servlet Container와 멀티 쓰레드 (0) | 2022.11.23 |
댓글