본문 바로가기

공부/Spring

[Spring]Chapter 11 - 요청 매핑, 커맨드 객체, 리다이렉트, 폼 태그, 모델


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 프로그래밍 입문(최범균)

300x250