PHP 8.3 열거형을 이용한 비디오 카테고리 관리

발행: (2026년 3월 9일 AM 12:00 GMT+9)
4 분 소요
원문: Dev.to

I’m happy to translate the article for you, but I’ll need the full text of the post (the content you’d like translated). Could you please paste the article’s body here? Once I have that, I can provide a Korean translation while preserving the source link, formatting, markdown, and any code blocks.

카테고리를 위한 Enum 사용

Enum 사용 전 (취약하고 타입 안전성 없음)

// Before: 취약하고 타입 안전성 없음
class Categories {
    const MUSIC = 'music';
    const GAMING = 'gaming';
    const ENTERTAINMENT = 'entertainment';
}

function getVideos(string $category): array { /* ... */ }

getVideos('musci'); // 오타가 컴파일에 통과해 조용히 실패

Enum 사용 후 (타입 안전, IDE 지원, 완전 매칭)

// After: 타입 안전, IDE 지원, 완전 매칭
enum Category: string {
    case Music = 'music';
    case Gaming = 'gaming';
    case Entertainment = 'entertainment';
}

function getVideos(Category $category): array { /* ... */ }

getVideos(Category::Music); // 타입 안전

YouTube 카테고리 ID 매핑

enum VideoCategory: int {
    case FilmAnimation   = 1;
    case AutosVehicles   = 2;
    case Music           = 10;
    case PetsAnimals     = 15;
    case Sports          = 17;
    case ShortMovies     = 18;
    case TravelEvents    = 19;
    case Gaming          = 20;
    case Videoblogging   = 21;
    case PeopleBlogs     = 22;
    case Comedy          = 23;
    case Entertainment   = 24;
    case NewsPolitics    = 25;
    case HowtoStyle      = 26;
    case Education       = 27;
    case ScienceTech     = 28;
    case NonprofitsActivism = 29;
    case Movies          = 30;
    case AnimeAnimation  = 31;
    case ActionAdventure = 32;
    case Classics        = 33;
    case Documentary     = 35;
    case Shorts          = 42;

    public function label(): string {
        return match($this) {
            self::FilmAnimation   => 'Film & Animation',
            self::Music           => 'Music',
            self::Gaming          => 'Gaming',
            self::Entertainment   => 'Entertainment',
            self::NewsPolitics    => 'News & Politics',
            self::ScienceTech     => 'Science & Tech',
            self::HowtoStyle      => 'How-to & Style',
            self::Education       => 'Education',
            self::Comedy          => 'Comedy',
            self::Sports          => 'Sports',
            self::PeopleBlogs     => 'People & Blogs',
            default                => $this->name,
        };
    }

    public function slug(): string {
        return strtolower(preg_replace('/[^a-z0-9]+/i', '-', $this->label()));
    }

    public function icon(): string {
        return match($this) {
            self::Music           => 'music-note',
            self::Gaming          => 'gamepad',
            self::Entertainment   => 'star',
            self::NewsPolitics    => 'newspaper',
            self::ScienceTech     => 'flask',
            self::Sports          => 'trophy',
            default                => 'play-circle',
        };
    }

    /**
     * Categories displayed in the navigation bar.
     */
    public static function navCategories(): array {
        return [
            self::Music,
            self::Gaming,
            self::Entertainment,
            self::NewsPolitics,
            self::ScienceTech,
            self::Sports,
            self::HowtoStyle,
            self::Education,
            self::Comedy,
            self::PeopleBlogs,
        ];
    }
}

Region 열거형

enum Region: string {
    case US = 'US';
    case GB = 'GB';
    case JP = 'JP';
    case KR = 'KR';
    case TW = 'TW';
    case SG = 'SG';
    case VN = 'VN';
    case TH = 'TH';
    case HK = 'HK';

    public function label(): string {
        return match($this) {
            self::US => 'United States',
            self::GB => 'United Kingdom',
            self::JP => 'Japan',
            self::KR => 'South Korea',
            self::TW => 'Taiwan',
            self::SG => 'Singapore',
            self::VN => 'Vietnam',
            self::TH => 'Thailand',
            self::HK => 'Hong Kong',
        };
    }

    public function flag(): string {
        // Convert country code to flag emoji
        $chars = str_split($this->value);
        return implode('', array_map(
            fn(string $c) => mb_chr(ord($c) - ord('A') + 0x1F1E6),
            $chars
        ));
    }

    public function hreflang(): string {
        return match($this) {
            self::JP => 'ja',
            self::KR => 'ko',
            self::TW => 'zh-TW',
            self::HK => 'zh-HK',
            self::VN => 'vi',
            self::TH => 'th',
            default  => 'en',
        };
    }
}

포괄적인 매칭 예시

// This match is exhaustive — add a new Region case
// and PHP warns you about every unhandled match
function cronInterval(Region $region): string {
    return match($region) {
        Region::US, Region::GB => '*/2 * * * *',
        Region::JP, Region::KR => '*/3 * * * *',
        Region::TW, Region::SG, Region::HK => '*/4 * * * *',
        Region::VN, Region::TH => '*/6 * * * *',
    };
}
class CacheConfig {
    const int    HOME_TTL     = 10800;
    const int    WATCH_TTL    = 21600;
    const int    SEARCH_TTL   = 600;
    const int    CATEGORY_TTL = 86400;
    const string CACHE_DIR    = 'data/pagecache';
}

타입이 지정된 상수는 열거형을 잘 보완하며, 실수로 인한 타입 불일치를 방지하고 버그의 전체 범주—예를 들어 지역 코드 오타, 잘못된 카테고리 ID, 잘못 구성된 캐시 정책—를 제거합니다. PHP 8.1 이상을 사용하고 있다면 이를 채택하지 않을 이유가 없습니다.

0 조회
Back to Blog

관련 글

더 보기 »