[백엔드] 객체 생성 방법 비교 - Setter vs. Builder 패턴

개발log·2024년 4월 22일

백엔드 기초지식

목록 보기
5/8
post-thumbnail

객체를 생성할 때 사용되는 방법 중 가장 흔한 방법은 Setter 메서드와 Builder 패턴이다.


Setter 메서드를 이용한 객체 생성

객체의 속성을 외부에서 설정하는 방식

장점

  1. 유연성 : Setter 메서드를 사용하면 객체의 각 속성을 개별적으로 설정할 수 있어 유연성이 향상된다.
  2. 간편성 : 필요한 속성만 설정할 수 있어 객체 생성이 간단하다.

단점

  1. 불변성 보장의 어려움 : 외부에서 객체의 상태를 언제든지 변경할 수 있어 불변성을 보장하기 어렵다.
  2. 안전성 문제 : Setter를 과도하게 사용하면 객체의 내부 상태가 예상하지 못한 방식으로 변경될 수 있다. 이는 코드의 복잡성을 증가시키고 유지보수를 어렵게 만든다.
public class Person {
    private String name;
    private int age;
    
    public Person() {
        // 기본 생성자
    }
    
    // Setter 메서드 - @Setter로 단축해서 사용도 가능
    public void setName(String name) {
        this.name = name;
    }
    
    public void setAge(int age) {
        this.age = age;
    }
    
    public static void main(String[] args) {
        // Setter 메서드를 사용하여 객체 생성
        Person person = new Person();
        person.setName("John");
        person.setAge(30);
        
        System.out.println("Name: " + person.getName());
        System.out.println("Age: " + person.getAge());
    }
}

Builder 패턴을 이용한 객체 생성

Builder 패턴은 객체를 생성할 때 한번에 필요한 속성을 설정할 수 있는 방식이다.

장점

  1. 불변성 보장 : Builder 패턴을 사용하면 객체가 생성된 후에는 불변 상태를 유지한다. 이는 객체의 내부 상태가 예측 가능하고 변경되지 않음을 보장한다.
  2. 유효성 검사 : Builder를 사용하여 객체를 생성할 때 유효성 검사를 수행할 수 있어 안정적인 객체 생성을 보장할 수 있다.

단점

  1. 가독성 저하 : 객체 생성에 필요한 코드의 양이 늘어나, 가독성을 저하시킬 수 있다.
  2. 복잡성 증가 : 객체의 속성이 많을 경우 Builder 클래스의 구현이 복잡해질 수 있다.
import lombok.Builder;
import lombok.Getter;

@Getter
public class Person {
    private final String name;
    private final int age;

    @Builder
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {
        // @Builder를 사용하여 객체 생성
        Person person = Person.builder()
                .name("John")
                .age(30)
                .build();

        System.out.println("Name: " + person.getName());
        System.out.println("Age: " + person.getAge());
    }
}

Builder 패턴을 사용한 유효성 검사 예

@Builder
    public Person(String name, int age) {
        // 이름이 null이거나 빈 문자열인 경우 예외 처리
        if (name == null || name.isEmpty()) {
            throw new IllegalArgumentException("이름은 null이거나 빈 문자열이 될 수 없습니다!");
        }

객체의 불변성과 안정성을 고려할 때, Setter 메서드 대신 Builder 패턴을 사용하는 것이 좋다. 이를 통해 객체의 내부 상태를 예측 가능하고 안정적으로 유지할 수 있으며, 코드의 가독성과 유지보수성을 향상시킬 수 있기 때문이다.

profile
나의 개발 저장소

0개의 댓글