데이터매퍼 어댑터 개발하기: DataMapper ORM과 백엔드 저장소 연결

[18S05] Writing custom DataMapper Adapters (en)

작성자
RubyKaigi
발행일
2025년 10월 05일

핵심 요약

  • 1 DataMapper 어댑터는 ORM과 다양한 백엔드 저장소(예: MongoDB)를 연결하며, 연결, 생성, 조회, 삭제, 업데이트의 5가지 핵심 기능을 구현해야 합니다.
  • 2 `attributes_as_fields` 메서드는 DataMapper의 속성 데이터를 저장소의 필드명과 데이터 타입에 맞게 마샬링하는 데 필수적이며, 쿼리 파싱은 `DataMapper::Query` 객체의 조건을 저장소의 네이티브 쿼리 언어로 변환하는 복잡한 과정입니다.
  • 3 연관 관계(associations)는 백엔드 독립성을 위해 DataMapper가 내부적으로 여러 쿼리로 분리 처리하며, 특정 저장소의 고유 기능을 활용하기 위해 모델 확장을 통한 커스터마이징이 가능합니다.

도입

이 프레젠테이션은 Ruby DataMapper ORM과 다양한 백엔드 데이터 저장소를 연결하는 어댑터 개발에 초점을 맞춥니다. 발표자는 DataMapper 어댑터에 대한 공식 문서 부족으로 인해 직접 소스 코드를 분석하고 시행착오를 겪으며 얻은 지식을 공유합니다. 본 내용은 DataMapper 사용법이나 특정 저장소의 기능보다는, DataMapper와 저장소 간의 연결 메커니즘을 Ruby 코드를 통해 구현하는 방법에 중점을 둡니다. MongoDB를 예시로 들지만, 설명하는 원칙들은 대부분의 백엔드 저장소에 적용 가능합니다.

DataMapper 어댑터 개발은 다음 다섯 가지 핵심 기능 구현을 요구합니다.

1. 연결 및 초기화

  • initialize 메서드에서 super 호출 후 데이터베이스에 연결합니다.
  • adapter 메서드를 통해 원시(raw) 드라이버 접근을 제공하는 것이 관례입니다.
  • field_naming_conventionresource_naming_convention을 정의하여 DataMapper 속성/클래스 이름을 저장소의 명명 규칙에 맞게 변환할 수 있습니다.

2. 레코드 생성 (Create)

  • create 메서드는 resources 배열을 처리합니다.
  • attributes_as_fields 메서드는 DataMapper의 비마샬링된 데이터를 저장소의 필드명과 데이터 타입에 맞게 마샬링하는 데 필수적입니다.
  • 생성 후에는 저장된 레코드 수를 반환해야 하며, 예외 없이는 DataMapper가 성공으로 간주합니다.

3. 레코드 조회 (Read)

  • read 메서드는 DataMapper::Query 인스턴스를 받아 비마샬링된 해시 배열을 반환합니다.
  • DataMapper::Query 객체를 저장소의 네이티브 쿼리 언어로 파싱하는 것이 핵심입니다. 쿼리는 OperationCondition으로 구성됩니다.
  • 연관 관계 처리: DataMapper는 백엔드 독립성을 위해 JOIN 대신 여러 개의 개별 쿼리를 실행합니다. condition.value가 비마샬링된 resources 배열로 제공될 경우, 이를 저장소가 이해할 수 있는 형태로 변환해야 합니다.

4. 레코드 삭제 (Delete)

  • destroy 메서드는 DataMapper::Collection 객체를 받으며, collection.query를 통해 DataMapper::Query 객체를 얻어 파싱 후 삭제를 수행합니다.

5. 레코드 업데이트 (Update)

  • update 메서드는 changes 해시를 받아 attributes_as_fields를 사용하여 마샬링한 후 업데이트를 수행합니다.

기타 중요 고려사항

  • 로깅: 어댑터가 저장소에 명령을 보낼 때마다 info 레벨로 로깅하여 사용자 디버깅을 돕는 것이 중요합니다.
  • 모델 확장 및 고유 기능 활용: DataMapper는 모델 확장을 통해 저장소의 고유 기능을 통합할 수 있습니다. 예를 들어, MongoDB의 BSON ID를 resource.key로 반환하려면, 모델에 property :_id를 추가하고 create 메서드에서 ID 처리 및 resource.key.clear_cache 호출을 통해 캐시를 갱신해야 합니다.

결론

DataMapper 어댑터 개발은 DataMapper ORM의 기능을 백엔드 저장소에 매핑하는 명확하고 체계적인 과정입니다. 핵심은 연결, 생성, 조회, 삭제, 업데이트의 다섯 가지 기본 CRUD 작업을 저장소의 특성에 맞게 구현하는 것이며, 특히 데이터 마샬링을 위한 `attributes_as_fields`와 복잡한 쿼리 객체를 파싱하는 기술이 중요합니다. 또한, 저장소의 고유한 기능을 DataMapper 모델에 통합하기 위한 확장 메커니즘을 이해하고 활용하는 것이 어댑터의 완성도를 높이는 데 기여합니다. 이 프레젠테이션은 어댑터 개발에 필요한 실질적인 지침을 제공하여 개발자들이 DataMapper의 유연성을 최대한 활용할 수 있도록 돕습니다.

댓글 0

댓글 작성

0/1000
정중하고 건설적인 댓글을 작성해 주세요.

아직 댓글이 없습니다

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