💡개요
사이트에 최초로 가입하는 사용자의 닉네임을 랜덤으로 생성하는 코드를 작성하고 있었다.
처음에는 내가 작성한 코드가 제대로 동작하는 것을 보고 "더 최적화할 수는 없을까?" 라는 생각이 들었다.
그래서 ChatGPT와 Google의 도움을 받아 최적화 방법을 찾기 시작했다.
이 글은 최초 코드부터 최적화 과정까지의 전체 기록을 정리한 것이다.
🔥최초 코드

처음에는 재귀 함수를 이용해 닉네임을 생성하는 코드를 작성했다.
(알고리즘 문제를 풀다 보니 온 세상이 재귀로 보이는 마법… 😵💫)
📍문제점
- DB 연결의 과도한 사용:
닉네임을 생성할 때마다 DB에 중복 확인 쿼리를 요청하기 때문에, 운이 나쁘면 중복이 발생할 때마다 DB 연결이 필요하다.
예를 들어, 100번 연속으로 중복된 닉네임이 생성되면 100번의 DB 연결이 발생한다.
- 재귀의 위험성:
재귀 호출은 스택 메모리를 사용하므로, 중복이 너무 많이 발생할 경우 StackOverflowError가 발생할 위험이 있다.
- 불안정한 구조:
닉네임 중복이 심할 때 성능이 급격히 저하될 가능성이 높다.
내가 작성했지만, 지금 보니 "엄청난 코드다..." (나쁜 의미로 😅)
이 코드의 문제를 인지하고 더 나은 방법을 찾기로 했다.
📋개선된 코드
"이건 아니다..." 싶어서 더 나은 방법을 고민했다.
검색을 통해 찾은 방법은 다음과 같다:
📍개선 방법
-
DB에 저장된 모든 닉네임을 캐시에 미리 로드
- 앱 시작 시, 데이터베이스에 저장된 모든 닉네임을 캐시에 한 번만 저장한다.
- 이후 닉네임 중복 검사는 DB 대신 캐시를 활용한다.
-
캐시에 중복 데이터 저장 및 중복 확인
- 닉네임 생성 후 중복 확인은 캐시에 저장된 데이터로만 처리한다.
- 중복이 없을 경우, 캐시에 추가 후 DB에 저장한다.
💡캐시의 장점
- DB 연결을 최소화하여 DB 부하 감소
- 중복 확인 속도가 메모리 연산(O(1))으로 빨라짐
- 많은 사용자가 동시에 닉네임을 생성해도 확장성 향상
개선된 코드

📘코드 설명
-
캐시 초기화
- 애플리케이션이 시작되면 DB에서 기존 닉네임을 조회해 캐시에 로드한다.
- 캐시로 사용하는 자료구조는 HashSet이다. (탐색 속도 O(1))
-
랜덤 닉네임 생성
Random 클래스를 사용하여 8자리 숫자를 조합하여 고유한 닉네임을 생성한다.
- 예:
사용자_84657329
-
캐시로 중복 확인
- 닉네임을 캐시에 저장된 닉네임과 비교하여 중복 여부를 확인한다.
- 중복되지 않은 경우에만 캐시에 추가 후 DB에 저장한다.
-
DB와의 연결 최소화
- 최초 캐시에 DB의 닉네임을 모두 로드했기 때문에, 닉네임 중복 검사는 캐시만 조회한다.
- 닉네임이 고유한 경우에만 DB에 새 닉네임을 저장하므로 DB 연결 수가 대폭 감소했다.
🪄결론
🔥최종 개선 사항
- DB 연결 최소화:
기존에는 중복 체크할 때마다 DB에 연결했으나, 캐시 메모리에서 즉시 확인할 수 있도록 개선했다.
- 성능 향상:
캐시에 모든 닉네임을 저장하고 관리했기 때문에 중복 확인 속도가 O(1)로 개선되었다.
또한, DB 연결 수가 줄어들어 전체적인 성능이 향상되었다.
- 캐시 데이터와 DB 데이터의 동기화 문제:
캐시 데이터와 DB 데이터의 일관성을 보장해야 한다.
새로운 닉네임을 DB에 저장할 때 트랜잭션이 롤백되면 캐시 데이터도 동기화해야 한다.
📚배운 점
-
재귀보다는 반복
- 처음에는 재귀 함수를 사용했지만, 재귀보다 반복문이 더 안전하다는 사실을 배웠다.
- 재귀 함수는 StackOverflowError를 유발할 수 있기 때문이다.
-
캐시의 중요성
- DB 대신 캐시(HashSet, Redis 등)를 사용하는 것의 중요성을 깨달았다.
- 캐시를 사용하니 DB 부하가 줄고 속도가 빨라졌다.
-
DB와 캐시의 일관성 관리
- 캐시 데이터와 DB 데이터의 불일치를 방지하려면 트랜잭션 처리가 중요하다는 것을 알게 되었다.
- DB에 닉네임을 성공적으로 저장한 후에만 캐시에 추가하는 방식으로 코드를 개선해야 한다.