DataMapper 어댑터 개발은 다음 다섯 가지 핵심 기능 구현을 요구합니다.
1. 연결 및 초기화
initialize메서드에서super호출 후 데이터베이스에 연결합니다.adapter메서드를 통해 원시(raw) 드라이버 접근을 제공하는 것이 관례입니다.field_naming_convention및resource_naming_convention을 정의하여 DataMapper 속성/클래스 이름을 저장소의 명명 규칙에 맞게 변환할 수 있습니다.
2. 레코드 생성 (Create)
create메서드는resources배열을 처리합니다.attributes_as_fields메서드는 DataMapper의 비마샬링된 데이터를 저장소의 필드명과 데이터 타입에 맞게 마샬링하는 데 필수적입니다.- 생성 후에는 저장된 레코드 수를 반환해야 하며, 예외 없이는 DataMapper가 성공으로 간주합니다.
3. 레코드 조회 (Read)
read메서드는DataMapper::Query인스턴스를 받아 비마샬링된 해시 배열을 반환합니다.DataMapper::Query객체를 저장소의 네이티브 쿼리 언어로 파싱하는 것이 핵심입니다. 쿼리는Operation과Condition으로 구성됩니다.- 연관 관계 처리: 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호출을 통해 캐시를 갱신해야 합니다.