동네 도서관 장서 검색 시스템
local-library-book-search
문제 설명
📚 동네 도서관 장서 검색 시스템
작은 동네 도서관이나 개인 서재를 위한 간단한 장서 검색 시스템을 만듭니다. 책 제목, 저자, ISBN, 장르 등의 정보를 데이터베이스에 저장하고, 방문자가 검색창을 통해 원하는 책을 찾을 수 있도록 합니다.
필수 기능
- 📖 책 등록: 제목, 저자, ISBN, 출판사, 장르, 소장 위치(서가 번호) 입력
- 🔍 검색 기능: 제목 또는 저자명으로 책 검색
- 📋 전체 목록: 등록된 모든 책을 테이블 형태로 표시
- ✏️ 책 정보 수정 및 삭제
- 📊 간단한 통계: 전체 장서 수, 장르별 분포
선택 추가 기능 (보너스)
- 🏷️ 장르별 필터링 (드롭다운)
- 📅 등록일/최근 추가된 책 순 정렬
- 🖼️ 책 표지 이미지 업로드
- 📱 반응형 디자인 (모바일 대응)
기술 스택
- Backend: Laravel 13.x
- Frontend: Blade 템플릿 + Tailwind CSS
- Database: SQLite
- 기타: Laravel 기본 라우팅, Eloquent ORM, Blade 컴포넌트
제약 조건
- • Laravel 13.x 최신 버전 사용
- • Blade 템플릿 엔진으로 뷰 구성 (React/Vue 사용 금지)
- • Tailwind CSS로 스타일링
- • SQLite 데이터베이스 사용 (간단한 설정)
- • RESTful 라우팅 패턴 준수
- • CSRF 보호 활성화
- • 유효성 검사(Validation) 적용
프롬프트 레시피
아래 프롬프트를 순서대로 AI에게 보내면 됩니다. 복사 버튼을 눌러 바로 사용하세요.
mkdir local-library-book-search && cd local-library-book-search
이 폴더에서 Laravel 13.x 프로젝트를 시작합니다.
# 동네 도서관 장서 검색 시스템 - 프로젝트 초기 설정
Laravel 13.x 프로젝트를 생성하고 기본 설정을 완료해주세요.
## 요구사항
1. Laravel 13.x 프로젝트 생성 (composer create-project laravel/laravel . "13.*")
2. .env 파일 설정:
- DB_CONNECTION=sqlite
- DB_DATABASE를 database/database.sqlite 경로로 설정
3. database/database.sqlite 파일 생성 (빈 파일)
4. Tailwind CSS 설치 및 설정 (npm install -D tailwindcss postcss autoprefixer && npx tailwindcss init -p)
5. tailwind.config.js에서 content 경로 설정: ['./resources/**/*.blade.php', './resources/**/*.js']
6. resources/css/app.css에 Tailwind 지시어 추가:
```css
@tailwind base;
@tailwind components;
@tailwind utilities;
```
7. resources/views/layouts/app.blade.php 레이아웃 파일 생성:
- <!DOCTYPE html> 기본 구조
- <head>에 @vite(['resources/css/app.css', 'resources/js/app.js']) 포함
- 네비게이션 바: '장서 관리', '전체 목록', '통계' 링크
- @yield('content') 섹션
- 반응형 디자인 적용
## 완료 후 확인
- php artisan serve 실행 시 Laravel 기본 화면 표시
- npm run dev 실행 시 Tailwind CSS 컴파일 성공
기대 결과: Laravel 13.x 프로젝트가 생성되고, SQLite 데이터베이스 연결이 설정되며, Tailwind CSS가 통합된 기본 레이아웃 파일이 준비됩니다. 개발 서버 실행 시 네비게이션이 포함된 레이아웃이 표시됩니다.
# 책(Book) 모델 및 마이그레이션 생성 장서 정보를 저장할 데이터베이스 테이블과 Eloquent 모델을 생성해주세요. ## 요구사항 1. Book 모델 및 마이그레이션 생성 (php artisan make:model Book -m) 2. 마이그레이션 파일에 다음 컬럼 정의: - id (자동 생성) - title (string, 책 제목) - author (string, 저자) - isbn (string, nullable, ISBN 번호) - publisher (string, nullable, 출판사) - genre (string, 장르: 소설, 에세이, 과학, 역사 등) - shelf_location (string, 서가 위치: 예 'A-01', 'B-12') - published_year (integer, nullable, 출판연도) - timestamps (created_at, updated_at) 3. Book 모델에 $fillable 속성 설정 (mass assignment 허용) 4. 마이그레이션 실행 (php artisan migrate) 5. Seeder 생성 (php artisan make:seeder BookSeeder): - 테스트용 책 데이터 5~10개 생성 - 다양한 장르 포함 6. Seeder 실행 (php artisan db:seed --class=BookSeeder) ## 완료 후 확인 - database/database.sqlite에 books 테이블 생성 - php artisan tinker로 Book::all() 실행 시 시드 데이터 확인 가능
기대 결과: books 테이블이 생성되고, Book Eloquent 모델이 준비되며, 테스트용 장서 데이터가 데이터베이스에 입력됩니다.
# 책 목록 조회 및 검색 기능 구현
전체 장서 목록을 표시하고, 제목/저자로 검색할 수 있는 페이지를 만들어주세요.
## 요구사항
1. BookController 생성 (php artisan make:controller BookController --resource)
2. routes/web.php에 라우트 등록:
- GET / : 홈 페이지 (책 목록으로 리다이렉트)
- GET /books : 전체 책 목록 및 검색 (BookController@index)
- GET /books/create : 책 등록 폼 (다음 단계에서 구현)
- POST /books : 책 저장 (다음 단계에서 구현)
- GET /books/{id}/edit : 책 수정 폼 (다음 단계에서 구현)
- PUT /books/{id} : 책 업데이트 (다음 단계에서 구현)
- DELETE /books/{id} : 책 삭제 (다음 단계에서 구현)
3. BookController의 index 메서드 구현:
- 검색어(query 파라미터 'search')가 있으면 제목 또는 저자에서 LIKE 검색
- 검색어가 없으면 전체 목록 반환
- 페이지네이션 적용 (10개씩)
4. resources/views/books/index.blade.php 생성:
- @extends('layouts.app')
- 검색 폼: input[type=text]와 검색 버튼
- 책 목록 테이블: 제목, 저자, 장르, 서가 위치, 출판연도, 액션(수정/삭제 버튼)
- 테이블이 비어있으면 "등록된 책이 없습니다" 메시지
- 페이지네이션 링크 표시
- Tailwind CSS로 깔끔하게 스타일링 (테이블 border, hover 효과 등)
5. 네비게이션 바의 '전체 목록' 링크를 /books로 연결
## 완료 후 확인
- /books 접속 시 시드 데이터 목록이 테이블로 표시
- 검색창에 제목 또는 저자 일부 입력 시 필터링된 결과 표시
기대 결과: 책 목록 페이지가 생성되고, 검색 기능이 작동하며, 페이지네이션이 적용됩니다. Tailwind CSS로 스타일링된 깔끔한 테이블 UI가 표시됩니다.
# 책 등록 및 수정 기능 구현
새로운 책을 등록하고, 기존 책 정보를 수정할 수 있는 폼과 처리 로직을 만들어주세요.
## 요구사항
1. BookController의 create 메서드 구현:
- resources/views/books/create.blade.php 뷰 반환
2. resources/views/books/create.blade.php 생성:
- @extends('layouts.app')
- 책 등록 폼: 제목(필수), 저자(필수), ISBN, 출판사, 장르(필수), 서가 위치(필수), 출판연도
- 장르는 select 드롭다운: 소설, 에세이, 과학, 역사, 자기계발, 기타
- @csrf 토큰 포함
- 유효성 검사 오류 표시 영역 (@error 지시어 사용)
- Tailwind CSS로 폼 스타일링 (label, input, button)
3. BookController의 store 메서드 구현:
- Request 유효성 검사: title, author, genre, shelf_location 필수
- Book::create()로 데이터 저장
- 성공 시 /books로 리다이렉트 + 성공 메시지 (session flash)
4. BookController의 edit 메서드 구현:
- Book::findOrFail($id)로 책 조회
- resources/views/books/edit.blade.php 뷰 반환 (책 데이터 전달)
5. resources/views/books/edit.blade.php 생성:
- create.blade.php와 유사하지만 기존 값 표시 (old() 헬퍼 또는 $book->title)
- @method('PUT') 포함
- 폼 action을 /books/{id}로 설정
6. BookController의 update 메서드 구현:
- 유효성 검사 후 $book->update() 실행
- 성공 시 /books로 리다이렉트 + 성공 메시지
7. index.blade.php에 '새 책 등록' 버튼 추가 (/books/create 링크)
8. 성공/오류 메시지 표시를 위한 layouts/app.blade.php 수정:
- @if(session('success')) 블록 추가 (Tailwind alert 스타일)
## 완료 후 확인
- '새 책 등록' 버튼 클릭 시 폼 표시
- 폼 제출 시 책이 데이터베이스에 저장되고 목록에 표시
- 수정 버튼 클릭 시 기존 정보가 폼에 채워져 표시
- 수정 후 변경사항이 목록에 반영
기대 결과: 책 등록 및 수정 폼이 생성되고, CRUD의 Create와 Update 기능이 완전히 작동합니다. 유효성 검사와 성공 메시지가 표시됩니다.
# 책 삭제 기능 및 통계 페이지 구현
책 삭제 기능을 추가하고, 간단한 통계 페이지를 만들어주세요.
## 요구사항
1. BookController의 destroy 메서드 구현:
- Book::findOrFail($id)->delete() 실행
- 성공 시 /books로 리다이렉트 + 삭제 성공 메시지
2. resources/views/books/index.blade.php 수정:
- 각 책 행에 삭제 버튼 추가
- 삭제 폼: @csrf, @method('DELETE'), action을 /books/{id}로 설정
- 삭제 버튼 클릭 시 JavaScript confirm() 확인창 표시 ("정말 삭제하시겠습니까?")
3. BookController에 stats 메서드 추가:
- 전체 장서 수 계산
- 장르별 책 수 계산 (groupBy + count)
- resources/views/books/stats.blade.php 뷰 반환 (데이터 전달)
4. routes/web.php에 통계 페이지 라우트 추가:
- GET /books/stats : BookController@stats
5. resources/views/books/stats.blade.php 생성:
- @extends('layouts.app')
- 전체 장서 수를 큰 숫자로 표시 (카드 형태)
- 장르별 분포를 테이블 또는 리스트로 표시
- Tailwind CSS로 카드 레이아웃 스타일링
6. 네비게이션 바의 '통계' 링크를 /books/stats로 연결
7. index.blade.php에 장르별 필터 기능 추가 (보너스):
- 장르 드롭다운 필터 추가
- 선택 시 해당 장르의 책만 표시
- "전체" 옵션도 포함
## 완료 후 확인
- 삭제 버튼 클릭 시 확인창 표시 후 책이 데이터베이스에서 삭제
- /books/stats 접속 시 전체 장서 수와 장르별 분포 통계 표시
- 장르 필터 선택 시 해당 장르 책만 목록에 표시 (보너스 기능)
기대 결과: 책 삭제 기능이 작동하고, 통계 페이지에서 전체 장서 수와 장르별 분포를 확인할 수 있습니다. 모든 CRUD 기능이 완성되며, 선택적으로 장르 필터링 기능도 추가됩니다.
제출된 작품 (0)
로그인 후 제출아직 제출된 작품이 없습니다. 첫 번째 도전자가 되어보세요!