본문 바로가기
Java/자바공부

setter 대신 builder

by 티코딩 2023. 4. 9.

그 동안 코드스테이츠에서 setter를 사용하며 setter에만 익숙해져있던 나에게 신선한 충격을 준 말이 있었다.

"setter는 현업에서 안써~ builder쓰지."

ㅇㅇ엥? 이 편한 setter를 안쓴다고? 왜지? 왜!!!?라고 생각해서 한번 찾아보고 정리해봤다.

setter를 사용할때는 매개변수가 굉장히 많은 경우에 일일이 설정하기 굉장히 번거롭다.

setter의 사용을 지양하라는 이유중 가장 큰 두가지중 첫번째이유는 의도를 파악하기 힘들다는것이다. 두번째 이유는 객체의 일관성을 유지하기 힘들다는것이다. 물론 setter 대신 생성자를 사용해 객체의 매개변수값들을 설정해 줄 수 있지만, 어떤 매개변수가 필요하지 않을 수도 있다. 고로 builder패턴을 사용하는것이 좋다고 한다.

 

예를 들어, 우리가 자동차 클래스를 가지고 있다고 가정해 보자. 이 클래스에는 제조사, 모델, 연식, 가격 등의 속성이 있다고 치자.

public class Car {
    private String make;
    private String model;
    private int year;
    private double price;

    public static class Builder {
        private String make;
        private String model;
        private int year;
        private double price;

        public Builder make(String make) {
            this.make = make;
            return this;
        }

        public Builder model(String model) {
            this.model = model;
            return this;
        }

        public Builder year(int year) {
            this.year = year;
            return this;
        }

        public Builder price(double price) {
            this.price = price;
            return this;
        }

        public Car build() {
            return new Car(this);
        }
    }

    private Car(Builder builder) {
        this.make = builder.make;
        this.model = builder.model;
        this.year = builder.year;
        this.price = builder.price;
    }
}
Car car = new Car.Builder()
                .make("Toyota")
                .model("Camry")
                .year(2022)
                .price(25000.00)
                .build();

이렇게 사용해도 되고, Lombok의 @Builder 를 사용하면,

@Getter
@NoArgsConstructor
@Entity
public class Car {
    private String make;
    private String model;
    private int year;
    private double price;

@Builder
    public Car(String make, String model, int year, double price){
        this.make = make;
        this.model = model;
        this.year = year;
        this.price = price;
    }

setter를 사용할땐,

public class Car {
    private String make;
    private String model;
    private int year;
    private String color;

    public void setMake(String make) {
        this.make = make;
    }

    public void setModel(String model) {
        this.model = model;
    }

    public void setYear(int year) {
        this.year = year;
    }

    public void setColor(String color) {
        this.color = color;
    }

    // getters
}
Car car = new Car();
car.setMake("Honda");
car.setModel("Civic");
car.setYear(2022);
car.setColor("Red");

builder 패턴을 사용함으로써 얻는 이점

  1. 가독성: Builder 패턴은 가독성이 높음. 객체의 속성을 설정할 메소드 체인을 사용하여 자연스럽게 읽을 있는 코드를 작성할  있다. 또한, 객체를 생성하고 초기화하는 필요한 모든 코드가 하나의 빌더 클래스에 포함되므로 코드가 읽기 쉽고 이해하기 쉬움 .
  2. 유연성: Builder 패턴은 객체 생성 초기화를 유연하게 제어할 있음. 빌더 클래스를 사용하면 객체의 일부 속성만 설정하거나 기본값을 사용하거나, 객체의 속성을 변경하거나 추가할 있음. 객체를 생성할 필요한 매개변수를 전달하는 방법도 유연하게 선택할 있다.
  3. 불변성: Builder 패턴을 사용하면 불변 객체를 생성할 있음. 빌더 클래스에서 객체를 생성할 객체의 모든 속성을 번에 설정할 있으므로, 객체가 생성되면 속성이 변경될  없음. 이것은 불변 객체를 사용하는 이점을 가져올 수 있다. 예를 들어, 다중 스레드 환경에서 안전하고 예측 가능한 코드를 작성할  있음.
  4. 컴파일 타임 검증: Builder 패턴은 컴파일 타임에 객체의 속성을 검증할 수 있다. 빌더 클래스에서 객체의 속성을 설정할 매개변수의 유효성을 검증할 있다. 런타임에러를 방지할 수 있다.

이 블로그를 참고했다. 이분이 훨씬 정리를 잘해둬서 링크를 첨부한다.

https://skatpdnjs.tistory.com/13

'Java > 자바공부' 카테고리의 다른 글

부트캠프가 끝난뒤...(5)  (0) 2023.05.11
부트캠프가 끝난뒤...(4)  (0) 2023.05.03
부트캠프가 끝난뒤...(3)  (0) 2023.04.27
부트캠프가 끝난뒤...(2)  (0) 2023.04.26
부트캠프가 끝난뒤...(1)  (0) 2023.04.11