안녕, 미래의 PostgreSQL 고수들! 오늘 주제는 아마도 프로그래밍에서 제일 중요한 스킬 중 하나인 실수 피하기에 관한 거야. 사실 실수를 완전히 피할 순 없지, 특히 SQL을 이제 막 배우기 시작했다면 더더욱. 하지만 흔한 실수들은 금방 익힐 수 있어. 이건 마치 모서리 많은 방을 어둠 속에서 걷는 거랑 비슷해: 몇 번 부딪히고 나면 뭐가 어디 있는지 알게 되지. 내가 테이블 만들고 수정할 때 "날카로운 모서리" 피해가는 법 알려줄게.
실수 1: 데이터 타입 잘못 고르기
데이터 타입 다루는 건 자물쇠에 맞는 열쇠 고르는 거랑 비슷해. 잘못된 "열쇠"인 데이터 타입을 쓰면 테이블이 제대로 동작 안 하거나 비효율적이 될 수 있어.
실수 예시:
전화번호 저장하려고 컬럼을 만들 때 습관적으로 INTEGER 타입을 고른다고 해보자. 숫자니까 그럴듯해 보이지만, INTEGER는 이런 데이터에 안 맞아:
- 0으로 시작하는 경우 (
0123456789가 그냥123456789로 됨). - "+"나 공백 같은 문자 포함하는 경우.
-- 잘못된 예:
CREATE TABLE customers (
id SERIAL PRIMARY KEY,
phone_number INTEGER -- 오잉
);
-- 올바른 예:
CREATE TABLE customers (
id SERIAL PRIMARY KEY,
phone_number VARCHAR(15) -- 모든 형식의 번호 저장 가능
);
어떻게 피하지?
저장할 데이터의 특성을 잘 생각하고 타입을 골라. 헷갈리면 PostgreSQL 공식 데이터 타입 문서 참고해봐.
실수 2: NOT NULL, CHECK, UNIQUE 제약조건 무시하기
제약조건은 데이터 무결성 지켜주는 역할을 해. 이걸 빼먹으면, 테이블에 없어야 할 빈 값들이 들어가서 난장판이 될 수 있어.
실수 예시: 학생 정보 저장하는 테이블을 만들면서 이름이랑 나이가 필수라는 걸 깜빡했다고 해보자.
-- 잘못된 예:
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name VARCHAR(100),
age INTEGER
);
INSERT INTO students (name, age) VALUES (NULL, NULL); -- 어라, 이게 뭐야?!
올바른 예:
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL, -- 이름은 필수
age INTEGER CHECK (age > 0) -- 나이는 양수여야 함
);
어떻게 피하지?
필수 필드는 항상 제약조건을 걸어줘. 이건 일종의 "안전장치"라서 문제 있는 데이터가 들어오는 걸 막아줘.
실수 3: 유니크 문제
가끔 유니크해야 하는 컬럼에 UNIQUE 제약조건을 안 걸고 넘어갈 때가 있어. 그러면 중복 데이터가 생기지.
실수 예시: 이메일 주소 저장하는 테이블을 만들면서 UNIQUE를 빼먹었다고 해보자.
-- 잘못된 예:
CREATE TABLE users (
id SERIAL PRIMARY KEY,
email VARCHAR(100)
);
INSERT INTO users (email) VALUES ('user@example.com');
INSERT INTO users (email) VALUES ('user@example.com'); -- 이미 있는 이메일이야!
올바른 예:
CREATE TABLE users (
id SERIAL PRIMARY KEY,
email VARCHAR(100) UNIQUE -- 유니크한 이메일
);
어떻게 피하지?
값이 유니크해야 한다면 꼭 UNIQUE를 추가해. 좀 더 유연하게 하고 싶으면 CONSTRAINT에 이름을 붙여서 제약조건을 구분할 수도 있어:
CREATE TABLE users (
id SERIAL PRIMARY KEY,
email VARCHAR(100),
CONSTRAINT unique_email UNIQUE (email)
);
실수 4: 테이블 수정(ALTER TABLE)할 때 실수
ALTER TABLE 쓸 때는 특히 조심해야 해, 이미 데이터가 들어가 있는 경우엔 더더욱. 예를 들어, 컬럼에 허용되는 값 신경 안 쓰고 제약조건을 추가하면 기존 데이터 때문에 에러가 날 수 있어.
실수 예시: 이미 존재하는 컬럼에 NOT NULL 제약조건을 추가하려고 하는데, 그 컬럼에 NULL 값이 들어가 있으면?
-- 잘못된 예:
ALTER TABLE students ALTER COLUMN name SET NOT NULL; -- 에러!
테이블에 이미 NULL 값이 있으면 PostgreSQL이 제약조건 추가를 허락하지 않아.
어떻게 해야 하지?
제약조건 추가 전에 데이터가 조건에 맞는지 꼭 확인해. 예를 들면:
UPDATE students SET name = 'Unknown' WHERE name IS NULL;
ALTER TABLE students ALTER COLUMN name SET NOT NULL;
실수 5: 확인 없이 테이블이나 데이터 삭제하기
DROP TABLE로 테이블을 지우거나 DELETE로 데이터를 지우는 건 되돌릴 수 없는 행동이야. 그래서 삭제 전에 꼭 뭘 지우는지 확인해야 해.
실수 예시:
DROP TABLE courses; -- 어, 이 테이블 아니었는데!
어떻게 피하지?
psql에서 \dt 명령어로 테이블 목록을 확인하고, 진짜 지울 테이블이 맞는지 체크해.
아니면 DROP TABLE IF EXISTS를 써서 없는 테이블 지우려다 에러나는 걸 막을 수도 있어:
DROP TABLE IF EXISTS courses;
실수 6: 임시 테이블 관련 문제
임시 테이블은 세션이 끝나면 사라져. 세션 끝난 뒤에 임시 테이블을 쓰려고 하면 에러가 나지.
실수 예시:
CREATE TEMP TABLE temp_students (
id SERIAL PRIMARY KEY,
name VARCHAR(100)
);
-- 세션 끝내고 나서...
SELECT * FROM temp_students; -- 에러: 테이블이 더 이상 없어!
어떻게 피하지?
세션 사이에 써야 하는 임시 데이터는 일반 테이블에 저장하거나, 임시 테이블은 한 세션 안에서만 쓴다는 걸 문서로 남겨둬.
실수 7: 테스트할 때 제약조건 깜빡하기
개발할 때 "나중에 제약조건 추가하지 뭐" 하고 넘어가다가, 실제로는 "나중"이 영영 안 올 때가 많아.
실수 예시:
CREATE TABLE test_table (
id SERIAL PRIMARY KEY,
name VARCHAR(50)
);
-- 데이터 삽입:
INSERT INTO test_table (name) VALUES ('Duplicate Name');
INSERT INTO test_table (name) VALUES ('Duplicate Name'); -- 문제 시작...
어떻게 피하지?
테스트할 때도 처음부터 제약조건을 걸어서 테이블을 만들어:
CREATE TABLE test_table (
id SERIAL PRIMARY KEY,
name VARCHAR(50) UNIQUE -- 두통 예방!
);
GO TO FULL VERSION