Chap 11. MVC 1 : 요청 매핑, 커맨드 객체, 리다이렉트, 폼 태그, 모델
요청 매핑 애노테이션을 이용한 경로 매핑
요청 매핑 에노테이션에는 @RequestMapping, @GetMapping, @PostMapping 등이 있다. 요청 매핑 애노테이션은 요청경로를 해당 메서드가 처리하도록 설정한다.
GET과 POST 구분 : @GetMapping, @PostMapping
GET과 POST 방식에 상관없이 @RequestMapping에 지정한 경로와 일치하는 요청처리를 수행한다.
만약 POST 방식 요청만 처리하고 싶다면 다음과같이 @PostMapping 애노테이션을 사용해서 제한한다.
import org.springframework.web.bind.annotation.PostMapping;
@Controller
public class RegisterController{
@PostMapping("/register/step2")
public String handleStep2(){
return "register/step2";
}
}
handlerStep2() 메서드는 POST 방식으로만 요청 경로를 처리하고, @PostMapping 대신 @GetMapping 애노테이션 사용 시 GET 방식만 처리하게 제한한다.
리다이렉트 처리
POST방식만 처리하는 컨트롤러에게 GET방식 처리를 보내면 405에러가 발생한다. 이런 잘못된 요청이 들어올 때, 특정 페이지로 리다이렉트 시키는 방법이 있다. 리다이렉트 처리 시 model을 가지고 가지 않는다. 따라서 입력한 내용이 초기화 된다. 상대 경로로 주소 지정 시 주소 변화가 없고, 입력값이 유지되지만, 리다이렉트로 처리 시 해당 리다이렉트 주소로 주소가 변경되고, 입력값이 초기화 된다.
"/"로 시작하지 않으면 현재 경로를 기준으로 상대경로가 적용된다.
커맨드 객체를 이용해서 요청 파라미터 사용하기
스프링에서 요청 파라미터의 값을 커맨드 객체에 담아주는 기능을 제공한다. 요청 파라미터 값을 전달 받을 수 있는 세터 메서드를 포함하는 객체를 커맨드 객체로 사용한다. 커맨드 객체는 다음과 같이 요청 매핑 애노테이션이 적용된 매서드의 파라미터에 위치한다.
@PostMapping("/register/step3"){
public String handleStep3(RegisterRequest regReq){
...
}
}
@ModelAttribute 애노테이션으로 커맨드 객체 속성 이름 변경
@PostMapping("/register/step3")
public String bandleStep3(@ModelAttribute("formData") RegisterRequest regReq){
...
}
@ModelAttribute 애노테이션은 속성 이름을 값으로 설정한다. 위 코드에서 "formData" 라는 이름으로 커맨드 객체에 접근 가능하다.
커맨드 객체와 스프링 폼 연동
스프링 MVC가 제공하는 커스텀 태그 사용시 커맨드 객체 값을 간단히 출력 할 수 있다. <form:form>태그와 <form:input>태그 사용 시 다음 코드처럼 커맨드 객체 값을 폼에 출력할 수 있다.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원가입</title>
</head>
<body>
<h2>회원 정보 입력</h2>
<form:form action="step3" modelAttribute="registerRequest">
<p>
<label>이메일:<br>
<form:input path="email" />
</label>
</p>
<p>
<label>이름:<br>
<form:input path="name" />
</label>
</p>
<p>
<label>비밀번호:<br>
<form:password path="password" />
</label>
</p>
<p>
<label>비밀번호 확인:<br>
<form:password path="confirmPassword" />
</label>
</p>
<input type="submit" value="가입 완료">
</form:form>
</body>
</html>
modelAttribute는 커맨드 객체의 속성 이름을 지정한다. 디폴트 값은 "command"이다. 현재 예제 코드에서 커맨드 객체 속성 이름은 "registerRequest" (dto역할) 이므로 이것을 modelAttribute 속성값으로 설정한다.
커맨드 객체 : 중첩 / 콜렉션 프로퍼티
스프링 MVC는 커맨드 객체의 요청 파라미터 값을 프로퍼티에 맞게 커맨드 객체에 설정해준다. HTTP 요청 파라미터 이름이 "프로퍼티이름[인덱스]" 형식이면 List 타입 프로퍼티의 값 목록으로 처리한다. HTTP 요청 파라미터 이름이 "프로퍼티이름.프로퍼티이름"과 같은 형식이면 중첩 프로퍼티 값을 처리한다.