본문 바로가기

Java/JavaSpring

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 요청 파라미터 이름이 "프로퍼티이름.프로퍼티이름"과 같은 형식이면 중첩 프로퍼티 값을 처리한다.

'Java > JavaSpring' 카테고리의 다른 글

Chap 12. MVC 2 : 메시지, 커맨드 객체 검증  (0) 2022.07.13
JUNIT  (0) 2022.07.11
Chap 10. 스프링 MVC 프레임워크 동작 방식  (0) 2022.07.06
Chap 9. 스프링 MVC 시작하기  (0) 2022.07.01
Chap 8. DB 연동  (0) 2022.06.28