# PK 의사결정하기
### 문제
- Auto Increment PK의 보안 취약성과 분산 시스템 제약
- 고유 식별자 선택에 따른 성능 영향 평가 필요
### 식별자 비교
- **Auto Increment**: 편리하고 빠르지만 보안 취약, 분산 시스템 제약
- **UUID**: 보안 우수, 분산 시스템 친화적이나 정렬 불가, 성능 저하
- **ULID**: UUID의 장점 + 정렬 가능(타임스탬프 활용)
### 성능 테스트 결과
- BIGINT PK(ID) 조회: 가장 빠름(평균 7,404ms)
- ULID 조회: 준수한 성능(평균 8,510ms)
- UUID 조회: 가장 느림(평균 10,055ms)
- UUID를 PK로 사용 시 성능 더욱 저하(평균 18,135ms)
### 최종 선택
**- 내부 PK: BIGINT(Auto Increment)
- 외부 노출 ID: ULID**
- 이유: 보안성 확보하면서 적절한 성능 유지
### ULID 라이브러리
- Java 기반 라이브러리 선택(huxi/sulky)
- 코틀린 라이브러리(kULID)가 더 빠르나 안정성 이유로 Java 라이브러리 채택
진행 디바이스: RAM 16G / CPU 10 CORE
성능 테스트를 진행하면서, 고유식별자에 따른 탐색 속도를 비교하고 싶어졌다.
현재는 Auto Increment로 되어 있기 때문에 클러스터드된 PK 호출을 통해 해당 회원이 누구인지 찾아내는 것이 빠를 수 있지만,
외부에서 호출하는 키를 변경했을 때에도 같은 성능을 보일지가 궁금했던 것이다.
또한 보안적인 측면에서도 시퀀셜한 PK 노출은 염려가 되었다.