- Today
- Total
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 에러핸들링
- 알고리즘
- 아고라스테이츠
- CRUD
- Refactoring
- TIL
- 코어 자바스크립트
- mongodb
- TMIL
- java
- Git
- 배포
- react
- 오늘도 개발자가 안된다고 말했다
- 프로그래머스
- First Project
- 면접을 위한 cs 전공지식 노트
- 리팩터링 2판
- TWIL
- Docker
- LEVEL1
- CSS
- LEVEL 1
- javascript
- MariaDB
- LEVEL 2
- typescript
- sql
- 코딩테스트
- Err-Handling
성장에 목마른 코린이
[Java] Jetty Architecture 및 Servlet Container 본문
Jetty는 Java HTTP Web Server이자 Java Servlet Container입니다.
웹 서버가 보통 문서를 사람들에게 제공하는 것과 관련된 반면,
Jetty는 대규모 소프트웨어 프레임워크에서 기계와 기계의 커뮤니케이션에 사용됩니다.
서블릿(servlet)이란 SUN 사에서 제안한 웹서비스를 위한 인터페이스로, javax.servlet.Servlet 인터페이스의 구현체입니다.
일반적인 자바 독립 실행 프로그램과 달리 main 메소드가 없으며,
서블릿 컨테이너에 등록된 후 서블릿 컨테이너에 의해 생성, 호출, 소멸이 이루어집니다.
즉, 클라이언트가 request를 보내면 그에 대한 결과를 다시 전송해주어야 하는데, 이러한 역할을 하는 자바 프로그램이 서블릿입니다.
일반적으로 웹 서버는 정적인 페이지만 제공하지만, 동적인 페이지를 제공할 수 있게 도와주는 어플리케이션이 서블릿입니다.
서블릿 컨테이너는 이러한 서블릿을 관리하며 네트워크 통신, 서블릿의 생명주기 관리, 스레드 기반의 병렬처리를 대행합니다.
즉, 웹 클라이언트로부터 HTTP Request가 들어오면 해당 Request를 해석해
적정한 서블릿의 service 메소드를 ServletRequest, ServletResponse 매개변수와 함께 호출합니다.
서블릿 컨테이너의 예시로는 톰캣(Tomcat), 그리고 제티(Jetty) 등이 있습니다.
서블릿 컨테이너의 역할
1. 웹 서버와의 통신지원
서블릿 컨테이너는 서블릿과 웹서버가 손쉽게 통신할 수 있게 해줍니다.
일반적으로는 소켓을 만들고 listen, accept 등을 해야하지만
서블릿 컨테이너는 이러한 기능을 API로 제공해 복잡한 과정을 생략할 수 있게 해줍니다.
2. 서블릿 생명주기 관리
서블릿 클래스를 로딩하여 인스턴스화하고, 초기화 메소드를 호출하고, 요청이 들어오면 적절한 서블릿 메소드를 호출합니다.
또한 서블릿이 죽게되면 Garbage Collection을 진행해 적절하게 메모리 관리도 해줍니다.
3. 멀티쓰레드 지원 및 관리
서블릿 컨테이너는 요청이 올때마다 자바 쓰레드를 하나 생성하는데,
HTTP 서비스 메소드를 실행하고 나면 쓰레드는 자동으로 죽게됩니다.
원래는 쓰레드를 관리해야하지만 서버가 멀티 스레드를 생성 및 운영해줘 스레드의 안정성에 대해 걱정하지 않아도 됩니다.
Jetty Architecture
제티 서버는 커넥션을 받아들이는 'Connector'의 모음과 연결 요청을 처리하고 응답을 생성하는
'Handler' 모음과 작업을 수행하는 ThreadPool의 스레드 사이에서의 plumbing(배관) 역할을 합니다.
Jetty의 request/response 서블릿 API로부터 나오지만
서블릿 API의 모든 기능은 적절한 핸들러를 설정한 경우에만 사용할 수 있습니다.
서블릿 자체의 개념은 ServletHandler에 의해 구현됩니다.
서블릿을 사용하지 않고 Connector들과 Handler들만으로 제티 서버를 빌드할 수 있습니다.
Connectors
커넥터는 TCP 커넥션을 받아들이는 컴포넌트입니다.
Accept된 각각의 TCP 커넥션은 Connector가 특정 프로토콜을 위한 바이트들을 생성하고 파싱하는 TCP 커넥션에 있는 네트워크 트래픽을 조절하는 Connection 오브젝트를 생성하기 위해 ConnectionFactory에 요청을 합니다.
Handlers
핸들러는 HTTP request와 response를 다루는 컴포넌트입니다.
핸들러의 코어 API는 handle이라는 메소드입니다.
public void handle(String target, Request baseRequest, HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException
// 파라미터
target - URI나 이름 같은 request의 타겟
baseRequest - the original unwrapped request object
request - baseRequest 오브젝트 혹은 baseRequest wrapper 같은 요청 오브젝트
response - response로 unwrapped된 것 혹은 그 response의 wrapper 같은 response 오브젝트
Servlet Handler
서블릿 핸들러는 request를 설정된 서블릿 필터로 전달한 후,
URI 패턴으로 맵핑된 서블릿에 전달하여 content를 생성하는 핸들러입니다.
Contexts
Contexts는 특정 URI context path나 가상 호스트 아래에 있는 핸들러들을 그룹화하는 핸들러입니다.
'Java' 카테고리의 다른 글
[Java] Apache Tomcat (0) | 2022.11.01 |
---|---|
[Java] Web Server vs WAS vs Web Container (0) | 2022.11.01 |
[Java] Netty Framework 소개 (0) | 2022.10.31 |
[Java] enum 클래스의 사용과 이해 (0) | 2022.10.31 |
[Java] Lombok Annotation (0) | 2022.10.21 |