Spring - 요청 파라미터 접근 / 리다이렉트(redirect)

요청 파라미터 접근

.jsp 파일에서 값을 입력한 후 다음 단계로 전달하고 싶은 파라미터가 있을 것이다. 이때 값에 접근을 어떻게 할까

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<!DOCTYPE html>
<html>
<head>
<!-- <meta charset="UTF-8"> -->
	<title><spring:message code="member.register"/></title>
</head>
<body>
	<h2><spring:message code="term"/></h2>
	<p>약관 내용</p>
	<form action="step2" method="post">
	<label>
		<input type="checkbox" name="agree" value="true">
		<spring:message code="term.agree"/>
	</label>
	<input type="submit" value="<spring:message code="next.btn" />" />
	</form>
</body>
</html>

위의 코드를 보면 agree에 value를 담아 post 방식으로 전달하고 있다.

  1. HttpServletRequest
    HttpServletRequest를 이용하는 것이다. 해당 객체의 getParameter() 메서드를 이용하여 파라미터의 값을 구하면 된다.
  2. @RequestParam
    @RequestParam 어노테이션을 이용하면 파라미터의 값을 구할 수 있다.
@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";
		
	}

위의 코드를 보면 agree 값을 받아와 agree Boolean 변수에 넣어준다. 이때 요청 파라미터 값이 없으면 "false"문자열을 값으로 사용한다.

<@RequestParam 어노테이션의 속성>

  • value - String
    HTTP 요청 파라미터의 이름을 지정한다.
  • required - boolean
    필수 여부를 지정한다. 이 값이 true이면서 해당 요청 파라미터에 값이 없으면 익셉션이 발생한다. 기본값은 true이다.
  • defaultValue - String
    요청 파라미터가 값이 없을 때 사용할 문자열 값을 지정한다. 기본값을 없다.
    • int, long, Integer, Long 등 기본 데이터 타입과 래퍼 타입에 대한 변환을 지원한다.

리다이렉트 처리(redirect)

POST 방식만을 처리하는 서비스는 직접 URL을 치면 오류가 난다. 그래서 이러한 요청이 들어왔을때 에러 화면이 아닌 알맞은 경로로 리다이렉트를 하는 것이 더 좋을 때가 있다.

return "redirect:경로";

@GetMapping("/register/step2")
	public String handleStep2Get() {
		return "redirect:/register/step1"; // 해당 주소로 GET 요청이 들어왔을 때 이 주소로 리다이렉트한다.
	}

커멘드 객체를 이용해서 요청 파라미터 사용하기

어떠한 폼에서 값을 입력한 후 이 정보들을 서버에 전송하려하는데 HttpServletRequest 객체를 사용하여 get을 한다면 굉장히 코드가 길어지고 가독성이 떨어질 것이다.

이때 사용할 수 있는 것이 커멘드 객체를 만들어서 여기서 그 정보들을 넣어 객체로서 주고 받는 것이다.

커멘드객체라고 거창한 것이 아니다. 받아올 정보들을 멤버변수로 가지고 setter, getter 함수를 가지는 객체일 뿐이다.

@PostMapping("/register/step3")
public String handleStep3(RegisterRequest regReq, Errors errors){
   		memberRegisterService.regist(regReq);
		return "register/step3";
   		 ...
}

위처럼 커멘드 객체를 가져와 사용할 수 있다.

View JSP코드에서 커맨드 객체 사용하기

@PostMapping("/register/step3")
public String handleStep3(RegisterRequest regReq, Errors errors){
memberRegisterService.regist(regReq);
return "register/step3";
...
}

==>

<p><strong>${registerRequest.name}님</strong>

스프링 MVC는 커맨드 객체의(첫 글자를 소문자로 바꾼)클래스 이름과 동일한 속성 이름을 사용해서 커맨드 객체를 뷰에 전달할 수 있다.

@ModelAttribute

만약 커맨드 객체에 접근할 때 사용할 속성 이름을 변경하고 싶다면 커맨드 객체로 사용할 파라미터에 @ModelAttribute 어노테이션을 적용하면 된다.


@PostMapping("/register/step3")
public String handleStep3(@ModelAttribute("formData") RegisterRequest regReq){
   		memberRegisterService.regist(regReq);
		return "register/step3";
   		 ...
}

0개의 댓글