본문 바로가기

Ruby on Rails

레일즈 벨리데이션은 믿을 수 있는가?


초당 50개를 insert하는 시스템을 구축하고 있다. 0.1초에 5개를 insert한다.

데이터는 간단한데 4개의 String  데이터를 insert하는 구조이다.


컬럼 A + C 중복 없다.

A고기” C강남이면 다시 테이블에 A 고기고 C 강남인 데이터가 들어갈 없다.

복합 고유키 설정이다.


나는 모델에 벨리데이션을 줘서 해당 규칙을 유니크로 만들었다.


> validates : A , uniqueness: { scope: :C }


아니 근데 왠걸…..계속해서 중복값이 들어온다. 여러가지 방안으로 분석한 결과,

놀랍게도 시분초까지 완벽하게 일치하는 데이터 여러개가 입력되었다. 해당 row id값만 달랐다.



레일즈의 벨리데이션은 완벽하게 자신의 역할을 수행하지 못한다는 의심이 들었다.


그래서 DB 직접 복합 유니크 설정을 했다. 아니나 다를까 insert 하다가 중복 오류가 발생한다.

벨리데이션이 놀고있음을 확인했다.



레일즈 소스단에서 내가 방법

  1. 벨리데이션 설정
  2. create전에 한번 테이블 조회해서 값이 있으면 예외처리


하지만 위의 조건을 우습게 DB에는 중복 데이터가 마구마구 쌓이고 있었다.

그렇다고 데이터의 무결성을 타협할 생각이 없어서 귀찮지만 추가 로직을 구현했다



0.1초에 5개씩 완전 고유하게 데이터 쌓기


  1. 먼저 DB 접속해서 해당 테이블에 고유키를 설정한다.
  2. create 부분을 begin - rescue 감싼다.
  3. 예외 처리를 한다. 데이터베이스 중복 에러는 rescue ActiveRecord::RecordNotUnique 이와 같다



된다. 굿!