중복되지 않는 문자열 ID 생성하는 전략 및 코드 예시 (랜덤 문자열로 자동증가 효과 구현하기)Java2025. 3. 12. 14:45
Table of Contents
반응형
많은 서비스 개발자들이 DB의 기본 기능인 auto_increment
를 통해 손쉽게 숫자형 ID를 생성하여 사용하고 있었습니다. 그러나 DynamoDB나 특정 환경에서는 연속적 숫자(auto_increment)를 제공하지 않아 문제가 발생합니다.
그리고 이러한 상황에서 무작위(alphanumeric) 문자열을 ID로 쓰면서 중복을 방지하는 로직이 필요합니다.
이 글에서는 Java 코드로 중복 방지를 위한 간단한 알고리즘과 실제 DB 연동 예시를 소개합니다.
📌 이런 요구 사항에서 유용한 해결 방법:
- 알파벳 대소문자 및 숫자로 2자리부터 시작하여 중복되지 않을 때까지 값을 만들어냅니다.
- 자리수가 모두 소진(2자리 문자열의 모든 조합이 사용된 경우)되면 3자리, 4자리 등으로 점진적으로 증가합니다.
💡 알고리즘 원리
- 처음에는 문자열 2자리로 생성합니다.
- 생성할 때 중복이 있으면 다시 생성 시도합니다. (DB 조회를 통해 중복 체크)
- 만약 가능한 모든 조합이 소진됐으면, 문자열 길이를 하나씩 늘려 나갑니다.
- 중복되지 않은 문자열이 생성될 때까지 위 과정을 반복합니다.
🚧 Java 코드 예시 (풀 소스코드)
👉 UniqueIdGenerator.java 클래스 예시 코드
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
/**
* 무작위 문자열 생성 및 DB 중복 체크로 자리수를 자동 증가시키는 예시
*/
public class UniqueIdGenerator {
private static final String CHARACTERS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
private static final int INITIAL_LENGTH = 2;
private Random random = new Random();
// 임시 저장소(DB 대신 사용, 실제는 DB로 변경 필수)
private Set<String> dbMockSet = new HashSet<>();
// 무작위 문자열 생성 로직
private String generateRandomString(int length) {
StringBuilder builder = new StringBuilder();
for (int i = 0; i < length; i++) {
builder.append(CHARACTERS.charAt(random.nextInt(CHARACTERS.length())));
}
return builder.toString();
}
// DB를 통한 중복 체크 로직 (실제 사용 시 DB에서 중복 체크 수행)
private boolean isDuplicated(String idString) {
return dbMockSet.contains(idString);
}
// 고유한 ID 생성 및 DB 저장
public String getUniqueId() {
int currentLength = 2; // 2자리부터 시작해서 점차 늘림
while (true) {
long possibleCount = (long) Math.pow(CHARACTERS.length(), currentLength);
if (dbMockSet.size() >= possibleCount) {
// 현재 자릿수의 모든 값이 이미 소진된 경우, 자릿수 1 증가
currentLength++;
continue;
}
String candidateId = generateRandomString(currentLength);
if (!isDuplicated(candidateId)) {
dbMockSet.add(candidateId); // 실제 DB에는 여기서 insert 로직이 들어가야 합니다.
return candidate;
}
}
}
// Mock 데이터베이스를 위한 임시 Set(실제DB 구현으로 변경 필요)
private Random random = new Random();
private Set<String> dbMockSet = new HashSet<>();
// 실제 사용 테스트 메인 메소드
public static void main(String[] args) {
UniqueIdGenerator idGenerator = new UniqueIdGenerator();
// 15개의 id 값을 생성하여 출력 테스트
for(int i=0; i<10; i++) {
String uniqueId = generator.getUniqueId();
System.out.println("생성된 고유 ID: " + uniqueId);
}
}
}
⚙️ 실제 DB연동 예시 (JDBC/MySQL)
실제 MySQL DB를 사용한 중복체크와 저장 예시입니다:
중복체크 메소드 (JDBC prepared statement 사용):
private boolean isDuplicated(Connection conn, String candidateId) throws SQLException {
String sql = "SELECT COUNT(*) FROM your_table WHERE id_column = ?";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, candidateId);
try (ResultSet rs = pstmt.executeQuery()) {
return rs.next() && rs.getInt(1) > 0;
}
}
}
DB 저장 메소드 예시:
private void saveUniqueId(Connection conn, String uniqueId) throws SQLException {
String sql = "INSERT INTO your_table (id_column) VALUES (?)";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, uniqueId);
pstmt.executeUpdate();
}
}
🚧 성능 주의사항 및 권장사항
이 방식의 문제점은 문자열 자리수가 작은 경우(2자리, 3자리)는 금방 모든 조합을 사용하게 되므로 자릿수가 증가하면서 중복체크를 위한 DB조회가 많아져 성능저하가 나타날 수 있다는 점입니다. 다음과 같은 예시:
자릿수 | 가능한 경우의 수 |
---|---|
2자리 | 62² = 3,844개 |
3자리 | 62³ = 238,328개 |
4자리 | 62⁴ = 14,776,336개 |
- 처음부터 자리수를 최소 4자리 이상 여유 있게 설정하는 것이 안전합니다. | |
- DB는 중복체크 컬럼(id컬럼)에 반드시 인덱스를 생성하여 조회 성능을 개선해야 합니다. |
📌 요약 - 이 방식을 선택할 때 주의사항 다시 한번 체크!
- 자리수를 작게 잡으면 성능 이슈가 발생 가능 → 시작 자리수는 최소 3자리 이상 추천
- 반드시 중복체크를 위한 DB컬럼에 인덱스 설정!
- 순수 Log기록, 분석목적이라면 DynamoDB 보다는 S3/Athena 같은 비용 효율적인 솔루션도 고려!
위 내용으로 안전하고 효율적으로 중복되지 않은 랜덤 문자열을 관리하는 방법을 소개해 드렸습니다. 실제 환경에 따라 더욱 심도 있는 테스트와 최적화를 권장합니다. 이 글이 딱 필요한 곳에 도움되었기를 바랍니다.
이상으로 [Java & DynamoDB/MySQL] 랜덤 스트링을 중복 체크하여 자리수를 증가시키는 예제를 마치겠습니다.
반응형
@위피M :: ChatGPT로 여는 새로운 세상!!
ChatGPT, 블록체인, 자바, 맥북, 인터넷, 컴퓨터 정보를 공유합니다.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!