Spring Boot & Thymeleaf 시리즈는 김영한 님의 "스프링 MVC 2편 - 백엔드 웹 개발 활용 기술" 강의를 정리한 글입니다. 글에 첨부된 사진은 해당 강의의 강의 자료에서 캡쳐한 것입니다. 제 Github에만 올려뒀다가, 정보 공유와 강의 홍보(?)를 위해 블로그에도 업로드합니다.
스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 - 인프런 | 강의
웹 애플리케이션 개발에 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. MVC 2편에서는 MVC 1편의 핵심 원리와 구조 위에 실무 웹 개발에 필요한 모든 활용 기술들을 학습할 수 있
www.inflearn.com
마크다운 형식으로 작성한 글을 블로그에 다시 올리는 거라 가독성이 많이 떨어집니다. 조금더 편하게 보시려면 아래의 Github repository에서 보시면 됩니다.
GitHub - Kloong1/TIL: Today I Learned.
Today I Learned. Contribute to Kloong1/TIL development by creating an account on GitHub.
github.com
서블릿 등록과 사용 (스프링 부트 환경)
서블릿은 스프링과 관계 없이 등록하고 사용할 수 있다. 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 |
댓글