티스토리 뷰
이번 글에서는 HttpServletRequest에 대하여 알아보도록 하겠습니다.
우선 HttpServletRequest 클래스는 Servlet 호출 시 생성되는 객체입니다.
뿐만 아니라 HttpServletResponse 객체도 생성되는데, Response에 대해서는 이후 포스팅에서 알아보도록 하겠습니다.
이번 포스팅에서는 자바에서 사용하는 HttpServletRequest 개요 및 기본적인 사용법에 대해서 알아보도록 하겠습니다.
알아보기전에!
서블릿(Servlet)에 대한 기본 개념이 부족하시다면
아래 링크를 통해 공부 하고 오시는게 이해하는데 도움이 될 수 있습니다.
HttpServletRequest
HttpServletRequest 란 자바 서블릿 API의 일부로, 클라이언트가 서버에 보낸 HTTP 요청을 나타냅니다.
매개 변수, 헤더, 쿠키 및 세션 정보와 같은 세부 정보를 캡슐화합니다.
클라이언트에서 서버로 요청이 발생할 때, 이 객체를 통하여 개발자는 요청에 포함된 데이터를 읽고 분석할 수 있습니다.
아래 사진은 Http 요청 메시지입니다.
Http 요청 메시지에는 START LINE, 헤더, 바디로 구분됩니다.
- START LINE
- HTTP 메서드
- URL
- 쿼리 스트링 (사진에는 없음)
- 스키마, 프로토콜
- 헤더
- 헤더 조회
- 바디
- form 파라미터 형식 조회
- message body 데이터 직접 조회
HttpServletRequest 목적
HttpServletRequest의 목적은 개발자가 클라이언트 요청에 효율적으로 액세스하고 처리할 수 있도록 하는 것입니다.
요청 정보 검색
HttpServletRequest를 사용하면 개발자가 요청 방법, URL, 쿼리 매개변수, 헤더 및 클라이언트의 IP 주소와 같은 들어오는 요청에 대한 필수 세부 정보를 얻을 수 있습니다.
매개변수 처리
쿼리 문자열, 양식 제출 또는 요청 본문을 통해 클라이언트에서 보낸 요청 매개변수에 액세스하는 방법을 제공합니다.
세션 관리
세션을 생성, 검색 및 무효화하는 방법을 제공하여 세션 관리를 용이하게 합니다
HttpServletRequest 주요 기능
요청 매개변수 및 쿼리 문자열 활용
HttpServletRequest를 사용하면 개발자가 클라이언트에서 보낸 사용자 입력 및 데이터를 추출할 수 있습니다.
쿼리 파라미터 및 양식 입력에 액세스하기 위해 getParameter(), getParameterValues(), getParameterMap()과 같은 메서드들을 사용할 수 있습니다.
요청 헤더
요청 헤더는 클라이언트 요청에 대한 필수 정보를 전달합니다.
HttpServletRequest는 요청 헤더에 액세스하고 분석하는 방법을 제공합니다.
getHeader(), getHeaders() 와 같은 메서드를 사용하여 특정 헤더 값을 추출할 수 있습니다.
@WebServlet(name = "testServlet", urlPatterns = "/test/request")
public class RequestTest extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String contentType = request.getHeader("Content-Type");
System.out.println("getHeader() = " + contentType);
}
}
위 코드에서는 Content-Type 헤더의 값을 검색합니다.
출력 값
HttpServletRequest는 getHeader() 메서드를 사용하는 방법 외에 헤더를 조회할 수 있는 여러 메서드를 제공합니다.
@WebServlet(name = "testServlet", urlPatterns = "/test/request")
public class RequestTest extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String contentType = request.getHeader("Content-Type");
System.out.println("getHeader() = " + contentType);
//getHeader("Content-Type) 과 동일하다
String contentType2 = request.getContentType();
System.out.println("getContentType() = " + contentType2);
}
}
출력 값
이와 같이 getHeader("헤더 이름") 메서드를 이용하여 헤더 값을 가지고오는 방법도 있지만, getContentType() 메서드 처럼 헤더를 구하는 메서드도 제공하고 있습니다.
이외 정말 다양한 메서드들이 있는데, 여기서 전부 다루지는 않고 조금 더 아래에서 몇개만 살펴보도록 하겠습니다.
추가로 @WebServlet 애노테이션은 아래에 예제와 함께 살펴보도록 하겠습니다.
임시 저장소 기능
해당 HTTP 요청이 시작부터 끝날 때 까지 유지되는 임시 저장소 기능입니다.
- 저장: request.setAttribute(name, value)
- 조회: request.getAttribute(name)
세션 관리 기능
- request.getSession(create: true)
이에 자세한 내용은 차차 해볼테니, 지금은 "아~ 이런것이 있구나" 정도면 이해해주시면 될 것 같습니다.
이제 HttpServletReqeust 메서드 및 기본 사용법으로 넘어가기 전에 간단하게 이전 내용을 짚고 가보겠습니다.
HttpServletRequest 메서드 및 기본 사용법
요청 정보 조회 메서드
- getMethod() : GET, POST 또는 PUT과 같은 요청에 사용된 HTTP 메서드를 가져옵니다.
- getRequestURI(), getRequestURL() : 요청된 URI 및 URL을 가져옵니다.
- getQueryString() : URL의 쿼리 문자열 부분에 액세스합니다.
- getHeader(), getHeaders(), getHeaderNames() : 요청 헤더 및 관련 정보를 검색합니다.
- getRemoteAddr() : 클라이언트의 IP 주소를 얻습니다.
요청 매개변수 처리
- getParameter() : 특정 요청 매개변수의 값을 검색합니다.
- getParameterValues() : 주어진 매개변수 이름에 대한 여러 매개변수 값을 얻습니다.
- getParameterMap() : 모든 요청 매개변수 및 해당 값의 맵을 검색합니다.
세션 데이터 작업
- getSession() : 요청과 관련된 HttpSession 검색
- getSession(참) : 존재하지 않는 경우 새 세션을 생성합니다.
- getSession(거짓) : 기존 세션을 검색하거나 존재하지 않는 경우는 null을 반환합니다.
- setAttribute() 및 getAttribute() : 세션 속성 저장 및 검색
파일 업로드 처리
- getParts() : multipart/form-data 요청의 일부를 검색합니다. (파일 업로드에 유용)
- getPart() : 멀티파트 요청의 특정 부분에 액세스합니다.
추가로 처음 Http 요청 메시지를 설명 드릴 때 START LINE, 헤더, 바디 이렇게 세 구조로 나눌 수 있다고 했는데, 일부 메서드들을 확인해보도록 하겠습니다.
START-LINE 정보를 출력하는 메서드 입니다.
System.out.println("request.getMethod() = " + request.getMethod()); //GET
System.out.println("request.getProtocol() = " + request.getProtocol()); //HTTP/1.1
System.out.println("request.getScheme() = " + request.getScheme()); //http
// http://localhost:8080/test/request
System.out.println("request.getRequestURL() = " + request.getRequestURL());
// /test/request
System.out.println("request.getRequestURI() = " + request.getRequestURI());
System.out.println("request.getQueryString() = " +request.getQueryString());
System.out.println("request.isSecure() = " + request.isSecure()); //https 사용유무
Header 편리한 조회 메서드
//Header 편리한 조회
System.out.println("[Host 편의 조회]");
System.out.println("request.getServerName() = " + request.getServerName()); //Host 헤더
System.out.println("request.getServerPort() = " +equest.getServerPort()); //Host 헤더
System.out.println("[Accept-Language 편의 조회]");
request.getLocales().asIterator()
.forEachRemaining(locale -> System.out.println("locale = " + locale));
System.out.println("request.getLocale() = " + request.getLocale());
System.out.println("[cookie 편의 조회]");
if (request.getCookies() != null) {
for (Cookie cookie : request.getCookies()) {
System.out.println(cookie.getName() + ": " + cookie.getValue());
}
}
System.out.println("[Content 편의 조회]");
System.out.println("request.getContentType() = " + request.getContentType());
System.out.println("request.getContentLength() = " + request.getContentLength());
System.out.println("request.getCharacterEncoding() = " + request.getCharacterEncoding());
기타 정보 메서드
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("[Local 정보]");
System.out.println("request.getLocalName() = " + request.getLocalName());
System.out.println("request.getLocalAddr() = " + request.getLocalAddr());
System.out.println("request.getLocalPort() = " + request.getLocalPort());
이렇게 START-LINE 정보와 헤더 정보 조회방법을 배워보았다.
바디 정보 조회 방법은 내용이 많기 때문에 따로 이후에 포스팅에 작성 예정이다.
HttpServletRequest 예제
간단한 서블릿 만들기
간단한 예제로 쿼리 파라미터를 이용하여 "username" 변수에 값을 출력하는 서블릿을 생성해보겠습니다.
@WebServlet(name = "testServlet", urlPatterns = "/test/request")
public class RequestTest extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String welcomeText = "Welcome!! " + username;
//이 부분은 공부하지 않았으므로 그냥 welcomText 를 화면에 출력하는 역할이라고 이해
response.getWriter().write(welcomeText);
}
}
위 코드를 간단하게 분석을 해보자면 @WebServlet 애노테이션은 서블릿을 정의하고 설정하는 애노테이션입니다.
기존의 'web.xml' 파일을 사용하는 대신 애노테이션을 통해 서블릿을 더 간편하게 등록하고 구성할 수 있게 해줍니다.
속성에 name, urlPatterns 를 사용하였는데요, 이해를 돕기 위해 간단하게 그림을 그려보았습니다.
name 속성은 만들어지는 서블릿(Servlet) 이름을 설정합니다.
urlPattern 속성은 서블릿이 반응할 URL 패턴을 지정합니다.
문자열 배열을 이용하여 여러 URL 패턴을 지정할 수도 있습니다.
즉, 클라이언트가 /test/request URL 주소로 요청을 보내면 서블릿 컨테이너에 있는 testServlet 서블릿이 호출이 됩니다.
아래 사진은 Postman 프로그램을 사용하여 서버로 요청을 보낸 사진입니다.
다음과 같이 /test/request?username=baek 이라고 작성하고 요청을 보냈는데, /test/request 부분은 URL, 그리고 ? 뒤에 있는 username=baek 이 바로 쿼리 파라미터 입니다.
간단하게 설명하자면 username 변수에 baek 이라는 값을 넣을거야! 이렇게 되는 것이죠.
@WebSevlet 주요 속성
- name : 서블릿의 이름을 지정. 이 이름은 서블릿 컨테이너 내에서 유니크해야 합니다.
- urlPatterns : 서블릿이 반응할 URL 패턴을 지정합니다. 문자열 배열로 여러 URL 패턴을 지정할 수 있습니다.
- loadOnStartup : 서블릿이 웹 애플리케이션 시작 시 자동으로 로드되어야 하는 순서를 지정합니다. 숫자가 작을수록 먼저 로드됩니다.
- initParams : 서블릿 초기화 파라미터를 지정합니다. @WebInitParam 애노테이션을 사용하여 이름과 값을 제공합니다.
- asyncSupported : 비동기 처리를 지원하는지 여부를 지정합니다. true로 설정하면 서블릿이 비동기 모드에서 작동할 수 있습니다.
참고(출처)
https://seasome1.com/httpservletrequest/#httpservletrequest
인프런 김영한님의 스프링 MVC 1편 강좌 참고
'Spring | Spring Boot' 카테고리의 다른 글
[Spring] HttpServletRequest 요청 데이터 전송 3가지 방법 (0) | 2024.05.15 |
---|---|
[Spring] HttpServletResponse 기본 사용법 및 응답 데이터 처리 (0) | 2024.05.14 |
[Spring] 빈 스코프(Bean Scope) 완벽하게 이해하기 (1) | 2024.04.30 |
[Spring] 싱글톤 패턴이란? 그리고 스프링에서의 싱글톤 (0) | 2024.04.25 |
[Spring] 빈 생명주기 콜백 - 꼬리에 꼬리를 물고 완벽 이해하기 (1) | 2024.04.24 |
- Total
- Today
- Yesterday
- 요청데이터
- 스프링특징
- 스프링http
- 추상클래스
- Spring
- 빈생명주기콜백
- 인터페이스 추상클래스 비교
- 자바
- HTTP요청
- 인터페이스
- 객체지향설계원칙
- erd툴
- 크롤링
- Overloding
- 스프링
- Thymeleaf
- 네이버지도크롤링
- Java
- HttpServletRequest
- redirectattribute
- 인식안됨
- RequiredArgsConstruct
- Servlet
- erd editor
- 타임리프
- 스프링 컨테이너
- 타임리프 기본기능
- 스프링 빈
- 인터페이스 추상클래스 차이
- 요청매핑
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |