[Java] @Builder 빌더패턴 사용하기

울상냥·2023년 2월 17일
0

Java

목록 보기
1/2

첫 스프링부트 프로젝트를 시작하면서 참고한 책에서 생성자에 @Builder를 사용하였다. 해당 책에서는 @Builder사용의 이점으로 개발자가 객체 생성시에 인자의 순서를 고려하지 않을 수 있고 가독성을 높혀주어 실수를 방지할 수 있다고 설명했다.

이후 습관적으로 @Builder를 사용중이었기 때문에 빌더패턴을 제대로 알고 사용하고자 한다.


Builder 적용

User클래스는 이름, 나이, 키의 3개 필드를 갖고있다.

@Getter
public class User {

    private String name;
    private int age;
    private int height;

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

롬복의 @Builder 어노테이션을 사용하면 간단하게 빌더패턴을 적용할 수 있다.
클래스 또는 생성자에 붙여주면 되는데 생성자에 선언시 생성자에 포함된 필드만 빌더에 포함되기 때문에 안전한 사용을 위해 생성자에 @Builder를 사용해주고 있다.


빌더의 장점

순서를 고려하지 않아도 된다!

User user = new User("울상냥", 160, 20); //나이 160, 키 20...?!

일반적으로 객체 생성시에 생성자의 순서를 고려해 주어야 한다. 개발자는 생성자의 인자 순서를 알아야 한다. 인자의 경우가 많아질경우 인자를 잘못 넣는 실수도 발생할 수 있다.

    User user = User.builder()
            .name("울상냥")
            .height(160)
            .age(20)
            .build();

빌더를 사용하면 순서를 고려하지 않아도 된다!

가독성이 좋아진다!

User user = new User("울상냥", 20, 160);

생성자를 호출할 때 20160이 의미하는 값을 알기 어렵다.

    User user = User.builder()
            .name("울상냥")
            .height(160)
            .age(20)
            .build();

빌더를 사용하면 직관적으로 어떤 멤버변수에 어떤값이 설정되는지 알 수 있다.

필요한 데이터만 설정할 수 있다!

User 객체 생성시에 몸무게 필드가 필요하지 않은 경우에

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

다음과 같이 요구에 맞는 생성자를 만들거나

User user = new User("울상냥", 20, null);

더미값을 넣어 객체를 생성해주어야 한다.

    User user = User.builder()
            .name("울상냥")
            .age(20)
            .build();

빌더를 사용하면 원하는 필드만 설정하여 생성자를 호출할 수 있다. 생성자가 많을 경우 빌더를 사용하면 코드의 양을 줄일 수 있다!


변수의 개수가 적거나 변경이 없다면 생성자를 사용하는것이 빌더를 사용하는 것보다 간편하고 간결하다. (빌더를 많이 호출하다보면 한줄이었던 객체 생성이 몇줄에 걸쳐 아주 방대해진다...!)
직접 생성자를 호출하여 데이터를 설정하지 않고 map을 사용하여 도메인 객체에서 responseDto객체를 생성하는 경우에는 빌더가 필요하지 않지만

일반적으로 객체를 생성하는 경우에는 가독성 등을 고려하여 빌더를 적용하는것이 좋을 것 같다.

profile
안되면 되게하라

0개의 댓글