본문 바로가기

Server

Tomcat

톰캣의 역할

1. Servlet Container : Servlet에 대한 관리를 수행한다. Spring Boot의 Front-Controller인 Dispatcher Servlet도 여기에 포함된다.

2. Web server와 통신을 위한 소켓을 만드는 역할을 수행한다. 사용자의 Request를 받기 위해 WebServer로부터 해당값을 전달받아야 하는데 이때 Socket을 만들어 통신하는 역할을 수행한다.

(Apache tomcat 5.5 이후 부터는 위에서 언급한대로 Web server의 기능인 httpd(웹서비스 데몬) native 모듈을 가지고와서 정적파일을 처리하기 때문에 별도의 Web server 기능에 뒤쳐지지 않는 정적파일 처리를 할 수 있습니다.)

3. 클라이언트로부터 request를 받을때마다 Thread를 생성해서 요청을 처리합니다. 해당 쓰레드는 Servlet Container에서Thread Pool을 별도로 관리하여 실행합니다.

 

 

요청이 전달되었을때 가정

1. Client로부터 Http Request를 전달받게 됩니다.

2. Web server에서 필요한 경우에 의해, Servlet container에게 해당 요청을 전달합니다.

(위와 가능한 이유는 Tomcat Was에 의해, Socket이 생성되는 과정과 Servlet Container에 Spring Boot의 Dispatcher Servlet이 등록되는 과정이 이루어졌기 때문입니다.)

3. Servlet Container에서는 Thread를 생성하고, Dispatcher Servlet init() 메소드를 호출합니다. ( 서블릿이 생성이 안되어 있을 경우 )

4. 생성된 Thread에서 Dispatcher Servlet의 Service() 메소드를 호출합니다.

5. Dispacher Servlet은 Front End Controller Pattern에 의해서, Handler Mapping에 해당 Request를 처리할 Controller가 등록되어 있는지 확인합니다.

6. 등록되어 있다면, Handler Adapter에게 해당 요청을 일임하고 Handler Adapter는 요청에 맞는 Controller를 호출합니다.

(이 과정에서 Spring의 Application Context에 Bean으로 등록되어 있는지를 추가적으로 봅니다)

7. Controller는 Service를 호출하고 Service는 Repository를 호출하여 응답값을 전달합니다.

8. view인지 아닌지에 여부에 따라서 응답되는 Resolver가 달라집니다. 

(view라는 ViewResolver가 호출되고, 그렇지 않다면 포멧(Json, XML등)에 따라 맞는 Resolver가 호출되어 응답되어집니다.

9. 그 응답은 다시 Tomcat -> Web Server -> Client에게 전달되고 Client는 자기가 요청한 값에 맞는 응답값을 받게 됩니다.

 

* 전체적인 과정은 위와 같지만, 추가적으로 고려해야 하는 여러 사항들이 있습니다.

1) Latency 문제 : Network 지연과 같은 이슈가 발생되어 질수 있습니다. 

2) Volumn 문제 : 전달되어야 하는 용량이 크다면, 마찬가지로 전달에 걸리는 시간이 길어질수 있습니다. 따라서, 전달되기 전에 최대한 압축을 해서 데이터를 전달해야 합니다.

 

개선 ?

위와 같이 Spring Framework는 Web Application Service를 하기 위해서는 Tomcat를 필요로 합니다.

이는 Service와 비즈리스 로직에만 집중해야 할 개발자들에게 불편함을 초래할수 있습니다.

따라서, Spring Boot라는 내장 Tomcat을 가지고 있는 Famework를 만들게 되었고 위와 같은 문제에서 해결될수 있었습니다.

 

기존 Spring이 Tomcat을 실행시키고 Spring을 실행 후 연결하여 사용하는 구조라면,

Spring Boot에서는 java *.jar만 실행시킨다면 원활하게 웹서비스가 가능합니다.

하지만, 구조를 아는것과 알지 못하는것은 큰 차이가 존재하므로 해당 구조를 인지하는 것이 중요하다 생각합니다.

 

톰캣은 그럼 스프링을 위해 ?

우리가 Spring으로 하는 일련의 과정들은 Tomcat의 Servlet에 Dispatcher Servlet이라는 하나의 Servlet을 배포하기 위한 과정이라고 생각하시면 됩니다.

Tomcat의 Servlet Container에서 다루는 수많은 Servlet중 하나가 Spring의 Dispacher Servlet일 뿐이지. 언제나 주객이 전도되지 않도록 유의해야 합니다.

'Server' 카테고리의 다른 글

Tomcat ThreadPool  (0) 2023.08.18
HTTP 상태코드  (0) 2022.02.05
Java EE와 Servlet/JSP의 관계와 WAS 개념 정리  (0) 2022.01.25
분산 시스템  (0) 2022.01.25
Was란 무엇인가  (0) 2022.01.25