C# JSON 파싱(parsing): 배경과 구조 이해

Wookoa 2024. 4. 6.

C# JSON 배경과 구조 이해
C# JSON 배경과 구조 이해

 

머리말

  본 포스팅에서는 C# 개발 환경에서 JSON 데이터를 다루는 방법에 대해 자세하게 소개한다. 다른 블로그의 내용만으로도 어느 정도 자신이 원하는 기능은 구현할 수 있다. 하지만 JSON의 개념을 먼저 이해하지 못한다면 라이브러리를 선택함에 있어서 자유롭지 못하고 특이한 예외 상황에 유연하게 대응하는데 한계가 있다. 그렇기 때문에 총 세 번의 포스팅으로 JSON에 대한 개념적인 내용을 소개할 것이며, 먼저 본 포스팅에서는 JSON에 대한 배경과 구조에 대한 내용을 소개하도록 한다. 만일 사용 방법에 대한 요점만 필요하다면 상단의 도움이 될만한 포스팅의 세 번째 포스팅으로 건너뛰어도 좋다.

  수십 년 동안 시스템 간 데이터를 이동하기 위한 데이터 포맷으로 XML을 사용해 왔다. XML은 현재도 많이 이용하고 사랑받고 있는 데이터 포맷임에 틀림없는 사실이다. 하지만 최근 3-5년간 JSON에 대한 이용이 폭발적으로 급증했으며, 앞으로도 장기간 동안 데이터 포맷으로 JSON이 선두자리를 유지할 것으로 예상한다. 최근 들어 JSON의 위상이 급증한 이유는 웹의 발전이다. 웹 중에서도 자바스크립트의 비약적인 발전 때문에 JSON이 범용적으로 다양한 플랫폼에서 활용되고 있는 이유다. 참고로 JSON은 JavaScript Object Notation의 약자이며 이름만으로도 JavaScript와 매우 밀접한 관계가 있음을 예상할 수 있다.

JSON 배경

  JSON을 이해하는데 JavaScript를 빼놓고 이야기할 수 없다. 그렇기 때문에 JavaScript는 궁금하지 않더라도 시간을 조금 투자해 JavaScript에 대해서 한번 생각해 보도록 한다. JSON은 JavaScript 객체 리터럴 문법을 따르는 문자열이다. 마땅한 번역이 없어서 한글로 표현하면 쉽게 이해하기 어렵겠지만, 풀어서 설명하면 JavaScript의 기본 데이터 타입인 문자열, 숫자, 배열, 불리언 값을 포함할 수 있다는 뜻이다. 심지어 변수에 객체를 포함할 수 있다는 점에서 JavaScript와 JSON의 구조가 유사한 점이 상당히 많다. JavaScript는 매우 직관적이면서 쉽게 접근할 수 있는 스크립트 언어이기 때문에 많은 개발자가 기본적인 JavaScript 코드는 작성해 봤을 것이다. JavaScript 이야기를 이토록 길게 꺼내는 이유는 JSON의 객체 개념을 설명하기 위해서다. 자신의 스타일에 따라 제각각이겠지만 아래와 같이 JavaScript 객체를 생성할 수 있다.

var wookoa = new Object();
wookoa.a = 100;
wookoa.b = 200;
wookoa.c = 300;

  위 코드는 자바스크립트의 객체를 생성하기 위해 일반적으로 사용되는 코드이다. JavaScript에서는 중괄호로 감싸져 있는 영역은 모두 오브젝트처럼 취급되기 때문에 아래와 같이 다양한 방법으로도 객체를 생성할 수 있다.

// 첫 번째 방법
var Wookoa = { 'a':100, 'b':200, 'c':300 };

// 두 번째 방법
var Wookoa = {};
Wookoa['a'] = 100;
Wookoa['b'] = 200;
Wookoa['c'] = 300;

  JavaScript에서 객체를 생성하는 방법은 위와 같이 두 가지 스타일이 있다. 두 스타일 모두 중괄호로 객체를 생성하고 있다. 첫 번째 스타일은 중괄호로 객체를 생성함과 동시에 변숫값을 할당하며, 두 번째 스타일은 객체를 먼저 생성한 뒤 변숫값을 차례로 할당하는 방식이다. 두 방법 모두 중괄호로 객체를 생성하는 사실에 중점을 둘 수 있는데, 여기서 JSON의 구조와 연관 지어 생각하면 그 구조를 한 번에 이해할 수 있다.

  JSON 구조의 핵심은 중괄호다. 시작부터 끝까지 모두 중괄호로 쌓여있기 때문에, 고작 데이터 포맷 정도인 JSON 자체만으로도 JavaScript에서는 객체가 될 수 있다는 의미다. 이러한 사실이 시사하는 의미는 매우 크다. 데이터베이스 및 응용프로그램에서 생성된 JSON 데이터는 JavaScript에서 곧 객체가 되기 때문에 데이터 로드와 동시에 특별한 파싱 과정 없이 곧바로 객체화해서 데이터를 사용할 수 있다.

  오브젝트의 기준이 중괄호라는 요점만 설명했다면 매우 심플한 설명이겠지만, 중요한 사실인 만큼 자세히 설명하고 싶은 마음에 장황하게 설명했다. 위에서 설명한 내용대로라면 JSON 객체를 다른 시스템에서 생성해주지 않으면 의미 없지 않을까 생각할 수 있다. 옳은 생각이다. 다른 시스템에서 JSON 데이터 포맷으로 데이터를 넘겨주지 않으면 의미 없다. 하지만 그 배경에는 머리말에서 언급했듯이 웹의 비약적인 발전이 뒷받침한다. 불과 10년 전만 하더라도 웹은 HTML, CSS, JavaScript의 조합으로 이루어진 결과물에 불과했다. 하지만 JavaScript의 설계가 심플한 덕분에 자유도 높은 느슨한 코딩이 가능했고, 그에 따라 다양한 결과물을 양산하기에 이르렀다. 지금의 Webpack, ReAct, Angular, Vue 등 웹 개발환경이 탄생하게 된 배경이 자유도 높은 JavaScript의 영향이다. 영역을 점점 넓히고 있는 JavaScript는 브라우저를 등에 업고 다양한 분야에 영향력을 과시하고 있다. 이러한 상황에서 다른 시스템은 JavaScript의 대표 데이터 포맷인 JSON을 지원하지 않을 수 없게 되었다. 모든 웹이 JSON을 표준 데이터 포맷으로 사용하고 있기 때문에 무시할 수 없을 지경이다.

JSON 구조

  위에서 설명한 개념으로 JSON을 바라보면 조금 색다르게 보일 수 있다. 단순한 데이터로써 접근하지 않고 객체 관점으로 접근하게 된다면 매우 효율적인 프로그램이 가능하다. 아래의 예제는 JSON 객체를 이해하기에 충분한 예제를 첨부한다. 객채 관점으로 아래의 데이터를 읽어보면, JSON 객체는 squadName, homeTown, formed, secretBase, active 변수와 members 객체를 포함한다. 이어서 members 객체는 name, age, secret, secretIdentity 변수와 powers 객체를 포함하며, 또다시 powers 객체는 Million tonne punch, Damage resistance, Superhuman reflexes 프로퍼티를 포함하는 구조다. members 객체는 배열구조로 다수의 객체를 포함한다.

{
    "squadName": "Super hero squad",
    "homeTown": "Metro City",
    "formed": 2016,
    "secretBase": "Super tower",
    "active": true,
    "members": [
        {
            "name": "Molecule Man",
            "age": 29,
            "secretIdentity": "Dan Jukes",
            "powers": [
                "Radiation resistance",
                "Turning tiny",
                "Radiation blast"
            ]
        },
        {
            "name": "Madame Uppercut",
            "age": 39,
            "secretIdentity": "Jane Wilson",
            "powers": [
                "Million tonne punch",
                "Damage resistance",
                "Superhuman reflexes"
            ]
        },
        {
            "name": "Eternal Flame",
            "age": 1000000,
            "secretIdentity": "Unknown",
            "powers": [
                "Immortality",
                "Heat Immunity",
                "Inferno",
                "Teleportation",
                "Interdimensional travel"
            ]
        }
    ]
}

  이제 JSON의 구조를 읽어 내려가는데 어려움이 없을 것으로 생각된다. 크게 어려운 부분도 없다. 제공되는 라이브러리에 따라 조금씩 다르겠지만 JSON은 점/브래킷 표현법으로 데이터에 접근하는 것이 기본적인 개념이다. 위에서 설명한 JSON을 Wookoa라는 객체에 저장했다고 가정한 뒤 아래와 같이 데이터에 접근할 수 있다.

Wookoa.squadName
Wookoa['formed']

  또한 하위 JSON 객체 내 하위 객체 데이터에 접근하려면, 프로퍼티 이름과 배열의 인덱스를 통해 간단하게 접근할 수 있다. 인덱스는 다른 프로그래밍 언어와 동일하게 0부터 시작한다. 아래의 예제는 각각 Turning tiny, Superhuman reflexes 문자열을 가리킨다.

Wookoa['members'][0]['powers'][1] // Turning tiny
Wookoa['members'][1]['powers'][2] // Superhuman reflexes

  여기까지 설명한 내용을 잘 따라왔다면 JSON 구조의 개념을 이해하는데 충분하다. JSON 탄생의 배경과 구조를 이해했다면 개발 환경에서 지원되는 라이브러리에 알맞게 사용할 수 있다.

꼬리말

  본 포스팅에서는 JSON의 배경과 구조에 대해서만 설명했다. 다음에 이어질 포스팅에서는 C# 개발환경에서 JSON을 다루기 위한 Newtonsoft 및 .NET Core 라이브러리에 대해서 설명한다. 과하다 싶을 정도로 장황하게 설명한 부분이 없지 않지만 필히 짚고 넘어갔으면 해서 굳이 세 개의 포스팅으로 나뉘어 설명하니 이해해 주었으면 한다. 상단의 도움이 될만한 포스팅 영역에 다음에 설명할 포스팅을 소개했으니 참고 바란다.

인기있는 글

소중한 댓글 (0)