발표자는 Rails 코드의 ‘마법’을 해독하기 위해 Ruby 객체 모델에 대한 심층적인 설명을 제공합니다.
Ruby 객체 모델의 기본
- 객체와 인스턴스 변수: 객체는 인스턴스 변수와 해당 클래스에 대한 링크만을 포함하며, 메서드는 클래스 내에 존재합니다.
- 메서드 검색(Method Lookup): 메서드가 호출되면 Ruby는 수신자(receiver) 객체에서 시작하여 한 단계 오른쪽(클래스)으로 이동한 후, 상위 클래스 체인을 따라 메서드를 찾습니다. 이때 수신자 객체는
self변수에 저장됩니다. - 모듈 포함(Include): 모듈이 클래스에 포함되면, 해당 모듈은 클래스의 상위 클래스 체인에 삽입되어 메서드 검색 경로에 추가됩니다.
instance_eval: 특정 객체를self로 설정하고 블록 내 코드를 실행하여 해당 객체의 컨텍스트에서 작업을 수행할 수 있는 ‘컨텍스트 프로브(Context Probe)’ 역할을 합니다.
클래스와 클래스 메서드
- 클래스도 객체이다: Ruby에서 클래스는 그 자체로
Class클래스의 인스턴스인 객체입니다. 따라서 클래스 메서드 호출도 일반 객체 메서드 호출과 동일한 메서드 검색 과정을 따릅니다. class_eval: 클래스를self로 설정하고 블록을 실행하여 클래스 정의 내부에서 코드를 실행하는 것과 유사한 효과를 냅니다.- 클래스 매크로(Class Macro):
attr_reader나 Rails의 유효성 검사 메서드처럼 클래스 정의 내에서 호출되는 클래스 메서드를 의미합니다.
특이 클래스(Eigenclass)와 extend* 싱글톤 메서드(Singleton Method): 특정 객체에만 정의되는 메서드로, 이는 객체마다 숨겨진 ‘특이 클래스(Eigenclass)’에 저장됩니다.
- 클래스 메서드의 정체: 클래스 메서드는 사실상 클래스 객체의 싱글톤 메서드이며, 해당 클래스의 특이 클래스에 정의됩니다.
extend의 마법:extend메서드는 모듈을 클래스의 특이 클래스에 포함시켜, 모듈 내의 인스턴스 메서드들을 해당 클래스의 클래스 메서드로 전환하는 역할을 합니다. 이는 Rails에서 모듈의 기능을 클래스 메서드로 제공하는 핵심 기법입니다.- 훅 메서드(Hook Method)와
included:included와 같은 훅 메서드는 모듈이 다른 클래스에 포함될 때 자동으로 호출되며, 이를 통해 동적으로 클래스에 추가적인 기능을 주입할 수 있습니다. Rails의ActiveSupport::Concern과 같은 패턴의 기반이 됩니다.