0. 개요
지난번 포스팅으로 아티즌 콘솔 기능을 알아봤습니다.
이번에는 실무에서 쓰일법한 백업 기능을 명령어로 만들고 스케줄링 기능을 통해 자동 백업 시스템을 만들어봅시다.
지난번 포스팅에서 이어지므로 프로젝트 세팅을 넘어가겠습니다.
그렇지만 지난번 포스팅을 따라 하지 않고도 적용시킬 수 있으므로 참고하시기 바랍니다.
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
이제 스케줄에 해당 명령어를 등록해봅시다.
스케줄링을 모르시면 아래 글 참고를 부탁드립니다.
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
감사합니다.
'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 |