오늘 포스팅은 FK 를 공부해보겠다
FK 외래키란 무엇이냐.
한 테이블의 필드 중 다른 테이블의 행을 식별할 수 있는 키다. 간단히 말하자면 두 테이블을 연결해주는 연결고리다
FK를 사용하는 이유는 데이터의 꼬임을 방지하기 위함인데,
1. 존재하지 않는 데이터를 방지하고
2. 부모 테이블에서 자식 테이블이 참조하고 있는 데이터를 삭제하려고 할때 이를 막거나 함께 지우도록 설정할 수 있다
즉, 데이터의 무결성을 유지하기 위함이다
예시를 보자
예를들어, USER 테이블이 있고 USER_DEATIL 테이블이 있다고 가정해보자
USER 테이블의 PK인 user_id를 USER_DETAIL에서 참조하고 있다.
만약 누군가 USER_DETAIL 테이블에 user_id 10001 을 넣으려고 한다면,
DB에서 "USER 테이블에는 user_id 10001이 없는데?!" 라면 오류를 뱉을거다
이렇게 외래키는 데이터를 지켜준다
FK의 주요 옵션
FK를 설정할 때(테이블 구조 잡을 때), 부모 데이터가 변하면 자식 데이터를 어떻게 할지 결정할 수 있다
CASCADE - 부모를 지우거나 수정하면 자식도 함께 지워지거나 수정됨
SET NULL - 부모를 지우면 자식의 FK 값을 NULL로 변경
RESTRICT(기본) - 자식이 하나라도 남아있으면 부모를 지울 수 없게 함
위 옵션은 CREATE TABLE 하거나 ALTER TABLE 할 때 FK를 정의하는 부분 뒤에 작성해주면 된다
*생각해봐야 할 부분
FK 주요 옵션 중 SET NULL을 주목해보자
부모를 지우면 자식의 FK 값을 NULL로 변경하는 옵션인데 자식 테이블에서 FK인 필드가 PK로도 사용되고 있을 수 있다
하지만 PK는 절대 NULL이 들어올 수 없다
자식 테이블에서 FK가 PK의 역할까지 하고 있다면 ON DELETE SET NULL 옵션은 사용할 수 없다
위와같은 경우, 부모가 삭제되었을 때 자식 데이터도 의미가 없어져서 NULL로 바꾸려는거면
SET NULL 대신 CASCADE를 사용하여 자식테이블의 데이터도 날리자
만약 부모 테이블의 데이터는 지워져도 자식 테이블의 데이터는 남겨야 한다면 비식별 관계로 변경하여 FK를 PK에서 분리해야한다
----------------------------------------------------------------2026.01.20 외래키의 장단점 추가
FK의 장단점을 살펴보자
먼저 장점으로는 데이터 무결성을 보장해준다는 것이다.
위 글에 담긴 예시처럼 데이터의 논리적인 오류를 DB 레벨에서 막아준다.
또한 CASSADE와 RESTRICT와 같은 FK 옵션들을 사용하여 데이터 간의 불일치(Orphan Data) 발생을 방지한다
단점은 데이터 무결성 보장을 위해 데이터 삽입, 수정, 삭제가 일어날 때 자식, 부모 테이블을 매번 확인한다.
이는 데이터 양이 많아지면 성능저하(오버헤드)를 발생시킨다
또한 여러 테이블을 복잡하게 FK로 얽혀 있을 경우, 데드락이 발생할 확률이 높아진다.
그렇다면 위 장단점을 가지고 있는 FK를 실무에선 어떻게 사용해야할까를 또 고민해보자
대용량 트래픽 서비스를 제공해야 한다면, 테이블 간 복잡한 FK 연결보단 서비스 단에서 검증하는 방식이 더 적절할 것 같다.
반면 데이터 한건 한건의 오류가 치명적인 서비스일 때는,
예를들어 금융이나 결제 같은 민감한 서비스에서는 성능저하가 좀 생기더라도 FK를 써줘야 한다.
'개발노트' 카테고리의 다른 글
| [공부]Java에서 Static은 왜 객체없이 실행될까 ? (0) | 2026.02.06 |
|---|---|
| [공부] WebSocket과 SSE (0) | 2026.01.16 |
| [공부] DDL & DML & DCL (0) | 2026.01.14 |
| [공부]데이터 정규화 (0) | 2026.01.08 |
| Yarn Berry (0) | 2025.05.30 |
댓글