LearningCollector: 백준 레포 자동 수집 및 기존 레포 선택 개선
이번 커밋에서는 백준 알고리즘 문제 풀이 커밋을 놓치지 않도록 자동 수집 기능을 추가하고, 기존 개발 레포를 선택하는 방식을 개선했습니다. 사용자 인터페이스를 좀 더 직관적으로 만들고, 백준 관련 커밋을 안정적으로 수집하는 데 중점을 두었습니다.
LearningCollector: 백준 레포 자동 수집 및 기존 레포 선택 개선
이번 커밋에서는 백준 알고리즘 문제 풀이 커밋을 놓치지 않도록 자동 수집 기능을 추가하고, 기존 개발 레포를 선택하는 방식을 개선했습니다. 사용자 인터페이스를 좀 더 직관적으로 만들고, 백준 관련 커밋을 안정적으로 수집하는 데 중점을 두었습니다.
요약
이번 커밋은 GitHub 레포지토리 수집 방식에 변화를 주었습니다. 기존에는 모든 레포지토리를 사용자 선택에 따라 수집했으나, 이제 백준 알고리즘 레포지토리는 자동으로 수집하고, 일반 개발 레포지토리는 사용자가 직접 선택하도록 변경했습니다. 이를 통해 백준 문제 풀이 기록이 누락되는 일을 방지하고, 사용자 경험을 개선하고자 했습니다. 작업은 2026년 2월 2일에 이루어졌으며, core/github_collector.py와 policies/collection_rules.py 파일이 수정되었습니다.
배경 및 목적
기존에는 사용자가 직접 수집할 레포지토리와 브랜치를 일일이 선택해야 했습니다. 하지만 백준 알고리즘 문제 풀이 기록은 꾸준히 쌓이는 중요한 데이터임에도 불구하고, 사용자가 실수로 선택하지 않거나 복잡한 과정 때문에 누락될 가능성이 있었습니다.
이러한 문제를 해결하기 위해 다음과 같은 목표를 설정했습니다.
- 백준 커밋 누락 방지: 백준 레포지토리를 명확히 식별하고, 항상 자동으로 수집하여 기록의 연속성을 보장합니다.
- 사용자 경험 개선: 복잡했던 레포 및 브랜치 선택 과정을 단순화하고, 백준 레포를 별도 관리하여 효율성을 높입니다.
- 코드 가독성 및 유지보수성 향상: 백준 레포 식별 로직을 명확히 분리하여 코드의 이해도를 높입니다.
구현 내용
이번 변경사항은 크게 두 부분으로 나눌 수 있습니다.
1. 백준 레포 자동 수집 로직 구현 (core/github_collector.py 수정)
기존의 대화형 수집(collect_interactive) 함수에서 레포지토리 및 브랜치 선택 로직을 대대적으로 수정했습니다.
- 레포지토리 분리: GitHub API로부터 가져온 전체 레포지토리를 '백준 레포'와 '개발 레포'로 분리하는 로직을 추가했습니다.
- 백준 레포 자동 수집: 분리된 백준 레포지토리는 사용자의 추가적인 선택 없이 모든 브랜치에서 커밋을 자동으로 수집하도록 변경했습니다.
- 개발 레포 선택 방식 개선: 개발 레포지토리에 대해서는 기존처럼 사용자에게 번호를 입력받거나 'all'을 선택하는 방식을 유지하되, 'n' 옵션을 추가하여 선택을 건너뛸 수 있도록 했습니다.
- 코드 구조 변경: 전체적인 흐름을 명확히 하기 위해 단계별 번호를 재정렬했습니다 (예:
1. 레포 조회 및 백준/개발 분리,2. 백준 레포 자동 수집,3. 개발 레포 선택).
주요 변경 파일: core/github_collector.py
총 추가 라인 수: 94
총 삭제 라인 수: 59
2. 백준 레포 식별 규칙 추가 (policies/collection_rules.py 수정)
백준 레포지토리를 정확하게 식별하기 위한 규칙을 policies/collection_rules.py 파일에 추가했습니다.
is_baekjoon_repo클래스 메소드를 새로 추가했습니다.- 이 메소드는 레포지토리 이름을 받아, 환경변수
BAEKJOON_REPO_NAME이 설정되어 있으면 해당 이름과 일치하는지, 그렇지 않다면 레포지토리 이름에 "baekjoon" 또는 "boj"가 포함되어 있는지(대소문자 구분 없음)를 확인합니다.
주요 변경 파일: policies/collection_rules.py
총 추가 라인 수: 27
총 삭제 라인 수: 0
기술적 의사결정
1. 백준 레포 자동 수집을 위한 식별 로직
선택: policies/collection_rules.py에 is_baekjoon_repo 메소드를 추가하여 레포지토리 이름을 기준으로 백준 레포를 식별했습니다.
이유:
- 명확성: 레포 이름만으로 백준 레포를 판단하는 것은 직관적이고 구현이 간단합니다.
- 유연성: "baekjoon", "boj"와 같은 일반적인 키워드뿐만 아니라,
BAEKJOON_REPO_NAME환경변수를 통해 사용자가 특정 레포지토리를 명시적으로 지정할 수 있도록 유연성을 확보했습니다.
다른 대안 및 비교:
- 커밋 메시지 패턴 기반 식별: 백준 커밋을 식별하는
is_baekjoon_commit메소드가 이미 존재하지만, 이를 레포지토리 식별에 사용하기에는 부적합합니다. 레포지토리 전체를 대상으로 커밋 메시지를 일일이 검사하는 것은 비효율적이며, 해당 레포지토리의 모든 커밋이 백준과 관련 있다는 보장이 없습니다. - 별도의 설정 파일 사용: 별도의 설정 파일에 백준 레포 목록을 관리하는 것도 가능하지만, 간단한 식별 규칙에는 과한 설정으로 판단했습니다. 환경 변수와 코드 내 규칙으로 충분히 관리 가능하다고 보았습니다.
장단점 분석:
- 장점: 구현이 간편하고, 환경 변수를 통한 커스터마이징이 용이합니다.
- 단점: 사용자가 백준 레포에 "baekjoon"이나 "boj"와 관련 없는 이름을 사용하는 경우, 자동 수집에서 제외될 수 있습니다 (이 경우 환경 변수로 설정 가능).
2. 레포지토리 및 브랜치 선택 UI 개선
선택: 대화형 인터페이스에서 백준 레포와 개발 레포를 명확히 구분하고, 백준 레포는 자동 수집, 개발 레포는 선택 방식으로 변경했습니다.
이유:
- 자동화 효율성 증대: 백준 커밋은 놓치기 쉬우므로, 이를 자동으로 수집함으로써 사용자에게 더욱 확실한 데이터 수집을 보장합니다.
- 사용자 편의성 증대: 사용자는 자신이 관리해야 할 개발 레포에만 집중할 수 있게 되어, 불필요한 반복 작업을 줄일 수 있습니다.
- 명확한 역할 분담: 백준 레포와 개발 레포의 역할을 명확히 구분하여 코드의 목적성을 분명히 했습니다.
다른 대안 및 비교:
- 모든 레포를 동일하게 처리: 기존 방식처럼 모든 레포지토리를 동일하게 취급하면, 백준 커밋 누락 문제를 해결할 수 없습니다.
- 별도의 스크립트/모듈 사용: 백준 레포 수집을 위해 완전히 별도의 스크립트를 만드는 것은 코드 중복 및 관리의 복잡성을 야기할 수 있습니다. 기존
collect_interactive함수 내에서 로직을 통합하는 것이 효율적이라고 판단했습니다.
장단점 분석:
- 장점: 백준 커밋 누락 방지에 효과적이며, 사용자 인터페이스가 간결해집니다.
- 단점: 백준 레포라고 판단되는 기준이 맞지 않으면 의도와 다른 레포가 자동 수집될 가능성이 있습니다. (하지만
BAEKJOON_REPO_NAME환경변수로 보완 가능합니다.)
배운 점 및 개선점
이번 작업을 통해 GitHub API를 활용하여 레포지토리 정보를 가져오고, 이를 기반으로 사용자에게 유용한 기능을 제공하는 방법에 대해 더 깊이 이해하게 되었습니다. 특히, 사용자 경험과 데이터의 누락 방지라는 두 가지 목표를 동시에 달성하기 위한 로직 설계에 대해 고민할 수 있었습니다.
배운 점:
- 사용자 시나리오 기반 설계의 중요성: 사용자가 어떤 데이터를 수집하고 싶어 하는지, 그리고 어떤 부분에서 어려움을 겪을 수 있는지를 예상하는 것이 좋은 기능을 설계하는 데 매우 중요하다는 것을 다시 한번 느꼈습니다.
- 점진적인 개선: 한 번에 완벽한 기능을 만들기보다는, 기존 코드를 수정하고 점진적으로 기능을 개선해 나가는 방식의 장점을 체감했습니다.
- 유연한 환경 변수 활용:
BAEKJOON_REPO_NAME과 같은 환경 변수를 통해 사용자 정의 옵션을 제공하는 것이 코드 변경 없이 기능을 확장하는 좋은 방법임을 알게 되었습니다.
앞으로 개선할 점:
- 백준 레포 자동 수집 기준 강화: 현재는 키워드 매칭이나 환경 변수에 의존하고 있는데, 좀 더 정교하게 백준 레포를 식별할 수 있는 방법을 추가로 고려해 볼 수 있습니다. 예를 들어, 해당 레포지토리의 설명(description) 필드를 활용하는 것도 방법이 될 수 있습니다.
- 레포 선택 UI 상세화: 개발 레포 선택 시, 각 레포의 간단한 설명이나 최근 커밋 정보를 보여주어 사용자가 더 나은 선택을 할 수 있도록 돕는 방안도 고려해 볼 수 있습니다.
- 오류 처리 강화: 네트워크 오류나 API 응답 지연 등 다양한 예외 상황에 대한 처리를 더욱 견고하게 만들어 안정성을 높일 필요가 있습니다.
다음 단계 계획:
policies/collection_rules.py에 레포지토리 설명 필드를 활용한 백준 레포 식별 로직 추가를 검토합니다.- 개발 레포 선택 시, 추가적인 정보 표시를 위한 UI 개선 방안을 탐색합니다.
- 현재 수집 로직에서 발생할 수 있는 예외 상황들을 분석하고, 이에 대한 오류 처리 로직을 보강합니다.
참고 자료
- GitHub API Documentation (Repository 및 Branch 관련)
- Python
os모듈 (환경 변수 접근)