Simplifying CRUD Web Applications
Spring @MVC
세 부분으로 구성되어있다.
- 요청을 다루기 위한 부분
- 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 코딩
- 바인더 등록하기
@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
@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에서 플로우를 시작하도록 할 수 있게된다.