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);
    }
}