Factory Bot 내부 구조 및 커스텀 전략 활용 가이드

Live coding on factory_bot | thoughtbot Open Summit 2025

작성자
thoughtbot Youtube
발행일
2025년 11월 27일

핵심 요약

  • 1 Factory Bot의 내부 구조와 핵심 클래스(FactoryRunner, Factory, Evaluator, AttributeAssigner)를 이해하여 젬의 동작 방식을 파악합니다.
  • 2 Factory Bot의 네 가지 내장 전략(build, create, attributes_for, build_stubbed)의 차이점과 테스트 성능 향상을 위한 build 전략의 중요성을 설명합니다.
  • 3 사용자 정의 전략(Custom Strategies) 생성 방법을 통해 Factory Bot의 기능을 확장하고, Turbo Broadcast 비활성화 및 ActiveRecord insert와 같은 고급 활용 사례를 제시합니다.

도입

본 세션은 Ruby 개발자들을 위한 Factory Bot 젬의 심층 분석을 다룹니다. Factory Bot은 테스트 데이터 생성을 위한 필수적인 도구로, 본 발표에서는 젬의 내부 구조와 작동 원리를 탐구하고, 내장된 다양한 전략들과 함께 사용자 정의 전략을 생성하여 특정 요구사항에 맞춰 기능을 확장하는 방법을 소개합니다. Thoughtbot의 Neil Kavalo와 Jose Blanco가 발표자로 참여하여 이론 설명과 함께 실시간 코딩 시연을 통해 실제 적용 방안을 제시합니다.

Factory Bot 내부 구조 및 핵심 클래스

Factory Bot은 factorybot.rb 파일을 통해 라이브러리의 진입점을 제공하며, 팩토리, 전략, 트레이트, 설정 시스템을 위한 모든 필수 요소를 로드합니다. 핵심 기능은 내부 모듈에 위임되며 기본 전략이 자동으로 등록됩니다. 젬의 core 디렉토리에는 다양한 전략들이 위치하며, 다음 네 가지 주요 클래스가 팩토리 실행 과정을 조율합니다.

  • FactoryRunner: 팩토리 실행 요청을 처리하는 역할을 합니다. 팩토리 실행에 필요한 모든 정보를 패키징하고, 팩토리를 찾아 컴파일 및 실행하는 과정을 조율합니다.

  • Factory: 객체 생성 및 유지 방법을 정의하고 준비하는 청사진이자 컴파일러입니다. 이 클래스는 Evaluator와 AttributeAssigner를 생성합니다.

  • Evaluator: 세션 컨텍스트를 제공하고 팩토리 속성 계산을 관리합니다. Factory Bot이 조립하는 객체 간의 연관 관계 관리도 담당합니다.

  • AttributeAssigner: 객체를 구축하고 속성을 할당하는 역할을 수행합니다.

내장 전략(Built-in Strategies)

Factory Bot은 주로 사용되는 네 가지 내장 전략을 제공하며, 내부적으로는 null 전략을 포함하여 총 다섯 가지 전략이 존재합니다.

  • build: 객체를 인스턴스화하지만 데이터베이스에 저장하지 않습니다.

  • create: 객체를 인스턴스화하고 데이터베이스에 저장합니다.

  • attributes_for: 속성 해시를 반환합니다.

  • build_stubbed: create의 경량 버전으로, 객체를 저장하지 않지만 연관 관계 등에 접근할 수 있습니다. 테스트 속도 향상을 위해 create 대신 build를 우선적으로 사용하는 것이 권장됩니다.

커스텀 전략(Custom Strategies) 및 활용

Factory Bot은 사용자 정의 전략을 통해 기능을 확장할 수 있습니다. 새로운 커스텀 전략을 등록하면 자동으로 [전략명], [전략명]_list, [전략명]_pair와 같은 메서드가 생성되어 편리하게 사용할 수 있습니다.

커스텀 전략 작성 시기 및 이점

  • JSON 페이로드 표현: 테스트 전반에 흩어져 있는 JSON 해시를 커스텀 전략으로 캡슐화하여 반복을 줄일 수 있습니다.

  • 복잡한 객체 Mocking: 특정 방식으로 복잡한 객체를 Mocking하는 데 유용합니다.

  • 로직 단순화: 테스트 코드 내의 복잡한 로직을 단순화하고 가독성을 높입니다.

라이브 코딩 시연

  1. JSON 전략: Factory Bot 문서에 소개된 JSON 전략을 구현하여 팩토리에서 생성된 객체를 JSON 형식으로 반환하는 방법을 시연했습니다.

  2. no_turbo_broadcast_create 전략: Turbo Rails 애플리케이션에서 객체 생성 시 Turbo Broadcast를 비활성화하는 커스텀 전략을 구현했습니다. FactoryBot.strategy_by_name(:create)를 확장하고 object.class.suppress_broadcasts 블록 내에서 객체 생성을 처리하여, 특정 테스트에서 불필요한 브로드캐스팅을 방지하는 유용성을 보여주었습니다.

  3. insert 전략: ActiveRecord::Base.insert 메서드를 사용하여 데이터베이스에 직접 데이터를 삽입하는 전략을 시도했습니다. 이는 대량의 테스트 데이터를 빠르게 생성할 때 유용할 수 있지만, password_digest와 같은 가상 속성이나 연관 관계 처리에서 한계에 부딪혔습니다. 이 시연은 커스텀 전략 구현 시 고려해야 할 복잡성과 잠재적 개선점을 시사했습니다.

결론

본 세션을 통해 Factory Bot의 깊이 있는 이해와 커스텀 전략의 강력한 활용 가능성을 확인했습니다. 젬의 내부 구조를 파악하고 내장 전략의 차이점을 아는 것은 효율적인 테스트 코드 작성에 필수적입니다. 특히 커스텀 전략은 Turbo Broadcast 비활성화나 대량 데이터 삽입과 같이 특정 애플리케이션의 요구사항에 맞춰 Factory Bot을 유연하게 확장할 수 있는 길을 열어줍니다. 비록 `insert` 전략 시연에서 일부 한계에 부딪혔지만, 이는 새로운 아이디어와 개선의 여지를 보여주며, Factory Bot 커뮤니티에 기여할 수 있는 기회를 제공합니다.

댓글 0

로그인이 필요합니다

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

로그인 하러 가기

아직 댓글이 없습니다

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