임동욱 임동욱 07-27
feat: 환경변수 단일 진입점 추가
Co-Authored-By: Claude Opus 5 
@11eb46fd9085107c809ce1c58d18291be8f1246f
 
lib/env.ts (added)
+++ lib/env.ts
@@ -0,0 +1,45 @@
+import 'server-only'
+
+/**
+ * 환경변수 검증·export 단일 진입점.
+ *
+ * 값은 실제로 필요해지는 시점(함수 호출 시)에만 읽고 검증한다 — 모듈 최상단에서 즉시 검증하면
+ * `force-dynamic` 라우트라도 `next build`의 페이지 데이터 수집 단계에서 이 모듈이 먼저 로드되어
+ * 운영 배포 전 로컬 빌드가 SESSION_SECRET 미설정만으로 실패할 수 있기 때문이다.
+ * 대신 각 접근자 함수 자체가 "호출 시점" fail-fast를 보장한다 — 기본값 폴백은 없다.
+ */
+
+function readRequiredEnv(key: string): string {
+  const value = process.env[key];
+  if (!value) {
+    throw new Error(
+      `환경변수 ${key}가 설정되지 않았습니다. 배포 환경에 값을 주입하세요.`
+    );
+  }
+  return value;
+}
+
+/** 세션 토큰 서명에 사용하는 HMAC 시크릿. 누락 시 즉시 throw(fail-fast). */
+export function getSessionSecret(): string {
+  return readRequiredEnv('SESSION_SECRET');
+}
+
+export type MockAdminCredentials = {
+  loginId: string;
+  password: string;
+};
+
+/**
+ * mock 관리자 시드 계정. 운영 환경(.env.production)에는 키를 두지 않아
+ * 누락 시 null을 반환 — mock 로그인이 항상 실패하도록(fail-closed) 한다.
+ */
+export function getMockAdminCredentials(): MockAdminCredentials | null {
+  const loginId = process.env.MOCK_ADMIN_LOGIN_ID;
+  const password = process.env.MOCK_ADMIN_PASSWORD;
+
+  if (!loginId || !password) {
+    return null;
+  }
+
+  return { loginId, password };
+}
Add a comment
List