MySQL 데이터 import 시 겪은 모든 시행착오에 대하여

·2023년 5월 31일
0

집어넣는 데이터는 맥북 m1 환경에서, 받는 곳은 우분투 서버 mysql 8.0.22 버전을 도커 컨테이너로 실행하는 환경입니다. import 시에는 workbench의 import 마법사를 사용하였습니다. 초보 개발자이기에 간혹 올바르지 못한 부분이 있을 수 있습니다.

왜 이러한 작업이 진행되게 되었는가?

빅데이터 프로젝트를 진행한 적이 있다. 당시, 축제 관련 데이터 및 맛집, 숙소, 문화시설 등에 대한 데이터를 모두 사용하고 있는 db에 옮기는 작업을 진행해야 하는데, 이를 재배포하려니 데이터가 없다!

0. 사전 준비 상황

다행히 이전에 윈도우에서 셀레니움을 통해 필요한 데이터를 excel 파일로 확보해둔 상황이다. 단 API를 통해 확보한 원본데이터이며, db에 호환되도록 어느정도 변화작업이 필요했다.

1. csv를 통한 시도

검색 시 가장 많이 사용하는 방법이라길래 시도해보았다. 결과부터 말하자면 내가 가진 m1 환경에서는 불가능했다. 운영체제별 사용하는 문자 코드가 달라서 나타난 문제라고 예상하고 있다.

왜냐면, window에서 만든 파일을 mac에서 csv로 변경하니 파일이 몽땅 깨졌기 때문이다.

2. csv 포맷 변경

구글링 결과, 운영체제간 글자 깨짐 문제는 utf-8로 설정하면 해결할 수 있었다. MySQL Workbench의 데이터 import 마법사의 경우, 현재 형성된 schema의 column과 csv의 column을 서로 매핑하는 작업이 진행된다.

단,나의 경우 결과를 반영했다는 알림은 왔으나 정작 db에 반영된 데이터는 없는 문제가 발생했다.

3. column 항목 변경 설정 시도 (대문자 포함)

매칭 시 column이 다른 경우 반영되지 않는다는 사례를 찾은 후, csv의 column을 db와 동일하게 모두 바꾸어주었다. 변경하는 김에, 필요하지 않은 데이터는 삭제하고 인덱싱을 위한 id 값을 추가하는 작업을 같이 진행해주었다.

후에 알게 된 사실이지만, Workbench는 import 시 column간 매핑에서 동일한 항목이 존재하는 경우 자동으로 매핑을 하는 기능을 가지고 있다. 단 mac의 경우 글자가 영어인 경우, 맨 첫글자는 무조건 대문자로 만들기 때문에 column 값 변경시 조심하자.

한글자만 달라도 매핑이 되지 않더라. (대소문자 포함)

단 column 자동 매칭만 적용되었을 뿐 이번 시행착오에서도 결과가 시행착오 2. 와 동일한 결과가 나오며, DB에 데이터를 반영하는 것에는 실패했다.

4. 일부만 반영해보기.

혹시 일부 column 항목이 실패하여 기존에 반영이 가능한 데이터까지 전부 안되는 거 일수도 있다고 추측을 했는데, 아니나 다를까 일부 column 만 넣은 경우에는 정상적으로 반영이 되었다!

단, workbench에서 어떤 항목이 문제인지는 알려주지 않기 때문에, 일일히 하나하나 column 항목을 체크해보면 반영시키고 지우는 과정을 반복하며 어느항목에서 문제가 일어나는 지를 찾았다.

5. json을 통한 시도

나와 동일한 문제를 가진 사람이 csv를 json으로 변환하여 db에 import 했더니 성공적으로 되었다는 사례를 스택오버플로우를 통해 보았다.

csv를 json으로 변경하는 작업은 구글링을 해보니 웹 사이트에 지원해주는 곳이 있어서 망설임없이 사용했다.

https://www.convertcsv.com/csv-to-json.htm

json으로 변환후 import한 결과는 일부 실패했던 column 항목이 추가적으로 반영되었다. 실패한 column들은 소수점을 가진 double 형태와 날짜 형태의 column 이었다.

6. new Date 문제 개선 시도

API에서 가져온 날짜 값은 년,월,일 형태로 되어있었다. 모든 날짜 값을 변경하여 시도해본 결과, yyyy.mm.dd hh:mm:ss 형식이 가장 실패가 적고 잘 반영이 되었다.

7. double 문제 개선 시도

double의 경우는 경도, 위도를 반영하는 값이기 때문에, 소수점을 누락시키거나, Integer로 바꾸기 어려운 상황이었다. 해결방법은 의외였는데, 소수점 전체를 문자열 형태로 변환하니 정상적으로 반영되었다.

해당 column을 해결하는 것을 포함하여 모든 데이터를 MySQL 컨테이너에 정상적으로 반영할 수 있었다.

profile
새로운 것에 관심이 많고, 프로젝트 설계 및 최적화를 좋아합니다.

0개의 댓글