CS/객체지향

빌더 패턴

gangmin 2023. 9. 7. 18:11

안녕하세요! 미니입니다.

오늘은 디자인 패턴에 대해서 이야기해보려고 합니다. 디자인 패턴은 객체 지향 프로그래밍을 하면서 발생했던 문제들에 대해서 일반화된 해결책입니다. 더욱 자세한 내용을 알고 싶으시면 GOF라는 책에서 보시면 될 것 같습니다.

빌더 패턴

빌더 패턴은 디자인 패턴의 범주 중 객체를 생성하는 방법에 대한 해결책인 생성 패턴입니다. 복잡하게 생성해야 하는 객체에 대해서 편리하게 해주는 패턴입니다. 복잡한 생성 과정을 작은 속성들을 붙이는 형식으로 구성하게 됩니다. 즉, 많은 매개변수에 대한 설정을 작은 메서드들의 조합을 통해서 생성하게 되는 것입니다.

제가 서브웨이 샌드위치를 좋아하는데 이것을 빗대서 코드를 짜봤습니다. ㅎㅎ

 

저희는 서브웨이 샌드위치에 대해서 구성하기 위해서는 6개의 인자를 주어야 합니다. 하지만, 추가재료가 없는 샌드위치에 대한 생성을 편하게(?) 하기 위해서 5개의 인자를 갖는 생성자를 작성해야 합니다. 이런 방식으로 여러 가지의 생성자를 작성하는 방식을 쉽게 생각할 수 있지만, 이것은 코드의 양을 증가시키고, 보일러 플레이트 코드를 증가시킵니다.

(저는 타자 칠 생각에 손가락이 벌써 아프네요…🤮)

이런 방식을 해결하기 위해서 빌더 패턴이 있는 겁니다!! 위의 코드를 빌더 패턴을 통해서 개선해보겠습니다.

코드가 좀 길기는 하지만, 간단합니다. 각 속성들에 대해서 기본값을 생성하고, 속성들에 값을 할당하고 자신의 참조를 반환하는 함수들을 구성합니다. 마지막으로 객체를 생성할 수 있는 함수를 생성해 주면 됩니다. 그러면 객체를 생성하는 과정이 간편하게 바뀌게 되었죠?

서브웨이 꿀 조합이라고 하는 베이컨 에그마요 샌드위치를 만들어봤습니다. 피망을 제거해야 하는데 피망만 넣은 건 안 비밀입니다 ㅎㅎ

한결 객체를 생성하는 것이 수월해지고, 생성되는 과정이 눈에 편하게 보이지 않나요?

빌더 패턴의 장점

프로세스로 표현

생성자를 사용하게 되면 매개변수의 개수와 가독성은 비례의 관계를 가지게 됩니다. 반면, 빌더 패턴을 활용하게 되면, 직관적으로 어떤 속성에 어떤 값이 할당되는지 파악하는 것이 쉬워집니다.

속성의 선택적 할당

생성자 패턴을 활용하게 된다면, 필요한 변수에 대해서만 설정할 수 있는 것이 더욱 쉬워집니다. 사실 Swift에서는 Optional을 활용해서 간편하게 할 수 있을 것이라고 생각할 수 있습니다. 하지만, nil을 할당하는 것을 기본값으로 생성하게 된다고 해도 위와 같은 문제가 해결되는 것은 아닙니다.

더 많은 장점들이 있을 것 같지만, 직접 사용하면서 느낀 장점들은 다음과 같습니다. 또한, 코드가 복잡해지고, 생성자를 사용하는 것보다 비용이 증가한다와 같은 단점들도 존재합니다.

Director로 감싸기

실제로 빌더 패턴을 활용하다 보면 자주 사용하거나 설정해야 하는 변수들이 많으면 다시 가독성이 하락하는 문제들도 발생하게 됩니다. 이런 문제를 해결하기 위해서 Director라는 타입을 통해서 Builder를 미리 생성하는 방법을 활용할 수 있습니다.

해당 Director를 활용하니까 좀 더 간편하게 기본적으로 생성되는 샌드위치들을 간편하게 활용할 수 있을 것 같습니다.

프로젝트 적용!

해당 디자인 패턴을 프로젝트에 적용하기 위해서 고민한 결과 많은 라이브러리들이 많이 활용하고 있다는 것을 확인했습니다. (Kingfisher, Moya 등)

실제 프로젝트에서는 URLRequest를 생성하는 타입에 대해서 해당 패턴을 활용하여서 개선하였습니다.

개선 전 프로젝트 내부에서 네트워크 요청을 하는 타입은 다음과 같이 생성되고 있었으며, 많은 타입들이 존재하였습니다. 또한, 상황에 따라서 다양한 설정을 추가하거나 제거하려고 하면 동일한 코드를 반복적으로 작성하게 되었습니다. 빌더 패턴을 활용하여서 이런 문제들을 제거하려고 하였습니다.

다음은 빌더 패턴을 통해서 공통적으로 활용할 수 있는 네트워크 요청 타입을 생성하는 방법을 구현한 것입니다. 이것을 통해서 존재하던 15개의 타입을 1개로 줄일 수 있었습니다. 또한, Director를 통해서 자주 사용하게 되는 API에 대해서 미리 생성할 수 있도록 해서 좀 더 사용성을 높였습니다.

결론

디자인 패턴 중 생성 패턴을 통해서 데이터를 생성하는 방법을 학습하고 프로젝트에 직접 적용하는 경험은 뿌듯한 경험을 한 것 같습니다. 빌더 패턴을 통해서 복잡한 생성자를 가독성을 좋게 만들고 생산성을 높일 수 있다는 것에 대해서 배웠습니다.

'CS > 객체지향' 카테고리의 다른 글

의존성이 뭐죠...? (Dependency, DI, DIP, IOC)  (0) 2023.09.07
OOP / SOLID 원칙  (0) 2023.09.07