Spring MVC

개념설명
Dispatcher servlet
- front controller 로 작동
- application 으로 들어오는 모든 request를 가로채서 controller 로 보낸다.
- request를 처리하기위해 호출 할 controller 에 대한 handler mapping을 참조한다.
Handler Mapping
- 특정 request를 처리하는 적절한 controller 찾기
- request URL과 controller 클래스 간의 매핑은 XML 설정, annotation 을 통해 수행된다.
View Resolver
논리적 이름으로 실제 뷰 파일을 찾는다
Controller
- 사용자 request를 처리하고 적절한 model 을 만들고 렌더링을 위해 뷰로 전달한다.
View
model data 를 렌더링하고 일반적으로 HTML 출력을 생성한다.
Model
application 데이터를 캡슐화하며 일반적으로 POJO로 구성된다.
필요한 설정
Maven, Tomcat 사용중이라면
Maven configuration
Web deployment descripter
Spring MVC Configuration
- root-context.xml
- servlet-context.xml, dao-context.xml, service-context.xml
Web.xml
DispatcherServlet
Spring Container (WebApplicationContext) 를 인스턴스화 한다.
WebApplicationContext는 일부 configuration 메타데이터와 함께 제공되어야 한다.
<!-- Processes application requests -->
<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>
ⓙ 전체
서블릿 닉 네임 ⓚ
서블릿 클래스 풀네임(패키지 명까지) </servlet-class>
ⓜ
매개변수명
값
실행 순서 값(0값은 서버임의실행) ⓝ
</servlet>
ⓙ 서블릿을 컨테이너에 등록
ⓚ 서블릿 닉네임 등록, 서블릿 이름이 너무 길 때 편의상 사용, 클래스 이름이 짧으면 클래스 이름과 동일하게 등록해도 괜찮다
ⓜ 서블릿 실행될 때 초기값으로 전달될 매개변수
ⓝ 웹 서버가 구동될 때 서블릿의 init() 메서드를 미리 실행할지 지정하고 있다. 각 서블릿의 생성/초기화 순서를 의미한다. (값이 작은 것이 먼저 실행)
ContextLoaderListener
공유되는 bean들을 포함하는 Spring Container 를 인스턴스화 한다.
DispatcherServlet 이 생성한 bean은 ContextLoaderListener 가 생성한 bean을 참조 할 수 있다.
```xml
contextConfigLocation
/WEB-INF/spring/root-context.xml
org.springframework.web.context.ContextLoaderListener
```

추가 설명
ContextLoaderListener 와 DispatcherServlet 은 각각 WebApplicationContext 인스턴스를 생성한다.
ContextLoaderListener 가 생성한 컨텍스트가 root 컨텍스트가 되고, DispatcherServlet 이 생성한
인스턴스는 root 컨텍스트를 부모로 사용하는 자식 컨텍스트가 된다.
자식 컨텍스트들은 root 컨텍스트가 제공하는 bean을 사용할 수 있어서 ContextLoaderListener 를
이용하여 공유되는 bean을 설정하는 것이다.
참고
ContextLoaderListener 는 ContextConfigLocation 을 명시하지 않으면 /WEB-INF/applicationContext.xml 을
설정파일로 사용한다.
Model
Controller 에서 View로 object들을 전달하는데 사용된다
named objects(= model attributes) 의 collection이다.

Model 구현방법
1) java.util.map
2) Model interface
3) ModelMap object
```java
public String getGreeting(Model model) { ... }
```
Model 대신 Map<String, Object> or ModelMap 가능
Spring이 type에 맞는 객체를 만들어서 넣어준다.
1) java.util.map
key는 반드시 String이 되야하며 각 model attribute의 이름을 우리가 직접 결정 해야한다는 단점이 있다.
2) Model
java.util.map 의 단점을 해결했다. 아래 메소드를 이용하면 우리가 이름을 결정할 필요가 없다.
Model addAttribute(Object value)
- value를 추가한다. value의 패키지 이름을 제외한 단순 클래스 이름을 모델 이름으로 사용한다. 이 때 첫 글자는 소문자로 처리한다.
- value가 배열이거나 컬렉션인 경우 첫 번째 원소의 클래스 이름 뒤에 "List"를 붙인 걸 모델 이름으로 사용한다. 이 경우에도 클래스 이름의 첫자는 소문자로 처리한다.
Model addAttribute(String key, Object value)
우리가 직접 이름을 결정할 수도 있다.
3) ModelMap
addAttribute() 메소드를 chained call 할 수 있다.
```java
model.addAttribute("key1", value1)
.addAttribute("key2", value2)
```
@Component annotation이 있는 경우 bean으로 등록한다.
@Component 를 역할에 따라 구체화하면 @Controller, @Service, @Repository 로 이들 또한 bean으로 등록
@RequestMapping
URL과 class 또는 method를 매핑한다.
해당 URL이 오면 매핑된 method로 처리
보통 공통된 URL을 class level 로 매핑하고 세부적으로 method 에 매핑한다.
댓글남기기