배경
학교 LXP에는 과제, 공지, 그리고 주차별 휴강·보강 변경이 흩어져 올라옵니다. 알림이 약해서 한 번 놓치면 그대로 마감을 넘기기 일쑤였고, 실제로 그렇게 과제 하나를 못 낸 적이 있습니다.
매번 직접 들어가 확인하는 대신, 변경이 생기면 알아서 알려주는 도구를 만들기로 했습니다. 혼자 쓰려고 만들었지만 같은 불편을 겪던 친구들이 쓰기 시작하면서, 여러 사용자의 LXP 계정을 안전하게 보관하고 각자에게 알림을 보내는 다중 사용자 서비스로 발전시켰습니다.
운영 주체가 학생 한 명이다 보니 처음부터 기준이 명확했습니다 — 운영비는 0원에 가깝게, 손은 최대한 덜 가게.
주요 기능
- ①전체 수강 과목 자동 감지수강 과목 목록을 기준으로 과제·강의실 공지·주차별 휴보강을 주기적으로 수집합니다.
- ②Discord DM · 이메일 알림Discord 로그인만 하면 별도 설정 없이 DM으로 받고, SMTP/Resend로 이메일도 함께 보냅니다.
- ③사용자별 채널 · 설정Discord/email 채널을 각자 독립적으로 켜고, 최근 로그와 휴보강 종합을 화면에서 확인합니다.
- ④계정 암호화 보관LXP 자격증명과 webhook URL을 암호화해 저장하고, 어디에도 평문을 노출하지 않습니다.
기술 선택
트러블슈팅
해결 과정
같은 알림이 두 번, 과거 항목까지 한꺼번에
Discord 전송이 429로 막힘
HTTP 429 Too Many Requests로 실패하기 시작했습니다.retry_after 값을 읽어 DB 큐에서 해당 시간 뒤 재시도하도록 하고, 워커에 지터·제한 동시성을 두어 전송을 분산했습니다.남의 LXP 비밀번호를 어떻게 보관할 것인가
배운 점
"한 번 보내고 끝"이 아니라 "두 번 안 보내기"가 더 어렵다. 전송 그 자체보다 멱등성·중복 방지·재시도 같은 보이지 않는 장치가 서비스의 신뢰를 만든다는 걸 체감했습니다.
남의 데이터를 다루는 책임감. 친구들의 계정을 맡으면서 암호화·시크릿 관리·로그 위생을 처음으로 진지하게 고민했고, 보안이 기능이 아니라 기본값이어야 한다는 걸 배웠습니다.
운영까지가 개발이다. Docker Compose로 web·bot·worker를 묶고 DRY_RUN으로 안전하게 점검하면서, 만드는 것과 계속 돌게 하는 것은 다른 일이라는 걸 알게 됐습니다.