MySQL 데이터베이스(DB)에 배열 넣기 (feat. JSON)

일반적으로 배열의 값을  데이터베이스(DB)에 넣기 보다는, 별도의 테이블에 저장하고, 해당 테이블과 원래 테이블 간의 관계를 생성합니다. 즉 정규화를 하는 것인데 이를 통해 배열 요소의 개별 검색, 수정, 추가가 용이해지는 장점이 있지만, 배열의 크기가 크거나 굳이 정규화를 하지 않아도 될 경우에도 정규화를 하게 되면 성능 문제가 발생할 수 있습니다.

때문에 배열 그대로 테이블에 집어넣는 방법에 대해서 알아보도록 하겠습니다.


문자열로 저장하는 방법

`배열 자료형`을 `문자열`로 변환하고, 그대로 테이블에 문자열 컬럼으로 저장해버리는 방법입니다.

배열을 넣을 때는 문자열로 변환하여 저장하고, 가져올 때는 문자열을 불러와 파싱하여 배열 자료형으로 만들어 사용하면 됩니다.

1) org.json 라이브러리

의존성 추가

dependencies {
    implementation 'org.json:json:20200518'
}

코드

// 배열 ➔ JSON 문자열
JSONArray jsonArray = new JSONArray(arrayData);   // arrayData:  {"1", "2", "3", "4", "5"}
String jsonString = jsonArray.toString();         // jsonString: ["1", "2", "3", "4", "5"]

// JSON 문자열 ➔ 배열
JSONArray jsonArray = new JSONArray(jsonString);
String[] arrayData = new String[jsonArray.length()];
for (int i = 0; i < jsonArray.length(); i++) {
    arrayData[i] = jsonArray.getString(i);
}

org.json 라이브러리에서는 JSONObject는 map, JSONArray는 vector 처럼 쓰면 된다 생각하면 됩니다.

 

참고. JSON 형식으로 만드는 예제
public class TEST {
   public static void main(String[] args) throws JSONException {
      JSONArray array = new JSONArray();
      array.put("apple");
      array.put("banana");
      array.put("orange");
      
      JSONObject obj = new JSONObject();
      obj.put("fruits", array);
      
      System.out.println(obj);  // {"fruits":["apple", "banana", "orange"]}
   }
}​

 

2) com.fasterxml.jackson 라이브러리

코드

List<String> array = new ArrayList<>();

// 배열 ➔ JSON 문자열
ObjectMapper objectMapper = new ObjectMapper();
String jsonString = objectMapper.writeValueAsString(array);  // jsonString: ["1", "2", "3", "4", "5"]

// JSON 문자열 ➔ 배열
ObjectMapper objectMapper = new ObjectMapper();
String[] arrayData = objectMapper.readValue(jsonString, String[].class);

 

JSON 배열로 바꾸는 방법은 위와 같은 라이브러리 말고도 Gson 라이브러리 등도 있습니다.


JSON 형식으로 저장하는 방법

MySQL Ver.5.7.8 / MariaDB Ver.10.2 이상에서는 JSON 데이터 유형을 지원합니다. 배열을 JSON 형식으로 저장하면 배열의 구조와 값을 유지할 수 있습니다. 물론 배열 뿐만 아니라 객체도 지원합니다.

CREATE TABLE demo_table (
  id INT PRIMARY KEY,
  json_data JSON
);

INSERT INTO demo_table (id, json_data) VALUES (1, '[1, 2, 3, 4, 5]');
INSERT INTO demo_table (id, json_data) VALUES (1, json_object('Name', 'Kim', 'Age', '30'));

위 코드는 단순히 JSON 형식의 데이터를 선언하고 테이블에 값을 INSERT하는 예시입니다. 자세한 JSON 형식 사용 방법은 추후에 포스팅하도록 하겠습니다.