113호. 라라벨 태그 free

2020-01-13


컨텐트를 다루는 애플리케이션을 만든다면 아마 대부분 태그를 활용하실거라 생각합니다. 태깅 기능을 직접 만드는 건 그리 어렵지 않지만 한땀 한땀 직접 만드는 대신 남이 잘 만들어 둔 패키지를 가져다 쓰는게 더 나을 수 있습니다.


packagist.org에서 laravel tag로 검색해 보면 라라벨에서 쓸 수 있는 여러 태그 패키지가 나옵니다. 이 중 스타 수나 다운로드 수로 봤을 때 spatie/laravel-tags, rtconner/laravel-tagging, cviebrock/eloquent-taggable가 검토해 볼만한 패키지인 것 같습니다.


가장 최근까지 업데이트가 이뤄지고 관리가 잘 되고 있는 패키지는 spatie/laravel-tags 인 것 같습니다. rtconner/laravel-tagging는 라라벨 6을 지원한다는 표시가 없고, cviebrock/eloquent-taggable는 라라벨 6를 지원하긴 하지만 수년간 라라벨 버전에 맞춰 업데이트 한 것 이외에 기능이 추가되거나 개선되진 않았네요.


spatie/laravel-tags는 기본적인 태깅 기능 이외에도 태그 다국어 지원, 다중 태그 타입, 정렬 기능 등을 추가로 제공한다고 합니다. 패키지를 설치하고 설정한 후 태그를 붙이고자 하는 모델에 Spatie\Tags\HasTags 트레이트만 끼워주면 태깅 기능을 바로 사용할 수 있습니다. README의 예제를 보면 패키지가 제공하는 기능을 빠르게 파악할 수 있습니다.


// 모델을 생성하면서 태그를 붙임. 모델의 $fillable에 'tags'를 추가해야 함.
$newsItem = NewsItem::create([
'name' => 'The Article Title',
'tags' => ['first tag', 'second tag'], // 기존에 존재하지 않는 태그는 새로 생성됨
]);

//태그 추가
$newsItem->attachTag('third tag');
$newsItem->attachTags(['fourth tag', 'fifth tag']);

//태그 제거
$newsItem->detachTags('third tag');
$newsItem->detachTags(['fourth tag', 'fifth tag']);

//태그 동기화
$newsItem->syncTags(['first tag', 'second tag']); // 이 두 태그 이외의 모든 태그는 제거됨

//타입을 이용한 동기화
$newsItem->syncTagsWithType(['category 1', 'category 2'], 'categories');
$newsItem->syncTagsWithType(['topic 1', 'topic 2'], 'topics');

//타입을 이용한 태그 조회
$newsItem->tagsWithType('categories');
$newsItem->tagsWithType('topics');

//주어진 태그 중 하나라도 가지고 있는 모델을 조회
NewsItem::withAnyTags(['first tag', 'second tag'])->get();

//주어진 태그 모두를 가지고 있는 모델을 조회
NewsItem::withAllTags(['first tag', 'second tag'])->get();

//태그 다국어
$tag = Tag::findOrCreate('my tag');
$tag->setTranslation('name', 'fr', 'mon tag');
$tag->setTranslation('name', 'nl', 'mijn tag');
$tag->save();

//다국어 처리한 태그 가져오기
$tag->translate('name'); //my name을 반환
$tag->translate('name', 'fr'); //mon tag을 반환 (로케일 파라미터는 선택사항)

//taggable 모델을 통한 편리한 다국어 기능 사용
$newsItem->tagsTranslated();// slug_translated와 name_transalted 속성을 가진 태그를 반환
$newsItem->tagsTranslated('fr');// 특정 로캐일이 지정된 slug_translated와 name_translated 속성을 가진 태그를 반환

//태그 타입 사용하기
$tag = Tag::findOrCreate('tag 1', 'my type');

//슬러그를 가진 태그
$tag = Tag::findOrCreate('yet another tag');
$tag->slug; //'yet-another-tag'를 반환

//정렬 가능
$tag = Tag::findOrCreate('my tag');
$tag->order_column; // 1을 반환
$tag2 = Tag::findOrCreate('another tag');
$tag2->order_column; // 2를 반환

//태그 순서 조정
$tag->swapOrder($anotherTag);

기본적인 태깅 기능이 필요하면 이 패키지로 사용법을 익히는 시간을 포함해서 20분 이내로 끝낼 수 있겠네요 ㅎㅎ. 구체적인 사용법은 매뉴얼을 참고하세요. 이미 태그 기능을 구현해서 사용하고 계시는 분들은 다른 사람은 어떻게 같은 기능을 구현했는지 살펴보는 것도 좋은 공부가 될 수 있을 것 같아요.


그럼 랄랄라 오늘도 즐거운 하루 되세요!


1일 1식 라라벨 113호

2020년 1월 13일


이현석

메쉬 코리아 개발자. 바쁜 팀장님 대신 알려주는 신입 PHP 개발자 안내서를 쓰고, 클린 아키텍처 인 PHP를 번역했습니다. 2020년에 출간될 Laravel Up & Running 2nd Edition을 번역하고 있습니다.