본문 바로가기

BackEnd/Spring

스프링 mvc의 기본 구조

반응형

0. 스프링 MVC란?


스프링 MVC는 웹 스프링 라이브러리로, 기존에 Servlet/JSP를 이용하는 개발에 비해서 간단하고, 


른 개발이 가능한 웹 프레임워크이다. 스프링 프레임워크를 이용한다는 의미는 스프링 MVC 프


젝트인경우가 대부분이다.


1. 스프링MVC의 기본 구조


스프링 MVC는 Spring Framework의 서브 프로젝트다. 


스프링은 하나의 기능을 위해서만 만들어진 프레임워크가 아니라 ’코어'라고 할 수 있는


프레임워크에 여러 서브 프로젝트를 결합해서 다양한 상황에 대처할 수 있도록 개발되었


다. 서브 프로젝트라 별도의 설정이 존재할 수 있다. Spring Legacy Project로 생성한 예제


의 경우에도 servlet-context.xml과 root-context.xml로 설정 파일이 분리된 것을


볼 수 있다. 스프링 MVC가 서브 프로젝트이므로 구성 방식이나 설정이 조금 다


르다고 볼 수 있다.



2. 스프링MVC 프로젝트의 내부구조


스프링MVC  프로젝트를 구성해서 사용한다는 의미는 내부적으로는 root-context.xml


로 사용하는 일반 Java 영역(흔히 POJO(Plain Old Java Object))과 servlet-context.xml로 설정하는 


Web 관련 영역을 같이 연동해서 구동하게 된다. 다음과 같은 구조다



바깥쪽에 있는 WebApplicationContext라는 존재는 기존의 구조에 MVC 설정을 포함


하는 구조로 만들어 진다. 스프링은 원래 목적 자체가 웹 애플리케이션을 목적으로 나


온 프레임워크가 아니기 때문에 달라지는 영역에 대해서는 완전히 분리하고 연동하는 방


식으로 구현되어 있다.


3. 스프링MVC 프로젝트의 로딩구조


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


이 파일들 중 web.xml은 Tomcat 구동과 관련된 설정이고,


나머지 두 파일은 스프링과 관련된 설정이다.


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


web.xml의 상단에는 가장 먼저 구동되는 Context Listener가 등록되어 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<context-param>
 
<param-name>contextConfigLocation</param-name>
 
<param-value>/WEB-INF/spring/root-context.xml</param-value>
 
</context-param>
  
<listener>
 
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
 
</listener>
cs


<context-param>에는 root-context.xml의 경로가 설정되어 있고, 


<listener>에는 스프링 MVC의 ContextLoaderListener가 등록되어 있는 것을 볼 수 있다.


ContextLoaderListener는 해당 웹 애플리케이션 구동 시 같이 동작한다.


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



root-context.xml에 정의된 객체(Bean)들은 스프링의 영역(context) 안에 생성되고,


객체들 간의 의존성이 처리된다. root-context.xml이 처리된 후에는 스프링 MVC에


서 사용하는 DispatcherServlet이라는 서블릿과 관련된 설정이 동작한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<servlet>
        <servlet-name>appServlet</servlet-name>
 
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
 
        <init-param>
 
            <param-name>contextConfigLocation</param-name>
 
            <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
 
        </init-param>
 
         <load-on-startup>1</load-on-startup>
</servlet>
        
<servlet-mapping>
 
        <servlet-name>appServlet</servlet-name>
 
        <url-pattern>/</url-pattern>
 
</servlet-mapping>
cs


DispatcherServlet 클래스는 스프링 MVC의 구조에서 가장 핵심적인 역할을 한다.


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


DispatcherServlet에서 XmlWebApplicationContext를 이용해서 servlet-context.xml을 로딩하고 해


석하기 시작한다. 이 과정에서 등록된 객체(Bean)들은 기존에 만들어진 객체 (Bean)들과 같이 연동


되게 된다.




4. 스프링 mvc 의 기본 사상


스프링 mvc이전에 Servlet/JSP 기술과 모델 2라는 방식에 대해서 먼저 학습하게되는데, 스프링 


MVC의 경우 이러한 부분은 개발자들에게 보여주지 않고, 개발자들은 자신이 필요한 부분만을 집


중해서 개발할 수 있는 구조로 만들어져 있다.


Servlet/JSP에서는 HttpServletRequest/HttpServletResponse라는 타입의 객체를 이용해 브라우저


에서 전송한 정보를 처리하는 방식이다. 스프링 MVC의 경우 이 위에 하나의 계층을 더한 형태가 


된다.



스프링 MVC를 이용하게 되면 개발자들은 직접적으로 HttpServletRequest/


HttpServletResponse 등과 같이 Servlet/JSP의 API를 사용할 필요성이 많이 줄어든다.


스프링은 중간에 연결 역할을 하기 때문에 이러한 코드를 작성하지 않고도 원하는 기능을 구현할 


수 있다. 개발자의 코드는 스프링 MVC에서 동작하기 때문에 과거에는 스프링 MVC의 특정한 클


래스를 상속하거나 인터페이스를 구현하는 형태로 개발할 수 있었지만,스프링 2.5버전


부터 등장한 어노테이션 방식으로 인해 최근 개발에는 어노테이션이나 XML 등의 설정만


으로 개발이 가능하게 되었다.


5. 모델 2와 스프링 MVC


스프링 MVC 역시 내부적으로는 Servlet API를 활용한다.


스프링 MVC는 모델 2라는 방식으로 처리되는 것이다.


모델 2방식은 쉽게 말해서 로직과 화면을 분리하는 스타일의 개발 방식이다. 


모델 2방식은 MVC 구조를 사용한다.




모델 2방식에서 사용자의 Request는 특별한 상황이 아닌 이상 먼저 Controller를 호출


하게 된다. 이렇게 설계하는 가장 중요한 이유는 나중에 View를 교체하더라도 사용자


가 호출하는 URL 자체에 변화가 없게 만들어 주기 때문이다. 컨트롤러는 데이터를 처


리하는 존재를 이용해서 데이터(Model)를 처리하고 Response 할 때 필요한 데이터


(Model)를 View 쪽으로 전달하게 된다. Servlet을 이용하는 경우 개발자들은 Servlet


API의 RequestDispatcher 등을 이용해서 이를 직접 처리해 왔지만 스프링 MVC는 내


부에서 이러한 처리를 하고, 개발자들은 스프링 MVC API를 이용해서 코드를 작성하


게 된다. 


모델-뷰-컨트롤러(Model–View–Controller, MVC)는 소프트웨어 공학에서 사용되는 아키텍처 패턴


이다. 이 패턴을 성공적으로 사용하면, 사용자 인터페이스로부터 비즈니스 로직을 분리하여 애플리


케이션의 시각적 요소나 그 이면에서 실행되는 비즈니스 로직을 서로 영향 없이 쉽게 고칠 수 있


는 애플리케이션을 만들 수 있다. MVC에서 모델은 애플리케이션의 정보(데이터)를 나타내며, 뷰


는 텍스트, 체크박스 항목 등과 같은 사용자 인터페이스 요소를 나타내고, 컨트롤러는 데이터와 비


즈니스 로직 사이의 상호동작을 관리한다 이해하기 쉽게 설명하자면, M - 데이터베이스, V - 웹 페


이지 C - M, V의 중간자 역할이라고 볼 수 있다.


위와 같이 Model은 데이터베이스 관련, V는 보여지는 요소들, C는 제어하는 역할로 구분해서 코드


를 짜게 제공하고 있는 것이 MVC 프레임워크다. 


6. 스프링 MVC기본 구조



1) DispatcherServlet


사용자의 Request는 Front-Controller인 DispatcherServlet을 통해서 처리한다. MVC


프로젝트의 web.xml에는 모든 Request를 DispatcherServlet이 받도록 처리하고 있다.


2,3) HandlerMapping, HandlerAdapter


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


HandlerMapping 인터페이스를 구현한 여러 객체들 중 RequestMappingHandlerMapping


같은 경우는 개발자가 @RequestMapping 어노테이션을 적용한 것을 기준으로 판단


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


를 동작시킨다.


4) Controller는


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


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


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


용하게 된다.


Controller의 메서드를 작성할 때는 특별하게 Model이라는 타입을 파라미터로 지정할


수 있다. Model 객체는 컨트롤러에서 생성된 데이터를 담아서 JSP에 전달하는 역할


을 한다. 메서드의 파라미터에 Model 타입이 지정된 경우에는 스프링은


특별하게 Model 타입의 객체를 만들어서 메서드에 주입하게 된다.


5) ViewResolver


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


해석하는 역할이다. 가장 흔하게 사용하는 설정은 servlet-context.xml에 정의된 


InternalResourceViewResolver이다.


1
2
3
4
5
6
7
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
 
    <beans:property name="prefix" value="/WEB-INF/views/" />
 
    <beans:property name="suffix" value=".jsp" />
 
</beans:bean>
cs


6,7) ViewDispatcherServlet


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


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


모든 Request는 DispatcherServlet을 통하도록 설계되는데, 이런 방


식을 Front-Controller 패턴이라고 한다. Front-Controller 패턴을 이용하면 전체


흐름을 강제로 제한할 수 있다.


Front-Controller 패턴을 이용하는 경우에는 모든 Request의 처리에 대한 분배가 정해진 방식


대로만 동작하기 때문에 좀 더 엄격한 구조를 만들어 낼 수 있다.



반응형

'BackEnd > Spring' 카테고리의 다른 글

Autowired 와 Resource 와 lnject 어노테이션정리  (0) 2020.02.09
스프링 컨테이너 계층 구조  (0) 2020.02.08
DI의 장점  (0) 2020.02.04
의존성 주입방법 2가지  (0) 2020.02.04
스프링 컨테이너 종류  (0) 2020.02.03