Unity
독서 기록이 게임 속 나무로 자라난다면 어떨까요?
전*원··수정됨 2026.07.21

도서관에서 빌린 책의 감상문을 남길 때마다 내 캐릭터 옆 나무가 한 단계씩 커지고, 완성된 기록은 QR 코드로 스마트폰에 바로 담아갈 수 있다면요. 이번 포스팅에서는 SQLite 로컬 DB와 공공도서관 REST API, 그리고 클라우드 Object Storage를 Unity 하나로 엮어낸 '나만의 독서기록장' 키오스크 콘텐츠의 기술적인 구현 과정을 공유합니다.

1. 시스템 아키텍처 개요
본 프로젝트는 크게 세 가지 단계로 구성됩니다.
사용자 인증: 바코드 스캔 / ID·PW / 게스트 세 가지 경로로 로그인, 공공도서관 REST API로 대출 이력 조회
감상문 작성: 감정 단어 토큰 선택과 한글 온스크린 키보드 직접 입력을 결합한 하이브리드 방식, 금지어 필터 및 200자 제한 적용
보상 및 공유: SQLite에 기록 저장 → 나무 성장 단계 갱신 → 화면 캡처를 Object Storage에 업로드하여 QR 코드 생성
이 모든 과정은 Unity 2021 LTS를 메인 플랫폼으로, ECONTENTSTYPE enum 기반의 상태 머신(State Machine)을 통해 7단계 화면 흐름으로 통합 관리됩니다.
2. 주요 기술적 구현
2.1 SQLite + CSV 기반 데이터 매니지먼트 (DataBaseManagementSystem.cs)
모든 사용자 데이터, 책 목록, 리뷰, 보상 규칙은 DataBaseManagementSystem이 단일 진입점으로 관리합니다. 앱 시작 시 LoadingAllData()가 Application.persistentDataPath/mydb.sqlite에서 userdatareviews 두 테이블을 로드하고, 이어서 LoadingBookleanData()가 공공도서관 API로 빌린 책 목록을 조회해 "작성 완료 / 미작성" 으로 자동 분리합니다. 보상 규칙은 코드가 아닌 Resources/Csv/RewardTable.csv에 선언되어 있어, 출석·독서량·카테고리별 보상 조건을 코드 수정 없이 CSV만 갱신하면 되도록 설계했습니다.
2.2 하이브리드 감상문 입력과 다단계 검증 (WriteAReviewManager.cs)
감상문은 단순 텍스트 필드가 아닌 감정 단어 토큰 선택 UI 와 한글 온스크린 키보드 두 가지 입력 방식을 조합하여 작성됩니다. 단어 풀은 Theme / Story / Influence / Emotion 네 가지 타입EWORDTYPE)으로 분류되어 있고, ToggleToken()으로 토큰을 더하거나 빼면서 GetFinalText()가 최종 텍스트를 합성합니다. 저장 직전 Save()에서는 3,000줄 이상의 BadWord.txt를 참조한 금지어 필터, 200자 제한, 빈 입력 차단의 3단 검증을 통과한 경우에만 SQLite INSERT가 실행됩니다.
Theme: 책의 주제·장르 카테고리
Story: 줄거리 요약 키워드
Influence: 나에게 미친 영향
Emotion: 감정 표현
2.3 스크린샷 → 클라우드 → QR 파이프라인 (QRCreateManager.cs)
완성된 감상문 화면은 QR 코드 한 장으로 스마트폰에 즉시 전송됩니다. CaptureFream()이 RectTransform의 월드 좌표를 스크린 좌표로 변환해 Texture2D로 캡처한 뒤 PNG로 인코딩하고, AWS SDK의 PutObjectRequest를 이용해 CannedACL.PublicRead 정책으로 Object Storage에 업로드합니다. 반환된 퍼블릭 URL을 ZXing 라이브러리의 BarcodeWriter에 넘겨 256×256 QR 텍스처를 실시간으로 생성하고, 이를 UI에 표시해 관람객이 곧바로 스캔할 수 있도록 했습니다.
3. 사용자 경험(UX) 최적화
5단계 × 6프레임 나무 성장 시각화 : TreeManager가 treeLevel 0~4와 각 단계별 6프레임 = 총 30개 이미지를 전환하며, 최종 단계의 마지막 프레임에만 과일이 맺히는 특수 연출로 성취감을 극대화했습니다.
8종 캐릭터와 랜덤 애니메이션 : Bear·Elephant·Monky·Prince·Princess·Rabbit·Sheep·Wolf 중 선택한 캐릭터가 Idle·Head·Hand·Walk 네 가지 애니메이션을 무작위로 재생해, 같은 캐릭터도 볼 때마다 다른 인상을 줍니다.
무인 키오스크 대응 유휴 타임아웃 : GameQuitManager가 일정 시간 동안 입력이 없으면 자동으로 로그아웃 후 Title로 복귀해, 다음 이용자가 매번 깨끗한 상태에서 시작하도록 보장합니다.
마스킹된 사용자 이름 표시 : LoginManager.Login()이 첫 글자와 마지막 글자 사이를 * 로 가려 개인정보를 보호하면서도 "내가 맞구나" 하는 확인감을 제공합니다.
4. 마치며
이 프로젝트는 도서관이라는 오프라인 공간에 게임화(Gamification) 와 소셜 공유 를 얹는 작업이었습니다. 공공 API로 실제 대출 이력을 가져와 감상문 작성에 자동으로 연결하고, SQLite로 개인 기록을 축적하며, 클라우드를 거쳐 QR 한 장으로 스마트폰까지 전달되는 파이프라인은 기술적으로도 흥미롭지만, 독서라는 정적 활동에 "내 나무가 자라는 재미"라는 동기 부여를 심어 주었다는 점에서 큰 의미가 있었습니다.
향후에는 감상문 재작성 기능과 나무 성장 이외의 추가 미니게임, 그리고 독서량 기반 월간 랭킹 시스템을 도입하여 반복 방문 동기를 강화할 예정입니다.
읽기 도구
약 6분 읽기
이 글이 도움이 되었나요?