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 아키텍처에서 모델이 가진 정보를 어떻게 표현하는지에 대한 로직을 갖고있는 컴포넌트
'WebServer > Spring' 카테고리의 다른 글
[Spring] 스프링의 포워드(forward)와 리다이렉트(redirect) + RedirectAttributes (1) | 2023.09.17 |
---|---|
[Spring] 스프링 MVC의 Controller (0) | 2023.09.17 |
[Spring] 트랜잭션 처리 (TransactionManager) (1) | 2023.09.15 |
[Spring] Spring에서의 MyBatis 연동 (0) | 2023.09.15 |
[Spring] 빈 객체 스캔 (component-scan) (0) | 2023.09.14 |