라라벨의 Soft Delete 기능에 대해 알아보자. (categories와 articles 테이블 추가)

포스트 썸네일 이미지

이번 포스트에서는 Category와 Article의 모델과 마이그레이션 파일을 생성하고, 필요한 컬럼들을 추가해 보겠다.

그리고 드디어 이전 포스트들에서 2번 정도 언급한 적이 있었던 Soft Delete 기능에 대해서 알아보겠다.




이전 포스트




전체적인 코드 수정은 이 깃허브 링크를 통해서 확인할 수 있다.




Category와 Article의 모델・마이그레이션 파일 생성


make bash #컨테이너 안으로 들어간다.
php artisan make:model Category -m
php artisan make:model Article -m

VSCode의 터미널에서 이 명령어들을 실행해서 Category와 Article 모델을 생성한다.

-m 옵션을 꼭 붙여서 마이그레이션 파일도 같이 생성한다.


Livewire를 사용할 것이기 때문에 컨트롤러는 생성하지 않았다.





categories 테이블에 추가할 컬럼


create_categories_table.php

public function up(): void
{
    Schema::create('categories', function (Blueprint $table) {
        $table->id();
        $table->string('name', 15)->unique();
        $table->string('slug', 20)->unique();
        $table->unsignedSmallInteger('parent_id')->nullable();
        $table->timestamps();
    });
}

생성한 create_categories_table.php 파일을 이렇게 수정한다.

id와 timestamps는 원래 있었고, 그 사이에 3줄이 추가됐다.


name 컬럼과 slug 컬럼에는 unique() 메서드를 추가해서 동일한 값을 가진 레코드가 두 개 이상 생성되는 것을 방지했다.


parent_id 컬럼은 상위 카테고리가 존재하는 경우에는 이 컬럼에 상위 카테고리의 ID를 넣으면 된다.

그러니 이 컬럼이 비어있으면 상위 카테고리인 것이고, ID 값이 들어있으면 하위 카테고리인 것이다.

null을 허용하는 nullable()을 추가했다.




articles 테이블에 추가할 컬럼


create_articles_table.php의 코드 캡처





create_articles_table.php

public function up(): void
{
    Schema::create('articles', function (Blueprint $table) {
        $table->id();
        $table->foreignId('category_id')->constrained()->cascadeOnDelete();
        $table->string('title', 60);
        $table->foreignId('user_id')->constrained()->cascadeOnDelete();
        $table->text('body');
        $table->json('images')->nullable();
        $table->unsignedMediumInteger('view_count')->default(0);
        $table->string('ip_address', 45)->nullable();
        $table->timestamps();
        $table->softDeletes();
    });
}


  • category_id: 어떤 카테고리의 글인지 저장할 수 있도록 category_id 컬럼을 추가했다. cascadeOnDelete() 메서드에 대해서는 아래의 링크를 참고하자.
  • title: 글의 제목을 저장하는 문자열 컬럼이다. 최대 60자까지 저장할 수 있다. 제목은 일반적으로 짧기 때문에 적절한 길이로 정의했다.
  • user_id: 작성자 정보를 저장하기 위해 user_id 컬럼을 추가했다.
  • body: 글의 내용을 저장하는 텍스트 컬럼이다. 긴 텍스트를 저장할 수 있는 text 타입으로 정의되어 있어, 긴 내용을 저장할 수 있다.
  • images: 이미지 첨부 기능을 당장 구현하지는 않을 거지만, 나중을 위해서 images 컬럼을 미리 추가했다. 첨부파일 형태로 이미지 여러 개를 배열로 관리하고 싶다면 컬럼 타입을 json으로 해야 한다.
  • view_count: 글의 조회수를 저장하는 view_count 컬럼이다. unsignedMediumInteger는 0부터 16,777,215까지 저장할 수 있다. 이 숫자가 너무 큰 것 같다면 한단계 아래의 unsignedSmallInteger가 있는데, 이건 0부터 65,535까지 저장할 수 있다.
  • ip_address: 범죄 예고 글을 올리는 악성 사용자에 대한 수사 협조, 악성 도배 방지, 보안 로그 추적을 위해 게시글 작성 당시의 IP를 저장해 두는 것이 좋다.


여기까지 컬럼들을 추가했다면, php artisan migrate를 실행해서 DB에 실제 테이블을 생성하자.




cascadeOnDelete() 메서드에 대해서는 여기서 자세히 설명했었다.




$table->softDeletes();에 대해서는 아래에서 이어서 설명하겠다.

이게 오늘의 글의 핵심이다.





Soft Delete 기능


소프트 딜리트Soft Delete는 데이터를 DB에서 실제로 완전히 삭제하지 않고, '삭제 처리되었다'는 표시만 해두고 숨기는 기법이다.

쉽게 생각해서 컴퓨터의 '휴지통' 기능과 같다.


글을 작성한 회원이 글을 삭제해도 웹사이트상에서는 글이 삭제된 것처럼 사라지지만, 사실은 DB에 아직 남아있는 것이다.

글은 웹사이트의 관리자가 최종적으로 삭제를 해야 진짜 DB에서 삭제가 된다.


분쟁이나 악성 게시글, 사이버 범죄 발생 시 유저가 글을 삭제하더라도 서버 DB에는 레코드가 남아있어 경찰 수사 협조나 로그 추적이 가능하도록 하는 것이다.




Article 모델에 SoftDeletes를 임포트


app/Models/Article.php에 추가할 코드

use Illuminate\Database\Eloquent\SoftDeletes;

class Article extends Model
{
    use SoftDeletes;
}

Soft Delete 기능을 활성화하기 위해서는 Article 모델에 use SoftDeletes;를 추가하고 Import 해야 한다.




다음 포스트

이 글이 도움이 됐거나 유익했다면 스크롤을 조금만 더 내려서 댓글을 남겨주세요. (비로그인도 가능합니다!)
응원이나 피드백이 담긴 댓글은 제가 계속 블로그를 해나갈 수 있는 원동력이 됩니다. 😊

지인에게 보여주고 싶은 글이었다면 URL을 복사해서 메신저나 소셜 미디어에 공유해 주세요.
이전 포스트 다음 포스트

댓글 쓰기

0 Comments

문의하기 양식