태그 : 후기
2007/09/10   액티브레코드 AssociationProxy 튜토리얼 [3]
액티브레코드 AssociationProxy 튜토리얼
* 세미나 발표자료: AssociationProxyTutorial.pdf
이글은 지난 토요일 제4회 루비KR세미나에서 내가 발표한 내용을 정리한 것이다. 간단히 후기를 몇 마디 덧붙이자면, 갈수록 루비사용자의 저변이 확대되는 듯 하여 루비 사용자의 한 사람으로서 기분이 좋았다는 점, 처음으로 세미나 장소 다운 곳에서 세미나를할 수 있어서 안락(?)했던 점, 그리고 언제나 느끼는 거지만  ikspres님과 deepblue님의 변함없는 루비 커뮤니티에의 헌신이 고마웠던 점이다. 특히 deepblue님의 강의는 가을처럼 재미있고 따뜻했다.

투명한 '뿌락찌'

액티브레코드 연관 클래스는 ActiveRecord::Associations::AssociationProxy 클래스의 확장이다. 이프록시 클래스는 일종의 "투명 프록시(transparent proxy)"로서 개발자들 몰래 숨어서 맡은 역할을 수행한다.그렇지만, 이 프록시의 존재여부를 아는 것과 모르는 것은 차이가 있다. 예를 들어, 우리가 만약 User 모델에서has_many :articles를 선언하게 되면, 이제 우리는 user.articles 와 같이 액세스할 수 있는데, 이 때반환되는 객체가 실제로는 프록시 객체다. 아래 그림은 이 프록시 클래스의 계층구조다. (요즘도 "뿌락찌"라는 말을 아는 사람들이있을까?)

프록시는 어떻게 생성되는가?

액티브 레코드의 소스코드를 보면 has_many, has_one, belongs_to, has_and_belongs_to_many와 같은 연관 메서드들이 정의되어 있는 것을 볼 수 있다. 그런데 이들 메서드의 내용을 유심히 보면, 메서드들마다 조금씩다르기는 하지만, 대체로 다음과 같은 로직이 들어 있다. 예를 들어, has_many의 경우를 보자.
def has_many(association_id, options = {}, &extension)
    reflection = create_has_many_reflection(association_id, options, &extension)
    // ...
    collection_accessor_methods(reflection, HasManyAssociation)
    // ...
end
설명을 덧붙이자면, 우선 주어진 association_id와 옵션정보를 사용하여 리플렉션(Reflection)을 생성한다.리플렉션은 액티브레코드의 클래스나 객체에 대한 메타데이터 정보들을 담는 객체라고 보면된다. 연관 모델인 경우AssociationReflection 객체가 생성될 것이다. 이어서 생성된 리플렉션 객체를 가지고HasManyAssociation 프록시 객체를 생성하고, 리플렉션 정보를 이용하여 각각의 연관관계에서 필요한 헬퍼 메서드들을생성하게 된다. 예를 들어, User 모델에서 has_many :articles 라고 선언 하였다면, 이 메서드에 의해 User모델에 articles(), articles=() 등의 메서드가 만들어지고, 이들 메서드가 호출될 때에 실제로는 아래 그림처럼연관 프록시 객체를 대상으로 작업이 일어나게 되는 것이다.


더 보기...
by thinkr | 2007/09/10 12:36 | 트랙백(1) | 핑백(2) | 덧글(3)
< 이전페이지 다음페이지 >