[Spring Boot] 컨트롤러 @ModelAttribute, @RequestBody 어노테이션 / GET, POST 요청시 파라메터로 사용될 때 차이

Song_Song·2021년 8월 29일
0
post-custom-banner

@ModelAttribute

@ModelAttribute는 클라이언트에서 요청한 multipart/form-data 형태의 HTTP BODY를 setter를 통해 오브젝트 형태로 맵핑해주는 어노테이션이다. 즉, 외부 데이터가 bean에 등록된 객체로 자동으로 변환되어 사용할 수 있도록 하는 것이다.

@ModelAttribute를 사용할 때 내부적으로는 객체로 정의한 클래스파일의 bean 객체를 만든 후에 setter를 타고 바인딩된다.
즉, 객체가 mutable한 객체여야 @ModelAttribute 어노테이션을 사용할 수 있다. (setter가 없다면 매핑에 실패하여 null을 갖게 된다.)

@RestController
@RequestMapping("/example")
public class exampleController {
	
	@GetMapping("/")
	public String myFormatter(Car car) {
		System.out.println("ex : " + car);
		
		return car.getId().toString();
	}
}

일반적으로 위 코드처럼 컨트롤러를 작성한다. 매개변수로 작성된 Car car 앞에 아무 것도 쓰지 않는다면 @ModelAttribute가 명시적으로 생략되어 있는 것이다.

즉, 위 코드는 아래 코드와 같은 것이다.

@RestController
@RequestMapping("/example")
public class exampleController {
	
	@GetMapping("/")
	public String myFormatter(@ModelAttribute Car car) {
		System.out.println("ex : " + car);
		
		return car.getId().toString();
	}
}

@ModelAttrubute("VALUE")

@ModelAttrubute("VALUE") 처럼 괄호 안에 문자열을 지정해 주면 view단에 Model객체로 넘겨줄 때 해당 문자열로 추가되어 view 단에서 사용할 수 있다.




@RequestBody

@RequestBody는 클라이언트가 요청하는 Json(application/json) 형태의 HTTP Body를 Java Object로 변환시키는 역할을 한다. @RequestBody로 받은 데이터는 Spring의 MessageConverter 중 하나인 MappingJackson2HttpMessageConverte를 통해 Java Object 객체로 변환된다.

@RequestBody는 @ModelAttribute와는 다르게 객체에 setter가 필요하지 않다. 이는 메시지를 변환하는 과정에서 바인딩이 아닌, 객체의 기본 생성자를 통해 객체를 생성하고 Reflection을 통해 값을 할당하기 때문이다.

@RestController
@RequestMapping("/example")
public class exampleController {
	
	@PostMapping("/")
	public String myFormatter(@RequestBody Car car) {
		System.out.println("ex : " + car);
		
		return car.getId().toString();
	}
}



GET 요청시 파라메터에서 사용되는 어노테이션

@ModelAttribute
기본적으로 객체의 setter로 받아옴 (디폴트값 => 권장)

@RequestParam
객체로 받아오지 않음, map으로도 받아옴,

POST 요청시 파라메터에서 사용되는 어노테이션

@ModelAttribute
application/X-FORM-ENCODED 형식으로 데이터 받을 때 사용

@RequestBody
application/json 형식으로 데이터 받을 때 사용 (stringfy)

profile
성장을 위한 정리 블로그
post-custom-banner

0개의 댓글