본문 바로가기

[SPRING]

스프링 공부 2일차. HTML폼과 커맨드 객체

커맨드 객체(Command Object) == Java Bean

SPRING MVC는 HTML 폼에 입력한 데이터를 자바빈 객체를 이용해서 전달받을 수 있다. 예를 들어 아래의 코드와 같이 HTML폼의 항목 이름과 자바빈 클래스의 프로퍼티의 이름이 일치할 경우 폼에 입력한 값을 해당 자바빈 클래스의 프로퍼티값으로 설정해주는 기능을 제공한다.

 

<form method="post">
	<input type="hidden" name="parentId" value="0" />
    제목 : <input type="text" name="title" /> <br/>
    내용 : <textarea name="content"></textarea><br/>
    <input type="submit"/>
</form>
					||
    입력 항목의 이름과 일치하는 프로퍼티에 값이 저장
                    ||
	public class NewArticleCommand {
    	private String title;
        private String content;
        private int parentId;
        
        + Get과 Set메서드

 

HTML 폼과 자바빈 클래스를 매핑하고, @RequestMapping 어노테이션(Annotation)이 적용된 메서드의 파라미터로 자바빈 타입을 추가해주기만 하면 된다. 예를 들어, 폼에 입력한 값을 NewArticleController 클래스에 전달 받고 싶다면 다음과 같이 요청 처리 메서드에 NewArticleCommand 타입의 파라미터를 추가해준다.

 

@Controller
@RequestMapping("/article/newArticle.do")
public class NewArticleController {
	@RequestMapping(method = "RequestMethod.POST")
    public String submit(NewArticleCommand command) {
    	//command.getTitle() : title 파라미터 값 저장
        //command.getContent() : content 파라미터 값 저장
        //command.getParentId() : parentId 파라미터 값 저장
        return "article/newArticleSubmitted";

 

뷰 코드에서는 컨트롤러의 @RequestMapping Annotation 메서드에서 전달받은 커맨드 객체에 접근할 수 있다. 위 코드와 같이 submit()메서드 NewArticleCommand 타입의 커맨드 객체를 전달 받았다.

 

이 경우 컨트롤러의 처리 결과를 보여주는 뷰 코드에서는 커맨드 객체의 클래스 이름을 이용해서 커맨드 객체에 접근할 수 있다. 즉, 커맨드 객체는 모델에 자동으로 추가된다. 단, 클래스 이름의 첫 글자는 소문자이다.

 

...
<body>
	${newArticleCommand.title}

뷰에서 사용할 모델의 이름을 변경하고 싶다면, @ModelAttribute Annotation을 이용할 수 있다.

 

@Controller
@RequestMapping("/article/newArticle.do")
public class NewArticleController {
	@RequestMapping(method = "RequestMethod.POST")
    public String submit(@ModelAttribute("command") NewArticleCommand command) {
    	articleService.writeArticle(command);
        return "article/newArticleSubmitted";
   	}
}

 

@ModelAttribute Annotation을 이용해서 커맨드 객체의 모델 이름을 지정했다면, 뷰 코드에서는 다음과 같이 지정한 모델 이름을 사용해서 커맨드 객체에 접근할 수 있다.

 

${command.title}