MVC(Model-View-Controller)
MVC(Model-View-Controller)
Spring MVC Framework
웹 애플리케이션 개발을 위한 모델 뷰 컨트롤러 아키텍처를 제공한다. Model
- 애플리케이션 데이터를 캡슐화하고 일반적으로 POJO(순수 자바 객체)로 구성된다.. View
- 모델 데이터를 렌더링하고 일반적으로 HTML 출력을 생성한다. Controller
- 사용자 요청을 처리하고 적절한 모델을 작성하고 렌더링을 위해 View로 전달한다.
1. 개요
Spring MVC Architecture
Dispatcher servlet 사용자의 요청을 맨 먼저 받는다.(Front Controller로서 작동한다.) 요청을 적절한 Controller에게 전달해주는 역할
(애플리케이션으로 들어오는 모든 요청을 intercept하고 Handler(Controller)에 디스패치(전달)한다.) 요청을 처리하기 위해 Controller에 대한 Handler Mapping을 참조한다. Spring이 만들어준다.
Handler Mapping 요청이 들어오면 어떤 Controller가 수행되어야 하는지 알려주는 매핑 테이블
(특정 요청을 처리하는 적절한 Controller를 찾아 응답한다.) 요청 URL과 Controller 클래스 간의 매핑은 XML 설정 또는 Annotation으로 수행된다.
Controller 실제로 사용자의 요청을 처리한다.(다른 business/service 클래스를 호출하여 요청을 처리) 결과를 View로 전달될 Model 객체에 저장
View Resolver 적절한 View를 찾아준다.
(Logical 이름으로부터 Physical view file를 찾는다.)
View 필요한 Model을 가져와 보여준다. Physical view file -> JSP, HTML, XML, Velocity template
참고)
Spring이 제공하는 클래스: Dispatcher Servlet, Handler mapping, View Resolver
2. 요구되는 Configuration
Maven Configuration(POM.xml)
4.0.0 com.javatpoint SpringMVC war 0.0.1-SNAPSHOT SpringMVC Maven Webapp http://maven.apache.org junit junit 3.8.1 test org.springframework spring-webmvc 5.1.1.RELEASE javax.servlet servlet-api 3.0-alpha-1 SpringMVC
Web deployment descriptor(web.xml)
DispatcherServlet
- 스프링 컨테이너 (WebApplicationContext)를 인스턴스 화한다.
- 요청 --> DispatcherServlet --- instantiate
---> Spring Container( Controller(Bean), Special Beans(HandlerMapping, ViewResolver) )
- DI 컨테이너와 마찬가지로 WebApplicationContext에는 일부 구성 메타 데이터(XML 파일)가 제공되어야 한다. 에서 설정해준 sales-context.xml이 메타 데이터(sales- 예시로 sales 관련 요청을 설정한 파일명이다.
- 요청 --> DispatcherServlet --- instantiate ---> Spring Container( Controller(Bean), Special Beans(HandlerMapping, ViewResolver) ) - DI 컨테이너와 마찬가지로 WebApplicationContext에는 일부 구성 메타 데이터(XML 파일)가 제공되어야 한다.
SpringMVC spring org.springframework.web.servlet.DispatcherServlet contextConfigLocation /WEB-INF/sales-context.xml 1 spring /
ContextLoadListener
- 공유 Bean을 포함하는 Spring Container를 인스턴스화 한다.
- DispatcherServlet으로 작성된 Bean은 ContextloaderListener로 작성된 Bean을 참조할 수 있다.
Parent인 ContextLoadListener의 Spring Container는 Child인 DispatchServlet의 Spring Container에게 참조될 수 있다. 반대는 불가능
org.springframework.web.context.ContextLoaderListener contextConfigLocation /WEB-INF/spring/applicationContext.xml
참고)
Spring Container: Bean을 생성해주고, 의존성을 주입해주는 역할
공유되는 Bean들은 ContextLoadListener에 넣어두고
그렇지 않은 Bean들은 DispatcherServlet에 넣어둔다.(그렇지 않은 Bean 예시: Controller)
web.XML 설정 및 Spring MVC Configuration 예시
contextConfigLocation classpath:app-config.xml org.springframework.web.context.ContextLoaderListener my-dispatcher-servlet org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:web-config.xml 1 my-dispatcher-servlet /
- 공유 빈을 관리하는 contextLoadListener의 설정 파일 명은 app-config.xml
- 공유하지 않은 빈을 관리하는 DispatcherServlet의 설정 파일 명은 web-config.xml
app-config.xml
모든 서블릿과 필터에서 공유될 수 있는 root Spring container의 설정을 지정한다.
애플리케이션 시작 시 Spring의 ContextLoaderListener에 의해 로드된다.
이 파일은 기본적으로 비어 있다.
web-config.xml
- 지정된 패키지의 파일을 스캔하기 위해 annotation 기반 접근 방식을 사용하도록 프레임 워크에 지시한다.
- 지정된 패키지의 파일을 스캔하기 위해 annotation 기반 접근 방식을 사용하도록 프레임 워크에 지시한다.
- 정적 리소스를 HTTP GET 요청과 직접 매핑한다.
따라서 Image, JavaScript, CSS 등의 리소스들은 Controller를 거치지 않아도 된다.
- 정적 리소스를 HTTP GET 요청과 직접 매핑한다. 따라서 Image, JavaScript, CSS 등의 리소스들은 Controller를 거치지 않아도 된다.
- Controller가 반환한 Logical Name에 따라 프레임워크가 실제 JSP 파일을 찾을 수 있게 경로 매핑을 해준다.
-> 예를 들어, Controller가 sales를 반환한다면 /WEB-INF/views/sales.jsp로 매핑
- Controller가 반환한 Logical Name에 따라 프레임워크가 실제 JSP 파일을 찾을 수 있게 경로 매핑을 해준다. -> 예를 들어, Controller가 sales를 반환한다면 /WEB-INF/views/sales.jsp로 매핑 context:component-scan.../>
- Annotation 기반 strategy를 사용할 때 어떤 패키지를 스캔할지 Spring Container에 알려준다.
- Container에 annotation이 달린 Controller를 auto-detect(자동 감시)하도록 한다.
- Container는 패키지 아래의 모든 클래스를 스캔한다.
References
https://memorynotfound.com/spring-mvc-xml-configuration-example/
https://howtodoinjava.com/spring-mvc/contextloaderlistener-vs-dispatcherservlet/
https://www.javatpoint.com/spring-mvc-tutorial
from http://eoghks0521.tistory.com/56 by ccl(A) rewrite - 2020-03-17 17:20:28
댓글
댓글 쓰기