WAS
웹 서버 VS 웹 애플리케이션 서버(WAS)
- 공통점 : HTTP 기반 동작
- 차이점 :
- Web server -> 정적 리소스(파일 - HTML, CSS, JS 등)
- WAS -> 애플리케이션 로직(HTTP API, 서블릿, JSP, 스프링 MVC 등)
- 사실 둘의 용어도 경계가 모호함
- 결론 : WAS는 애플리케이션 코드를 실행하는데 더 특화
웹 시스템 구성 - WEB, WAS, DB
- 정적 리소스가 많이 사용되면 Web 서버 증설
- 애플리케이션 리소스가 많이 사용되면 WAS 증설
서블릿
- 개발자는 HTTP 스펙을 매우 편리하게 사용 가능
- HTTP 요청시
- WAS는 Request, Response 객체를 새로 만들어서 서블릿 객체 호출
- 개발자는 Request 객체에서 HTTP 요청 정보를 편리하게 꺼내서 사용
- 개발자는 Response 객체에 HTTP 응답 정보를 편리하게 입력
- WAS는 Response 객체에 담겨있는 내용으로 HTTP 응답 정보를 생성
- 서블릿 컨테이너
- 톰캣처럼 서블릿을 지원하는 WAS
- 싱글톤으로 관리 -> 공유 변수 사용 주의
- 동시 요청을 위한 멀티 쓰레드 처리 지원
[동시요청 - 멀티 쓰레드]
- 쓰레드 : 애플리케이션 코드를 하나하나 순차적으로 실행하는 것
- application > process > thread
- 동시 처리가 필요하면 쓰레드를 추가로 생성
- 쓰레드 풀 : 필요한 쓰레드를 쓰레드 풀에 보관하고 관리
- 모두 사용시? => 거절, 대기 가능
- CPU 절약, 속도 향상
- WAS의 주요 튜닝 포인트는
최대 쓰레드(max thread) 수
이다.
- 결론
- 멀티 쓰레드에 대한 부분은 WAS가 처리
- 개발자는 싱글 쓰레드 프로그래밍을 하듯이 편리하게 소스 코드를 개발
- 멀티 쓰레드 환경이므로 싱글톤 객체(서블릿, 스프링 빈)는 주의해서 사용
데이터 전송 방식
- 정적 리소스
- HTML 페이지(동적)
- HTTP API
- JSON 형식의 데이터 전달
- 데이터만 주고 받음. UI 화면이 필요하면, 클라이언트가 별도 처리
- 서버to서버, 앱클라이언트to서버, 웹클라이언트to서버
SSR(서버 사이드 렌더링), CSR(클라이언트 사이드 렌더링)
- SSR
- HTML 최종 결과를 서버에서 만들어서 웹 브라우저에 전달
- 주로 정적인 화면에 사용
- 관련 기술 : JSP, 타임리프 -> 백엔드 개발자
- CSR
- HTHML 결과를 JS를 사용해 웹 브라이저에서 동적으로 생성해서 적용
- 주로 동적인 화면에 사용, 웹 환경을 마치 앱처럼 필요한 부분부분 변경할 수 있음
- 관련 기술 : React, Vue.js -> 웹 프론트엔드 개발자
HttpServletRequest
- 서블릿은 개발자가 HTTP 요청 메시지를 편리하게 사용할 수 있도록 개발자 대신에 HTTP 요청 메시지를 파싱한다. 그리고 그 결과를
HTTPServletRequest
객체에 담아서 제공한다
- 임시 저장소 기능
- 저장 : request.setAttribute(name, value)
- 조회 : request.getAttribute(name)
- 세션 관리 기능
- request.getSession(create: true)
HTTP 요청 데이터
- GET - 쿼리 파라미터
- /url?username=hello&age=20
- 메시지 바디 없이, URL의 쿼리 파라미터에 데이터를 포함해서 전달
- 검색, 필터, 페이징 등에서 많이 사용되는 방식
- POST - HTML Form
- content-type: application/x-www-form-urlencoded
- 예) 회원 가입, 상품 주문, HTML Form 사용
- HTTP message body에 데이터를 직접 담아서 요청
- HTTP API에서 주로 사용, JSON, XML, TEXT
- 데이터 형식은 주로 JSON 사용 -> POST, PUT, PATCH
- JSON 결과를 파싱해서 사용할 수 있는 자바 객체로 변환 -
HTTPServletResponse
HTTP 응답 메시지 생성 : HTTP 응답 코드 지정, 헤더 생성, 바디 생성
편의 기능 제공 : Content-Type, 쿠키, Redirect
HTTP 응답 데이터
- 단순 텍스트 응답 :
writer.println("ok");
- HTML 응답 :
writer.println("<html>");
HTTP 응답으로 HTML을 반환할 때는 content-type
을 text/html
로 지정해야 한다.
- HTTP API -
MessageBody JSON
응답
HTTP 응답으로 JSON을 반환할 때는 content-type을 application/json
으로 지정해야 한다. Jackson 라이브러리가 제공하는 objectMapper.writeValueAsString()
을 사용하면 객체를 JSON 문자로 변경할 수 있다.