작성
·
147
0
안녕하세요 토비님. 강의 정말 잘 보고 있습니다.
다름이 아니라 Auto Increment 전략을 현업에서도 자주 사용하시는지 궁금해서 문의드립니다.
Mysql에서 Auto Increment를 사용하니 bluk insert가 안되는 구조던데 문제가 있으셨던 적은 없는지 궁금합니다.
bluk insert를 jdbc template으로 구현했더니 갈레라 3중화 구조라 ID가 3씩 증가하는 문제가 있어서 곤란한 경험이 있습니다. 이럴 경우 ID 전략을 UUID나 Snowflake 이런식으로 가져가야 하는지 궁금합니다.
아니면 다른 해결 방법이 있으시다면 알려주시면 감사하겠습니다.
답변 3
2
간단히 UUID와 같이 ID 값을 직접 쓰는 방식 외에도 MySQL 8 이상에서 시퀀스 스타일의 생성기를 활용하는 방법이 있는 것으로 알고 있습니다. 이건 제가 검증을 해보지는 못해서 확실하게 답을 드리지는 못하겠네요. 시간이 되면 한번 테스트 해보고 다시 설명드려 보겠습니다. 아마 클린 스프링 강의 시리즈 중에 JPA 최적화와 관련된 주제가 있는데, 그때 좀 집중적으로 다룰 수 있을 것 같습니다.
2
안녕하세요.
MySQL에서 auto increment는 현업에서 많이 사용합니다.
다만 말씀하신 대량의 데이터를 빠르게 등록해야 할 때, 시퀀스 방식과 달리 batch insert 적용 등의 제한을 받기 때문에 최적화가 안 되는 문제가 있습니다. 이런 경우엔 auto increment 대신 id 생성 방식의 대안을 찾아야 할 수도 있습니다.
그런데 모든 테이블에 대해서 대용량의 데이터 등록이 필요한 건 아니거든요. 일반적인 시나리오에서는 트랜잭션 내에서 한 번에 몇 개씩만 등록되는 경우가 훨씬 더 많습니다. 그러니 특정한 케이스에서 발생하는 최적화 문제 때문에 auto increment 자체를 회피할 이유는 없습니다. 개발하시는 시스템의 특성과 데이터 처리 시나리오에 따라서 적절한 방식을 선택하시면 됩니다. 여러가지 면에서 트레이드 오프를 따져봐야 할 수도 있습니다.
혹시 JPA를 사용하시나요? JPA는 평균적으로 JDBC보다 10-20% 정도 성능이 떨어진다고 알려져있습니다. Spring Data JPA는 그보다도 더 느립니다. 그래도 현업에서 많이 씁니다. 장점이 더 많다고 판단되기 때문에 JPA를 선택하는 것이지요.
이유가 있다면 UUID나 다른 ID 생성 방법을 선택하시는 것은 좋습니다. 다만, 기계적으로 MySQL의 auto increment는 나쁘니까 다른 방식을 써야한다고 생각하시는 것은 곤란하지 않을까요? 그런 대안들도 장점만 있는 건 아닙니다. 문제를 잘 파악해보시고, 어느 부분을 희생하더라도 다른 면에서 더 유익을 얻는게 나은지 케이스별로 판단해보시면 좋겠습니다.
그리고 ID 생성 방식이 시스템 전체적으로 딱 한가지만 써야할 이유도 없습니다.
0
안녕하세요, 인프런 AI 인턴입니다. 노성웅님께서 Auto Increment 전략과 관련하여 문의해 주셨습니다.
MySQL의 Auto Increment는 많은 프로젝트에서 기본적으로 사용되는 ID 생성 전략 중 하나입니다. 하지만 특정 상황에서 몇 가지 제약이 따를 수 있습니다:
Bulk Insert 문제: Auto Increment를 사용하는 경우, MySQL은 개별적으로 각 레코드에 대한 ID를 생성하기 때문에 bulk insert 과정에서 비효율적일 수 있습니다. 또한, 갈레라 클러스터와 같은 환경에서는 여러 노드가 아이디를 할당하는 과정에서 빈번하게 문제가 발생할 수 있습니다. 이는 주로 서로 다른 노드가 각각 고유의 아이디 블록을 할당받아 충돌을 방지하지만, 이 과정에서 ID가 끊기는 경험을 하셨던 것이 아닐까 싶습니다. 이런 상황에서는 ID를 한 노드에 집중하여 할당하거나, 동기화 레포지토리를 통해 ID 할당 과정을 제어하는 방법도 있습니다.
ID 전략의 대안: 고유식별자로 UUID나 Snowflake와 같은 보다 복잡한 알고리즘 기반의 ID 생성 방식을 고려해볼 수 있습니다. UUID는 충돌할 가능성이 희박하며, 중앙 관리 필요가 없다는 장점이 있어 분산 시스템에서 주로 사용됩니다. Snowflake는 트위터가 개발한 분산 시스템용 ID 생성 기법으로, 시간과 노드 식별 정보를 합쳐 만들어져 효율적이고, 중복되지 않는 유니크한 ID를 제공합니다.
여기에는 링크를 통해 다른 개발자들이 유사한 상황을 해결한 사례를 참고하시길 추천드립니다:
- MySQL Auto Increment Handling in Distributed Systems
- UUID vs Auto Increment vs Snowflake for Database IDs
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
답글 감사합니다.
저도 JPA의 장점과 auto increment의 장점을 많이 느껴서 적극적으로 사용중이고 절대 나쁘다고 생각하지 않습니다. 😊
auto increment를 유지하면서 문제를 해결하려다 보니 궁금해서 여쭙게 되었습니다.
auto increment 전략을 통일 하지 않고, 적절하게 쓰는 게 방법일 수 있겠군요.
답변 정말 감사합니다!