WAS
톰캣이다.
톰캣은 Java servlet을 관리한다.
톰캣외에도 WAS가 있지만 톰캣을 가장 많이 사용
역할
통신지원
멀티 스레드 관리
서블릿 생명주기 관리
세션 관리
동작방식
Request, Response 객체 생성 -> servlet에게 전달 /스프링/ spring dispatcher servlet
용어 정리
✔ Socket
IP + Port
HTTP도 Socket을 사용함, Web Socket 통신이 아닐뿐임
✔ HTTP 통신
요청에 대한 응답을 주고 바로 통신을 해제
TCP 위에서 보편적으로 사용, UDP 위에서도 사용가능함 (Youtube QUIC)
✔ Web Socket 통신
HTTP와 달리 통신을 유지하며 실시간 통신 지원
처음 요청시 HTTP Get 으로 Upgrade:web socket 헤더를 추가하여 보냄
✔ Web Server
HTTP, HTTPS 통신을 위해 Server는 (IP + 80번, 443번)으로 socket 생성
정적인 데이터를 응답
✔ Web Container == Servlet Container
웹 컨테이너는 자바 서블릿과 상호작용한다.
동적인 처리를 위한 Servlet들이 모인 Container, JAVA에서는 동적 처리로 Servlet을 이용한다.
클라이언트의 URL에 맞는 Servlet을 매핑
(스프링에서는 Dispatcher Servlet 하나의 Servlet으로 URL에 맞는 Controller를 Handler Mapping)
- 서블릿 객체의 생명주기 담당
- 싱글톤 패턴으로 관리
- 멀티 스레딩 지원
✔ Web Container Server == Web Application Server(WAS)
Web Container + Web Server
요청에 대한 동적인 데이터를 처리하여 응답
WAS에도 Web Server가 존재하지만 보안, 로드밸런싱, 정적데이터 처리를 위해 Web Server를 앞단에 하나 더 둠
JSP 라이프 사이클
- 클라이언트가 URI로 JSP 파일을 서버에 요청
- 톰캣이 서버에 해당 JSP 파일이 있다면 JSP파일 -> JAVA파일 -> JAVA파일 컴파일 -> 서버 메모리에 로드
- init() 메서드 호출 -> service() 메서드 호출 -> HTTP response 로 응답
(jsp)자바파일의 변경이 없다면 -> 기존 메모리에 있는 instance service()로 바로 응답
(jsp)자바파일의 변경이 있다면 -> 기존 instance destroy() 메모리 해제 -> instance 새로 생성 -> init() -> service()
톰캣이 jsp 파일을 servlet instance로 만들어서 요청에대한 응답을 한다.
작성한 jsp 파일
톰캣이 생성한 jsp 파일.java
service() 메서드 일부
톰캣이 작성된 jsp 파일을 java class(servlet)으로 변환하고, service()메서드를 통해 요청을 처리한 후 응답한다.
Servlet
HTTP 의 request 를 처리하고 response를 돌려주는 동적인 처리를 위한 자바 기술
톰캣이 jsp를 class로 만들고 이 class는 요청을 처리하므로 사실 jsp는 servlet이다.
- jsp보다 servlet이 먼저 등장했으며, servlet에서의 html 처리가 불편하여 jsp가 등장
- jsp는 서버에서 데이터를 렌더링하여 html을 만들어서 전달하므로 Server Side Rendering(SSR)이라 한다.
- 클라이언트에서 데이터를 받아 처리하는 것은 Client Side Rendering(CSR) - Vue, React
jsp를 이용하지 않고 직접 servlet에 HTML을 작성할 수도 있다.
- 직접 작성한 servlet을 이용하게 되면 클라이언트의 요청을 jsp를 거치지 않고 servlet이 직접 받을 수 있다.
jsp파일은 view에 집중할 수 있게 되고,
작성한 servlet은 요청에 대한 로직을 처리하는 controller 역할만을 하게되어
jsp파일 내에서 혼합되어 처리되던 html코드와 자바 로직 코드 부분을 분리시켜 MVC 패턴을 적용시킬 수 있다.
Dispatcher Servlet
URL를 통해 서버에 요청이 오면 매핑된 servlet이 해당 요청을 받아준다.
이러한 요청에 맞는 servlet들을 일일이 작성해주어야 했는데 이 부분을 한곳에서 관리하고자 front controller라는 개념이 등장했다.
front controller는 한곳에서 URL과 controller를 매핑해주며, 요청에 위임할 controller에게 다시 요청한다.
spring framework은 dispatcher servlet으로 MVC패턴을 쉽게 구현할 수 있게 틀을 제공해준다.
클라이언트가 서버에게 HTTP 요청을 하면
요청을 받게되면 Servlet Container가 HttpServletReqeust, HttpServletResponse 객체 생성
Dispatcher Servlet으로 해당 URL에 맞는 Controller를 찾아서 비즈니스 로직 수행
이때 Controller에서 HttpServletReqeust의 값을 이용하여 로직 처리
View Resolver로 해당 view를 찾아 HttpServletReqeust, HttpServletResponse에 결과를 View에 렌더링한 후 HTTP header, body 응답
참고
https://www.theserverside.com/feature/Understanding-How-the-Application-Servers-Web-Container-Works
'프로그래밍 > Servlet \ JSP' 카테고리의 다른 글
서블릿/JSP (0) | 2022.07.19 |
---|