@Setter를 지양하는 것이 좋은 것인가 ?
오늘 코드 리뷰를 받으면서 @Data와 @Setter를 지양하는 방향으로의 수정을 제안 받았다.
(이 때 @Setter는 객체 초기화가 아닌 필드 수정 시 사용되는 상황입니다.)
해당 리뷰를 통해 언급한 두가지 어노테이션을 지양해야되는 이유에 대해 고민해보았다.
@Setter를 클래스에 적용하면 해당 클래스의 필드들을 수정하는 메소드가 모두 생성이 된다. 수정 가능성이 없는 필드들에 대해서도 수정 메소드가 생기는 것은 원하지 않는 동작이 발생할 가능성을 만들어낸다.
즉, 객체의 일관성을 유지하기 어렵게 만든다.
필드에 @Setter를 적용하면은?? 그러면 위 문제는 해결된다고 생각한다. 지양해야되는 다른 이유가 또 무엇이 있을까??
리뷰를 주신 분께서 앞전에 다른 레포에서 의견이 오고갔던 @Setter사용 관련 코멘트들을 보여주셨고 해당 의견에는 이러한 내용도 있었다.
“@Setter를 사용하는 것이 아닌 메소드를 따로 구현하면 메소드 명을 통해 해당 값을 변경하는 의도를 좀 더 명확히 표현할 수 있습니다.”
즉, @Setter 수정 메소드를 사용함으로써 코드 가독성을 높이고 유지보수측면에서 이점을 가져갈 수 있다.
별개로 @Setter를 지양하는 것에 대해 구글링을 해보니, 객체를 생성하여 값들을 초기화하는 상황에서 @Setter를 지양해야한다는 글들이 많아 해당 내용도 간략히 정리해보자.
언급한 상황에서 @Setter를 사용하면 두가지 문제점이 있다.
- 객체의 일관성 유지 어려움.
- 변화 의도를 파악하기 어려움.
수정할 때 @Setter를 사용하는 상황과 비슷한 문제점이다.
이를 해결하기 위한 방법으로는
- 생성자 사용
- @Builder 사용(권장)
이 있다.
생성자를 사용하면 인자들이 다양하게 들어오는 것에 대해 일일이 생성자들을 만들어주어야하며 어떤 필드에 어떤 값이 들어가는지 확인이 어렵기 때문에 가독성이 떨어지는 문제가 있다.
빌더 패턴을 사용하면 이러한 문제들을 해결할 수 있다!