1. @RequestParam
@RequestParam은 요청 파라미터를 연결할 매개변수에 붙이는 애너테이션으로 아래와 같이 생략 가능하다.
만약 주소 요청에 파라미터 이름이 없으면 null로 값을 받고, 파라미터 이름만 있고 값이 없으면 빈 문자열("")로 받아온다.
아래와 같이 메서드 매개변수 앞에 애너테이션을 붙이면 required=true, 즉 필수로 받아와야하는 값이 된다.
이 경우 주소 요청에 해당하는 파라미터 이름이 없으면 400에러 Bad Request가 뜨고, 파라미터 이름만 있고 값이 없으면 마찬가지로 빈 문자열("")로 받아온다.
아래 코드를 보면 required=false, 즉 필수 입력이 아니다. 따라서 주소 요청에 year값을 필수로 붙여 줄 필요가 없고, 이렇게 주소를 호출할 경우에는 null값을 받아오며 int형으로는 null을 받아올 수 없으니 500에러 (서버 에러)가 뜬다.
파라미터 이름만 붙여줬을 경우에는 빈 문자열로 값을 받아오고, 이 경우도 int형으로 받을 수 없으니 400에러 (클라이언트 에러)가 뜬다.
따라서 필수 입력이 아닐 때에는 defaultValue, 즉 기본값을 주는 게 좋다.
이 경우 컨트롤러에서는 defaultValue로 값을 받아오지만 뷰로 defaultValue값을 넘겨주지는 않는다.
2. @ModelAttribute
@ModelAttribute는 적용 대상을 Model의 속성으로 자동 추가해주는 애너테이션으로, 반환 타입 또는 컨트롤러 메서드의 매개변수에 적용 가능하다.
1) 컨트롤러 메서드의 매개변수에 적용
아래 사진에서 메서드의 date 매개변수 앞에 @ModelAttribute 애너테이션을 추가했으므로, 3.Model에 작업한 결과를 저장하는 과정이 필요없다.
원래는 @ModelAttribute("key이름") 과 같이 적어줘야 하지만 생략이 가능하며, 생략했을 경우는 타입의 첫 글자를 소문자로 변경한 단어를 키로 사용해 모델에 저장한다. (ex.MyDate 데이터타입 -> 키이름 myDate로 저장)
2) 반환 타입에 적용
아래 사진처럼 반환 타입 앞에 애너테이션을 붙여주면, 아래 메서드를 호출한 결과를 모델에 저장해 준다.
내부적으로 컨트롤러 메서드 중에 @ModelAttribute가 붙어있는 메서드들은 전부 호출해서 결과를 모델에 저장한다. 따라서 해당 매서드를 호출할 필요도 없고, 결과를 모델에 저장할 필요도 없다.
따라서 아래 사진에서 getYoil 메서드를 호출할 필요도, 모델에 매개변수를 저장할 필요도 없다.
사실 참조형 매개변수 앞의 @ModelAttribute는 생략이 가능하다. 생략해도 모델에 저장하는 부분이 필요 없다.
컨트롤러 메서드에서 기본형/String은 @RequestParam이, 참조형 타입은 @ModelAttribute가 기본적으로 붙어있다고 생각하면 된다.
3. WebDataBinder
WebDataBinder는 요청받은 값이 실제 객체에 바인딩 될 때 중간 역할을 한다.
예를 들어 주소로 요청이 들어올 때, 파라메터 값들은 String형 으로 받아온다. 이 때 MyDate 객체의 매개변수 year, month, day는 int 형이므로 형변환 하는 과정이 필요한데 이를 WebDataBinder 가 해결해준다.
WebDataBinder는 두 가지 일을 한다.
- 타입 변환 - 받아온 데이터 타입과 저장할 객체의 매개변수가 다른 데이터 타입일 때 타입을 변환시켜 결과를 BindingResult에 저장
- 데이터 검증(Validation) - 객체에 저장될 수 있는 값인지 확인. ex) month 매개변수에는 1-12 값만 올 수 있는데 받아온 데이터가 34일 경우
그리고 아래 메서드처럼 BindingResult는 메서드에서 바인딩할 객체의 바로 뒤에 와야한다.
참조
https://fastcampus.co.kr/dev_academy_nks
'3. Back-end > 3-2. Spring MVC - 남궁성' 카테고리의 다른 글
Spring MVC - [ view-controller / servlet-context.xml] (0) | 2023.01.23 |
---|---|
Spring MVC - [@GetMapping, @PostMapping] (0) | 2022.12.14 |
Spring MVC - [ JSTL / Filter ] (0) | 2022.11.07 |
Spring MVC - [ URL패턴 / EL표현식 ] (0) | 2022.11.07 |
Spring MVC - [ 유효 범위(Scope)와 속성(attribute) ] (0) | 2022.11.04 |