[SpringBoot] AUTO_INCREMENT의 문제점

지구본욱·2025년 3월 29일

1. AUTO_INCREMENT 란?

💡

MySQL에서 기본 키를 생성하는 전략
새로운 데이터 값을 insert 할 때 자동으로 키를 1씩 증가시켜준다.

2. AUTO_INCREMENT의 문제점

  1. 키 예측하기 쉬워진다.
  • 만약 경쟁 회사에서 우리 회사의 회원 수를 알기 위해서는 회원가입을 해 아이디를 만들고 url을 통해 자신의 userID만 알아내면 되기때문이다. 또한 이렇게 알아낸 userID로 SQL Injection 공격에도 취약해진다.
  1. 분산형 시스템에서 문제가 발생한다.

    실제로 규모가 있는 시스템에서는 위의 사진과 같이 웹 어플리케이션 서버가 여러 개가 있고 데이터 베이스 서버도 여러 개로 구성된 분산형 시스템으로 구성되어있다.
    만약 이 데이터베이스가 별다른 동기화가 되어있지 않다면 각각의 데이터 베이스에서 각각 insert 했을 때 키 값이 겹쳐지는 문제가 발생할 수 있다.
    ( A 데이터베이스도 유저가 가입했을 때 1,2,3,4,5 …로 증가하고
    B 데이터베이스도 유저가 가입했을 때 1,2,3,4,5 …로 증가)

3. UUID (Universally Unique ID)

UUID는 JAVA에서 자동으로 Unique한 ID를 생성해준다.

사용 예시는 아래와 같다.

@Entity
public class User {
	@Id
	@GeneratedValue
	private UUID id;

	private String email;

}

(Spring Boot 3.x + Hibernate 6.x 이상 권장)

이렇게 해서 생성된 UUID는 128비트의 고유한 값을 갖는다.

이렇게 해서 생성된 아이디의 예시는 아래와 같다.

UUID값 예시 : bb6266a8-09aa-4c90-b597-05f1cc958acd

CREATE TABLE users (
user_id CHAR(36) PRIMARY KEY,
email VARCHAR(255) UNIQUE NOT NULL,
nickname VARCHAR(50) NOT NULL,
password VARCHAR(255) NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

Table 생성은 다음과 같이 CHAR 혹은 BINARY 타입으로 받아야한다.

이렇게 되면 user_id가 고유한 128비트 값을 갖게 되어 다중 DB환경에서 일관성을 유지할 수 있게 되고 url에서 user_id가 노출된다는 점도 해결할 수 있다.

참고:
https://wjdtn7823.tistory.com/59
https://ssdragon.tistory.com/162

profile
어제보다 1cm라도 나아가는 사람 (위로)

0개의 댓글