접속기록(SFR-004/#33): - AccessLogQueue 포화 방어. 종전 offer(timeout) 무한 반복은 컨슈머 정지 시 요청 스레드가 영구 대기해 WAS 스레드 풀 고갈 → 사이트 전면 정지로 이어졌다. 대기를 3회로 제한하고 포화 차단기(saturated)를 도입해 지속 포화 시 즉시 판정한다. - 유실은 조용히 넘기지 않는다. recordDrop 이 누적 집계 + 초기 20건/이후 100건 표본 ERROR 로그로 남긴다(법정 보관 대상이므로 사후 추적 가능해야 함). - 컨슈머 루프가 Exception 이 아닌 Throwable 까지 흡수한다. Error 하나로 컨슈머가 죽으면 running=true 인 채 이후 전 요청이 포화 대기에 빠졌다. - 자체 데몬 워치독(30초) 추가 — 컨슈머 사망 시 재기동, 적체 경고, 차단기 자동 해제. task:annotation-driven 활성화 여부와 무관해야 하므로 @Scheduled 를 쓰지 않는다. - 해시체인 순번 보장을 위한 단일 컨슈머 전제는 유지(병렬화 금지). 인증정보 보호(SER-001/SER-003/#27): - EgovFileScrty 사용자별 랜덤 솔트(S1: 형식) 도입, matches() 로 검증 일원화 — 기존 무솔트 계정과 공존한다. - 비밀번호 변경 시 현재 비밀번호 검증 복구. 종전에는 DB 값을 자기 자신과 비교해 항상 true 였고, 입력한 oldPassword 가 어디에도 쓰이지 않았다. - 평문 비밀번호 println 제거. 관리자 화면: 접속기록 조회, 업무구분 매핑 관리, 권한변경 이력, 미사용계정 현황. 계정 파기(AccountDelete) 서비스 및 DDL/DML 추가. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
47 lines
2.5 KiB
SQL
47 lines
2.5 KiB
SQL
-- =====================================================================
|
|
-- 휴면(장기 미사용) 대상 확장 : COMTNDIAPAUSEMBER 회원유형 구분 컬럼 추가
|
|
-- 문화품앗이 개인정보보호 기능개선 사업 (SFR-002, 장기 미사용 계정 관리)
|
|
-- 개발항목 #7 - 담당: arko-privacy-authctrl (Fork A)
|
|
-- 작성일: 2026-07-21 DB: MySQL 8 / MariaDB
|
|
-- ---------------------------------------------------------------------
|
|
-- [배경] 기존 휴면 대상은 일반회원(COMTNGNRLMBER)뿐이며, 휴면 테이블
|
|
-- COMTNDIAPAUSEMBER 에는 회원유형 구분 컬럼이 없다. 개인정보취급자
|
|
-- (COMTNEMPLYRINFO)를 휴면 대상에 포함(#7)하면서 일반회원 휴면/해제
|
|
-- 흐름과 혼선되지 않도록 회원유형 구분 컬럼을 신설한다.
|
|
--
|
|
-- [안전] DEFAULT 'GNR'(일반회원)로 신설 → 기존 적재 행은 자동 'GNR' 처리되어
|
|
-- 기존 selectDiapauseList(일반회원 join COMTNGNRLMBER) 흐름 무영향.
|
|
-- 취급자 휴면 행은 'EMP'로 적재하여 별도 select/notify 경로로 처리한다.
|
|
--
|
|
-- [멱등] MySQL 8 은 ADD COLUMN/INDEX IF NOT EXISTS 를 지원하지 않으므로
|
|
-- information_schema 로 존재를 확인해 없을 때만 실행한다(재실행 안전).
|
|
-- MySQL 8 / MariaDB 10.x 공통 동작.
|
|
-- =====================================================================
|
|
|
|
SET @ddl := IF(
|
|
(SELECT COUNT(*) FROM information_schema.COLUMNS
|
|
WHERE TABLE_SCHEMA = DATABASE()
|
|
AND TABLE_NAME = 'COMTNDIAPAUSEMBER'
|
|
AND COLUMN_NAME = 'MBER_TY_CODE') > 0,
|
|
'SELECT ''SKIP: COMTNDIAPAUSEMBER.MBER_TY_CODE already exists'' AS msg',
|
|
'ALTER TABLE COMTNDIAPAUSEMBER
|
|
ADD COLUMN MBER_TY_CODE CHAR(3) NOT NULL DEFAULT ''GNR''
|
|
COMMENT ''회원유형 GNR:일반회원 EMP:개인정보취급자'''
|
|
);
|
|
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
|
|
|
-- 조회 성능(취급자/일반 분리 조회) 보조 인덱스
|
|
SET @ddl := IF(
|
|
(SELECT COUNT(*) FROM information_schema.STATISTICS
|
|
WHERE TABLE_SCHEMA = DATABASE()
|
|
AND TABLE_NAME = 'COMTNDIAPAUSEMBER'
|
|
AND INDEX_NAME = 'IX_DIAPAUSE_MBERTY') > 0,
|
|
'SELECT ''SKIP: IX_DIAPAUSE_MBERTY already exists'' AS msg',
|
|
'ALTER TABLE COMTNDIAPAUSEMBER
|
|
ADD INDEX IX_DIAPAUSE_MBERTY (MBER_TY_CODE, DIAPAUSE_STAT)'
|
|
);
|
|
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
|
|
|
-- [검증] SHOW CREATE TABLE COMTNDIAPAUSEMBER;
|
|
-- [롤백] ALTER TABLE COMTNDIAPAUSEMBER DROP INDEX IX_DIAPAUSE_MBERTY, DROP COLUMN MBER_TY_CODE;
|