Steep의 타입 가드: 유형 좁히기와 사용자 정의 타입 가드

[JA] Introducing Type Guard to Steep / Takeshi KOMIYA @tk0miya

작성자
RubyKaigi
발행일
2025년 05월 27일

핵심 요약

  • 1 Steep 1.10에 TYPE for Union Types가 병합되어 `ActiveSupport`의 `present?`와 같은 메서드 호출을 타입 가드로 활용하여 유형 좁히기가 가능해졌습니다.
  • 2 사용자 정의 타입 가드(User-Defined Type Guards)는 RBS 어노테이션을 통해 개발자가 직접 메서드를 타입 가드로 지정하여 유형을 좁힐 수 있도록 하는 기능으로 현재 개발 중입니다.
  • 3 타입 가드는 코드의 안정성을 높이고 더 정확한 타입 체크를 가능하게 하여 개발 생산성 향상에 기여하며, 조건부 타입 표현 등 고급 활용 사례도 제시되었습니다.

도입

본 발표는 루비 개발자 코미야가 루비 타입 시스템의 핵심 요소인 타입 좁히기(Type Narrowing)와 타입 가드(Type Guard)의 개념을 소개하고, 이를 Steep에서 더욱 효과적으로 활용하기 위한 두 가지 주요 개선 제안을 다룹니다. 발표자는 루비 1.4.21부터 루비를 사용하고 RBS 생태계에 기여해 온 베테랑 개발자로서, VS Code 확장 기능을 통한 실시간 타입 체크 데모를 통해 타입 시스템의 실용적 가치를 보여주며 논의의 중요성을 강조합니다.

타입 좁히기(Type Narrowing)와 타입 가드(Type Guard)

타입 좁히기는 변수의 타입을 보다 특정적인 것으로 한정하는 처리이며, 타입 가드는 이러한 타입 좁히기에 사용되는 식을 의미합니다. Steep는 if/else, 삼항 연산자, 논리 연산자 등을 활용한 타입 좁히기와 is_a?, instance_of?와 같은 내장 메서드를 타입 가드로 지원하여 정확한 타입 체크를 수행합니다.

TYPE for Union Types

ActiveSupportpresent?와 같이 객체의 존재 여부를 확인하는 메서드는 실행 시점에 유형을 좁히는 역할을 하지만, 기존 Steep에서는 이를 타입 가드로 인식하지 못했습니다. 이에 발표자는 특정 조건을 만족하는 메서드 호출을 타입 가드로 간주하는 ‘TYPE for Union Types’를 제안했습니다. 이 제안은 메서드 호출, 리시버가 변수 또는 순수 메서드 호출, 리시버 타입이 유니온 타입이라는 세 가지 조건을 만족할 경우, 메서드의 반환 값(truthy/falsy)에 따라 리시버의 타입을 좁히도록 합니다. 이 기능은 Steep 1.10에 병합되어 현재 사용 가능합니다.

사용자 정의 타입 가드(User-Defined Type Guards)

애플리케이션에서는 user.admin?과 같이 사용자 정의 메서드를 통해 클래스나 상태를 판단하는 경우가 많습니다. 그러나 Steep는 이러한 사용자 정의 질의 메서드를 타입 가드로 인식하지 못했습니다. 이를 해결하기 위해 발표자는 RBS 타입 정의에 #A(guard: <predicate>) 형태의 어노테이션을 추가하여 개발자가 직접 메서드를 타입 가드로 지정할 수 있는 ‘사용자 정의 타입 가드’를 제안했습니다. <predicate>self is AdminUser와 같이 주어(subject), 동사(verb), 타입(type)으로 구성된 규칙을 정의하며, 현재 self is Type 형태만 지원하는 개발 초기 단계에 있습니다.

제약 및 고급 활용

사용자 정의 타입 가드는 타입을 좁히는(sub-type으로 변경) 것만 가능하며, 타입을 넓히는(super-type으로 변경) 것은 허용되지 않습니다. 또한, else 블록에 대한 타입 계산은 아직 완벽하지 않아 실패할 수 있습니다. 하지만 이 기능은 가상 모듈과 결합하여 Article & Published와 같은 조건부 타입(Conditional Types)을 표현하는 데 활용될 수 있습니다. 이는 ActiveRecorddelegated_type이나 유효성 검사 후 특정 속성이 필수화되는 시나리오 등에서 유용하게 적용될 수 있으며, 향후 RBS Rails와 같은 타입 제너레이터에 통합되어 자동화될 잠재력을 가집니다.

결론

본 발표는 Steep를 활용한 타입 체크의 중요성을 재확인하고, 코드의 안전성과 개발 편의성을 높이기 위한 두 가지 타입 가드 개선 방안을 제시했습니다. TYPE for Union Types는 이미 Steep 1.10에 포함되어 활발히 사용되고 있으며, 사용자 정의 타입 가드는 현재 개발 중이지만 조건부 타입을 표현하는 등 흥미로운 고급 활용 가능성을 보여주고 있습니다. 이러한 타입 시스템의 발전은 루비 개발자들이 더욱 견고하고 즐거운 코딩 라이프를 영위하는 데 기여할 것입니다.

댓글 0

댓글 작성

0/1000
정중하고 건설적인 댓글을 작성해 주세요.

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!