이미 많은 분들이 빌더 패턴 관련해서 포스팅을 잘 정리해주셔서 빌더 패턴에 대해서 설명 해주기 보다는 인텔리제이 플러그인을 활용해서 좀 쉽게 사용할 수 있는 팁을 포스팅을 해보겠습니다. 물론 Lombok을 활용해서 빌더를 손쉽게 사용할 수있지만 Lombok을 사용하지 않고도 쉽게 만들 수 있는 방법을 소개해드리겠습니다.
Builder Generator 플러그인 설치
Preferences -> Plugins -> Browse Repositories -> Builder Generator 검색 및 설치
빌더클래스 생성 방법
command + n
키를 눌러 Builder 를 선택합니다.
위 화면처럼 Builder 클래스를 생성합니다.
빌더 패턴 간단 소개 Member 객체 1 2 3 4 5 6 7 8 9 10 11 12 public class Member { private String name; private String email; private String mobile; private String address; private String password; private String state; private int age; }
문제점 1 Member member = new Member (name, email, mobile ....)
객체를 생성할 때 어떤 값이 필수 값인지 옵션 값인지 인지 하기 어렵다.
Member member = new Member(name, email, mobile ....)
생성자로 객체를 생성 할 경우 반드시 순서를 맞추야 한다.
Setter
로 생성할 경우 Setter 메소드를 많이 작성해야한다.
해결
빌더 패턴을 사용해서 필수 값은 생성자로 옵션 값은 빌더 클래스로 작성한다.
MemberBuilder.class 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 public final class MemberBuilder { private final String name; private final String email; private String mobile; private String address; private String password; private String state; private int age; private MemberBuilder (String name, String email) { this .name = name; this .email = email; } public static MemberBuilder aMember (String name, String email) { return new MemberBuilder (name, email); } public MemberBuilder withMobile (String mobile) { this .mobile = mobile; return this ; } public MemberBuilder withAddress (String address) { this .address = address; return this ; } public MemberBuilder withPassword (String password) { this .password = password; return this ; } public MemberBuilder withState (String state) { this .state = state; return this ; } public MemberBuilder withAge (int age) { this .age = age; return this ; } public Member build () { Member member = new Member (); member.setName(name); member.setEmail(email); member.setMobile(mobile); member.setAddress(address); member.setPassword(password); member.setState(state); member.setAge(age); return member; } }
필수 맴버 필드인 name, email
에 final
을 추가합니다.
생성자 파라미터에 name, email
추가합니다.
자동으로 만들어준 name, email
의 with
메소드를 제거 합니다.
객체 생성 1 2 3 4 5 6 Member member = MemberBuilder .aMember("Yun" , "cheese10yun@gmail.com" ) .withAddress("address" ) .withAge(20 ) .withMobile("010-XXXX-XXXX" ) .build();
필수 값은 생성자로 넘겨 필수 값을 넘겨 필수 값을 인지 하기 쉽습니다.
옵션 값들은 순서에 상관 없이 .with...()
메소드로 이어나갑니다.
결론 객체를 안전하게 생성하고 쉽게 생성할 수 있다는 장점이 있습니다. 개념도 그렇게 어렵지 않아 가장 만만하게 도입해 볼만한 디자인 패턴인거 같습니다.