본문 바로가기
  • 2025
백엔드

생성자와 빌더 무슨 차이가 있을까

by soonrang 2024. 8. 6.

 

 

코드를 짜다보니 문득 이런 생각이 들었다. 생성자와 빌더 무슨 차이가 있을까? 

빌더를 쓰다보면 코드가 길어져 생성자로 쓰는게 좋지 않나 이런 생각을 했었다. 

 

1. 생성자 방식

public class Donation {
    private String name;
    private String desc;

    public Donation(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }

    // getters and setters
}

Donation donation = new Donation("Donation Name", "Donation Description");

 

직관적이고 간단하다. 

매개변수가 많아지면 가독성이 떨어지고 오버로딩이 많아질 경우 코드가 복잡해진다. 

매개변수 순서에 민감하여 순서가 잘못되면 오류가 발생한다.

 

> 실제로 생성자를 쓰면 왔다갔다 순서를 확인해줘야 한다. 실수로 잘못넣어주면 데이터베이스에 잘못된 값들이 맵핑돼서 들어간다. 

 

2. 빌더 방식

public class Donation {
    private String name;
    private String desc;

    private Donation(Builder builder) {
        this.name = builder.name;
        this.desc = builder.desc;
    }

    public static Builder builder() {
        return new Builder();
    }

    public static class Builder {
        private String name;
        private String desc;

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

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

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

    // getters and setters
}

Donation donation = Donation.builder()
                            .name("Donation Name")
                            .desc("Donation Description")
                            .build();

 

클래스를 추가로 적어야하는 코드들이 필요하지만 스프링부트 @Builder 어노테이션으로 해결이 가능하다.

매개 변수 순서 상관이 없으며 필요한 필드만 설정할 수 있다. 

가독성이 높고, 명확하게 어떤 필드에 무슨 값이 들어가는지 알 수 있다.

 

 

결론

매개변수가 적으면 생성자, 많아지면 빌더패턴을 쓰는게 좋겠다.

빌더 패턴 위주로 써야겠다!