Spring 동작 방식

Jongmyung Choi·2023년 6월 13일
3
post-thumbnail

요즘 들어 스프링에 대한 깊은 이해가 없이 스프링 부트를 공부했다는 생각이 들었다.
눈에 보이지 않는것들에 집중하며 스프링 또는 Java EE 로만 프로젝트를 진행해보면서 이해를 한 부분을 정리하려고 한다.

Servlet, Spring, WAS의 동작방식이 헷갈렸고 이참에 확실하게 정리하기 위해 글 작성하였다.


Servlet 의 동작 방식

  1. 웹 서버는 클라이언트의 요청을 받는다.
  2. 웹 서버는 해당 요청을 처리할 서블릿 컨테이너(WAS)에게 전달한다.
  3. 서블릿 컨테이너는 요청을 처리하기 위해 해당 서블릿의 인스턴스를 생성한다.
  4. 서블릿 인스턴스는 클라이언트의 요청을 처리하는데 사용될 수 있는 여러 메서드를 포함하고 있다. 주요한 메서드는 다음과 같다.
  • init(): 서블릿의 초기화를 수행하는 메서드. 서블릿 인스턴스가 처음 생성될 때 호출.
  • service(): 실제로 클라이언트의 요청을 처리하는 메서드. HTTP 요청 방식(GET, POST 등)에 따라 doGet(), doPost() 등으로 분기하여 처리.
  • doGet(), doPost(): 각각 GET 방식과 POST 방식의 요청을 처리하는 메서드. 필요에 따라 다른 HTTP 요청 메서드에 대한 처리 메서드도 추가로 구현할 수 있다.
  • destroy(): 서블릿 인스턴스가 소멸될 때 호출되는 메서드. 리소스 정리 등의 작업을 수행한다.
  1. 서블릿 컨테이너는 클라이언트의 요청을 해당 서블릿 인스턴스의 service() 메서드로 전달한다.
  2. 서블릿 인스턴스는 요청을 처리하고, 필요에 따라 데이터베이스 조회, 비즈니스 로직 실행 등의 작업을 수행한다.
  3. 서블릿 인스턴스는 클라이언트에게 응답을 생성하여 전송한다.
  4. 클라이언트는 서블릿으로부터 받은 응답을 처리하고, 필요에 따라 추가적인 요청을 전송할 수 있다.

Servlet Container

주로 웹 서버나 WAS(Tomcat)에 내장되어 제공
Servlet 인스턴스 생성 관리, HTTP 요청 처리, 스레드 관리, 세션 관리, 보안 인증

❓ 서블릿 컨테이너는 요청이 올 때마다 새로운 자바 스레드 생성

→ 서블릿 인스턴스 자체를 생성하는 것이 아닌 요청이 올때마다 해당 서블릿의 스레드를 생성.
서블릿 인스턴스는 싱글톤으로 생성되고, Thread-Safe 하지 않기 때문에, 무상태 혹은 동기화 처리된 구조로 설계 되어야 한다.

Spring 의 동작 방식

업로드중..

  1. 웹 서버 실행: 웹 애플리케이션을 구동하기 위해 웹 서버(Tomcat, Jetty 등)가 실행된다.

  2. web.xml 로딩: 웹 서버는 웹 애플리케이션의 설정 파일인 web.xml을 로딩한다.

  3. ContextLoaderListener 생성: web.xml에 등록된 ContextLoaderListener가 생성된다. ContextLoaderListener는 Spring 애플리케이션 컨텍스트를 생성하고 초기화하는 역할을 수행한다.

  4. Root Application Context 생성: ContextLoaderListener는 ApplicationContext.xml(root-context.xml)을 로딩하여 Root Application Context를 생성한다. Root Application Context는 전역적인 설정을 담당하며, 데이터베이스 연결, 서비스 빈 등의 설정을 포함한다. Root Application Context는 여러 개의 서블릿 컨텍스트와 공유될 수 있다.

  5. DispatcherServlet 생성: 웹 애플리케이션의 클라이언트 요청이 발생하면 DispatcherServlet이 생성된다. DispatcherServlet은 클라이언트 요청을 처리하는 주요한 컨트롤러 역할을 수행한다.

  6. Servlet Context 로딩: DispatcherServlet은 Servlet-Context.xml을 로딩한다. Servlet-Context.xml은 해당 서블릿에 대한 설정을 담고 있으며, 컨트롤러 빈 등의 설정을 포함한다.

  7. Web Application Context 생성: Servlet-Context.xml에 등록된 설정을 바탕으로 Web Application Context가 생성된다. Web Application Context는 해당 서블릿에 대한 설정과 관련된 빈들을 관리한다.

  8. 컨트롤러 빈 등록: Web Application Context는 Servlet-Context.xml에 정의된 컨트롤러 빈 등을 등록하고, 요청에 따라 해당 빈을 활용하여 클라이언트 요청을 처리한다.

  9. 클라이언트 요청 처리: DispatcherServlet은 클라이언트의 요청을 받아 컨트롤러 빈에게 요청을 전달하고, 컨트롤러는 비즈니스 로직을 수행하여 응답을 생성한다.

  10. 응답 전송: DispatcherServlet은 컨트롤러가 생성한 응답을 클라이언트에게 전송하고, 웹 애플리케이션의 동작을 마친다.

Spring Container

애플리케이션의 개발과 실행을 담당하는 런타임 환경.
빈(Bean)의 생성, 관리, 의존성 주입 등을 담당하여 개발자가 애플리케이션의 핵심 비즈니스 로직에 집중할 수 있도록 지원

IoC (Inversion of Control) 컨테이너로서 애플리케이션의 객체를 생성하고, 필요한 의존성을 주입하며, 애플리케이션 실행 중에 빈의 상태를 관리한다.
다양한 종류가 있지만 일반적인 형태는 ApplicationContext 이다.
ApplicationContext는 스프링 애플리케이션의 루트 컨테이너로서, 애플리케이션 전반에 걸쳐 사용되는 빈의 라이프사이클 관리와 의존성 주입을 담당한다. 또한, 다양한 기능을 제공하는 스프링의 다른 모듈들과 통합되어 동작한다.

참고

https://steady-coding.tistory.com/599

profile
총명한 개발자

0개의 댓글