NFC 태그로 출입명부를 1초 만에 등록하는 코로나-19 시대의 안드로이드 앱
코로나-19 팬데믹 기간 동안 가게마다 종이 명부와 QR 체크인이 혼재하면서 개인정보 노출과 느린 인식 속도 문제가 반복적으로 지적되었습니다. CV-PASS는 QR 대신 NFC 태그를 사용해 사용자가 단말기를 한 번 갖다 대는 것만으로 출입명부 등록을 완료하도록 만든 안드로이드 앱입니다. 역학조사관용 모드도 함께 제공하여 특정 매장의 출입 기록을 즉시 조회할 수 있습니다.
본 프로젝트는 2021년 전북대학교 컴퓨터공학부 작품경진대회에서 은상을 수상했습니다.
- NFC 출입명부 등록 — NFC 태그를 단말에 접촉하면
NfcEntryActivity가 사용자 정보를 Firestore에 즉시 기록 - 백신 접종 인증서 검증 — Google Cloud Vision API로 카드를 분석해 진위 여부를 판단 (
VaccineCardCheckActivity) - 사업자 정보 진위 확인 — odcloud 공공 API 사업자 조회 결과를 파싱해 검증 (
BusinessVerifyActivity) - 역학조사관 모드 — 매장별 출입 기록을 시간 순으로 조회 (
HistoryActivity) - 최초 1회 가입 — 첫 실행 시
ProfileSetupActivity로 사용자 정보를 단말 내부 저장소(UserDate.dat)에 캐싱
| 화면 | 설명 |
|---|---|
MainActivity |
스플래시. 저장된 사용자 정보 유무에 따라 가입/메인 분기 |
ProfileSetupActivity |
최초 사용자 등록 |
NfcEntryActivity |
NFC 태그 인식 및 출입 기록 |
VaccineCardCheckActivity |
백신 접종 인증서 이미지 검증 (Cloud Vision) |
BusinessVerifyActivity |
사업자 번호 진위 검증 (Open API) |
HistoryActivity |
출입 기록 조회 |
- 언어 : Java
- 플랫폼 : Android (minSdk 28 / targetSdk 31)
- 빌드 : Gradle wrapper 7.0.2 · Android Gradle Plugin 7.0.3
- DB : Cloud Firestore
- 이미지 분석 : Google Cloud Vision API
- NFC :
android.nfc.NfcAdapter(NDEF)
covid-pass-nfc/
├── app/
│ ├── build.gradle
│ └── src/main/
│ ├── AndroidManifest.xml
│ ├── java/com/jumincho/cvpass/
│ │ ├── MainActivity.java # 스플래시 + 분기
│ │ ├── ProfileSetupActivity.java # 최초 사용자 등록
│ │ ├── NfcEntryActivity.java # NFC 태그 처리
│ │ ├── VaccineCardCheckActivity.java # 백신 인증서 검증
│ │ ├── BusinessVerifyActivity.java # 사업자 정보 검증
│ │ ├── HistoryActivity.java # 출입 기록 조회
│ │ ├── BusinessLookupParser.java # 사업자 조회 API 응답 파싱
│ │ ├── HttpClient.java # POST JSON 클라이언트
│ │ ├── PackageManagerUtils.java
│ │ └── PermissionUtils.java
│ └── res/
│ ├── layout/ # 액티비티 레이아웃
│ ├── drawable/ # 벡터 / 비트맵 자원
│ └── values/ # strings, colors, themes
├── docs/
│ └── presentation.pptx # 작품경진대회 발표 자료
├── build.gradle
└── settings.gradle
이 저장소에는 저작권상의 이유로 일부 이미지 자원과 폰트가 빠져 있고, Cloud Vision API 키 등 비밀 값은 포함되어 있지 않습니다. Firebase
google-services.json은 빌드가 바로 되도록 placeholder 가 커밋되어 있으니, 직접 실행하려면 자신의 Firebase 프로젝트 파일과 API 키로 교체하세요.
빌드 시스템은 local.properties에서 다음 키를 읽어 BuildConfig로 주입하며,
키 문자열은 소스에 포함되지 않습니다.
local.properties 키 |
BuildConfig 필드 |
사용처 |
|---|---|---|
VISION_API_KEY |
BuildConfig.API_KEY |
Cloud Vision OCR |
BUSINESS_API_KEY |
BuildConfig.BUSINESS_API_KEY |
odcloud 사업자번호 진위 검증 |
INSPECTOR_CODE |
BuildConfig.INSPECTOR_CODE |
역학조사관 진입 코드 |
local.properties 는 .gitignore 에 포함되어 있고, app/google-services.json 은
빌드용 placeholder 가 커밋되어 있습니다(자신의 파일로 교체).
- Android Studio (Arctic Fox 이상) 로 프로젝트 열기
app/google-services.json을 본인 Firebase 프로젝트 콘솔에서 다운로드 받아 배치 (현재 파일은 placeholder)- 프로젝트 루트의
local.properties에 다음 줄들을 추가VISION_API_KEY=여기에_본인의_Cloud_Vision_API_KEY BUSINESS_API_KEY=여기에_본인의_odcloud_serviceKey INSPECTOR_CODE=여기에_본인이_정한_조사관_코드
- Gradle Sync 후
Run 'app'
./gradlew assembleDebug- 시연 영상 : YouTube — 2021 전북대 컴공 작품경진대회
- 발표 슬라이드 :
docs/presentation.pptx
![]() |
![]() |
![]() |
- 2021년 전북대학교 컴퓨터공학부 작품경진대회 은상 (2021. 11. 26.)
| 소속 | 역할 | 이름 | 담당 |
|---|---|---|---|
| 전북대 | 팀장 | 이정환 | 개발 / 디자인 |
| 전북대 | 팀원 | 김연호 | 개발 / 디자인 |
| 전북대 | 팀원 | 정재영 | 개발 / 디자인 |
| 전북대 | 팀원 | 조주민 | 발표 / 디자인 |
본 저장소의 소스 코드는 MIT License를 따릅니다.
다만 발표 자료(docs/presentation.pptx)와 스크린샷의 저작권은 팀원 공동 소유입니다.
A 1-second NFC entry-log app, built for the COVID-19 era.
During the COVID-19 pandemic, every storefront in Korea juggled paper sign-in sheets and QR check-ins, repeatedly raising concerns about personal data exposure and slow scan times. CV-PASS replaces QR with NFC: users tap their phone to the tag once, and the entry is logged. An epidemiologist mode also lets contact tracers query a venue's entry history on demand.
This project received the silver award at the 2021 JBNU CS Student Project Competition.
- NFC entry logging — tapping an NFC tag triggers
NfcEntryActivity, which writes the user record to Firestore. - Vaccine card verification —
VaccineCardCheckActivityuses Google Cloud Vision API to OCR and validate vaccination cards. - Business legitimacy check —
BusinessVerifyActivityvalidates business registrations via the odcloud public API. - Epidemiologist mode —
HistoryActivitylists a venue's entry log chronologically. - One-time sign-up —
ProfileSetupActivitycaches the profile in device storage (UserDate.dat) on first launch.
| Activity | Description |
|---|---|
MainActivity |
Splash. Branches to sign-up or main based on cached profile. |
ProfileSetupActivity |
First-time user registration. |
NfcEntryActivity |
NFC tag scan + entry log write. |
VaccineCardCheckActivity |
Vaccine card image verification (Cloud Vision). |
BusinessVerifyActivity |
Business number validation (Open API). |
HistoryActivity |
Entry log lookup. |
- Language: Java
- Platform: Android (minSdk 28 / targetSdk 31)
- Build: Gradle wrapper 7.0.2 · Android Gradle Plugin 7.0.3
- DB: Cloud Firestore
- Image analysis: Google Cloud Vision API
- NFC:
android.nfc.NfcAdapter(NDEF)
For copyright reasons some image assets and fonts are removed, and no secret values (e.g. the Cloud Vision API key) are included. The Firebase
google-services.jsonis committed as a placeholder so the project builds out of the box — swap in your own Firebase file and API keys to actually run it.
The build system reads keys from local.properties and injects them via
BuildConfig; no secrets are present in source.
local.properties key |
BuildConfig field |
Use site |
|---|---|---|
VISION_API_KEY |
BuildConfig.API_KEY |
Cloud Vision OCR |
BUSINESS_API_KEY |
BuildConfig.BUSINESS_API_KEY |
Business-number lookup |
INSPECTOR_CODE |
BuildConfig.INSPECTOR_CODE |
Epidemiologist mode gate |
local.properties is gitignored; app/google-services.json is committed as a
build-only placeholder (replace it with your own).
- Open the project in Android Studio (Arctic Fox or later).
- Drop your own
app/google-services.jsonfrom the Firebase console (the committed file is a placeholder). - Add the following lines to
local.propertiesat the repo root:VISION_API_KEY=your_cloud_vision_api_key BUSINESS_API_KEY=your_odcloud_service_key INSPECTOR_CODE=your_inspector_code
- Gradle Sync, then
Run 'app'.
./gradlew assembleDebug- Demo video: YouTube — 2021 JBNU CS Student Project Competition
- Slides:
docs/presentation.pptx
![]() |
![]() |
![]() |
- Silver award, 2021 JBNU CS Student Project Competition (Nov 26, 2021)
| Affiliation | Role | Name | Responsibility |
|---|---|---|---|
| JBNU | Lead | Lee Jeonghwan | Development / Design |
| JBNU | Member | Kim Yeonho | Development / Design |
| JBNU | Member | Jeong Jaeyoung | Development / Design |
| JBNU | Member | Cho Jumin | Presentation / Design |
Source code is released under MIT License. The presentation
deck (docs/presentation.pptx) and screenshots remain jointly owned by the
team.


