csv 파일로 더미데이터 만들기

zwundzwzig·2022년 9월 25일
0

[javascript]

목록 보기
9/13
post-thumbnail

드디어 본격적인 팀프로젝트가 시작됐고, 모델링한 데이터베이스 공간을 더미데이터로 채우는 과정을 진행해봤다.

이런 과정을 진행한 이유는, 프론트엔드와 본격적인 통신을 하기 전 사이트에 적합한 데이터를 임의로 작성해 POSTMAN을 통해 작업하기 위해 그랬다.

1. 임의의 데이터 작성

우선, 구글 스프레드 시트를 활용해 mysql 상 하나의 테이블 마다 해당 시트에 데이터를 직접 구성했다. 우리 조는 망고플레이트를 클론 코딩하기 때문에 그에 적합한 데이터를 작성했다.

2. vscode로 다운로드해 배열로 만들기

csv 파일로 다운로드해서 vscode 상에서 각각의 배열로 만드는 작업을 진행했다.

우선, vscode에서 csv 파일을 읽기 위해서 nodeJS 모듈인 fs로 해당 파일을 참조하기로 했다.

그래서 각각의 파일들의 경로와 인코딩 방식을 인자에 담아 각각의 파일들을 변수에 담았다.

csv 파일 내 모든 데이터는 쉼표로 구분돼 있기 때문에 쉼표를 활용해 각각의 데이터를 구분지을 수 있겠다고 생각했다.


참고로 데이터들의 구분을 위해서 사용한 배열 메소드는 split이 유일하다!

우선 csv 데이터에서 각각의 row를 구분 짓기 위해 배열로 나누고, 그것을 rows 라는 변수에 담았으며 각각의 column 값은 각각 관리하기 위해 다시 split(",") 을 사용해 header라는 변수에 담았다.

그리고 for문 안 row라는 변수에 각각의 rows를 다시 배열로 나눠 row라는 변수에 담았고, 최종적으로 storeArray라는 빈 배열에 모든 데이터들이 객체 형식으로 들어가게끔 로직을 구현했다.

3. 로컬 db에 연결해 더미데이터 구축하기

이제 각각의 테이블마다 배열 안 객체 형식으로 데이터를 확보할 수 있기 때문에, 이것을 내 로컬 데이터베이스 공간에 넣어주기만 하면 된다!

우선 typeorm 모듈을 불러오고 내 .env 파일 역시 연결해주면 모든 준비는 끝이다!

앞서 변수화한 fs 모듈로 읽은 csv 파일을 csvToJSON 함수에 인자에 넣어 또 다시 변수화한다. 이런 방식으로 설정한 변수들 중 store라는 변수를 활용하겠다!

이제 내 로컬 데이터베이스 공간에 해당 변수들을 넣는 작업을 진행할 거고, createStore라는 함수 표현식을 생성했다.

이대로 for 문을 돌면서 배열 안에 각각의 데이터 객체들은 내 로컬 데이터베이스 공간에서 각각의 row로써 자리할 것이다.

4. (최후의 난관이던) 모든 테이블 함수를 한 번에 내 로컬 데이터베이스에 넣어버리기!

그렇게 모든 테이블을 만드는 함수를 구축했다! 그러나 마지막 문제가 생겼다!


이처럼 모든 함수를 한번에 실행하면, 각각의 테이블마다 하나씩 row가 insert될텐데, 그렇게 된다면 fkey를 통해 참조하는 데이터들은 자신의 참조값을 갖지 못해 에러를 발생시킨다.

(그래서 처음엔 함수를 순서대로 하나씩 켜서 실행시켰다 끄고 다음 꺼 키고 끄고 반복...했다... )

하지만, 누군가 그랬다. 개발자는 귀찮음을 지양하고 그런 반복적인 작업들을 보다 편리하게 바꿀 수 있어야 한다고!

그래서 모든 함수를 하나의 함수 block에 담고 온갖 방법을 시도하다.. 결국 성공했다.

지난 번 정리했던 async-await를 활용했다. 모든 함수들을 start라는 함수에 넣었고, async-await 문법을 기입했다.

일단, 모든 테이블 함수를 호출하기 전에, 내 로컬 데이터베이스를 initialize해 데이터를 받을 준비를 하게 했다.

그리고 await 문법을 통해 각각의 함수들이 차례로 실행되고 동기적으로 이전 함수가 종료되어야 다음 함수가 실행되는, 내가 처음에 구상했던 방식 그대로 호출됐다! 결국 이후로는 6개의 테이블을 위해 node를 여러번 껐다 켰다 할 필요가 없어졌다!!

정리 : 현업에 가서도 이런 식으로 로컬에서 임의의 데이터를 만들어보고 직접 데이터베이스를 구축하기도 한다고 한다. 상당히 값진 경험을 했다!

profile
개발이란?

0개의 댓글