- ์ฌ๋ฌ ์ฌ์ดํธ์ ํฉ์ด์ง ํ์ฌยทํ๊ณผยท์ฅํยท์ทจ์ ยท๊ณต๋ชจ์ ยท์ธํด์ญ ๊ณต์ง๋ฅผ ์ผ์ผ์ด ํ์ธํ๊ธฐ ๋ฒ๊ฑฐ๋ก์ฐ์ จ๋์?
- ๊ด์ฌ ์๋ ๊ณต์ง๋ฅผ ๋ง๊ฐ ๊ธฐํ์ด ์ง๋ ๋ค์์ผ ๋ฐ๊ฒฌํ ์ ์ด ์์ผ์ ๊ฐ์?
๊ณต์ง ์๋ฆฌ๋ฏธ๋ ์ฌ๋ฌ ๊ณต์ง ๊ฒ์ํ์ ๋งค์ผ ๋ ๋ฒ ํ์ธํ๊ณ , ์๋ก์ด ๊ธ์ด ๋ฑ๋ก๋๋ฉด ์ฌ๋์ผ๋ก ์๋ ค์ฃผ๋ ๋ด์ ๋๋ค.
์ด์ ์ฌ๋ ์ฑ๋ ํ๋๋ง ํ์ธํ์ธ์!
๋ณ๋์ ์๋ฒ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ด, GitHub Actions ํฌ๋ก ๊ณผ Git ์ปค๋ฐ๋ง์ผ๋ก ์ํ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
GitHub Actions ์คํ (๋งค์ผ ์คํ 1์ยท6์ KST)
โ
โผ
๊ฒ์ํ 19๊ณณ ํฌ๋กค๋ง
(requests + BeautifulSoup)
โ
โผ
์ด์ ์ ํ์ธํ ๊ธ ID(state.json)์ ๋น๊ต
โ
โโ ์ ๊ธ ์์ โ Slack Webhook์ผ๋ก ์๋ฆผ ์ ์ก
โ
โผ
state.json ๊ฐฑ์ โ ์ ์ฅ์์ ์ปค๋ฐ ๋ฐ ํธ์
์ด ์๋น์ค๋ ๊ณต์ง๋ฅผ ์ค์๊ฐ์ผ๋ก ์ ๋ฌํ๋ ๊ฒ์ด ์๋๋ผ, ์ฌ๋ฌ ๊ฒ์ํ์ ์ ๊ธ์ ๋งค์ผ ๋น ์ง์์ด ํ์ธํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค. ๊ณต์ง๋ค์ ์ค์๊ฐ์ฑ์ด ๋ฎ๊ณ ์ ์ฒญ ๊ธฐ๊ฐ๋ ๊ธธ๊ธฐ ๋๋ฌธ์, ์ ํํ ์คํ ์๊ฐ๋ณด๋ค ์ ๊ธฐ์ ์ธ ์์ง์ด ๋ ์ค์ํฉ๋๋ค. ๋ฐ๋ผ์ ์คํ์ด ์ผ๋ถ ์ง์ฐ๋ ์ ์๋ GitHub Actions ํฌ๋ก ๋ ์๊ตฌ์ฌํญ์ ์ถฉ๋ถํ ์ถฉ์กฑํฉ๋๋ค.
ํฌ๋กค๋ง์ ํ๋ฃจ ๋ ๋ฒ, ๋ช ์ด ๋์๋ง ์คํ๋๋ฉฐ ์ ์ฅํ ์ํ๋ ๊ฒ์ํ๋ณ๋ก ํ์ธํ ๊ธ ID๋ฟ์
๋๋ค. ๋ณ๋์ ์๋ฒ์ DB๋ฅผ ์ด์ํ๋ ๋์ , GitHub Actions๋ก ์์
์ ์คํํ๊ณ state.json์ Git์ ์ปค๋ฐํด ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๋จ์ํ ๊ตฌ์กฐ๋ฅผ ์ ํํ์ต๋๋ค. ์ด๋ฅผ ํตํด ํ์ํ ๊ธฐ๋ฅ์ ์ถฉ์กฑํ๋ฉด์ ์ธํ๋ผ ๋น์ฉ๊ณผ ์ด์ ๋ณต์ก๋๋ฅผ ์ต์ํํ์ต๋๋ค.
ํ์ฌ ์ด 19๊ฐ ๊ฒ์ํ์ ํ์ธํฉ๋๋ค.
| ๋ถ๋ฅ | ๊ฒ์ํ |
|---|---|
| ํ๊ต ๊ณต์ง | ๊ณต์ง์ฌํญ, ํ์ฌ๊ณต์ง, ์ทจ์ , ์ฅํ, ์ฑ์ฉยท๋ชจ์ง, ๊ตญ์ ๊ต๋ฅ |
| ํ๊ณผ ๊ณต์ง | ์ปดํจํฐ๊ณตํ๊ณผ(ํ๋ถยท์ทจ์ ๋ด์คยท๊ณต๋ชจ์ ), AIยท๋ฐ์ดํฐ์ฌ์ด์ธ์คํ๊ณผ, ์ํํธ์จ์ดํ๊ณผ, SW์ค์ฌ๋ํ์ฌ์ ๋จ |
| ํ๊ต ์์ | ์ธ์ข ๋ด์ค๋ฃธ |
| ์ธ๋ถ ํ๋ก๊ทธ๋จ | ICT ๊ธ๋ก๋ฒ ์ธํด์ญ, ๊ตญ๋ฆฝ๊ตญ์ ๊ต์ก์, ์๋์ก(ํด์ธ์ธํด์ญยท๊ณต๋ชจ์ ), ์๋นํฐ, ํ๊ตญ์ฅํ์ฌ๋จ |
-
์ฌ์ดํธ๋ง๋ค ๊ฒ์ํ์ HTML ๊ตฌ์กฐ๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๊ตฌ์กฐ๋ณ๋ก ํ์๋ฅผ ๋ถ๋ฆฌํด ๊ด๋ฆฌํฉ๋๋ค. ๊ฒ์ํ๋ณ ํ์ ์ฐ๊ฒฐ ์ ๋ณด๋
bot/fetchers.py์PARSER_MAP์์ ํ์ธํ ์ ์์ต๋๋ค. -
์๋ก์ด ์ฌ์ดํธ๋ฅผ ์ฐ๋ํ๋ ค๋ฉด ํด๋น ๊ตฌ์กฐ์ ๋ง๋ ํ์ ํจ์์ ๊ฒ์ํ ์ค์ ์ ์ถ๊ฐํ๋ฉด ๋ฉ๋๋ค.
1. ๊ตฌํ ์๋ฒ์ Python ๊ฐ SSL Handshake ์คํจ
sw.sejong.ac.kr, dept.sejong.ac.kr, pr.sejong.ac.kr์์ SSLV3_ALERT_HANDSHAKE_FAILURE๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋ก์ปฌ macOS์ GitHub Actions Ubuntu์์ ๋์ผํ๊ฒ ์ฌํ๋ผ, ํน์ ์คํ ํ๊ฒฝ์ ๋ฌธ์ ๊ฐ ์๋์ ํ์ธํ์ต๋๋ค.
curl -v๋ก ํ์ธํ ๊ฒฐ๊ณผ ์ธ ์๋ฒ๋ ๊ตฌํ Cipher Suite์ธ AES256-SHA๋ฅผ ์ฌ์ฉํ๊ณ ์์์ต๋๋ค. ๋ฐ๋ฉด Python ๊ธฐ๋ณธ SSL Context์ Cipher Suite ๋ชฉ๋ก์๋ AES256-SHA๊ฐ ์์ด, ์๋ฒ์ ํด๋ผ์ด์ธํธ๊ฐ ๊ณตํต์ผ๋ก ์ฌ์ฉํ ์ ์๋ Cipher Suite๊ฐ ์์์ต๋๋ค.
๋ค์ ์ธ ๊ฐ์ง ๋ฐฉ๋ฒ์ ๋น๊ตํ์ต๋๋ค.
| ๋ฐฉ๋ฒ | ๊ฒฐ๊ณผ |
|---|---|
SECLEVEL=1๋ก ๋ณด์ ์์ค ํํฅ |
์ฐ๊ฒฐ์ ์ฑ๊ณตํ์ง๋ง ๋ถํ์ํ ๊ตฌํ ์ค์ ๊น์ง ํ์ฉ |
ECDHE-RSA-AES256-SHA ์ฌ์ฉ |
์๋ฒ๊ฐ ECDHE๋ฅผ ์ง์ํ์ง ์์ ์คํจ |
๊ธฐ๋ณธ ๋ชฉ๋ก์ AES256-SHA๋ง ์ถ๊ฐ |
์ฐ๊ฒฐ ์ฑ๊ณต, ์ต์ข ์ฑํ |
์ ์ฒด ๋ณด์ ์์ค์ ๋ฎ์ถ๋ ๋์ Python ๊ธฐ๋ณธ Cipher Suite ๋ชฉ๋ก์ AES256-SHA๋ง ์ถ๊ฐํ์ต๋๋ค.
context = ssl.create_default_context()
context.set_ciphers("DEFAULT:AES256-SHA")๋ค๋ง ํ์ฌ Adapter๊ฐ https:// ๋จ์๋ก ๋ง์ดํธ๋ผ ๊ณต์ ์ธ์
์ ๋ชจ๋ HTTPS ์์ฒญ์ ์ ์ฉ๋ฉ๋๋ค. ํ์ฉํ๋ Cipher Suite์ ๋ฒ์๋ ์ต์ํํ์ง๋ง, ์ ์ฉ ๋์์ ์ธ ํธ์คํธ๋ก ์ ํํ๋ ์์
์ ํ์ ๊ณผ์ ๋ก ๋จ์ ์์ต๋๋ค.
2. ์ ๊ท ๊ฒ์ํ ์ถ๊ฐ ์ ๊ณผ๊ฑฐ ๊ณต์ง๊ฐ ๋ชจ๋ ๋ฐ์ก๋๋ ๋ฌธ์
์ด์ ์ค ์๋ก์ด ๊ฒ์ํ์ ์ถ๊ฐํ์, ํด๋น ๊ฒ์ํ์ ๊ณผ๊ฑฐ ๊ณต์ง ์์ญ ๊ฑด์ด ๋ชจ๋ ์ ๊ธ๋ก ์ธ์๋ผ Slack์ผ๋ก ๋ฐ์ก๋์ต๋๋ค.
๊ธฐ์กด์๋ state.json ์ ์ฒด๊ฐ ๋น์ด ์๋์ง๋ฅผ ๊ธฐ์ค์ผ๋ก ์ฒซ ์คํ ์ฌ๋ถ๋ฅผ ํ๋จํ์ต๋๋ค.
is_first_run = not bool(state)ํ์ง๋ง ์ค์ ์ํ๋ ๊ฒ์ํ๋ณ๋ก ๋ ๋ฆฝ์ ์ผ๋ก ์กด์ฌํฉ๋๋ค. ๋ด ์ ์ฒด๊ฐ ์ฒ์ ์คํ๋๋ ๊ฒฝ์ฐ์ ์ด์ ์ค ํน์ ๊ฒ์ํ์ ์ฒ์ ์์งํ๋ ๊ฒฝ์ฐ๋ฅผ ์ ์ญ ํ๋๊ทธ ํ๋๋ก ๊ตฌ๋ถํ ์ ์์๋ ๊ฒ์ด ์์ธ์ด์์ต๋๋ค.
์ต์ด ์์ง ์ฌ๋ถ์ ํ๋จ ๋จ์๋ฅผ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด์์ ๊ฒ์ํ ๋จ์๋ก ๋ณ๊ฒฝํ์ต๋๋ค.
is_first_fetch = board_key not in state์ฒ์ ์์งํ๋ ๊ฒ์ํ์ ๊ธฐ์กด ๊ธ ID๋ฅผ baseline์ผ๋ก ์ ์ฅํ๊ณ ์๋ฆผ์ ๋ณด๋ด์ง ์์ต๋๋ค. ์ดํ ์คํ๋ถํฐ ์ด์ ์ํ์ ๋น๊ตํด ์๋กญ๊ฒ ์ถ๊ฐ๋ ๊ธ๋ง ์ ์กํฉ๋๋ค.
์ด๋ฅผ ํตํด ์ด์ ์ค ๊ฒ์ํ์ ์ถ๊ฐํ๋๋ผ๋ ๊ธฐ์กด ๊ณต์ง๊ฐ ํ๊บผ๋ฒ์ ๋ฐ์ก๋์ง ์๊ณ , ์ถ๊ฐ ์ดํ ๋ฑ๋ก๋ ๊ธ๋ถํฐ ์๋ฆผ์ด ์ ์ก๋๋๋ก ๋ณ๊ฒฝํ์ต๋๋ค.
๐ข ์ธ์ข
๋ ๊ณต์ง์ฌํญ ์ ๊ณต์ง 2๊ฑด
โโโโโโโโโโโโโโโโโโ
[2026ํ๋
๋ 2ํ๊ธฐ ์๊ฐ์ ์ฒญ ์๋ด]
2026.08.30
[์ค์๋์๊ด ํ๊ณ ํด๊ด ์๋ด]
2026.08.29
์๋ก์ด ๊ธ์ด ์๋ ๋ ์๋ ๋ค์๊ณผ ๊ฐ์ด ์๋ ค์ค๋๋ค.
์ค๋์ ์
๋ฐ์ดํธ๊ฐ ์์ด์ ๐
git clone https://github.com/sehynn/notice-bot.git
cd notice-bot
pip install -r requirements.txtbot/config.py์BOARDS์ ๊ฒ์ํ์ ์ถ๊ฐํฉ๋๋ค.- ๊ฒ์ํ ๊ตฌ์กฐ๊ฐ ๊ธฐ์กด๊ณผ ๋ค๋ฅด๋ฉด
bot/fetchers.py์ ์๋ก์ด ํ์๋ฅผ ์ถ๊ฐํฉ๋๋ค. - Slack Incoming Webhook์ ์์ฑํ๊ณ
SLACK_WEBHOOK_URLํ๊ฒฝ๋ณ์๋ฅผ ๋ฑ๋กํฉ๋๋ค. python main.py --test๋ฅผ ์คํํด ์ฐ๊ฒฐ ์ํ๋ฅผ ํ์ธํฉ๋๋ค.- GitHub Actions๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์ ์ฅ์ Secrets์
SLACK_WEBHOOK_URL์ ๋ฑ๋กํ๊ณ ,.github/workflows/check-notices.yml์์ ์คํ ์๊ฐ์ ์กฐ์ ํฉ๋๋ค.