★ JSON(JavaScript Object Notation) : 웹 애플리케이션에서 데이터를 전송하고 저장하는 데 선택되는 경량 데이터 교환 형식으로 단순성과 사람이 읽을 수 있는 형식으로 사람과 기계 모두 쉽게 작업이 가능하다. 그리고 JSON은 서버와 클라이언트 간에 데이터가 통신되는 언어이며 데이터가 DB 및 구성 파일에 저장되는 형식으로 현대 웹 개발에서 중추적인 역할을 한다.
★ JSON 특징
- 사람이 읽을 수 있는 형식 : JSON은 개발자 및 비개발자 모두 쉽게 읽고 이해할 수 있는 간단한 텍스트 기반 구조를 사용해 협업을 강화하고 디버깅을 단순화 함
- 언어에 구애받지 않음 : JSON은 특정 프로그래밍 언어에 묶여 있지 않아서 거의 모든 최신 프로그래밍 언어로 구문 분석하고 생성할 수 있는 범용 데이터 형식으로 매우 다양
- 데이터 구조 일관성 : JSON은 key-value 쌍 & 배열 및 중첩 객체를 사용해 데이터에 대해 일관된 구조를 적용해 다양한 프로그래밍 시나리오에서 예측 가능하고 쉽게 작업이 가능
- 브라우저 지원 : JSON은 웹 브라우저에서 지원되어 웹 애플리케이션이 서버와 원할하게 통신할 수 있음
- JSON API : 많은 웹 서비스와 API는 기본적으로 JSON형식으로 데이터를 제공해 웹 개방에 데이터 교환을 위한 선택으로 JSON역할이 확고해짐
- JSON SCHEMA : 개발자는 JSON 스키마를 사용해 데이터 구조를 정의하고 검증해 애플리케이션에 명확성과 신뢰성을 한층 더 높일 수 있음
※ Application Speed와 응답성의 중요성
- 사용자 기대 : 현대 사용자는 매우 빠른 응답에 익숙해져 있어 웹 페이지가 로드되거나 앱이 응답할 때까지 기다리기를 원하지 않아 단 몇초라도 지연이 되면 좌절감과 포기로 이어질 수 있음
- 경쟁 우위 : 빠르게 반응한 application이 느린 대안보다 더 효과적으로 사용자를 이끌어 들이고 유지하는 경향이 있음
- 검색 엔진 순위 : Google과 같은 검색 엔진은 페이지 속도를 순위 요소로 고려해 로딩 속도가 빠른 웹 사이트는 검색 결과에서 더 높은 순위를 유지하려는 경향이 있어 가시성과 트래픽이 증가함
- 전환율 : 웹사이트 속도가 빨라지면 전환율도 높아지고 결과적으로 수익이 증가(특히 전자상거래 웹사이트 경우)
- 모바일 성능 : 모바일 사용자는 대역폭과 처리 능력이 제한되어 있는 경우가 많아 빠른 앱 성능이 필수
Q) 그럼 JSON이 application 속도를 저하시키나요?
- JSON은 유연하고 사용하기 쉬우며 광범위하게 지원되는데 이러한 광범위한 채택으로 성능 문제가 발생할 수 있습니다. 크거나 복잡한 구조를 처리할 때 JSON 데이터를 구문 분석하는 프로세스는 시간이 좀 더 걸리고 비효율적인 직렬화 및 역직렬화는 애플리케이션의 전반적 성능에 영향을 미칠 수 있습니다.
★ JSON의 속도 저하 요인
- 파싱 오버헤드 : JSON 데이터가 application에 도착 시, 사용 가능한 데이터 구조로 변환하기 위해 구문 분석 프로세스를 거쳐야 하는데 이 때, 광범위하거나 깊이 중첩된 JSON 데이터를 처리할 시 구문 분석은 상대적으로 느릴 수 있음
- 직렬화 및 역직렬화 : JSON에서는 데이터가 클라이언트에서 서버로 전송 시, 직렬화(객체를 문자열로 인코딩)하고 수신 시 역직렬화(문자열을 다시 사용 가능한 객체로 변환)해야 하는데, 이러한 단계로 오버헤드가 발생하고 application의 전체 속도에 영향을 미칠 수 있음
- 문자열 조작 : JSON은 텍스트 기반이며 연결 및 구문 분석과 같은 작업을 위해 문자열 조작에 크게 의존하는데, 문자열 처리는 이진 데이터 작업에 비해 속도가 느릴 수 있음
- 데이터 유형의 부족 : JSON에는 제한된 데이터 유형 세트(문자열, 숫자, boolean 등)가 있는데, 복잡한 데이터 구조에는 덜 효율적인 표현이 필요하므로 메모리 사용량이 증가하고 처리 속도가 느려질 수 있음
- 장황함 : 사람이 읽을 수 있는 디자인으로 장황한 결과를 가져올 수 있고 중복된 키와 반복적인 구조로 인해 페이로드 크기가 늘어 데이터 전송 시간이 길어짐
- 바이너리 지원 없음 : JSON에서는 바이너리 데이터에 대한 기본적 지원이 부족 해 바이너리 데이터를 처리 시, 이를 텍스트로 인코딩하고 디코딩해야 하는 상황이 발생 해 효율성이 떨어질 수 있음
- 깊은 중첩 : 일부 시나리오에서는 JSON 데이터가 깊게 중첩되어 재귀 구문 분석 및 순회가 필요할 수 있는데, 이러한 계산 복잡성은 최적화를 하지 않는 다면 application속도를 저하시킬 수 있음
★ JSON 대안(특정 시나리오에서의 성능 제한으로 인한 빠른 대안)
- Protocol Buffer(protobuf) : Google에서 개발한 바이너리 직렬화 형식으로 효율성, 소형화 및 속도를 위해 설계됨, 바이너리 특성으로 직렬화 및 역직렬화가 JSON보다 훨씬 빠름 => 마이크로서비스 아키텍처, IoT application 또는 네트워크 대역폭이 제한된 시나리오에서 고성능 데이터 교환이 필요한 경우 적합
- Message Pack : 속도와 컴팩트함으로 잘 알려진 다른 바이너리 직렬화 형식으로 다양한 프로그래밍 언어와 호환성을 유지하며 JSON보다 효율적으로 설계됨 => 속도와 언어 간 호환성 사이의 균형이 필요 할 때, 실시간 applicaiton 및 데이터 크기 감소가 중요한 상황에 적합
- BSON(Binary JSON) : JSON에서 파생된 바이너리 인코딩 형식으로 바이너리 인코딩을 통해 성능을 향상시키며 JSON의 유연성을 유지함, 일반적으로 MongoDB와 같은 DB에서 주로 사용 => MongoDB로 작업 중이거나 JSON과 바이너리 효율성 사이의 격차를 해소하는 형식이 필요한 경우 적합
- Apache Avro : 컴팩트 바이너리 형식 제공에 중점을 둔 데이터 직렬화 프레임워크로 스키마 기반을 통해 효율적인 데이터 인코딩 및 디코딩이 가능 => 데이터 저장소와 같이 스키마 진화가 중요한 시나리오와 속도와 데이터 구조 유연성 간의 균형이 필요한 경우 적합
★ JSON을 더 빠르고 효율적으로 만들어 최적화 시켜보기
- 데이터 크기 최소화 : 짧고 설명적인 키 사용, 가능한 경우 약어 사용
- 현명한 배열 사용 : 중첩 최소화(깊게 중첩된 배열은 JSON 구문 분석 및 탐색의 복잡성을 증가 시킴)
- 숫자 표현 최적화 : 가능한 경우 부동 소수점 숫자 대신 정수 사용
- 중복 제거 : 반복적 데이터 방지(공유된 값을 참조해 중복 데이터 제거)
- 압축 사용 : 압축 알고리즘 적용(Gzip이나 Brotli 등의 압축 알고리즘을 사용 해 전송 중 JSON 페이로드 크기를 줄임)
- 서버측 캐싱 사용 : JSON 응답 캐시(응답을 효율적으로 저장하고 제공하기 위해 서버 측 캐싱을 구현 해 반복적인 데이터 처리 필요성을 줄임)
- 프로파일링 및 최적화 : 성능 프로파일링(프로파일링 도구 사용으로 JSON 처리 코드의 병목 현상을 식별한 후 다음 해당 섹션을 최적화)
★ 실제 기업의 JSON 성능 병목 현상 해결 CASE
- LinkedIn의 프로토콜 버퍼 통합 : 과거 LinkedIn은 네트워크 대역폭 사용량 증가로 대기 시간이 길어지는 문제가 있었음 -> Protocol Buffer를 채택해 최적화 => 대기 시간이 최대 60%까지 줄어들어 LinkedIn 서비스의 속도와 응답성이 향상되었음
- Uber의 H3 지리 지수 : Uber는 다양한 지리 공간 데이터 표현에 JSON을 사용하는데 대규모 데이터 세트에 대해 JSON을 구문 분석 시 알고리즘 속도가 느려졌음 -> 지리 공간 데이터를 위한 매우 효율적인 육각형 그리드 시스템인 H3 Geo-Index를 도입 해 JSON 구문 분석 오버헤드를 줄이는 최적화 => 지리공간 운영이 크게 가속화되어 Uber의 차량 호출 및 매핑 서비스가 향상되었음
- Slack의 메시지 형식 최적화 : 실시간 채팅에서 대량의 JSON 형식 메시지를 전송하고 렌더링해야 하는 과정이 필요해 성능 병목 현상 발생 -> JSON구조를 최적화 해 각 메시지에 꼭 필요한 정보만을 포함하며 불필요한 데이터를 줄임 => Slack 사용자의 메시지 렌더링 속도가 빨라지고 전반적인 채팅 성능이 향상되었음
- AuthO의 프로토콜 버퍼 구현 : AuthO는 인증 및 권한 부여 데이터를 처리 할 때, JSON의 성능 문제에 직면 -> 인증 관련 데이터의 인코딩 및 디코딩을 위해 Protocol Buffer 채택해 최적화 => 데이터 직렬화 및 역직렬화 속도가 크게 향상되어 인증 프로세스가 더욱 빨라지고 AuthO 서비스의 전반적 성능이 향상
※ 결론 : 웹 application을 계속 구축하고 향상 시킬 때 JSON이 성능에 미치는 영향을 고려해야 합니다! 데이터 구조를 신중하게 설계하고 의미 있는 키 이름을 선택하고 필요 경우 대체 직렬화 형식을 탐색하는 등의 작업을 수행해야 합니다, 이를 통해 application 속도와 효율성 측면에서 사용자 기대를 충족시키고 보장할 수 있습니다. 끊임없이 진화하는 웹 개발 환경에서 JSON 성능 최적화는 프로젝트를 차별화하고 즉각적 디지털 경험 시대에 Applicaiton이 성공하도록 보장할 수 있게 해주는 귀중한 기술입니다.
- 이 글은 개인적인 공부를 위해 medium에 발췌해 정리한 글입니다.
JSON is incredibly slow: Here’s What’s Faster!
Unlocking the Need for Speed: Optimizing JSON Performance for Lightning-Fast Apps and Finding Alternatives to it!
medium.com
'JS' 카테고리의 다른 글
| Node의 여러 API 요청 처리 방법 (0) | 2023.11.14 |
|---|---|
| Optional Chaining / JS Array.some() / 논리 연산자 (2) | 2023.11.09 |
| JS 내용 정리 (1) | 2023.06.03 |
| JS 메소드 (4) | 2023.05.30 |
| JS 5주차 개념 정리 (0) | 2023.05.25 |