- 빌더 패턴(Builder pattern)이란
객체를 정의하고 생성자를 통해 생성합니다.
Member member = new Member("name", "password", "comment");
이러한 방식은 몇가지 단점이 있기 때문에 객체를 생성하는 별도 builder를 두는 방법이 있다. 이를 Builer Pattern이라고 한다.
Member member = Member.builder()
.name("name")
.password("fffewere")
.comment("hihellor")
.build();
객체를 생성할 수 있는 빌더를 builder()함수를 통해 얻고 거기에 Setting을 하고 마지막에 build()를 통해 builder를 작동 시켜 객체를 생성한다.
2. Builder를 써야하는 이유
객체를 생성하는 방법중 builder를 알게 되었습니다.이러한 방법은 왜 쓰일까?
- 생성자 파라미터가 많을 수록 가독성이 좋지 않다.
Member member = new Member("name", "joo1jio", "comment", "abc", "what", "is", "it", "?");
이처럼 파라미터를 많아지는 상황이 벌어진다면? 이 값들이 어떤걸 의미하는지 이해하기 어렵다.
이를 Builder Pattern으로 구현하면 각 값을 빌더의 각 값들의 이름이 어떻게 setting 되었는지 바로 알기 쉽다.
이러한 경우가 많기 때문에 생성자보다 가독성이 좋은 Builder Pattern을 사용한다.
Member member = Member.builder()
.name("name")
.password("fffewere")
.comment("hihellor")
.address("seoul")
.mailbox("40%")
.build();
- 어떤 값을 먼저 설정하던 상관없다.
생성자의 경우는 정해진 파라미터 순서대로 각 값을 넣어줘야 하지만 Builder pattern은 빌더의 필드 이름으로 값을 설정하기 때문에
순서에 종속적이지 않다. 내가 편한 순서대로 정하면 된다.
public Member(String name, String password, String memo) {
this.name = name;
this.password = password;
this.memo = memo;
}
Member member = Member.builder()
.password("fffewere")
.name("name")
.comment("hihellor")
.build();
2. @Builder
그렇다면 어떻게 구현할까
우선 코드로 Builder를 만들고 그 안에서 멤버 필드별로 값을 설정하고 빌더를 반환하는 함수를 만들면된다.
사실 이렇게 하면은 Getter Setter 처럼 쭉쭉 늘어지는 코드가 많이 생기는것과 비슷하다.
그래서 LOMBOK이 이를 지원한다. Builder Pattern을 적용할 객체에 @Builder를 쓰기만 하면 된다.
@Builder
public class Member {
private String name;
private String password;
private String comment;
}
이렇게 되면 위에서처럼 Builder pattern을 써서 객체를 생성할 수 있다.
3. @Builder Options
- builderMethodName()
builder()를 Rename할 수 있는 기능-> 객체 사용에 조금더 편의를 위해
- buildMethodName()
build()를 Rename할 수 있는 기능
- builderClassName()
클래스 명을 Rename 할 수 있는 기능
Member member = Member.builder()
.password("fffewere") //return Memberbuilder
.name("name") //return Memberbuilder
.comment("hihellor") //return Memberbuilder
.build();
- toBuilder()
default 값이 false
true로 설정하면 Builder로 만든 인스턴스에서 toBuilder() 메서드를 호출해 그 값을 베이스로 새로운 빌더 패턴을 만들고 새로운 인스턴스가 생성된다.
Member member = Member.builder()
.name("name")
.password("fffewere")
.comment("hihellor")
.address("seoul")
.mailbox("40%")
.build();
Member member2 = member.toBuilder()
.password("2131234")
.address("jeju")
.build();
- access()
builder 클래스의 접근 제어자의 accesslevel의 설정을 할수 있는 기능
default: public
AccessLevel access() default lombok.AccessLevel.PUBLIC;
@
'Framework > Spring' 카테고리의 다른 글
💡절차지향 프로그래밍, 객체지향 프로그래밍, 관점지향 프로그래밍은 각각 어떻게 다른가 (0) | 2022.08.02 |
---|---|
💡 개발자 테스트 코드 작성 시 장/단점과 테스트 종류 별 (단위 테스트, 통합 테스트, E2E 테스트) 로 특징은? (0) | 2022.08.01 |