관리 메뉴

LIFE & IT

웹프로젝트 구조와 Spring MVC 구조 그리 모델2 패턴이해 본문

웹 프로그래밍/Spring Framework

웹프로젝트 구조와 Spring MVC 구조 그리 모델2 패턴이해

프린이! 2019. 9. 14. 18:34

1. 프로젝트의 로딩 구조

 

웹 프로젝트 구동시 관여하는 XML 은 web.xml / root-context.xml / servlet-context.xml 파일이다.

 

web.xml = Tomcat 구동 설정 파일

root-context.xml / servlet-context.xml = 스프링 관련 설정 파일

 

프로젝트 구동의 시작은 web.xml 에서 시작한다.

 

<그림 1>

가장 먼저 구동되는 Context Listener 가 등록되어 있다.

<context-param> 에는 root-context.xml

<listener> 에는 ContextLoaderListener 가 등록 되어 있다.

 

ContextLoaderListener는 해당 웹 애플리케이션 구동 시 같이 동작하므로 해당 프로젝트를 실행하면 아래와 같은 로그를 볼 수 있다.

 

<그림 2>

1. <listener-class> org.springframework.web.context.ContextLoaderListener 실행

2. <param-value> root-context.xml 호출

 

 

root-context.xml 처리되면 파일에 있는 빈(Bean) 설정들이 동작.

 

<그림3>

root-context.xml 에 정의된 객체(Bean)들은 스프링 영역(Context) 안에 생성되고 객체들 간의 의존성이 처리된다.

root-context.xml 이 처리된 후에는 <그림 1> 의 스프링MVC에서 사용하는 DispatcherServlet 이라는 서블릿과 관련된 설정이 동작한다.

 

org.springframework.web.servlet.DispatcherServlet 클래스는 스프링MVC의 구조에서 가장 핵심적인 역할의 클래스.

내부적으로 웹 관련 처리 준비 작업을 진행하는데 이때 사용하는 파일이 servlet-context.xml 이다.

 

<그림 4>

 

DispatcherServlet 에서 XmlWebApplicationContext 를 이용해 servlet-context.xml을 로딩하고 해석하기 시작합니다.

이 과정에서 servlet-context.xml 에 등록된 객체(Bean)들은 Context 에서 root-context.xml 에 등록된 기존 객체(Bean)들과 같이 연동하게 됩니다.

 

<그림 5>

 

 

2. 스프링 MVC의 기본 사상

과거에는 Servlet/JSP 에서 HttpServletRequest / HttpServletResponse 라는 타입의 객체를 이용해 브라우저에 전송하는 방식을 취했다.

 

스프링 MVC는 하나의 계층을 더한 형태가 된다.

 

<그림 1>

 

Servlet / JSP 의 API 를 직접 이용하지 않고 Springframework 에 직접 접근은 맡기고 개발자는 단순히 framework 에서 제공하는 API 와 적은 수의 Servlet/JSP API 만으로 기능을 구현할 수 있게 한다.

 

현재 스프링 2.5버전 이상 부터 등장한 어노테이션 방식으로 인해 최근 개발에는 어노테이션이나 XML 등의 설정만으로 개발이 가능하게 되었다.

 

 

 

3. 모델2 와 스프링 MVC

 

▷ 모델2 방식?

'로직과 화면을 분리' 하는 스타일의 개발 방식

 

<그림 1>

 

▷ 사용하는 이유?

 나중에 View 를 교체하더라도 사용자가 호출하는 URL 자체에 변화가 없게 만들어 주기 때문

 

스프링 MVC 에선 내부에서 Servlet API 를 처리하고 개발자들은 스프링 MVC 의 API를 이용해 코드를 작성한다.

 

<그림 2>

사용자의 Request 는 Front-Controller 인 DispatcherServlet 을 통해 처리

 

HandlerMapping은 Request의 처리를 담당하는 컨트롤러를 찾기위해 존재 

ex) RequestMappingHandlerMapping 같은 경우 @RequestMapping 어노테이션 적용된 것을 기준으로 판단.

적절한 컨트롤럴가 찾아졌다면 HandlerAdapter를 이용해서 해당 컨트롤러 동작.

 

Controller 는 개발자가 직접 작성하는 클래스로 실제 Request 를 처리하는 로직을 작성

View 에 전달해야 하는 데이터는 주로 Model이라는 객체에 담아서 전달합니다.

          Controller는 다양한 타입의 결과를 반환하는데 이에 대한 처리는 ViewResolver를 이용

 

 

ViewResolver는 Controller가 반환한 결과를 어떤 View를 통해서 처리하는 것이 좋을지 해석하는 역할

가장 흔하게 사용하는 설정은 InternalResourceViewResolver

 

View는 실제로 응답 보내야 하는 데이터를 Jsp 등을 이용해서 생성하는 역할을 하게 됩니다.

               만들어진 응답은 DispatcherServlet을 통해서 전송됩니다.

 

 

위와 같은 Spring MVC 패턴을 Front-Controller 패턴이라고 한다.

Front-Controller 패턴은 모든 Request의 처리에 대한 분배가 정해진 방식대로만 동작하기 때문에 엄격한 구조를 만들어낼 수 있다.