[SpringBoot] 빌더 패턴

728x90

 

Entity 클래스를 생성할 때, 주의할 것은 무분별한 setter 메소드 생성이다. 자바빈 규약을 생각하시면서 getter/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();
}

자 그러면 여기서 한가지 궁금한 점이 생길 수 있다. 기본 생성자도 AccessLevel.PROTECTED로 막아놓고, setter 메소드도 없는 이 상황에서 어떻게 값을 채워 DB에 insert 해야할까?

기본적인 구조는 생성자를 통해 최종 값을 채운후 DB에 Insert 하는것이며, 값 변경이 필요한 경우 해당 이벤트에 맞는 public 메소드를 호출하여 변경하는 것을 전제로 한다.여기서 생성자 대신에 @Builder를 통해 제공되는 빌더 클래스를 사용합니다. 생성자나 빌더나 생성 시점에 값을 채워주는 역할은 똑같다. 다만, 생성자의 경우 지금 채워야할 필드가 무엇인지 명확히 지정할수가 없다. 예를 들어 아래와 같은 생성자가 있다면

public Example(String a, String b){
    this.a = a;
    this.b = b;
}

개발자가 new Example(b,a)처럼 a와 b의 위치를 변경 해도 실제로 코드를 실행하기전까진 전혀 문제를 찾을수가 없다.하지만 빌더를 사용하게 되면 아래와 같이

Example.builder()
    .a(a)
    .b(b)
    .build();

어느 필드에 어떤 값을 채워야 할지 명확하게 인지할 수 있다.

728x90