서블릿

최주영·2024년 2월 2일
0
post-thumbnail

@ServletComponentScan
-> 내 패키지를 포함해서 하위 패키지의 서블릿을 다 찾아서 자동으로 서블릿 등록 후 실행할 수 있게 해줌

@WebServlet : 서블릿 어노테이션

  • name : 서블릿 이름
  • urlPatterns : URL 매핑
    💡 name, urlPatterns 는 중복되면 안됨
  • HTTP 요청을 통해 매핑된 URL이 호출되면서 서블릿 컨테이너는 다음 메서드를 실행
 protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}

  • 스프링 부트를 키면 내장 톰캣 서버를 띄어줌
  • 톰캣 서버는 내부에 서블릿 컨테이너 기능을 통해서 서블릿을 생성함
  • http 요청 메세지를 날림
  • http 요청 메시지를 기반으로 request, response 객체를 생성해서 싱글톤 서블릿을 호출
  • 싱글톤 서블릿의 서비스 메소드를 호출하면서 request, response 를 넘겨줌
  • Request 객체에서 Http 요청 정보 꺼내고
  • Response 객체에서 Http 응답 정보를 저장해서 클라이언트에 반환을 해줌

HttpServletRequest

  • HTTP 요청메시지를 개발자가 직접 파싱하지 않고, 편리하게 사용할 수 있도록
    개발자 대신에 HTTP 요청 메시지를 파싱하는 역할을 함

HttpServletRequest 의 임시 저장소 기능

  • 해당 HTTP 요청이 시작부터 끝날 때 까지 유지되는 임시 저장소 기능
  • 저장 : request.setAttribute(name, value) // 키, 값으로 저장
  • 조회 : request.getAttribute(name) // 키로 갖고오기
  • 세션관리 기능 : request.getSession(create: true)

✅ HTTP 요청 데이터

    1. GET 방식 - 쿼리 파라미터
      - 메시지 바디 없이, URL의 쿼리 파라미터에 데이터를 포함해서 전달하는 방식
    • ex) ?username=hello&age=20
    • 키 : username 값 : hello
    • 검색, 필터, 페이징 등에서 사용됨
@WebServlet(name="requestParamServlet",urlPatterns = "/request-param")
public class RequestParamServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Enumeration<String> parameterNames =  request.getParameterNames(); // 모든 요청 파라미터들을 꺼낼 수 있음

        request.getParameterNames().asIterator() // 모든 요청 파라미터들을 꺼낼 수 있음
                .forEachRemaining(paraName -> System.out.println(paraName + "=" + request.getParameter(paraName)));


        String username = request.getParameter("username"); // 단일 파라미터 조회
        String age = request.getParameter("age"); // 단일 파라미터 조회

        String[] usernames = request.getParameterValues(("username"));  // 동일한 이름의 여러개 파라미터 조회
        for(String name : usernames){
            System.out.println(name);
        }

        response.setContentType("text/plain"); // 컨텐츠 타입 지정(브라우저가 문서의 형식을 자의적으로 해석)
        response.setCharacterEncoding("utf-8"); // 문자세트의 인코딩 정보 (한글이 깨지기 때문에)
        // 위 두개는 컨텐트 타입 헤더 정보에 들어감
        response.getWriter().write("ok");
        // getWriter은  컨텐트 타입 메시지 정보에 데이터가 들어감
    }
}
    1. POST 방식
      - 메시지 바디에 쿼리 파라미터 형식으로 정달
    • 회원가입, 상품 주문, HTML Form에 사용됨
        <form action="/request-param" method="post">
            username: <input type="text" name="username"/>
            age: <input type="text" name="age"/>
            <button type="submit">전송</button>
        </form>

💡 클라이언트(웹 브라우저) 입장에서는 GET, POST 방식이 각각 차이가 있지만
서버 입장에서는 둘의 형식이 동일함
-> request.getParameter() 로 GET의 URL 쿼리 파라미터, POST의 HTML Form 방식 둘 다 조회 가능

    1. HTTP message body에 데이터를 직접 담아서 요청
      * HTTP API에서 주로 사용 (JSON, XML, TEXT)
    • POST, PUT, PATCH

HttpServletResponse

  • HTTP 응답코드 지정 ex) 200,400,404 등등
  • 헤더 생성 및 바디 생성
  • Content-Type, 쿠키, Redirect 설정 가능
@WebServlet(name = "responseHeaderServlet", urlPatterns = "/response-header")
public class ResponseHeaderServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        // STATUS-LINE
        response.setStatus(HttpServletResponse.SC_OK);

        // response-headers
        response.setHeader("Content-Type","text/plain;charset-utf-8"); 
        // = response.setContentType("text/plain");
        // = response.setCharacterEncoding("utf-8");
        
        response.setHeader("Cache-Control","no-cache, no-store, must-revalidate"); // 캐시없애는 명령어
        response.setHeader("Pragma","no-cache"); // 캐시없애는 명령어
        response.setHeader("my-header","hello");

        PrintWriter writer = response.getWriter();
        writer.print("안녕");
    }
}


✅ HTTP 응답 데이터

  • 단순 텍스트 응답
  • HTML 응답 -> Content Type 유의
@WebServlet(name = "responseHtmlServlet",urlPatterns = "/response-html")
public class ResponseHtmlServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // Content-Type : text/html;charset=utf-8
        // 서블릿에서 html을 렌더링하는 방법 (직접 작성), content-type을 'text/html'로 지정해야함
            response.setContentType("text/html");
            response.setCharacterEncoding("utf-8");
        
        PrintWriter writer = response.getWriter(); 
        writer.println("<html>");
        writer.println("<body>");
        writer.println("<div>hi</div>");  // 태그 붙은것들은 HTML 응답
        writer.print("안녕");  // 단순 텍스트 응답
        writer.println("</body>");
        writer.println("</html>");
    }
}
  • HTTP API - JSON 응답 -> Content Type 유의
@WebServlet(name = "responseJsonServlet",urlPatterns = "/response-json")
public class ResponseJsonServlet extends HttpServlet {
    private ObjectMapper objectMapper = new ObjectMapper();

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // Content-Type: application/json
        response.setContentType("application/json");
        response.setCharacterEncoding("utf-8");

        HelloData helloData = new HelloData();
        helloData.setUsername("kim");
        helloData.setAge(20);

        String result =  objectMapper.writeValueAsString(helloData); // 자바객체를 JSON 형식으로 변환
        response.getWriter().write(result);
    }
}	 
profile
우측 상단 햇님모양 클릭하셔서 무조건 야간모드로 봐주세요!!

0개의 댓글