HTTP 통신에서 Map과 JSON의 차이점 이해하기

LeeYulhee·2024년 6월 24일

👉 Map과 JSON의 데이터 형식과 호환성 비교


  • Map 객체
    • Map은 Java 내부에서 사용하는 데이터 구조로, 키-값을 저장
    • 데이터를 메모리 상에서 직접 관리하고 처리할 때 유용
    • Map 데이터는 Java 외부의 시스템이나 다른 프로그래밍 언어와 호환되지 않음
    • 네트워크를 통해 Map 객체의 데이터를 전송하기 위해서는 직렬화 과정을 거쳐야 함
      • 이를 위해 일반적으로 JSON 형식이나 XML 등의 데이터 포맷으로 변환
  • JSON(JavaScript Object Notation)
    • 데이터를 텍스트 형식으로 저장하는 경량의 데이터 교환 형식
    • JSON은 언어 독립적이며, 다양한 프로그래밍 언어에서 쉽게 파싱하고 사용할 수 있음
    • 웹에서 널리 사용되며, REST API와 같은 웹 서비스에서 표준 데이터 포맷으로 사용
    • 대부분의 웹 프레임워크와 라이브러리는 JSON 데이터를 자동으로 직렬화하거나 역직렬화할 수 있는 기능을 제공



👉 네트워크 통신에 Map을 사용해도 JSON 형태로 주고 받아지는 이유


  • 이유
    • Java 웹 서비스에서 Map 객체를 HTTP 응답에 담아 보낼 때, 일반적으로 이 Map 객체는 JSON 형식으로 변환되어 클라이언트에 전송(Map 객체를 JSON 문자열로 직렬화)
    • ⇒ 프레임워크에서 제공하는 기능(Springboot는 Jackson 라이브러리에서 제공)

  • 작동 방식
    • 서버에서 Map을 사용하여 데이터를 생성하고 조작
    • HTTP 응답을 전송하기 전, 서버의 웹 프레임워크는 Map 객체를 JSON 형식으로 자동 변환
      • Jackson과 같은 라이브러리가 사용(직렬화)
        • Map의 키-값을 검사하여 JSON 키-값으로 매핑
        • 각 항목을 JSON 형식에 맞게 변환(문자열은 큰따옴표로 감싸고, 숫자는 그대로 적음)
        • 필요에 따라 들여쓰기 등의 출력 포맷을 설정
    • 변환된 JSON 데이터는 HTTP 응답 본문에 포함되어 클라이언트로 전송



👉 자동 변환이 됨에도 JSON을 사용하는 이유


  • 클라이언트가 특정 형식의 JSON을 요구하고, 이 형식이 일반적인 Map의 키-값 구조로 쉽게 표현되지 않는 경우, JSON을 직접 조작할 수 있음
  • 매우 큰 데이터 셋을 다룰 때, 직렬화 프로세스에서 성능을 미세 조정하려는 경우, 직렬화 과정을 직접 제어할 수 있음
  • Map에서는 표현하기 어려운 복잡한 중첩 구조나 조건적 직렬화가 필요한 경우, 커스텀 직렬화 로직을 구현할 수 있음



➕ 직렬화란?


  • 정의
    • 데이터 구조나 객체 상태를 저장하거나 전송할 수 있는 형태(연속적인 바이트 스트림)로 변환하는 과정
    • 메모리에 있는 복잡한 데이터 구조를 파일, 데이터베이스, 네트워크 등을 통해 전송하거나 저장할 수 있는 형식으로 만드는 것
    • 직렬화를 통해 생성된 데이터 스트림은 나중에 다시 읽어서 원래의 객체나 데이터 구조로 복원(역직렬화)할 수 있음

  • 예시 : 게임
    • 컴퓨터 게임에서 플레이어의 진행 상태(위치, 점수, 보유 아이템 등)를 저장해야 하는 경우
    • 이런 정보들은 메모리 내에서 복잡한 객체로 구성되어 있을 수 있음
    • 게임을 종료하고 나중에 다시 시작할 때 이전의 상태를 그대로 복원하기 위해서는 이 객체들의 상태를 파일에 저장해야 함
    • ⇒ 이때 필요한 과정이 직렬화
      • 직렬화를 통해 객체의 상태를 파일에 쓰기 좋은 형태로 변환하고, 게임을 다시 시작할 때 이 파일을 읽어 객체의 상태를 복원하는 것이 역직렬화

  • 예시 : 네트워크
    • 서버가 클라이언트(웹 브라우저, 모바일 앱 등)에 데이터를 전송할 때는, 서버의 데이터 구조를 JSON이나 XML과 같은 텍스트 형식으로 직렬화하여 전송
    • 클라이언트는 이 데이터를 받아 역직렬화 과정을 거쳐 자신의 애플리케이션에서 사용할 수 있는 데이터 구조로 변환

  • ➕ 바이트 스트림이란?
    • 데이터를 바이트 단위로 연속적으로 처리하는 방식
    • 컴퓨터에서 데이터를 읽고 쓰는 작업은 기본적으로 바이트 단위로 이루어지며, 바이트 스트림은 이러한 바이트들이 연속적으로 나열된 것을 의미
    • 파일 읽기 및 쓰기(사진, 비디오, 음악 파일 등의 바이너리 데이터)와 네트워크를 통해 데이터를 전송할 때 사용
    • Java에서는 InputStream과 OutputStream이 바이트 스트림을 처리하기 위한 기본 클래스
profile
끝없이 성장하고자 하는 백엔드 개발자입니다.

0개의 댓글