Ruby의 본질: 동적 타입과 덕 타이핑
Ruby는 메시지 전달 기반의 동적 타입 객체 지향 언어로, 객체의 타입보다 행위에 중점을 두는 ‘덕 타이핑(duck typing)’ 철학을 따릅니다. 이는 Ruby의 유연성과 표현력을 극대화하며, 객체 간의 협력을 통한 디자인을 강조합니다.
정적 타입 도입 시도와 한계
RBS, dry-types, Sorbet 등 Ruby에 정적 타입을 도입하려는 여러 시도가 있었으나, 런타임 성능 저하, 코드 복잡성 증가, 낮은 채택률 등의 문제로 인해 Ruby의 동적 특성과 충돌하며 성공적이지 못했습니다. 이는 Ruby가 정적 타이핑을 위해 설계되지 않았음을 시사합니다.
정적 타입 도입이 Ruby에 부적합한 이유
-
성능 저하: Sorbet 같은 시스템은 런타임 타입 검사로 프로덕션 성능을 저하시킵니다.
-
코드 오염:
sig { params(...) }주석은 코드 가독성을 해치고 불필요한 복잡성을 추가합니다. -
유지보수성 악화: 타입 주석은 리팩토링 시 광범위한 수정이 필요해 유지보수 비용을 증가시킵니다.
-
디자인 문제 은폐: 타입에 대한 집착은 근본적인 코드 디자인 문제를 간과하게 만들 수 있습니다.
Ruby다운 코드 품질 확보 방안
정적 타입 대신 Ruby의 강점을 활용해야 합니다.
-
덕 타이핑: 유연하고 강력한 객체 지향 디자인을 유지합니다.
-
YARD: 타입 힌트를 포함한 코드 문서화로 개발자 도구를 지원합니다.
-
테스트: RSpec/Minitest는 오류를 포착하고 안전한 리팩토링을 가능하게 하는 가장 효과적인 안전망입니다.
-
린터: RuboCop은 런타임 오버헤드 없이 코드 스타일과 일반적인 오류를 검사합니다.