CS 정리/Spring MVC
서블릿
tose33
2023. 11. 17. 21:33
- WAS 는 Request, Response 객체 새로 만들어서 서블릿 객체 호출
- 개발자는 Request 객체에서 http 요청 정보를 편리하게 꺼내 사용
- 개발자는 Response 객체에 응답 HTTP 정보를 편리하게 입력
- WAS 는 Response 에 담겨있는 내용으로 HTTP 응답 생성
서블릿 컨테이너
- 톰캣처럼 서블릿 지원하는 WAS를 서블릿 컨테이너라고 함
- 서블릿 컨테이너가 서블릿 객체 생성, 호출, 관리
- 서블릿 객체는 싱글톤으로 관리
- Request, Response 는 새로 생성
- 동시 요청을 위한 멀티 쓰레드 처리 지원
쓰레드
- 애플리케이션 코드를 하나하나 순차적으로 실행하는 것이 쓰레드
- 쓰레드는 생성 비용이 비싸므로 쓰레드 풀 만들어 놓고 사용함
HttpRequest
API 메시지 바디 - JSON
잭슨 라이브러리 사용해서 클라이언트에서 보낸 JSON 을 객체로 매핑한다
import lombok.Getter;
import lombok.Setter;
@Getter @Setter
public class HelloData {
private String username;
private int age;
}
위의 HelloData 객체에 setter, getter 가 있으면 잭슨 라이브러리로 JSON 을 매핑 할수 있다.
@WebServlet(name="requestBodyJsonServlet", urlPatterns = "/request-body-json")
public class RequestBodyJsonServlet extends HttpServlet {
private ObjectMapper objectMapper = new ObjectMapper();
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletInputStream inputStream = request.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream,
StandardCharsets.UTF_8);
System.out.println("messageBody = " + messageBody);
HelloData helloData = objectMapper.readValue(messageBody, HelloData.class);
System.out.println("helloData.username = " + helloData.getUsername());
System.out.println("helloData.age = " + helloData.getAge());
response.getWriter().write("ok");
}
}
ObjectMapper 사용해서 클라이언트에서 보낸 JSON 을 객체로 매핑한다.
HttpResponse
@WebServlet(name="responseHeaderServlet", urlPatterns = "/response-header")
public class ResponseHeaderServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// [status-line]
resp.setStatus(HttpServletResponse.SC_OK);
// [response-headers]
resp.setHeader("Content-Type", "text/plain;charset=utf-8");
resp.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
resp.setHeader("Pragma", "no-cache");
resp.setHeader("my-header", "hello");
// header 편의 메서드
resp.setContentType("text/plain");
resp.setCharacterEncoding("utf-8");
cookie(resp);
PrintWriter writer = resp.getWriter();
writer.println("ok");
}
private void cookie(HttpServletResponse response) {
Cookie cookie = new Cookie("myCookie", "good");
cookie.setMaxAge(600);
response.addCookie(cookie);
}
private void redirect(HttpServletResponse response) throws IOException {
// Status Code 302
// Location: /basic/hello-form.html
// response.setStatus(HttpServletResponse.SC_FOUND); // 302
// response.setHeader("Location", "/basic/hello-form.html");
response.sendRedirect("/basic/hello-form.html");
}
}
header 편의 메서드
쿠키
리다이렉트
ObjectMapper 로 객체->JSON 변환 후 response 로 클라이언트로 보내기
@WebServlet(name = "responseJsonServlet", value = "/response-json")
public class ResponseJsonServlet extends HttpServlet {
private ObjectMapper objectMapper = new ObjectMapper();
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("application/json");
resp.setCharacterEncoding("utf-8");
HelloData helloData = new HelloData();
helloData.setAge(20);
helloData.setUsername("kim");
// {"username":"kim", "age":"20"}
String result = objectMapper.writeValueAsString(helloData);
resp.getWriter().write(result);
}
}