본문 바로가기
개발노트

[공부] FK(Foreign Key)란

by 전지적진영시점 2026. 1. 15.

오늘 포스팅은 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

댓글