[Spring MVC 1] - HttpServletRequest
HttpServletRequest 역할
HTTP 요청 메세지를 개발자가 편리하게 사용할 수 있도록 HTTP를 파싱한다. 그리고 그 결과를 HttpServletRequest객체에 담아서 제공한다.
HTTP 요청 메세지
POST /save HTTP/1.1
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded
username=rosieposie&age=22
- START LINE
- HTTP 메소드
- URL
- 쿼리 스트링
- 스키마, 프로토콜
- 헤더
- 헤더 조회
- 바디
- form 파라미터 형식 조회
- message body 데이터 직접 조회
임시 저장소 기능
- 해당 HTTP 요청이 시작부터 끝날 때까지 유지되는 임시 저장소 기능
- 저장 : request.setAttribute(name, value)
- 조회 : request.getAttribute(name)
세션 관리 기능
- request.getSession(create:true);
*** 중요
HttpServletRequest, HttpServletResponse를 사용할 때 가장 중요한 점은 이 객체들이 HTTP 요청 메세지, HTTP 응답 메세지를 편리하게 사용하도록 도와주는 객체라는 점이다. 이 기능에 대해 깊이있는 이해를 위해 HTTP 스펙이 제공하는 요청, 응답 메세지 자체를 이해해야 한다.
직접 스타트라인 정보 출력해보기
package hello.servlet.basic;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name="requestHeaderServlet", urlPatterns = "/request-header")
public class RequestHeaderServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
printStartLine(request);
}
private void printStartLine(HttpServletRequest request) {
System.out.println("---- request line start-----");
System.out.println("request.getMethod() = "+request.getMethod());
System.out.println("request.getProtocol() = "+request.getProtocol());
System.out.println("request.getScheme() = "+request.getScheme());
//http://localhost:8080/request-header
System.out.println("request.getRequestURL() = "+request.getRequestURL());
System.out.println("request.getRequestURI() = "+request.getRequestURI());
System.out.println("request.getQueryString() = "+request.getQueryString());
System.out.println("request.isSecure() = "+request.isSecure()); //https 사용 유무
System.out.println("---- request line end-----");
System.out.println();
}
}
서블릿 클래스 만들기 이전 포스팅 참고 : https://dev-rosiepoise.tistory.com/10
[스프링 MVC 1] - 스프링부트 환경에서 서블릿 등록 후 사용
** 톰캣서버를 설치하고 서블릿 코드를 클래스 파일로 빌드해서 올리는 과정은 번거로우니 내장 톰캣이 있는 스프링부트 환경에서 진행 1. HelloServlet.java 생성 HttpServlet을 상속을 받고 @WebServlet 컴
dev-rosiepoise.tistory.com
RequestHeaderServlet 클래스를 만들고, HttpServlet을 상속을 받고 @WebServlet 컴포넌트를 사용하여 name과 urlPatterns를 지정해준다. 스타트 라인 정보를 출력하는 메소드를 만들고 (메소드 추출 단축키 : ctrl+t) 톰캣띄우고 해당 url을 요청해본다
http://localhost:8080/request-header?username=kim 요청 시
결과 :
---- request line start-----
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=kim
request.isSecure() = false
---- request line end-----
직접 헤더 정보 출력해보기
private static void printHeader(HttpServletRequest request) {
System.out.println("---- header start ----");
request.getHeaderNames().asIterator().forEachRemaining(headerName -> System.out.println(headerName + ": " + headerName));
System.out.println("---- header end ----");
System.out.println();
}
결과 :
---- header start ----
host: host
connection: connection
cache-control: cache-control
sec-ch-ua: sec-ch-ua
sec-ch-ua-mobile: sec-ch-ua-mobile
sec-ch-ua-platform: sec-ch-ua-platform
upgrade-insecure-requests: upgrade-insecure-requests
user-agent: user-agent
accept: accept
sec-fetch-site: sec-fetch-site
sec-fetch-mode: sec-fetch-mode
sec-fetch-user: sec-fetch-user
sec-fetch-dest: sec-fetch-dest
accept-encoding: accept-encoding
accept-language: accept-language
---- header end ----
직접 헤더 편의 정보 출력해보기
private static void printHeaderUtils(HttpServletRequest request) {
System.out.println("--- header 편의 조회 start ---");
System.out.println("[Host 편의 조회]");
System.out.println("request.getServerName() = " + request.getServerName()); //Host 헤더
System.out.println("request.getServerPort() = " + request.getServerPort()); //Host 헤더
System.out.println();
System.out.println("[Accept-Language 편의 조회]");
request.getHeaderNames().asIterator().forEachRemaining(locale -> System.out.println(locale + ": " + locale));
System.out.println();
System.out.println("[cookie 편의 조회]");
if(request.getCookies() != null){
for(Cookie cookie : request.getCookies()){
System.out.println(cookie.getName() + ": " + cookie.getValue());
}
}
System.out.println();
System.out.println("[Content 편의 조회]");
System.out.println("request.getContentType() = " + request.getContentType());
System.out.println("request.getServerPort() = " + request.getContentLength());
System.out.println("request.getCharacterEncoding() = " + request.getCharacterEncoding());
System.out.println("--- header 편의 조회 end ---");
System.out.println();
}
포스트맨으로 post방식으로 해당 url에 body에 hi!라고 입력을 하면 자동으로 헤더정보가 세팅된다.
그리고 send를 하면 다음과 같이 콘솔에 출력된다
결과 :
--- header 편의 조회 start ---
[Host 편의 조회]
request.getServerName() = localhost
request.getServerPort() = 8080
[Accept-Language 편의 조회]
content-type: content-type
user-agent: user-agent
accept: accept
postman-token: postman-token
host: host
accept-encoding: accept-encoding
connection: connection
content-length: content-length
[cookie 편의 조회]
[Content 편의 조회]
request.getContentType() = text/plain
request.getContentLength() = 3
request.getCharacterEncoding() = UTF-8
--- header 편의 조회 end ---
직접 기타 정보 출력해보기
private static void printEtc(HttpServletRequest request) {
System.out.println("--- 기타 조회 start ---");
System.out.println("[Remote 정보]");
System.out.println("request.getRemoteHost() = " + request.getRemoteHost());
System.out.println("request.getRemoteAddr() = " + request.getRemoteAddr());
System.out.println("request.getRemotePort() = " + request.getRemotePort());
System.out.println();
System.out.println("[Local 정보]");
System.out.println("request.getLocalName() = " + request.getLocalName());
System.out.println("request.getLocalAddr() = " + request.getLocalAddr());
System.out.println("request.getLocalPort() = " + request.getLocalPort());
System.out.println("--- 기타 조회 end ---");
System.out.println();
}
결과 :
--- 기타 조회 start ---
[Remote 정보]
request.getRemoteHost() = 0:0:0:0:0:0:0:1
request.getRemoteAddr() = 0:0:0:0:0:0:0:1
request.getRemotePort() = 50579
[Local 정보]
request.getLocalName() = localhost
request.getLocalAddr() = 0:0:0:0:0:0:0:1
request.getLocalPort() = 8080
--- 기타 조회 end ---
이렇게 직접 출력해보니 서블릿이 많은 일을 개발자를 위해서 해주는구나 싶다. 이시대에 태어나 이미 구현되어 있는 객체를 끌어다 쓰는 일들을 감사히 생각해야겠음을 다시 한번 느낌. 직접 출력해보니 또 다른 기분... ! 당연함을 당연히 받아들이지 말고 할 것... 에러 확인할 때 개발자도구의 네트워크에서 자주 보던 눈에 익던 정보들이었는데 이게 이렇게 되는 거구나....!!!!!!!! 사실 강의 들을 때만해도 코드 직접 쳐보지 말고 다음꺼 넘어갈까? 하다가 쌤이 강조하시던 백문이 불여일타를 상기시키며 했는데 백문이 불여일타는 많은 것을 깨닫게 해준다 정말. 겸손하자 겸손!!
@ 스프링 MVC 1편 - 백엔드 웹개발 by 김영한을 참조하고 있습니다.