Docs Menu
Docs Home
/ /
Atlas App Services
/ /

이벤트 라이브러리

이 페이지의 내용

  • 개요
  • 사용 사례
  • 작동 방법
  • 이벤트 라이브러리 데이터 액세스
  • 이벤트 라이브러리 스키마
  • 이벤트 유형
  • 이벤트 읽기
  • 이벤트 쓰기
  • 사용자 지정 이벤트

개발자는 이벤트 라이브러리를 통해 Device Sync 지원 모바일 애플리케이션을 사용하는 동안 사용자가 보고 편집하는 데이터를 추적할 수 있습니다. 이벤트 라이브러리는 세 가지 유형의 이벤트를 기록할 수 있습니다.

  • 이벤트 읽기

  • 이벤트 쓰기

  • 사용자 지정 이벤트

개발자는 기록할 읽기 및 쓰기 트랜잭션(write transaction)을 지정할 수 있습니다. 또한 사용자 지정 이벤트를 구성하여 버튼 누름이나 사용자가 프론트엔드 애플리케이션에서 보고 있는 내용 등을 기록할 수 있습니다.

이러한 수준의 세부 정보를 통해 감사자 또는 기타 이해 당사자는 언제 무슨 일이 발생했는지 정확하게 평가할 수 있습니다.

중요

파티션 기반 동기화 필요

이벤트 라이브러리는 Flexible Sync를 사용한 AuditEvents 기록을 지원하지 않습니다. 이 기능을 사용하려면 AuditEvent 데이터를 기록하려면 파티션 기반 동기화 App Services 앱이 필요합니다.

이벤트 라이브러리는 의료 또는 금융 서비스와 같이 규제가 심한 산업의 컴플라이언스 요구 사항을 충족하기 위해 감사를 수행할 수 있는 기능을 제공합니다.

예시

의료 시설의 간호사가 이벤트 라이브러리가 활성화된 앱을 사용하고 있습니다. 이 앱은 실시간 바이탈 사인, 의료 기기에서 스트리밍된 정보, 환자의 과거 치료 정보를 간호사에게 제공합니다. 이 앱은 보고 있는 데이터를 기반으로 간호사가 취해서는 안 되는 조치를 코드가 차단하기 때문에 본질적으로 규정 준수를 시행합니다. 이벤트 라이브러리는 간호사가 앱 인터페이스 내에서 볼 수 있는 모든 정보와 해당 정보를 본 후 취하는 조치를 캡처합니다.

어느 시점에서, 이 간호사는 환자에게 치료를 제공하여 나중에 해당 시설을 의료과오 소송에 노출시킵니다. 법률 부서는 치료 기간 동안 간호사가 사용할 수 있었던 정보를 검토해야 합니다.

이벤트 라이브러리는 간호사가 치료 중에 본 디지털 데이터와 그가 수행한 조치를 캡처합니다. 법무 팀 은 이 데이터를 검토하여 처리가 합리적인지 여부를 평가할 수 있습니다. 이 정보가 없으면 법률 부서는 간호사의 행동이 합리적인지 여부를 알 수 없고 증명할 수 없습니다.

이벤트 라이브러리는 사용자의 기기에서 별도의 '이벤트' 영역을 엽니다. 이 Realm은 개발자가 이벤트 라이브러리를 사용하여 모니터링하기로 선택한 모든 사용자 Realm에 액세스할 수 있습니다.

개발자가 이벤트 라이브러리를 구현할 때 기록하려는 이벤트 유형과 이벤트 기록에 추가하려는 사용자 지정 메타데이터를 지정합니다. 클라이언트 애플리케이션이 실행되면 지정된 사용자 상호 작용이 '이벤트' 영역에 읽기 이벤트, 쓰기 이벤트 또는 사용자 지정 이벤트로 기록됩니다.

클라이언트 기기가 네트워크에 연결되어 있는 동안 Atlas Device Sync 는 이 이벤트 영역 데이터를 연결된 Atlas 데이터 소스 의 AuditEvent 컬렉션 과 동기화합니다.

다음도 참조하세요.

클라이언트 애플리케이션 에서 이벤트 라이브러리를 구현 하는 방법에 대한 자세한 내용은 이벤트 라이브러리 - Swift SDK 를 참조하세요.

이벤트 라이브러리는 연결된 Atlas 데이터베이스의 AuditEvent 컬렉션에 이벤트 데이터를 기록합니다. 이벤트 라이브러리를 구성할 때 개발 모드 를 사용하여 이 컬렉션을 자동으로 생성하고 동기화된 이벤트에서 스키마를 파생합니다. 애플리케이션을 프로덕션 환경으로 전환하기 전에 개발 모드를 꺼야 합니다.

AuditEvent 컬렉션에는 다음 필드를 포함하는 스키마가 있어야 합니다.

필드 이름
유형
필수 사항
_id
ObjectId
필수 사항
activity
문자열
필수 사항
_partition
문자열
필수 사항
timestamp
날짜
필수 사항
event
문자열
옵션
data
문자열
옵션

또한 스키마에는 사용하는 각 메타데이터 키에 대한 선택적 string 필드가 포함되어야 합니다. 예를 들면 다음과 같습니다.

{
"<Metadata Key>": {
"bsonType": "string"
}
}

다음도 참조하세요.

컬렉션에 스키마를 추가하는 방법에 대한 자세한 내용은 스키마 정의 및 적용을 참조하세요.

예시

사용자 지정 메타데이터를 사용하지 않는 경우 스키마는 다음과 같을 수 있습니다.

AuditEvent 컬렉션 스키마
{
"title": "AuditEvent",
"bsonType": "object",
"required": [
"_id",
"_partition",
"timestamp",
"activity"
],
"properties": {
"_id": {
"bsonType": "objectId"
},
"_partition": {
"bsonType": "string"
},
"timestamp": {
"bsonType": "date"
},
"activity": {
"bsonType": "string"
},
"event": {
"bsonType": "string"
},
"data": {
"bsonType": "string"
}
}
}

이벤트 라이브러리는 세 가지 유형의 이벤트를 기록합니다.

  • 이벤트 읽기

  • 이벤트 쓰기

  • 사용자 지정 이벤트

이벤트 라이브러리는 쿼리 결과로 반환된 데이터를 읽기 이벤트로 기록합니다. 읽기 이벤트는 링크를 팔로우하거나 기본 키로 객체를 조회할 때와 같이 Realm 객체가 인스턴스화될 때마다 기록합니다.

이벤트 라이브러리 레코드는 읽기 이벤트를 두 개의 필드가 있는 JSON 객체로 읽습니다.

  • type: 클래스 이름을 저장합니다.

  • value: 직렬화된 객체의 배열을 저장합니다.

다음과 같이 이벤트 저장소 값을 읽습니다.

  • 단일 객체 읽기 이벤트: 값이 단일 요소를 가진 배열입니다.

  • 쿼리와 일치하는 객체: 객체가 사용되지 않는 경우에도 값은 쿼리와 일치하는 모든 객체의 배열입니다.

  • 쓰기 트랜잭션(write transaction) 중에 발생하는 읽기: 값은 쓰기 트랜잭션(write transaction)이 시작되기 전에 객체에 있던 데이터입니다. 쓰기 이벤트 중에 발생하는 변경 사항은 반영하지 않습니다.

  • 쓰기 트랜잭션(write transaction)이 시작될 때 존재하지 않는 객체: 쓰기 트랜잭션(write transaction)에서 생성된 객체는 읽기 이벤트를 전혀 생성하지 않습니다.

중요

이벤트 라이브러리는 클라이언트 애플리케이션에 쿼리의 하위 집합만 표시되는지 여부를 알 수 없습니다. 예를 들어 클라이언트 애플리케이션에 목록 보기가 있다고 가정해 보겠습니다. 이벤트 라이브러리의 읽기 이벤트는 스크롤링 정보를 기록하지 않습니다. 읽기 이벤트를 전체 쿼리 결과로 기록합니다. 개발자는 사용자 지정 이벤트를 사용하여 클라이언트 애플리케이션이 쿼리 결과의 하위 집합만 표시하는 경우를 기록해야 합니다.

모든 읽기 이벤트의 스트림은 동일한 객체에서 정보를 추가하지 않는 많은 "중복" 이벤트를 생성할 수 있습니다. 이러한 "중복" 이벤트를 줄이기 위해 이벤트 라이브러리는 일부 이벤트를 삭제하고 병합합니다.

이벤트 라이브러리는 다음 항목을 삭제합니다.

  • 일치하는 객체가 없는 쿼리

  • 새로 생성된 객체만 일치하는 쿼리

  • 객체는 이전 쿼리와 일치하는 객체를 읽습니다.

이벤트 라이브러리가 병합됩니다.

  • 동일한 테이블에 대한 여러 쿼리를 단일 쿼리로 병합합니다.

읽기 이벤트 객체 의 형식은 다음과 같습니다.

{
"_id": "62b396f4ebe94d2b871889bb",
"_partition":"events-62b396f4ebe94d2b871889ba",
"activity":"read object",
"data": "{
"type":"Person",
"value": [{
"_id": "62b396f4ebe94d2b871889b9",
"_partition":"",
"employeeId":1,
"name":"Anthony"
}]
}",
"event":"read",
"timestamp": 2022-06-23T14:54:37.756+00:00
}

이벤트 라이브러리는 상위 객체에 포함된 객체의 기본 키에 대한 링크를 생성하여 포함된 객체를 나타냅니다. 사용자가 링크를 따라가지 않는 경우 기본 키는 포함된 객체를 유일한 표현입니다. 사용자가 링크를 따라가면 포함된 객체가 상위 객체 내에서 확인됩니다.

이렇게 하면 포함된 객체에 대한 최상위 객체 읽기도 생성됩니다.

예시

Person 객체 에는 사람이 일하는 위치 에 대한 세부 정보를 포함하는 내장된 객체 Office 가 내장되어 있습니다. office 세부 정보를 볼 수 있는 링크를 따라가지 않으면 상위 Person 객체 에는 포함된 객체의 객체 ID 만 표시됩니다.

사무실용 언팔로우드 링크가 있는 상위 객체의 데이터 페이로드
{
"type": "Person",
"value": [{
"_id": "62b47624265ff7b58e9b204e",
"_partition": "",
"employeeId": 1,
"name": "Michael Scott",
"office": "62b47624265ff7b58e9b204f"
}]
}

포함된 Office 객체의 세부 정보를 볼 수 있는 링크를 따라가면 상위 객체 내에 포함된 객체가 확인됩니다. 또한 하위 객체(이 경우에는 Office 객체)에 대한 두 번째 최상위 읽기를 생성합니다.

두 객체의 데이터 페이로드(팔로우된 링크가 있는 사무실용)
{
"type":"Person",
"value": [{
"_id": "62b47975a33224558bdf8b4d",
"_partition": "",
"employeeId": 1,
"name": "Michael Scott",
"office": {
"_id": "62b47975a33224558bdf8b4e",
"_partition": "",
"city": "Scranton",
"locationNumber": 123,
"name": "Dunder Mifflin"
}
}]
}
{
"type": "Office",
"value": [{
"_id": "62b47975a33224558bdf8b4e",
"_partition": "",
"city": "Scranton",
"locationNumber": 123,
"name": "Dunder Mifflin"
}]
}

참고

읽기 이벤트 결합

읽기 이벤트 결합은 객체를 쿼리한 다음 나중에 포함된 객체 링크를 따라갈 때 표시되는 객체에 영향을 줄 수 있습니다.

위의 예에서 이전에 Person를 쿼리한 경우 사무실 객체가 사람 객체 내에서 확인되지 않은 읽기 이벤트가 생성됩니다. 초기 읽기 이벤트에서는 ObjectId 만 볼 수 있습니다. 그런 다음 나중에 포함된 객체를 확인하는 링크를 따라가면 포함된 객체에 대한 별도의 최상위 읽기를 볼 수 있지만 상위 객체 내에 확인된 포함된 객체를 표시하는 상위 객체는 읽을 수 없습니다 .

이벤트 라이브러리는 다음과 같은 경우 쓰기 이벤트를 기록합니다.

  • 새 객체가 생성됩니다.

  • 기존 객체가 수정됩니다.

  • 객체가 삭제됩니다.

쓰기 이벤트는 객체의 이전 상태와 이후 상태를 모두 기록합니다. 생성된 새 객체의 경우 이전 상태는 null 입니다. 삭제의 경우 객체의 이후 상태는 null 입니다.

이벤트 기록 범위 중에 클라이언트가 커밋하는 각 쓰기 트랜잭션(write transaction)에 대해 이벤트 라이브러리는 단일 쓰기 이벤트를 기록합니다. 이 쓰기 이벤트는 쓰기 트랜잭션(write transaction) 중에 변경된 모든 내용을 기록합니다.

페이로드는 클래스 이름에 키가 지정된 객체 입니다. 객체가 생성, 수정 또는 삭제된 각 객체 유형에는 항목이 있습니다.

이벤트 라이브러리는 객체 유형에 대한 변경 사항을 세 개의 배열이 있는 객체 로 기록합니다.

  • 삽입: 읽기와 동일한 직렬화 체계를 사용하여 삽입된 직렬화된 객체를 포함합니다.

  • 수정: 각 속성의 이전 값과 새 값을 모두 보고합니다.

  • 삭제: 읽기와 동일한 직렬화 체계를 사용하여 삭제된 직렬화된 객체를 포함합니다.

수정 시 newValue 객체 에는 oldValue 객체 와 다른 속성만 포함됩니다. 쓰기 트랜잭션 (write transaction) (write transaction)이 객체 에 할당되지만 실제로 속성 값을 변경하지 않는 경우,

쓰기 이벤트 객체의 형식은 다음과 같습니다.

삽입된 객체의 데이터 페이로드
{
"Person": {
"insertions": [{
"_id": "62b47ead6a178a314ae0eb52",
"_partition": "",
"employeeId": 1,
"name": "Anthony"
}]
}
}
수정된 객체의 데이터 페이로드
{
"Person":{
"modifications": [{
"newValue": {
"name": "Tony"
},
"oldValue": {
"_id": "62b47d83cdac49f904c5737b",
"_partition": "",
"employeeId": 1,
"name": "Anthony"
}
}]
}
}
삭제된 객체의 데이터 페이로드
{
"Person":{
"deletions":[{
"_id":"62b47ead6a178a314ae0eb52",
"_partition":"",
"employeeId":1,
"name":"Tony",
"userId":"tony.stark@starkindustries.com"
}]
}
}

사용자 지정 이벤트는 다음과 같이 데이터베이스를 읽거나 쓰지 않는 이벤트 유형을 기록할 수 있습니다.

  • 특정 화면이 표시되는 경우

  • 사용자가 버튼을 클릭할 때

사용자 지정 이벤트를 사용하여 클라이언트 애플리케이션이 특정 화면을 표시할 때 사용자 지정 이벤트를 기록하는 등 이벤트를 읽고 쓸 수 있는 컨텍스트를 제공할 수 있습니다. 그런 다음 앱 화면 로딩을 기록하는 사용자 지정 이벤트 이후에 읽기 및 쓰기 이벤트가 모두 해당 앱 화면에서 발생했음을 유추할 수 있습니다.

사용자 지정 이벤트는 개발자 가 원하는 데이터를 저장 하거나 전혀 저장하지 않을 수 있습니다.

사용자 지정 이벤트 예시
{
"_id": "62b4804c15659310991e5e0a",
"_partition": "events-62b4804b15659310991e5e09",
"activity": "login",
"event": "custom event",
"timestamp": 2022-06-23T15:01:31.941+00:00
}

돌아가기

클라이언트에서 Atlas로 데이터 스트리밍