플러터에서는 PODO(Plain Old Dart Object)라고 부르는 다트 객체를 모델을 관리하기 위해 사용한다.
흔히 자바에서 DTO라고 부르는 객체와 동일한 역할을 하는 녀석이라고 보면 된다.
어쨌든 백엔드 서버와의 통신을 이러한 객체 단위로 주로 하게 될테고, 이 객체의 내용은 보통 DB 스키마에 맞추어 사용하게 된다. 그런데 몽고DB의 경우 _id라는 기본적인 필드가 존재한다. (물론 안쓸 수도 있지만 RDB의 Primary Key를 가진 필드와 비슷한 역할을 하는 중요한 필드이므로 안쓰는 경우는 드물다.)
여기서 문제는 하필 필드 이름이 _id 라는 것이다. id 라면 좋았을 것을...
다음과 같이 몽고에서 임시로 컬렉션을 만들고 도큐먼트를 생성해보았다.
조회해보면 _id 필드가 자동으로 생성된다. 이 필드는 인덱스가 기본적으로 붙어있어서 검색시에 빠른 성능을 제공한다.
이제 플러터에서 이에 대한 다트 객체를 만들어보겠다.
일반적으로 만드는 방식대로 다트 객체를 만들어보았다.
빨간줄이 보인다. 매우 거슬린다.
선택적 매개변수의 첫 글자에 _(언더바)가 들어갈 수 없다는 내용이다.
다트에서 지원하지 않으니 몽고DB의 모든 _id를 사용하지 않고 다른 것으로 바꾸고 인덱스를 씌워야 하나?
다행히 해결 방법이 존재한다.
JsonKey라는 어노테이션(Annotation)을 쓰면 된다.
(어노테이션이라는 것은 @기호를 앞에 사용하는 메타데이터라고 보면 된다.)
바로 적용해보도록 하겠다.
두 줄만 추가하면 된다.
json_annotation 를 import 시켜주고 JsonKey annotation을 적용해주기만 하면 된다.
@JsonKey(name: '_id')
이 코드가 핵심인데 실제 키 이름은 _id를 사용한다는 의미이다.
그리고나서 밑에서는 String id 로 선언하여 _id를 사용하지 않고도 _id를 사용하는 것처럼 쓸 수 있다.
보통 서버와 클라이언트의 주고 받는 필드는 일치시켜주는 것이 혼동을 줄이는 일인데,
특히 몽고DB의 경우는 거의 필수적으로 사용될 내용인 것 같다.
_id만 해당되는 것이 아니라 lowerCamelCase를 써야 하는 경우면 다 해당된다고 보면 된다.
그리고 코드 상단에 json_annotation을 import하였는데, 패키지를 찾을 수 없는 경우 json_annotation 패키지를 설치하면 된다. (https://pub.dev/packages/json_annotation)
나는 별도로 설치하지는 않았는데 Dart 버전에 따라 내장되어있는 것 같기도 하다.