@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 에 입력해준 "디폴트값입니다" 가 저장된 모습이다.
'Spring' 카테고리의 다른 글
스프링부트 / JWT 방식으로 로그인 구현하기 (5) | 2020.05.20 |
---|---|
Spring / @RequestBody vs @RequestParam 이해하기 (6) | 2020.05.09 |
스프링부트 어노테이션 / @PathVariable (0) | 2020.05.01 |
스프링부트 어노테이션 / @RestController(vs @Controller) 이해하기 (0) | 2020.05.01 |
스프링부트 / Bean 이해하기 (0) | 2020.04.27 |