CodeGym /행동 /SQL SELF /CSV 파일에서 데이터 가져오기: COPY 명령어 사용하기

CSV 파일에서 데이터 가져오기: COPY 명령어 사용하기

SQL SELF
레벨 23 , 레슨 1
사용 가능

안녕, 친구들! 만약 너한테 10,000줄짜리 Excel 테이블이 있고, 팀장이 이렇게 말한다고 상상해봐: "이거 데이터베이스에 좀 넣어줘!" 흠... 이걸 직접 하나씩 넣으려고 하면… SQL 실력만으론 안 되고, 휴가도 필요할 걸? 😅

다행히도 PostgreSQL에는 CSV에서 DB로 순간이동 시켜주는 명령어가 있어 — 바로 COPY야. 이건 데이터를 순식간에, 대량으로, 쓸데없는 소리 없이 넣어줘. 오늘은 COPY가 어떻게 동작하는지, 데이터를 어떻게 준비해야 하는지, 그리고 파일에 갑자기 "떠다니는 쉼표"나 이상한 문자가 있으면 어떻게 해야 하는지 알아볼 거야. 가자!

COPY 명령어 기본

COPY는 PostgreSQL에서 테이블과 파일 시스템 사이에 데이터를 옮기는 명령어야. 대량 데이터 import나 export할 때 유용하지.

COPY로 테이블에 데이터 넣는 기본 문법 예시:

COPY table_name FROM 'path/to/your/file.csv' DELIMITER ',' CSV HEADER;

주요 파라미터:

  • FROM 'path/to/your/file.csv': 네 CSV 파일 경로를 지정해.
  • DELIMITER ',': 구분자(여기선 쉼표)를 지정해.
  • CSV HEADER: CSV 파일에 헤더(첫 줄에 컬럼명)가 있다는 뜻이야.

COPY는 서버에서 바로 실행돼서, 대용량 데이터 작업할 때 엄청 빠르지.

COPY\COPY의 차이

가끔 COPY\COPY가 헷갈릴 수 있어.

  • COPY: 서버에서 실행돼. 서버에 있는 파일을 불러올 때 써.
  • \COPY: psql에서 쓸 수 있는 클라이언트 명령어야. 네 컴퓨터에서 바로 파일을 올릴 수 있어.

로컬에서 작업한다면 대부분 \COPY를 쓰게 될 거야. 이건 나중에 더 얘기할게.

COPY 사용 예시

바로 예제를 보면서 원리를 익혀보자.

1단계: 테이블 준비하기

학생 정보를 저장할 테이블을 만든다고 해보자:

CREATE TABLE students (
    student_id SERIAL PRIMARY KEY,
    first_name VARCHAR(50),
    last_name VARCHAR(50),
    date_of_birth DATE,
    grade FLOAT
);

2단계: CSV 파일 준비하기

CSV 파일 포맷이 테이블 구조랑 맞아야 해. students.csv 예시:

first_name,last_name,date_of_birth,grade
John,Doe,2001-05-15,85.5
Jane,Smith,2000-12-22,90.0
Alice,Johnson,2002-03-10,78.0
Bob,Brown,2001-08-30,NULL

주의: CSV 컬럼 순서가 테이블 컬럼 순서랑 같아야 하고, 데이터 타입도 맞아야 해(예를 들어 날짜는 YYYY-MM-DD 포맷이어야 해).

3단계: 데이터 불러오기

students.csv 파일을 students 테이블에 넣으려면 이렇게 해:

COPY students (first_name, last_name, date_of_birth, grade)
FROM '/path/to/your/students.csv'
DELIMITER ',' 
CSV HEADER;

여기서 뭐가 일어나는 거냐면?

  • 테이블 이름 students랑 데이터를 넣을 컬럼을 지정해.
  • 파일 경로는 파일이 어디 있는지 알려줘.
  • 구분자 ,는 데이터가 쉼표로 나뉜다는 뜻이야.
  • CSV HEADER는 첫 줄이 컬럼명이라는 걸 PostgreSQL에 알려줘.

결과:

명령어를 실행하면 파일의 데이터가 테이블에 들어가고, 바로 확인할 수 있어:

SELECT * FROM students;

제약사항과 특징

에러를 피하려면, 네 CSV 파일이 아래 조건을 만족하는지 확인해:

  1. 헤더 줄에 숨겨진 문자나 공백이 없어야 해.
  2. 올바른 인코딩 사용: PostgreSQL에서는 보통 UTF-8을 추천해.
  3. 구분자랑 DELIMITER 파라미터가 일치해야 해.

COPY에서 자주 나오는 에러:

데이터 구조 불일치. 예를 들어 숫자 필드에 텍스트 값을 넣으려고 하면:

ERROR: 숫자 타입에 잘못된 입력 구문: "abc"

이런 문제를 피하려면, 데이터 타입이 맞는지 꼭 확인해.

파일 경로 에러.

파일이 PostgreSQL 서버에서 접근 가능한 폴더에 없으면 이런 에러가 나와:

ERROR: 파일 "/path/to/your/file.csv"을(를) 읽으려고 했지만: Permission denied

이럴 땐 파일 권한을 제대로 설정해주면 돼.

데이터가 제대로 들어갔는지 어떻게 확인해?

데이터를 넣은 뒤엔, 잘 들어갔는지 확인하는 게 좋아. 예를 들어:

전체 행 개수 확인:

SELECT COUNT(*) FROM students;

빈 값 찾기(예를 들어 grade 필드가 NULL인 경우):

SELECT * FROM students WHERE grade IS NULL;

COPY 쓸 때 꿀팁

에러 로그 남기기. 에러를 따로 파일로 저장하고 싶으면 LOG ERRORS 파라미터를 써봐. (PostgreSQL 12+ 버전에서 지원해.)

인덱스랑 트리거 끄기.

대용량 데이터 넣을 땐 인덱스를 잠깐 꺼둘 수도 있어:

ALTER TABLE students DISABLE TRIGGER ALL;

트랜잭션 사용하기.

이렇게 하면 데이터가 "원자적으로" 들어가 — 즉, 다 들어가거나, 에러 나면 전부 롤백돼:

BEGIN;
COPY students FROM '/path/to/your/file.csv' CSV HEADER;
COMMIT;

실전에서 쓰기

COPY 명령어는 DB 관리자뿐만 아니라 개발자한테도 진짜 유용해. 예를 들어, 외부 API에서 대량 데이터를 받아오면, 일단 CSV로 저장하고 PostgreSQL에 바로 넣어서 분석을 시작할 수 있지. 아니면, 동료가 옛날 DB를 PostgreSQL로 옮겨달라고 할 때도 COPY가 완전 구세주야.

CSV 파일은 실제 프로젝트에서 진짜 자주 나와. 예를 들면:

  • 판매 통계를 분석 시스템에 올릴 때.
  • 외부 CRM에서 사용자 리스트를 가져올 때.
  • Excel에서 PostgreSQL로 데이터 옮길 때 쓸데없는 삽질 없이 바로 넣을 수 있어.

오늘은 COPY 명령어랑 친해지는 시간을 가졌어. 다음 강의에서는 데이터 넣을 테이블을 어떻게 준비하고, 구조를 어떻게 짜야 빠르고 안정적으로 동작하는지 얘기할 거야. 그때까지 겁먹지 말고 이것저것 실험해봐 — COPY는 대용량 데이터 작업에 진짜 편리한 무기니까!

2
과제
SQL SELF, 레벨 23, 레슨 1
잠금
`COPY` 명령어를 사용한 데이터 임포트
`COPY` 명령어를 사용한 데이터 임포트
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION