Programing/Design Patterns

@Builder Annotation 알짜만 빼먹기 / 객체 생성 방법

리커니 2022. 11. 10.
반응형

@Builder Annotation은 lombok 라이브러리의 annotation 입니다.

lombok의 적용은 아래의 Link를 확인하세요.

 

Link : https://aljjabaegi.tistory.com/481

 

Java 필수 라이브러리 Lombok 사용, 적용방법

Java 필수 라이브러리 Lombok 사용, 적용방법 Lombok 라이브러리는 VO(Value Object) 나 DTO(Data Transfer Object) 생성 시 혁신적으로 코드를 줄여주는 라이브러리 입니다. 얼마나 혁신적으로 코드를 줄이는지

aljjabaegi.tistory.com

 

Eclipse 이외의 다른 IDE에선 extension 설치로 사용 가능합니다.

 

1. @Builder Annotaion

@Builder Annotation은 Builder Pattern으로 객체를 생성할 수 있게 해주는 Annotation 입니다.

Builder Pattern은 객체를 생성하는 방법 중에 하나이며 타 방법에 비해 직관적, 명시적이기 때문에 가독성을 높여주고,

setter가 없기 때문에 객체의 불변성을 보장하여 데이터의 일관성을 유지할 수 있습니다.

 

그럼 객체를 생성하는 다른 방식들과 Builder 패턴을 비교해 보겠습니다.

 

2.생성자를 활용한 객체 생성

public class TestVO {
    private final String name;
    private final int age;
    private final String phone;
    private final String email;

    public TestVO(String name, int age, String phone, String email) {
        this.name = name;
        this.age = age;
        this.phone = phone;
        this.email = email;
    }
}
TestVO test = new TestVO("이건", 37, "010-1234-5679", "geonlee@email.com");

위와 같이 생성자를 활용해 객체를 생성할 때는 매개변수의 순서가 중요하게 됩니다.

그리고 모든 데이터가 필수로 매개변수로 전달되어야 합니다.

매개변수가 달라진다면 매개변수가 다른 생성자를 여러개 만들어야 하는 불편함이 있습니다.

 

3.setter를 활용한 객체 생성

public class TestVO {
    private String name;
    private int age;
    private String phone;
    private String email;

    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public int getAge() {
        return age;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
    public String getPhone() {
        return phone;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getEmail() {
        return email;
    }
}
TestVO test = new TestVO();
test.setName("이건");
test.setAge(30);
test.setPhone("010-1234-5678");
test.setEmail("geonlee@email.com");

생성 시 인자를 전달 할 필요가 없고, 순서도 중요하지 않습니다. 그럼으로 여러개의 생성자를 만들 필요도 없죠.

하지만 생성과 Setter를 별도로 해주어야 하고

setter 메소드가 존재하기 때문에 객체의 데이터 불변성을 보장 할 수 없습니다. (반복적인 setter 호출 가능.)

 

4. Builder 패턴으로 객체 생성

public class TestVO {
    private final String name;
    private final int age;
    private final String phone;
    private final String email;
    
    public TestVO(Builder builder) {
        this.name = builder.name;
        this.age = builder.age;
        this.phone = builder.phone;
        this.email = builder.email;
    }
    public static class Builder {
        private String name;
        private int age;
        private String phone;
        private String email;

        public Builder name(String name){
            this.name = name;
            return this;
        }
        public Builder age(int age){
            this.age = age;
            return this;
        }
        public Builder phone(String phone){
            this.phone = phone;
            return this;
        }
        public Builder email(String email){
            this.email = email;
            return this;
        }
        public TestVO build(){
            return new TestVO(this);
        }
    }
}
TestVO test = new TestVO.Builder()
			.name("이건")
			.age(37)
			.phone("010-1234-5678")
			.email("geonlee@email.com").build();

차이점이 느껴지시나요?

위에서 말씀드린 Builder 패턴의 장점을 확인 하실 수 있으실 겁니다.

그럼 lombok 라이브러리를 활용하여 Builder 패턴을 작성해 보겠습니다.

 

@Builder
public class TestVO {
    private final String name;
    private final int age;
    private final String phone;
    private final String email;
}

끝입니다. @Builder Annotation만 추가해주면 나머지 코드는 작성할 필요가 없습니다.

TestVO test = TestVO.builder()
			.name("이건")
			.age(37)
			.phone("010-1234-5678")
			.email("geonlee@email.com").build();

 

 

하지만 lombok documents 에서는 @Builder Annotaion을 생성자에 추가하라고 명시하고 있습니다.

 

public class TestVO {
    private final String name;
    private final int age;
    private final String phone;
    private final String email;

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

 

@Builder Annotation에 대한 자세한 설명을 아래의 링크를 확인하세요!

 

Link : https://projectlombok.org/features/Builder

 

@Builder

 

projectlombok.org

 

 

반응형

댓글

💲 추천 글