2019년 03월 19일 12시 06분
초당 약 50여개를 insert하는 시스템을 구축하고 있다. 0.1초에 5개를 디비에 입력한다. 데이터는 간단하게 4개의 문자열 형식이다.
그 중 컬럼 A + C는 중복이 될 수 없다. A에 '고기' B에 '강남'이면 동일한 데이터가 들어갈 수 없는 것이다. 즉 복합 고유키 설정이다.
나는 모델에 벨리데이션을 줘서 해당 규칙을 유니크로 만들었다.
> validates: A, uniqeness: { scope: C }
아니 근데 계속해서 중복값이 들어온다. 여러가지 방법으로 분석한 결과, 놀랍게도 시분초까지 완벽하게 일치하는 데이터가 중복 입력 되었다. 해당 row는 id값만 달랐다.
나는 이쯤에서 레일즈의 벨리데이션이 완벽하게 자신을 수행하지 못한다는 가정을 세웠다.
그래서 DB에 직접 복합 유니크 키 설정을 했다. 아니나 다를까 insert중에 중복 오류가 발생한다. 벨리데이션이 놀고 있다는 의미였다.
레일즈 소스단에서 내가 한 방법은
1. 벨리데이션 설정
2. create전에 한번 더 테이블을 조회헤서 중복 값 예외 처리
하지만 위의 코드는 중복 데이터를 저언혀 처리하지 못하고 있었다. 그래서 추가 로직을 구현했다.
아래와 같은 방법을 사용했다.
1. 먼저 DB에 해당 테이블 컬럼에 고유키를 설정한다.
2. Create 부분을 begin -rescue로 랩핑 한다.
3. 예외 처리를 한다. 데이터베이스 중복 에러는 rescue ActiveRecord::RecordNotUnique로 들어간다.
잘된다 끝!
Tag : 개발 루비 온 레일즈 유니크 중복 벨리데이션
공유하기