스프링 MVC 1편 - 서블릿

hyuk·2023년 11월 7일
0
post-thumbnail

📌 서블릿 환경 (스프링 부트)

스프링 부트는 톰캣 서버를 내장하여 톰컷 서버 설치 없이 편리하게 서블릿 코드 실행이 가능하다 !

@ServeltComponentScan

: 해당 애노테이션을 통해 서블릿을 직접 등록하여 사용할 수 있도록 지원

@WebServlet(name="xxx", urlPatterns="xxx")

  • name : 서블릿 이름
  • urlPatterns : URL 매핑

  • HTTP 요청을 통해 매핑된 URL이 호출되면, 다음 메서드를 실행
    protected void service(HttpServletRequest request, HttpServletResponse response)

@WebServletname, urlPatterns 중복 허용 X


📌 HttpServletRequest

개요

서블릿은 개발자가 HTTP 요청 메시지를 편리하게 사용할 수 있도록 HTTP 요청 메시지를 파싱하고, 해당 결과를 HttpServletRequest 객체에 담아서 제공한다.

  • 기본 기능
    • START LINE
      - HTTP 메소드
      - URL
      - 쿼리 스트링
      - 스키마, 프로토콜
    • 헤더
      • 헤더 조회
    • 바디
      • form 파라미터 형식 조회
      • message body 데이터 직접 조회
  • 부가 기능
    • 임시 저장소 기능 : 해당 HTTP 요청이 시작부터 끝날 때 까지 유지되는 임시 저장소 기능
      • 저장 : request.setAttribute(name, value)
      • 조회 : request.getAttribute(name)
  • 세션 관리 기능
    • request.getSession(create: true)

기본 사용법

http://localhost:8080/request-header?username=hello 호출될 때, HTTP 요청 메세지정보 조회

// start line 정보

 request.getMethod()  				 = GET
 request.getProtocol() 				 = HTTP/1.1
 request.getScheme() 				 = http
 request.getRequestURL() 			 = http://localhost:8080/request-header
 request.getRequestURI() 		  	 = /request-header
 request.getQueryString()			 = username=hello
 request.isSecure())				 = false

// Header 정보

 [Host 조회]
 request.getServerName() 			 = localhost
 request.getServerPort()  		     = 8080

 [Accept-Language 조회]
 request.getLocale()  				 = ko

 [Cookie 조회]
 request.getCookies()  				 = (cookie 사용 X)
	
 [Content 조회]
 request.getContentType() 		     = null
 request.getContentLength()  	     = -1
 request.getCharacterEncoding())     = UTF-8

📌 HTTP 요청 데이터

개요

클라이언트에서 서버로 데이터를 전달하는 방법은 주로 3가지 방법을 사용한다.

  • GET : 쿼리 파라미터
    - 메시지 바디 없이 URL의 쿼리 파라미터에 데이터를 포함해서 전달
    - 예) 검색, 필터, 페이징등에서 많이 사용하는 방식

  • POST : HTML Form
    - content-type: application/x-www-form-urlencoded
    - 메시지 바디에 쿼리 파리미터 형식으로 전달

  • HTTP message body에 데이터를 직접 담아서 요청
    - HTTP API에서 주로 사용, JSON, XML, TEXT
    - 데이터 형식은 주로 JSON 사용

GET 쿼리 파라미터

HttpServletRequest가 제공하는 service 메소드를 통해 쿼리 파라미터 조회

쿼리 파라미터 조회 메서드

request.getParameter("username")			//단일 파라미터 조회
request.getParameterNames()					//파라미터 이름들 모두 조회
request.getParameterMap()					//파라미터를 Map으로 조회
getParameterValues("username")				//복수 파라미터 조회

❗ 파라미터 값이 하나일 때, 값이 중복일 경우 ➜ getParameterValues() 사용

POST HTML Form

메시지 바디에 위와 같은 쿼리 파리미터 형식으로 데이터를 전달한다.

즉, GET 쿼리 파라미터와 같은 방식으로 조회가 가능하다 !

GET URL 쿼리 파라미터 형식은 content-Type = X
POST HTML Form 형식은 content-Type = application/x-www-form-urlencoded

API 메시지 바디 - JSON

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

JSON 형식 전송

  • content-type: application/json
  • message body: {"username": "hello", "age": 20}
  • 결과: messageBody = {"username": "hello", "age": 20}

[주요 코드]
ServletInputStream inputStream = request.getInputStream();
String messageBody= StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);

// JSON 결과를 파싱해서 사용할 수 있는 자바 객체로 변환
HelloData helloData = objectMapper.readValue(messageBody, HelloData.class);

📌 HttpServletResponse

개요

HTTP 응답 메시지 생성

  • HTTP 응답코드 지정
  • 헤더 생성
  • 바디 생성

편의 기능 제공

  • Content-Type, 쿠키, Redirect


기본 사용법

http://localhost:8080/response-header 호출될 때, HTTP 응답 메시지 생성


[status-line]
	
 response.setStatus(HttpServletResponse.SC_OK);		 
 //컨텐트 타입 지정
 response.setHeader("Content-Type", "text/plain;charset=utf-8"); 	

 //캐시 무효화 설정
 response.setHeader("Cache-Control", "no-cache, no-store, mustrevalidate");
 response.setHeader("Pragma", "no-cache"); 							

[Header 편의 메서드]

1. Content 메서드
 response.setContentType("text/plain");
 response.setCharacterEncoding("utf-8");
 
2. 쿠키 메서드
 Cookie cookie = new Cookie("myCookie", "good");
 cookie.setMaxAge(600); //600초
 response.addCookie(cookie);
 
3. redirect 메서드
 response.sendRedirect("/basic/hello-form.html");

📌 HTTP 응답 데이터

개요

HTTP 응답 메시지는 주로 다음 내용을 담아서 전달한다.

  • 단순 텍스트 응답
    ex) writer.println("ok");

  • HTML 응답

  • HTTP API - MessageBody JSON 응답

HTML 응답

  protected void service(HttpServletRequest req, HttpServletResponse res) 
  								       throws ServletException, IOException {
        res.setContentType("text/html");
        res.setCharacterEncoding("utf-8");

        PrintWriter writer = res.getWriter();
        writer.println("<html>");
        writer.println("<body>");
        writer.println("<div>안녕?</div>");
        writer.println("</body>");
        writer.println("</html>");
    }
  • HTTP 응답으로 HTML을 반환할 때는 content-type을 text/html 로 지정
  • 서블릿으로 HTML을 렌더링 할 때는 직접 작성해야함
  • 동적으로도 HTML 생성 가능

API JSON

 protected void service(HttpServletRequest req, HttpServletResponse res) 
 										throws ServletException, IOException {
        response.setContentType("application/json");
        response.setCharacterEncoding("utf-8");

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

        // json 형식으로 변환 
        String result=objectMapper.writeValueAsString(helloData);
        response.getWriter().write(result);
    }
  • HTTP 응답으로 JSON을 반환할 때는 content-type을 application/json 로 지정
  • objectMapper.writeValueAsString()를 사용해 객체를 JSON 문자로 변경

📌 본 포스트는 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 통해 학습한 내용을 요약 및 정리한 것입니다.

profile
차곡차곡쌓아가는학습노트

0개의 댓글