Backend/SPRING

😺 @RestController에서 @RequestBody가 없어도 괜찮았던가? @ResponseBody 였나..?

ಠಿ_ಠ 💻 2021. 6. 30. 14:43

상황

스프링부트로 백엔드 개발을 진행 중이다. 클라이언트가 게시물을 작성하고 글을 저장 버튼을 눌렀다.

데이터가 담긴 Json 객체를 전달했다. 그리고 나는 에러폭격을 받았다.🥲

문제

서버에서 에러가 발생했다. 에러 내용은 null이면 안되는 값에 null이 들어가고 데이터베이스에 insert 했다는 내용이었다.

나의 서버 코드는 다음과 같았다. 어디가 문제일지 한번 생각해보자. (사실 제목에 답이 있다.)

@RequiredArgsConstructor
@RequestMapping("/api/v1/posts")
@RestController
public class PostsController {

    private final PostsService postsService;

    @PostMapping("")
    private Long savePost(PostSaveRequestDto postSaveRequestDto) {
        return postsService.save(postSaveRequestDto);
    }

}

원인

savePost라는 메소드의 파라미터로 PostSaveRequestDto 가 전달되는게 나의 목표였다.

그때 나의 생각은 "@RestController로 어노테이션을 선언했으니까 @RequestBody안써도 된다고 했던거 같은데 ~" 였다.

그리고 이것이 내 코드 상 문제가 되었다.

해결방안

완전 잘못된 생각이었다. @RestController는 @Controller + @ResponseBody 가 되어 각 메소드에 @ResponseBody 어노테이션이 선언된 효과(?)를 준다. 그래서 나는 파라미터로 전달한 PostSaveRequestDto에 @RequestBody 어노테이션을 추가했다.

바보같은 실수구나! 스프링을 처음 부터 다시 공부해라,,

배운점/기억할점

- @RestController는 @Controller + @ResponseBody 이다.