Spring Web Application은 어떻게 구동될까? 10단계로 알아보는 전체 프로세스

Spring Web Application

안녕하세요! 오늘은 Java 웹 개발의 핵심이라 할 수 있는 Spring Web Application의 구동 과정에 대해 자세히 살펴보려고 합니다.

Spring은 복잡한 웹 애플리케이션 개발을 단순화해주는 강력한 프레임워크로 유명하죠. 하지만 그 이면에는 수많은 설정과 객체들의 연계 작업이 숨어있답니다. 지금부터 Spring Web Application이 어떤 단계를 거쳐 구동되는지, 함께 알아볼까요?

Spring Web Application 구동 단계

1단계: 웹 애플리케이션 실행과 web.xml 로딩

모든 여정은 웹 애플리케이션의 실행으로부터 시작됩니다. WAS(Web Application Server)가 가동되면, 가장 먼저 web.xml 파일을 로드하게 되는데요. 이 파일에는 우리 웹 앱의 모든 설정 정보가 담겨 있죠. 일종의 청사진이라고 생각하시면 됩니다.

2단계: ContextLoaderListener의 등장

web.xml에는 ContextLoaderListener라는 걸 등록해 두었습니다. 얘는 ServletContextListener 인터페이스를 구현하고 있는데요. 주된 역할은 스프링의 핵심인 ApplicationContext를 생성하는 거예요.

ApplicationContext가 뭐냐고요? 스프링에서는 이걸 ‘스프링 컨테이너’라고 부릅니다. 얘는 우리 애플리케이션에서 사용되는 객체(Bean)들의 생명주기를 관리하죠. 객체가 필요한 순간에 생성해주고, 없애야 할 때 삭제하는 일종의 ‘객체 관리자’인 셈이에요.

<!-- Spring Context Listener -->
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

3단계: root-context.xml의 로드

ContextLoaderListenerroot-context.xml이라는 파일도 로드합니다. 이 파일에는 전체 애플리케이션에 대한 스프링 설정 정보가 담겨 있어요.

<!-- Spring config file path definition -->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/config/applicationContext*.xml</param-value>
</context-param>

4단계: 스프링 컨테이너(ROOT)의 구동

root-context.xml의 설정에 따라 스프링 컨테이너(ROOT)가 구동됩니다. 이 과정에서 우리 애플리케이션에 필요한 DAO, VO, Service 객체들이 자동으로 생성되는데요. 스프링 컨테이너가 얘네를 알아서 관리해준다고 보시면 돼요.

5단계: HTTP Request의 처리

자, 이제 사용자가 우리 웹 사이트의 URL을 입력하면 본격적인 서비스가 시작됩니다. 사용자의 요청(HTTP Request)은 서블릿 컨테이너로 전달되고, 이 때 HttpServletRequestHttpServletResponse 객체가 생성됩니다.

6단계: 요청 URL에 대한 서블릿 매핑

서블릿 컨테이너는 web.xml을 참조하여, 사용자가 요청한 URL을 처리할 서블릿을 찾아냅니다. 마치 길 안내를 해주는 네비게이션 같은 역할이에요.

7단계: servlet-context.xml의 로드

해당 서블릿은 servlet-context.xml 파일을 로드합니다. 이 파일에는 개별 서블릿에 대한 스프링 설정 정보가 들어 있죠.

<!-- Spring DispatcherServlet Config -->
<servlet>
    <servlet-name>controller</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:config/spring/servlet-context.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>controller</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

8단계: 서블릿의 service 메소드 호출

이제 해당 서블릿의 service 메소드가 호출됩니다. 클라이언트의 요청 방식(GET, POST 등)에 따라 doGet(), doPost() 등의 메소드로 분기되죠.

9단계: 동적 페이지 생성과 응답 전송

doGet(), doPost() 메소드에서는 필요한 로직을 수행하고, 동적으로 페이지를 생성합니다. 그 결과는 HttpServletResponse 객체에 담아 클라이언트에게 전송되는데요. 이게 바로 우리가 보는 웹 페이지의 모습이 되는 거죠.

10단계: 요청 처리 종료

응답이 완료되면, HttpServletRequestHttpServletResponse 객체는 소멸됩니다. 서비스를 마치고 퇴근하는 것처럼 말이에요. 그리고 이 과정은 매 요청마다 반복됩니다.

이렇게 해서 Spring Web Application의 구동 과정을 10단계로 살펴봤습니다. 처음엔 복잡해 보이지만 각 단계의 역할을 이해하고 나면 그리 어렵지 않답니다.

스프링의 힘은 바로 이런 복잡한 과정을 추상화하고 단순화하는 데서 나오죠. 개발자가 핵심 로직에만 집중할 수 있도록 뒷단에서 일하는 일종의 ‘보이지 않는 손’이라고 할 수 있어요.

웹 개발을 시작하는 여러분이라면 이 글이 Spring Web Application을 이해하는 데 조금이나마 도움이 되었길 바랍니다. 앞으로도 Spring의 다양한 기능과 원리를 하나씩 파헤쳐 보는 시간을 가져보는 건 어떨까요?

여러분의 성장을 언제나 응원하겠습니다! 궁금한 점이 있다면 댓글로 알려주세요. 그럼 다음에 또 유익한 주제로 찾아오겠습니다. 감사합니다 🙂