@Setter을 사용할 경우 사용 의도/목적이 불분명하다.(Insert 인지 Update 인지)
변수의 값을 Set 하는 과정에서 이 행위 자체가
insert를 위한 동작인지 update를 위한 동작인지 불분명하다.
book.setTitle("JPA 사용법");
book.setContent("JPA의 구현체");
book.setNum("12")
위 코드를 보면 이게.. 인스턴스를 새로 만드는건가..? 아님 기존에 있던 값을 변경하려는 건가..?
싶을 것이다.
건들면 안되는 값을 건들 수 있다. (by. 착오)
setter 메서드는 public으로 선언하기에 메서드 사용이 자유롭다.
그렇기에 의도하지 않은 곳에서 접근하여 값을 재 설정하거나 하면
일관성이 깨지는 문제가 발생.
setter 대신 생성자에 @Builder를 사용하여
인스턴스를 만들 때 이와 같이 사용합니다.
@Builder
public Member(String num, String name, String phone){
this.num = num
this.name = name
this.phone = phone
}
Member.builder()
.num("1")
.name("taewogi")
.phone("123-123")
.build();
결과적으로 setter을 사용하지 않고 인스턴스 속 변수를 변경하고 싶으면,
의미와 의도를 명확히 알 수 있는 매서드 구현이 요구된다.
public class Order{
public void setStatus(boolean status){
this.status = status;
}
public void 상품_취소(){
order.setStatus = false;
}
}
-----------------------------------------------
public class Order{
public void cancelOrder(){
this.status = false;
}
public void 상품_취소(){
order.cancelOrder();
}
}
점선을 기준으로 상위에 있는 코드는 지양해야 할 코드이다.
why?
상품_취소라는 메서드를 호출했을 때, setter 메서드를 통해 status를 변경해주는 동작을 취한다.
이 부분이 문제인 이유는 setStatus 라는 메서드만을 봤을때 이게 어떤 기능을 수행하는지 명확한 판단이 안선다는 것.
(이게.. update를 위한건가..? 아니면 insert..?)
하지만 점선 아래코드에선 상품_취소 메서드를 호출했을 때, 바로 cancel_order라는 누가 봐도 주문 취소라는 역할을 수행한다는 점을 인지 가능하며, 해당 메서드는 자체적으로 false status로 변경한다.
자체적으로 변경하는 것의 중요한 점은 점선 위 코드로 구현했을 때, 해당 메서드가 public이기 때문에 외부에서 set 매서드를 불러서 값을 맘대로 변경할 수 있는 가능성이 농후.
점선 아래 코드처럼 구현할시, status 값을 false라고 못 박아서 외부에서 접근한다고 한들 True라는 값으로 변경하지 못한다는 이점. 즉, 자신이 원하는 값으로 변경을 못한다.
(status = false 라) 정해진 값으로만 결과값이 나오기 때문!
주저리
공부하고 있는 책에 Entity에 setter을 쓰지 말아야 한다고 하여
이에 대한 디테일한 이유가 궁금하여 직접 그 내용을 찾아 나만의 방식으로 정리해보았다.
아직 연습 단계이기에 직접 코드를 작성하며 소규모 프로젝트를 진행할 때, 해당 행위에 대한 문제점을 직면할 가능성이 높지 않지만, 이에 대한 단점을 인지한다는 것은 중요하다.
알고 있으면 추후에 발생할 수 있는 문제를 방지 가능..!
'Spring Boot 개념 정리' 카테고리의 다른 글
의존성 주입(DI) 정리 및 후기 (1) | 2023.09.01 |
---|---|
생성자 어노테이션에 대해 알아보자(ex. @NoArgsConstructor) (0) | 2023.09.01 |
JWT 개념 정리 (0) | 2023.03.26 |
빈 스코프 핵심 내용 이해하기 (0) | 2023.02.19 |
빈 생명주기 콜백 핵심 내용 이해하기 (0) | 2023.02.19 |