프로젝트

BookSpresso [안드로이드 + 스프링부트]

ari0930 2025. 6. 4. 23:28

1. 프로젝트 개요

  • 프로젝트 명 : BookSpresso
  • 기간 : 2025.05.23~2025.05.27 (5일)
  • 팀 구성 : 2인 팀 프로젝트

북스프레소는 룸 형태의 북카페에서 사용할 수 있는 모바일 애플리케이션으로,

사용자가 방 안에서 책을 읽으며 움직이지 않고 음료 및 디저트를 주문하고,

NFC 태그를 통해 책을 간편하게 대여·반납할 수 있도록 설계된 스마트 서비스입니다.


2. 기획 의도 / 배경

기존 북카페에서는 책 대여 및 음식 주문이 번거롭고, 관리 측면에서도 효율이 떨어지는 점이 있었습니다.

저희는 이를 디지털화하여 고객 편의성과 운영 효율을 동시에 향상시키는 것을 목표로 프로젝트를 기획했습니다.


3. 주요 기술 스택

  • Frontend: Android (Kotlin)
  • Backend: Spring Boot, Spring Security, JWT, OAuth 2.0
  • Database: MariaDB
  • File Storage: Firebase (이미지 저장)
  • Deployment: Cloudtype
  • 결제 연동: 카카오페이 API
  • 하드웨어 연동: NFC 태그 인식

4. 아키텍처

5. DB 테이블/ 트리거

테이블 요약

테이블명 주요 컬럼 설명 제약조건 / 키

t_user idnameemailroleprovider 사용자 정보 PK(id)UNIQUE(email)
t_product idnametypepriceimg 음료 및 디저트 PK(id)
t_order o_iduser_idorder_timecompleted 주문 정보 PK(o_id)FK(user_id → t_user.id)
t_order_detail d_idorder_idproduct_idquantity 주문 상세 내역 PK(d_id)FK(order_id → t_order.o_id)FK(product_id → t_product.id)
payment idtiduser_idorder_iditem_nametotal_amountstatus 결제 내역 PK(id)UNIQUE(tid)
t_book isbntitleauthorstatusimg 책 정보 PK(isbn)
t_book_rental rental_iduser_idisbnrental_datedue_datestatusfee 책 대여 내역 PK(rental_id)FK(user_id → t_user.id)FK(isbn → t_book.isbn)
t_book_recommendation recommendation_idisbndrink_iddessert_idreason 책 + 음료 + 디저트 추천 PK(recommendation_id)FK(isbn → t_book)FK(drink_id/dessert_id → t_product.id)

트리거 요약

트리거명 시점 대상 테이블 동작 조건

trg_update_book_status_after_rental AFTER INSERT t_book_rental 해당 책 status = 'borrowed'로 변경 항상 실행
trg_after_return AFTER UPDATE t_book_rental 해당 책 status = 'available'로 변경 NEW.status IN ('returned', 'overdueReturned')

6. 주요 기능

NFC 기반 책 대여·반납 시스템

  • 스마트폰을 책에 태그하면 대여/반납이 자동으로 처리

카카오페이 간편 결제

  • 음료 및 디저트는 카카오페이를 통해 결제할 수 있어 현장 결제 불편 해소

Spring Security + JWT 기반 인증/인가

  • 관리자 페이지/기능도 별도 권한으로 분리
  • 로그인 시 JWT 토큰 발급, 사용자 권한에 따라 접근 제어를 구현

OAuth 2.0 로그인 연동 (구글 )

  • 회원가입 절차 최소화로 진입 장벽 낮춤
  • 이메일 및 SNS 연동을 통해 빠르고 간편하게 로그인 가능

 

 

AI 기반 책 & 음료/디저트 추천 시스템 (GPT API 활용)

  • GPT API를 이용해 현재 보유한 책, 음료, 디저트 목록을 기반으로 사용자에게 어울리는 책과 함께 잘 어울리는 음료 및 디저트를 추천 이유와 함께 제안합니다.
  • 이 기능은 Spring 스케줄러를 통해 30분마다 자동으로 추천 내용이 갱신되며, 카페 방문자들이 정기적으로 새로운 추천을 받을 수 있게 구성되었습니다.

관리자 페이지

  • 주문한 음료,디저트 수락/거절 처리

7. 본인의 역할 및 기여

백엔드 전반 설계 및 구현 담당

  • REST API 개발 및 DB 설계
  • Spring Security + JWT 인증/인가 로직 구현
  • OAuth 2.0 기반 로그인 연동 (구글)
  • NFC 태그 기반 대여/반납 로직 설계 및 연동
  • 카카오페이 간편 결제 연동
  • Cloudtype 배포 설정
  • GPT API 연동 로직 설계 및 구현
    • 보유 재고 목록 기반 추천 프롬프트 자동 생성
    • 추천 결과 파싱 및 포맷화하여 프론트에 전달

프론트 엔드

  • Lottie를 이용하여 로딩 화면 구현
  • 관리자 페이지 서버와 연결 및 구현
  • 마이페이지 서버와 연결 및 구현
  • 안드로이드에서도 jwt 토큰 받아서 요청을 보낼때 받은 토큰을 보내도록 로직 구현
  • jwt를 이용한 자동 로그인 구현
    • jwt 토큰을 SharedPreferences 에 저장하여 만약 토큰 값이 남아 있다면 서버에서 그 토큰이 유효한지 확인 자동 로그인 진행하도록 구현
  • OAuth 로그인 구현

8. 트러블슈팅

문제 상황

안드로이드 앱에서 카카오페이 API를 활용한 결제 시스템을 구현하는 과정에서, 결제 완료 결과를 앱 내에서 정상적으로 처리하지 못하는 문제가 발생했습니다.

원인 분석

초기에는 웹과 동일하게,

서버에서 카카오페이 API를 호출하고 반환된 결제 URL을 앱에 전달하면

자동으로 결제 결과가 서버 또는 앱으로 전달될 것으로 예상했습니다.

하지만 실제 구조는 다음과 같았습니다:

  • 카카오페이 결제는 외부 브라우저(또는 WebView)를 통해 진행되며,
  • 사용자가 직접 결제를 완료해야 하고,
  • 결제 완료 후에는 리다이렉트 URL을 통해 결과가 앱으로 돌아와야 하는 구조였습니다.

즉, 안드로이드에서는 서버로 바로 결과가 반환되지 않기 때문에 별도의 흐름 제어가 필요했습니다.

해결 방법

안드로이드에서 결제 완료를 감지하고 처리하기 위한 방법을 조사한 결과, 다음과 같은 방식들이 있었습니다:

  • WebView 내부에서 URL 변경을 감지하여 처리하는 방식
  • Intent를 활용해 외부 브라우저에서 앱으로 돌아오게 처리하는 방식
  • 서버에서 결제 승인 완료 후 리턴한 URL을 앱에서 다시 띄워 결제 흐름을 마무리하는 방식

당시에는 개발 일정이 촉박했기 때문에, 서버 로직을 수정하기 보다는 수정 없이 가장 빠르게 구현할 수 있는 세 번째 방식을 선택했습니다.

결과 및 개선

  • 해당 방식은 빠른 구현이 가능하고, 서버 측에서 상태를 명확히 관리할 수 있다는 장점이 있었습니다.
  • 그러나 사용자 입장에서는 결제창이 한 번 더 열리는 UX 흐름이 다소 어색할 수 있었습니다.

이후 Google OAuth 로그인 기능을 추가하면서, 유사하게 외부 페이지에서 앱으로 돌아오는 리다이렉트 처리가 필요했습니다.

이때는 이미 한번 경험해 보았기에 처음 기능을 구현할때 부터 Intent 방식을 사용하는 전제로 서버로직을 구현하였고 그결과 앱 내부에서 안정적으로 처리할 수 있도록 구현했습니다.

이 경험을 통해 안드로이드에서의 외부 서비스 연동 시 리다이렉트 처리 흐름, Intent 및 WebView 에대해 보다 깊이 있게 이해하게 되었습니다.


10. 링크 첨부

반응형