설정

_Global

모든 전역 설정은 BaseGlobal을 상속한 _Global 클래스의 정적 프로퍼티입니다.

<?php
// application/_Global.php
use _Flexagon\Base\BaseGlobal;

class _Global extends BaseGlobal {
    // 애플리케이션 고유 전역을 여기에 추가
    public static ?\Session\SessionUserModel $SESSION_USER_MODEL = null;
}

주요 설정 항목:

프로퍼티 기본값 설명
$SITE_TITLE 'Flexagon' 사이트 제목
$TIMEZONE 'Asia/Seoul' date_default_timezone_set()에 적용
$DATA_SOURCES [] 데이터소스 맵 (아래 참조)
$DATA_SOURCE_ID 'default' 기본 데이터소스 ID
$USE_COMPOSER true vendor/autoload.php 자동 로드
$USE_OUTPUT_BUFFER true 요청 전체를 ob_start()로 감쌈
$DB_STATEMENT_CACHE_SIZE 64 커넥션당 재사용할 prepared statement 수. 0이면 매번 prepare
$DB_CONNECT_FAILURE_FATAL true DB 접속 실패 시 _Flexagon\DB\ConnectionException 발생(DAO 생성자에서). false면 connect()가 false 반환
$ENABLE_EXTENSION_PHP false true면 URL에 .php를 명시해야 함
$USE_AUTO_CREATED_AT_TIMESTAMP true @db_auto_timestamp insert 자동 기록 사용 여부
$USE_AUTO_UPDATED_AT_TIMESTAMP true @db_auto_timestamp update 자동 기록 사용 여부
$RUNNING_MODE FLEXAGON_CONST::RUNNING_MODE_PRODUCTION 실행 모드. 프레임워크는 값을 읽지 않으며, 애플리케이션이 분기용으로 사용
$DEBUG_ON false 디버그 플래그. 위와 마찬가지로 애플리케이션이 참조하는 용도
$DEBUG_QUERY_BREAKPOINT false 쿼리 직후 Mysql::debugQueryAfter() 호출 (디버거 중단점용)
$SITE_CONFIG['web']['header'] — 모든 응답에 붙일 HTTP 헤더 배열
$SESSION_AUTO_START false 부팅 시 세션 자동 복원
$SESSION_NAME 'session_data' 세션 쿠키 이름
$SESSION_DOMAIN '' 쿠키 도메인 (.example.com)
$SESSION_COOKIE_SECURE null 쿠키 Secure 플래그. null이면 요청이 HTTPS인지 보고 자동 결정
$SESSION_COOKIE_HTTPONLY true 쿠키 HttpOnly 플래그
$SESSION_COOKIE_SAMESITE 'Lax' 'Lax' · 'Strict' · 'None'. 'None'은 Secure를 자동으로 켬
$SESSION_MODEL_CLASSES [] 세션 쿠키가 지정할 수 있는 클래스 목록. 비우면 BaseModel 상속 여부만 검사
$SESSION_TIMEOUT_SECONDS 86400 세션 만료 (초)
$SESSION_REQUIRE_EXPIRY false exp 없는 구형식 쿠키 거부. 전환 기간 후 true 로
$SESSION_NOT_BEFORE 0 이 시각 이전 발급 세션을 전부 무효화 (무상태 강제 로그아웃)
$SESSION_ENCRYPTION_STRING '' 세션 암호화 키 (10자 이상)
$CLASS_PROPERTY_ENCRYPTION_PASSPHRASE '' @encrypt 프로퍼티 암호화 키 (10자 이상)

데이터소스

new DataSourceModel(
    string $host,
    int    $port,
    string $username,
    string $password,
    string $dbName,
    ?string $charset = 'utf8mb4',
    ?bool   $usePrepareStatement = true,
    array   $pdoOptions = []
);

여러 개를 등록할 수 있습니다.

_Global::$DATA_SOURCES['default']   = new DataSourceModel('db-master', 3306, 'app', '****', 'service');
_Global::$DATA_SOURCES['analytics'] = new DataSourceModel('db-replica', 3306, 'ro',  '****', 'stats');

각 데이터소스는 sha1(username@host/dbName)으로 고유 ID를 얻고, DataSourceManager가 이 ID 기준으로 커넥션을 재사용합니다. 같은 DB를 가리키는 DAO가 여러 개여도 커넥션은 하나입니다.

pdoOptions는 new PDO()에 그대로 전달됩니다. TLS, 타임아웃처럼 프레임워크가 정하지 않는 값을 넣는 곳입니다. 드라이버가 의존하는 옵션(에러 모드, fetch 모드, 에뮬레이트 prepare, 접속 charset)은 드라이버 값이 우선합니다.

// TLS 를 강제하는 MySQL (RDS, Azure, PlanetScale 등)
_Global::$DATA_SOURCES['default'] = new DataSourceModel(
    Env::get('DB_HOST'), Env::int('DB_PORT', 3306), Env::get('DB_USER'), Env::get('DB_PASSWORD'), Env::get('DB_NAME'),
    pdoOptions: [PDO::MYSQL_ATTR_SSL_CA => '/etc/ssl/certs/rds-ca.pem'],
);

MySQL 은 SSL 옵션이 없으면 서버가 TLS 를 지원해도 평문으로 접속합니다. 서버가 TLS 를 강제하면 접속이 거부됩니다. CA 를 주면 인증서와 호스트 이름까지 검증합니다. PostgreSQL 은 sslmode=prefer 가 기본이라 서버가 지원하면 TLS 를 쓰지만 인증서는 검증하지 않습니다. 검증하려면 환경변수 PGSSLMODE=verify-full, PGSSLROOTCERT=/path/ca.pem 을 줍니다(libpq 가 읽습니다).

스테이지별 설정

application/_Config/<stage>/_Config.php에 스테이지별 설정을 두고, CLI에서 runtimeStage 인자로 선택합니다.

php script/batch.php runtimeStage=production

기본 스테이지 디렉터리로 alpha, beta, production이 제공됩니다. Docker 이미지는 같은 이름의 타깃(--target production 등)으로 빌드하면 그 스테이지 디렉터리의 파일이 application/에 복사됩니다(Docker 참고). 컨테이너 없이 배포할 때는 ant production(또는 alpha·beta)이 build/deploy/<스테이지>에 서버에 올릴 결과물을 만듭니다. 비밀 값·개발용 파일은 빼고, 스테이지 파일을 덮어쓰고, vendor/는 composer.lock대로 --no-dev 설치합니다. 스테이지가 적용되는 방식과 Env로 비밀 값을 나누는 방법은 application/_Config/README.md에 정리되어 있습니다.