오전에 QA팀에서 연락이 왔다.

 

음, 퀴즈 20문제를 내놓고 답을 맞추는 그런 컨텐츠인데, 특정 퀴즈의 답이 보기에 없다는 것이다. 심지어 4개의 보기 중 어떤것을 선택해도 오답 처리.

 

별거 아닌 걸로 생각을 했다.. 정답지를 단지 xml 형태로 저장된 고정파일에서 당겨 파싱하는 것이니, 단지 무언가 오타가 났겠거니 하고.

 

여차저차 디버깅을 하면서 xml 소스엔 문제가 없다는게 밝혀졌고, 그 버그는 아주 간헐적으로 고정된 패턴(ㅋㅋ)을 가지고 발생한다는걸 알아냈다.

 

 

뭐 디버깅 과정이야 중요하지 않고, 위 버그를 해결하며 너무 어이없는 상황이 있어 기록차 남겨둠..

 

 

문제의 소스 되시겠다. 버그 발생부를 간단히 재현한 메소드.

 

코드는 단순히 JToken 객체를 하나 만들고(두개든 세개든 상관 없었음), 새로이 또 생성된 Jarray객채의 value값을 담아,

이 상태로 loop문을 돌면서 Jarray의 정보를 갱신해 또 담아주고, 삭제하고, 담아주고.. 뭐 그런 느낌이었다.

jtoken이 전체 문제 json 데이터였고, jarray는 각 문항의 보기(와 정답) 데이터를 포함한..

 

 

 

어쨌거나, 이 부분에서 각 token의 key값을 하나 만들어두고 array를 할당한다. 여기서 Jarray에는.. 그냥 string만 add되어있움.

 

 

디버깅해보면 각각 Key값에 착실하게 Jarray Value도 들어갔다.

 

그런데..

 

밑의 array.Clear()를 돌리는 순간

 

....??? Jarray 속성이 clear되는건 둘째치고,  첫번째 Key값 "Hi"에 할당한 value값도 같이 날아감.

 

아니, 다 날아가면 상관이 없다. 첫번째만 날아간다는게 문제다.

 

 

 

심지어 다시 string format을 add시키면 또 첫번째에만 들어와있음. 대환장 트루먼쇼.

 

 

---

 

 

Json을 디컴파일해서 해당 부분을 살펴봤더니, ValueChanged 구간이 콜되며 좀 이상하게 나누어진 것 같아 계속 살펴보고있다.

 

아, 참고로 array.RemoveAll(); 도 당연히 똑같은 결과를 나타낸다. 일단 이를 코드상으로 해결하려면

 

Clear()메소드가 아닌 단지 array = null;을 먹여주면 된다. 해당 객체만 초기화한다는 느낌으로. 단지 Clear()의 메소드가 뭔가 내가 아는 형태가 아닌 것이다.

 

뭔가 알아내는게 있다면 이 포스트에 추가하는걸로.

 

----------

 

 

3:58 추가

 

JToken을 디컴파일해서 따라 따라가다가 이런 메소드를 발견했다.

아, parent...!!! 계속 JToken에 객체를 '할당'한다고만 생각했지만 사실은 Tree구조를 하고 있었던것.

처음으로 Jtoken에 할당(이라고 쓰고 설정이라고 읽음)될때 해당 JArray의 부모는 ["Hi"]가 되는 것이고,

같은 Parent를 참조하고 있는 이상 계속 따라가게 된다. 새로운 노드를 받지 않는 이상.

 

네. 궁금증 끝 ㅎ vㅎ

+ Recent posts