[SPRING] 11-2. MVC1 : 커맨드 객체

Yuri Lee·2022년 6월 30일
0

스프링

목록 보기
9/13

1. 커맨드 객체를 이용해서 요청 파라미터 사용

스프링은 요청 파라미터 값을 커맨드(command)객체에 담아주는 기능을 제공.
요청 파라미터 값을 전달받을 수 있는 세터 메서드를 포함하는 객체를 커맨드 객체로 사용함.

//객체를 담을 변수생성
private MemberRegisterService memberRegisterService;
	
//MemberRegisterService 빈객체가 등록되어있고, MemberDao를 함께 주입 받는다.
public void setMemberRegisterService(
			MemberRegisterService memberRegisterService	) {
		this.memberRegisterService = memberRegisterService;
	}
    
@PostMapping("/register/step3")
	public String handleStep3(RegisterRequest regReq) {//커맨드객체로 요청 파라미터 값을 전달 받음
		try {
			memberRegisterService.regist(regReq);
			return "register/step3";
		}catch(DuplicateFormatFlagsException ex) {//동일한 회원이 있을 경우 익셉션 발생
			return "register/step2";
		}
	}

RegisterRequest는 세터메서드를 포함하고 있으며, 여기서 커맨드객체이다.

2. 뷰 jsp 코드에서 커맨드 객체 사용

<p><strong>${registerRequest.name }</strong>
	회원가입을 완료했습니다.</p>
	<p><a href="<c:url value='/main'/>">[첫 화면 이동]</a>

registerRequest는 커맨드객체에 접근할때 사용한 속성 이름이다.
속성 이름은 @ModelAttribute 애노테이션으로 변경할 수 있다.

@PostMapping("/register/step3")
public String handleStep3(@ModelAttribute("formData") RegisterRequest regReq){
}

3. 커맨드 객체와 스프링 폼 연동

스프링 MVC가 제공하는 커스텀 태그를 사용하면 더 간단히 커맨드 객체의 값을 출력할 수 있다.
: < form:form>, < form:input>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> 추가해야함

<h2>회원 정보 입력</h2>
	<form:form action="step3" modelAttribute="registerRequest">
	<p>
		<label>이메일:<br>
		<form:input path="email"/>
		</label>
	</p>
    	<p>
		<label>비밀번호:<br>
		<form:password path="password"/>
		</label>
	</p>
	<input type="submit" value="가입완료">	
	</form:form>

< form:form> 태그를 사용하려면 커맨드 객체가 존재해야하며, 커맨드객체를 필요로 하는 view 페이지로 넘어오는 단게에서 해당 객체를 Model에 넣어야 form 태그가 정상 작동한다.

	@PostMapping("/register/step2")
	public String handleStep2( //파라미터로 모델 객체 생성??
		@RequestParam(value="agree", defaultValue = "false")Boolean agree, Model model) { 
			if(!agree) {
				return "register/step1";
			}
			model.addAttribute("registerRequest", new RegisterRequest()); //모델에 객체 저장
			return "register/step2";
	}
	

4. 컨트롤러 구현 없는 경로 매핑

addViewControllers()메서드를 사용하면 컨트롤러 구현 없이 간단한 코드로 요청경로와 뷰 이름을 연결할 수 있다.

	@Override
	public void addViewControllers(ViewControllerRegistry registry) {
		registry.addViewController("/main").setViewName("main");
	}
profile
개발자 이유리

0개의 댓글