Spring

(Spring)@RequestParam

odong2 2022. 9. 4. 01:18

 

1. RequestParam

RequestParam이란 요청할 때 넘어온 파라미터를 매개변수에 연결할 때 사용하는 애너테이션이다.

 

위의 그림에서 main2(String year) 부분이 원래는

main2(@RequestParam(name="year", required=false) String year)이지만 앞의 파란 소괄호 부분은 생략 가능하다.

name은 파라미터 이름이고, required는 필수 여부를 의미한다.

즉 두 문장은 같은 의미인데 보통은 생략해서 main2(String year)로 사용한다.

 

사용자가 http://localhost/ch2/reuestParam2 와 같이 year가 없이 넘어오면 year 값은 null이 된다.

사용자가 http://localhost/ch2/reuestParam2?year 와 같이 이름만 넘어오면 year값은 "" 빈문자 열이 된다. 

 

 

두 번째로  Controller의 매개변수 앞에 main3(@RequestParam String year)로 작성하면

main2(@RequestParam(name="year", required=true) String year)와 같은 의미이다.

즉 year는 꼭 입력해야 하는 것이다.

 

사용자가 http://localhost/ch2/reuestParam3  요청 시 year가 없으므로 year 값은 null , 404 Bad Request 에러가 난다. 필수 입력하라고 하였는데 클라이언트가 이를 어겼기 때문에 400번대 에러가 발생한다.

 

사용자가 http://localhost/ch2/reuestParam3?year 요청 시 year의 이름은 넘어왔기 때문에 값은 빈 문자열이고 400번대 에러는 발생하지 않는다. 즉 값이 빈문자 열이지만 값이 넘어온 것으로 간주한다.

 

다음 예제를 살펴보자.

main8(@RequestParam(required=false) int year)로 required가 false로 지정되어 있다.

사용자가 만약 http://localhost/ch2/reuestParam8 로 year를 보내지 않을 경우에 500번(서버) 에러가 발생한다.

그 이유는 서버가 year를 필수 값으로 지정하지 않았기 때문에 사용자가 year값을 보내지 않아도 사용자의 잘못이 아닌 서버의 잘못이 되기 때문이다.

year를 보내지 않아 null값이 들어오게 되고 null을 int형으로 변환하려고 하다 보니 서버 에러가 발생한다.

 

이번에는 만약 http://localhost/ch2/reuestParam8?year로 요청이 오면 400번(클라이언트) 에러가 발생한다.

그 이유는 year의 이름만 넘어오면 빈 문자열이 되는데 빈 문자열을 int형으로 변환하려고 하여 400번대 에러가 발생한다.

즉 값을 주기 줬지만 값을 잘못 입력하였기 때문에 클라이언트 에러가 발생한다.

 

이러한 에러를 방지하고자 required가 필수 값이 아닌 false일 때는 아래와 같이 기본값을 줘야 한다.

 

	@RequestMapping("/requestParam11")   
	public String main11(@RequestParam(required=false, defaultValue="1") int year) {   
//		http://localhost/ch2/requestParam11        ---->> year=1   
//		http://localhost/ch2/requestParam11?year   ---->> year=1   
		System.out.printf("[%s]year=[%s]%n", new Date(), year);
		return "yoil";
	}

매개변수 옵션에 defaultValue를 주게 되면 요청에 아무 값도 들어오지 않게 되면 기본값 "1"이 year에 들어온다.

 

요약하자면 필수 입력이 아닐 경우에는 defalutValue에 기본값을 지정하여 에러를 방지하고, 필수 입력의 경우 사용자가 올바른 값을 입력하도록 예외처리를 해주는 것이 좋다.

 

 

 

 

 

 

Reference

'스프링의 정석 : 남궁성과 끝까지 간다' 수강 후 복습한 내용입니다.