프렌들리 속성 패턴(Friendly Attributes Pattern)

Friendly Attributes Pattern in Ruby

작성자
HackerNews
발행일
2025년 10월 30일

핵심 요약

  • 1 프렌들리 속성 패턴은 반복적인 속성 입력 코드를 간결하고 가독성 높게 변환하여 Ruby 개발 효율성을 향상시키는 접근 방식입니다.
  • 2 이 패턴은 숫자, 심볼, ActiveSupport::Duration 객체 등 다양한 입력 유형을 표준 키-값 속성으로 자동 변환하며, 객체 트리를 활용해 중첩된 구조도 처리합니다.
  • 3 주로 개발자가 직접 속성을 입력하는 시나리오(예: 테스트, 초기 설정)에 최적화되어 코드 작성의 즐거움과 유연성을 제공합니다.

도입

RailsBilling 개발 과정에서 반복적인 구독 플랜 생성 코드가 비대하고 가독성이 떨어진다는 문제에 직면했습니다. `find_or_create_by!` 호출을 여러 번 반복하는 방식은 개발자의 피로도를 높이고 코드의 미려함을 저해했습니다. 이러한 문제점을 해결하기 위해 저자는 "프렌들리 속성 패턴(Friendly Attributes Pattern)"을 고안하여 속성 입력 방식을 혁신하고 개발 경험을 개선하고자 했습니다. 이 패턴은 간결하고 직관적인 구문을 통해 속성 정의를 단순화하는 것을 목표로 합니다.

문제점 및 “새로운 방식” 소개

기존에는 Billing::Plan::Factory.find_or_create_by!를 사용하여 각 플랜(standard, pro, enterprise)과 기간(monthly, yearly)별로 개별적으로 속성을 정의했습니다. 이는 코드가 비대하고 반복적이며, 노트북 화면의 절반 이상을 차지하는 등 개발 효율성을 저해하는 요인이었습니다.

이러한 문제점을 해결하기 위해 “프렌들리 속성 패턴”은 다음과 같은 간결한 구문을 제안합니다. ruby Billing::Plan.find_or_create_all_by_attrs!( 1.month => {standard: 10, pro: 50, enterprise: 100}, 1.year => {standard: 100, pro: 500, enterprise: 1000} ) 이 방식은 :name, :interval, :amount와 같은 중복되는 속성 키를 제거하여 코드의 양을 대폭 줄이고 가독성을 높였습니다. 이는 표준 가격 페이지의 구조(기간 토글, 플랜-가격 컬럼)를 직관적으로 모델링합니다.

구현 원리 및 유연성

프렌들리 속성 패턴의 핵심은 다양한 입력 구조(배열, 해시, 단일 값)를 표준 키-값 속성으로 변환하는 FriendlyAttrs.new(attrs).resolve 인터페이스입니다.

  • 변환(Conversion): 입력된 값의 유형(Types)을 기반으로 속성을 추론합니다.
    • 정수(Integers)는 amount로 변환됩니다 (예: 50 -> {amount: 50}).
    • 심볼(Symbols) 또는 문자열(Strings)은 plan names로 변환됩니다 (예: :pro -> {name: :pro}).
    • ActiveSupport::Duration 객체는 interval로 변환됩니다 (예: 1.month -> {interval: 1.month}).
  • 값 조회(Value lookup): 특정 문자열이나 심볼을 추가로 파싱하여 currency와 같은 특정 속성으로 매핑할 수 있습니다.

  • 혼합(Mixing): 프렌들리 속성과 표준 속성을 함께 사용할 수 있습니다 (예: [1.month, {name: :pro, amount: 50}]).

  • 상위 집합(Superset): 표준 속성 해시도 유효한 입력으로 간주되어 기존 코드와의 호환성을 유지합니다.

  • 객체 트리(Object tree): 중복을 줄이기 위해 중첩된 해시 구조를 활용하여 속성 집합을 정의합니다. 예를 들어, {1.month => {standard: 10, pro: 50, enterprise: 100}}는 내부적으로 여러 개의 속성 배열로 분해됩니다.

이 패턴은 billing_plans(1.month => [:standard, :pro, :enterprise])와 같은 테스트 헬퍼나 Billing::Plan.find_sole_by_attrs(:pro, 1.month)와 같은 단일 플랜 조회 등 다양한 사용 사례에서 간결함을 제공합니다. 입력 순서의 유연성도 특징입니다.

제한 사항 및 기타 사용 사례

이 패턴은 주로 개발자가 수동으로 속성을 입력하는 시나리오에 적합하며, JSON이나 YAML과 같은 데이터 저장 또는 API 통신에는 권장되지 않습니다. IoT 스마트 도어 잠금 시스템과 같은 다른 도메인에도 적용될 수 있는 잠재력을 가지고 있지만, 모든 애플리케이션이나 모델에 강제로 적용할 필요는 없습니다.

결론

프렌들리 속성 패턴은 몇 시간의 구현 노력으로 코드의 가독성을 높이고 개발 과정을 즐겁게 만들 수 있는 효과적인 해결책을 제시합니다. 이 아이디어는 RailsBilling gem에서 추출되었으며, Ruby의 정신인 '인간을 위한, 인간이 작성하는 즐거운 코드'를 구현합니다. 이 패턴은 개발자가 반복적인 작업을 줄이고 보다 직관적인 방식으로 코드를 작성할 수 있도록 돕는 유연하고 강력한 도구이며, 유사한 문제에 직면했을 때 유용한 지침과 아이디어를 제공할 것입니다. 궁극적으로 이 패턴은 개발자의 생산성과 코드 품질 향상에 기여합니다.

댓글 0

로그인이 필요합니다

댓글을 작성하거나 대화에 참여하려면 로그인이 필요합니다.

로그인 하러 가기

아직 댓글이 없습니다

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