신용카드는 팍팍 긁어야 제맛
전에 생성형 AI에 대한 글을 썼는데, 예상은 했지만 좋지 못한 흥행률(?)을 기록했다. 절치부심하고 이번엔 좀 더 재밌는 전공 글을 써볼까 한다. 그런데 애초에 차는 엑셀 밟으면 나가고 브레이크 밟으면 서는 거잖아~ 정도에 만족하는 사람들에게 엔진이 어떻고 완전연소가 어떻고 얘기해 봐야 아무 감흥이 없는 것도 정답인지라 쓰기가 두렵지만 일단 진행시켜 본다. (다음 글은 진짜 엔진 관련 글이 될거같은데 어떡하지)
살면서 한 번쯤은 신용카드를 잃어버린 적이 있었을 거다. 도난을 당한 게 확실하거나 해서 신용카드 회사에 전화를 걸어서 카드를 정지해 본 경험도 있었을 거다. 전 세계의 신용카드가 몇십 억 장은 될 건데 어떻게 소매점 단말기들은 내 카드가 정지되었는지 그렇게 빨리 알고 결제를 멈출 수 있을까?
그거 신용카드 회사 서버 갔다 오면 되는 거잖아요~라고 쉽게 얘기할 수 있을 거다. 계산하기 쉽게 신용카드 회사 서버의 신용카드 번호가 10억 개 저장되어 있다고 치자. 내 카드가 정지된 카드인지 확인하려면 서버가 10억 개 카드번호를 일일이 대조해 보면 된다. 당연히 그러면 엄청나게 많은 시간이 걸린다. 에이~ 도서관에서 책을 찾을 때도 하나하나 찾지 않고 색인(index)화 해서 찾잖아요.
맞다. 책을 우리가 쉽게 찾을 수 있는 이유는, 누가 이미 책을 가지런히 책장에 꽂아놓았기 때문이다. 정확하게 말하면 단순히 가지런히가 아니라 하나의 기준으로 정리를 해 놓았기 때문이다. 가나다 순이 되었건, 도서분야가 되었건 하나의 기준으로 정리를 한 뒤에 그 안에서 더 세분화하고 세분화하고... 이렇게 정리해 놓으면 찾는 순서가 빨라진다. 그런데 단순히 숫자라면? 정렬(sorting)을 하면 된다.
정렬을 해 놓으면 뭔가 찾는 게 빨라지겠다는 감은 잡히는데, 도대체 어떻게 빨리 찾는다는 걸까? 카드번호는 4자리씩 끊어서 16자리이니까 0000~9999까지 만개 방을 만들고, 또 그 뒤에 만개 방을 만들고... 하면 빨리 찾을 수는 있겠으나 공간낭비가 심하다. 가나다 순으로 동일한 도서관 공간을 만들어놨지만 ㅌ,ㅋ 같은 곳은 책이 몇 개 없는 상황에 책장 공간만 크게 차지하는 상황을 상상해면 쉽다.
여기에서 로그의 마법이 펼쳐진다. 숫자를 반씩 잘라서 찾아가면 된다. 예를 들면 1부터 10000까지의 숫자를 하나 상상하라고 한 뒤에 이 숫자를 찾아가는 방법인데, 내가 7이라는 숫자를 상상했다 치자. 첫 번째 질문은 이렇게 시작하면 된다. 5천보다 큰가요 작은가요? 작다고 하면 반을 나눠 2500보다 큰가요 작은가요? 이렇게 물어보면 된다. 그래가지고 언제 찾아요~ 싶지만, 14번 만에 정확하게 찾을 수 있다. 놀랍게도 10억 개의 숫자는 30번 만에 찾을 수 있다. 믿기지 않으면 직접 해보면 된다.
전 세계의 신용카드는 이런 식으로 전문용어로 블랙리스트와 화이트리스트를 번갈아가며 검색하면서 소매점 단말기와 통신을 하고 카드결제 프로세스를 진행한다. 더 정확하게는 데이터베이스 솔루션 안에 인덱스를 걸어놓은 필드를 검색하는 거고, 방금 위에 설명한 단순한 바이너리 서치보다 더 정교하고 빠른 알고리즘을 사용하여 검색을 수행한다.
됐고, 귀여운 춘식이 체크카드가 왠지 귀여우니까 더 빨리 결제되는 거잖아요.라고 하면 그 말도 맞다. 아무리 비싸고 정교한 커피머신을 사용해서 커피맛이 끝내주는 커피전문점이 있다고 해도, 우리는 가장 이쁜 알바언니의 커피전문점을 찾아가니까 말이다. 회사 앞에 커피 주면서 나한테 항상 웃어주던 커피집 알바언냐에게 위의 이진검색을 설명해주고 와~ 어떻게 그런 것도 아세요? 라고 칭찬받는 상상을.... 아 자괴감 느끼니까 여기까지만 하도록 하자.