| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
- 서블릿 컨테이너
- Web
- @Transactional
- AWS
- redis
- dockerhub
- @ComponentScan
- DLQ
- JPQL
- 스프링 부트
- mybatis
- DI
- docker compose
- Spring Container
- 지연 로딩
- JWT
- JdbcTemplate
- Dead Letter Queue
- securitycontextholderfilter
- Spring Data JPA
- Spring
- kafka
- 컨테이너
- 페이징
- MSA
- 쿠버네티스
- Routing Key
- JPA
- CORS
- docker
- Today
- Total
look-forest
Servlet을 이용한 웹 개발 본문
예전엔 Servlet을 이용해 웹 개발을 했었다.
앞서 보았듯, Servlet은 Http 스펙을 편리하게 사용하게 해준다. 개발자는 비즈니스 로직만 구현하면 된다.
(하지만 개발자의 욕심은 끝이 없어, 지금은 더 편리한 MVC 프레임워크을 사용하고 있다)
이번 시간에는 고대의 웹 개발 방식, Servlet을 이용한 웹 개발에 대해서 알아보자.
서블릿 등록 및 사용
서블릿 등록 (in Springboot)
스프링 부트는 서블릿을 직접 등록해서 사용할 수 있도록 @ServletComponentScan을 지원한다.

서블릿 코드 등록
- 서블릿은 HttpServlet를 상속받아야 한다.
- @WebServlet ▶서블릿 애노테이션
(name: 서블릿 이름 urlPatterns: URL 매핑)
- HTTP 요청을 통해 매핑된 URL이 호출되면 서블릿 컨테이너는 service 메서드를 실행한다.
@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
//WAS가 reqeust, response 객체를 만들고 서블릿을 호출.서블릿이 호출되면 service 메소드가 호출된다
@Override
protected void service(HttpServletRequest reqeust, HttpServletResponse response) throws ServletException, IOException {
//WAS 별 서블릿 표준 스펙의 구현체
System.out.println("reqeust = " + reqeust);
System.out.println("response = " + response);
//서블릿은 HTTP 쿼리 파라미터를 쉽게 읽도록 지원
String username = reqeust.getParameter("username");
System.out.println("username = " + username);
response.setContentType("text/plain"); //header 정보
response.setCharacterEncoding("utf-8");
response.getWriter().write("hello "+username);//http message body에 data가 들어감
}
}
서블릿 컨테이너의 동작 방식
내장 톰캣 서버 → 서블릿 컨테이너 생성
스프링 부트가 실행될 때 내장 톰캣 서버를 띄우고, 톰캣은 서블릿 컨테이너에 서블릿 객체를 생성해둔다.

웹 애플리케이션 서버의 요청 응답 구조
WAS가 HTTP Request, Response 객체를 생성해 서블릿에게 던져준다.
서블릿은 그 객체를 이용해 HTTP 스펙을 편리하게 이용한다.

HttpServletRequest, HttpServletResponse
서블릿이 HTTP 요청 메시지, HTTP 응답 메시지를 편리하게 사용하도록 도와주는 객체
WAS가 이 표준 인터페이스를 구현해서 서블릿에게 전달한다.
개발자가 직접 HTTP 요청 메시지를 파싱하거나 응답 메시지를 생성하는 불편을 해소해준다.
HttpServletRequest 역할
1. HTTP 요청 메시지를 파싱한 결과를 HttpServletRequest 객체에 담아서 제공
- Start line - ex) request.getMethod(), request.getRequestURL()
- Header - ex) request.getContentType(), request.getCookies()
- Body - ex) request.getParameter(), request.getInputStream()
※ HTTP 요청 메시지를 통해 데이터를 전달하는 3가지 방법
메시지 바디 없이, URL의 쿼리 파라미터에 데이터를 포함해서 전달 (content-type이 없다)
2. POST - HTML Form
메시지 바디에 쿼리 파리미터 형식으로 전달 (username=hello&age=20)
content-type: application/x-www-form-urlencoded
▷ 1,2번은 서버 입장에서는 형식이 같기 때문에, 둘 다 request.getParameter()로 조회한다
3. HTTP message body에 데이터를 직접 담아서 요청 (브라우저가 해주는 것이 아님)
HTTP API에서 주로 사용, 데이터 형식은 주로 JSON 사용
▷HTTP 메시지 바디의 데이터를 request.getInputStream()을 사용해서 직접 읽을 수 있다.
읽은 바이트코드를 문자열로 변환 후, JSON 형식이라면 파싱해서 객체를 만들면 된다.
2. 해당 HTTP 요청이 시작부터 끝날 때까지 유지되는 임시 저장소 기능
- 저장: request.setAttribute(name, value)
- 조회: request.getAttribute(name)
3. 세션 관리 기능
- request.getSession(create: true)
HttpServletResponse 역할
1. HTTP 응답 메시지 생성
- status-line - ex) response.setStatus()
- header - response.setHeader()
- body - response.getWriter().write() //문자열이든 HTML이든 JSON이든 다 문자열로 보낸다. Content-type으로 해석
2. 편의 기능 제공
편의 메서드 ex) response.setContentType(), response.sendRedirect(), response.addCookie()
참고 자료 & 이미지 출처
스프링 MVC 1편(김영한 님)
'Spring > Spring MVC - 웹 개발 핵심 기술' 카테고리의 다른 글
| 스프링 MVC 기본 기능 - 요청 (0) | 2023.05.07 |
|---|---|
| Spring MVC 구조 이해 (0) | 2023.05.01 |
| MVC 프레임워크 만들기 (0) | 2023.04.28 |
| Java 웹 개발 변천사: Servlet → JSP → MVC 패턴 (0) | 2021.06.24 |
| Servlet과 멀티스레딩 (0) | 2021.05.31 |