CSV 파일을 사용하는 이유
초기 데이터를 몇 개만 추가해야 한다면, 그냥 우리가 직접 DB 콘솔에 접속해서 하나하나 데이터를 넣거나 하면 된다. 하지만, 사실 우리가 데이터가 한두개일리가 절대 없다. 예를 들어, 공공데이터 포탈에서 데이터를 받아올 경우, 데이터가 수천, 수만건이 될 것이다. 이때, 이 데이터들을 하나씩 직접 입력하는 것은 비효율적일 뿐 아니라 시간이 많이 소요된다. 또, 만약 테이블이 통째로 삭제되는 문제가 발생한다면,수만개의 데이터를 다시 입력해야 하므로 상당한 노력이 필요하게 된다.
CSV 파일을 활용하면 이런 문제를 해결할 수 있다. 한 번에 많은 데이터를 가져와 데이터베이스에 바로 삽입할 수 있기 때문에, 대량의 데이터 처리가 필요한 경우 CSV 파일 업로드는 훨씬 더 효율적이고 안정적인 방법이 된다.
PostgreSQL CSV 파일 업로드
COPY table_name (column1, column2, column3, ...)
FROM '/path/to/file.csv'
DELIMITER ','
CSV HEADER;
PostgreSQL에서는 CSV 파일 적재를 위해서 COPY 쿼리를 사용할 수 있다. table_name은 데이터를 삽입할 테이블이고 (테이블이 이미 만들어져 있다는 전재), column들은 각 열과 매칭되는 열 이름이다. DELIMITER는 csv 파일에서 열을 구분하는 기호를 의미한다. CSV Header는 첫 줄을 데이터 적재시 무시한다는 뜻이다. 일반적으로, 첫 줄은 데이터의 이름을 표시하는 경우가 많기 때문에 제외시킨다.
그럼 예시를 하나 들어보자. 위 데이터는 내가 직접 수집한 애니메이션 데이터이다. 애니의 id, 한국어 이름, 영어 이름, 일본 이름, 제작사, 장르, 등급, 부재(검색시 사용될 이름), 포스터 url, 점수 등등이 포함되어 있다. 참고로 해당 데이터는 아래 링크에 공개해놨으니 필요하면 사용하길 바란다. (사실, 데이터 가공이 제대로 되지 않아서 질이 그렇게 좋진 않다.)
그러면 위를 기반으로 Table을 하나 만들었다고 가정해보자. (테이블 생성 쿼리는 생략)
COPY anime(mal_id, korean_name, english_name, japaneses_name, production_company, genre, themes, demographics, special, animelist_url, rating, alternate_titles, small_image_url, large_image_url, image_url, trailer_url, score, scored_by, members, year, season, favorites, episodes, anime_type, source)
FROM '/path/to/your/file.csv'
DELIMITER ','
CSV HEADER;
그럼 위와 같이 csv 파일을 읽어서 저장할 수 있다! 이렇게 DB에 우리 애니메이션 초기 데이터들을 저장할 수 있는 것이다.
참고로 MySQL은
LOAD DATA INFILE '/path/to/your/file.csv'
INTO TABLE anime_data
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS;
이런식으로 쓸 수 있다고 한다. 일단 나는 PostgreSQL를 사용하기 때문에 이 쪽으로 집중해서 글을 썼다.
쿼리는 싫은데 어떻게 하죠?
그런데, 아마 초보 개발자들은 쿼리를 쓰고 다루는 것이 익숙하지 않을 것이다. 숙련된 개발자도 사실 쿼리치는게 귀찮고 GUI로 편하게 했으면 할 것 이다. 그럴 떄는 DBBeaver라는 툴을 사용하면 더 편하게 할 수 있다. (DataGrip, PGadmin 등등 도 있지만, 범용적이며 무료인 DBBeaver로 진행한다.)
위 사이트에 접속해서 자신의 운영체제 환경에 맞게 설치를 해보자.그리고 우리 DB까지 등록을 해두자. (DB 등록은 생략합니다.)
우리가 만들어둔 테이블을 찾아서 마우스 오른쪽 클릭해보면 "데이터 가져오기"가 보인다. 이를 클릭하자.
그 다음, 우리 데이터 csv 파일을 선택하자.
우리가 Table을 칼럼까지 1행의 Header 이름들과 정확히 일치하게 만들어 놨다면 자동으로 mapping이 잘 될 것 이다. 만약에 mapping을 하지 않았다면 자동으로 1행 기준으로 칼럼을 만들어주긴 하는데, 타입을 알아서 추론해서 만들기 때문에 오류가 날 수도 있으므로 되도록이면 사전에 테이블 만들 때 정의해두도록 하자.
그 다음으로 넘어가면 이제 위와 같은 창이 뜬다. 이때, 여기서 Disable Batches를 클릭하지 않으면, 데이터 하나라도 오류가 나면 싹다 롤백이 되고 등록되지 않는다. 예를 들어, PK가 충돌이 났다던지, 데이터가 정의해둔 길이를 초고한다던지 같은 오류가 발생할 수 있다. 되도록이면 Batch를 켜두는게 좋고, 오류 나도 데이터 삽입되게 하고 싶으면 위에 Disable Batches를 체크해주도록 하자.
위와 같이 데이터가 제대로 등록된 것을 볼 수 있다. 개인적으로 이렇게 데이터 등록하는게 더 편해서 쿼리보다 해당 방식을 선호한다.
'BackEnd > DB' 카테고리의 다른 글
[DB] ElasticSearch Index 설정과 텍스트 분석 (0) | 2024.11.08 |
---|---|
[DB] Elastic Search의 기초 (9) | 2024.11.07 |
[DB] Redis, 실제 개발에서 어떻게 활용할 수 있을까? (0) | 2024.05.10 |