thrift idl version test

thrift idl version

thrift idl에 정의한 구조체는 지속적으로 변한다.

모바일 게임은 구/신 버전의 클라가 신 버전의 서버에 연결되는 일이 있다.

idl이 서로 달라졌을 때 어떻게 될지 테스트 해보았다.


클라와 서버에 정의된 초기 버전의 구조체

1
2
3
4
struct SharedStructV1 {
  1: i32 key
  2: string name
}

클라는 초기 버전의 구조체를 갖고, 서버는 지속적으로 아래와 같이 구조체가 변한다고 가정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
struct SharedStructV2 {
  1: i32 key
  2: string name
}
 
struct SharedStructV3 {
  1: i32 key
  3: string name
}
 
struct SharedStructV4 {
  1: i32 key1
  2: string name1
}
 
struct SharedStructV5 {
  1: i32 key
}
 
struct SharedStructV6 {
  1: i32 key
  2: string name
  3: string name1
}
 
struct SharedStructV7 {
  1: string name
  2: i32 key
}

테스트 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
public static void main( String[] args )
    {
        System.out.println( "Hello World!" );
         
        // write
        SharedStructV1 wV1 = new SharedStructV1();
        wV1.key = 1;
        wV1.name = "test";       
        Write(wV1);
         
        // read and compare
         
        SharedStructV1 rV1 = Read(SharedStructV1.class, SharedStructV1.class);
        System.out.println("동일한 구조체 사용");
        System.out.println(wV1.toString() + " == " + rV1.toString());
        System.out.println(wV1.key == rV1.key && wV1.name.equals(rV1.name));       
         
         
        SharedStructV2 rV2 = Read(SharedStructV1.class, SharedStructV2.class);
        System.out.println("구조체 이름을 변경함");
        System.out.println(wV1.toString() + " == " + rV2.toString());
        System.out.println(wV1.key == rV2.key && wV1.name.equals(rV2.name));
         
        SharedStructV3 rV3 = Read(SharedStructV1.class, SharedStructV3.class);
        System.out.println("필드 순서번호를 변경함");
        System.out.println(wV1.toString() + " == " + rV3.toString());
        System.out.println(wV1.key == rV3.key && wV1.name.equals(rV3.name));
         
        SharedStructV4 rV4 = Read(SharedStructV1.class, SharedStructV4.class);
        System.out.println("필드명을 변경함");
        System.out.println(wV1.toString() + " == " + rV4.toString());
        System.out.println(wV1.key == rV4.key1 && wV1.name.equals(rV4.name1));
         
        SharedStructV5 rV5 = Read(SharedStructV1.class, SharedStructV5.class);
        System.out.println("필드 제거함");
        System.out.println(wV1.toString() + " == " + rV5.toString());
        System.out.println(wV1.key == rV5.key);
         
        SharedStructV6 rV6 = Read(SharedStructV1.class, SharedStructV6.class);
        System.out.println("필드 추가함");
        System.out.println(wV1.toString() + " == " + rV6.toString());
        System.out.println(wV1.key == rV6.key && wV1.name.equals(rV6.name));
         
        SharedStructV7 rV7 = Read(SharedStructV1.class, SharedStructV7.class);
        System.out.println("필드 타입을 변경함");
        System.out.println(wV1.toString() + " == " + rV7.toString());
        System.out.println(wV1.key == rV7.key && wV1.name.equals(rV7.name));
         
    }

테스트 로그

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
동일한 구조체 사용
SharedStructV1(key:1, name:test) == SharedStructV1(key:1, name:test)
true
구조체 이름을 변경함
SharedStructV1(key:1, name:test) == SharedStructV2(key:1, name:test)
true
필드 순서번호를 변경함
SharedStructV1(key:1, name:test) == SharedStructV3(key:1, name:null)
false
필드명을 변경함
SharedStructV1(key:1, name:test) == SharedStructV4(key1:1, name1:test)
true
필드 제거함
SharedStructV1(key:1, name:test) == SharedStructV5(key:1)
true
필드 추가함
SharedStructV1(key:1, name:test) == SharedStructV6(key:1, name:test, name1:null)
true
필드 타입을 변경함
SharedStructV1(key:1, name:test) == SharedStructV7(name:null, key:0)
false

결론

초기 구조체에 정의된 필드의 순서번호나 타입이 변경되지 않으면서

필드 추가와 삭제가 있는 경우 버전 호환이 가능할 것 같다.