HEX
Server: nginx/1.28.3
System: Linux lightweb-s1 5.15.0-173-generic #183-Ubuntu SMP Fri Mar 6 13:29:34 UTC 2026 x86_64
User: dawonefr-98 (1071)
PHP: 8.3.30
Disabled: NONE
Upload Files
File: /home/dnlightw-124/dn.lightweb.kr/config/tenancy.php
<?php

declare(strict_types=1);

use Database\Seeders\TenantSeeder;
use Stancl\Tenancy\Bootstrappers;
use Stancl\Tenancy\Middleware;
use Stancl\Tenancy\Resolvers;
use Stancl\Tenancy\UniqueIdentifierGenerators;

return [
    // v3 requires these top-level keys
    'tenant_model' => App\Settings\Entities\Tenant\Tenant::class,
    'domain_model' => \App\Settings\Entities\Tenant\TenantDomain::class,
    'central_domains' => [
        env('CENTRAL_DOMAIN'),
    ],
    /**
     * Tenancy에 사용되는 모델에 대한 설정.
     */
    'models' => [
        'tenant' => App\Settings\Entities\Tenant\Tenant::class,
        'domain' => \App\Settings\Entities\Tenant\TenantDomain::class,

        'tenant_key_column' => 'tenant_id',
        'id_generator' => UniqueIdentifierGenerators\UUIDGenerator::class,
    ],

    'identification' => [
        'central_domains' => [
            env('CENTRAL_DOMAIN'),
        ],

        'default_middleware' => Middleware\InitializeTenancyByDomainOrSubdomain::class,
        'middleware' => [
            Middleware\InitializeTenancyByDomainOrSubdomain::class,
            Middleware\InitializeTenancyByPath::class,
            Middleware\InitializeTenancyByRequestData::class,
            Middleware\InitializeTenancyByOriginHeader::class,
        ],

        /**
         * 도메인 식별 미들웨어로 인식되는 식별 미들웨어입니다.
         *
         * 이는 액세스 방지 미들웨어를 건너뛰어야 하는지 여부를 결정하는 데 사용됩니다.
         * PreventAccessFromUnwantedDomains은 여기에 포함된 미들웨어와 함께 사용될 때만 사용할 수 있습니다.
         * 다른 식별 미들웨어와 함께 사용되는 경우 이를 건너뛰게 됩니다.
         *
         * 사용자 정의 도메인 식별 미들웨어를 사용하는 경우, 여기에 추가하세요.
         *
         * @see \Stancl\Tenancy\Concerns\UsableWithEarlyIdentification
         * @see \Stancl\Tenancy\Middleware\PreventAccessFromUnwantedDomains
         */
        'domain_identification_middleware' => [
            Middleware\InitializeTenancyByDomainOrSubdomain::class,
        ],

        /**
         * 경로 식별 미들웨어로 인식되는 식별 미들웨어입니다.
         *
         * 경로 식별 사용 중 특정 작업(예: ForgetTenantParameter에서 테넌트 매개변수 삭제)을 수행할 때
         * 경로 식별이 사용되는지 결정하는 데 사용됩니다.
         *
         * 사용자 정의 경로 식별 미들웨어를 사용하는 경우, 여기에 추가하세요.
         *
         * @see \Stancl\Tenancy\Actions\CloneRoutesAsTenant
         * @see \Stancl\Tenancy\Listeners\ForgetTenantParameter
         */
        'path_identification_middleware' => [
            Middleware\InitializeTenancyByPath::class,
        ],

        /**
         * 패키지에서 사용하는 테넌트 리졸버입니다.
         *
         * CachedTenantResolver 계약을 구현하는 리졸버는 캐싱 세부사항을 구성할 수 있는 옵션이 있습니다.
         * 사용자 정의 리졸버를 추가하는 경우, 리졸버가 CachedTenantResolver를 기반으로 하지 않는 한 'cache' 키를 추가하지 마세요.
         */
        'resolvers' => [
            Resolvers\DomainTenantResolver::class => [
                'cache' => false,
                'cache_ttl' => 3600, // 초 단위
                'cache_store' => null, // null = 기본값
            ],
            Resolvers\PathTenantResolver::class => [
                'tenant_parameter_name' => 'tenant',
                'tenant_model_column' => 'host',
                'allowed_extra_model_columns' => [], // 라우트 필드 바인딩에 사용됨

                'cache' => false,
                'cache_ttl' => 3600, // 초 단위
                'cache_store' => null, // null = 기본값
            ],
            Resolvers\RequestDataTenantResolver::class => [
                'cache' => false,
                'cache_ttl' => 3600, // 초 단위
                'cache_store' => null, // null = 기본값
            ],
        ],

        // todo@docs 통합 가이드를 Stancl\Tenancy::defaultMiddleware() 사용으로 업데이트
    ],

    /**
     * 테넌시 부트스트래퍼는 테넌시가 초기화될 때 실행됩니다.
     * Laravel 기능을 테넌트 인식 가능하게 만드는 역할을 합니다.
     *
     * 동작을 구성하려면 아래의 구성 키를 참조하세요.
     */
    'bootstrappers' => [
        // 기본 Laravel 기능
        Bootstrappers\DatabaseTenancyBootstrapper::class,
        Bootstrappers\CacheTenancyBootstrapper::class,
        // Bootstrappers\CacheTagsBootstrapper::class, // CacheTenancyBootstrapper의 대안
        Bootstrappers\FilesystemTenancyBootstrapper::class,
        Bootstrappers\QueueTenancyBootstrapper::class,
        // Bootstrappers\RedisTenancyBootstrapper::class, // 참고: phpredis 필요

        // 특수 사례 지원
        Bootstrappers\DatabaseSessionBootstrapper::class,
        Bootstrappers\JobBatchBootstrapper::class,

        // 구성 가능한 부트스트래퍼
        // Bootstrappers\RootUrlBootstrapper::class,
        // Bootstrappers\UrlGeneratorBootstrapper::class,
        // Bootstrappers\MailConfigBootstrapper::class, // 참고: 메일 큐 사용에는 $forceRefresh가 true로 설정된 QueueTenancyBootstrapper 필요
        // Bootstrappers\BroadcastingConfigBootstrapper::class,
        // Bootstrappers\BroadcastChannelPrefixBootstrapper::class,

        // 통합 부트스트래퍼
        // Bootstrappers\Integrations\FortifyRouteBootstrapper::class,
        // Bootstrappers\Integrations\ScoutPrefixBootstrapper::class,

        // Bootstrappers\PostgresRLSBootstrapper::class,
    ],

    'database' => [
        'central_connection' => env('DB_CONNECTION', 'mariadb'),

        /**
         * 동적으로 생성된 테넌트 데이터베이스 연결의 "템플릿"으로 사용되는 연결.
         * 참고: 템플릿 연결 이름을 tenant로 설정하지 마세요. 해당 이름은 패키지에서 예약되었습니다.
         */
        'template_tenant_connection' => 'mariadb_tenant',

        /**
         * 테넌트 데이터베이스 생성 및 삭제에 사용되는 임시 연결 이름.
         */
        'tenant_host_connection_name' => 'tenant_host_connection',

        /**
         * 테넌트 데이터베이스 이름은 아래와 같은 방식으로 생성됩니다:
         * prefix + tenant_id + suffix.
         */
        'prefix' => env('DB_DATABASE') . '_',
        'suffix' => '',

        /**
         * TenantDatabaseManagers는 테넌트 데이터베이스 생성 및 삭제를 처리하는 클래스입니다.
         */
        'managers' => [
            'sqlite' => Stancl\Tenancy\Database\TenantDatabaseManagers\SQLiteDatabaseManager::class,
            'mysql' => Stancl\Tenancy\Database\TenantDatabaseManagers\MySQLDatabaseManager::class,
            'mariadb' => Stancl\Tenancy\Database\TenantDatabaseManagers\MySQLDatabaseManager::class,
            'pgsql' => Stancl\Tenancy\Database\TenantDatabaseManagers\PostgreSQLDatabaseManager::class,
            'sqlsrv' => Stancl\Tenancy\Database\TenantDatabaseManagers\MicrosoftSQLDatabaseManager::class,

            /**
             * 각 테넌트 데이터베이스에 대해 DB 사용자를 생성하려면 이 데이터베이스 매니저를 사용하세요.
             * 부여되는 권한을 변경하려면 $grants 속성을 수정할 수 있습니다.
             */
            // 'mysql' => Stancl\Tenancy\Database\TenantDatabaseManagers\PermissionControlledMySQLDatabaseManager::class,
            // 'mariadb' => Stancl\Tenancy\Database\TenantDatabaseManagers\PermissionControlledMySQLDatabaseManager::class,
            // 'sqlsrv' => Stancl\Tenancy\TenantDatabaseManagers\PermissionControlledMicrosoftSQLServerDatabaseManager::class,

            /**
             * 위의 pgsql 매니저를 비활성화하고 아래의 매니저를 활성화하면
             * 데이터베이스가 아닌 스키마를 통해 테넌트 DB를 분리할 수 있습니다.
             */
            // 'pgsql' => Stancl\Tenancy\Database\TenantDatabaseManagers\PostgreSQLSchemaManager::class, // 데이터베이스 대신 스키마로 분리
        ],

        // todo@docblock
        'drop_tenant_databases_on_migrate_fresh' => false,
    ],

    /**
     * 단일 데이터베이스 테넌시와 함께 PostgreSQL 필요.
     */
    'rls' => [
        /**
         * 정책 생성을 위한 쿼리를 생성하는 RLS 매니저.
         *
         * @see Stancl\Tenancy\RLS\PolicyManagers\TableRLSManager
         * @see Stancl\Tenancy\RLS\PolicyManagers\TraitRLSManager
         */
        'manager' => Stancl\Tenancy\RLS\PolicyManagers\TableRLSManager::class,

        /**
         * 테넌트 데이터베이스 사용자에 대한 자격 증명 (모든 테넌트에 대해 하나의 사용자, 각 테넌트에 대한 사용자가 아님).
         */
        'user' => [
            'username' => env('TENANCY_RLS_USERNAME'),
            'password' => env('TENANCY_RLS_PASSWORD'),
        ],

        /**
         * 현재 테넌트 키를 저장하는 데 사용되는 Postgres 세션 변수.
         *
         * 변수 이름에는 네임스페이스(예: 'my.')가 포함되어야 합니다.
         * 전역 네임스페이스는 서버 설정용으로 예약되어 있으므로 네임스페이스가 필요합니다.
         */
        'session_variable_name' => 'my.current_tenant',
    ],

    /**
     * 캐시 테넌시 구성. CacheTenancyBootstrapper, CacheTagsBootstrapper 및 사용자 정의 CacheManager에서 사용됩니다.
     *
     * 이것은 모든 Cache 퍼사드 호출, cache() 헬퍼 호출 및 주입된 캐시 스토어에 대한 직접 호출에 작동합니다.
     *
     * CacheTenancyBootstrapper:
     *   `cache.prefix` 구성을 사용하여 *전역적으로* 접두사가 적용됩니다. 이는 한 테넌트의 캐시를 다른 테넌트와 분리합니다.
     *   스토어 목록은 `cache.prefix` 구성에서 접두사를 다시 로드하도록 새로 고치는 데 사용됩니다.
     *
     * CacheTagsBootstrapper:
     *   캐시의 모든 키에는 태그가 적용됩니다. 이 태그는 기록 시뿐만 아니라 읽을 때도 캐시를 범위 내로 사용합니다.
     *
     * 태그를 지정하여 선택적으로 캐시를 지울 수 있습니다.
     */
    'cache' => [
        'prefix' => 'tenant_%tenant%_', // 이 포맷은 %tenant%가 테넌트 키로 대체되고, 원래의 스토어 접두사로 앞에 추가됩니다. 이는 모든 캐시 키에 사용되는 캐시 접두사를 형성합니다.
        'stores' => [
            env('CACHE_STORE'),
        ],

        /*
         * 세션이 테넌트 인식 가능해야 하는지 여부 (세션 드라이버가 캐시 기반일 때만 사용).
         *
         * 참고: 이는 구성된 세션 스토어를 위의 접두사 스토어 목록에 암시적으로 추가합니다.
         */
        'scope_sessions' => true,

        'tag_base' => 'tenant', // 이 tag_base 뒤에 tenant_id가 따라와 모든 캐시 호출에 적용될 태그를 형성합니다.
    ],

    /**
     * 파일 시스템 테넌시 구성. FilesystemTenancyBootstrapper에서 사용됩니다.
     * https://tenancyforlaravel.com/docs/v3/tenancy-bootstrappers/#filesystem-tenancy-boostrapper.
     */
    'filesystem' => [
        /**
         * 'disks' 배열에 나열된 각 디스크는 tenant_id 뒤에 suffix_base가 추가됩니다.
         */
        'suffix_base' => 'tenant',
        'disks' => [
            'local',
            'public',
            // 's3',
        ],

        /**
         * 로컬 디스크에 대해 이 옵션을 사용하십시오.
         *
         * 자세한 내용은 https://tenancyforlaravel.com/docs/v3/tenancy-bootstrappers/#filesystem-tenancy-boostrapper를 참조하십시오.
         */
        'root_override' => [
            // storage_path()가 접미사로 추가된 후 루트가 재정의되어야 하는 디스크.
            'local' => '%storage_path%/app/',
            'public' => '%storage_path%/app/public/',
        ],

        /*
         * 특정 로컬 디스크에 대해 테넌트 인식 가능한 Storage::disk()->url()을 활성화하려면 여기에서 디스크 이름을 '%tenant%'가 포함된 이름으로 매핑하십시오
         * (이는 디스크의 공용 이름으로 사용됩니다). 이렇게 하면 현재 테넌트의 키가 포함된 URL로 디스크의 기본 URL을 재정의합니다.
         *
         * 예를 들어, 기본적으로 Storage::disk('public')->url('')은 https://your-app.test/storage로 반환됩니다.
         * 'url_override'에 'public' => 'public-%tenant%'를 추가한 후,
         * 반환되는 URL은 https://your-app.test/public-1/이 됩니다 (%tenant%가 현재 테넌트의 키로 치환).
         *
         * 테넌트의 스토리지를 공개 디렉토리로의 심볼릭 링크를 생성하려면 `php artisan tenants:link`를 사용하십시오.
         */
        'url_override' => [
            // tenancy.filesystem.root_override 구성에서 제외되지 않은 로컬 디스크를 추가해야 함
            // todo@v4 'url_override'에 더 설명적인 이름으로 바꾸기
            'public' => 'public-%tenant%',
        ],

        /*
         * 'file' 캐시 드라이버가 테넌트 인식 가능해야 하는지 여부.
         *
         * 이 옵션을 활성화하면 캐시 파일은 storage/{tenant}/framework/cache에 저장됩니다.
         */
        'scope_cache' => true,

        /*
         * 'file' 세션 드라이버가 테넌트 인식 가능해야 하는지 여부.
         *
         * 이 옵션을 활성화하면 세션 파일은 storage/{tenant}/framework/sessions에 저장됩니다.
         */
        'scope_sessions' => true,

        /**
         * storage_path()에 접미사를 추가해야 하는지 여부.
         *
         * 참고: 이 기능을 비활성화하면 로컬 디스크 테넌시가 깨질 가능성이 있습니다. S3와 같은 외부 파일 저장 서비스를 사용하는 경우에만 비활성화하십시오.
         *
         * 대부분의 애플리케이션에서는 이 기능을 활성화해야 합니다. 그러나 일부 극단적인 경우에는 문제가 발생할 수 있으므로
         * (예: Vapor와 Passport를 사용하는 경우 - #196 참조),
         * 이러한 극단적인 문제를 경험하는 경우 이 기능을 비활성화해야 할 수 있습니다.
         */
        'suffix_storage_path' => true,

        /**
         * 이를 true로 설정하면 asset() 호출이 멀티 테넌트가 됩니다. global_asset() 및 mix()를
         * 글로벌, 비 테넌트별 자산에 사용할 수 있습니다. 그러나 테넌트 앱 내에서
         * asset() 호출을 사용하는 패키지를 사용할 때 문제가 발생할 수 있습니다.
         * 이러한 문제가 발생하지 않도록 asset() 헬퍼 테넌시를 비활성화하고 특정
         * 테넌트별 자산(예: 제품 이미지, 아바타 등)을 사용하려는 곳에서 명시적으로 tenant_asset() 호출을 사용할 수 있습니다.
         */
        'asset_helper_tenancy' => false, // todo@rename asset_helper_override?
    ],

    /**
     * Redis 테넌시 구성. RedisTenancyBootstrapper에서 사용됩니다.
     *
     * 참고: Redis 테넌시를 사용하려면 phpredis가 필요합니다.
     *
     * 참고: Redis를 캐시에만 사용 중인 경우 이를 사용할 필요는 없습니다. Redis 테넌시는
     * Redis 퍼사드 호출을 하거나 이를 주입된 종속성으로 사용하는 경우에만 관련이 있습니다.
     */
    'redis' => [
        'prefix' => 'tenant_%tenant%_', // Redis의 각 키에는 이 접두사 포맷이 앞에 추가되며, %tenant%는 테넌트 키로 대체됩니다.
        'prefixed_connections' => [ // 하나의 테넌트 키를 다른 테넌트의 키와 분리하기 위해 키에 접두사를 붙이는 Redis 연결.
            'default',
            // 'cache', // RedisTenancyBootstrapper를 사용하여 캐시를 범위화하려면 이를 활성화하십시오.
        ],
    ],

    /**
     * 기능은 테넌시 초기화 여부에 상관없이 실행되는 기능입니다.
     * 테넌시 부트스트래핑에 필요하지 않은 추가 기능을 제공합니다.
     *
     * 각 클래스에 대한 문서 페이지를 참조하여 필요한 기능을 선택하십시오.
     */
    'features' => [
//         Stancl\Tenancy\Features\UserImpersonation::class,
        // Stancl\Tenancy\Features\TelescopeTags::class,
//         Stancl\Tenancy\Features\TenantConfig::class,
        // Stancl\Tenancy\Features\CrossDomainRedirect::class,
        // Stancl\Tenancy\Features\ViteBundler::class,
    ],

    /**
     * 테넌시 라우트를 등록해야 하는지 여부.
     *
     * 테넌시 라우트에는 테넌트 자산 라우트가 포함됩니다. 기본적으로 이 라우트는 활성화되어 있습니다.
     * 그러나 외부 저장소(S3, Dropbox 등)를 사용하거나 사용자 정의 자산 컨트롤러를 사용하는 경우 이를 비활성화하는 것이 유용할 수 있습니다.
     */
    'routes' => true,

    /**
     * 기본적으로 모든 라우트를 중앙, 테넌트 또는 유니버설로 만듭니다.
     *
     * 기본 라우트 모드를 무시하려면 다른 라우트 모드('central', 'tenant', 'universal')의 미들웨어를 라우트에 적용하십시오.
     */
    'default_route_mode' => 'central',

    /**
     * 보류 중인 테넌트 구성.
     * 항상 사용 가능한 테넌트를 준비하는 방법을 찾고 있다면 유용할 수 있습니다.
     */
    'pending' => [
        /**
         * 비활성화된 경우 보류 중인 테넌트는 모든 테넌트 쿼리에서 제외됩니다.
         * 여전히 ::withPending(), ::withoutPending(), ::onlyPending()을 사용하여 테넌트를 포함하거나
         * 제외할 수 있습니다. 참고: 비활성화된 경우, 이는
         * 테넌트 명령(마이그레이션, 씨드 등)을 실행할 때도 보류 중인 테넌트를 무시합니다.
         */
        'include_in_queries' => true,
        /**
         * 보류 중인 테넌트 풀에 준비할 보류 중인 테넌트 수를 정의합니다.
         * 생성하는 테넌트의 볼륨에 따라 달라집니다.
         */
        'count' => env('TENANCY_PENDING_COUNT', 5),
    ],

    /**
     * tenants:migrate 명령에 사용되는 매개변수.
     */
    'migration_parameters' => [
        '--force' => true, // 프로덕션에서 마이그레이션을 실행하려면 true로 설정해야 합니다.
        '--path' => [
            database_path('migrations'),
            database_path('migrations/tenant')
        ],
        '--schema-path' => database_path('schema/tenant-schema.dump'),
        '--realpath' => true,
    ],

    /**
     * tenants:seed 명령에 사용되는 매개변수.
     */
    'seeder_parameters' => [
        '--class' => TenantSeeder::class,
        // '--force' => true,
    ],
];