JSON (JavaScript Object Notation)은 문자열이다.
그냥 문자열이 아니고, 오프젝트를 표현하는 문자열이다.
그러면 오브젝를 왜 문자열로 표현해야하는가? 여기서 헷갈리지 않도록 오브젝트가 무엇인지 잠깐
짚고 넘어가자
오브젝트가 메모리상에 존재하는 어떤 자료 구조다.
public class TodoItem{
String title;
boolean done;
public TodoItem(String title, boolean done){
this.title = tittle;
this.done = done;
}
}
자바 클래스의 예로 이 클래스를 이용해 오브젝트를 생성하면 다음과 같다.
new TodoItem("myTitle",false);
이렇게 생성한 오브젝트는 메모리 상에 아마도 아래와 비슷한 형태로 존재할 것이다.
실제로 오브젝트가 메모리상에 어떻게 존재하는지는 아키텍처와 언어에 따라 다른데 메모리상의 오브젝트는
인간이 읽기 힘들다.
위의 그림처럼 애플리 케이션 1은 애플리케이션 2에 인터넷을 통해 TodoItem을 전송하려 한다.
애플리케이션1과 애플리케이션 2는 서로 언어도 다르고, 아키텍쳐도 다르다고 가정하다.
이 오브젝트를 전송하려면 애플리케이션 1과 애플리케이션 2 둘다 이해라 수 있는 형태로 오브젝트를 반환 해야한다.
이렇게 저장 또는 전송을 위해 메모리상의 오브젝트를 다른 형태로 변환하는 작업을 직렬화라고 하고, 그 반대 작업을
역직렬화 라고 한다.
그럼 이제 어떤 형태로 오브젝트틀 직렬화 할 것인가 에 대한 질문만 남는다. 이에 대한 해답이 JSON 이다.
JSON은 키-값 의 형태로 오브젝트를 표현한 문자열이다.
{
"title" : "myTitle",
"done" : false
}
TodoItem 오브젝트를 JSON으로 변환한 예다.
자바의 인스턴스 변수의 이름은 키 KEY 가 되고, 변수에 들어간 값은 값 VALUE 이 되는 것을 확인할 수 있다.
JSON에서 각 자료형을 표현하는 방법은 표 1-2와 같다.
자료형/구조 | 표현방법 |
Boolean | ture / false |
숫자 | 쌍따옴표 없는 숫자 |
문자열 | 쌍따옴표로 감산 형대 |
오브젝트 | 소괄호로 감싼 형태 |
배열 | 대괄호로 감싼 형태 |
이것을 JSON으로 확인해보자
{
"myString" : "hello", // 문자열
"number" : 10, // 숫자
"myStringArray" : [ // 문자열 배열
"abc",
"def"
],
"myObject":{ // 오브젝트
"name":"obj1"
}
}
그런데 왜 이런 형태의 문자를 다른 이름이 아니라 자바스크립트 오브젝트 노테이션이라고 부를까? 그 이유는 형식이 자바 스크립트에서 오브젝를 생성하는 형식과 같기 때문이다.
자바스크립트에서 오브젝트를 생성하는 방법은
var object = {
"title" : "myTitle",
"done" : false
};
위는 자바스크립트에서 오브젝트를 생성하는 방법의 예다. 이 문법은 자바스크립트 문법이고 JSON이 아니다.
하지만 JSON의 형태가 같다. 이렇게 자바스크립트에서 오브젝트를 생성하는 문법과 유사해 자바스크립트 오브젝트
노테이션이라는 이름이 붙었다.
이제 다시 애플리케이션 1과 애플리케이션 2의 상황으로 돌라가서 애플리케이션 1과 애플리케이션 2 는 JSON을
이용해 통신하기로 약속했다고 가정하다.
그럼 오브젝트를 JSON형태의 문자열로 변환후 HTTP요청의 바디 부분에 변환한 JSON을 넣어 요청한다.
요청을 받은 애플리케이션 2는 HTTP 요청의 바디 부분에서 JSON을 꺼내 TodoItem으로 변환해 사용할 수 있다.
브라우저 상에서 실행될 리액트 애플리케이션은 JSON을 요청 바디에 넣어 보낸다.
우리 프로젝트의 자바 백엔드 애플리케이션은 이 JSON을 바디에서 꺼내 TodoItem으로 변환한다.
이런 변환 과정은 라이브러이와 프레임워크가 대신 해준다.
프로젝트가 JSON을 이용해 자룔르 교환한다는 사실을 알아야한다.
'Spring boot 프로젝트 기록 > 기본적인 기초 공부' 카테고리의 다른 글
REST API (0) | 2021.11.23 |
---|---|
레이어드 아키텍처 (0) | 2021.11.23 |
빌드 자동화 툴 : Gradle과 라이브러리~! (0) | 2021.11.19 |
배경지식(3) - 서버란? (0) | 2021.11.16 |
배경지식(1) - HTTP (0) | 2021.11.16 |
댓글