2. 서블릿
서블릿
: 클라이언트의 요청을 처리하고, 그 결과를 반환하는 Servlet 클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술
- SpringBoot는 톰캣 서버를 내장하고 있으므로, 톰캣 서버 설치없이 편리하게 서블릿 코드를 실행할 수 있음
1) SpringBoot 서블릿 환경 구성
- @ServletComponentScan
- 스프링이 자동으로 내 패키지를 포함한 모든 하위 패키지에 있는 서블릿을 찾아 자동으로 등록해주기 위해 @ServletComponentScan 어노테이션 추가
2) 서블릿 등록하기
- @WebServlet
- 서블릿으로 등록하기 위해서 어노테이션 추가
- name : 서블릿 이름, urlPatterns : URL 매핑
- /{urlPatterns}가 호출 -> 서블릿 컨테이너는 해당 메소드를 실행
- HTTP 요청을 통해 매핑된 URL이 호출되면 서블릿 컨테이너는 해당하는 메소드를 실행
- HttpRequest, HttpServletResponse는 인터페이스
- WAS 서버들이 Servlet 표준 스펙을 구현하는 것 -> 구현체 존재
- getParameter : 쿼리 파라미터를 받아옴
- getWriter().write() : HTTP 메시지 Body
3) 동작 과정
- SpringBoot를 실행하면 내장 톰캣 서버를 띄워줌
- 서블릿 컨테이너를 통해 서블릿을 생성
- 웹 브라우저가 HTTP 요청, 응답 메시지를 서버 측에 던져줌
- 서버는 Request, Response 객체를 만들어서 helloServlet을 호출
- 서비스 메소드를 호출하면서 Request, Response를 덩져줌
- 서블릿이 종료되고 나가면서 WAS 서버가 Response 정보를 가지고 HTTP 메시지를 만들어서 반환
- 웹 브라우저에서 볼 수 있음
HttpServletRequest
: HTTP 요청 메시지를 개발자 대신 파싱하여 HttpServletRequest 객체에 담아 제공
POST /save HTTP/1.1
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded
username=kim&age=20
- StartLine : HTTP 메소드, URL, 쿼리 스트링, 스키마, 프로토콜
- Header : 헤더 조회
- Body : form 파라미터 형식 조회, message body 데이터 직접 조회
- 부가적인 기능
- 임시 저장소 기능 : 해당 Http 요청이 시작부터 끝날 때까지 유지되는 임시 저장소 기능
- 저장 : request.setAttribute(name, value)
- 조회 : request.getAttribute(name)
- 세션 관리 기능
- request.getSession(create : true)
HTTP 요청 데이터
- HTTP 요청 메시지를 통해 클라이언트에서 서버로 데이터를 전달하는 방법은 3가지가 존재
- GET - 쿼리 파라미터
- /url?username=hello&age=20
- 바디없이 URL의 쿼리 파라미터에 데이터를 포함해 전달
- EX) 검색, 필터, 페이징
- POST - HTML Form
- 메시지 바디에 쿼리 파라미터 형식으로 전달
- content-type : application/x-www-form-urlencoded
- EX) 회원가입, 상품 주문, HTML Form
- HTTP Message Body
- HTTP API에서 주로 사용 -> JSON, XML, TEXT
- 데이터 형식은 주로 JSON
- POST, PUT, PATCH
1. GET 쿼리 파라미터
: 메시지 바디없이 URL의 쿼리 파라미터를 사용하여 데이터를 전달하는 방식
- ?를 시작으로 보낼 수 있음
- 추가 파라미터는 &를 통해 구분
- request.getParameter()을 통해 파라미터 값을 조회할 수 있음
2. POST HTML Form
: Form을 통해 클라이언트에서 서버로 데이터를 전달
- HTML Form을 통해서 데이터를 쿼리 파라미터 형식으로 전달
- application/x-www-form-urlencoded 형식은 GET 쿼리 파라미터 형식과 같아 쿼리 파라미터 조회 메소드를 그대로 사용할 수 있음
- request.getParameter()는 GET URL 쿼리 파라미터, POST HTML Form 둘 다 지원
cf)
- content-type은 HTTP 메시지 바디의 데이터 형식을 지정
- GET URL 쿼리 파라미터 형식은 HTTP 메시지 바디를 사용하지 않기 때문에 content-type이 없음
- POST HTML Form형식은 HTTP 메시지 바디에 해당 데이터를 포함하여 보내기 때문에 content-type을 지정해줘야 함
=> Form으로 데이터를 전송하는 형식을 application/x-www-form-urlencoded라고 함
3. API 바디 메시지
: HTTP Message Body에 데이터를 직접 담아서 요청
- 데이터 형식은 주로 JSON
HttpServletResponse
- 역할
- HTTP 응답 메시지 생성 : HTTP 응답 코드 지정, 헤더 생성, 바디 생성
- 편의 기능 제공 : content-type, 쿠키, Redirect
@WebServlet(name = "responseHeaderServlet", urlPatterns = "/response-header")
public class ResponseHeaderServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletExcetption, IOException {
//[status-line]
response.setStatus(HttpServletResponse.SC_OK); // http 응답코드 200
//[response-headers]
response.setHeader("Content-Type","text/plain;charset=utf-8");
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
response.setHeader("Pragma", "no-cache");
response.setHeader("my-header","hello");
//[message body]
PrintWriter writer = response.getWriter();
writer.println("ok");
}
}