JSON 개발 가이드라인
GitLab v19.1GitLab에서는 방대한 양의 JSON 데이터를 처리합니다. 이 클래스는 기본 JSON 클래스 호출, .to_json 호출 등을 대체하여 사용해야 합니다. 차이점은 모든 JSON 처리를 Gitlab::Json을 통해 수행함으로써 내부적으로 사용하는 gem을 교체할 수 있다는 점입니다.
GitLab에서는 방대한 양의 JSON 데이터를 처리합니다. 대용량 JSON 인코딩 또는 디코딩 시 최적의 성능을 보장하기 위해, 기본 메서드 대신 자체 JSON 클래스를 사용합니다.
Gitlab::Json#
이 클래스는 기본 JSON 클래스 호출, .to_json 호출 등을 대체하여 사용해야 합니다.
.parse, .generate, .dump 등 JSON이 제공하는 대부분의 공개 메서드를 구현하며, 응답 결과는 기본 클래스와 완전히 동일합니다.
차이점은 모든 JSON 처리를 Gitlab::Json을 통해 수행함으로써 내부적으로 사용하는 gem을 교체할 수 있다는 점입니다.
기본 json gem 대신 C 확장을 사용하는 oj를 사용하여 현저히 빠른 성능을 제공합니다.
이 클래스가 만들어진 이유는, GitLab 애플리케이션의 오랜 역사로 인해 기본 json gem을 oj로 단순 교체하는 것이 불가능했기 때문입니다:
-
응답 결과에 대한 정확한 기댓값을 갖는 테스트 케이스가 방대하게 존재합니다.
-
서로 다른 JSON 프로세서 간, 특히 포매팅과 관련하여 미묘한 차이가 있습니다.
Gitlab::Json 클래스는 이러한 점을 고려하여 사용 사례에 따라 어댑터를 유연하게 변경할 수 있으며, 구식 포매팅 기댓값도 처리할 수 있습니다.
Gitlab::Json::PrecompiledJson#
이 클래스는 Grape 프레임워크에 대한 훅에서 사용됩니다. 이미 생성된 JSON이 응답 반환 시 JSON 생성 과정을 다시 한 번 거치지 않도록 보장합니다.
Gitlab::Json::LimitedEncoder#
이 클래스는 JSON을 생성하되, 결과 JSON이 너무 커지면 오류를 발생시키는 데 사용할 수 있습니다.
.encode 메서드의 기본 제한값은 25 MB이지만, 메서드 사용 시 이 값을 사용자 정의할 수 있습니다.