1. @RequestMapping, @GetMapping, @PostMapping
@DeleteMapping, @PutMapping ... 별거없으므로 설명하지않겠다.
@Controller
@RequestMapping("/survey")
public class SurveyController {
@GetMapping
public String form() { ... }
@PostMapping
public String submit(@ModelAttribute("ansData") AnsweredData data) { ... }
}
2. 리다이렉트
/join 접속시 /register/step1 로 redirect 하는 예제
@Controller
public class RegisterController {
@GetMapping("/join")
public String redirectToStep1() {
return "redirect:/register/step1";
}
@GetMapping("/register/step1")
public String register() {
}
}
"redirect: (경로)" 를 리턴하면 됨.
이 때 (경로)가 "/"로 시작할 경우 웹 애플리케이션 경로(context path)를 기준으로 이동경로를 생성함.

* 웹 애플리케이션과 Context Path 란? *
3. 요청 파라미터 접근
HTML form 태그로부터 오는 요청을 받는 방법
3.1 HttpServletRequest 직접 이용
@Controller
@RequestMapping("/register")
public class JoinController {
@PostMapping("/step2")
public String handleStep2(HttpServletRequest request) {
String agreeParam = request.getParameter("agree");
if (Objects.isNull(agreeParam) || "true".equals(agreeParam)) {
return "join/writeinfo";
}
return "join/agree";
}
}
3.2 @RequestParam 어노테이션 이용
@Controller
@RequestMapping("/register")
public class RegisterController {
@PostMapping("/step2")
public String handleStep2(@RequestParam(required="true" defaultValue=false) Boolean agree) {
if (!agreeValue) {
return "register/step1";
}
return "register/step2";
}
}
@Controller
@RequestMapping("/register")
public class RegisterController {
@PostMapping("/step2")
public String handleStep2(@RequestParam(value="agree" required="true" defaultValue=false) Boolean agreeValue) {
if (!agreeValue) {
return "register/step1";
}
return "register/step2";
}
}
* @RequestParam 속성
value
HTTP request 파라미터 이름 지정

디폴트는 파라미터 변수 이름
required
required=true 인 파라미터에 들어가는 값이 없으면 exception 발생
defaultValue
파라미터에 들어가는 값이 없을 때 default로 집어넣을 값 설정
3.3 커맨드 객체를 이용해서 요청 파라미터 사용하기
@Controller
@RequestMapping("/register")
public class RegisterController {
@PostMapping("/step1")
public String agree(AgreeRequest agreeRequest) {
if (!agreeRequest.isAgree()) {
return "register/step1";
}
return "register/step2";
}
}
앞서 HttpServletRequest 혹은 @RequestParam 으로 요청 파라미터를 받는 방식은 파라미터가 많아질 경우 유지보수적으로 안좋아지는데 이 때 커멘드 객체를 이용해서 요청 파라미터를 받으면 된다.
4. 커멘드 객체를 뷰(JSP)에서 사용하기
스프링 MVC 는 커맨드 객체의(첫 글자를 소문자로 바꾼) 클래스 이름과 동일한 속성 이름을 사용해서 커맨드 객체를 뷰에 전달한다.
@ModelAttribute 어노테이션으로 커맨드 객체 속성 이름 변경
@Controller
@RequestMapping("/register")
public class RegisterController {
@PostMapping("/step1")
public String agree(AgreeRequest agreeRequest) {
if (!agreeRequest.isAgree()) {
return "register/step1";
}
return "register/step2";
}
}
WEB-INF/view/register/step2.jsp
<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html>
<html>
<head>
<title>회원가입</title>
</head>
<body>
<p>약관 동의 결과 : ${agreeRequest.agree}</p> <!-- true -->
</body>
</html>
5 커맨드 객체와 스프링 폼 연동
스프링 MVC는 <form:form>, <form:input> 등,
HTML 폼과 커맨드 객체를 연동하기 위한 JSP 태그 라이브러리를 제공한다.
* 회원가입 입력 오류시 이메일과 이름을 이전값으로 채워넣는 예제
1. <form:form> 사용 전
<%@ page contentType="text/html; charset=utf-8" %>
<!DOCTYPE html>
<html>
<head>
<title>회원가입</title>
</head>
<body>
<h2>회원 정보 입력</h2>
<form action="step3" method="post">
<p>
<label>이메일:<br>
<input type="text" name="email" value="${registerRequest.email}"/>
</label>
</p>
<p>
<label>이름:<br>
<input type="text" name="name" value="${registerRequest.name}"/>
</label>
</p>
<p>
<label>비밀번호:<br>
<input type="password" name="password"/>
</label>
</p>
<p>
<label>비밀번호 확인:<br>
<input type="password" name="confirmPassword"/>
</label>
</p>
<input type="submit" value="가입 완료">
</form>
</body>
</html>
2. <form:form> 사용
<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html>
<html>
<head>
<title>회원가입</title>
</head>
<body>
<h2>회원 정보 입력</h2>
<form:form action="step3" method="post" 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>
DispatcherServlet 은 컨트롤러의 실행 결과를 HandlerAdapter를 통해서 ModelAndView 형태로 받는다.
그런 다음 DispatcherServlet은 ViewResolver에게 View 객체를 요청하고, 리턴된 View 객체에게 응답 생성을 요청한다.
바로 이 때, 즉 DispatcherServlet이 View객체에게 응답 생성을 요청할 때
Model에 담긴 값을 Map 형식으로 전달한다.
이 예제의 경우 key가 "registerRequest" 이고 값이 RegisterRequest 객체인 요소가 Map 에 들어있는 것이다. 이 Map이 View에게 전달되는 것이다.
그런데 <form:form ... modelAtribute="(attributeName)"> 에서 (attributeName) 을 key로 갖는 객체가 이 Map에 없으면 Internal Server Error 가 발생한다. <form:form> 을 사용할때는 이에 대응하는 modelAttribute 가 반드시 존재해야한다.
6 컨트롤러 구현 없는 경로 매핑
<p><a href="<c:url value='/main'/>">[첫화면으로 이동]</a></p>
@Controller
public class MainController {
@RequestMapping("/main")
public String main() {
return "main";
}
}
위 컨트롤러 코드는 요청 경로와 뷰 이름을 연결해주는것에 불과하다.
이런 경우 다음과 같이 WebMvc 설정코드로 대체할 수 있다.
package config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer {
...
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/main")
.setViewName("main");
}
}
커맨드 객체 : 중첩, 컬렉션 프로퍼티
.
Model 을 통해 컨트롤러에서 뷰에 데이터 전달하기
.
웹 애플리케이션 경로(context path)
'2021 Spring Study' 카테고리의 다른 글
Spring 19. 세션, 인터셉터, 쿠키 (0) | 2021.02.28 |
---|---|
Spring 18. 커맨드 객체 validation (0) | 2021.02.18 |
Spring 16. 서블릿 & 서블릿 컨테이너 & spring MVC (0) | 2021.01.29 |
Spring 15. Transaction Propagation (0) | 2021.01.21 |
Spring 14. DB 연동 (2) - JDBC 프로그래밍과 JdbcTemplate (0) | 2021.01.21 |