반응형
데이터 바인딩이 안된다.
최근 개인적으로 Spring을 이용한 프로젝트를 진행하면서 Form에서 데이터를 받아오는 것을 구현하고 있었다.
자꾸 에러가 발생한다..
처음에는 @Valid의 문제인가 싶어 어노테이션을 삭제해 보았는데
데이터가 안 넘어온다.
null값으로 매핑이 되어 넘어오기에 @Valid가 에러를 띄운 것인데 왜인지 한참을 고민했다.
정답은 객체에 있었다.
@Getter
public class PostForm {
private LocalDateTime postTime;
private String questionLink;
@NotBlank(message = "내용은 필수입니다")
private String content;
}
객체에서는 @Setter의 사용을 지양해야 한다는 단순한 생각으로 최대한 @Setter가 없이 구현을 하고 있었는데 이 부분에서 문제가 발생했다.
@Setter가 없으니 Form에서 넘어오는 값을 세팅할 수가 없었던 것.
어노테이션을 설정해 주니 값이 잘 넘어오는 것을 알 수 있었다.
@Setter의 사용 문제없을까?
결론적으로 말하자면 Entity에서의 사용은 지양하는 편이 좋다.
비즈니스 로직이 존재하고 실제 데이터를 변경하기 때문인데 이는 문제로 이어질 수 있다.
하지만 DTO에서는 다르다.
DTO는 단순히 데이터를 담기 위해 있는 것이기에 Setter를 통한 중요 데이터가 변경될 일이 없어서 상관이 없다고 한다.
이와 관련된 영한님의 답변도 찾을 수 있었다.
왜 Entity에서는 @Setter의 사용을 지양할까?
간단하게 GPT의 도움을 받아보았다.
'객체의 불변성'이 가장 중요한 키워드로 보인다.
+ 객체 지향의 설계 원리 중 '정보 은닉'과 관련이 있지 않을까?
++ @Setter의 사용보다는 오버로딩, @Builder 등의 빌더 패턴 사용, 정적 팩토리 메서드 사용이 좋다고 한다.
@Setter가 없으면 어떤 순서로 데이터가 바인딩될까?
기본 생성자와 관련이 있어 보인다.
이는 추가로 공부하여 포스팅을 해야겠다.
참고 문서
향로님 블로그
영한님 인프런 답변
반응형