λΉ λ₯΄κ³ νΈλ¦¬ν κΈ°μ°¨ν μμ½μ μν μ€λ§νΈ μ루μ
μ€μ: νλ‘κ·Έλ¨ μ¬μ© μ λ°λμ μ½μ΄μ£ΌμΈμ
μ΄ νλ‘κ·Έλ¨μ κ΅μ‘ λ° κ°μΈ μ¬μ© λͺ©μ μΌλ‘ μ μλμμ΅λλ€.
β οΈ μ¬μ©μλ μ½λ μΌ λ° SRTμ μ΄μ©μ½κ΄μ μ€μν΄μΌ ν©λλ€
β οΈ νλ‘κ·Έλ¨ μ¬μ©μΌλ‘ μΈν λͺ¨λ μ±
μμ μ¬μ©μμκ² μμ΅λλ€
β οΈ μμ
μ λͺ©μ μ μ¬μ©μ κΈμ§λ©λλ€
β οΈ κ³Όλν μ¬μ©μ μλΉμ€ μ 곡μμ μ μ±
μ μλ°°λ μ μμ΅λλ€
β οΈ μ΄ νλ‘κ·Έλ¨μΌλ‘ μΈν΄ λ°μνλ μ΄λ ν λ²μ λ¬Έμ λ κ°λ°μλ μ±
μμ§μ§ μμ΅λλ€
νλ‘κ·Έλ¨ μ¬μ© μ κ° μλΉμ€(μ½λ μΌ, SRT)μ 곡μ μ΄μ©μ½κ΄μ λ¨Όμ νμΈνμκΈ° λ°λλλ€.
KTX/SRT κΈ°μ°¨ν μλ μμ½ νλ‘κ·Έλ¨μ μ½λ μΌ(KTX)κ³Ό SRTμ μ¨λΌμΈ μμ½ μμ€ν μ μλννμ¬, μνλ μ΄μ°¨νλ₯Ό λΉ λ₯΄κ³ μ ννκ² μμ½ν μ μλλ‘ λμμ£Όλ λ°μ€ν¬ν± μ ν리μΌμ΄μ μ λλ€.
μνλ μκ°λμ νλ₯Ό ꡬνκΈ° μ΄λ €μ΄ μν©μμ, μλμΌλ‘ κ²μνμ¬ μμ½ κ°λ₯ν μ’μμ μ°Ύμμ£Όλ κΈ°λ₯μ μ 곡ν©λλ€.
- KTX μλ μμ½: μ½λ μΌ μμ€ν μλ²½ μ§μ
- SRT μλ μμ½: SRT μμ€ν μλ²½ μ§μ
- λμ λ€μ€ κ²μ: μ¬λ¬ μκ°λμ μ΄μ°¨λ₯Ό λμμ λͺ¨λν°λ§
- μ€μκ° μ’μ νμΈ: 0.1μ΄ λ¨μμ λΉ λ₯Έ μ’μ κ²μ
- μλ μ¬μλ: μμ½ μ€ν¨ μ μλμΌλ‘ μ¬μλ
- μ°μ μμ μ€μ : μ νΈνλ μ΄μ°¨ μ’ λ₯ λ° μ’μ νμ μ§μ
- μκ°λ λ²μ μ€μ : μΆλ°/λμ°© μκ° λ²μ λ΄μμ μλ κ²μ
- μλ κ²°μ μ§μ: μΉ΄λ μ 보 μ λ ₯ μ μμ½ ν μλ κ²°μ
- 보μ μ격 μ¦λͺ
μ μ₯: λ‘κ·ΈμΈ μ 보μ κ²°μ μ 보λ₯Ό μμ νκ² μ μ₯ (μ νμ¬ν)
- macOS: Keychainμ μνΈν μ μ₯
- Windows: Windows Credential Lockerμ μνΈν μ μ₯
- Linux: Secret Service APIμ μνΈν μ μ₯
- κ²°μ νμΈ: κ²°μ μ μ΅μ’ νμΈ λ¨κ³ μ 곡
- μ§κ΄μ μΈ GUI: PyQt6 κΈ°λ°μ κΉλνκ³ νλμ μΈ λμμΈ
- μ€μκ° λ‘κ·Έ: μμ½ μ§ν μν©μ μ€μκ°μΌλ‘ νμΈ
- λ€ν¬ λͺ¨λ: λμ νΌλ‘λ₯Ό μ€μ΄λ λ€ν¬ λͺ¨λ μ§μ
- ν¬λ‘μ€ νλ«νΌ: Windowsμ macOS λͺ¨λ μ§μ
- νλ«νΌ λ€μ΄ν°λΈ 보μ μ μ₯μ: OSμ 보μ μ μ₯μλ₯Ό νμ©ν μ격 μ¦λͺ
κ΄λ¦¬
- macOS Keychain, Windows Credential Locker, Linux Secret Service μ§μ
- μνΈν ν΅μ : λͺ¨λ κ°μΈμ 보λ μνΈνλμ΄ μ μ‘
- μΈμ κ΄λ¦¬: μμ ν λ‘κ·ΈμΈ μΈμ μ μ§
- μλ¬ νΈλ€λ§: μμΈ μν©μ λν μ² μ ν μ²λ¦¬
- μμ ν μ’ λ£: μΈμ λ μ§ μμ νκ² νλ‘μΈμ€ μ€λ¨ κ°λ₯
κ°μ₯ κ°λ¨ν λ°©λ²μ λλ€. λ³λμ μ€μΉ μμ΄ λ°λ‘ μ€νν μ μμ΅λλ€.
- Releases νμ΄μ§μμ μ΅μ λ²μ λ€μ΄λ‘λ
- Windows:
KTX-SRT-Macro.exeμ€ν - macOS:
KTX-SRT-Macro.appμ€ν
κ°λ° νκ²½μ΄ κ΅¬μΆλμ΄ μκ±°λ μμ€ μ½λλ₯Ό μμ νκ³ μΆμ κ²½μ° μ¬μ©ν©λλ€.
μ¬μ μꡬμ¬ν
- Python 3.10 μ΄μ
- uv ν¨ν€μ§ λ§€λμ
1. uv μ€μΉ
# macOS/Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
# Windows (PowerShell)
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"2. νλ‘μ νΈ μ€μ λ° μ€ν
# μ μ₯μ ν΄λ‘
git clone https://github.com/yourusername/ktx-srt-macro.git
cd ktx-srt-macro
# μμ‘΄μ± μλ μ€μΉ λ° νλ‘κ·Έλ¨ μ€ν
uv run python main.pyπ‘ Tip:
uv runλͺ λ Ήμ΄λ νμν λͺ¨λ μμ‘΄μ±μ μλμΌλ‘ μ€μΉνκ³ νλ‘κ·Έλ¨μ μ€νν©λλ€.
|
KTX/ITX μμ½
|
SRT μμ½
|
π‘ Tip: "λ‘κ·ΈμΈ μ 보 μ μ₯"μ 체ν¬νλ©΄ λ€μ μ€ν μ μλμΌλ‘ λ‘κ·ΈμΈ μ λ³΄κ° μ λ ₯λ©λλ€. λͺ¨λ μ 보λ OSμ 보μ μ μ₯μμ μνΈνλμ΄ μ μ₯λ©λλ€.
π μΆλ°μ: μμΈ
π λμ°©μ: λΆμ°
π
λ μ§: 2025-10-10
β° μκ°: 09:00 ~ 12:00
πΊ μ’μ: μΌλ°μ€
μλ κ²°μ λ₯Ό μν κ²½μ°:
- μΉ΄λλ²νΈ (16μ리)
- μΉ΄λ λΉλ°λ²νΈ μ 2μ리
- μ ν¨κΈ°κ° (YYMM)
- μλ μμΌ (YYMMDD) λλ μ¬μ μλ±λ‘λ²νΈ (10μ리)
- "κ²°μ μ 보 μ μ₯" μ²΄ν¬ (μ νμ¬ν)
π 보μ μλ΄:
- "κ²°μ μ 보 μ μ₯"μ 체ν¬νλ©΄ μ΄μ체μ μ 보μ μ μ₯μμ μνΈνλμ΄ μ μ₯λ©λλ€
- macOSλ Keychain, Windowsλ Credential Lockerλ₯Ό μ¬μ©ν©λλ€
- νλ¬ΈμΌλ‘ νμΌμ μ μ₯λμ§ μμΌλ©°, λ€λ₯Έ μ±μμ μ κ·Όν μ μμ΅λλ€
- "μμ½ μμ" λ²νΌ ν΄λ¦
- μ€μκ° λ‘κ·Έμμ μ§ν μν© νμΈ
- μ’μ λ°κ²¬ μ μλ μμ½ μ§ν
- κ²°μ μ 보 μ λ ₯ μ μλ κ²°μ μλ£
β
μμ½ μ±κ³΅!
π« μ΄μ°¨: KTX-101
π μΆλ°: 09:00
π κ²½λ‘: μμΈ β λΆμ°
πΊ μ’μ: 3νΈμ°¨ 12A
νλ‘μ νΈλ ν¬κ΄μ μΈ ν μ€νΈ μ€μνΈλ₯Ό ν¬ν¨νκ³ μμ΅λλ€.
# λͺ¨λ ν
μ€νΈ μ€ν
uv run pytest tests/ -v
# ν
μ€νΈ 컀λ²λ¦¬μ§ ν¬ν¨
uv run pytest tests/ -v --cov=src --cov-report=html
# νΉμ ν
μ€νΈλ§ μ€ν
uv run pytest tests/unit/ -v # λ¨μ ν
μ€νΈλ§
uv run pytest tests/integration/ -v # ν΅ν© ν
μ€νΈλ§
uv run pytest tests/ -k "external" -v # μΈλΆ λͺ¨λ ν
μ€νΈλ§μ»€λ²λ¦¬μ§ 리ν¬νΈλ htmlcov/index.htmlμμ νμΈν μ μμ΅λλ€.
CI/CD: λͺ¨λ Pushμ Pull Requestμ λν΄ μλμΌλ‘ ν μ€νΈκ° μ€νλ©λλ€.
- 3κ° OS (Ubuntu, Windows, macOS)
- 3κ° Python λ²μ (3.11, 3.12, 3.13)
- μ΄ 9κ° μ‘°ν©μμ ν μ€νΈ
Windows
# μμ‘΄μ± μ€μΉ
uv sync
# λΉλ μ€ν
uv run pyinstaller --name KTX-SRT-Macro --onefile --windowed \
--icon "assets/favicon.ico" --add-data "src;src" --add-data "assets;assets" \
--noupx main.pymacOS
# μμ‘΄μ± μ€μΉ
uv sync
# λΉλ μ€ν
uv run pyinstaller --name KTX-SRT-Macro --onefile --windowed \
--icon "assets/favicon.icns" --add-data "src:src" --add-data "assets:assets" main.pyλΉλλ μ€ν νμΌμ dist/ λλ ν 리μ μμ±λ©λλ€.
λ²μ νκ·Έλ₯Ό νΈμνλ©΄ μλμΌλ‘ Windowsμ macOSμ© μ€ν νμΌμ λΉλνκ³ λ¦΄λ¦¬μ€λ₯Ό μμ±ν©λλ€:
# μ λ²μ νκ·Έ μμ± (Semantic Versioning νμ)
git tag v1.0.0
# νκ·Έ νΈμ
git push origin v1.0.0
# GitHub Actionsκ° μλμΌλ‘:
# 1. Windowsμ macOSμ© μ€ν νμΌ λΉλ
# 2. μλ λ¦΄λ¦¬μ€ λ
ΈνΈ μμ±
# - μ΄μ λ¦΄λ¦¬μ€ μ΄ν λ³κ²½ μ¬ν
# - λ€μ΄λ‘λ κ°μ΄λ
# - κΈ°μ¬μ λͺ©λ‘
# 3. GitHub Releases νμ΄μ§μ λ¦΄λ¦¬μ€ μμ±
# 4. λΉλλ μ€ν νμΌ μλ μ
λ‘λπ μ°Έκ³ :
- νκ·Έλ λ°λμ
v*.*.*νμμ΄μ΄μΌ ν©λλ€ (μ: v1.0.0, v2.1.3)- λ¦΄λ¦¬μ€ λ ΈνΈλ μ΄μ νκ·Έμ λΉκ΅νμ¬ μλμΌλ‘ μμ±λ©λλ€
- 첫 λ²μ§Έ 릴리μ€μ κ²½μ° μ 체 μ»€λ° νμ€ν λ¦¬κ° ν¬ν¨λ©λλ€
νλ‘μ νΈλ ν΄λ¦° μν€ν μ² μμΉμ λ°λΌ ꡬμ±λμ΄ μμ΅λλ€:
ktx-srt-macro/
β
βββ π src/ # μμ€ μ½λ 루νΈ
β β
β βββ π constants/ # μμ λ° μ€μ
β β βββ __init__.py
β β βββ stations.py # κΈ°μ°¨μ μ 보
β β βββ ui.py # UI κ΄λ ¨ μμ
β β
β βββ π domain/ # λλ©μΈ λ μ΄μ΄ (λΉμ¦λμ€ λ‘μ§)
β β βββ π models/ # λλ©μΈ λͺ¨λΈ
β β β βββ entities.py # ν΅μ¬ μν°ν° (Train, Passenger λ±)
β β β βββ enums.py # μ΄κ±°ν (TrainType, SeatType λ±)
β β βββ π services/ # λλ©μΈ μλΉμ€
β β βββ train_service.py # κΈ°μ°¨ μμ½ λΉμ¦λμ€ λ‘μ§
β β
β βββ π infrastructure/ # μΈνλΌμ€νΈλμ² λ μ΄μ΄
β β βββ π adapters/ # μΈλΆ μλΉμ€ μ΄λν°
β β β βββ ktx_service.py # KTX μλΉμ€ μ΄λν°
β β β βββ srt_service.py # SRT μλΉμ€ μ΄λν°
β β βββ π external/ # μΈλΆ API ν΄λΌμ΄μΈνΈ
β β β βββ ktx.py # μ½λ μΌ API ν΄λΌμ΄μΈνΈ
β β β βββ srt.py # SRT API ν΄λΌμ΄μΈνΈ
β β βββ π security/ # 보μ μΈνλΌ
β β βββ credential_storage.py # μ격 μ¦λͺ
μ μ₯μ (DAO)
β β βββ dto.py # 보μ DTO
β β
β βββ π presentation/ # νλ μ ν
μ΄μ
λ μ΄μ΄ (UI)
β βββ qt.py # PyQt6 GUI μ ν리μΌμ΄μ
β
βββ π assets/ # 리μμ€ νμΌ
β βββ favicon.ico # Windows μμ΄μ½
β βββ favicon.icns # macOS μμ΄μ½
β
βββ π .github/ # GitHub μ€μ
β βββ π workflows/ # CI/CD νμ΄νλΌμΈ
β βββ build.yml # μλ λΉλ μν¬νλ‘μ°
β
βββ π main.py # μ ν리μΌμ΄μ
μ§μ
μ
βββ π pyproject.toml # νλ‘μ νΈ λ©νλ°μ΄ν° λ° μμ‘΄μ±
βββ π .gitignore # Git μ μΈ νμΌ
βββ π README.md # νλ‘μ νΈ λ¬Έμ
|
Core |
Libraries
|
|
Build & Deploy
|
Architecture
|
- νλ«νΌ λ€μ΄ν°λΈ 보μ μ μ₯μ:
- macOSμ Keychain, Windowsμ Credential Locker, Linuxμ Secret Service API μ¬μ©
- μ΄μ체μ μμ€μ μνΈνλ‘ μ격 μ¦λͺ 보νΈ
- λ€λ₯Έ μ ν리μΌμ΄μ μ μ κ·Ό μ°¨λ¨
- μνΈν μ μ‘: λͺ¨λ κ°μΈμ 보λ HTTPSλ₯Ό ν΅ν΄ μνΈνλμ΄ μ μ‘λ©λλ€
- νμΌ μ μ₯ μμ: μ격 μ¦λͺ μ νλ¬Έ νμΌλ‘ μ μ₯νμ§ μμ΅λλ€
- μ νμ μ μ₯: "μ 보 μ μ₯" μ΅μ μ ν΄μ νλ©΄ μ λ³΄κ° μ μ₯λμ§ μμ΅λλ€
- μΈμ 보μ: μμ ν μΈμ κ΄λ¦¬λ₯Ό ν΅ν΄ λ¬΄λ¨ μ‘μΈμ€λ₯Ό λ°©μ§ν©λλ€
- μ μ₯ μ: "μ 보 μ μ₯"μ 체ν¬νλ©΄ OSμ 보μ μ μ₯μμ μνΈνλμ΄ μ μ₯
- λΆλ¬μ€κΈ°: λ€μ μ€ν μ 보μ μ μ₯μμμ μλμΌλ‘ 볡νΈννμ¬ λ‘λ
- μμ : "μ 보 μ μ₯" μ²΄ν¬ ν΄μ ν λ‘κ·ΈμΈνλ©΄ 보μ μ μ₯μμμ μμ
- κ³΅μ© μ»΄ν¨ν°μμλ "μ 보 μ μ₯" μ΅μ μ μ¬μ©νμ§ λ§μΈμ
- νλ‘κ·Έλ¨ μ¬μ© ν λ°λμ λ‘κ·ΈμμνμΈμ
- μμ¬μ€λ¬μ΄ μμ½ λ΄μμ μ¦μ ν΄λΉ μ¬μ΄νΈμμ νμΈνμΈμ
- μ격 μ¦λͺ μ μμ νλ €λ©΄ 체ν¬λ°μ€λ₯Ό ν΄μ νκ³ λ€μ λ‘κ·ΈμΈνμΈμ
Q1. μμ½μ΄ μ€ν¨νλ μ΄μ λ 무μμΈκ°μ?
- μ’μμ΄ λ§€μ§λμμ μ μμ΅λλ€
- λ‘κ·ΈμΈ μΈμ μ΄ λ§λ£λμμ μ μμ΅λλ€ (μ¬λ‘κ·ΈμΈ νμ)
- λ€νΈμν¬ μ°κ²°μ΄ λΆμμ ν μ μμ΅λλ€
- μ λ ₯ν μ λ³΄κ° μλͺ»λμμ μ μμ΅λλ€
Q2. μΉ΄λ μ 보λ₯Ό μ λ ₯νμ§ μμλ λλμ?
λ€, μΉ΄λ μ 보λ μ νμ¬νμ λλ€. μ λ ₯νμ§ μμΌλ©΄ μμ½κΉμ§λ§ μ§νλκ³ , μ¬μ©μκ° μ§μ ν΄λΉ μ¬μ΄νΈμμ κ²°μ λ₯Ό μλ£ν μ μμ΅λλ€.
Q3. μ¬λ¬ μκ°λλ₯Ό λμμ κ²μν μ μλμ?
νμ¬ λ²μ μμλ μ§μ λ μκ° λ²μ λ΄μ λͺ¨λ μ΄μ°¨λ₯Ό μμ°¨μ μΌλ‘ κ²μν©λλ€. μνλ μκ°λλ₯Ό λ²μλ‘ μ€μ νλ©΄ ν΄λΉ λ²μ λ΄μμ κ°μ₯ λΉ λ₯΄κ² μμ½ κ°λ₯ν μ’μμ μ°Ύμ΅λλ€.
Q4. νλ‘κ·Έλ¨μ΄ μ€νλμ§ μμμ.
Windows: Windows Defenderλ λ°±μ νλ‘κ·Έλ¨μ΄ μ°¨λ¨ν μ μμ΅λλ€. μ λ’°ν μ μλ μ±μΌλ‘ μΆκ°νμΈμ.
macOS: "νμΈλμ§ μμ κ°λ°μ" μ€λ₯ λ°μ μ:
- μμ€ν νκ²½μ€μ > 보μ λ° κ°μΈμ 보 보νΈ
- "νμΈ μμ΄ μ΄κΈ°" ν΄λ¦
Q5. μμ½ μλλ₯Ό λ λΉ λ₯΄κ² ν μ μλμ?
νλ‘κ·Έλ¨μ μ΄λ―Έ μ΅μ νλ κ²μ μ£ΌκΈ°λ₯Ό μ¬μ©ν©λλ€. λ무 λΉ λ₯Έ μμ²μ μλ² μΈ‘μμ μ°¨λ¨λ μ μμ΄ μ μ ν κ°κ²©μΌλ‘ μμ²μ 보λ λλ€.
Q6. μ μ₯λ μ 보λ μμ νκ°μ?
λ€, λ§€μ° μμ ν©λλ€:
- macOS: Keychainμ μ μ₯ (Mac λΉλ°λ²νΈλ‘ 보νΈ)
- Windows: Credential Lockerμ μ μ₯ (Windows κ³μ μΌλ‘ 보νΈ)
- Linux: Secret Service APIμ μ μ₯ (μμ€ν μνΈν)
λͺ¨λ μ 보λ μ΄μ체μ μμ€μμ μνΈνλλ©°, λ€λ₯Έ μ±μμ μ κ·Όν μ μμ΅λλ€. νλ¬Έ νμΌλ‘ μ μ₯λμ§ μμ΅λλ€.
Q7. μ μ₯λ μ 보λ₯Ό μμ νλ €λ©΄ μ΄λ»κ² νλμ?
- κ° μΉμ μ "μ 보 μ μ₯" 체ν¬λ°μ€λ₯Ό ν΄μ
- λ‘κ·ΈμΈ λλ μμ½ μ§ν
- 체ν¬λ°μ€κ° ν΄μ λ μνμμ μ μ₯μμ μ λ³΄κ° μλμΌλ‘ μμ λ©λλ€
λλ μ΄μ체μ μ 보μ μ μ₯μμμ μ§μ μμ ν μ μμ΅λλ€:
- macOS: Keychain Access μ±μμ "KTX-SRT-Macro" νλͺ© μμ
- Windows: μ격 μ¦λͺ κ΄λ¦¬μμμ "KTX-SRT-Macro" νλͺ© μμ
| λ¬Έμ | ν΄κ²° λ°©λ² |
|---|---|
| λ‘κ·ΈμΈ μ€ν¨ | μμ΄λ/λΉλ°λ²νΈ νμΈ, ν΄λΉ μ¬μ΄νΈμμ μ§μ λ‘κ·ΈμΈ ν μ€νΈ |
| λ€νΈμν¬ μ€λ₯ | μΈν°λ· μ°κ²° νμΈ, λ°©νλ²½ μ€μ νμΈ |
| μΈμ λ§λ£ | νλ‘κ·Έλ¨ μ¬μμ ν λ€μ λ‘κ·ΈμΈ |
| κ²°μ μ€ν¨ | μΉ΄λ μ 보 μ¬νμΈ, μΉ΄λμ¬ μΉμΈ μν νμΈ |
λ¬Έμ λ°μ μ μ€μκ° λ‘κ·Έ μ°½μ νμλλ μ€λ₯ λ©μμ§λ₯Ό νμΈνμΈμ. λλΆλΆμ λ¬Έμ λ λ‘κ·Έλ₯Ό ν΅ν΄ μμΈμ νμ ν μ μμ΅λλ€.
νλ‘μ νΈμ κΈ°μ¬νκ³ μΆμΌμ κ°μ? νμν©λλ€!
- Fork the Project
- Create your Feature Branch (
git checkout -b feature/AmazingFeature) - Commit your Changes (
git commit -m 'Add some AmazingFeature') - Push to the Branch (
git push origin feature/AmazingFeature) - Open a Pull Request
μ΄ νλ‘μ νΈλ MIT λΌμ΄μ μ€ νμ λ°°ν¬λ©λλ€. μμΈν λ΄μ©μ LICENSE νμΌμ μ°Έμ‘°νμΈμ.
μ΄ νλ‘μ νΈλ λ€μ μ€νμμ€ νλ‘μ νΈμ μ½λλ₯Ό ν¬ν¨νκ³ μμ΅λλ€:
κ° λΌμ΄μ μ€μ μ λ¬Έμ ν΄λΉ νλ‘μ νΈμ μ μ₯μμμ νμΈν μ μμ΅λλ€.
νλ‘μ νΈ κ΄λ ¨ λ¬Έμμ¬νμ΄ μμΌμλ©΄ Issues νμ΄μ§λ₯Ό μ΄μ©ν΄μ£ΌμΈμ.
β μ΄ νλ‘μ νΈκ° λμμ΄ λμλ€λ©΄ Starλ₯Ό λλ¬μ£ΌμΈμ! β
Made with β€οΈ by developers, for travelers