Spring Boot, 너 대체 어떻게 작동하는건데?

도비·2023년 9월 27일
1

Spring Boot

목록 보기
1/13
post-thumbnail

Spring Boot 내부 작동 원리에 대해서 알기 전에, 우리는 Web Server와 WAS에 대해서 알고 넘어가야 합니다.

근데 Web Server와 WAS에 대해 알고 넘어가기 전에, 우리는 Static pages와 Dynamic pages에 대해서 먼저 알고 가야합니다.

천천히 가시죠..

Static Pages, Dynamic Pages

Static pages

image, html, css 파일과 같이 컴퓨터에 저장되어 있는 파일들을 의미합니다.

웹 서버에서 요청에 알맞은 파일을 반환하며, 항상 동일한 페이지(정적인 컨텐츠)를 반환합니다.

이 정적인 페이지(Static Pages)는 웹 서버에서 제공합니다.

Dynamic pages

들어온 요청에 맞게 동적으로 만들어진 컨텐츠를 의미합니다.

데이터베이스, 서버 내 로직등을 활용해 만들어진 컨텐츠를 반환합니다.

이 Dynamic Page는 웹 어플리케이션 서버에서 제공합니다.


오 조금은 이해가 가는 듯 합니다!

Web Server, WAS(웹 어플리케이션 서버)

Web Server "웹 서버"

웹 서버는 위에도 설명했듯이 HTTP 요청을 받아 Static contents를 제공하는 서버, 프로그램입니다.

  • HTTP 프로토콜을 기반으로 하여 클라이언트의 요청을 서비스하는 기능을 담당합니다.

웹 서버는 정적인 컨텐츠를 제공하거나, 동적인 컨텐츠 제공을 위한 요청을 전달합니다.(요청을 WAS에 보내고, WAS가 처리한 결과를 클라이언트에게 전달합니다.)

WAS "웹 어플리케이션 서버"

다양한 서버 내 알고리즘, 비지니스 로직, DB 조회 등 클라이언트 요청에 따라 동적인 컨텐츠를 제공하는 서버, 프로그램입니다.

그렇다면 WAS에서 웹 컨테이너는 무엇인가요?

웹 컨테이너는 웹 서버가 보낸 요청을 수행하고 그 결과를 웹 서버로 다시 보내주는 역할을 합니다.

결국 정리해보자면, WAS는 웹 서버에서 요청을 받고, 이를 웹 컨테이너로 보내 로직을 수행하고 그 결과를 다시 웹 서버를 통해 최종적으로 클라이언트에게 보내주는 역할을 합니다.

Java는 웹 구현 기술로 Servlet을 사용합니다. 그래서 자바의 WAS(톰캣)은 Web Server + Servlet Container로 구성되어있다고 볼 수 있겠죠?

그러면 서블릿과 서블릿 컨테이너를 알아봅시다!

Servlet(서블릿)과 Servlet Container(서블릿 컨테이너)

Servlet(서블릿)

서블릿은 클라이언트의 요청을 처리하고 그 결과를 반환해주는 자바 웹 프로그래밍 기술입니다.
클라이언트가 요청을 하면 그에 대한 결과를 다시 전송해주는 역할을 자바 프로그램이 하는 것입니다.

이전의 웹 프로그램들은 클라이언트의 요청에 대한 응답으로 만들어진 페이지를 넘겨주었습니다.
웹 프로그래밍이 점점 발전하면서 응답을 가공하여 동적인 페이지를 작성할 수 있게 되었고, 그래서 웹 서버가 아닌 다른 곳에 도움을 요청하여 동적인 페이지를 작성하게 됩니다.

Servlet Container(서블릿 컨테이너)

서블릿 컨테이너는 서블릿들의 생성, 실행, 파괴를 담당합니다. 서블릿 컨테이너는 클라이언트의 요청을 받고 응답 할 수 있도록 웹 서버와 소켓으로 통신합니다.

즉, 서블릿 컨테이너는 어떤 요청에 대해 어떤 Servlet을 실행할 것인지 제어합니다!

서블릿 컨테이너의 동작원리

  1. 클라이언트가 URL을 통해 요청을 보내면 HTTP Request를 Servlet Container로 전송합니다!
    -> 웹브라우저 주소창에 입력한 주소를 웹서버가 받아 서블릿 컨테이너로 전송하는 것입니다

  2. HTTP Request를 전송받은 Servlet Container는 HttpServletRequest, HttpServletResponse 두 객체를 생성합니다.
    -> 클라이언트에서 보낸 요청에 담긴 파라미터, 메시지에 데이터 등 다양한 정보를 생성된 객체에 담습니다

  3. 요청 URL을 분석하여 어느 서블릿에 대해 요청을 한 것인지 찾습니다
    -> 사용자(개발자)가 web.xml에 맵핑한 서블릿 중에서 클라이언트가 요청한 URL과 비교하여 같은 서블릿을 찾습니다

  4. 해당 서블릿에서 service 메서드를 호출 한 후 POST, GET 여부에 따라 doGet() 또는 doPost()를 호출합니다.
    -> 자바로 만들어진 메서드들을 호출하여 메서드 여부에 따라 이를 호출합니다

  5. doGet() 혹은 doPost() 메서드는 동적 페이지를 생성한 후에 HttpServletResponse 객체 응답을 보냅니다.
    -> 클라이언트에게 동적페이지를 제공합니다

자 그러면, Dispatcher Servlet은 무엇인가요?

  • 클라이언트가 요청을 보내면 Servlet Container가 요청을 받습니다. 이 때 제일 앞에서 서버로 들어오는 모든 요청을 처리하는 Front Controller라는 것을 Spring에서 정의하였고, 이를 DispatcherServlet이라고 합니다.

  • 기존에는 모든 Servlet에 대해 URL 매핑을 활용하기 위해서 web.xml에 모두 등록해주어야 했지만, dispatcher servlet이 해당 어플리케이션으로 들어오는 모든 요청을 핸들링해줍니다.

    • Spring Boot에서는 @SpringBootApplication 이라는 어노테이션으로 web.xml 파일을 대체할 수 있습니다.

Spring Boot 동작 원리 (자 이제 드디어 Tomcat에 대하여 알아볼까요?)

스프링 부트는 내장 톰캣을 가지고 있어 따로 설치할 필요가 없이 바로 실행됩니다.

톰캣(Tomcat)

Tomcat은 Servlet 컨테이너를 관리하는 WAS(웹 어플리케이션 서버)입니다!

만일 정적자원이 아닌 .jsp파일 혹은 java 코드가 적혀져 있는 자원을 요청하는 경우 웹 서버는 해당 파일을 이해하지 못하기 때문에 제어권을 톰캣(Tomcat)에 넘겨 처리하도록 합니다.

Tomcat은 어떻게 작동할까요?

  • Tomcat안에는 스레드 풀이 있습니다.

어? 스레드, 스레드 풀이 뭔데요...🤔
스레드란, 실행중인 프로그램에서 실제로 작업을 수행하는 단위를 의미합니다. 자바 기반 프로그램에서 서블릿을 호출하는 것이 바로 스레드입니다.
스레드 풀이란, 스레드를 미리 생성하고 관리하여 필요한 곳에서 사용할 수 있도록 제공해줍니다.

이때, 스레드는 애플리케이션 코드를 하나하나 순차적으로 실행하여 한 번에 하나의 코드라인만 실행하게 됩니다.

스레드 풀을 사용하면, 미리 생성되었던 스레드를 꺼내 사용하고 쓰레드풀에 반납합니다.

정리해봅시다!

  • Tomcat은 다중 요청을 처리하기 위해 스레드풀에 스레드를 미리 만들어둡니다.

  • 유저의 요청이 들어오면 스레드 풀에서 스레드를 미리 할당하고, 이 스레드가 필터부터 디스패처 서블릿을 거쳐가며 요청을 처리합니다.

  • 유저 요청(HttpServletRequest)가 들어오면 Thread Pool에서 하나씩 Thread를 할당합니다. 해당 Thread에서 스프링부트에서 작성한 Dispatcher Servlet을 거쳐 유저 요청을 처리합니다.

  • 작업이 끝나면 스레드는 스레드풀로 반환됩니다.


그렇다면 왜 스레드 풀에 미리 스레드를 생성해둘까요?

실제로 스레드를 생성하는데는 많은 시스템 자원이 필요한데, 미리 만들어두고 스레드를 재사용하기 위해 스레드 풀에 스레드를 생성해둡니다!


Dispatcher Servlet 이전의 Spring Boot 작동 원리에 대하여 짧게나마 살펴보았는데요!
혹시 모르겠는 부분이나 틀린 부분이 있다면 댓글 부탁드립니다!


참고
https://www.inflearn.com/questions/505167/%EC%84%9C%EB%B8%94%EB%A6%BF-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-was%EA%B0%80-%ED%97%B7%EA%B0%88%EB%A6%BD%EB%8B%88%EB%8B%A4
https://binux.tistory.com/32
https://tecoble.techcourse.co.kr/post/2021-05-23-servlet-servletcontainer/
https://riimy.tistory.com/87

profile
하루에 한 걸음씩

0개의 댓글