Spring

(Spring)@ModelAttribute

odong2 2022. 9. 4. 16:55

@ModelAttribute란?

적용 대상을 Model의 속성으로 자동 추가해주는 애너테이션을 의미한다.

즉 파라미터로 넘겨받은 값을 Model에 자동 저장해주는 기능을 한다.

밑의 코드를 통해 살펴보자.

 

    @RequestMapping("/getYoilMVC5") // http://localhost/ch2/getYoilMVC6
//public String main(@ModelAttribute("myDate") MyDate date, Model model) { // 아래와 동일
   public String main(MyDate date, BindingResult result) {
  	 System.out.println("result="+result);
 
        // 1. 유효성 검사
    	if(!isValid(date)) 
    		return "yoilError";  // 유효하지 않으면, /WEB-INF/views/yoilError.jsp로 이동
    	
        // 2. 처리  -> 메서드 호출 필요없다. @ModelAttribute("keyname") 이 부분이 자동 호출 되므로
    	//char yoil = getYoil(date);

        // 3. Model에 작업 결과 저장
        //model.addAttribute("myDate", date); ModelAttribute로 인해 쓰지 않아도 된다.
        //model.addAttribute("yoil", yoil);
        
        // 4. 작업 결과를 보여줄 View의 이름을 반환
        return "yoil"; // /WEB-INF/views/yoil.jsp
    }
    // 반환타입 앞에 적힌 @ModellAttribute는 스프링이 자동으로 실행 시켜준다!
   	private @ModelAttribute("yoil") char getYoil(MyDate date) {
		return getYoil(date.getYear(), date.getMonth(), date.getDay());
	}

 

@ModelAttribute 특징은 다음과 같다

 

1️⃣ Model 객체에 key, value 자동 저장

위의 그림에서 주석으로 처리된 @ModelAttribute("myDate") MytDate는 자동으로 Model에 myDate라는 key값으로 저장이 된다. 그렇기 때문에 model.addAttributre("myDate", date); 와 같이 따로 Model 객체에 저장하는 코드를 작성할 필요가 없다.

 

2️⃣ @ModelAttribute("key이름")의 매개변수

또 다른 특징은 @ModelAttribute("myDate") MyDate date에서 매개변수를 생략하고 @ModelAttribute MyDate date와 같이 작성하면 클래스 타입의 첫 글자를 소문자로 바꾸어 myDate라는 key값으로 Model에 저장한다.

그러므로 key의 이름을 바꾸어 따로 저장하고 싶을 경우는 @ModelAttribute의 매개변수에 기재하고, 따로 만들지 않고 기본 클래스 name을 사용할 것이라면 생략하여 사용한다.

 

3️⃣ 반환 타입 앞의 @ModelAttribute

@ModelAttribute의 위치는 반환 타입 또는 컨트롤러 메서드의 매개변수에 적용이 가능하다.

반환 타입 반환 타입 앞에 ModelAttribute를 사용하였을 경우 호출 결과를 value에 저장하고 반환 타입 앞에 작성된 ModelAttribute의 매개변수가 key값이 된다.

내부적으로 동작하는 방식을 살펴보면 Controller 메서드 중 @ModelAttribute가 붙어있는 지를 보고 붙어 있는 것을 전부 호출하고 그 결과를 Model에 저장한다.

그렇기 때문에 @ModelAttribute만 붙이면 따로 호출하지 않아도 되고 저장하지 않아도 스프링이 자동으로 해주게 된다.

 

4️⃣ 참조형 매개변수 앞의 @ModelAttribute 생략 가능

public String main(@ModelAttribute("myDate") MyDate date, Model model)와 같이 MyDate는 참조형 매개변수 이므로 

public String main(MyDate date, Model model)과 같이 생략하여 사용이 가능하다.

이렇게 생략하고 사용하면 생략하기 전 ModelAttribute 애너테이션을 붙이고 사용한 것과 동일한 의미를 지닌다.

 

 

참고로 컨트롤러 메서드의 매개변수에는 @RequestParam과 @ModelAttribute 두 개를 붙일 수 있는데 타입이 참조형일 경우 위와 같이 @ModelAttribute이 생략되어 있는 것이고,  기본형 및 String 일 경우 @RequestParam 생략된 것이다.

기본형의 경우는 EL에서  ${param.파라미터 이름}으로 바로 참조가 가능하기 때문에 Model에 따로 저장하지 않고 사용할 수 있다.

 

 

 

 

Reference

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