PHP 8 ์ ์๋ก์ด ๊ธฐ๋ฅ - ํน์ฑ(Attribute)
๊ฐ์
Attribute ๋ ๋ฉํ ๋ฐ์ดํฐ(meta data)๋ ์ ์ธ์ ์ ๋ณด(declarative information)๋ฅผ ์ฝ๋์ ์ฐ๊ฒฐํ๋ ๊ฐ๋ ฅํ ๋ฐฉ๋ฒ์ ๋๋ค.
Java ์์๋ annotation ์ด๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ C# ์์๋ PHP ์ ๋ง์ฐฌ๊ฐ์ง๋ก Attribute ๋ก ๋ช ๋ช ๋์ด ์์ต๋๋ค.
Attribute ๋ฅผย ์์ฑ์ด๋ผ๊ณ ๋ฒ์ญํ ๊ณณ๋ ์๋๋ฐ ์์ฑ์ property ์ ์๋ฏธ๊ฐ ๊ฒน์น๋ฏ๋ก ์ ๋นํ ์ฉ์ด๊ฐ ์๋๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๊ธฐ์ ๋ฒ์ญ์ ๋ ํผ๋ฐ์ค์ธ Microsoft ์ ์ธ์ด ํฌํธ ์ฌ์ดํธ๋ฅผ ๋ณด๋ฉด attribute ๋ฅผ 'ํน์ฑ' ์ผ๋ก ๋ฒ์ญํ๊ณ ์์ผ๋ฉฐ ์ ๊ฐ ์๊ฐํ๊ธฐ์๋ ์์ฑ๋ณด๋ค๋ ํน์ฑ์ด ๋ ์ ๋นํ ๋จ์ด๊ฐ์ผ๋ฏ๋ก ์ด ๊ธ์์๋ Attribute ๋ฅผ ํน์ฑ์ด๋ผ๊ณ ์ง์นญํ๊ฒ ์ต๋๋ค.
PHP ์ attribute ๋ class, method, variable, parameter ๋ฑ์ ๋ถ์ฌํ ์ ์์ผ๋ฉฐ compiler time ๊ณผ runtime ์ attribute ๋ฅผ ์ด์ฉํด์ ํน๋ณํ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์์ต๋๋ค.
์๋ก PHPStorm ์ ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ถ๋ณ ์์ฑ์ ๊ฐ์ง ๋ณ์์ ๋ํด ์๋์ ๊ฐ์ด attribute ๋ฅผ ์ง์ ํ๋ฉด ์์ ํ ๊ฒฝ์ฐ IDE ์์ ๊ฐ์งํด์ ์๋ฌ๋ฅผ ํ์ํ๋ฏ๋ก ์ฝ๋ฉ ์ค์๋ฅผ ์ค์ผ ์ ์์ต๋๋ค.
<?php use JetBrains\PhpStorm\Immutable; class MyClass { #[Immutable] private int $read_only_var; public function setValue(int $value): void { $this->read_only_var = $value; } }
๊ธฐ์กด์ docblocks ์ @ ๋ฅผ ์ฌ์ฉํด์ annotation ์ ๋ฌ ๊ฒฝ์ฐ ์คํ๋ฅผ ๋ด๊ฑฐ๋ ์๋ annotation ์ ์ฌ์ฉํด๋ ์ฝ๋๊ฐ ์๋๋ผ ์ฃผ์์ด๋ฏ๋ก IDE ์์ ์๋ฌ๋ฅผ ๊ฐ์งํ์ง ์ด๋ ค์ ์ต๋๋ค.
Attribute ๋ ๊ธฐ์กด์ docblocks ์ฌ์ฉํ ์ฃผ์์ ๋นํด ํ์ฑ ๋ฐ ๋ถ์์ด ์ฉ์ดํ๋ฏ๋ก PHPStorm ๊ฐ์ IDE ๊ฐ ๋ ์ ํํ๊ฒ ๋์ํ๋ฉฐ phpstan ์ด๋ psalm ๊ฐ์ ์ ์ ๋ถ์๊ธฐ๊ฐ ๋ ์ ๊ตํ๊ฒ ๋์ํ๋ ์ฅ์ ์ด ์์ต๋๋ค.
๋ docblocks ์ฃผ์์ ๋ฉ๋ชจ๋ฆฌ๊น์ง ๋ก๋ฉํด์ผ ํ๋ ๊ธฐ์กด ๋ฐฉ์์ ๋นํด JIT ์ผ๋ก ์ต์ ํ๊ฐ ์ฉ์ดํ๊ณ Run time ์ Reflection ์ ๋ ๋น ๋ฅด๊ฒ ํ ์ ์์ผ๋ฉฐ ์คํ ์๊ฐ๋ ๋ ์งง์์ง์ง ์์๊น ์ถ์ธกํฉ๋๋ค.
Symfony ๋ Doctrine ๊ฐ์ ์ ๋ช ํ PHP Framework ๋ Attribute ๋ฅผ ์ง์ํ๋๋ก ์์ ๋์๊ณ psalm ์ด๋ phpstan ๋ Attribute ๋ฅผ ์ง์ํ๋ ๋ฒ์ ์ ๋ฐํํ์ผ๋ฏ๋ก Attribute ์ ์ ํ์ฉํด์ ์ข์ ํ์ง์ ์ฝ๋๋ฅผ ์์ฑํ๋๋ก ์ฐ์ต์ด ํ์ํ ์์ ์ ๋๋ค.
๋ง์ฝ attribute ์ ํ์์ฑ๊ณผ ํ์ฉ ๋ฐฉ๋ฒ์ด ์ ์ดํด๊ฐ ๋์ง ์๋๋ค๋ฉด C# ์ด๋ Java ์์ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ์ฐพ์ ๋ณด๋ ๊ฒ๋ ๋ง์ ๋์์ด ๋ฉ๋๋ค.
ํนํ Spring framework ๋ฅผ ์ ์ฌ์ฉํ๋ ค๋ฉด ์ด์ง๋ฌ์ธ ์ ๋๋ก ์๋ง์ annotation ์ ํ์ฉํ meta programming ๊ธฐ๋ฒ์ด ํ์ํฉ๋๋ค.
๋ฌธ๋ฒ
PHP ๋ ํน์ฑ์ ๋ถ์ฌํ๋ ๋ฌธ๋ฒ์ผ๋ก #[Attr] ์ ์ฌ์ฉํ๋๋ฐ ์ด๊ฑธ๋ก ๊ฒฐ์ ํ๊ธฐ๊น์ง ์ฌ๋ฌ ์ฐ์ฌ ๊ณก์ ์ด ์์๋ ๋ด ๋๋ค.(PHP Annotated โ August 2020 (haah.kr)ย ์ฐธ๊ณ )
use App\Attributes\ExampleAttribute; #[ExampleAttribute] class Foo { #[ExampleAttribute] public const FOO = 'foo'; #[ExampleAttribute] public $x; #[ExampleAttribute] public function foo(#[ExampleAttribute] $bar) { } }
Laravel 8์ PHP 7.3 ๋ถํฐ ์ง์ํ๋ฏ๋ก Attribute ๋ฅผ ์ ๋๋ก ์ง์ํ๊ณ ์์ง๋ ์์ต๋๋ค. ๋์ PHP 8 ๋ก ๋ผ๋ผ๋ฒจ์ ๊ตฌ๋ํ ๊ฒฝ์ฐ Attribute ๋ฅผ ์ฌ์ฉํ๋๋ฐ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
์๋ก PHP 8 ์ ์ฌ์ฉํ๋ค๋ฉด ๋ผ๋ผ๋ฒจ ๋ผ์ฐํ ์ Attribute ๋ก ๊ด๋ฆฌํ๋ ํจํค์ง์ธ spatie/laravel-route-attributes ๋ฅผ ์ด์ฉํด์ ๋ผ์ฐํ ์ ๊ด๋ฆฌํด ์ค๋ ๋ฉ๋๋ค.