게시판 작성을 하면서 컨트롤러 에서 브라우저로 부터 JSON을 받을 때 무심코 @ModelAttribute를 작성하였습니다. 하지만 정상적으로 JSON 데이터를 DTO로 받지 못하였고, 그 이유를 찾으니 DTO에 setter메소드를 작성하지 않았기 때문에 JSON을 받지 못한것이었습니다.
둘의 차이점을 정리하면 다음과 같습니다.
@ModelAttribute는 파라미터 값으로 DTO객체에 바인딩을 하는 방식이기 때문에 바인딩하려는 DTO객체에 Setter메소드가 반드시 있어야 하고,
@RequestBody는 요청 본문의 body에 json이나 xml값으로 요청을 하여 HttpMessageConveter를 반드시 거쳐 DTO객체에 맞는 타입으로 바꿔서 바인딩을 시켜준다.
최근에는 Setter에 대한 문제점 때문에 사용을 지양한다고 하기 때문에 DTO에 Setter를 사용하지 않는 방법인 @RequestBody를 사용하였습니다.
Setter를 사용하지 않는 방법은 다음과 같습니다.
- Setter 메소드를 사용하면 값을 변경한 의도를 파악하기 힘듭니다.
- 객체의 일관성을 유지하기 어렵습니다.
자바 빈 규약을 따르는 Setter는 public으로 언제든지 변경할 수 있는 상태가 됩니다. 모든 곳에서 데이터를 변경할수 있는 상태가 되기 때문에 객체의 일관성을 유지하기 어렵습니다.
추가적으로, @RequestBody를 사용할 때 주의점은 다음과 같습니다.