[6] 스프링 MVC (2) - 서블릿 (Servlet/ HttpServletRequest, HttpServletResponse)

김정욱·2021년 4월 29일
4

[6] 스프링 MVC

목록 보기
2/13
post-thumbnail

서블릿(Servlet)

[ 개념 ]

  • 클라이언트의 요청을 처리하고 결과를 반환하는 Servlet 클래스규칙을 지킨 자바 웹 프로그래밍 기술
  • 자바를 사용하여 웹을 만들기 위해 필요한 기술 (자바 기반 --> JDK / JVM 필수)

: 즉, java를 이용해 웹개발을 하기 위해서 필요한 가장 기본적인(low한) 기술Servlet

[ 특징 ]

  • 클라이언트 요청에 대해 동적으로 작동하는 웹 애플리케이션 컴포넌트
  • html을 사용하여 요청에 응답
  • Java Thread를 이용하여 동작
  • MVC 패턴에서 Controller로 이용

[ 동작 ]

  • ClientHTTP 요청
  • WASHttpServletRequest / HttpServletResponse 객체를 생성
  • WAS요청 URL에 해당되는 서블릿 객체호출
    (서블릿을 지원하는 WAS == 서블릿 컨테이너)
  • 개발자HttpServletRequest를 통해 요청 정보를 편리하게 사용
  • ====비즈니스 로직 수행====
  • 개발자HttpServletResponse를 통해 응답 정보를 작성
  • WASHttpServletResponse를 통해 HTTP Response Message 생성 후 Client에 전달

서블릿 컨테이너(Servlet Container)

[ 설명 ]

  • 서블릿관리하기 위한 모든 작업을 수행 (생성 / 호출 / 관리)
  • java thread사용해서 서블릿을 호출
  • 톰캣(Tomcat)처럼 서블릿을 지원하는 WAS서블릿 컨테이너라고 함
  • 서블릿 객체싱글톤으로 관리
    • 고객의 요청이 올 때 마다 생성하는것비효율적이기 때문
    • 공유 변수 사용주의해야 한다
    • 서블릿 컨테이너가 종료 --> 서블릿도 종료
  • 동시 요청을 위한 멀티 쓰레드(Multi Thread) 처리를 지원

[ 핵심 ]

  • 실제 우리가 WAS를 직접 구현하면 많은 사전 과정구현해야 한다
    • TCP/IP 연결 & 소켓 연결
    • HTTP request 메시지 파싱
    • HTTP response 메시지 작성
    • TCP/IP소켓 연결 종료
  • Servlet을 지원하는 WAS 즉, 서블릿 컨테이너이러한 과정들을 대신 수행해준다
    --> 개발자비즈니스 로직에 집중할 수 있다!!

프로젝트 구성 & 설정

  • starter를 이용한 프로젝트 구성
    (Packaging을 반드시 War로 설정 --> 후에 JSP를 사용하기 위해 필요)
  • lombok 설정
    • lombok 플러그인 설치
    • Preferences --> Annotation Processors 검색 --> Enable annotation processing 체크
  • Postman 설치
    : API 요청을 보낼 수 있는 툴

기본적인 서블릿 등록 & 사용

[ @ServletComponentScan 설정 - 기본설정 ]

: Springboot 환경에서 서블릿을 직접 등록해서 사용할 수 있도록 필요한 어노테이션


[ 서블릿 등록 ]

  • 단계
    • 1) @WebServlet으로 이름 / 연결 url 지정
    • 2) HttpServlet 상속
    • 3) protected 접근지정자를 갖는 service 메소드 Override
    • 4) 비즈니스 로직 작성

HttpServletRequest

[ 역할 ]

  • HTTP request 메시지편리하게 사용할 수 있도록 개발자 대신 파싱해서 제공된 객체
  • HttpServletRequest를 사용해서 HTTP request message다양한 정보조회할 수 있음
    • start-line
    • headers
    • body
  • 추가적으로 다양한 부가 기능도 제공
    • 임시 저장소 기능
      : 해당 HTTP 요청이 시작되고 끝날 때 까지 유지되는 임시저장소
      • 저장 : req.setAttribute(name, value)
      • 조회 : req.getAttribute(name)
    • 세션 관리 기능
      • req.getSession(create: true)

[ HTTP request message 정보 조회 ]

( start-line 정보 조회 )


( Header 정보 조회 )


( 기타 정보 조회 )

  • HTTP request상관 없추가적인 정보

[ 요청 데이터(body) 전달 방법 ]

( 분류 )

  • 쿼리 파라미터 (주로 GET)
  • HTML Form (POST)
  • HTTP request messagebody(POST / PUT / PATCH)
    • 단순 텍스트
    • JSON

( 쿼리 파라미터 & HTML Form )

  • 쿼리 파라미터
    • http request messagebody가 없이 URL쿼리 파라미터데이터를 포함해서 전달
    • ex) /url?username=hello&age=20
    • 주 사용 : 검색 / 필터 / 페이징
  • HTML Form
    • HTML의 Form형식에서 바로 데이터를 넘기는 방식
    • 무조건 POST로 요청을 하기 때문에 쿼리 파라미터와 다르게 Http request message body로 데이터 전송
    • 데이터의 형식쿼리 파라미터동일한 형식이라서 같은 방법으로 조회할 수 있다!
    • Content-Type : application/x-www-form-urlencoded 반드시 지정!
  • 단일 파라미터 조회
    : req.getParameter() 사용
  • 복수 파라미터 조회
    : req.getParameterValues() 사용

( HTTP reqeust message의 body ) - 단순 text

  • 단순 데이터Stream으로 주고받는 경우
  • byte코드우리가 읽을 수 있는 문자(String)으로 변환해야 한다
    (Charset지정해줘야 한다 --> 여기서는 UTF_8)

( HTTP reqeust message의 body ) - JSON

  • 입력받은 문자jackson 라이브러리의 objectMapper를 통해 JSON 형식으로 바꿔줘야 한다
  • HelloData : JSON객체로 변환된 정보를 받기 위한 임시 데이터 구조
  • 지금은 이렇게 streamJSON으로 바꾸고 매우 할게 많아보이지만,
    실제로는 Spring MVC써서 편리하게 사용할 수 있음 --> 걱정 X

HttpServletResponse

[ 역할 ]

  • HTTP response 메시지편리하게 만들 수 있도록 제공되는 객체

[ HTTP response message 정보 조회 ]

  • status-line
    : statusCode 지정
  • response-header
    : 데이터 타입 등등을 지정
  • header 편의 메서드
    : setHeader텍스트로 필드를 삽입하는 것이 아니라 하나하나 각각 setter로 지정
      (아래 그림)

profile
Developer & PhotoGrapher

0개의 댓글