
혼자 스프링을 공부하다 보니 @Setter를 사용할 때도 있고 @Builder를 사용하는 경우도 있었다.
나는 주로 @Setter를 사용했지만, 문득 @Builder와 @Setter의 차이점이 궁금해졌다. 기능이 비슷해 보였기 때문이다.
조금 찾아보니, @Setter는 지양하고 @Builder를 사용하는 것이 더 좋은 선택이라는 의견이 많았다.
일단 @Setter 의 단점을 알아보자.
@Setter를 사용하면 객체의 상태를 언제든지 변경할 수 있어 객체의 일관성을 유지하기 어렵다.
객체지향 원칙 중 OCP(Open-Closed Principle)를 위반할 수 있다.
@Setter는 객체의 상태 변경에 대해 너무 개방적이기 때문이다.@Setter를 사용하면 객체의 상태 변경 의도가 불분명해진다.코드만 봤을 때 생성인지 수정인지 구분하기 어려울 수 있다.setName() 메서드만으로는 이것이 객체 생성 시 이름을 설정하는 것인지, 기존 이름을 수정하는 것인지 파악하기 어렵다.@Setter를 사용하면 모든 필드에 대해 변경 메서드가 생성되어, 변경되면 안 되는 중요한 값도 변경 가능한 것으로 오해할 수 있다. -> 이는 잠재적으로 버그를 유발할 수 있는 위험 유발@Builder를 사용하면 객체 생성 후 상태 변경을 제한할 수 있어 OCP(Open-Closed Principle)를 더 잘 준수 가능객체의 일관성과 불변성: @Builder를 사용하면 객체 생성 시점에 모든 값을 설정하므로, 객체의 일관성을 유지하고 불변성을 보장하기 쉽다.
코드 가독성: 메서드 체이닝을 통해 객체 생성 코드가 더 간결하고 이해하기 쉬워진다.
유연성: 복잡한 객체 생성이나 선택적 매개변수가 많은 경우에 특히 유용
의도의 명확성: 객체 생성의 의도가 명확해져, 코드의 목적을 쉽게 파악할 수 있다.
OCP 준수: 객체 생성 후 상태 변경을 제한할 수 있어 객체 지향 원칙을 더 잘 지킬 수 있.
@Builder를 사용하는 것이 좋다.@Setter를 사용하는 것이 좋다.@Builder를 우선적으로 고려해야 한다.