본문 바로가기
Spring

[Spring Boot] @RequestBody와 @ModelAttribute 차이

by min-devlog 2026. 5. 11.

Spring Boot에서 메일 전송 기능을 구현하면서
415 Unsupported Media Type 오류가 발생했다.

에러 메시지:

Content-Type 'application/x-www-form-urlencoded;charset=UTF-8' is not supported

원인을 분석해보니 HTML form 방식과 JSON 방식의 차이 때문이었다.

문제 상황

Controller 코드:

@PostMapping("/send_email")
public String send_email(@RequestBody EmailDTO dto) {
    return "send_ok";
}

HTML:

<form action="/send_email" method="post">

위와 같이 작성했는데 415 에러가 발생했다.

원인 분석

HTML form은 기본적으로 아래 형식으로 데이터를 전송한다.

application/x-www-form-urlencoded

실제 전송 형태:

to=test@test.com&subject=hello

하지만 @RequestBody는 JSON 형식 데이터를 처리하기 위한 어노테이션이다.

즉 아래 형식을 기대한다.

{
  "to": "test@test.com",
  "subject": "hello"
}

따라서 form 데이터와 JSON 형식이 맞지 않아 오류가 발생했다.

해결 방법

@RequestBody를 제거하고 @ModelAttribute 방식으로 변경했다.

수정 코드:

@PostMapping("/send_email")
public String send_email(EmailDTO dto) {
    return "send_ok";
}

또는:

@PostMapping("/send_email")
public String send_email(@ModelAttribute EmailDTO dto) {
    return "send_ok";
}

@ModelAttribute와 @RequestBody 차이

방식설명

@ModelAttribute form 데이터 바인딩
@RequestBody JSON 데이터 바인딩

Validation 학습

추가로 Validation도 함께 학습했다.

DTO:

@NotEmpty(message = "아이디는 반드시 입력하세요!")
private String user_id;

Controller:

@PostMapping("/insertMember.do")
public String insertMember(
    @Validated MemberDTO dto,
    BindingResult result
) {
    if(result.hasErrors()) {
        return "insertMember";
    }

    return "insertMember";
}

Validation은 사용자 입력값이 올바른지 검사하는 기능이다.

예:

  • 빈 값 검사
  • 이메일 형식 검사
  • 길이 제한 검사

등을 처리할 수 있다.

느낀 점

이번 학습을 통해:

  • HTML form과 JSON 요청 차이
  • @RequestBody와 @ModelAttribute 차이
  • Spring Validation 동작 과정

을 이해할 수 있었다.

특히 Validation은 JavaScript 검증과 별개로 서버에서도 반드시 필요하다는 점이 인상적이었다.