[Laravel9] 라라벨 DB 백업 명령어 만들기 및 자동화 with Artisan console

2022. 11. 1. 13:10· PHP/Laravel
목차
  1. 0. 개요 
  2. 1. DatabaseBackup
  3. 2. Timezone
  4. 3. Scheduling
  5. 4. Scheduling Background

0. 개요 

지난번 포스팅으로 아티즌 콘솔 기능을 알아봤습니다.

https://seung.tistory.com/entry/Laravel9-%EB%9D%BC%EB%9D%BC%EB%B2%A8-%EC%95%84%ED%8B%B0%EC%A6%8C-%EC%BD%98%EC%86%94-%EB%A7%8C%EB%93%A4%EA%B8%B0Artisan-console

 

[Laravel9] 라라벨 아티즌 콘솔 만들기(Artisan console)

0. 개요 라라벨에서는 php artisan을 이용해서 기본적인 명령어를 실행할 수 있습니다. 익숙한 걸로 Controller 생성과 Model 생성이 있죠. 라라벨은 직접 php artisan 명령어를 만들 수 있도록 지원합니다.

seung.tistory.com

 

이번에는 실무에서 쓰일법한 백업 기능을 명령어로 만들고 스케줄링 기능을 통해 자동 백업 시스템을 만들어봅시다.

지난번 포스팅에서 이어지므로 프로젝트 세팅을 넘어가겠습니다.

 

그렇지만 지난번 포스팅을 따라 하지 않고도 적용시킬 수 있으므로 참고하시기 바랍니다.

 

1. DatabaseBackup

아래 명령어로 Command 클래스를 만들어줍시다.

php artisan make:command DatabaseBackup

아래와 같이 수정해줍시다.

직접적인 비즈니스 로직은 BackupService 클래스에서 선언하도록 합시다.

 

app/Console/Commands/DatabaseBackup.php

<?php

namespace App\Console\Commands;

use App\Services\BackupService;
use Illuminate\Console\Command;

class DatabaseBackup extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'database:backup';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = '현재 저장된 멤버에 대해 백업파일을 생성합니다.';

    /**
     * Execute the console command.
     *
     * @return int
     */
    public function handle(BackupService $backupService)
    {
        $this->info($backupService->backup());
        return Command::SUCCESS;
    }
}

 

이제 주된 기능인 백업 기능을 만들어줍시다, 직접 클래스를 만들어주시면 됩니다.

app/Service/BackupService.php

<?php

namespace App\Services;

use Carbon\Carbon;

class BackupService
{
    public function backup(){
        $filePath = storage_path()."/app/backup/".Carbon::now()->format("Ymd-His")."-tables.sql";
        $user = env("DB_USERNAME");
        $password = env("DB_PASSWORD");
        $host = env("DB_HOST");
        $database = env("DB_DATABASE");

        /*
         * 아래 두 $command 변수를 순서대로 1번 2번이라고 칭하겠습니다.
         * */
        // $command = "mysqldump -u $user -p$password --host $host $database > $filePath";
        $command = "mysqldump --login-path=$user --host $host $database > $filePath";

        $output = null;
        exec($command, $output, $error);

        // exec 를 통해 에러가 발생하면 $error 변수에 에러코드가 담깁니다.
        if (isset($error) && $error > 0) {
            return "다음 에러코드가 발생했습니다, ERROR CODE : ".$error;
        }

        return $filePath."에 성공적으로 저장되었습니다.";
    }
}

처음 1번 $command의 주석을 풀고 진행하면 아래와 같은 경고를 확인할 수 있습니다.

아래 경고는 비밀번호가 cli 명령어로 노출되기 때문에 보안상의 이유로 경고를 하는 것입니다.

mysqldump: [Warning] Using a password on the command line interface can be insecure.

이를 없애기 위해서는 최소 한 번을 패스워드 입력을 통해 mysql에 접속한 후 2번 $command를 사용하게 바꾸면 아래와 같이 경고가 발생하지 않는 것을 확인할 수 있습니다.

왜냐하면 1번과 달리 2번은 -p 가 아닌 --login-path 옵션을 사용했기 때문입니다.

이로 인해 비밀번호가 노출되지 않게 되었습니다.

 

이로써 백업 명령어를 만들었습니다.

 

2. Timezone

백업 파일을 저장할 때 연도월일-시간분초로 저장했습니다.

하지만 숫자가 영 이상한 분들이 존재할 수 있습니다.

 

이는 라라벨의 타임존 설정이 지금 존재하는 곳으로 되어있지 않아서입니다.

저는 서울이므로 아래와 같이 수정하겠습니다.

config/app.php

//    'timezone' => 'UTC',
    'timezone' => 'Asia/Seoul',

 

3. Scheduling

이제 스케줄에 해당 명령어를 등록해봅시다.

스케줄링을 모르시면 아래 글 참고를 부탁드립니다.

https://seung.tistory.com/entry/Laravel-%EB%9D%BC%EB%9D%BC%EB%B2%A8-%EC%8A%A4%EC%BC%80%EC%A4%84%EB%A7%81Scheduling%ED%95%98%EA%B8%B0-with-crontab

 

Laravel 라라벨 스케줄링(Scheduling)하기 with crontab

개요 스케줄링이란 서버에다가 특정 시간마다 또는 특정 주기마다 작업을 예약해 놓는 기능을 의미합니다. 라라벨에서는 스케줄링 기능을 지원하고 있습니다. 스케줄링 우선 로컬 개발환경에

seung.tistory.com

app/Console/Kernel.php

<?php

namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
    /**
     * Define the application's command schedule.
     *
     * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {
        // 테스트를 위해 분당 한번 씩 실행합니다.
        $schedule->command('database:backup')->everyMinute();
    }

    /**
     * Register the commands for the application.
     *
     * @return void
     */
    protected function commands()
    {
        $this->load(__DIR__.'/Commands');

        require base_path('routes/console.php');
    }
}

아래 명령어로 스케줄링을 실행시킵시다.

php artisan schedule:work

그러면 아래와 같이 백업 파일이 추가되는 걸 확인할 수 있습니다.

 

4. Scheduling Background

앞서 다룬 schedulel:work를 cron으로 백그라운드로 다뤄봅시다

sudo vi /etc/crontab

아래 코드로 개인의 맞춰 시간 및 경로 설정을 해줍시다.

*  *    * * *       root    cd /home/vagrant/code/프로젝트명 && php artisan schedule:run >> /dev/null 2>&1

크론을 재실행해줍시다.

sudo systemctl restart cron
# 만약 에러가 나면 아래 명령어로
sudo systemctl restart crond.service

이제 백그라운드로 돌아가며 백업 파일을 생성하는 것을 확인하실 수 있습니다.

 

아래 주소에서 전체 코드 확인이 가능합니다.

https://github.com/DSeung001/Blog/tree/master/laravel_cli

 

GitHub - DSeung001/Blog: blog source

blog source . Contribute to DSeung001/Blog development by creating an account on GitHub.

github.com

감사합니다.

 

 

반응형

'PHP > Laravel' 카테고리의 다른 글

Laravel Routing이 Apache Routing 보다 우선순위가 낮을 때  (0) 2023.06.14
[Laravel9] 쉽게 라라벨 DI, IOC 이해하기  (0) 2023.02.16
[Laravel9] 라라벨 아티즌 콘솔 명령어 만들기(Artisan console)  (2) 2022.10.31
[Laravel9] 라라벨 테스팅 만들기 with Trait, Factory  (0) 2022.10.28
[Laravel9] 라라벨 이메일 보내기 with Google SMTP, Markdown  (0) 2022.10.24
  1. 0. 개요 
  2. 1. DatabaseBackup
  3. 2. Timezone
  4. 3. Scheduling
  5. 4. Scheduling Background
'PHP/Laravel' 카테고리의 다른 글
  • Laravel Routing이 Apache Routing 보다 우선순위가 낮을 때
  • [Laravel9] 쉽게 라라벨 DI, IOC 이해하기
  • [Laravel9] 라라벨 아티즌 콘솔 명령어 만들기(Artisan console)
  • [Laravel9] 라라벨 테스팅 만들기 with Trait, Factory
DSeung
DSeung
DSeung
Dev log
DSeung
  • 분류 전체보기 (193)
    • PHP (62)
      • Laravel (31)
      • Error (5)
      • Setting (11)
      • Modern PHP (15)
    • Go Lang (51)
      • Study (30)
      • Algorithm (17)
      • Setting (1)
      • Error (3)
    • Java (11)
      • Spring (3)
      • JSP (0)
      • Error (2)
      • Setting (2)
      • 단축키 (2)
    • JavaScript (6)
      • Modern JavaScript (4)
      • Node (1)
    • Android Kotlin (5)
      • Study (4)
      • Error (1)
    • 컴퓨팅 기술 (12)
      • 데이터베이스시스템 (4)
      • Docker (2)
      • 크롤링 & 스크래핑 (1)
      • API (1)
      • 클라우드 (1)
      • 네트워크 (1)
    • MySQL (7)
    • AWS (1)
    • Git (5)
      • GItLab (1)
      • GitHub (4)
    • 도메인 (2)
      • 안과 (2)
    • 자격증 (7)
      • SQLD (1)
      • 정보처리기사 (6)
    • Mac os (1)
    • 나머지 (13)
      • tistory (1)
      • 기타 (9)
      • 일기 (3)
    • 독서 (10)

인기 글

최근 글

블로그 메뉴

  • 홈
  • 태그
전체
오늘
어제
hELLO · Designed By 정상우.v4.2.0
DSeung
[Laravel9] 라라벨 DB 백업 명령어 만들기 및 자동화 with Artisan console
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.