개발 연습장/Java

[Java, Spring] DTO에서 사용하는 @Setter에 대한 고찰

LooanCheong 2024. 2. 28. 19:29
반응형

데이터 바인딩이 안된다.

최근 개인적으로 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가 없으면 어떤 순서로 데이터가 바인딩될까?

기본 생성자와 관련이 있어 보인다.

이는 추가로 공부하여 포스팅을 해야겠다.


참고 문서

향로님 블로그
영한님 인프런 답변
반응형