
SOFTMOA TECHNOLOGY
행사 현장 QR 입장 확인 시스템 구축: 중복 입장과 오프라인 처리
소프트모아가 정리한 기술 기록입니다.
Contents
행사 입장권을 QR로 발급해도 현장에서 같은 화면을 여러 번 보여주거나, 다른 회차의 표를 가져오면 입장 담당자는 즉시 판단하기 어렵습니다. QR 이미지 자체를 믿기보다 행사·회차·사용 상태를 서버에서 확인하고, 한 표의 입장 처리를 한 번만 허용하는 시스템이 필요합니다. 네트워크가 끊기는 현장이라면 오프라인에서 무엇을 보장할 수 없는지도 미리 정해야 합니다.
발급 화면보다 먼저 입장 규칙을 정한다
운영자는 행사별 회차, 판매 또는 초대 수량, 입장 시작·종료 시각, 재입장 허용 여부를 관리자 화면에 입력합니다. 예를 들어 10월 15일 14시 회차 300석, 입장 가능 시간 13시 30분~14시 30분, 표당 최초 입장 1회라고 설정할 수 있습니다. 이 숫자는 예시일 뿐이며 실제 기준은 행사 운영자가 결정합니다. 결제 완료나 초대 확정 전에는 QR을 발급하지 않고, 취소된 표는 발급 이력이 남더라도 상태를 VOID로 바꿔 입장에서 제외합니다.
참가자에게는 확정된 행사명·회차·입장 위치와 QR을 함께 보여줍니다. QR에는 이름이나 연락처를 그대로 넣지 말고, 서버에서 조회할 수 있는 추측하기 어려운 표 식별값을 사용합니다. 화면 캡처로 QR을 복제하는 행위 자체는 막지 못합니다. 대신 먼저 사용된 표인지 검사해 재사용을 차단합니다. 재입장이나 동반 입장이 필요한 행사는 단순한 1회 사용 규칙에 예외를 붙이기보다 별도의 출입 횟수·인원 규칙을 먼저 모델링해야 합니다.
게이트에서 보이는 세 가지 결과
- 입장 담당자가 행사와 게이트를 선택하고 로그인한 뒤 QR을 스캔합니다. 서버는 해당 회차의 유효한 표이며 입장 시간 안에 있는지 확인하고 ISSUED를 USED로 변경합니다. 화면에는 입장 허용, 회차, 처리 시각만 필요한 만큼 표시합니다.
- 이미 USED라면 이전 처리 시각과 게이트를 보여주고 다시 통과시키지 않습니다. 다른 회차이거나 VOID, 미확정 상태면 사유를 분리해 보여줍니다. 빨간 경고 한 종류만 있으면 직원이 현장에서 잘못된 해결책을 안내하기 쉽습니다.
- 휴대폰 화면이 깨졌거나 QR 인식이 안 되면 관리자 권한으로 신청 번호를 찾아 수동 확인합니다. 이름만 같다는 이유로 통과시키지 않고 정해둔 확인 절차와 담당자·사유를 기록합니다.
동시에 두 게이트에서 같은 표를 읽을 때는 먼저 조회하고 나중에 저장하는 방식으로는 둘 다 성공할 수 있습니다. 아래는 로컬 SQLite에서 동작하는 최소 예시입니다. 조건부 UPDATE가 ISSUED인 행만 변경하고 RETURNING으로 성공한 행을 돌려줍니다. 실제 서비스에서는 무작위 토큰 관리, 행사별 권한, 입장 시간 검증과 감사 로그를 별도로 구현해야 합니다.
CREATE TABLE ticket (
ticket_id TEXT PRIMARY KEY,
event_id INTEGER NOT NULL,
status TEXT NOT NULL CHECK (status IN ('ISSUED','USED','VOID')),
checked_in_at TEXT
);
INSERT INTO ticket VALUES ('demo-A',101,'ISSUED',NULL);
UPDATE ticket SET status='USED', checked_in_at=CURRENT_TIMESTAMP
WHERE ticket_id='demo-A' AND event_id=101 AND status='ISSUED'
RETURNING ticket_id, status;
UPDATE ticket SET status='USED', checked_in_at=CURRENT_TIMESTAMP
WHERE ticket_id='demo-A' AND event_id=101 AND status='ISSUED'
RETURNING ticket_id, status;
SELECT changes() AS second_scan_updated_rows;
이 예시에서는 첫 UPDATE만 demo-A와 USED를 반환하고, 두 번째는 반환 행이 없으며 마지막 조회값은 0입니다. 반환 행이 없을 때는 무조건 '중복'이라고 표시하지 말고 미존재·다른 행사·취소·기입장 여부를 다시 조회해 알맞은 사유를 보여줘야 합니다. 동일 표에 대한 재시도 요청을 구분하려면 스캔 요청 ID와 처리 이력도 함께 설계합니다.
인터넷이 끊긴 두 게이트는 서로의 입장을 모른다
오프라인 사용을 허용하려면 행사 시작 전 각 단말에 표 목록과 규칙을 내려받고, 대기 건수와 마지막 동기화 시각을 화면에 표시해야 합니다. 같은 단말에서 두 번 스캔한 경우는 로컬에서 막을 수 있지만 서로 다른 두 단말이 동시에 오프라인이면 중복 입장을 그 자리에서 확실히 막을 수 없습니다. 재연결 뒤 서버가 충돌을 발견해도 이미 들여보낸 사람을 되돌릴 수는 없습니다. 1인 1회 입장을 엄격히 보장해야 한다면 현장 통신망을 확보하거나 오프라인일 때 한 게이트만 운영하는 식으로 운영 방침을 정하는 편이 낫습니다.
운영 대시보드는 발급 수, 사용 수, 취소 수, 동기화 대기 수를 행사·회차별로 나눠 보여줍니다. 대기 중인 단말이 있으면 입장 완료 수치를 확정값으로 표시하지 않습니다. 종료 뒤에는 수동 입장과 동기화 충돌을 따로 확인하고, 스캔 단말 접근 권한을 회수해야 합니다. 구축 범위도 QR 발급만인지, 결제·환불 연동과 재입장까지 필요한지 먼저 정해야 화면과 상태 규칙을 과하게 만들지 않습니다.
소프트모아의 서비스와 포트폴리오는 softmoa.com에서 확인할 수 있습니다.
소프트모아는 해당 시스템을 구축합니다. 문의하기
