본문 바로가기

백엔드

[Spring] 스프링의 작동 원리

728x90

/* 서블릿 컨테이너와 스프링 컨테이너 WEB 요청이 들어올 때*/

 

  • 서블릿 컨테이너와 디스패처 서블릿 (DispatcherServlet)
    • HTTP 요청이 들어오면 서블릿 컨테이너(예: Tomcat)가 이를 받아들이고, 스프링 MVC의 엔트리 포인트인 DispatcherServlet으로 요청을 전달합니다. DispatcherServlet은 스프링의 핵심 컴포넌트로, 모든 요청을 받고 필요한 처리를 이어가는 역할을 합니다.
  • 스프링 컨테이너와 빈 관리
    • DispatcherServlet이 요청을 받으면, 요청을 처리할 **핸들러 매핑 (Handler Mapping)**을 찾아 알맞은 컨트롤러 (Controller) 빈을 결정합니다. 이 과정에서 스프링 컨테이너에 미리 정의된 빈 (Bean)들이 활용됩니다. 빈은 스프링 애플리케이션 컨텍스트(ApplicationContext)에서 관리되며, 의존성 주입을 통해 필요한 객체들이 자동으로 연결됩니다.
  • 컨트롤러 호출 및 서비스 로직 처리
    • 핸들러 매핑을 통해 결정된 컨트롤러 메서드가 호출되고, 비즈니스 로직을 처리하는 서비스 계층(Service Layer)을 호출하여 요청에 맞는 작업을 수행합니다. 여기서 데이터베이스 조회나 비즈니스 로직이 실행됩니다.
  • 뷰 리졸버와 응답 생성
    • 컨트롤러에서 요청 처리가 완료되면, 뷰 리졸버(View Resolver)가 동작하여 어떤 뷰(View)로 응답할지 결정합니다. 예를 들어, JSP 또는 Thymeleaf와 같은 뷰 템플릿을 이용해 사용자에게 보여줄 HTML 페이지를 렌더링하거나, JSON 형태의 응답을 반환할 수 있습니다.
  • 응답 반환
    • 마지막으로 DispatcherServlet은 생성된 응답을 서블릿 컨테이너로 전달하고, 서블릿 컨테이너는 이를 HTTP 응답으로 클라이언트에게 반환합니다.

/* WAS*/

WAS는 웹 애플리케이션을 실행하기 위한 서버 소프트웨어입니다. WAS는 단순한 HTTP 서버(정적 파일 제공에 주로 사용되는 웹 서버)와는 달리, 동적인 서버 측 애플리케이션을 실행하고 요청을 처리하는 데 중점을 둡니다. 주로 다음과 같은 기능을 제공합니다.

  • 서블릿 관리: WAS는 서블릿을 관리하고, 생명주기를 제어합니다. 이를 통해 서블릿을 실행하고 필요한 메모리와 자원을 할당합니다.
  • 웹 컨테이너: WAS 내부에는 웹 컨테이너가 포함되어 있어, 서블릿과 JSP(Java Server Pages)를 실행할 수 있습니다.
  • 세션 관리: WAS는 HTTP의 비상태적 특성을 보완하기 위해 세션을 관리하여 로그인 정보나 사용자 상태를 유지합니다.
  • 트랜잭션 관리: 데이터베이스와 연동되는 애플리케이션에서 트랜잭션을 관리하여 데이터의 일관성을 유지합니다.

/* WAS와 서블릿과의 관계*/

서블릿은 자바 웹 애플리케이션에서 요청을 받아 비즈니스 로직을 수행하고, 결과를 클라이언트에게 응답하는 서버 측 프로그램입니다. 서블릿은 WAS 안에서 실행되고, WAS가 서블릿의 모든 실행 환경을 제공합니다.

서블릿과 WAS의 관계를 단계별로 살펴보면 다음과 같습니다:

  1. 요청 수신과 서블릿 매핑
    클라이언트가 HTTP 요청을 보내면 WAS는 이를 수신하고 요청 URL에 따라 적절한 서블릿으로 매핑합니다. 이 과정에서 URL 패턴 (@WebServlet 어노테이션 사용)을 통해 어떤 서블릿이 요청을 처리할지 결정됩니다.
  2. 서블릿 인스턴스 생성과 생명주기 관리
    WAS는 필요한 경우 서블릿 인스턴스를 생성하고, 서블릿의 생명주기를 관리합니다. WAS는 서블릿이 처음 호출될 때 초기화 메서드인 init()을 호출하고, 이후 요청이 들어올 때마다 service() 메서드를 호출하여 클라이언트의 요청을 처리하도록 합니다. 더 이상 서블릿이 필요하지 않으면 destroy() 메서드를 호출하여 자원을 해제합니다.
  3. 서비스 메서드를 통한 요청 처리
    WAS는 서블릿의 service() 메서드를 호출하여 요청을 처리합니다. service() 메서드는 요청의 HTTP 메서드(GET, POST 등)에 따라 doGet(), doPost() 등의 메서드를 실행하여 비즈니스 로직을 수행하고 응답을 생성합니다.
  4. 응답 반환
    서블릿이 요청을 처리한 후 WAS는 생성된 응답을 클라이언트에게 반환합니다. 이 과정에서 HTTP 상태 코드, 헤더, 본문 등을 포함한 최종 응답이 WAS를 통해 클라이언트에게 전달됩니다.

/* 결론*/

WAS와 DispatcherServlet, 스프링 컨테이너의 요청 처리 과정

  1. WAS가 요청을 받고 DispatcherServlet의 service() 메서드를 호출
    클라이언트 요청이 WAS에 들어오면, WAS는 해당 요청을 처리하기 위해 DispatcherServlet의 service() 메서드를 호출합니다. DispatcherServlet은 스프링 MVC의 중앙 처리 엔진으로, 요청을 받은 후 이를 스프링 컨테이너와 상호작용하여 처리하게 됩니다.
  2. DispatcherServlet이 요청을 컨트롤러에 매핑
    DispatcherServlet은 스프링 컨테이너에서 미리 설정된 핸들러 매핑 정보를 사용하여, 요청을 처리할 컨트롤러 빈을 찾습니다. 요청 URL, HTTP 메서드 등과 같은 정보를 기준으로, 알맞은 컨트롤러 메서드를 매핑합니다.
  3. 컨트롤러 빈을 통해 비즈니스 로직 수행
    DispatcherServlet은 요청을 처리할 컨트롤러 메서드를 호출하여 비즈니스 로직을 수행합니다. 이 과정에서 컨트롤러는 필요한 경우 서비스 빈을 호출하여 복잡한 비즈니스 로직을 수행하고, 데이터베이스와 상호작용하는 등의 작업을 진행합니다. 이 모든 빈(컨트롤러, 서비스 등)은 스프링 컨테이너에 의해 관리됩니다.
  4. 처리 결과를 바탕으로 응답 생성
    컨트롤러가 처리 결과를 반환하면, DispatcherServlet은 이를 기반으로 뷰(View)를 렌더링하거나 JSON 등의 응답을 생성합니다. 이 과정에서 **뷰 리졸버(View Resolver)**를 통해 알맞은 응답 형식을 결정하고 렌더링합니다.
  5. WAS가 최종 응답을 클라이언트로 반환
    최종적으로 DispatcherServlet이 응답을 완료하면, WAS는 이 응답을 받아 클라이언트에게 반환합니다.

 

728x90