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하는 데 유용합니다.
-
로직 단순화: 테스트 코드 내의 복잡한 로직을 단순화하고 가독성을 높입니다.
라이브 코딩 시연
-
JSON 전략: Factory Bot 문서에 소개된 JSON 전략을 구현하여 팩토리에서 생성된 객체를 JSON 형식으로 반환하는 방법을 시연했습니다.
-
no_turbo_broadcast_create전략: Turbo Rails 애플리케이션에서 객체 생성 시 Turbo Broadcast를 비활성화하는 커스텀 전략을 구현했습니다.FactoryBot.strategy_by_name(:create)를 확장하고object.class.suppress_broadcasts블록 내에서 객체 생성을 처리하여, 특정 테스트에서 불필요한 브로드캐스팅을 방지하는 유용성을 보여주었습니다. -
insert전략:ActiveRecord::Base.insert메서드를 사용하여 데이터베이스에 직접 데이터를 삽입하는 전략을 시도했습니다. 이는 대량의 테스트 데이터를 빠르게 생성할 때 유용할 수 있지만,password_digest와 같은 가상 속성이나 연관 관계 처리에서 한계에 부딪혔습니다. 이 시연은 커스텀 전략 구현 시 고려해야 할 복잡성과 잠재적 개선점을 시사했습니다.