HTTP 요청 parameter를 저장 한 객체, 기본적으로 클래스 이름을 모델명으로 사용, @ModelAttribute annotation 설정으로 모델명을 설정할 수 있음
Errors, BindingResult
HTTP 요청 파라미터를 커맨드 객체에 저장한 결과, 커맨드 객체를 위한 파라미터 바로 다음에 위치
SessionStatus
폼 처리를 완료 했음을 처리하기 위해 사용, @SessionAttributes annotation을 명시한 session속성을 제거하도록 이벤트를 발생 시킨다.
Servlet API 사용
HttpSession의 생성을 직접 제어해야 하는 경우
Controller가 Cookie를 생성해야 하는 경우
Servlet API를 선호하는 경우
Controller Class에서 method의 return type 종류
Return Type
설명
ModelAndView
model정보 및 view 정보를 담고있는 ModelAndView 객체
Model
view에 전달할 객체 정보를 담고있는 Model을 반환한다. 이때 view 이름은 요청 URL로부터 결정된다.(RequestToViewNameTranslator)
Map
view에 전달 할 객체 정보를 담고 있는 Map을 반환한다. 이때 view 이름은 요청 URL로부터 결정된다.(RequestToViewNameTranslator)
String
view 이름을 반환한다
View
View 객체를 직접 리턴, 해당 View 객체를 이용해서 view를 생성
void
method가 ServletResponse나 HttpServletResponse 타입의 parameter를 갖는 경우 method가 직접 응답을 처리한다고 가정한다. 그렇지 않을 경우 요청 URL로부터 결정된 View를 보여준다.(RequestToViewNameTranslator)
@ResponseBody Annotation 적용
method에서 @ResponseBody annotation이 적용된 경우, 리턴 객체를 Http 응답으로 전송한다. HttpMassageConverter를 이용해서 객체를 HTTP 응답 스트림으로 변환한다.
View 지정
View 자동 지정
RequestToViewNameTranslator를 이용해서 URL로 부터 view 이름을 지정한다.
자동 지정 유형
return type이 Model이나 Map인 경우
return type이 void이면서 ServletResponse나 HttpServletResponse 타입의 parameter가 없는 경우
주요 HttpMessageConverter 구현 Class - AnnotationMethodHandlerAdapter 는 (*) 표시된 클래스를 기본적으로 사용
구현클래스
설명
ByteArrayHttpMessageConverter(*)
HTTP 메세지와 byte 배열 사이의 변환을 처리 컨텐츠 타입은 application/octet-stream
StringHttpMessageConverter(*)
HTTP 메세지와 String 사이의 변환을 처리 컨텐츠 타입은 text/plain:charset=ISO-8859-1
FromHttpMessageConverter(*)
HTML 폼 데이터를 MultiValueMap으로 전달받을때 사용 컨텐츠 타입은 application/x-www-form-urlencoded
SourceHttpMessageConverter(*)
HTTP 메세지와 javax.xml.transform.Source 사이의 변환을 처리 컨테츠 타입은 application/xml 또는 text/xml
MashallingHttpMessageConverter
스프링의 Marshaller와 Unmarshaller을 이용해서 XML HTTP 메시지와 객체 사이의 변환을 처리, 컨텐츠 타입은 application/xml 또는 text/xml
MappingJacksonHttpMessageConverter
Jackson 라이브러리를 이용해서 JSON HTTP 메시지와 객체 사이의 변환 처리 컨테츠 타입은 application/json
Content-Type과 Accept헤더 기반의 변환처리
@AnnotationMethodHandlerAdapter가 HttpMessageConverter를 이용해서 요청 몸체 데이터를 @RequestBody Annotation이 적용된 자바 객체로 변환 할 때에는 HTTP요청헤더의 Content-Type헤더에 명시된 미디어 타입(MIME)을 지원하는 HttpMessageConverter를 구현체로 사용
@ResponseBody Annotation을 이용해서 리턴하는 객체를 HTTP 메시지의 body로 변환할 때에는 HTTP요청헤더의 Accept 헤더에 명시된 미디어타입을 지원하는 HttpMessageConverter 구현체를 선택
WebSystem 간의 XML, JSON 형식의 Data 를 주고받는 경우
XML, JSON Java Object (unmarshalling)
Java Object XML, JSON (marshalling)
RequestBody , ResponseBody Annotation 은 HTTP 메시지 Body 에 Java 객체를 XML 이나 JSON 등의 타입으로 변환하여 담고 , 역으로 변환하는데 사용
marshalling 한 객체 의 메모리에서의 표현방식을 저장 또는 전송에 적합한 다른 데이터 형식으로 변환하는 과정이다 또한 이는 데이터를 컴퓨터 프로그램의 서로 다른 부분 간에 혹은 한 프로그램에서 다른 프로그램으로 이동해야 할 때도 사용된다 이는 대체로 어떤 한 언어로 작성된 프로그램의 출력 매개변수들을 , 다른 언어로 작성된 프로그램의 입력으로 전달해야 하는 경우에 필요하다 마샬링은 직렬화와 유사하며 동일하게 간주되기도 하지만 매개변수를 바이트 스트림으로 변환하는 직렬화와는 차이가 있다
WebApplication 동작 원리
실행순서
웹 어플리케이션이 실행되면 Tomcat(WAS)에 의해 web.xml이 loading
web.xml에 등록되어 있는 ContextLoaderListener (Java Class)가 생성 ContextLoaderListener class 는 ServletContextListener interface 를 구현하고 있으며 , ApplicationContext 를 생성하는 역할을 수행
생성된 ContextLoaderListener는 root-context.xml을 loading
root-context.xml에 등록되어 있는 Spring Container가 구동. 이 때 개발자가 작성한 Business Logic에 대한 부분과 Database Logic(DAO), VO 객체들이 생성
Client로 부터 요청(request)가 들어옴
DispatcherServlet (Servlet)이 생성 DispatcherServlet 은 FrontController 의 역할을 수행 Client로부터 요청 온 메시지를 분석하여 알맞은 PageController 에게 전달하고 응답을 받아 요청에 따른 응답을 어떻게 할 지 결정 . 실질적인 작업은 PageController 에서 이루어 진다 이러한 클래스들을 HandlerMapping , ViewResolver Class 라고 함
DispatcherServlet 은 servlet context.xml 을 loading.
두번째 Spring Container 가 구동되며 응답에 맞는 PageController 들이 동작 . 이 때 첫번째 Spring Container 가 구동되면서 생성된 DAO, VO, ServiceImpl 클래스들과 협업하여 알맞은 작업을 처리