https://github.com/Ellug/GameJobNotifier

1. 프로젝트 배경
채용 사이트를 수시로 확인하는 반복 작업을 줄이기 위해, GameJob 공고를 주기적으로 수집하고 새로운 공고가 등록되면 즉시 알림을 주는 데스크톱 앱을 만들었다.
단순히 “목록 보여주기”가 아니라, 로컬에 상태를 저장하고 이전 상태와 비교해 변화(신규/비노출/복원) 를 감지하는 구조로 설계했다.
2. 사용 기술 스택
- Language:
C# - Runtime:
.NET 10 (net10.0-windows) - UI:
WPF + MVVM (CommunityToolkit.Mvvm) - Hosting/DI:
Microsoft.Extensions.Hosting - Data:
SQLite (Microsoft.Data.Sqlite) - Crawling:
HttpClient + HtmlAgilityPack - Notification:
- Windows Toast 알림 (PowerShell + WinRT 호출)
- Tray Balloon 알림 (
NotifyIcon)
3. 핵심 기술 포인트
3-1. 상태 비교 기반 변경 감지
핵심은 “현재 목록”만 보는 게 아니라, 이전 실행에서 저장한 데이터와 비교하는 것이다.
Added: 새로 발견된 공고Hidden: 이전에 보였는데 이번엔 사라진 공고Restored: 숨김 상태였다가 다시 노출된 공고
이 방식 덕분에 단순 스크래핑을 넘어 “변화 이벤트”를 만들 수 있다.
3-2. 스코프 분리(필터 조합 해시)
필터 조합(직종/지역/조건 등)이 바뀌면 결과 집합도 달라진다.
그래서 URL + 필터 조합을 해시해 source scope key를 만들고, 스코프 단위로 상태를 추적해 데이터 섞임을 방지했다.
3-3. 알림 노이즈 제어
첫 실행 때 기존 공고를 전부 알림으로 보내면 노이즈가 너무 크다.마지막 성공 검사 시각과 현재 시각 사이에 등록된 항목만 신규 알림 대상으로 제한해 신뢰도를 높였다.
3-4. 데스크톱에서도 Host/DI 구조 적용
WPF에서도 Host + DI + HostedService를 적용해 UI와 도메인 로직을 분리했다.
테스트/유지보수 관점에서 구조가 훨씬 명확해진다.
4. 구현 방법 요약
- 대상 URL 수집
- HTML 파싱 후 공고 모델 정규화
- 설정된 필터 적용
- SQLite upsert
- 이전 상태와 diff 계산
- 변경 이벤트 생성
- 알림 전송
- 마지막 실행 상태 저장
5. 알림 연결 방법
5-1. Toast 알림
- Toast XML 생성
- PowerShell에서 WinRT Toast API 호출
- 알림 액션에
공고 열기(URL)연결
5-2. Tray Balloon 알림
NotifyIcon.ShowBalloonTip()사용- 풍선 클릭 시 해당 공고 URL 오픈
5-3. 사용자 설정 연동
- Toast On/Off
- Tray Balloon On/Off
- 둘 다 꺼진 경우 테스트 알림 차단 및 안내 메시지 표시
6. 백그라운드/부팅 연동
6-1. 트레이 상주 동작
창 닫기/최소화를 “종료”가 아닌 “숨김”으로 처리해 백그라운드 상주를 유지했다.
6-2. 윈도우 시작 시 자동 실행
HKCU\Software\Microsoft\Windows\CurrentVersion\Run에 앱 경로를 등록/해제해 부팅 연동을 구현했다.
7. 학습 포인트
이번 프로젝트에서 특히 도움이 됐던 학습 포인트는 아래 4가지다.
- 데스크톱 앱에서도 서버형 아키텍처(Host/DI/BackgroundService)를 충분히 적용할 수 있다.
- 스크래핑은 “수집”보다 “변화 감지 모델” 설계가 더 중요하다.
- 알림 시스템은 기능 구현보다 노이즈 제어와 사용자 경험이 핵심이다.
- 로컬 앱이라도 상태 저장소(SQLite + runtime state) 설계가 품질을 좌우한다.
8. 마무리
이 프로젝트는 작은 토이 프로젝트처럼 시작했지만, 실제로는 수집 → 판단 → 이벤트 → 통지의 흐름을 끝까지 구현한 형태다.
데이터 신뢰성과 운영성(백그라운드, 부팅 연동, 알림 품질)에 집중하면서 구조를 정리한 경험이 가장 큰 수확이다.
'C#' 카테고리의 다른 글
| C# : Chzzk(치지직) VOD / Clip 다운로더 (0) | 2026.03.20 |
|---|---|
| C# - 델리게이트(Delegae). 람다식과 캡쳐, 클로져 문제 (feat. useState) (0) | 2025.11.04 |
| VisualStudioCode(VSC) 에서 한글 깨짐 이슈 (0) | 2025.10.28 |
| Design Pattern - Singleton Pattern (싱글톤 패턴) (0) | 2025.10.20 |
| Design Pattern - Adapter Pattern (어댑터 패턴) (0) | 2025.10.17 |