[Spring] Spring MVC 구조와 컴포넌트
Spring MVC 구조
스프링 프레임워크는 MVC2
패턴을 준수한다. MVC2 패턴은 쉽게 말해 로직과 화면을 분리하는 스타일의 개발방식이다. UI코드와 비즈니스 코드를 분리함으로써 종속성을 줄이고 재사용성을 높여 보다 쉬운 유지보수를 확보할 수 있다.
MVC2 방식에서 사용자의 Reqeust를 처리하기 위해 주로 Controller
를 호출한다. 나중에 View를 교체하더라도 사용자가 호출하는 URL 자체에 변화가 없게 만들어주기 때문이다.
스프링 MVC의 기본 구조는 아래와 같다
① 사용자의 Request는 Front-Controller인 DispatcherServlet
을 통해 처리한다.
② HandlerMapping
은 Request의 처리를 담당하는 Controller를 찾는다. @RequestMapping("/매핑요청값")
어노테이션으로 적용된 것을 기준으로 적절한 Controller를 찾았다면 HandlerAdapter
를 이용해 해당 Controller를 동작시킨다.
③ Controller
는 실제 Request를 처리하는 로직을 작성한다. 이 때, View에 전달해야 하는 데이터는 주로 Model 객체에 담아 전달한다. Controller은 다양한 타입의 결과를 반환하는데 이에 대한 처리는 ViewResolver
을 이용한다.
④ ViewResolver
은 Controller가 반환한 결과를 어떤 View를 통해 처리하는 것이 좋을지 해석하는 역할이다. 가장 흔하게 사용하는 설정은 servlet-context.xml
에 정의된 InternalResourceViewResolver
이다.
⑤ View
는 실제로 응답 보내야 하는 데이터를 JSP 등을 이용해 생성하는 역할이다. 만들어진 응답은 DispatcherServlet
을 통해 전송된다.
💡 이러한 방식을 Front-Controller 패턴이라 한다.
Spring MVC 프로젝트
프로젝트 생성
1. File > New > Spring legacy project
2. 프로젝트명 지정 후 templates 항목에서 Spring MVC Project 선택
3. 클래스의 패키지명 입력 (메인패키지.서브패키지.서브패키지2)
💡 서브패키지2 가 자동으로 context명이된다.
예) com.xxx.app 지정하면 app이 context명이 된다 ➜ http://localhost:8090/app
pom.xml에서 버전 수정
변경 후, 프로젝트 오른쪽 클릭 후 maven > update project
📁 디렉토리 구조
스프링 MVC 프로젝트는 일반 JAVA 영역인 root-context.xml
과 Web 관련 영역인 servlet-context.xml
영역을 같이 연동해서 구동하게 된다. 사용자의 요청을 처리할 DispatcherServlet
은 web.xml
파일에 등록한다
<!-- root-context.xml 등록 -->
<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>
<!-- servlet-context.xml 등록 -->
<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>
Spring MVC 컴포넌트
DispatcherServlet
클라이언트 요청이 들어오면 가장 먼저 요청을 받는다.
💡 요청 URL : http://localhost:8090/context명/서블릿매핑명
예) http://localhost:8090/app/ ➜ DispatcherServlet이 요청을 받는다
Controller
POJO
(Plain Old Java Object) 기반: 어떤 클래스 및 인터페이스를 상속받거나 구현하지 않은 순수한 클래스- 반드시
@Controller
어노테이션 지정 - servlet-context.xml에 빈으로 등록 ➜
component-scan
이용
💡 http://localhost:8090/컨텍스트명/요청매핑값 ➜ 요청매핑값에 의해 실제로 처리되는 Controller가 선택
@Controller
public class DeptController{
// 요청url: http://localhost:8090/app/del
@RequestMapping("/del")
public String delete(){
//요청처리 (삭제기능)
//응답처리 : 보여줄 jsp 설정 (/WEB-INF/views/list.jsp)
return "list";
}
// 요청url: http://localhost:8090/app/add
@RequestMapping("/add")
public String insert(){
// 요청처리 (저장기능)
//응답처리 : 보여줄 jsp 설정 (/WEB-INF/views/list.jsp )
return "list";
}
}
HandlerMapping과 HandlerMappingAdapter
DispatcherServlet
이 요청을 전송할 Controller을 알기위해HandlerMapping
에게 도움을 요청@RequestMapping
어노테이션을Controller
클래스나 메서드에 부여하고 이를 이용해 매핑하는 전략- URL뿐만 아니라
GET/POST
같은 HTTP 메서드, 파라미터와 HTTP 헤더정보까지 매핑에 활용
요청매핑값 | Controller |
---|---|
/add | @RequestMapping("/add")의 insert() 메서드 |
/del | @RequestMapping("/del")의 delete() 메서드 |
ViewResolver
Conroller
에 의해 반환된 논리적인 뷰 이름에 기반한 뷰 선택InternalResourceViewResolver
: 자바의 JSP을 사용한 환경에서 사용되는 컴포넌트
💡 /WEB-INF/views/main.jsp
경로정보(/WEB-INF/views)와 확장자(.jsp)로 나눠 웹 어플리케이션에 위치한 파일을 찾는다.
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
View
- 뷰 (view)는 MVC 아키텍처에서 모델이 가진 정보를 어떻게 표현하는지에 대한 로직을 갖고있는 컴포넌트