빌더 패턴(Builder Pattern)으로 불가능한 상태를 컴파일 타임에 방지

by DD
1개월 전
조회수 26

빌더 패턴(Builder Pattern)을 활용하여 유효하지 않은 객체 생성을 컴파일 타임에 방지하는 방법을 제시함

정적 타입 시스템(Static Typing System)이 런타임 검증(Runtime Validation)보다 효과적임을 다양한 언어 예시를 통해 설명

Java는 조합 폭발(Combinatorial Explosion) 문제로 인해 복잡도가 증가하지만, Kotlin, Rust, Gleam은 개선된 구현 방식을 제시

Rust의 경우, 빌더 패턴 없이도 불가능한 상태를 표현하지 않는 설계를 할 수 있다는 의견 제시

정적 타입 시스템(Static Typing System)의 중요성

게시글은 정적 타입 시스템(Static Typing System)이 컴파일 타임에 불가능한 상태를 방지하는 데 핵심적인 역할을 한다고 강조한다. Python과 같이 동적 타입 언어(Dynamic Typing Language)는 런타임에 오류를 발견해야 하지만, Java, Kotlin, Rust, Gleam과 같은 정적 타입 언어는 컴파일 시점에 오류를 감지하여 안전성을 확보한다. 이는 개발자가 런타임 에러(Runtime Error)를 겪을 가능성을 줄여 시스템의 안정성을 높이는 데 기여한다.

Java의 빌더 패턴(Builder Pattern) 단점

Java는 빌더 패턴을 구현하는 과정에서 조합 폭발(Combinatorial Explosion) 문제를 겪는다고 지적한다. 새로운 상태와 전이를 추가할 때마다 클래스와 메서드의 수가 기하급수적으로 증가하여 코드의 복잡성이 증가한다. 예를 들어, 토마토 베이스(Tomato Base)에 파인애플 토핑(Pineapple Topping)을 추가하는 경우, 새로운 클래스를 생성해야 하는 문제가 발생한다. 이는 Java의 빌더 패턴 구현이 확장성 측면에서 취약함을 보여준다.

Kotlin, Rust, Gleam의 개선된 빌더 패턴(Builder Pattern)

Kotlin, Rust, Gleam은 Java의 단점을 보완하여 빌더 패턴을 개선한다. Kotlin은 확장 함수(Extension Function)제네릭(Generic)을 활용하여 코드 중복을 줄이고, Rust는 Phantom Type을 통해 컴파일 타임에 타입 안전성을 확보한다. Gleam은 불투명 타입(Opaque Type)함수 매개변수 제약(Constrained Parameter Types)을 사용하여 유연성을 높인다. 이러한 언어들은 새로운 상태 추가 시 코드 변경량을 최소화하여 유지보수성을 향상시킨다.

Rust의 불가능한 상태 표현(Unrepresentable State) 설계

댓글에서는 Rust가 빌더 패턴 없이도 불가능한 상태를 표현할 수 있는 더 나은 방법을 제시한다. EnumHashSet을 사용하여 유효하지 않은 피자 조합을 컴파일 타임에 방지하는 것이다. 예를 들어, 크림 베이스(Cream Base)에 파인애플 토핑(Pineapple Topping)을 추가하는 것을 원천적으로 불가능하게 설계할 수 있다. 이는 Rust의 강력한 타입 시스템과 불변성(Immutability)을 활용한 설계의 장점을 보여준다.

Making illegal state unrepresentable