포스트

RDB 와 대리키

RDB 와 대리키

JPA 를 쓰다보면 습관처럼 다음과 같은 코드를 작성하고는 합니다.

1
2
3
4
5
@Id
@GeneratedValue
private Long id;

어떤 엔티티에 대한 식별자(PK) 로 대리키를 생성해서 사용하는 전략입니다. 그러면 왜 엔티티가 기본으로 가지고 있는 키를 사용하는 것이 아니라 대리키의 사용을 권장할까요?

RDB 내의 키의 종류

데이터 모델링에서 db 테이블의 키를 선택할 때 고려해야 할 다음과 같은 2개의 기본 원칙이 존재합니다.

  1. 최소성 (Minimality):
  • 최소성은 데이터베이스의 키가 최소한의 속성(열)을 포함해야 한다는 원칙입니다.
  • 즉, 필요 이상으로 많은 열을 포함하지 않고 키를 정의해야 합니다.
  • 불필요한 열을 포함하면 인덱스의 크기가 증가하고 쿼리의 성능이 저하될 수 있습니다.
  • 예를 들어, 주문 테이블에서 주문 번호만으로 주문을 유일하게 식별할 수 있다면 고객 정보나 주문 상세 내역을 추가로 키로 사용할 필요가 없습니다.
  1. 유일성 (Uniqueness):
  • 유일성은 키가 각 행을 고유하게 식별해야 한다는 원칙입니다.
  • 즉, 동일한 키 값이 두 개 이상의 행에 나타나서는 안 됩니다.
  • 이를 위해서는 키로 선택된 속성의 값이 유일하게 식별할 수 있는지 확인해야 합니다.
  • 주로 고유 식별자(Primary Key)가 이 원칙을 충족시키며, 보조 키(Secondary Key)들도 가능한 한 유일해야 합니다.

이 중 유일성 만을 만족하는 속성의 조합을 슈퍼키라고 부르고, 2개의 기본 원칙을 만족하는 DB 내의 키를 후보키라고 부릅니다.
이러한 후보키 중에서 선택된 키를 기본키라고 하며, 선택되지 않은 키를 대체키라고 합니다.

대리키를 사용하는 이유

만약 고객이라는 테이블이 존재한다면 고객 고유 아이디를 기본키로 사용할 수 있을 것 같습니다. 그럼에도 불구하고 왜 대리키를 사용할까요? 다음과 같은 4가지의 이유가 존재합니다.

  1. 간소화된 식별: 일부 엔티티는 자연키(자체적인 고유 식별자)를 가질 수 있지만, 이러한 자연키가 복합적이거나 긴 경우가 있습니다. 이러한 경우에는 대리키를 사용하여 데이터베이스 관리를 더 간단하게 만들 수 있습니다. 예를 들어, 주민등록번호 같은 복잡한 자연키 대신 간단한 숫자로 구성된 대리키를 사용할 수 있습니다.
  2. 변경 가능성 관리: 자연키는 종종 외부 시스템에서 제공되는 경우가 많습니다. 그러나 이러한 자연키는 데이터의 변경이나 업데이트에 취약할 수 있습니다. 예를 들어, 사람의 이름이나 신용 카드 번호가 변경될 수 있습니다. 이에 반해 대리키는 데이터베이스에 고유하게 생성되므로 외부 데이터의 변경에 영향을 받지 않습니다.
  3. 보안 및 개인정보 보호: 일부 자연키는 민감한 정보일 수 있습니다. 예를 들어, 소셜 보안 번호나 신용 카드 번호는 개인 정보로 간주될 수 있습니다. 이러한 경우에는 대리키를 사용하여 민감한 정보의 노출을 최소화할 수 있습니다. api 호출에 사용자의 주민번호가 노출되면 안되겠죠?
  4. 인덱스 성능: 대리키는 일반적으로 자연키보다 짧은 길이를 가지며, 숫자 또는 짧은 문자열로 구성될 수 있습니다. 이는 대리키를 사용할 때 인덱스의 크기를 줄여 성능을 향상시킬 수 있는 장점을 제공합니다.

대리키 사용의 단점

물론, 기술에는 항상 장단점이 존재합니다. 대리키를 사용하면 발생할 수 있는 단점은 다음과 같은 5가지가 있습니다.

  1. 의미 손실: 대리키는 종종 단순히 일련번호나 무작위로 생성된 값으로 구성됩니다. 이는 데이터의 의미나 의도를 반영하지 않을 수 있습니다. 때로는 데이터의 의미가 중요한 경우에 대리키를 사용함으로써 의미 손실이 발생할 수 있습니다.
  2. 데이터 무결성 위험: 대리키는 일반적으로 데이터베이스 시스템에 의해 자동으로 생성되므로, 데이터베이스 외부에서 제어하기 어렵습니다. 이로 인해 데이터의 무결성을 유지하는 데 어려움이 있을 수 있습니다. 특히, 데이터의 중복 또는 누락으로 인한 문제가 발생할 수 있습니다.
  3. 성능 저하: 대리키를 사용하면 추가적인 인덱스 작업이 필요할 수 있습니다. 또한, 대리키를 기반으로 한 조인 연산 등의 작업에서 성능 저하가 발생할 수 있습니다. 특히, 대규모 데이터베이스에서 이러한 성능 저하가 더욱 두드러질 수 있습니다.
  4. 고유성 충돌 가능성: 대리키는 보통 시스템이 자동으로 생성하기 때문에, 서로 다른 시스템이나 환경에서 데이터 충돌이 발생할 수 있습니다. 예를 들어, 분산 시스템에서 서로 다른 서버가 동일한 값의 대리키를 생성할 수 있습니다.
  5. 보안 위험: 대리키는 일반적으로 예측이 어렵고, 외부로부터 추측하기 어려운 값을 가질 수 있습니다. 그러나 안전한 난수 생성 기법을 사용하지 않는 경우 예측 가능성이 있을 수 있으며, 이로 인해 보안 위험이 발생할 수 있습니다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.