
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 검증과 별개로 서버에서도 반드시 필요하다는 점이 인상적이었다.
'Spring' 카테고리의 다른 글
| [Spring Boot] Transaction rollback 처리와 @Transactional (0) | 2026.05.13 |
|---|---|
| [Spring Boot] MyBatis 게시판 구현 중 오류 해결 (0) | 2026.05.12 |
| [Spring Boot] Maven ClassNotFoundException 오류 해결 (0) | 2026.05.11 |