스프링 부트는 웹 애플리케이션 개발 시 많은 편의성을 제공하는 프레임워크입니다.
그중에서도 @ModelAttribute와 @RequestBody 애노테이션은 데이터를 컨트롤러로 전달하는 데에 사용되는 중요한 애노테이션입니다.
이번 블로그에서는 @ModelAttribute와 @RequestBody 애노테이션의 개념, 사용법, 그리고 둘 사이의 차이점에 대해 알아보겠습니다.
@ModelAttribute
@ModelAttribute 애노테이션은 사용자가 입력한 데이터를 자바 객체로 바인딩하기 위해 사용됩니다.
주로 HTML 파일의 form태그에서 전송된 데이터를 처리할 때 사용되며, HTTP 요청의 바디(body)가 아닌 URL 쿼리 파라미터로 전달되는 데이터를 처리할 때 유용합니다.
@Getter@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class MemberDTO {
private Long id;
// html 태그에 name 속성명과 같으면 자동 매칭해줌
private String memberEmail;
private String memberPassword;
private String memberName;
}
@PostMapping("/member/save")
public String save(@ModelAttribute MemberDTO memberDTO) {
memberService.save(memberDTO);
return "login";
}
<!-- action속성: form에 작성한 데이터를 어디로 보낼지 지정 -->
<form action="/member/save" method="post">
<!-- name속성: 서버로 전송할 때 변수 이름의 역할 -->
이메일 : <input type="text" name="memberEmail"> <br>
비밀번호 : <input type="password" name="memberPassword"> <br>
이름 : <input type="text" name="memberName"> <br>
<input type="submit" value="회원가입">
</form>
위 코드에서 @ModelAttribute 애노테이션은 HTTP 요청의 쿼리 파라미터나 폼 데이터를 자바의 memberDTO 객체에 자동으로 바인딩합니다.
memberDTO 객체에는 요청 파라미터와 동일한 이름의 필드가 있어야 합니다.
이후 컨트롤러 메서드 내에서 memberDTO 객체를 사용하여 새로운 사용자를 생성하고 필요한 로직을 처리할 수 있습니다.
※ HTTP 요청의 쿼리 파라미터란
: 웹 클라이언트가 서버로 보내는 데이터의 한 형태입니다. 쿼리 파라미터는 URL의 끝에 "?" 기호로 구분되며, "파라미터=값" 형태로 이어집니다. 여러 개의 쿼리 파라미터가 있을 경우에는 "&"기호로 구분됩니다.
ex) https://www.example.com/search?q=keyword&page=1&sort=desc
예시에서 "q", "page", sort"는 쿼리 파라미터의 이름이고, 각각 "keyword", "1", "desc"는 해당 파라미터에 대한 값입니다.
@RequestBody
@RequestBody 애노테이션은 HTTP 요청의 body에 포함된 데이터를 컨트롤러의 메서드 파라미터로 바인딩합니다.
주로 JSON 또는 XML과 같은 형식의 데이터를 처리할 때 사용됩니다.
요청 Body는 주로 POST나 PUT과 같은 HTTP 메소드를 통해 전송되는 데이터입니다.
@Data
static class CreateMemberRequest {
private String name;
}
@Data
static class CreateMemberResponse {
private Long id;
public CreateMemberResponse(Long id) {
this.id = id;
}
}
@PostMapping("/api/v2/members")
public CreateMemberResponse saveMemberV2(@RequestBody @Valid CreateMemberRequest request) {
Member member = new Member();
member.setName(request.getName());
Long id = memberService.join(member);
return new CreateMemberResponse(id);
}
위 코드에서 @RequestBody 애노테이션은 HTTP 요청의 Body에 포함된 데이터를 CreateMemberRequest 객체로 자동으로 바인딩합니다.
이후 컨트롤러 메서드 내에서 request 객체를 사용하여 새로운 사용자를 생성하고 필요한 로직을 처리할 수 있습니다.
* CreateMemberResponse 객체는 요청한 request의 값을 제대로 반환하는지 확인하기 위해 사용됩니다.
@ModelAttribute vs. @RequestBody:
사용 목적:
@ModelAttribute는 HTML 폼이나 URL 쿼리 파라미터에서 데이터를 바인딩할 때 사용됩니다.
@RequestBody는 HTTP 요청의 바디(body)에 포함된 데이터를 바인딩할 때 사용됩니다. (주로 JSON)
사용 방법:
@ModelAttribute는 메소드 파라미터 앞에 사용되며, 자동으로 객체로 바인딩됩니다.
@RequestBody는 메소드 파라미터 앞에 사용되며, 요청 Body의 데이터를 자동으로 객체로 바인딩합니다.
데이터 형식:
@ModelAttribute는 주로 form 데이터나 쿼리 파라미터와 같은 텍스트 형식의 데이터를 처리합니다.
@RequestBody는 주로 JSON이나 XML과 같은 구조화된 데이터 형식을 처리합니다.
결론:
@ModelAttribute와 @RequestBody 애노테이션은 스프링 부트에서 웹 애플리케이션의 데이터를 컨트롤러로 전달하는 데에 사용됩니다.
@ModelAttribute는 HTML 폼이나 URL 쿼리 파라미터의 데이터를 객체로 바인딩하고, @RequestBody는 HTTP 요청의 바디에 포함된 데이터를 객체로 바인딩합니다.