본문 바로가기
Web

[JavaScript]자바스크립트로 중복없는 쿠폰번호 생성(3)_예외처리

by 다봄이 2020. 8. 6.

예외 처리 (1) 생성하는 쿠폰 번호가 중복되는가

recur:
for (let i = 0; i < count; i++) {
    //쿠폰 번호가 중복되는지 검사
    if (map.has(hex) === false) { //해당 key가 map 객체 안에 없다면
    ...
    }
    else { //해당 key가 map 객체 안에 이미 있다면
        console.log('코드 중복 발생!');
    }
}

예외 처리 (2) 해당 쿠폰 번호가 이미 db에 등록되어 있는가

쿠폰 번호를 생성하면 db에 등록해야 하는데, 혹시라도 중복이 발생할 가능성이 (아주 적지만) 존재한다(CRC encoding도 해시이기 때문에 거의 없긴 하다).

따라서 db를 쿼리하여 해당 쿠폰 번호가 등록되어 있는지 비교한 후, 등록되어 있지 않은 신규 번호일 경우에만 db에 등록하도록 하였다.

recur:
for (let i = 0; i < count; i++) {
let dup = await couponRef.child(_key).once('value'); //이미 있는 key인지 확인하기 위해 db쿼리

if (dup.val()) {
   console.log('db 중복 발생!!!');
   i--; //해당 쿠폰 생성 카운트 폐기
   continue recur;
  }
else {
   map.set(_key, amount); //map 객체에 8비트 쿠폰번호를 key, 쿠폰금액을 value로 집어넣음.
   await couponRef.child(_key).set({ //쿠폰번호를 db의 key로 등록
 ...
   })
 }
}

recur이라는 이름의 레이블을 붙여 예외 발생 시 처음으로 돌아가 쿠폰 생성부터 다시 작업하도록 하였다.

다만 label의 특성 상 continue 혹은 break를 만났을 때 전달받은 레이블의 위치로 돌아가도 카운트는 그대로 진행되기 때문에 예외 발생 시 카운트는 폐기하는 꼼수를 썼다.


중복 처리 과정에서, 모듈화를 간단하게 하기 위해 처음엔 입력받은 개수만큼 쿠폰을 생성하고 맵에 저장한 후, 맵을 이용하여 db 중복 처리를 하도록 만들었다. 중복이 발생했을 경우 재귀를 사용하여 예외 처리를 하려 했는데, 파라미터가 달라져야 하는 문제 등 처리가 까다로웠다.

따라서 아예 처음부터 쿠폰 번호를 생성하고, db에 등록된 번호인지 비교한 후 db에 등록되지 않은 신규 번호라면 바로 등록하도록 처리했더니 코드는 안 깔끔해 보이지만 훨씬 간단하게 처리할 수 있었다.

예외 처리 (3) 쿠폰 번호가 7자리일 경우

CRC encoding은 XOR과 shift를 통해 이루어지는 비트 연산이다. CRC32는 기본적으로 아웃풋이 8비트이지만 경우에 따라 7비트가 출력되기도 한다.

입력 받을 쿠폰 번호의 자릿수가 8자리인데 내 쿠폰 번호는 7자리라면 참 난감할 것이다..

인코딩 결과가 7비트일 경우 앞자리에 0을 넣어 비트 수를 맞춰 주었다.

//7자리 코드에 대한 예외 처리
if(hex.length != 8){
    let add = '0';
    _key = add.concat(hex);
}
map.set(_key, amount); //map 객체에 8비트 쿠폰번호를 key, 쿠폰금액을 value로 집어넣음.
})


이렇게 매우매우매우 꼼수가 많은 쿠폰 번호 생성과 테스트까지 완료할 수 있었다.

댓글