멍청한 코드로 시작해보자.
1 | let a = { b: undefined }; |
위 코드는 코드 자체론 별 쓸모가 없지만 유효한 코드이다. 만약에 Internet Explorer에서 해보고 싶다면 let
을 var
로 고치고 돌려보자.
a
라는 객체에 b
라는 프로퍼티의 값을, 처음엔 undefined
로 두었다가 a
객체의 참조로 대체하여 순환구조를 만드는 코드이다.
REPL 인터프리터에서 위 객체를 평가해보면 다음과 같이 나온다. 참고로 Node.js v12.10.0을 사용하고 있다.
1 | { b: [Circular] } |
이 객체는 JSON.stringify()
즉, JSON 시리얼라이저에서 어떤 동작을 보여줄까? 의외로 예상한 답이 나온다. 런타임이 터지진 않는다. 시리얼라이징 과정 중 객체 내부를 순회하면서, 각 부분을 JSON 표현으로 만들어야하는데 순환이 발생되는 걸 감지하고 작업을 중단한다.
1 | Thrown: |
이렇게 보니 제일 처음에 적어둔 코드가 멍청해보인다. 하지만, 실제 serializing/deserializing 과정을 응용하는 자바스크립트 라이브러리의 경우, 데이터로 쓰일 Object 객체가 순환구조를 보이면 시리얼라이징에 문제가 생긴다.
만약에 이런 문제가 생긴다면, 디버거를 통해 순환되는 구조를 확인하고 해소해주어야한다. 실제 사용되는 코드에서 이런 문제가 생겼다면, 생각보다 더 복잡한 데이터 구조를 가지고 있을 것이다.