HTTP 데이터를 객체로 처리하는 방법

@ModelAttribute

  • HTML의 form 태그를 사용하여 POST 방식으로 HTTP 요청을 보낼 수 있음
  • 이때 해당 데이터는 HTTP Body에 name=Tobi&age=55  형태로 담겨서 서버로 전달됨
  • 해당 데이터를 Java의 객체 형태로 받는 방법은 @ModelAttribute 애너테이션을 사용한 후 Body 데이터를 Star star 받아올 객체를 선언

Query String 방식

  • ?name=Tobi&age=55 처럼 데이터가 두 개만 있다면 괜찮지만 여러 개 있다면 @RequestParam 애너테이션으로 하나씩 받아오기 힘듦
  • 이때 @ModelAttribute 애너테이션을 사용하면 Java의 객체로 데이터를 받아올 수 있음.
    • 파라미터에 선언한 Star 객체가 생성되고, 오버로딩된 생성자 혹은 Setter 메서드를 통해 요청된 name & age의 값이 담김
@ModelAttribute는 생략이 가능
이때, Spring에서는 @ModelAttribute뿐만 아니라 @RequestParam도 생략이 가능.
그렇다면 Spring은 이를 어떻게 구분할 수 있을까?
간단하게 설명하자면 Spring은 해당 파라미터(매개변수)가 SimpleValueType이라면 @RequestParam으로 간주하고 아니라면 @ModelAttribute가 생략되어있다 판단함.
SimpleValueType은 원시타입(int), Wrapper타입(Integer), Date등의 타입을 의미.

@RequestBody

  • HTTP Body에 JSON 데이터를 담아 서버에 전달할 때 해당 Body 데이터를 Java의 객체로 전달 받을 수 있음
  • HTTP Body에 {"name":"Tobu","age":"55"} JSON 형태로 데이터가 서버에 전달되었을 때 @RequestBody 애너테이션을 사용해 데이터를 객체 형태로 받을 수 있음

⚠️ 데이터를 Java의 객체로 받아올 때 주의할 점

해당 객체의 필드에 데이터를 넣어주기 위해 set or get 메서드 또는 오버로딩된 생성자가 필요함.
예를 들어 @ModelAttribute 사용하여 데이터를 받아올 때 해당 객체에 set 메서드 혹은 오버로딩된 생성자가 없다면 받아온 데이터를 해당 객체의 필드에 담을 수 없음.
이처럼 객체로 데이터를 받아올 때 데이터가 제대로 들어오지 않는다면 우선 해당 객체의 set or get 메서드 또는 오버로딩된 생성자의 유무를 확인하는 것이 좋음.

'🗂️ Study > 🌿Spring' 카테고리의 다른 글

Memo (CRUD 구현하기)  (0) 2024.05.21
DTO  (0) 2024.05.21
Path Variable & Request Param  (0) 2024.05.21
Jackson  (0) 2024.05.21
데이터 반환 방법  (0) 2024.05.21