2. 서블릿

ys·2024년 1월 1일

Spring-mvc1

목록 보기
2/7

김영한 강사님의 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술을 듣고 정리한 내용입니다. 자세한 내용은 강의를 참고해주세요

1편에서 말했듯이, 서블릿 컨테이너를 사용하면 http 요청 메시지를 편리하게 처리할 수 있고, 싱글톤 객체를 만들어 주며 멀티 쓰레드를 지원해준다. 하지만 서블릿은 톰캣 같은 웹 애플리케이션 서버를 직접 설처하고 그 위에 서블릿 코드를 클래스 파일로 빌드해서 올린다음 톰캣 서버를 실행해야한다.

이번 실습에서는 스프링 부트가 톰캣 서버를 내장하고 있으므로, 톰캣 서버 설치 없이 스프링 부트를 가지고 편리하게 서블릿 코드를 이용한다.


스프링 부트 서블릿 환경 구성


우리가 컴포넌트 스캔을 이용해 스프링 빈을 등록하는 것처럼, @ServletComponentScan을 이용해 서블릿을 자동 등록 하고 사용한다.

  • @ServletComponentScan : 자동으로 현재 패키지 포함 및 하위 패키지의 Servlet을 다 찾아서 자동으로 Servlet을 Servlet 컨테이너에 등록해서 실행할 수 있도록 도와준다
  • @WebServlet(name, urlPatterns) : 서블릿 애노테이션, name : 서블릿 이름, urlPatterns : URL 매핑
  • HTTP 요청을 통해 매핑된 URL이 호출되면 서블릿 컨테이너는 다음 메서드를 실행한다
  • protected void service(HttpServletRequest request, Http ServletResponse response)
  • 톰켓 서버는 내장 서블릿 컨테이너를 가지고 있다
  • @ServletComponentScan을 통해서 @Servlet들을 모두 Servlet Container에 생성한다
  • 웹 페이지가 HTTP 요청 메세지를 만들어서 서버에 주면, 서버는 받은 HTTP메시지 기반으로 생성한 Request, Response 객체를 생성한다
  • urlPatterns에 맞는 싱글 서블릿 객체에 Service 메서드를 호출하면서 인자값에 Request와 Response를 넘겨준다
  • 필요한 작업을 모두하고, Response객체에다가 필요한 메시지를 넣어서 웹 브라우저에 전달하고 종료한다.
  • HTTP응답에서 head부의 Content-Length는 웹 애플리케이션 서버(WAS)가 자동으로 생성해준다!!!

  • 서블릿을 생성할때 애노테이션@WebServlet(name,urlPatterns)를 넣어주고
    HttpServlet을 상속받아준다
  • 우리가 사용할 service 메서드를 오버라이드 해준다 -> 이때 protected로 해준다.

HttpServletRequest


  • httpServletRequest : Http 요청 메시지를 개발자가 직접 파싱해도 되지만, 편리하게 사용할 수 있도록 개발자 대신에 HTTP 요청 메시지를 파싱한다. 그 결과를 HttpServletRequest 객체에 담아서 제공한다
  • 임시 저장소의 기능
    • Http 요청이 시작부터 끝까지 유지되는 임시 저장소
    • 저장 : request.SetAttribute(name,value)
    • 조회 : request.GetAttribute(name)
    • 나중에 mvc 패턴에서도 많이 사용한다
  • 세션 관리 기능
    • request.getSession(create:true)
  • request의 객체에 요청 메시지의 정보를 메서드로 반환 받을 수 있다.
  • 필요한 메서드들은 검색해서 그때 그때 찾아서 사용하자!
  • request.getMethod() : 요청 메시지의 http메서드 반환
  • reqest.getProtocol() : 요청 메시지의 프로토콜 반환 ->http/1.1
  • reqest.getScheme() : 요청 메시지의 스키마 반환 -> http
  • reqest.getRequestURL() : 요청 메시지의 url
  • reqest.getRequestURI() : 요청 메시지의 uri
  • reqest.isSecure() : https 사용했니?
  • 많은 메서드들이 있아 찾아서 사용하자!

이제 HTTP 요청 메시지를 통해 클라이언트에서 서버로 데이터를 전달하는 방법을 보자

  1. GET - 쿼리 파라미터
  • /url(search)?username=kim&age=20
  • 이렇게 메시지 body 없이, url 쿼리 파라미터에 데이터를 포함해서 전달하는 방식
  • 검색, 필터,페이징에서 주로 이용
  1. POST - HTML Form 방식
  • content-type:application/x-www-form-urlencoded
  • 메시지 바디에 쿼리 파라미터 형식으로 전달, username=kim&age=20
  1. HTTP message body에 데이터를 직접 담아서 전달
  • http api에서 주로 사용, json,xml,text
  • 데이터 형식은 요즘은 대부분 json
  • Post,Put,Patch 모두 사용 가능

1. GET 방식의 쿼리 파라미터

  • 메시지 바디 없이 url에 쿼리 파라미터(검색,필터, 페이징)
  • HttpServletRequest 제공 메서드를 통해 쿼리 파라미터 조회가능
  • request.getParameter("파라미터 이름"): 단일 파라미터 조회
  • request.getParameters() : 모든 요청 파라미터를 다 꺼낼 수 있다
  • request.getParameterValues : 하나의 파라미터에 여러개의 값이 들어오면 이 메서드를 이용해 꺼낸다
request.getParameterNames().asIterator()
    .forEachRemaining(paramName -> System.out.println(paramName +"="
    + request.getParameter(paramName)));
  • 다음 코드는 getParameterNames를 이용해 여러개의 파라미터를 꺼내고
  • asIterator()로 이터레이터 개념을 사용하고
  • forEachRemaining(Consumer을 이용)으로 각자의 이름을 출력 + 이름을 통해 getParameter로 파라미터까지 꺼내는 모습이다

2. HTTP 요청 데이터 - POST HTML Form

  • post형식으로 메시지 바디에 쿼리 파라미터 형식으로 데이터를 전한다
  • content-type : x-www-form-urlencoded
  • get방식과 다르게 메시지 바디에 데이터를 넣어줬으므로 8*어떤 데이턴 형식인지 알려줘야하기 때문에 content-type header을 요청 메시지에 포함**해야 한다
  • 웹 브라우저가 HTTP 메시지를 만들어준다
  • 이때 바디에 들어가는 형식이 파라미터 형식이므로 getParameter() 같은 메서드로 꺼낼 수 있다,
  • 즉 클라이언트에서 GET으로 쿼리 파라미터를 보내는 방식과, POST로 쿼리 파라미터를 메시지 바디에서 넣어 보내는 방법은 다르지만, 서버입장에서는 파라미터 형식으로 받는 같은 방식이다

3. HTTP 요청 데이터 - API 메시지 바디 - 단순 텍스트

  • 그냥 API 방식
  • HTTP API, Rest API 방식
  • POST,PUT,PATCH 모두가능하다
  • HTTP Message body에 데이터를 직접 담아서 요청
  • request.getInputStream()하면, http body의 내용을 바이트 코드로 바로 얻을 수 있다.
  • StreamUtils.copyToString(inputStream, StandardCharsets.UTF\_8): 스프링의 util 기능 바이트 코드의 스트링 ->문자열로 바꿔준다 .이 때 파라미터는 (@Nullable inpustream, Charset)

4. HTTP 요청 데이터 - API 메시지 바디 - JSON

  • jackson이라고 스프링에서 기본으로 사용할 수 있는 JSON 라이브러리
  • ObjectMapper 로 json 데이터를 받을 수 있다
  • obejctMapper.readValue(json형식의 문자열,변환할 객체 타입(.class))) 를 통해서 객체로 변환할 수 있다.
  • json형식을 객체로 생성하고 반환받는다
  • 전송 content-type header : application/json

HttpServletRequest

  • http 응답 메시지를 생성할 수 있다
    • http 응답 코드 지정
    • 헤더 생성
    • 바디 생성
    • Content-type, 쿠키, redirect의 편의 기능을 제공한다
  • response.setStatus : 응답 상태 설정
  • response.setHeader("Content-type","text/plain") :헤더를 마음 대로 넣을 수 있다
  • response.setContentType("text/plain) : 응답 컨텐트 타입 설정
  • response.setCharacterEncoding("utf-8) : 응답 문자인코딩 설정
  • setMaxage, addCookie : 쿠키 관련
  • response.sendRedirect(주소): redirect 정보 전달
  • HTTP 응답 데이터 - 단순 텍스트, HTML, JSON
  • 단순 택스트 :response.getWriter().write()
  • HTML, JSON 모두 가능
profile
개발 공부,정리

0개의 댓글