본문 바로가기

Spring

스프링부트 어노테이션 / @RequestParam

@RequestParam


1. @RequestParam?

 

컨트롤러에서 @RequestMapping 을 지정한 메서드의 경우 메서드 인자에 @RequestParam 을 지정해 변수의 값을 메서드 인자로 할당 할 수 있다.

@Controller
@RequestMapping("/user")
public class UserController {

	@RequestMapping(value = "/join", method = RequestMethod.POST)
	public String userJoin(@RequestParam Map<String,String> param) {
		...
	}

 

2. 사용방법

2.1 Map

<form action="/user/join" method="post">
  <div class="form-group">
      <label for="name">이름</label>
      <input name="name" type="text">

      <label for="email">이메일</label>
      <input name="email" type="test">

      <label for="pwd">비밀번호</label>
      <input name="pwd" type="password">

      <button type="submit">가입</button>
  </div>
</form>

위와 같은 회원가입 폼이 있다고 하자.

가입버튼을 누르면 name 이라는 이름으로 입력한 이름이, email 이라는 이름으로 입력한 이메일이, pwd 라는 이름으로 입력한 비밀번호가 전달된다.

이때 @RequestParam 을 이용하여 전달된 값들을 메서드 인자로 할당할 수 있다.

 

 

이번 글에서는 

이름 : 홍길동

이메일 : hjd@email.net

비밀번호 : 1234

위와 같이 입력한다고 기억해두자!

 

 

아래와 같이 구현해준다면 Map 형식의 'param' 인자로 모든 정보가 저장된다.

@RequestMapping(value = "/join", method = RequestMethod.POST)
public String userJoin(@RequestParam Map<String, String> param) {
	System.out.println("param : " + param);
	return "index";
}
    
    //출력결과
    //param : {name=홍길동, email=hjd@email.net, pwd=1234}

만약 이름값을 가져오고 싶다면 평소 Map에서 값을 꺼내듯 param.get("name")을 이용하여 값을 가져올 수 있다.

 

2.2 MultivalueMap

동일한 이름의 요청 매개변수가 여러개일 때 유용하게 사용할 수 있다.

@RequestMapping(value = "/join", method = RequestMethod.POST)
public String userJoin(@RequestParam MultiValueMap<String, String> param) {
	...
}

예를 들어 중복체크가 가능한 항목의 값들이 넘어 온다고하자.

(약속가능한 날짜를 체크한다든가, 먹고싶은 음식을 체크한다든가 사용되는 경우는 얼마든지 있다)

day 라는 이름으로 값들이 있다면 param.get("day") 를 할 경우 전달된 값들이 List<String> 형식으로 저장된다.

만약 interger 타입의 값들을 받고 싶다면 MultiValueMap<String, Integer> 로 하여 List<Integer>형식으로 받을 수도 있다.

 

 

2.3 매개변수의 이름 지정

다시 회원가입 상황으로 돌아가보자.

이때 모든 값들이 필요하지 않고 하나만 필요하다면 지정하여 값을 할당하는 방법도 있다.

@RequestMapping(value = "/join", method = RequestMethod.POST)
public String userJoin(@RequestParam String name) {
	System.out.println("name : " + name);
	return "index";
}

//출력결과
//name : 홍길동

위에서 name 이라는 이름으로 홍길동을 입력했으므로 정삭적으로 '홍길동'이 할당된 것을 확인할 수 있었다.

'@RequestParam String 변수명' 에서 해당 변수명으로 대응되는 값이 없다면 예외가 발생한다.

 

 

만약 해당 변수명으로 대응되는 값이 없지만 예외를 발생시키지 않도록 하려면 해당 변수명의 required 값을 false 로 지정해주면 된다.

@RequestMapping(value = "/join", method = RequestMethod.POST)
public String userJoin(@RequestParam(value = "nonValue", required = false) String nonValue) {
	System.out.println("nonValue : " + nonValue);
	return "index";
}

//출력결과
//nonValue : null

이처럼 nonValue 라는 이름으로 전달되는 값은 없지만 예외가 발생하지 않았고, nonValue 의 값은 null 이 찍히는 것을 확인할 수 있었다.

 

 

그렇다면 단순히 예외를 발생시키지 않고 끝나는것이 아니라 값이 없을 때 default 값으로 특정 값을 할당할 순 없을까?

있다!

defaultValue 를 이용하면 가능하다.

@RequestMapping(value = "/join", method = RequestMethod.POST)
public String userJoin(@RequestParam(value = "nonValue", defaultValue = "디폴트값입니다") String nonValue) {
	System.out.println("nonValue : " + nonValue);
	return "index";
}

//출력결과
//nonValue : 디폴트값입니다

 

null이 아닌 defalutValue 에 입력해준 "디폴트값입니다" 가 저장된 모습이다.

 

 

반응형