Spring @MVC

2003년부터 있었고, 2.5에서 많이 바꼈다.
세 부분으로 구성되어있다.
- 요청을 다루기 위한 부분
    - DataBinder
    - Validator
    - Tag library macros
- 확장 가능한 dispatcher 프레임워크
    - routing engine
- 컨트롤러 상속구조
    - Controller, ThrowawayController
    - SimpleFromController 어렵다.

Controller -> @Controller
<context:component-scan>

@RequestMapping, HTTP method를 명시할 수 있다. 패턴을 사용할 수 있고, Class에도 선언할 수 있다.

DEMO

리턴값
    - String : 뷰이름
    - ModelAndView
    - Map(ModelMap): 뷰이름은 URL로 판단
    - 아무개arbitrary 타입 객체: 뷰이름은 URL로 판단, 이때는 @ModelAttrubute("뷰에서 이 객체를 참조할 이름")를 사용해야 된다.

DEMO
    - JSP를 정말 간단하게 작성했다. 발표 주제 전달에 필요한 만큼만 코딩한다.

아규먼트는 Spring에 의해서 자동으로 채워진다.
    - @RequestParam("reauest 파라미터")을 아규먼트 앞에 붙여준다.
    - 자동 바인딩.

DEMO
    - Portlet 패키지에 있는 ModelAndView를 import하는 실수 보여줌.
    - 청중이 에러를 적극적으로 잡아준다. 리액션이 좋다.

@Controller를 사용하면 테스트하기 좋다.

@MVC 사용해서 CRUD하기

TYpe || HTTP method || REST(아직 안됨) || Now
Create | POST | /account | /account
Read(one) | GET | /account/1 | /account?id=1
Read(all) | GET | account | account
Update | POST | /account/1/update | /account/update?id=1
Delete | POST | /account/1/1delete | /account/delete?id=1

DEMO
    - 청중이 앞서서 다음에 나올 것을 물어본다.
    - Wait a minute. I will show you.로 대답한다.

CRUD 코딩

    - Get으로 폼뷰 보여주기
    - 바인더 등록하기
@InitBinder public void initBinder(WebDataBinder binder){
// 바인더에 추가.
}
    - POST로 저장하기
@RequestMapping public String createAccount(Account acc, BindingRresult result){
// BindingResult 타입의 변수를 인자로 받아서 거기에 에러가 있으면 ~~페이지로 보내고, 에러 없으면 저장.
}
    - 에러 났을 때 FROM으로 다시 보내기
@RequestMapping public String createAccount(@ModelAttribute("account") Account acc, BindingRresult result){
// 입력한 account 정보를 다시 보여줘야 하니까 @ModelAttribute를 사용한다.

}
   - validation 추가하기
지금은 Validator를 만들고 직접 validate까지 호출해줘야 하지만, 나중에는 세터에 애노테이션만 붙이면 되는 방식으로 바뀔 듯.
    - 세션사용하기
폼뷰 보여주는 메소드에서 new 해서 새로 만든 객체를 세션에 저장한다.
저장하는 메소드에서는 SesstionStatus 타입의 객체를 인자에 추가하고, setComplete()를 호출해서 세션에서 모델을 날려줘야 한다.

Future directions

@PathElements

@RequestMapping(value="/confiirm/{orderId}")
public Date confirm( @PathElement("orderId") String id) {
    // REST 스타일의 URL을 사용할 수 있게 될 것이다.
}

HTML || GET || /account/1
XML || GET | /account/1.xml
JSON || GET | /account/1.json

Flow

FlowContext 객체를 사용해서 @Controller에서 플로우를 시작하도록 할 수 있게된다.