같은 알림은 한 번만, 복구는 꼭 — 상태 전이 알림 규칙 엔진
점검 결과를 메일 알림으로 바꾸는 규칙을 DB와 메일을 모르는 순수 함수로 분리하고 표 형태 테스트로 고정했다. 상태 전이 표, DedupeKey 설계, 만료 임계값 1회성, 복구 알림 조건, 1분 간격 재시도와 영구 오류 구분, 하루 1회 일일 요약까지 정리했다.
애드소프트 기술블로그
애드소프트 박재호입니다. IIS·ASP.NET·Docker·메일서버를 직접 운영하며 겪은 문제와 해결 과정을 기록합니다.
점검 결과를 메일 알림으로 바꾸는 규칙을 DB와 메일을 모르는 순수 함수로 분리하고 표 형태 테스트로 고정했다. 상태 전이 표, DedupeKey 설계, 만료 임계값 1회성, 복구 알림 조건, 1분 간격 재시도와 영구 오류 구분, 하루 1회 일일 요약까지 정리했다.
메일 서버 IP가 블랙리스트(RBL)에 올랐는지 DNS 조회로 매시간 확인하는 점검을 만들었다. 공용 DNS에서 Spamhaus가 차단 코드 대신 NXDOMAIN을 돌려줘 "미등재"로 오판하던 함정을 테스트 항목 127.0.0.2 검증으로 막고, 운영은 Spamhaus DQS 무료 키로 해결한 과정을 정리했다.
메일 도메인의 A·MX·SPF·DKIM·DMARC·PTR을 한 번에 점검하는 DNS 점검을 만들었다. SPF의 DNS 조회 10회 제한을 include를 따라가며 세는 방법, 하위 도메인 DMARC를 상위 도메인 정책으로 판정하는 규칙, 레코드가 바뀌었을 때만 알리는 변경 감지까지 정리했다.
도메인 만료일을 .kr은 KISA WHOIS 43번 포트로, 그 외는 IANA RDAP 부트스트랩으로 찾아 조회하게 했다. 호스트명에서 등록 도메인을 뽑는 규칙, 한글·영문이 섞인 WHOIS 응답 해석, 조회가 실패할 때의 수동 만료일, 일수 기준 판정과 테스트까지 정리했다.
TcpClient와 SslStream으로 직접 핸드셰이크를 해서 검증 오류가 있어도 인증서 정보를 끝까지 모으는 SSL 점검을 만들었다. 587·143·110처럼 평문으로 시작하는 메일 포트의 STARTTLS 업그레이드, StreamReader 함정, 판정 규칙과 인증서 갱신 감지까지 정리했다.
웹·메일 서버의 SSL 인증서, 도메인 만료, DNS, 메일 서버 상태를 주기적으로 점검하고 이상이 있으면 메일로 알려 주는 InfraWatch를 만들었다. 설계 문서로 점검 명세와 알림 규칙을 먼저 정하고, Phase 0~9를 거쳐 운영 배포까지 한 과정을 연재 첫 글로 정리했다.
창 없이 트레이에 상주하는 WPF 앱을 배포 가능한 상태로 마무리했다. Mutex와 이벤트로 만든 단일 인스턴스, 다시 시작 없이 바뀌는 단축키·테마·언어, 범위 외였던 영어 화면을 하루 안에 넣은 문구 표 구조, 155MB에서 70MB로 줄인 단일 exe와 그 대가까지 정리하며 연재를 마친다.
1차는 한 PC 전용이지만 2차 여러 PC 동기화를 대비해 Id는 GUID, 모든 엔티티에 UpdatedAt, 삭제는 소프트 삭제로 정했다. 이 결정이 JSON 가져오기의 충돌 처리(더 최신인 쪽 유지)로 바로 쓰인 과정과, 고정 GUID 샘플, VACUUM INTO 백업, EF Core에서 만난 함정을 정리했다.
명령어 본문에 {{이름}}, {{이름:기본값}} 자리를 두고 복사할 때 채우는 기능. 정규식 대신 손으로 짠 파서, 닫히지 않은 중괄호를 그대로 두는 규칙, 같은 이름은 한 번만 묻기, 마지막 입력값 기억, Enter로 다음 칸까지 정리했다.
어느 프로그램 위에서든 Ctrl+Shift+Space로 검색 팝업을 띄우고, Enter로 복사한 뒤 원래 창으로 포커스를 돌려주는 구조. 메시지 전용 창으로 받는 전역 단축키, 커서가 있는 모니터와 DPI, 미리 렌더링으로 줄인 첫 호출 시간, 클립보드 재시도, 마우스 클릭이 안 먹던 결함까지 정리했다.