Online Library
개요
한 도서관에서 사용자가 책을 대여하고 반납할 수 있는 시스템을 구축하려고 한다.
요구사항
도서 등록 API
관리자가 책의 정보를 등록할 수 있어야 해 (제목, 저자, ISBN, 출판일 등).
같은 책이더라도 실물이 다르면 등록할 수 있어야 해.
도서 수정 API
관리자는 책의 정보를 수정할 수 있어야 해.
도서 삭제 API
관리자는 책의 정보를 삭제할 수 있어야 해.
도서 목록 조회 API
사용자가 전체 도서를 검색할 수 있어야 해.
제목, 저자 등으로 필터링 가능해야 해.
도서 대여 API
사용자가 특정 도서를 대여할 수 있어야 해.
한 명의 사용자는 동일한 책을 중복 대여할 수 없어야 해.
재고가 있어야 해
도서 반납 API
사용자가 대여한 책을 반납할 수 있어야 해. (반납 시점 기록)
대여 내역 조회 API
사용자는 본인의 대여 내역을 조회할 수 있어야 해.
관리자는 전체 대여 기록을 조회할 수 있어야 해.
엔드포인트
도서 정보 등록 (관리자) - POST /api/book-infos
관리자가 책의 정보를 등록할 수 있어야 해 (제목, 저자, ISBN, 출판일 등).
같은 책이더라도 실물이 다르면 등록할 수 있어야 해.
도서 정보 수정 (관리자) - PATCH api/book-infos/{bookInfoId}
관리자는 책의 정보를 수정할 수 있어야 해.
도서 정보 삭제 (관리자) - DELETE api/book-infos/{bookInfoId}
관리자는 책의 정보를 삭제할 수 있어야 해.
도서 정보 목록 조회 - GET /api/book-infos
사용자가 전체 도서를 검색할 수 있어야 해.
제목, 저자 등으로 필터링 가능해야 해.
해당 도서에 실물 책 추가 (N권 등록) - POST /api/book-infos/{bookInfoId}/books
특정 도서의 실물 재고 조회 - GET /api/book-infos/{bookInfoId}/books
사용자 도서 대여 요청 - POST /api/borrows
사용자가 특정 도서를 대여할 수 있어야 해.
한 명의 사용자는 동일한 책을 중복 대여할 수 없어야 해.
재고가 있어야 해
사용자 도서 반납 요청 - POST /api/returns
사용자가 대여한 책을 반납할 수 있어야 해. (반납 시점 기록)
사용자 or 관리자 대여 기록 조회 - GET /api/borrow-histories?me={me}&returned={returned}&page={page}&size={size}
사용자는 본인의 대여 내역을 조회할 수 있어야 해.
관리자는 전체 대여 기록을 조회할 수 있어야 해.
DB 스키마
user
id. BIGINT, PK.
username. Varchar(255)
book_img
id.BIGINT, PK.
url. VARCHAR(255).
book_info
id. BIGINT, PK.
book_title. Varchar(255)
book_bookAuthor. BIGINT
publication_date. DateTime
book_img. VARCHAR(255)
total_stock. BIGINT
available_stock. BIGINT
book
id. BIGINT, PK
book_info_id. BIGINT, FK
available. BOOLEAN
book_user
id. BIGINT, PK
user_id. BIGINT, FK
book_id. BIGINT, FK
아키텍처 고려사항
트랜잭션 처리
대여 시: book row에FOR UPDATE잠금 → 재고 감소 및 대여 기록 생성반납 시: 해당 borrow record 조회 후 반납 처리
Redis 캐시 활용
인기 도서 목록 캐시 (book_info 기준)
도서 상세 페이지 조회 캐싱
인증/인가
POST /api/borrows,returns,borrow-histories는 로그인 사용자 기준관리자 권한:
/api/book-infos등록/수정/삭제 등
⚠예외 처리
동일한
bookInfoId중복 대여 제한 (Unique 제약 or validation)동시성 문제 방지를 위한 Optimistic Lock or DB Lock 고려
Last updated