대머리개발자

mysql json type 본문

개발이야기/DataBase

mysql json type

대머리개발자 2024. 1. 5. 13:55
728x90

최고의 장점은

JSON은 비정형 데이터를 저장하며, 컬럼 스키마 변경 없이 새로운 필드를 추가할 수 있는 유연성을 제공합니다.

 

즉,

몽고디비처럼 사용할 수 있다

 

근데 막상 적용하려고 보니 해도 되나 싶은 마음이 들었다. 

미심쩍은 마음에 좀 더 구글링과 AI 검색s 

 

적용하는 걸로!!!

1. 99%는 조회 용도 사용하고

2. where 조건절에서 활용하지 않기 때문에

성능적인 이슈는 없을것으로 판단되었다.

 

이벤트에 대한 정보를 노출하는데 최대한 정형화하고

이벤트마다 상이한 부분은 additionalInfo로 처리할 수 있도록 모델링을 했다. 

create table if not exists Event
(
    id                      bigint                    AUTO_INCREMENT PRIMARY KEY comment 'ID',
    title                   varchar(100)                            not null comment '이름',
    introduction            varchar(300)                            not null comment '소개',
    type                    varchar(30)                             null comment '추첨 type',
    quota                   int                                     null comment '추첨 인원',
    startDt                 datetime                                not null comment '시작일',
    endDt                   datetime                                not null comment '종료일',
    additionalInfo          JSON                                    null comment '설명',
    status                  varchar(12)  default 'ACTIVE'           not null comment '',
    regDt                   datetime default current_timestamp()    not null comment '등록 일시'
)
comment '이벤트' charset = utf8mb4;

 

데이터 샘플링

{
    "title" : "작가와 온라인 줌 미팅",
    "introduction" : "작가와 비대면으로 소통할 수 있는 기회.\n딱 10분 초대합니다!",
    "type" : "weight-random",
    "quota" : 10,
    "startDt" : "2024-01-15T00:00:00",
    "endDt" : "2024-02-07T00:00:00",
    "additionalInfo" : {
      "announcementDt" : "2월 8일(목) 오후 1시",
      "announcementMethod" : "*홈페이지 공지 및 당첨자 개별 안내내",
      "eventDt" : "2월 23일(토) 오후 6시 ~ 7시(총60분)",
      "eventLocation" : "온라인 줌링크 접속속",
      "remember" : "당첨자 10분이 동시에 작가와 함께 참여합니다.\n작가 및 참가자들의 얼굴은 공개하지 않습니다.(카메라 off 상태)"
    }
}

 

Json 데이터 처리

    @Produces("application/json")
    @Post("")
    fun save(eventMap: MutableMap<String, Any>): Mono<ApiResponse> {
        val addInfo = eventMap.remove( "additionalInfo")
        val event = ModelMapper().map(eventMap, Event::class.java).apply {
            additionalInfo = Gson().toJson(addInfo) // JSON 문자열 Transfer
            // ModelMapper에서 LocalDateTime에 대한 바인딩을 지원하지 않는다고 한다. 퓨
            startDt = LocalDateTime.parse(eventMap["startDt"].toString(), DateTimeFormatter.ISO_LOCAL_DATE_TIME)
            endDt = LocalDateTime.parse(eventMap["endDt"].toString(), DateTimeFormatter.ISO_LOCAL_DATE_TIME)
        }
        return eventService.save(event).flatMap {
            getApiResponseAsMono(it)
        }
    }

 

: 애초애 객체(Event) 받아서 처리하려고 했는데 Json type이 저장될 때는 "Json 문자열"로 Insert가 되어야 했기 때문에 바인딩에 이슈가 있었다. 해서 Map으로 바인딩하고 ModelMapper를 통해서 Klass로 포팅을 했다.

 

 

 

 

## 참고

https://dev.mysql.com/doc/refman/5.7/en/json.html

 

MySQL :: MySQL 5.7 Reference Manual :: 11.5 The JSON Data Type

As of MySQL 5.7.8, MySQL supports a native JSON data type defined by RFC 7159 that enables efficient access to data in JSON (JavaScript Object Notation) documents. The JSON data type provides these advantages over storing JSON-format strings in a string co

dev.mysql.com

 

## AI에게 질문

MySQL에서 JSON 타입 컬럼을 사용하는 것은 몇 가지 장점과 단점이 있습니다

## 장점:
1. 유연성: JSON은 비정형 데이터를 저장하며, 컬럼 스키마 변경 없이 새로운 필드를 추가할 수 있는 유연성을 제공합니다.
2. 복합 데이터 타입: JSON 데이터는 배열과 중첩 개체 등 복합 데이터 타입을 표현할 수 있습니다.
3. 저장 및 조회 기능: MySQL은 JSON 데이터의 유효성을 검증하고, JSON 형식의 문서에 질의할 수 있는 기능을 제공합니다.

## 단점:
1. 성능: JSON 데이터를 인코딩/디코딩하는데 상당한 CPU 시간이 소요될 수 있습니다. 이로 인해 전반적인 데이터베이스 성능에 부정적인 영향을 미칩니다.
2. 인덱싱: JSON 필드에 인덱스를 설정할 수 있지만, 기본 데이터타입에 비해 복잡하고 성능이 떨어질 수 있습니다.
3. 공간 사용량: JSON 형식의 데이터는 같은 데이터를 표현하는데 더 많은 공간을 사용하는 경향이 있습니다.

따라서, MySQL에서 JSON 컬럼을 사용할 지 여부는 사용 사례에 따라 달라집니다. 만약 데이터의 구조가 자주 변경되거나 다양한 형태의 비정형 데이터를 처리해야하는 경우 JSON 사용이 유리할 수 있습니다.
반면, 집계나 복잡한 쿼리를 수행해야하거나, 대용량을 처리하거나, 최적의 성능이 필요한 경우에는 각 필드를 별도의 컬럼으로 저장하는 기존의 관계형 데이터 모델을 사용하는 게 더 효율적일 수 있습니다.
실제로 사용하기 전에 성능 및 저장 공간 요구사항을 철저히 평가하는 것이 중요합니다
728x90

'개발이야기 > DataBase' 카테고리의 다른 글

redisson 아직은...  (0) 2024.02.01
Mysql + R2DBC 쿼리 로그  (0) 2024.01.25
게시판 코드에서...고민s  (0) 2023.10.24
[R2DBC] 바인딩  (0) 2023.09.13
R2DBC ...불행의 시작...(2)  (0) 2023.06.09