[SpringBoot] HTTP Request를 객체로 전달받는 방법 : @ModelAttribute, @RequestBody, @RestController

정재현·2024년 1월 22일
0

Spring Boot

목록 보기
18/19
post-thumbnail

정리하기

  • HTTP Request의 Body부분이 Query String 형태일 때 Java 객체로 전달받는 방법
    @ModelAttribute 애너테이션을 이용해 Java 객체로 변환하여 사용

  • HTTP Request의 Body부분이 JSON 형태일 때 Java 객체로 전달받는 방법
    @RequestBody 애너테이션을 이용해 Java 객체로 변환하여 사용

    • 데이터를 JSON타입의 객체로 반환하기 위해서는 @Controller 대신 @RestController를 사용해야 한다.

주의사항 : 1대1로 매핑을 시켜주는 과정을 거치기 때문에 Setter() 혹은 생성자가 필요


@ModelAttribute

HTTP Body에 들어있는 Query String(ex.?name=Robbie&age=95) 방식으로 되어있는 String 데이터를 읽고 String 내부에서 자동으로 Java 객체로 만들어주는 애너테이션

  • @ModelAttribute 애너테이션을 사용하면 Jackson라이브러리를 사용해 서버가 Java의 객체로 데이터를 받아올 수 있다.
  • 변환을 하는 과정에서 데이터를 변화할 수 없는 경우 null값이 들어가게 된다.

@RequrestParam과 @ModelAttribute

Query String 방식의 @RequestParam의 경우 데이터를 한 두개씩만 있다면 괜찮지만 여러 개의 데이터가 존재한다면 코드가 복잡해지고 유지보수가 어려워진다.

예시

  • HTTP 데이터를 HTTP Body에 name=Robbie&age=95 형태로 담아서 서버로 전달
  • @ModelAttribute 애너테이션을 사용하여 HTTP Request의 Body 데이터를 Java의 객체(Star star) 형태로 전달 받음
  • 파라미터에 선언한 객체(Star star)가 생성되고, 오버로딩된 생성자 혹은 Setter 메서드를 통해 요청된 HTTP Request의 Body데이터의 값이 담겨진다.

[Request sample]
GET http://localhost:8080/hello/request/form/param/model?name=Robbie&age=95

@GetMapping("/form/param/model")
@ResponseBody
public String helloRequestParam(@ModelAttribute Star star) {
    return String.format("Hello, @ModelAttribute.<br> (name = %s, age = %d) ", star.name, star.age);
}

TIP

Spring에서는 @ModelAttribute, @RequestParam 생략 가능

  • 해당 파라미터(매개변수)가 SimpleValueType이라면 @RequestParam로 간주
  • 아니라면 @ModelAttribute가 생략되어있다 판단.

→ 이때 SimpleValueType은 원시타입(int 등), Wraaper타입(Integer 등), Data등의 타입을 의미


@RequestBody

HTTP Request의 Body에 JSON 데이터를 담아 서버에 전달할 때, 해당 Body 데이터를 Java의 객체로 전달받는 방법

  • HTTP Body에 {"name":"Robbie","age":"95"} JSON 형태로 데이터가 서버에 전달되었을 때, @RequestBody 애너테이션을 사용해 데이터를 객체 형태로 받을 수 있다.

[Request sample]
POST : http://localhost:8080/hello/request/form/json
Header : Content type: application/json
Body : {"name":"Robbie","age":"95"}

@PostMapping("/form/json")
@ResponseBody
public String helloPostRequestJson(@RequestBody Star star) {
    return String.format("Hello, @RequestBody.<br> (name = %s, age = %d) ", star.name, star.age);
}

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

해당 객체의 필드에 데이터를 넣어주기 위해 set or get 메서드 또는 오버로딩된 생성자가 필요

ex. @ModelAttribute 사용하여 데이터를 받아올 때 해당 객체에 set 메서드 혹은 오버로딩된 생성자가 없다면 받아온 데이터를 해당 객체의 필드에 담을 수 없다.
→ 따라서 객체로 데이터를 받아올 때 데이터가 제대로 들어오지 않는다면 우선 해당 객체의 set or get 메서드 또는 오버로딩된 생성자의 유무를 확인해야 한다.


참고 사이트

RestController 참고 사이트
RestController 참고 사이트


profile
공부 기록 보관소

0개의 댓글