풀스택 즐겨찾기 관리 - 카테고리별 링크 북마크 - 바이브코딩 레시피
10월 22일 서버 점검 안내 (00:00~06:00)
입문 PHP Laravel AI: Claude

풀스택 즐겨찾기 관리 - 카테고리별 링크 북마크

리포지토리명 fullstack-bookmark-manager
조회수 74 0건 제출

문제 설명

📚 프로젝트 개요

Laravel 13.x + Blade 템플릿으로 만드는 간단한 북마크 관리 시스템입니다. 자주 방문하는 웹사이트 링크를 카테고리별로 저장하고, 한눈에 볼 수 있는 대시보드를 제공합니다.

✨ 필수 기능

  • 북마크 추가: 제목, URL, 설명, 카테고리를 입력하여 새 북마크 생성
  • 카테고리 관리: 개발, 디자인, 뉴스, 쇼핑 등 카테고리별 분류
  • 북마크 목록: 카테고리별로 필터링하여 북마크 조회
  • 북마크 수정/삭제: 기존 북마크 편집 및 삭제 기능
  • 파비콘 표시: 각 웹사이트의 파비콘 자동 로드하여 시각적으로 표시
  • 검색 기능: 제목이나 URL로 북마크 검색
  • 반응형 UI: Tailwind CSS로 모바일/데스크톱 대응

🎁 보너스 기능 (선택)

  • 북마크 즐겨찾기(별표) 기능
  • 방문 횟수 카운터
  • 최근 추가한 북마크 하이라이트
  • 북마크 드래그앤드롭 순서 변경
  • 카테고리별 색상 태그
  • CSV/JSON 내보내기/가져오기

🎯 학습 목표

  • Laravel 13.x 프로젝트 구조 이해
  • Blade 템플릿 문법 습득
  • 기본적인 CRUD 구현 (Create, Read, Update, Delete)
  • Laravel 마이그레이션과 Eloquent ORM 사용
  • Tailwind CSS로 반응형 UI 구성
  • 라우트와 컨트롤러 연결 방식 학습

제약 조건

  • • Laravel 13.x 최신 버전 사용 (구버전 금지)
  • • Blade 템플릿 엔진 사용 (React/Vue 등 SPA 프레임워크 사용 금지)
  • • Tailwind CSS로 스타일링 (Bootstrap 등 다른 CSS 프레임워크 금지)
  • • SQLite 데이터베이스 사용 (초보자 친화적)
  • • 외부 API 연동 없이 순수 Laravel 기능만 사용
  • • 프론트엔드 JavaScript는 최소한으로 (Alpine.js 사용 가능)

프롬프트 레시피

아래 프롬프트를 순서대로 AI에게 보내면 됩니다. 복사 버튼을 눌러 바로 사용하세요.

1
Step 1
mkdir fullstack-bookmark-manager && cd fullstack-bookmark-manager

이 폴더에서 Laravel 13.x 프로젝트를 생성합니다.

# 프로젝트 초기 설정

1. Laravel 13.x 최신 버전으로 프로젝트 생성
2. SQLite 데이터베이스 설정 (.env 파일에서 DB_CONNECTION=sqlite 설정)
3. database/database.sqlite 파일 생성
4. Tailwind CSS 설치 및 설정 (Laravel Mix 또는 Vite 사용)
5. 기본 레이아웃 파일 생성 (resources/views/layouts/app.blade.php)
   - 헤더에 "즐겨찾기 관리" 타이틀
   - Tailwind CSS CDN 또는 컴파일된 CSS 링크
   - 네비게이션 바 (홈, 북마크 추가, 카테고리 관리)
   - 반응형 모바일 메뉴

레이아웃은 깔끔한 화이트/블루 톤으로 디자인하고, 그림자와 라운드 처리로 모던한 느낌을 주세요.

기대 결과: Laravel 프로젝트가 생성되고, Tailwind CSS가 설치되며, 기본 레이아웃 파일이 준비됩니다. `php artisan serve` 명령으로 서버를 실행하면 기본 레이아웃이 보입니다.

2
Step 2
# 데이터베이스 마이그레이션 생성

북마크와 카테고리를 저장할 데이터베이스 테이블을 생성합니다.

## 1. categories 테이블 마이그레이션

`php artisan make:migration create_categories_table` 명령으로 마이그레이션 파일 생성 후 다음 컬럼 추가:

- id (bigIncrements)
- name (string, unique) - 카테고리 이름
- color (string, nullable) - 카테고리 색상 (예: "blue", "red", "green")
- icon (string, nullable) - 아이콘 이름 (예: "code", "design", "news")
- timestamps

## 2. bookmarks 테이블 마이그레이션

`php artisan make:migration create_bookmarks_table` 명령으로 마이그레이션 파일 생성 후 다음 컬럼 추가:

- id (bigIncrements)
- category_id (foreignId) - categories 테이블 참조, onDelete('cascade')
- title (string) - 북마크 제목
- url (text) - 웹사이트 URL
- description (text, nullable) - 설명
- favicon_url (string, nullable) - 파비콘 URL (예: https://www.google.com/favicon.ico)
- is_favorite (boolean, default false) - 즐겨찾기 여부
- visit_count (integer, default 0) - 방문 횟수
- timestamps

마이그레이션 실행: `php artisan migrate`

## 3. 시더 생성

`php artisan make:seeder CategorySeeder` 명령으로 시더 생성 후 기본 카테고리 5개 추가:
- 개발 (color: blue, icon: code)
- 디자인 (color: purple, icon: palette)
- 뉴스 (color: red, icon: newspaper)
- 쇼핑 (color: green, icon: shopping-cart)
- 기타 (color: gray, icon: folder)

`php artisan db:seed --class=CategorySeeder` 명령으로 시더 실행

기대 결과: categories와 bookmarks 테이블이 생성되고, 기본 카테고리 5개가 데이터베이스에 추가됩니다. SQLite 데이터베이스 파일에서 테이블과 데이터를 확인할 수 있습니다.

3
Step 3
# 모델과 컨트롤러 생성

## 1. Category 모델 생성

`php artisan make:model Category` 명령으로 모델 생성 후:

- $fillable = ['name', 'color', 'icon']
- bookmarks() 관계 메서드 추가 (hasMany 관계)

## 2. Bookmark 모델 생성

`php artisan make:model Bookmark` 명령으로 모델 생성 후:

- $fillable = ['category_id', 'title', 'url', 'description', 'favicon_url', 'is_favorite', 'visit_count']
- category() 관계 메서드 추가 (belongsTo 관계)
- getFaviconUrlAttribute() 접근자 추가: URL에서 자동으로 파비콘 URL 생성 (예: https://www.google.com/s2/favicons?domain={domain})

## 3. BookmarkController 생성

`php artisan make:controller BookmarkController` 명령으로 컨트롤러 생성 후 다음 메서드 구현:

- **index()**: 모든 북마크 조회 (카테고리별 그룹핑, 최신순 정렬)
  - 쿼리 파라미터로 category_id 필터링 가능
  - 쿼리 파라미터로 search 검색 가능 (title, url 검색)
  - resources/views/bookmarks/index.blade.php 반환

- **create()**: 북마크 생성 폼 표시
  - 모든 카테고리 목록 전달
  - resources/views/bookmarks/create.blade.php 반환

- **store(Request $request)**: 북마크 저장
  - 유효성 검사: title, url, category_id 필수
  - 파비콘 URL 자동 생성
  - 저장 후 index 페이지로 리다이렉트

- **edit($id)**: 북마크 수정 폼 표시
  - resources/views/bookmarks/edit.blade.php 반환

- **update(Request $request, $id)**: 북마크 업데이트
  - 저장 후 index 페이지로 리다이렉트

- **destroy($id)**: 북마크 삭제
  - 삭제 후 index 페이지로 리다이렉트

## 4. 라우트 등록

routes/web.php 파일에 다음 라우트 추가:

```php
Route::get('/', [BookmarkController::class, 'index'])->name('bookmarks.index');
Route::resource('bookmarks', BookmarkController::class);
```

기대 결과: Category와 Bookmark 모델이 생성되고, BookmarkController에 CRUD 메서드가 구현됩니다. 라우트가 등록되어 웹 브라우저에서 접근할 수 있습니다.

4
Step 4
# Blade 뷰 파일 생성 - 북마크 목록 페이지

resources/views/bookmarks/index.blade.php 파일을 생성하고 다음 기능을 구현하세요:

## 레이아웃 구조

1. **헤더 섹션**
   - 페이지 제목: "내 북마크"
   - "새 북마크 추가" 버튼 (우측 상단, 파란색)
   - 검색 입력 필드 (실시간 검색, Alpine.js 또는 form 제출)

2. **카테고리 필터 탭**
   - 전체 / 개발 / 디자인 / 뉴스 / 쇼핑 / 기타 탭
   - 각 카테고리 색상으로 탭 스타일링
   - 현재 선택된 카테고리 하이라이트
   - 클릭 시 쿼리 파라미터로 필터링 (?category_id=1)

3. **북마크 카드 그리드**
   - 3열 그리드 레이아웃 (데스크톱), 1열 (모바일)
   - 각 북마크 카드 구성:
     - 파비콘 이미지 (왼쪽 상단)
     - 북마크 제목 (큰 글씨, 볼드)
     - URL (작은 글씨, 회색, 말줄임표)
     - 설명 (2줄까지 표시, 말줄임표)
     - 카테고리 배지 (색상 태그)
     - 즐겨찾기 별 아이콘 (is_favorite가 true일 때)
     - 방문 횟수 (작은 아이콘과 숫자)
     - 수정/삭제 버튼 (카드 우측 하단)
   - 카드 호버 시 그림자 효과
   - 카드 클릭 시 새 탭에서 URL 열기 (target="_blank")

4. **빈 상태 처리**
   - 북마크가 없을 때 "아직 북마크가 없습니다" 메시지와 추가 버튼 표시

## 스타일링

- Tailwind CSS 유틸리티 클래스 사용
- 카드: bg-white, shadow-md, rounded-lg, p-4
- 반응형: grid-cols-1 md:grid-cols-2 lg:grid-cols-3
- 색상: 파란색 주조색, 회색 보조색

## 인터랙션

- 삭제 버튼 클릭 시 확인 알림창 (JavaScript confirm)
- 카드 클릭 시 visit_count 증가 (선택적 구현)

기대 결과: 북마크 목록 페이지가 완성되어 카테고리별로 필터링하고, 검색하고, 북마크 카드를 그리드로 표시할 수 있습니다. 반응형 디자인으로 모바일에서도 잘 보입니다.

5
Step 5
# Blade 뷰 파일 생성 - 북마크 추가/수정 폼

## 1. resources/views/bookmarks/create.blade.php 생성

새 북마크 추가 폼을 만듭니다.

### 폼 구성

- **제목 입력**: text input, required, placeholder="예: Google"
- **URL 입력**: url input, required, placeholder="https://example.com"
- **설명 입력**: textarea, 3줄, placeholder="이 북마크에 대한 간단한 설명"
- **카테고리 선택**: select dropdown, 모든 카테고리 목록 표시
- **즐겨찾기 체크박스**: "즐겨찾기로 설정"
- **제출 버튼**: "북마크 추가" (파란색, 전체 너비)
- **취소 버튼**: "취소" (회색, 목록으로 돌아가기)

### 스타일링

- 폼 컨테이너: max-w-2xl mx-auto, bg-white, shadow-lg, rounded-lg, p-8
- 각 입력 필드: border, rounded, p-2, focus:ring-2 focus:ring-blue-500
- 라벨: block, mb-2, font-semibold
- 에러 메시지 표시 영역 (Laravel validation errors)

## 2. resources/views/bookmarks/edit.blade.php 생성

기존 북마크 수정 폼을 만듭니다.

- create.blade.php와 거의 동일한 구조
- 폼 액션: route('bookmarks.update', $bookmark->id), method="POST", @method('PUT')
- 기존 값으로 입력 필드 채우기 (old() 헬퍼와 $bookmark 값 사용)
- 제출 버튼 텍스트: "북마크 수정"
- 삭제 버튼 추가 (빨간색, 폼 하단 왼쪽)

## 3. 유효성 검사 에러 메시지 표시

두 폼 모두에 다음 코드 추가:

```blade
@if ($errors->any())
    <div class="bg-red-100 border border-red-400 text-red-700 px-4 py-3 rounded mb-4">
        <ul>
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif
```

## 4. 성공 메시지 표시 (선택적)

layouts/app.blade.php에 세션 플래시 메시지 표시 영역 추가:

```blade
@if (session('success'))
    <div class="bg-green-100 border border-green-400 text-green-700 px-4 py-3 rounded mb-4">
        {{ session('success') }}
    </div>
@endif
```

BookmarkController의 store()와 update() 메서드에서 리다이렉트 시 `->with('success', '북마크가 추가되었습니다!')` 추가

기대 결과: 북마크 추가 및 수정 폼이 완성되어 사용자가 새 북마크를 추가하거나 기존 북마크를 수정할 수 있습니다. 유효성 검사 에러와 성공 메시지가 표시됩니다.

6
Step 6
# 최종 테스트 및 개선

## 1. 더미 데이터 추가

`php artisan make:seeder BookmarkSeeder` 명령으로 시더 생성 후 다양한 카테고리의 북마크 10~15개 추가:

- 개발: GitHub, Stack Overflow, MDN Web Docs
- 디자인: Dribbble, Behance, Figma
- 뉴스: BBC News, TechCrunch
- 쇼핑: Amazon, 쿠팡
- 기타: Gmail, Notion

각 북마크에 실제 URL, 설명, 파비콘 URL 설정

`php artisan db:seed --class=BookmarkSeeder` 실행

## 2. 검색 기능 테스트

BookmarkController의 index() 메서드에 검색 기능 추가:

```php
$query = Bookmark::with('category');

if ($request->has('search')) {
    $search = $request->get('search');
    $query->where('title', 'like', "%{$search}%")
          ->orWhere('url', 'like', "%{$search}%");
}

if ($request->has('category_id')) {
    $query->where('category_id', $request->get('category_id'));
}

$bookmarks = $query->latest()->get();
```

## 3. 파비콘 자동 로드 개선

Bookmark 모델의 getFaviconUrlAttribute() 메서드를 다음과 같이 수정:

```php
public function getFaviconUrlAttribute()
{
    if ($this->attributes['favicon_url']) {
        return $this->attributes['favicon_url'];
    }
    
    $domain = parse_url($this->url, PHP_URL_HOST);
    return "https://www.google.com/s2/favicons?domain={$domain}&sz=64";
}
```

## 4. 반응형 테스트

- 브라우저 개발자 도구로 모바일 뷰 확인
- 네비게이션 바가 모바일에서 햄버거 메뉴로 변경되는지 확인
- 북마크 카드 그리드가 1열로 변경되는지 확인

## 5. 최종 개선 사항

- 북마크 카드에 호버 효과 추가 (scale, shadow 증가)
- 카테고리 배지에 아이콘 추가 (Heroicons 또는 Font Awesome 사용)
- 즐겨찾기 북마크를 목록 상단에 고정
- 방문 횟수 증가 기능 구현 (선택적)

모든 기능이 정상 작동하는지 확인하고, 사용자 경험을 개선하세요.

기대 결과: 더미 데이터가 추가되고, 검색 기능이 작동하며, 파비콘이 자동으로 로드됩니다. 반응형 디자인이 모바일에서도 잘 작동하고, 모든 CRUD 기능이 정상적으로 동작합니다. 완성된 북마크 관리 시스템을 사용할 수 있습니다.

제출된 작품 (0)

로그인 후 제출

아직 제출된 작품이 없습니다. 첫 번째 도전자가 되어보세요!

댓글 (0)

로그인 후 댓글을 남길 수 있습니다.
아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!