Laravel Eloquent Model ์ ๋ณ๊ฒฝ ์ฌํญ์ ๊ธฐ๋กํด์ฃผ๋ laravel-auditing ํจํค์ง
๊ฐ์
์น ์๋น์ค๋ฅผ ๊ตฌํํ๋ค ๋ณด๋ฉด ์ฌ์ฉ์๊ฐ ์ค์๋ก ๋ฐ์ดํ๋ฅผ ์ญ์ ํ๊ฑฐ๋ ์์ ํ๋ ๊ฒฝ์ฐ์ ๋๋นํด์ผ ํ ํ์๊ฐ ์์ต๋๋ค.
DBMS ์ฐจ์์ ๋ฐฑ์ ๊ณผ ๋ณต๊ตฌ๋ ์์คํ ์ฅ์ ๋ ํดํน๋ฑ์ ๋น์ ์ํฉ์ ๋๋นํ๋ ์์ ์ด๊ณ ๊ฐ๋ณ ๋ ์ฝ๋์ ๋ณ๊ฒฝ์ ์ถ์ ํ๊ณ ๊ด๋ฆฌํ๋ ๋ฐ์๋ ์ ํฉํ์ง ์์ต๋๋ค.
๋ฌผ๋ก DBMS ๋ฅผ archiving mode ๋ก ์ค์ ํ๊ณ ์ด์ํ๋ฉด ๋ ์ฝ๋ ๋จ์์ ๋ณ๊ฒฝ์ ์ถ์ ํ ์๋ ์์ง๋ง ๋น์์ ๋ณต๊ตฌ์ฉ์ด๋ผ DBA ์ ๋์๊ณผ ์์คํ ์ฐจ์์ ์์ ์ด ํ์ํ๋ฏ๋ก ๋ ์ฝ๋ ๋จ์ ์ค์ ๋ฐฉ์ง๋ app ๋ ๋ฒจ์์ ๋์ํ๋ ๊ฒ ์ ์ ํฉ๋๋ค.
์ญ์ ์ค์๋ ์ผ๋จ soft delete ๊ธฐ๋ฅ์ ์ ์ฉํ๋ฉด ๋์ง๋ง ์ค์๋ก ์๋ชป๋ ๋ฐ์ดํฐ๋ก ์ ๋ฐ์ดํธํ๋ ๊ฒ์ ๋ณ๊ฒฝ ์ด๋ ฅ์ ๋ณ๋๋ก ์ถ์ ํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํด์ผ ํฉ๋๋ค.
์ด๋ฐ ์๊ตฌ ์ฌํญ์ด ๋ค๋ฅธ ๊ณณ์๋ ๋ง์์ง ๋ผ๋ผ๋ฒจ์์ ์ฝ๊ฒ ๋ชจ๋ธ์ ๋ณ๊ฒฝ ์ด๋ ฅ์ ๊ด๋ฆฌํด์ฃผ๋ ย Revisionableย ์ด๋ผ๋ ํจํค์ง์ย ย laravel-auditing ์ด๋ผ๋ ํจํค์ง๊ฐ github ์ ์ฌ๋ผ์ ์๊ณ ์๋นํ ๋ง์ star ๋ฅผ ๋ฐ๊ณ ์์ต๋๋ค.
๋ณ์ ์ ย Revisionableย ์ด ์ข ๋ ๋ง์ง๋ง ์ ๋ ๋งค๋ด์ผ์ด ์ฒด๊ณ์ ์ผ๋ก ๋์ด ์๊ณ ํ ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ ์ปฌ๋ผ์ด ๋ณ๊ฒฝ๋๋ ํ ๊ฑด์ ์ด๋ ฅ ๋ ์ฝ๋๋ง ์๊ธฐ๋ ์ฅ์ ์ด ์๋ย ย laravel-auditingย ์ ์ฌ์ฉํ๊ณ ์๋๋ฐ ๊ฐ๋ตํ ์ฌ์ฉ๋ฒ์ ๊ณต์ ํด ๋ด ๋๋ค.
์ดํ์๋์ด ๋ผ๋ผ๋ฒจ ์ผ์ผ ์ผ์์ย ๋ชจ๋ธ ๋ณ๊ฒฝ ์ด๋ ฅ์ ์๋์ ์ ์ฅํด์ฃผ๋ ํจํค์ง Revisionable ๋ผ๋ ์ ์ฉํ ๊ธ์ ์ฌ๋ ค์ฃผ์ จ์ผ๋ ์ฐธ๊ณ ํ์ธ์.
์ค์น
composer ๋ก ํจํค์ง๋ฅผ ์ค์นํฉ๋๋ค.
composer require owen-it/laravel-auditing
config/app.php ์ ํ๋ก๋ฐ์ด๋๋ฅผ ๋ฑ๋กํฉ๋๋ค.
'providers' => [ // ... OwenIt\Auditing\AuditingServiceProvider::class, // ... ],
vendor ํ์ผ์ ํผ๋ธ๋ฆฌ์ฑํฉ๋๋ค.
php artisan vendor:publish --provider "OwenIt\Auditing\AuditingServiceProvider" --tag="config"
config/audit.phpย ์์ auditing ํจํค์ง์ ๋์์ ์ค์ ํ ์ ์์ต๋๋ค.
<?php return [ // auditing ๋์ ์ฌ๋ถ๋ฅผ ์ค์ ํฉ๋๋ค. 'enabled' => env('AUDITING_ENABLED', true), // User, IP Address ์ ๋ณด๋ฑ์ ๊ฐ์ ธ์ฌ ๋ฆฌ์กธ๋ฒ๋ฅผ ์ค์ ํฉ๋๋ค. 'resolver' => [ 'user' => OwenIt\Auditing\Resolvers\UserResolver::class, 'ip_address' => OwenIt\Auditing\Resolvers\IpAddressResolver::class, 'user_agent' => OwenIt\Auditing\Resolvers\UserAgentResolver::class, 'url' => OwenIt\Auditing\Resolvers\UrlResolver::class, ], // Audit ์ ํ event ๋ฅผ ์ง์ ํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์์ฑ, ๊ฐฑ์ , ์ญ์ , ๋ณต๊ตฌ์ ๋์ํฉ๋๋ค. 'events' => [ 'created', 'updated', 'deleted', 'restored', ],
DB migration ํ์ผ์ ํผ๋ธ๋ฆฌ์ฑํฉ๋๋ค.
php artisan vendor:publish --provider "OwenIt\Auditing\AuditingServiceProvider" --tag="migrations"
audit ์ปฌ๋ผ์ text ์์ json ์ผ๋ก ๋ฐ๊พธ๋ฉด JSON Where ๊ตฌ๋ฌธ์ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก ์์ฑ๋ migration ํ์ผ(๋ ์_create_audits_table.php)์์ ๋ค์ ๋ด์ฉ์ ์์ ํฉ๋๋ค.
// $table->text('old_values')->nullable(); // $table->text('new_values')->nullable(); $table->json('old_values')->nullable(); $table->json('new_values')->nullable();
DB migration ์ ์คํํ๋ฉด Model ์ ๋ณ๊ฒฝ ์ฌํญ์ ๊ธฐ๋กํ๋ audits ํ ์ด๋ธ์ด ์์ฑ๋ฉ๋๋ค.
php artisan migrate
Model ์ค์
๋ณ๊ฒฝ์ ์ถ์ ํ๋ ค๋ Eloquent Model ์ย implements \OwenIt\Auditing\Contracts\Auditableย ๋ฅผ ์ถ๊ฐํ๊ณ ย Auditable trait ์ ์ฌ์ฉํ๋๋ก ์ค์ ํฉ๋๋ค.
์๋์ ์์ ๋ ๊ณ ๊ฐ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ Customer ๋ชจ๋ธ์ ๋ณ๊ฒฝ ์ฌํญ์ ์ถ์ ํฉ๋๋ค.
class Customer extends Model implements \OwenIt\Auditing\Contracts\Auditable { use \OwenIt\Auditing\Auditable;
์ด์ Customer model ์ ์์ฑ/์์ /์ญ์ /๋ณต๊ตฌ ํ๋ ๋ชจ๋ event ๋ง๋ค audits ํ ์ด๋ธ์ ๋ณ๊ฒฝ ์ฌํญ์ด ๊ธฐ๋ก๋ฉ๋๋ค.
Audit ๋ ์ฝ๋ ์ฌ์ฉ
๋ ์ฝ๋ ๊ฐ์ ธ์ค๊ธฐ
audit ๋ ์ฝ๋์ ์ ๊ทผํ๋ ค๋ฉด ๋จผ์ audit ์ด ์ ์ฅ๋ ๋ชจ๋ธ์ ๊ฐ์ ธ์ต๋๋ค.
// Customer id $c = Customer::find(1); // ํด๋น ๋ชจ๋ธ์ ๋ชจ๋ ์ด๋ ฅ๋ค $audits = $c->audits; // ์ฒซ ๋ฒ์งธ ์ด๋ ฅ $f = $audits->first(); // ๋ง์ง๋ง ์ด๋ ฅ $f = $c->audits()->latest()->first(); // id ๋ก ๊ฐ์ ธ์ค๊ธฐ $f = $c->audits()->find(2);
eager loading ์ผ๋ก User ๋ชจ๋ธ ๊ฐ์ ธ์ค๊ธฐ
laravel-auditing ์ ์๋์ผ๋ก ๋ชจ๋ธ์ ๋ณ๊ฒฝํ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ ์ฝ๋์ ์ถ๊ฐํ๋ฏ๋ก ์๋์ ๊ฐ์ด ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
// audit ์ด ์ ์ฅ๋ ๊ณ ๊ฐ id $c = Customer::find(1); // ํด๋น ๋ชจ๋ธ์ ๋ชจ๋ ์ด๋ ฅ๋ค $a = $c->audits->first(); // ์์ ํ ์ฌ์ฉ์ ์ ๋ณด ๊ฐ์ ธ์ด. $a->user;
ํ์ง๋ง $aโuser ๋ฅผ ํธ์ถํ๋ ์์ ์ ๋ค์ DB fetch ๊ฐ ์ผ์ด๋๋ฏ๋ก N + 1 ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ณ ์ฑ๋ฅ์ ์ ์ํฅ์ ์ฃผ๊ฒ ๋๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ด with() ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ์ด๊ฑฐ ๋ก๋ฉ์ผ๋ก ์์ ํ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๊ฐ์ด ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
$c = Customer::find(1); $audits = $c->audits()->with('user')->get();
audit ๋ฉํ ๋ฐ์ดํ ๊ฐ์ ธ์ค๊ธฐ
audit ๊ณผ ๊ด๋ จํ ๋ฉํ ๋ฐ์ดํ๋ฅผ array ๋ก ๊ฐ์ ธ์ค๋ ค๋ฉด audit ๋ชจ๋ธ์ย getMetadata ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ๋ฉ๋๋ค.
$audits = Customer::find(1)->audits; $f = $audits->first(); var_dump($f->getMetadata());
๋ณ๊ฒฝ๋ properties ๋ง ๊ฐ์ ธ์ค๊ธฐ
audit ๋ชจ๋ธ์ getModified ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด audit ํ ์ด๋ธ์ old_values ์ new_values ๋ง ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
$audits = Customer::find(1)->audits; $f = $audits->first(); var_dump($f->getModified ());