외부 소스에서 데이터 가져오는 건 마치 팀원들 모아서 일 벌이는 거랑 비슷해. 다들 제대로 된 마음가짐(여기선 포맷!)으로 왔는지 확인해야 하거든. 업로드 파일에 작은 실수 하나만 있어도, 디버깅에 몇 시간 날리고, 쿼리 결과가 이상해지거나, 테이블 데이터가 망가질 수도 있어.
가끔 파일에 빈 줄, 쓸데없는 공백, 중복, 아니면 숫자여야 할 곳에 텍스트가 들어가 있을 수도 있어. 게다가 인코딩까지 꼬이면, 테이블이 파일 자체를 거부할 수도 있지.
이런 일 막으려면, 업로드 전이나 직후에 데이터가 제대로 됐는지 미리 체크하는 게 중요해. 지금부터 그 방법을 같이 알아보자.
데이터 구조 체크하기
- 테이블 구조랑 업로드된 데이터 비교하기
제일 먼저 해야 할 건, 데이터가 네 테이블 구조에 맞게 들어왔는지 확인하는 거야. 예를 들어, 학생 정보 저장하려고 students 테이블을 만들었다고 해보자:
CREATE TABLE students (
student_id SERIAL PRIMARY KEY,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50) NOT NULL,
birth_date DATE,
email VARCHAR(100) UNIQUE
);
이 테이블에 데이터를 넣었다면, 일단 뭐가 들어갔는지부터 확인해보자:
SELECT * FROM students;
이 쿼리 결과로 테이블에 있는 모든 레코드를 볼 수 있어. 만약 CSV 파일 구조가 테이블 구조랑 안 맞으면, 업로드할 때 에러가 바로 뜰 거야. 근데 에러가 안 떴다고 해서 데이터가 완벽하게 들어간 건 아니야.
- 데이터 타입 체크하기
PostgreSQL 함수 써서 컬럼 내용 체크해보자. 예시:
NULL 값 체크하기:
테이블에 NOT NULL 필수 필드가 있다면, 진짜로 다 채워졌는지 확인해야 해. 예를 들어:
SELECT * FROM students WHERE first_name IS NULL OR last_name IS NULL;
데이터 포맷 체크하기:
가끔 데이터가 문자열로 들어왔는데, 사실 날짜나 숫자여야 할 때가 있어. 이럴 땐 PostgreSQL 함수로 체크해봐. 예시:
SELECT * FROM students WHERE birth_date::DATE IS NULL;
이 쿼리는 birth_date 필드를 DATE 타입으로 바꿀 수 없는 레코드를 보여줄 거야.
에러 찾기
- 중복 찾기
중복된 레코드는 진짜 흔한 문제야. 예를 들어, 이메일(email)이 유니크해야 한다고 해보자. 중복 체크하려면 이렇게 쿼리해봐:
SELECT email, COUNT(*)
FROM students
GROUP BY email
HAVING COUNT(*) > 1;
이 쿼리는 중복된 email이랑 그 개수를 보여줄 거야. email 컬럼이 UNIQUE로 설정돼 있으면, 이런 데이터 업로드할 때 에러가 나.
- 잘못된 데이터 체크하기
birth_date 필드에 진짜 생년월일만 들어가야 한다면, 값이 정상 범위에 있는지 확인해야 해. 예시:
SELECT * FROM students
WHERE birth_date < '1900-01-01' OR birth_date > CURRENT_DATE;
이 쿼리는 현실적으로 말이 안 되는 생년월일을 가진 레코드를 보여줄 거야.
잘못된 데이터 다루기
문제점을 찾았으면, 이제 고쳐야지. 어떻게 하는지 보자.
- 잘못된 데이터 삭제하기
만약 이름이 비어 있는 레코드가 있다면, 이렇게 삭제할 수 있어:
DELETE FROM students
WHERE first_name IS NULL OR last_name IS NULL;
근데 데이터 삭제는 신중하게 해야 해! 중요한 정보일 수도 있으니까, 삭제 대신 업데이트하는 게 나을 수도 있어.
- 데이터 업데이트하기
누락된 데이터가 있으면, 다른 소스나 추정값으로 업데이트할 수 있어. 예시:
UPDATE students
SET email = 'unknown@example.com'
WHERE email IS NULL;
분석을 위한 데이터 시각화
- 집계 함수 사용하기
가끔 데이터 체크할 때 집계값을 보는 게 좋아. 예를 들어, 연도별로 몇 명의 학생이 태어났는지 알고 싶으면 이렇게 해봐:
SELECT EXTRACT(YEAR FROM birth_date) AS year, COUNT(*)
FROM students
GROUP BY year
ORDER BY year;
이 쿼리는 연도별 분포를 보여주고, 특정 연도에 학생이 너무 많으면 이상한 데이터가 있을 수도 있다는 신호야.
- 제약조건으로 데이터 체크하기
테이블에 설정한 제약조건에 데이터가 맞는지 확인해봐. 예시:
유니크 체크:
SELECT DISTINCT email
FROM students;
유니크 값 개수가 전체 레코드 수보다 적으면, 중복이 있다는 뜻이야.
값 범위 체크:
SELECT * FROM students
WHERE LENGTH(first_name) > 50 OR LENGTH(last_name) > 50;
이렇게 하면 학생 이름이 50자 넘는지 체크할 수 있어.
진짜 망했을 땐 어떻게 해?
가끔 데이터가 너무 엉망이면, 그냥 다시 업로드하는 게 더 나아.
테이블에서 모든 레코드 삭제:
TRUNCATE TABLE students;Python, Excel, 아니면 다른 툴로 원본 CSV 파일을 고쳐.
COPY명령어로 다시 데이터 업로드해.
실전에서 써먹기
데이터 검증 스킬은 외부 소스랑 작업할 때마다 꼭 필요해. 면접에서도, SQL로 입력 데이터 품질 체크 쿼리 짜보라고 할 수 있어 — 이거 흔한 질문이야. 실제 프로젝트에서도 마찬가지야: 클라이언트나 다른 부서에서 오는 데이터는 거의 항상 문제를 달고 오고, 네가 그걸 제일 먼저 발견해서, 버그 터지기 전에 고칠 수 있는 사람이 되는 거지.
정기적으로 데이터 체크하면 DB가 깔끔하게 유지돼 — 이건 그냥 형식적인 게 아니라, 진짜로 시간, 스트레스, 팀 전체의 노력을 아껴주는 거야. 데이터 상태를 빨리 파악할 수 있으면, PostgreSQL 마스터에 한 발 더 가까워진 거라고 보면 돼.
GO TO FULL VERSION