룬 알고리즘(Luhn Algorithm) 사용하기

제이미·2024년 11월 6일
0

기타

목록 보기
1/2
post-thumbnail

카드가 유효한지 검증하려다 알게 된 룬(Luhn) 알고리즘

현재 진행 중인 토이 프로젝트에서 카드 결제 기능이 필요하다.
하지만, 실제 운영 할 사이트가 아니다보니 카드 결제 API를 연동해서 실제 요청을 할 수가 없다.

이 기능을 완성시키기 위해 어떤 걸 할 수 있을 지 생각해보니, 카드의 번호가 올바른지 검증을 하고 싶었다.

그렇게 알게 된 룬(Luhn) 알고리즘
이걸 어떻게 내 프로젝트 안에서 적용해봤는지 살펴보자!

룬 알고리즘 또는 룬 검사기법이란?

신용카드 번호나 주민등록번호 같은 숫자 코드가 올바른지 검증하는데 사용되는 알고리즘이라고 한다.

이 기법의 순서는 아래와 같다

1. 오른쪽 끝에서부터 시작
- 카드 번호의 맨 오른쪽 숫자(check digit)를 제외하고, 오른쪽에서 왼쪽으로 하나씩 순회

2. 짝수 자리 두 배 시키기
- 맨 마지막 숫자 제외, 모든 숫자를 두 배로 곱해줌(곱해준 숫자가 10 이상이면, 각 자릿수를 더해서 한 자리 숫자로 만들어 줌 또는 9를 빼서 한 자리 수로 만들어줌)

3. 모든 숫자 더하기
- 이 숫자들을 모두 더해줌

4. 10으로 나누어 떨어지는지 확인
- 최종 합계가 10으로 나누었을 때, 딱 떨어지면 유효한 카드로 판단하며 그렇지 않으면 유효하지 않은 번호로 판단함

이 과정이 코드에서 어떻게 작동하는지 확인해보자!


출처: https://www.30secondsofcode.org/js/s/luhn-check/

여기서는 과정이 위의 과정이 조금 다르다.

오른쪽에서 왼쪽으로 순회하는 과정을 아예 숫자 배열을 reverse해서 뒤집어줬다.

그 다음 shift()를 사용해 맨 첫 번째(즉, 맨 오른쪽의 마지막 숫자) 숫자를 뽑았다.

그런 다음 reduce() 메소드를 사용해 배열 내 숫자들의 합산 과정을 진행한다.
이 과정에서 인덱스가 홀수인지 짝수인지 확인하며 다른 연산을 진행하는데, 이는 짝수 자리 두 배시키는 과정이다.

이 배열을 reverse로 뒤집었으니, 여기서는 홀수 자리를 두 배 시키면 되는 것이라고 생각하겠지만, 위에서 shift()를 사용해서 배열 내 요소를 하나 제외시켰기에 그냥 짝수 인덱스에 2배를 곱한다.

그 다음, 그 인덱스의 숫자가 10이상이면 -9를 해주어 한 자리수로 만들어 합산한다.

마지막으로, 맨 오른쪽 인덱스의 숫자와 합산을 더한 다음 10으로 나누어주면 끝!

10으로 나누었을 때 검증이 되면 true, 아니면 false를 반환한다.

코드 예시의 맨 마지막을 보면, 이 함수로 저 숫자들을 검증해보는데 잘 되는 걸 확인할 수 있겠죠?

이 함수를 사용해, 내 프로젝트에서 카드 번호 검증 기능에도 사용해봤다! :)
룬 알고리즘을 통과하는 번호여야지만, 다음으로 넘어갈 수 있게 할 수 있음

profile
프론트엔드 개발하다 궁금할 때

0개의 댓글