개발 공부를 하면서 외래키를 지양하라는 글을 봤다.
학교수업 및 다양한 강의에서 외래키를 사용하라는 내용은 많았다. 하지만 인프런에서 강의를 듣다가 외래키를 "지양"하라는 내용은 처음 봤기 때문에 관련된 많은 내용을 찾아보고 아래와 같이 정리했다.
외래키를 지양하라는 내용의 핵심은 아래와 같다.
- 외래키 없이도 조인을 걸 수 있다.
- Insert, Update, Delete 작업시 락 경합을 유도하고 성능을 저하시킴
위 글은 DBA가 작성한 내용이다.
위 글은 답변이 조금 갈린다. 외래키를 사용하지 않으면 결국은 데이터 정합성이 맞지 않는다는 의견과 안 쓰는 게 성능상의 이점이 있다는 내용이다.
외래키는 조인을 걸 때 사용하는데 외래키 없어도 조인을 걸 수 있고, 외래키 설정 때문에 DB락으로 성능저하가 발생한다는 게 주된 요지다. 그렇다면 외래키를 지양한다는 건 외래키를 아예 사용하지 않는다는 걸까? 자연스럽게 몇 가지 의문이 들었다.
- 외래키를 지양한다면 PK 값을 다른 테이블에 넣으면서 그 값으로 조인을 사용하는 건가?
- 외래키를 지양했을 때 성능상의 이점은 알겠는데 결국 데이터 정합성 부분에서 문제가 발생한다. RDB에서 데이터 정합성이 깨지면 사용하는 의미가 없을 텐데?
- 외래키를 안 쓸 경우 JPA에서 ManyToOne 같은 어노테이션도 사용하지 않는건가?그리고 해당 주장에 대해 반박하는 아래의 링크도 있는데 이 의견은 어떠한가? https://gdsc-university-of-seoul.github.io/foreign-key/
내가 이해한 바로는 외래키를 지양하라는 건 외래키처럼 사용하지만 외래키 설정을 하지 않는 것이다. 그렇기 때문에 1번 질문에 대한 대답은 O이고 ManyToOne같은 어노테이션도 사용 가능하다.
데이터 정합성 vs 성능
외래키 지양에서 가장 큰 논지는 위 두 가지다. RDB에서 데이터 정합성이 맞춰지지 않는다면 사용할 이유가 없고, 반대로 기능을 개발해야 하는데 외래키 설정 때문에 벌어지는 수많은 문제를 해결하느라 기능개발이 늦어지면 주객전도라는 내용이다.
나의 생각
이상 vs 현실의 싸움이다. 실제로 우리 회사도 PK키를 다른 테이블에 조인조건으로 사용하지만 따로 외래키 설정은 없기도 하고 토이프로젝트를 할 때 수정할 때마다 외래키 설정 때문에 스트레스를 좀 받았다. 데이터 정합성의 경우 애플리케이션단에서 최대한 정합성을 보장하고, 필요하다면 정합성 검증 솔루션을 사용해서 검증하면 되지 않을까?? 실제로 DBA가 있고 규모가 큰 조직에서 외래키를 사용하지 않는 경우가 많다고 한다.
해당 글뿐만 아니라 대부분의 글에서 DBA는 외래키를 지양하라고 한다. 데이터 정합성보다 성능을 중점으로 보는 건가? 왜 그럴까? 서비스를 운영하다가 예상치 못한 DB락 및 Cascade 때문에 문제가 생길 수 있으니 미연에 방지하기 위해 성능을 중점으로 보는건가? 결국 외래키를 쓰는 것보다 안 쓰는 게 장애가 날 확률이 낮아서 그렇지 않을까??라는 생각을 해본다.