WAS는 개발자가 처리해야하는 많은 작업들을 대신 해줍니다.
위 그림은 만약 WAS가 없었다면 개발자가 직접 코딩해야 하는 작업들을 나타냅니다. 이를 통해 개발자는 중요한 비즈니스 로직에 좀 더 집중할 수 있는 것 이지요.
WAS는 그럼 어떤식으로 비즈니스 로직을 수행할까요?
바로 그 유명한 서블릿을 사용합니다.
자바 서블릿은 자바를 사용하여 웹페이지를 동적으로 생성하는 서버측 프로그램 혹은 그 사양을 말하며, 흔히 "서블릿"이라 불린다. 자바 서블릿은 웹 서버의 성능을 향상하기 위해 사용되는 자바 클래스의 일종이다. <위키피디아>
위키에서 서블릿을 검색해보면 뭐 어쩌구 저쩌구 해서 "웹페이지를 동적으로 생성하는 자바 클래스의 일종"이라고 설명하고 있습니다.
다시 말하자면 WAS가 웹 페이지를 동적으로 만들 때, 그 로직을 담을 수 있는 클래스입니다.
아래 그림처럼 먼저 WAS는 Http 요청 메세지를 파싱하여 Requset, Response 객체를 만들고, 같은 url에 매핑되는 서블릿을 호출합니다.
그럼 서블릿은 넘겨받은 Request 객체를 사용하여 개발자가 코딩해 놓은 비즈니스 로직을 수행해, 그 결과를 Response 객체에 담습니다.
Was는 이렇게 만들어진 Response 객체를 Http 응답 메세지로 변환시켜 클라이언트에게 전달해 줍니다.
서블릿은 아래 코드처럼 HttpServlet을 상속받음으로서 사용할 수 있습니다.
@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response){
//애플리케이션 로직
}
}
Http method 정보 (GET, POST ...)
String method = request.getMethod();
Protocol
String protocol = request.getProtocol();
URL
StringBuffer requestURL = request.getRequestURL();
URI
String requestURI = request.getRequestURI();
Https 인지 Http인지
boolean secure = request.isSecure();
Header key 조회
Enumeration<String> headerNames = request.getHeaderNames();
while(headerNames.hasMoreElements()){
String headerName = headerNames.nextElement();
System.out.println(headerName );
}
// 결과
host
connection
cache-control
sec-ch-ua
sec-ch-ua-mobile
sec-ch-ua-platform
upgrade-insecure-requests
user-agent
accept
sec-fetch-site
sec-fetch-mode
sec-fetch-user
sec-fetch-dest
accept-encoding
accept-language
Header 값 조회
var result = request.getHeader("헤더 키 값");
또 다른 Header 조회 방법
Host
String serverName = request.getServerName(); // localhost
int serverPort = request.getServerPort(); // 8080
Locale
Locale locale = request.getLocale(); // ko
쿠키
if (request.getCookies() != null) {
for (Cookie cookie : request.getCookies()) {
System.out.println(cookie.getName() + ": " + cookie.getValue());
}
}
ContentType
String contentType = request.getContentType();
ContentLength
int contentLength = request.getContentLength();
CharacterEncoding
String characterEncoding = equest.getCharacterEncoding();
Http 요청 데이터는 대부분 3가지 방식을 사용합니다.
GET - 쿼리 파라미터
POST - HTML Form
HTTP message body
JSON, XML, TEXT 등등
쿼리 파라미터와 Form데이터는 동일한 메서드로 조회가능합니다.
모든 파라미터 key 조회.
Enumeration<String> parameterNames = request.getParameterNames();
단일 파라미터 조회
String userName = request.getParameter("username");
String age = request.getParameter("age");
이름이 같은 복수 파라미터 조회
String[] usernames = request.getParameterValues("username");
메세지 바디에 담긴 데이터를 String 타입으로 받아볼 수 있다.
ServletInputStream inputStream = request.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
참고: JSON 데이터일 경우 ObjectMapper를 이용해 객체에 바로 매핑이 가능하다.
<출처>
Inflearn 김영한 선생님, 스프링 MVC1편 - 백엔드 웹 개발 핵심 기술.