스프링 MVC의 등장 인물과 동작개요
#.DispatcherServlet
- 프런트 컨트롤러 담당
- 모든 http요청을 받아들여 그 밖의 오브젝트 사이의 흐름을 제어
- 기본적으로 스프링 MVC의 DispatcherServlet 그대로 사용
#.HandlerMapping
- 클라이언트의 요청을 바탕으로 어느 컨트롤러를 실행할지 결정
#.Model
- 컨트롤러에서 뷰로 넘겨줄 오브젝트를 저장하기 위한 오브젝트.
#.ViewResolver
- View 이름을 바탕으로 View오브젝트를 결정
#.View
- 뷰에 화면 표시 처리를 의뢰
#.비즈니스 로직
- 비즈니스 로직을 실행.
#.컨트롤러
- 클라이언트 요청에 맞는 프레젠테이션 층의 애플리케이션 처리를 실행해야 함.
#.뷰 / JSP
- 클라이언트에 대해 화면 표시 처리. 자바에서는 jsp 등으로 작성하는 일이 많다.
동작개요
1. DispatcherServiet은 브라우저로부터 요청을 받아들입니다.
2. DispatcherServet은 요청된 URL을 핸들러 매핑(Hand lerMapping) 오브젝트에 넘기고 호출 대상의 컨트롤러 오브젝트를 얻어 URL에 해당하는 메서드를 실행합니다.
3. 컨트롤러 오브젝트는 비즈니스 로직으로 처리를 실행하고, 그 결과를 바탕으로 뷰에 전달할 오브젝트를 Model 오브젝트에 저장합니다.끝으로 컨트롤러 오브젝트는 처리 결과에 맞는 View 이름을 반환합니다.
4. DispatcherServiet은 컨트롤러에서 반환된 View 이름을 뷰 리졸버(ViewResolver)에 전달해서 View 오브젝트를 얻습니다.
5. DispatcherServiet은 View 오브젝트에 화면 표시를 의뢰합니다.
6. View 오브젝트는 해당하는 뷰를 호출해서 화면 표시를 의뢰합니다.
7· 뷰는 Model 오브젝트에서화면 표시에 필요한 오브젝트를 가져와 화면 표시 처리를 실행합니다.
view와 뷰 리졸버
스프링 mvc에서는 view 인터페이스를 구현한 view 오브젝트가 애플리케이션 개발자가 작성한 뷰를 호출해서 화면 표시를 처리한다. 예를 들어 JSTL로 작성한 뷰라면 JstlView 클래스의 오브젝트가, Velocirty의 템플릿으로서 작성한 뷰라면 Velocirty클래스의 오브젝트가 View의 오브젝트로 동작한다. 스프링 MVC에는 여러가지 뷰 기술에 대응하는 클래스를 준비하고 있다.
그런데 View 오브젝트는 컨트롤러 클래스의 반환값으로 View 오브젝트를 반환할 수 있다.
public View showAll(Model model){
return new JstlView("/WEB-INF/views/user/user.jsp");
}
하지만 이방법으로는 컨트롤러와 뷰 기술이 밀접하게 결합해버려, 컨트롤러와 뷰 사이의 독립성이 유지되지 않는다.
그래서 중요한 것이 뷰 리졸버 오브젝트다. 뷰 리졸버 오브젝트는 컨트롤러와 뷰 사이를 약한 결합으로 유지하는 역할을 하고, 컨트롤러가 반환한 View이름으로 VIew오브젝트를 생성한다.
컨트롤러에서 직접 View 오브젝트를 반환 하지 않고, View 이름만 반환하게해서 View 오브젝트의 생성을 뷰 리졸버에 맡긴다. 개발자는 화면이 JSP인지 Velocity인지 의식할 필요 없이 화면에 표시하는 오브젝트를 반환하는 것에 집중하면 된다.
뷰리졸버 클래스
UrlBasedViewResolver, ResourceBundleViewResolver, XmlViewResolver, BeanNameViewResolver.
이중에서 자주 사용하는 것은 UrlBasedViewResolver클래스이다. 이 뷰 리졸버에는 접두사와 접미사를 설정한다.
예를들어 접두사/WEB-INF/views/, 접미사.jsp
이상태에서 UrlBasedViewResolver에 user/list를 뷰 이름으로 전달하면 URL이 /WEB-INF/views/user/list.jsp인 View의 오브젝트가 생성된다.어느 뷰 클래스를 기반으로 오브젝트가 생성되는가는 UrlBasedViewResolver의 viewClass프로퍼티에 설정해야 하지만,뷰 클래스를 고정한 UrlBasedViewResolver를 상속한 뷰 리졸버가 여러개 있으므로 대응하는 뷰 리졸버가 있으면 이를 사용하면 된다.
스프링 MVC와 관련된 스프링의 기능
1.메시지관리
2.데이터 바인딩
3.검증 처리
1.스프링의 메시지 관리
스프링의 DI 컨테이너에는 메시지를 관리하는 기능이 있다. 예를들면, 메시지를 코드와 연결해 관리하고, 국제화에 대응한다.
메시지 관리의 중심은 MessageSource오브젝트이다. 이 오브젝트에는 메시지 코드에서 메시지를 가져오는 getMessage 메서드가 정의돼있어, 이 메시지를 이용해서 메시지를 가져 올 수 있다. 또한 검증 처리의 오류 메시지로 MessageSource 오브젝트 관리 메시지를 사용하거나 JSTL의 message 태그로 MessageSource 오브젝트를 관리하는 메시지를 표시할 수도 있다.
MessageSource는 인터페이스며, 몇가지 구현 클래스가 있다. 그중 하나가 ReloadableResourceBundleMessageSource 클래스로, 이 클래스는 일정 시간마다 프로퍼티 파일의 변경 여부를 확인해 메시지 리소스 파일의 메시지를 읽어 올 수 있다. 또한 메시지 리소스 파일을 언어별로 여러 개 준비해 해당 지역 언오로 된 메시지 리소스 파일에서 메시지를 가져와 국제화를 구현 할 수도 있다.
데이터 바인딩
사용자가 입력한 정보를 메모리의 오브젝트에 설정 처리하는 것이다. HTTP 요청에 저장된 요청 파라미터 등의 문자 정보를 프로그램에서 사용한 형으로 변환하는 기능으로 볼 수 있다.
예를 들어 ModelAttribute 오브젝트의 Date 형 프로퍼티에 다음과 같은 어노테이션을 설정하면 사용자가 입력한 2016/11/11 과 같은 문자열로 Date 오브젝트에 자동으로 변환해서 저장해 준다.
public class Customer implements java.io.Serializable {
private int id;
//검증처리
@NotNull
@Size(max = 20)
private String name;
@NotNull
@DateTimeFormat(pattern = "yyyy/MM/dd")
private Date birthday;
}
또한 데이터 바인딩은 다음에 설명할 검증 처리와 밀접한 관계를 맺고 있어서 오류 발생 시 처리등의 검증과 같은 사양으로 처리할 수 있다.
검증처리
스프링의 검증 처리 클래서는 org.springframework.validator 패키지에 포함되고, 웹 관련 클래스가 포함된 org.springframework.web 패키지에는 독립된다. 하지만 스프링의 검증처리는 사실 구현되지 않았다. 스프링이 준비한 것은 검증 처리 인터페이스와 검증 처리 결과를 저장하는 오브젝트뿐이다. 실제 애플리케이션에서 검증처리를 하려면 검증처리를 구현해야 하는데, 스프링의 최근 표준 스펙은 JSR-303/JSR-349로 Bean 검증과 연계하는 구조를 갖추고 있다. Bean 검증이란 애플리케이션에서 오브젝트에 제약을 선언적으로 정의하고, 그 제약을 근거로 검증하는 구조다. Bean은 검증사양이고, 구현은 하이버네이트 검증이 유명하다.
package sample.customer.biz.domain;
import java.util.Date;
import javax.validation.constraints.AssertFalse;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlRootElement;
import org.springframework.format.annotation.DateTimeFormat;
@XmlRootElement
public class Customer implements java.io.Serializable {
private int id;
//검증처리
@NotNull
@Size(max = 20)
private String name;
@NotNull
@Pattern(regexp = ".+@.+")
private String emailAddress;
@NotNull
@DateTimeFormat(pattern = "yyyy/MM/dd")
private Date birthday;
@Max(9)
@Min(0)
private Integer favoriteNumber;
}
스프링 MVC에서는 Bean 검증을 입력 검사에 이용할 수 있다. 게다가 화면에서 입력된 값이 저장되는 인수에 @Valid 어노테이션을 설정해두면 알아서 검증 처리를 해준다.
참고: 스프링 4입문 (한빛미디어)
'웹개발 > 스프링' 카테고리의 다른 글
스프링 4 MVC - part 3 (0) | 2020.11.11 |
---|---|
스프링 4 MVC - part 2 (0) | 2020.11.11 |
스프링 4 비즈니스 로직 설계와 트랜잭션 (0) | 2020.11.09 |
스프링 4 DAO 구현 (1) | 2020.11.08 |
스프링 4 AOP (0) | 2020.11.08 |