
안녕하세요! 오늘은 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의 로드
ContextLoaderListener
는 root-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)은 서블릿 컨테이너로 전달되고, 이 때 HttpServletRequest
와 HttpServletResponse
객체가 생성됩니다.
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단계: 요청 처리 종료
응답이 완료되면, HttpServletRequest
와 HttpServletResponse
객체는 소멸됩니다. 서비스를 마치고 퇴근하는 것처럼 말이에요. 그리고 이 과정은 매 요청마다 반복됩니다.
이렇게 해서 Spring Web Application의 구동 과정을 10단계로 살펴봤습니다. 처음엔 복잡해 보이지만 각 단계의 역할을 이해하고 나면 그리 어렵지 않답니다.
스프링의 힘은 바로 이런 복잡한 과정을 추상화하고 단순화하는 데서 나오죠. 개발자가 핵심 로직에만 집중할 수 있도록 뒷단에서 일하는 일종의 ‘보이지 않는 손’이라고 할 수 있어요.
웹 개발을 시작하는 여러분이라면 이 글이 Spring Web Application을 이해하는 데 조금이나마 도움이 되었길 바랍니다. 앞으로도 Spring의 다양한 기능과 원리를 하나씩 파헤쳐 보는 시간을 가져보는 건 어떨까요?
여러분의 성장을 언제나 응원하겠습니다! 궁금한 점이 있다면 댓글로 알려주세요. 그럼 다음에 또 유익한 주제로 찾아오겠습니다. 감사합니다 🙂