DB에서 PK 할당 방식에 대해서 알아보자!

Breeze·2021년 11월 17일
0

Backend 개발 일지

목록 보기
2/7

안녕하세요. 행복이팀의 귀여운 막내 수빈수입니다. 데이터베이스에 데이터를 저장할 때 기본 키를 어떤 방식으로 할당하면 좋을지에 대해서 알아보는 시간을 가져봅시다 🙂

AUTO_INCREMENT

기본적으로 django는 기본키인 id 값을 따로 모델에 명시하지 않아도 자동으로 부여해주는 AUTO_INCREMENT 전략을 사용하고 있다. 이는 데이터를 INSERT 할 때마다 1씩 증가하면서 PK를 부여하는 방식이다.

1) 장점

  • 삽입과 정렬이 빠르기 때문에 성능이 비교적 뛰어나다.
  • 공간차지를 덜 하기 때문에 메모리 측면에서 좋다.

2) 단점

  • 분산형 시스템에서 문제가 발생한다.
    • 여러 데이터베이스를 사용하면 동일하게 1, 2, 3, 4, 5, 6... 이런 식으로 증가하는 PK를 가지게 된다. 따라서 중복키(Duplicate Key)가 발생하고, 이에 따라서 데이터 일관성에 문제가 생길 수 있다.
  • 보안상으로 문제가 발생할 수 있다.
    • AUTO_INCREMENT 전략은 키를 예측하기가 쉬워진다. 따라서 SQL injection 공격 등에 취약하게 된다.
  • PK를 DB에 INSERT한 이후에 인식할 수 있다.
    • 이것 때문에 UUID를 대체키로 많이 사용하는 것 같다.

UUID

그렇다면 AUTO_INCREMENT 이외의 전략에는 뭐가 있을까? UUID라고 불리는 전략이 가장 보편적으로 쓰이는 방식이다. UUID는 Universally Unique ID 의 약자이다. 128비트의 데이터로 완전히 unique하다고 보장은 못하지만 충돌할 가능성이 굉장히(거의 없을 정도로) 낮은 전략이라고 볼 수 있다.

파이썬에서도 import uuid 만으로 간단하게 만들 수 있기 때문에 추후에 다른 프로젝트 할 일이 생긴다면 다들 한 번씩 시도해보는 것도 좋을 것 같다.

[Python]파이썬 UUID(GUID) 만들기

UUID에는 버전이 여러개가 있는데 각각은 무엇을 기준으로 랜덤하게 UUID를 생성하느냐에 따라 차이가 있다.

1) 단점

  • BINARY(16)나, VARCHAR 자료형을 써야한다.
    • 따라서 INT 타입을 쓰는 AUTO_INCREMENT 전략보다 메모리를 더 많이 차지하게 되고, 서버에서 UUID를 생성해야하므로 INSERT 할 때 시간이 더 걸린다는 단점을 가지고 있다.

결론

우리는 다중 DB를 사용하지 않고 MySQL 하나만을 사용하는 프로젝트를 진행하고 있다. 따라서 분산형 시스템에서의 문제가 발생하지 않을 것이라는 생각이 든다. 보안상으로 좀 취약할 수는 있지만 정식 서비스가 아니고 학습을 위한 프로젝트이기 때문에 이 부분은 가볍게 넘어가도 좋겠다는 생각을 했다. 이러한 이유로 인해서 우리는 AUTO_INCREMENT 전략을 선택했다 😎

참고자료

MySQL AUTO_INCREMENT의 문제점

profile
약속 관리 서비스 breeze의 개발 일지입니다.

0개의 댓글