thrift idl version test

thrift idl version

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

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

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


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

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

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

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 }

테스트 코드

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)); }

테스트 로그

동일한 구조체 사용 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

결론

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

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