JSON 개발 가이드라인
GitLab에서는 많은 JSON 데이터를 처리합니다. 대용량 JSON 인코딩 또는 디코딩을 처리할 때 성능을 유지하기 위해, 우리는 기본 방법 대신에 자체 JSON 클래스를 사용합니다.
Gitlab::Json
이 클래스는 기본 JSON
클래스에 대한 모든 호출, .to_json
호출 등을 대신하여 사용해야 합니다. 이 클래스는 JSON
이 제공하는 대부분의 공개 메소드를 구현하고 있으며, .parse
, .generate
, .dump
등을 포함합니다. 그 응답은 완전히 동일해야 합니다.
차이점은 모든 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
메소드의 기본 제한은 25MB이지만, 해당 방법을 사용할 때 사용자 정의할 수 있습니다.