[Spring MVC 1편] 2. Servlet

HJ·2022년 8월 13일
0

Spring MVC 1편

목록 보기
2/8

김영한 님의 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 강의를 보고 작성한 내용입니다.
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard


1. 서블릿


1-1. 서블릿 동작 코드 작성

@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 요청 메세지 조회 ( 쿼리 파라미터 조회 )
        String username = request.getParameter("username");
        System.out.println("username = " + username);

        // 응답 메세지 작성
        // HTTP 헤더에 담기는 정보
        response.setContentType("text/plain");
        response.setCharacterEncoding("utf-8");
        // write()의 내용이 HTTP body에 들어감
        response.getWriter().write("hello " + username);
    }
}
  • HttpServlet을 상속

  • @WebServlet : 서블릿 어노테이션

    • name : 서블릿 이름

    • urlPatterns : urlPatterns에 지정된 url로 접속하면 해당 서블릿이 실행 ( URL 매핑 )

    • 매핑된 URL이 호출되면 서블릿 컨테이너는 service() 메소드를 실행

  • HTTP 요청이 들어오면 WAS가 Request, Response 객체를 만들어서 서블릿에 넘겨준다

    • service() 메서드가 인수로 객체들을 받는다

    • HttpServletRequest, HttpServletResponse

  • HTTP 요청 메세지 로그로 확인

    • application.properties에 아래 코드를 작성

    • logging.level.org.apache.coyote.http11=debug




2. 서블릿 컨테이너 동작 방식

  1. 스프링부트가 실행되면서 내장 톰켓 서버를 띄운다

  2. 톰켓 서버는 내부에 서블릿 컨테이너 기능을 가지고 있기 때문에 서블릿 컨테이너를 통해 서블릿을 생성

  3. HTTP 요청 메세지를 기반으로 request, response 객체를 생성해서 서블릿의 service() 메소드를 호출하면서 request, response 객체를 넘겨줌

  4. response 객체에 필요한 정보 작성

  5. WAS가 response 객체 정보로 HTTP 응답 메세지를 생성해서 반환




3. HttpServletRequest

3-1. HTTP 요청 메세지

  • START LINE ( Request-Line )

    • HTTP 메소드 URL, 쿼리 스트링 ( 쿼리 파라미터 ), 스키마, 프로토콜 정보가 있음
  • 헤더

  • Message Body

    • form 파라미터 형식의 데이터가 담겨져 있음

    • 데이터가 직접 담겨져 있음


3-2. HttpServletRequest 역할

  • HttpServletRequest

    • 서블릿은 HTTP 요청 메세지를 파싱하고 그 결과를 HttpServletRequest 객체에 담아서 제공

    • 즉, 개발자가 HTTP 요청 메세지를 편리하게 사용(조회)할 수 있도록 도와주는 객체

    • 메세지에 담긴 내용(헤더, body, 파라미터, JSON 등)을 조회할 수 있음

  • 기능 1 : 임시 저장소 기능

    • HTTP 요청이 시작부터 끝날 때까지 유지되는 임시 저장소 기능

    • HTTP 요청 메세지에는 작은 데이터 저장소가 존재

    • HTTP 요청 메세지가 유지되는 동안 사용할 수 있도록 데이터를 저장 및 조회

    • 값 저장 : request.setAttribute(name, value)

    • 값 조회 : request.getAttribute(name)

  • 기능 2 : 세션 관리 기능

    • 사용자 정보를 일정 조건 동안 유지하기 위해 사용

    • request.getSession(create: true)


4. HttpServletRequest 정보 조회

4-1. Request-Line 정보 조회

  • getMethod() : HTTP Method 조회

  • getProtocol()

  • getScheme()

  • getRequestURL() : 전체 URL 조회

  • getRequestURI() : urlPatterns 에 적힌 주소 조회

  • getQueryString() : 쿼리 파라미터 조회, 없는 경우 null이 출력

  • isSecure() : http 이면 false, https 이면 true


4-2. Header의 모든 정보 조회

request.getHeaderNames().asIterator()
.forEachRemaining(headerName -> System.out.println(headerName + ": " + request.getHeader(headerName)));

4-3. Header 정보 조회

  • getServerName()

  • getServerPort()

  • getContentType()

  • getContentLength()

  • getCharacterEncoding()

  • getLocales() : 모든 Locale 정보를 가져옴 ( Accept-Language 정보 )

  • getLocale() : 우선 순위가 가장 높은 언어만 조회

  • getCookies() : 쿠키 정보 조회

    • Cookie객체.getName()

    • Cookie객체.getValue()

  • getContentType() : message body에 내용이 없으면 null이 출력

  • getContentLength() : message body에 내용이 없으면 -1이 출력

  • getCharacterEncoding()


4-4. 네트워크 connection 정보 조회

  • Remote 정보 : 요청이 온 것에 대한 정보

    • getRemoteHost()

    • getRemoteAddr()

    • getRemotePort()

  • Local 정보 : 현재 나의 서버에 대한 정보

    • getLocalName()

    • getLocalAddr()

    • getLocalPort()




5.HTTP 요청 데이터

5-1. HTTP 요청 데이터 전달 방법 3가지

  • GET - 쿼리 파라미터

    • message body 없이, URL의 쿼리 파라미터에 데이터를 포함해서 전달

    • 쿼리 파라미터는 ? 로 시작하고 & 로 구분

  • POST - HTML Form

    • message body에 쿼리 파리미터 형식으로 전달

    • content-type : application/x-www-form-urlencoded

  • HTTP Message Body에 데이터를 직접 담아서 요청

    • 데이터 형식은 주로 JSON 사용

      • content-type: application/json
    • 텍스트 형식인 경우

      • content-type: text/plain
    • POST, PUT, PATCH 방식 전부 사용 가능

  • https://velog.io/@hj_/HTTP-5.-HTTP-method-%ED%99%9C%EC%9A%A9


5-2. GET - 쿼리 파라미터 조회

  • getParameterNames() : 요청 파라미터를 모두 꺼낸다

  • getParameter("name")

    • 파라미터 이름으로 단일 파라미터 조회

    • 쿼리 파라미터 형식과 HTML Form 형식 둘 다 사용 가능

    • 하나의 파라미터 이름에 하나의 값만 있는 경우에만 사용

    • 중복일 때 사용하면 가장 첫 번째 값을 반환

  • getParameterValues("name")

    • 이름이 같고 값이 다른 복수 파라미터 조회

    • 반환형은 String 배열


5-3. POST - HTML Form

  • HTML form 태그의 action 에 지정된 url로 데이터가 전달

    • message body에 쿼리 파라미터 형식으로
  • 쿼리 파라미터와 형식이 같기 때문에 5-2의 메서드로 조회 가능


5-4. API Message body - 단순 텍스트

  • message body의 데이터는 InputStream을 사용해서 직접 읽을 수 있음

  • getInputStream()

    • message body의 내용을 바이트 코드로 반환

    • 반환형은 ServletInputStream

  • StreamUtils.copyToString(inputStream,StandardCharsets.UTF_8)

    • 위의 메서드로 얻은 stream( inputStream )을 String 으로 변환

    • 바이트를 문자로 변환하기 때문에 인코딩 정보를 알려줘야함


5-5. API Message body - JSON

private ObjectMapper objectMapper = new ObjectMapper();

@Override
    protected void service(HttpServletRequest request, HttpServletResponse resposne) throws ServletException, IOException {
        ...
        objectMapper.readValue(messageBody, 클래스파일.class)
    }
  • messageBody는 5-4의 메서드를 사용하고 얻은 String

  • 클래스 파일은 JSON 형식으로 파싱할 수 있도록 생성한 객체

  • JSON 결과를 파싱해서 사용할 수 있는 자바 객체로 변환하기 위해 JSON 변환 라이브러리를 사용해야함

  • 스프링부트로 Spring MVC를 선택하면 기본으로 Jackson 라이브러리 (ObjectMapper)를 제공




6. HttpServletResponse

6-1. HttpServletResponse 역할

  • HTTP 응답 메세지 작성

    • HTTP 응답 코드 / 헤더 / message body 생성
  • 편의 기능 제공

    • Content-Type / Cookie / Redirect

6-2. HttpServletResponse 헤더 작성

  • setStatus()

    • 응답 코드 지정

    • 200처럼 숫자로 작성 가능

    • HttpServletResponse에 SC_로 시작하면서 상태 코드에 대응되는 상수가 있는데 이것으로 작성하는 것이 더 좋음

    • ex> HttpServletResponse.SC_OK

  • setHeader("해더이름", "헤더내용")

    • 이름으로 헤더를 지정하고 헤더 내용을 작성

    • 본인이 원하는 헤더를 만들 수 있음

    • 헤더이름을 지정하지 않고 setContentType(), setCharacterEncoding() 로 특정 헤더의 내용 작성 가능

  • addCookie(쿠키 객체)

    • 쿠키 객체를 만들고 응답에 추가할 때 사용

    • Response Header의 Set-Cookie에 해당하는 정보임

    • setHeader("Set-Cookie", "내용" )로 추가할 수도 있음

  • sendRedirect("주소")




7. HTTP 응답 데이터 작성

  • message body 작성을 위한 객체 생성

    • PrintWriter writer = response.getWriter();
  • 단순 텍스트 응답

    • writer.println("text");를 이용해서 작성

    • 텍스트가 message body에 담기게 된다

  • HTML 응답

    • 응답으로 HTML을 반환하는 경우 Content-Type을 text/html로 지정하고 인코딩 방식도 지정해야함 ( utf-8 )

    • writer.println("html태그"); 를 이용해서 작성

  • HTTP API - MessageBody JSON 응답

    • 응답으로 JSON을 반환하는 경우 Content-Type을 application/json으로 지정해야함

    • JSON의 경우 utf-8 형식을 사용하도록 정의되어 있기 때문에 인코딩 방식을 따로 지정하지 않아도 된다

    • objectMapper.writeValueAsString(data); : data 객체를 JSON 형식으로 변경

    • response.getWriter().write(result) : result는 변환된 JSON 데이터




참고> 쿠키 생성

Cookie cookie = new Cookie("이름" "값");
cookie.setMaxAge(600);
...
profile
공부한 내용을 정리해서 기록하고 다시 보기 위한 공간

0개의 댓글