[Spring #6] @RequestParam과 @ModelAttribute

HJoo·2023년 1월 12일
0

TodayStudy

목록 보기
44/111
post-thumbnail

@RequestParam

  • 요청의 파라미터를 연결할 매개변수에 붙이는 애너테이션
  • 지금까지 생략한 것
public String main2(@RequestParam(name="year", required=false) String year) {
//name : 파라미터 이름, required : 필수 여부
public String main2(String year) {

http://localhost/ch2/requestParam         ---->> year=null 
http://localhost/ch2/requestParam?year=   ---->> year=""
http://localhost/ch2/requestParam?year    ---->> year=""
//입력하지 않아도, 값이 비어 있어도 괜찮다

=======================================================================

public String main3(@RequestParam(name="year", required=true) String year) {
//필수로 입력해야한다
public String main3(@RequestParam String year) { 

http://localhost/ch2/requestParam3         ---->> year=null   400 Bad Request. 
// required=true라서 꼭 넣어줘야함. 클라이언트 에러
http://localhost/ch2/requestParam3?year    ---->> year="" 
//값이 넘어온 걸로 본다

=======================================================================

public String main8(@RequestParam(required=false) int year) {//필수 입력 x
//	http://localhost/ch2/requestParam8        
---->> 500 java.lang.IllegalStateException: 
//아무것도 안 넣으면 null, null을 int로 변환할 수 없다
//	http://localhost/ch2/requestParam8?year   
---->> 400 Bad Request
//값을 안넣으면 빈 문자열"", 빈 문자열을 int로 바꿀 수 없다, 값을 잘못 넣은 클라이언트 잘못


  • 필수 입력이 아닌 경우 defaultValue를 꼭 정의해야한다
  • 필수 입력인 경우 예외 처리를 꼭 해줘서 올바른 값을 입력할 수 있도록 해야한다
@ExceptionHandler(Exception.class)
public String catcher(Exception ex){
	ex.printStackTrace();
    return "yoilError";

@ModelAttribute

  • 적용 대상을 Model의 속성으로 자동 추가해주는 애너테이션
  • 반환 타입 또는 컨트롤러 메서드의 매개변수에 적용 가능
public String main(@ModelAttribute("myDate") MyDate date, Model m) { 
// 아래와 동일, 아래는 key부분 생략, 자동으로 첫 글자를 소문자로 바꿔서 지정해준다
public String main(@ModelAttribute MyDate date, Model m) { 
// @ModelAttribute사용, 반환 타입은 String, 모델에 따로 저장할 필요가 없음

//@ModelAttribute 덕분에 MyDate를 저장안해도 됨. View로 자동 전달됨.
//"myDate"에 date 자동 저장
m.addAttribute("myDate", date); //필요없음
     
     
=============================================================

//반환타입에 적용, 함수의 호출 결과를 모델에 저장한다.
//key는 "yoil"
 private @ModelAttribute("yoil") char getYoil(MyDate date) {
// "yoil"에 yoil 자동 저장 
 m.addAttribute("yoil", yoil);//필요없음
  • 참조형 매개변수 앞에 @ModelAttribute를 붙일 수 있는데 생략 가능하다
  • 기본형, String일 때 @RequestParam 생략

WebDataBinder

  • 컨트롤러 메서드가 선언되어 있을 때 메서드를 url로 호출하면

    Map형식으로 구성이 되면서 @ModelAttribute로 인해 모델에 값이 String으로 저장된다

  • 해당 모델에 저장된 데이터들은 int형으로 저장되기 때문에 중간에 String 데이터를 int형으로 바꿔주는 작업이 필요하다

  • 이때 WebDataBinder 가 사용된다

    1. 입력된 값들을 하나하나 읽어 타입이 다른 경우 타입을 변환하여 BindingResult에 저장한다
    2. 그 값이 해당 변수가 가질 수 있는 값인지, 예를 들어 month 값이 1부터 12 사이인지 검증하여 BindingResult에 저장한다
    3. BindingResult를 controller에 전달히여 그 값을 이용해서 처리를 한다
    public String main(@ModelAttribute MyDate date, BindingResult result){
profile
안녕하세요. Chat JooPT입니다.

0개의 댓글