Chapter 11 내용
- @RequestMapping설정
- 요청 파라미터 접근
- 리다이렉트
- 개발 환경 구축
- 스프링 폼 태그
- 모델처리
요청 매핑 애노테이션을 이용한 경로 매핑
1. @Contlloer
요청 애노테이션
- RequestMapping
- GetMapping
- PostMapping
@Controller
public class HelloController {
@GetMapping("/hello")
public String hello(Model model, @RequestParam(value = "name", required = false)String name) {
model.addAttribute("greeting", "안녕하세요, " + name);
System.out.println("hello");
return "hello";
}
}
위의 코드에서는 /hello 요청 경로를 hello() 메서드가 처리한다.
2. @GetMapping, @PostMapping 구분
@Controller
public class RegisterController {
private MemberRegisterService memberRegisterService;
public void setMemberRegisterService(
MemberRegisterService memberRegisterService) {
this.memberRegisterService = memberRegisterService;
}
@RequestMapping("/register/step1")
public String handleStep1() {
return "register/step1";
}
@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";
}
@GetMapping("/register/step2")
public String handleStep2Get() {
return "redirect:/register/step1";
}
}
|
cs |
- 주로 폼을 전송할 때는 POST 방식을 사용
스프링 MVC는 별도 설정이 없으면 GET과 POST 방식에 상관없이 @RequestMapping에 지정한 경로와 일치하는 요청을 처리한다.
위의 코드처럼 @PostMapping("/register/step2")와 같이 설정하면, Get방식의 @GetMapping("/register/step2") 요청 경로는 처리하지 않는다.
3. 요청 파라미터 접근
이전 버전에서는 @RequestMapping 애노테이션의 method 속성을 사용해 HTTP방식을 제한해 사용했다.
package controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class LoginController {
@RequestMapping(value = "member/login", method = RequestMethod.GET)
public String form(){
...
}
@RequestMapping(value = "member/login", method = RequestMethod.POST)
public String form(){
... }
}
|
cs |
요즘 버전에서는 두가지 버전이 있다,
(HttpServlet Request를 직접 이용하는 방법
@RequestParam을 사용
(1) HttpServlet Request를 직접 이용하는 방법
HttpServletRequest의 getParameter()메서드를 이용해서 파라미터 값을 구하면 된다.
@PostMapping("/register/step2")public String handleStep2(HttpServletRequest request) {
String agreeParam = request.getParamter("agree");
if (agreeParam == null || !agreeParam.equals("true")) {
return "register/step1";
}
return "register/step2";
}
(2) @RequestParam을 사용
요청 파라미터에 개수가 몇 개 안되면 @ReuestParam애노테이션을 사용해 간단하게 요청 파라미터의 값을 구할 수 있다.
@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";
}
속성 | 타입 | 설명 |
value | String | HTTP 요청 파라미터의 이름을 지정 |
required | boolean | 필수 여부를 지정, 이 값이 true 이면서 해당 요청 파라미터에 값이 없으면 익셉션이 발생한다. 기본값은 true |
defaultValue | String | 요청 파라미터가 값이 없을 때 사용할 문자열 값을 지정한다. 기본값은 없다. |
리다이렉트 처리
"redirect:"로 시작하는 경로를 리턴하면 나머지 경로를 이용해 리다이렉트할 경로를 구할 수 있다.
@PostMapping("/register/step2") public String handleStep2( ... }
위의 코드에서 POST방식만 처리했기 때문에 url에서 직접 요청하는 GET방식을 처리 할 수 없다.
@GetMapping("/register/step2") public String handleStep2Get() { return "redirect:/register/step1"; }
Get요청으로 왔을 때 에러화면이 나타나는데 에러 화면이 아닌 리다이렉트해서 다른 뷰를 보여줄 수 있다.
커맨드 객체를 이용해서 요청 파라미터 사용하기
@PostMapping("/register/step3") public String handleStep3(RegisterRequest regReq) {
try {
memberRegisterService.regist(regReq); return "register/step3";
}
catch(DuplicateMemberException ex) {
return "register/step2";
}
}
폼 전송 요청을 처리하는 컨트롤러 코드는 파라미터의 값을 구하기 위해서 HttpServletRequest를 사용해서 getParamter를 받아 올 수 있다. 하지만, 요청 파라미터 개수가 증가할 때마다 메서드의 코드가 길어지는 단점이 있다.
RegisterReqeust 커맨드 객체
- setEmail()
- setName()
- setPassword()
- setConfirmPassword()
이 메서드를 이용하여 요청 파라미터 값을 커맨드 객체에 복사한디 regReq 파라미터로 전달한다.
뷰 JSP 코드에서 커맨드 객체 사용하기
<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<title>회원가입</title>
</head>
<body>
<p><strong>${registerRequest.name}님</strong>
회원 가입을 완료했습니다.</p>
<p><a href="<c:url value='/main'/>">[첫 화면 이동]</a></p>
</body>
</html>
|
cs |
커맨드 객체의 기본이름은 registerRequest로 클래스 이름을 사용하고, 뷰 코드에서 해당 이름을 사용해서 커맨드 객체에 접근할 수 있다.
@ModelAttribute 기본 이름 수정
@PostMapping("/register/step3") public String handleStep3(@ModelAttribute("formData") RegisterRequest regReq) {
try {
memberRegisterService.regist(regReq); return "register/step3";
}
catch(DuplicateMemberException ex) {
return "register/step2";
}
}
ModelAttribute를 사용해서 formData이름을 지정해 주면 뷰에서는 ${formData.name} 으로 접근해 사용하면 된다.
REFERENCE
초보 웹 개발자를 위한 스프링 5 프로그래밍 입문(최범균)
'공부 > Spring' 카테고리의 다른 글
[Spring] Chapter 14 - Date 타입 변환, @PathVariable 경로 변수 처리, 익셉션 처리하기 (0) | 2021.07.17 |
---|---|
[Spring] Chapter 12 - MVC 2 : 메시지, 커맨드 객체 검증 (1) | 2021.07.11 |
[Spring] Chapter 9-10장 Intellij에서 스프링 MVC 시작하기(Spring+ Gradle + MVC) (3) | 2021.07.11 |
[Spring] Chapter 08 - DB 연동(MySQL + Gradle + JDBC) (0) | 2021.07.03 |
[Spring] Chapter 07 - Spring AOP (0) | 2021.06.13 |