[Spring Boot] 4. Servlet

김주희's avatar
Mar 17, 2025
[Spring Boot] 4. Servlet
필기
cookie 이것도 프로토콜이므로 앱에서는 X 내가 설정해줘야됨 서버가 클라이언트 측에 데이터 저장하도록 할 수 있게 함
get : 뭔가를 찾아줘
주소에 붙이는 데이터 = db sql문의 where에 걸린다. queryString = 구체적 질의를 하기 위해서 필요
client가 준 정보 req로 접근하면 알 수 있음
x-www ~ : 파싱 내가 먼저 key=value형태로 해줄게 key=value형태는 req.getParameter()로 전부 pasing 가능
jsp = 템플릿 엔진 자바코드를 섞어서 쓸 수있다 <% %> 안에 자바코드
아파치가 이해못하는 파일 톰캣에게 home.jsp를 서블릿 파일(homeservlet.java)로 변경
home.jsp로 요청이 오면 톰캣이 내부적으로 HomeServlet.java를 만듦(눈에는 안보이지만)
<%=name%>에서 =는 출력하라는 의미
 
302(redirection)는 req,resp 두 개 만듦
dispatcherS가 공통로직 처리하고 jsp 처리
mvc 패턴 req,resp 새로 만드는게 아니라 forward로 전달 단점)hello.do?path=a 말고도 /a.jsp가 됨-> 공통 로직 실행X -> 강제성이 없음 ->webapp이 바깥에 공개되어있어서 => 회사마다 비공개 처리 방식이 다름 =>Spring이 해결
 
 
@restController printWriter로 응답 @controller -> requestDispatcher => spring

0. 프로젝트 생성

notion image

1. Servlet?

  1. 클라이언트가 URL, Body, Header와 함께 요청하면 웹 서버에서 처리 불가능할 경우 Tomcat과 같은 WAS에게 위임하게 된다.
  1. WAS는 request와 response 객체를 만든다.
    1. request 객체와 response 객체는 각각 입출력 버퍼에 접근 가능하다 (request - BR / response - BW)
  1. Servlet에서는 WAS로부터 전달받은 request 객체와 response 객체로 요청받은 request를 분석해서(parsing) 그에 대한 로직을 처리하여 응답을 돌려주게 된다.
 
notion image

2. response로 http 프로토콜 맛보기?@@@제목머라고해ㅐㅐㅐㅐ

1. Servlet 생성

  1. servlet class를 만든 후 그 클래스가 HttpServlet 클래스를 상속하도록 한다.
  1. @WebServlet을 지정해준다.
    1. @WebServlet → 패키지를 스캔해서 @WebServlet을 가지고 있는 클래스를 찾아서 괄호 안의 주소를 스캔한다.
  1. HttpServlet의 메서드를 override한다 ⇒ doGet, doPost, doPut, doDelete 메서드 생성
    1. notion image
 

2. GET

  1. @WebServlet 괄호 안의 주소로 GET 요청 시 deGet 메서드가 실행된다.
  1. HttpServletResponse 객체인 resp는 getWriter()를 통해 응답 버퍼에 접근한다. 이때 getWriter()의 return 타입이 PrintWriter이므로 auto flush가 적용되어 있다.
  1. response의 body에 <html><body><h1>doGet</h1></body></html> 담는다.
  1. 이 데이터는 직렬화되어 브라우저로 전달되기 때문에 브라우저에서 html 형태로 역직렬화 할 수 있도록 Content-Type을 header에 담아서 알려줘야 한다.
    1. 이때 Content-Type과 text/html은 대소문자와 형태를 정확하게 작성해야 한다. (MIME Type)
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("doGet"); // header resp.setHeader("Content-Type", "text/html"); // 응답 버퍼에 접근하는 함수 getWriter() PrintWriter out = resp.getWriter(); // auto flush 적용되어 있음. // body out.print("<html>"); out.print("<body>"); out.print("<h1>doGet</h1>"); out.print("</body>"); out.println("</html>"); // 마지막에 한번만 \n 담아서 보내줘야 된다. 다 읽으니까 }
 
  • Content-Type가 text/plain일 경우
    • notion image
  • Content-Type가 text/html일 경우
     
     

    3. POST

    1. @WebServlet 괄호 안의 주소로 POST 요청 시 dePost 메서드가 실행된다.
    1. 응답의 http 상태 코드를 201로 지정한다.
    @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("doPost"); resp.setStatus(201); // http 상태코드 }

    4. PUT

    1. @WebServlet 괄호 안의 주소로 PUT 요청 시 doPut 메서드가 실행된다.
    1. Cookie
      1. 서버에서 생성해서 클라이언트 측으로 전달되어 저장되는 데이터 (다시 서버 측으로 요청 시 쿠키를 포함하게 된다.)
      2. resp.setHeader(”Set-Cookie”,”c03=apple;c04=banana”) 방식도 가능하다.
      3. 웹 http 프로토콜이므로 앱에서는 쿠키를 직접 설정해줘야 한다.
    @Override protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("doPut"); Cookie cookie = new Cookie("c03", "apple"); Cookie cookie2 = new Cookie("c04", "banana"); resp.addCookie(cookie); resp.addCookie(cookie2); // Set-Cookie : c03=apple;c04=banana }
     

    5. DELETE

    1. @WebServlet 괄호 안의 주소로 DELETE 요청 시 doDelete 메서드가 실행된다.
    1. 클라이언트는 302 http 상태 코드를 서버로부터 응답 받을 경우 Location 헤더에 포함된 URL 주소로 다시 http 요청을 보내고 응답을 받게 된다. (요청-응답-다시 요청-응답으로 WAS에서 resp와 req 객체를 두 개씩 만들게 된다.)
    @Override protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("doDelete"); resp.setStatus(302); // 해당 Location으로 이동해 // 1. header에 redirection될 주소를 써줘야됨(key = Location) resp.setHeader("Location", "http://www.naver.com"); }
     

    전체 코드

    package org.example.demo1; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.Cookie; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; // 어떤 서블릿 선택할지 깃발 // 이 패키지 스캔해서 깃발 찾고 주소를 scan @WebServlet("*.do") public class DemoServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("doGet"); // header resp.setHeader("Content-Type", "text/html"); // 응답 버퍼에 접근하는 함수 getWriter() PrintWriter out = resp.getWriter(); // auto flush 적용되어 있음. // body out.print("<html>"); out.print("<body>"); out.print("<h1>doGet</h1>"); out.print("</body>"); out.println("</html>"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("doPost"); resp.setStatus(201); // http 상태코드 } @Override protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("doPut"); Cookie cookie = new Cookie("c03", "apple"); Cookie cookie2 = new Cookie("c04", "banana"); resp.addCookie(cookie); resp.addCookie(cookie2); // Set-Cookie : c03=apple;c04=banana } @Override protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("doDelete"); resp.setStatus(302); // 해당 Location으로 이동해 // 1. header에 redirection될 주소를 써줘야됨(key = Location) resp.setHeader("Location", "http://www.naver.com"); } }
     
    Share article

    jay0628