🤖
3684 in / 2000 out / 5684 total tokens
패밀리데이 기능 추가하고 세션 만료 기간을 환경변수로 뺐다.
패밀리데이는 특정 요일을 지정하면 그날은 근무 8시간 상한 적용, 초과근무 미계산, 급량 미적용 처리하는 기능이다. 설정 화면에서 요일 토글로 선택하고, DB에는 family_day_days 컬럼에 콤마 구분 문자열(예: "0,3")로 저장했다. 계산 로직(calcRecord)에서 해당 날짜의 getDay() 값이 패밀리데이 집합에 포함되는지 판별 후, isFamilyDay 플래그와 suppressedOtMin(억제된 초과근무 분)을 함께 반환한다. 프론트에서는 패밀리데이 칩을 노출하고, 초과근무 시간은 "초과 0분 (실제 45분)"처럼 괄호로 실제 시간을 보여주게 했다.
세션 만료 기간은 기존에 auth.js에 하드코딩된 30일을 SESSION_DAYS 환경변수로 분리했다. 계산 결과를 SESSION_MAX_AGE 상수로 export하고, login·register 양쪽에서 import해서 쿠키 설정에 쓴다. 로컬 개발에서는 1일로 짧게, 프로덕션에서는 30일로 길게 설정하는 식으로 유연하게 쓸 수 있다.
DB 마이그레이션은 ALTER TABLE ... ADD COLUMN IF NOT EXISTS로 기존 데이터 무결성을 지키면서 3개 컬럼을 추가했다. suppressed_ot_min을 굳이 따로 저장하는 이유는, 나중에 "패밀리데이 때문에 몇 분이나 억제됐는지" 월간 통계를 낼 수 있게 하려는 의도다. is_family_day 불리언만 있으면 당월 필터링은 되지만, 얼마나 절약됐는지는 추적이 안 되니까.
js const SESSION_DAYS = parseInt(process.env.SESSION_DAYS || '30', 10); export const SESSION_MAX_AGE = SESSION_DAYS * 24 * 60 * 60;
// calcRecord 내부 - 패밀리데이 판별 const dow = new Date(dateStr).getDay(); const isFamilyDay = fdSet.has(dow); const suppressedOtMin = isFamilyDay ? otMin : 0; const finalOtMin = isFamilyDay ? 0 : otMin;
요일 문자열을 파싱해서 Set으로 관리하는 게 탐색 O(1)이라 깔끔한데, DB 저장 포맷을 콤마 구분 문자열로 한 건 좀 아쉽다. JSON 배열로 저장하는 게 나았을 수도 있다. 나중에 마이그레이션 고려 중.
하드코딩된 매직 넘버는 무조건 환경변수로 빼라. 나중에 "로컬에서 세션 자꾸 만료돼서 짜증난다"고 할 때 서버 재배포 없이 고칠 수 있다.