menu
Is this helpful?

# 유저 식별 규칙

이 문서에서는 TE (ThinkingEngine)에서 채택하고 있는 유저 식별 규칙을 설명하고, 두 명의 유저를 식별하는 방법과 로그인 상태와 로그인 상태가 아닌 같은 유저로 구분하는 규칙에 대해 설명합니다.

포인트

    1. 유저는 식별을 위해 세 가지 ID를 갖게 됩니다. 
    
        각각: 
        방문자 ID      #distinct_id      로그인 하지 않은 상태에서의 유저 ID 
        계정 ID        #account_id       로그인 상태에서의 유저 ID 
        TE 유저 ID     #user_id          TE에 의해 부여된 유저의 고유 ID
    
    2. 유저를 식별하는 가장 중요한 ID는 유저 ID입니다.
       각 데이터 조각에서의 유저 ID는 계정 ID와 방문자 ID에서 생성됩니다.
       생성은 계정 ID에 우선순위를 두며, 계정 ID가 존재하지 않는 경우 방문자 ID를 기반으로 합니다.

    3. TE 백그라운드가 새로운 계정 ID를 포함한 데이터를 받게 되면, 현재 데이터의 방문자 ID에 바인딩 됩니다.
       방문자 ID가 존재하고 다른 계정 ID에 의해 바인딩되지 않았다면, 바인딩이 성공하고 두 ID로 식별된 데이터는 동일한 유저 ID를 사용합니다.
       방문자 ID가 존재하지 않거나 다른 계정 ID에 의해 이미 바인딩 되었다면, 바인딩이 실패하며 더 이상 바인딩 되지 않고, 바인딩되지 않은 ID는 NULL이 됩니다.

    4. 유저 ID, 계정 ID 및 방문자 ID는 서로 대응되며, 한 번에 둘 이상의 번들이 존재하는 경우는 없습니다.

유저는 다른 디바이스에서 앱을 사용할 수 있으며, 로그인하지 않은 상태에서 앱을 사용하는 경우도 있어, 정확한 유저 식별이 매우 복잡해집니다. 이 문서에서는 유저 식별 규칙의 세부 사항을 설명하고, 이해를 돕기 위해 예를 들어 설명합니다.

# 1.유저 식별 규칙

TE에서는 주로 '방문자 ID(#distinct_id)', '계정 ID(#account_id)' 및 'TE 유저 ID(#user_id)'의 세 가지 ID를 사용하여 유저 식별을 합니다. 이 섹션에서는 각 ID의 규칙에 대해 설명합니다.

# 1.1 방문자 ID

방문자 ID는 로그인하지 않은 상태의 유저 ID이며, 유저가 SDK를 통해 데이터 전송을 할 경우, 앱을 설치할 때 방문자 ID가 자동으로 부여됩니다. 수동으로 방문자 ID를 생성해야 하는 경우, 이벤트를 업로드하기 전에 identify로 설정합니다. 방문자 ID는 SDK에 저장되므로 여러 번 생성할 필요가 없습니다. 이벤트 업로드 후 identify를 통한 방문자 ID 변경은 유저의 불일치나 중복을 유발할 수 있으므로 주의해야 합니다.

login으로 Account ID가 생성되기 전까지, 그 유저의 데이터에는 #distinct_id만 있고 #account_id는 없습니다. 따라서, 그 데이터는 #distinct_id를 사용하여 User ID에 연결됩니다.

# 1.2 계정 ID

계정 ID는 유저가 로그인 또는 등록에 성공했을 때, login을 호출하여 계정 ID를 설정할 수 있습니다. 이 시점에서 데이터에는 #account_id와 #distinct_id가 SDK에 저장됩니다. login을 여러 번 호출하여 계정 ID를 설정하는 경우, 마지막에 받은 값이 계정 ID로 취급됩니다. logout을 호출하여 계정 ID를 삭제할 수 있으며, 삭제된 후의 데이터에서는 #distinct_id만이 저장됩니다. 수신 데이터가 #account_id를 포함하는 경우, 백그라운드는 #account_id에 따라 우선적으로 User ID와 연결합니다.

# 1.3 TE 유저 ID

TE 유저 ID는 유저를 식별하는 고유한 ID입니다. TE가 데이터를 수신하면, 계정 ID와 방문자 ID에 기반하여 연결된 유저 ID를 찾아, 각각의 데이터의 주키로 삽입하거나, User Table에서 주키에 해당하는 프로필을 찾아 유저 속성을 설정합니다.

먼저, 계정 ID가 존재하는 경우 우선적으로 계정 ID에 연결된 유저 ID를 찾습니다. 그 다음 계정 ID가 존재하지 않는 경우, 방문자 ID에 연결된 유저 ID를 찾습니다.

어느 쪽에서도 유저 ID를 찾을 수 없는 경우, 새로운 유저 ID가 생성되고 계정 ID나 방문자 ID와 연결됩니다.

어느 경우에도, 세 가지 ID는 각각 서로 관련되어 있습니다. 방문자 ID와 계정 ID의 연결에 대해서는 다음 섹션에서 설명합니다.

# 2. 방문자 ID와 계정 ID의 연결

TE는 새로운 방문자 ID로부터 데이터를 수신하면, 방문자 ID를 기반으로 유저 ID를 생성하고 방문자 ID와 연결합니다. 한편, 새로 로그인한 유저에 대한 데이터를 수신할 때, 방문자 ID가 이미 유저 ID에 연결되어 있을 가능성이 있습니다. 이를 확인한 후 방문자 ID와 계정 ID를 연결할지를 결정해야 합니다. 이때 다음과 같은 3가지 시나리오가 발생할 수 있습니다.

  1. 방문자 ID와 유저 ID가 연결되어 있지 않은 경우, 로그인은 해당 유저가 처음으로 전송한 이벤트로 간주할 수 있습니다. 게스트 상태에서 이벤트가 전혀 발생하지 않은 경우, 새로운 유저 ID가 생성되고 계정 ID와 방문자 ID에 연결됩니다.
  2. 방문자 ID와 유저 ID가 연결되어 있고 계정 ID와는 연결되어 있지 않은 경우, 즉, 게스트 상태의 유저가 로그인한 유저로 변경된 경우, 계정 ID는 방문자 ID와 대응하는 유저 ID에 연결되며, 새로운 유저는 생성되지 않습니다.
  3. 방문자 ID와 유저 ID가 연결되어 있고 계정 ID와도 연결되어 있는 경우, 즉, 로그인한 유저가 사용하던 디바이스에 새로운 유저가 계정을 등록한 경우, 계정 ID는 방문자 ID와 연결하지 않고 새로운 유저 ID를 생성하여 계정 ID와 연결합니다.

참고로, 계정 ID와 유저 ID의 결속 판단은 새로운 계정 ID를 포함하는 데이터를 백그라운드에서 수신한 경우에 한 번만 발생합니다. 즉, 계정 ID의 결속 판단은 한 번만 이루어지므로, 세 번째 경우에서 계정 ID는 영구적으로 방문자 ID를 결속할 수 없게 됩니다.

# 3. 케이스 스터디

TE의 유저 식별 규칙을 더 잘 이해하기 위해, 이 섹션에서는 규칙이 어떻게 작동하는지에 대한 케이스 스터디를 제시합니다. 각각, 데이터를 수신한 후에 유저 ID를 설정하는 시나리오를 보여줍니다. 각 단계에서의 #user_id와 다른 ID와의 연결 원칙을 이해해 주세요.

# 3.1 #distinct_id만의 경우

#distinct_id만 있는 경우에는, #distinct_id만이 생성됩니다.

Step

#account_id

#distinct_id

#user_id

1

null

A

1

2

null

B

2

3

null

C

3

4

null

A

1

위의 케이스에서, Step1부터 Step3까지, 각각 새로운 #distinct_id를 3개 받고, 3개의 새로운 #user_id가 생성됩니다. 그 후 Step4에서, #user_id = 1은 #distinct_id = A와 연결됩니다. 이것은 Step1에서 생성된 #user_id = 1로 간주되고 있음을 의미합니다.

# 3.2 #distinct_id와 #user_id가 연결되어 있고, #account_id와는 연결되어 있지 않은 경우

#distinct_id와 #user_id가 연결되어 있고, #account_id와는 연결되어 있지 않은 경우, 수신된 #account_id는 #account_id와 #distinct_id와 연결됩니다.

Step

#account_id

#distinct_id

#user_id

1

null

A

1

2

A

A

1

해당 케이스에서, Step1에서 #distinct_id와 #user_id가 연결되어 있고, #account_id와는 연결되어 있지 않습니다. 즉, 새로운 #distinct_id를 받고 새로운 #user_id가 생성되었습니다. 그 후 Step2에서, 새로운 #account_id를 수신한 후, #distinct_id는 연결되지 않고 새로운 #account_id는 #distinct_id와 연결됩니다.

# 3.3 #distinct_id가 #user_id와 #account_id 둘 다와 연결되어 있는 경우

#distinct_id가 #user_id와 #account_id 둘 다와 연결되어 있는 경우, 새로운 #account_id는 #distinct_id와 연결되지 않고, 다른 #distinct_id와 연결됩니다.

Step

#account_id

#distinct_id

#user_id

1

A

A

1

2

B

A

2

3

B

B

2

4

null

B

2

5

null

A

1

6

C

B

3

해당 케이스에서, Step1에서 #distinct_id = A와 #account_id = A가 연결되고, Step2에서만 #user_id = 2가 조건으로 주어졌을 때, #distinct_id = A는 연결될 수 없습니다. Step3에서 #distinct_id = B이고, #account_id = B로 전송된 경우, #distinct_id = B는 어떤 #account_id와도 연결되어 있지 않기 때문에, 새롭게 #account_id = B와 #user_id = 2가 모두 연결됩니다.

그 다음 Step4에서, #distinct_id = B는 이미 #user_id = 2와 연결되어 있습니다. 하지만, 그 후 #distinct_id = B가 새롭게 #account_id = C를 전송한 경우, 새로운 유저로 간주되어 #user_id = 3이 새롭게 발급됩니다.

각 ID의 최종적인 관계는 다음과 같습니다.

#account_id

#distinct_id

#user_id

A

A

1

B

B

2

C

null

3

# 복잡한 시나리오 분석

이해를 돕기 위해 주요 단계의 User 테이블 구조를 보여줍니다. 이 단계의 설명을 비교함으로써 이해할 수 있습니다.

Step

#account_id

#distinct_id

#user_id

1

null

A

1

2

A

A

1

3

B

A

2

4

null

B

3

5

B

B

2

6

C

B

3

7

C

C

3

8

B

C

2

9

D

C

4

10

null

C

2

#distinct_id = A와 #account_id = A가 연결되고, Step2에서 #user_id = 2로 연결됩니다.

  1. #distinct_id = A가 전송되고, #user_id = 1로 연결됩니다.
  2. #account_id = A가 발급된 경우, #distinct_id = A가 다른 #account_id와 연결되지 않은 경우, #distinct_id = A와 #account_id = A, #user_id = 1이 연결됩니다.
  3. #account_id = B가 새롭게 전송된 경우, #distinct_id = A는 #account_id = A와 이미 연결되어 있기 때문에, 새롭게 #user_id = 2로 연결됩니다. 이 경우 새로운 #distinct_id는 발급되지 않습니다. 이 상황에서의 관계는 다음과 같습니다.

#account_id

#distinct_id

#user_id

A

A

1

B

null

2

1. 이때, #distinct_id = B는 어떠한 ID와도 연결되지 않았으므로, 발급된다면 새로운 #user_id = 3으로 연결됩니다. 1. 이 상황에서, #account_id = B와 #distinct_id = B는 두 명의 사용자에게 속해 있습니다. 이 상황에서의 관계는 다음과 같습니다.

#account_id

#distinct_id

#user_id

A

A

1

B

null

2

null

B

3

1. #distinct_id = B 상황에서 #account_id = C가 새롭게 전송된 경우, #distinct_id = B와 #account_id = C, #user_id = 3이 연결됩니다. 이 상황에서의 관계는 다음과 같습니다.

#account_id

#distinct_id

#user_id

A

A

1

B

null

2

C

B

3

1. #user_id = 3과 #distinct_id = B에 연결된 #account_id = C는 현재 #distinct_id = C에 대해서는 작동하지 않습니다. 1. #account_id = B와 #distinct_id = C가 전송된 경우, #distinct_id = C는 다른 #account_id와 연결되지 않았기 때문에 새롭게 연결됩니다. 이 상황에서의 관계는 다음과 같습니다.

#account_id

#distinct_id

#user_id

A

A

1

B

C

2

C

B

3

1. 새로운 #account_id = D로 새로운 사용자가 로그인한 경우, #distinct_id = C와 #user_id = 2에 속하기 때문에, 연결될 곳이 없습니다. 이 상황에서의 관계는 다음과 같습니다.

#account_id

#distinct_id

#user_id

A

A

1

B

C

2

C

B

3

D

null

4

1. 마지막 #distinct_id = C는 #user_id = 2와 연결됩니다. 이 상황에서의 관계는 다음과 같습니다.

#account_id

#distinct_id

#user_id

A

A

1

B

C

2

C

B

3

D

null

4