* JSON 문서 데이터베이스란 무엇인가?
다양한 JSON 데이터 유형 및 JSON 지향 쿼리 언어를 사용하는 애플리케이션은 JSON 문서 데이터베이스에 저장된 데이터와 상호작용할 수 있습니다. JSON 문서 데이터베이스는 JSON을 위한 고유 지원을 제공합니다.
JSON 문서 데이터베이스를 정의하는 특성은 다음과 같습니다:
JSON 문서 데이터베이스는 JSON 문서로 저장 및 쿼리하기 위해 설계된 비관계형 데이터베이스입니다.
데이터베이스 내 JSON 데이터는 텍스트를 기반으로 하지만, 해당 텍스트는 BLOB, VARCHAR2, CLOB, 21c의 이진 JSON 데이터 유형을 사용해 저장될 수 있습니다.
데이터베이스에 저장된 JSON 데이터에 액세스하는 일은 OCI, .NET, JDBC를 사용한 다른 데이터베이스 데이터에 액세스하는 것과 유사합니다.
JSON 문서 데이터베이스 내의 JSON 데이터는 데이터를 정의할 스키마 없이도 저장, 인덱싱, 쿼리될 수 있습니다.
출처 - https://www.oracle.com/kr/database/what-is-json/
*34. JSON 형식으로 입출력하기
JavaScript Object Notation : 자바스크립트 객체 리터럴 문법을 모방하여 만든 텍스트 파일 포맷
Json 포맷 특징
반드시 큰 따옴표를 이용해서 프로퍼티 이름을 적어야 한다.
문자열은 반드시 큰따옴표 사용.
* JSON 인코딩/디코딩
* gradle로 의존성을 주입하여 GSON 패키지 설치하는 방법
https://central.sonatype.com/artifact/com.google.code.gson/gson/2.10.1
위의 홈페이지에 접속하여 최신버전의 implementation 을 확인하고
패키지를 설치하려는 프로젝트의 app 폴더 아래에 있는
build.gradle (빌드 스크립트 파일)에 의존성을 주입한다.
해당 프로젝트가 있는 app의 상위 경로로 이동하여 gradle eclipse 를 통해서 패키지를 설치해준다.
eclipse를 확인해보니 Gson 패키지가 성공적으로 import 되었다.
* JSON과 GSON 프로퍼티명과 필드명이 다른 경우
프로퍼티명과 필드명이 다른 경우
GSON 은 필드명을 사용하고
Jackson은 프로퍼티명을 사용한다.
예를 들어서,
Member 클래스의 필드명이 nm 이고 프로퍼티명이 name 이라면
Gson은 nm 을,
Jackson은 name 을 출력하게 된다.
* Gson 에서 날짜 다루기
빌더 패턴을 사용
* GOF의 Builder 패턴
객체 생성 과정이 복잡하기 때문에 빌더 패턴을 사용한 것이다 .
* JsonSerializer.serialize()
* default 메서드의 목적
default autoShutdown()
↑
추상메서드가 아니라 구현된 메서드이기 때문에
기존 구현체에 영향을 주지 않는다.
단점!
추상메서드가 아니기때문에 구현을 강제할 수 없다 → 인터페이스 문법의 존재 이유가 없어진다.
* JSON배열 -> Collection 객체
Exam0322.
typeToken 객체를 준비하고
그 토큰을 통해서 Type 구현체를 얻는다.
그리고 그 객체에 저장된 정보를 바탕으로 JSON 문자열로부터
컬렉션 객체를 만든다.
Exam0321.
json 문자와 그 타입을 파라미터로 받는 형식이다.
* 다른 객체를 품고 있는 경우
package com.eomcs.openapi.json.gson;
Exam0621,
Exam 0622 차이
첫 번째 코드:
Gson gson = new GsonBuilder()
.registerTypeAdapter(Member.class, new JsonDeserializer<Member>() {
// JsonDeserializer 구현 및 메서드 오버라이딩 작성
})
.create();
registerTypeAdapter() 메서드를 사용하여 Member 클래스에 대한 JsonDeserializer 객체를 등록합니다.
익명 내부 클래스를 사용하여 JsonDeserializer 인터페이스의 구현체를 작성합니다.
JsonDeserializer 인터페이스의 메서드를 오버라이딩하여 원하는 JSON 변환 로직을 구현합니다.
GsonBuilder 객체에 등록된 JsonDeserializer를 사용하여 Gson 객체를 생성합니다.
두 번째 코드:
class MyJsonDeserializer implements JsonDeserializer<Member> {
// JsonDeserializer 구현 및 메서드 오버라이딩 작성
}
Gson gson = new GsonBuilder()
.registerTypeAdapter(Member.class, new MyJsonDeserializer())
.create();
별도의 클래스 MyJsonDeserializer를 선언하여 JsonDeserializer<Member> 인터페이스를 구현합니다.
JsonDeserializer 인터페이스의 메서드를 오버라이딩하여 원하는 JSON 변환 로직을 구현합니다.
GsonBuilder 객체에 등록된 MyJsonDeserializer 객체를 사용하여 Gson 객체를 생성합니다.
두 코드는 기능적으로는 동일합니다.
다만, 첫 번째 코드는 익명 내부 클래스를 사용하여 인터페이스의 구현체를 작성하고 등록하는 방식이고,
두 번째 코드는 별도의 클래스를 선언하여 인터페이스를 구현하고 해당 클래스의 객체를 등록하는 방식입니다. 첫 번째 코드는 간단하게 작성할 수 있지만, 로직이 복잡해지거나 재사용성이 필요한 경우에는 두 번째 코드처럼 별도의 클래스를 작성하여 사용하는 것이 더 유용할 수 있습니다.
실무에서는 JSON에서 Hashmap보다는 Param이라는 별도의 클래스를 만들어서 관리한다.
왜냐하면 Hasgmap은 데이터 형태가 원하지 않는 형식으로 map 저장되기 때문이다.
#Hashmap에 저장된 형식
#ManagerParam 방식
#ManagerParam