본문 바로가기
JAVA

빌더 패턴!

by 다미르 2019. 4. 8.

정적 팩토리와 생성자에는 제약이 있다.

클래스의 매개변수가 많아지면 대응하기가 어렵다.

이를 보완할 수 있는 것이 빌더 패턴이다.

앞에 Bean Builder에 대해 정리할 때 잠깐 언급했던듯


내가 최근에 SNS 로그인 관련된 개발을 진행하다보니.. 그 것을 예시로 들어보겠다.

각 SNS 로그인 google, LinkedIn, Twitter, kakao, facebook etc... API는 제공하는 정보가 다르다.

그 중 내가 필요한 정보를 요약해보자면

  • 이름(필수)

  • 나이

  • 성별

  • 전화번호

  • 주소

  • 이메일

  • 생년월일

대충 이정도 있을 것이다.

저것을 기준으로 클래스를 구상하면

name은 필수값이기에 name만을 가진 생성자 하나

그 외에 age 부터 birthDate까지는 어느 필드가 null이고 데이터가 있을지 알 수 없기에

그 종류만큼 생성자를 만들어줘야한다.

이를 보고 점층적 생성자 패턴이라고 부른다.

 

이런 생성자는 사용자가 설정하기 원하지 않는 매개변수까지 값을 지정해줘야 한다.

그리고 객체를 만드는 사람도 짜증나고, 생성자만 오질나게 길어지겠지.

 

만약 필드가 20개쯤 된다고 치자.

그거에 대해서 new MyClass(0,1,'test',3,5, ...); 이렇게 쓰다보면

b 필드에 입력해야하는 a 필드에 값을 잘못입력해서 runtime시 오류가 발생하는 경우도 있을 것이고..

아마도 클라이언트 코드를 작성하는 개발자는 정신이 나갈 것이다.


이런 점층적 생성자 패턴의 대안 중에 하나 자바 빈즈(Beans) 패턴을 보자.

별거 없다. 우리가 흔히 VO(혹은 DTO)를 생성할 때 주구장창 사용하는

getter, setter가 여기에 해당한다.

위의 점층적 생성자 패턴을 빈즈 패턴으로 수정해서 클라이언트 코드를 작성해보면..

훨씬 깔금하다.

클래스 코드도 무척이나 간결해지고,

클라이언트 코드를 작성할 때 생성자와 싸울 필요도 없다.

 

근.데

1. 자세히보면 MemberInfo 객체 하나를 만들기 위해 수많은 메서드를 호출해야 한다.

2. 멀티 스레드 환경에서 객체의 안정성을 보장할 수 없다.

점층적 생성자 패턴은 매개변수만 제대로 체크하면 안정적으로 객체가 생성된다.

하지만 자바 빈즈 패턴은 객체가 생성되는 도중 멀티 스레드 환경에서 무슨 일이 생길지 모른다.

그 경우 runtime시 디버깅하기도 만만치 않을 것이다..

아마 대부분 저런 문제가 있는지 모른 상태로 지나갈 가능성이 높다.

트랜잭션에 문제가 생기기 전까지는..


이 모든 문제점을 보완하는 것이 바로 빌더 패턴이다.

점층적 생성자 패턴의 안정성 + 자바 빈즈 패턴의 간결함을 종합한 패턴이다.

 

빌더 패턴을 통해서 객체를 생성하는 방법은

1. 클라이언트는 필수 매개변수만으로 생성자를 호출해 빌더 객체를 얻는다.(여기 예제에서는 name이 필수이다)

2. 빌더 객체가 제공하는 setter 메서드로 선택 매개변수를 설정한다.

3. 마지막으로 build() 메서드를 호출해 우리에게 필요한 객체를 얻는다.

 

아래는 빌더 패턴을 적용한 MemberInfo 객체이다.

이 MemberBuilder를 이용해 인스턴스를 하면

MemberInfo memberVo = new MemberInfo.MemberBuilder("남동희").setAge(30).setGender(true).build();

이 한줄로 끝이다.

간결하고,

setter가 return this를 통해서 계속 자기자신을 반환하기에 안정성이 보장된다.

아참 이런 방식을 메서드 체이닝이라고 부른다.

자바 스크립트에서 매우 흔한 방식임 ㅇㅇ


요약

클래스의 매개변수가 많다면 빌더 패턴을 사용하는 것을 고려해보자.

매우 유연하게 객체를 생성할 수 있다.

 

'JAVA' 카테고리의 다른 글

컴포지션(Composition)  (0) 2019.04.28
싱글톤  (0) 2019.04.15
정적 팩토리 메서드의 장단점  (0) 2019.04.07