본문 바로가기

Spring

RequestParam이 있을때와 없을때 차이

Spirng에서는 Controller를 정의하고 각 Controller의 메서드 들은 사용자들의 웹 요청을 받아서 처리하여 결괏값을 돌려준다.

이때 각 Controller메서드 들은 요청 온 파라미터를 받아서 요청에 대한 정보를 담아 처리하곤 한다.

 

그런데 가끔 어떤 파라메터는파라미터는 @ReqeustParam을 쓰고 어떤 파라미터는 @RequestParam을 생략해서 요청을 받는다.

물론 모두가 다 아는것 처럼 @RequestParam을 생략하면 내부적으로  String이나 Long 같은 타입은 @ReuqestParam으로 취급하고 그 이외에 파라미터는 @ModelAttribute로 취급한다는 것을 알 것이다.

 

그런데 오늘 궁금했던 건 @RequestParam을 명시적으로 붙이면 require가 디폴트 값으로 true인 것으로 알고 있었고 @RequestParam을 안 붙인 건 당연히 @RequestParam으로 간주하여 default가 true일거라고 생각했지만 큰 착각이었다.

 

Spring 소스를 까 보면 HandlerMethodArgumentResolverComposite에서 resolver.resolverArgument를 호출한다.

이 resolver는 RequestParamMehtodArgumentResolver타입의 상위 타입인 AbstractNamedValueMethodArgumentResolver의 resolverArgument를 호출한다.

 

 

여기서 getNamedValueInfo를 호출하는데 최초 namedValueInfo가 없으면 맵에다 put을 해주는데 RequestParamMethodArgumentResolver의 createNamedValueInfo를 호출한다.

 

createNamedValueInfo는 RequestParam 어노테이션을 가져오고 어노테이션 값이 없으면  RequestParamNamedValueInfo를 인자 없이 생성자를 호출한다.

 

파라미터 없는 생성자는 아래와 같다

 

public RequestParamNamedValueInfo() {
	super("", false, ValueConstants.DEFAULT_NONE);
}

 

파라메터 있는 생성자는 아래와 같다.

 

public RequestParamNamedValueInfo(RequestParam annotation) {
		super(annotation.value(), annotation.required(), annotation.defaultValue());
}

 

 

'Spring' 카테고리의 다른 글

1.1.2. Reactive API  (0) 2020.06.30
Web on Reactive Stack  (0) 2020.06.29