Skip to content

Repository files navigation

오픈소스 라이선스 탐정단

코드 사용 전, 단서를 확인하라 — 10개의 개발 현장 사건으로 배우는 오픈소스 라이선스 의사결정 퀴즈

제출자 학번 실행 파일
안하람 2023612016 app.py

Python + Streamlit으로 만든 중간고사 대체 과제입니다. MIT, Apache-2.0, BSD-3-Clause, GPL, LGPL, AGPL, CC BY-NC 및 무라이선스 저장소처럼 실제 프로젝트에서 마주칠 법한 상황을 사건 파일로 재구성했습니다.

이 앱은 학습용 시뮬레이션이며 실제 사안에 대한 법률 자문이 아닙니다. 구체적인 판단에는 라이선스 원문과 전문가 검토가 필요합니다.

오픈소스 라이선스 탐정단 로그인 화면

주요 기능

  • 첫 화면 제출자 정보: 로그인 전 첫 화면 상단에 학번과 이름을 항상 표시합니다.
  • 실제 로그인 처리: 사용자 입력, 성공·실패 피드백, 실패 횟수, 세션 로그인 상태 및 로그아웃을 구현했습니다.
  • 의미 있는 캐싱: st.cache_data로 퀴즈 JSON 읽기, 스키마 검증, 체크섬 계산, 분야·라이선스 색인 생성을 재사용합니다.
  • 10단계 사건형 퀴즈: 문제 제시 → 사용자 판단/확신도 입력 → 정답 계산 → 현장 노트 → 최종 보고서 흐름입니다.
  • 개인화 결과: 총점, 수사관 등급, 네 분야별 역량, 과신 단서와 숨은 실력을 분석합니다.
  • 공식 근거 연결: 각 문제의 설명에서 OSI, Apache, GNU, GitHub Docs, Creative Commons, SPDX 원문으로 이동할 수 있습니다.
  • 반응형 다크 UI: 외부 이미지 없이 증거 보드·사건 서류 콘셉트를 CSS로 구성했습니다.

사건 풀이와 근거 확인 화면

채점용 데모 계정

아이디: detective
비밀번호: license2026

비밀번호 원문을 인증 코드에 직접 비교하지 않고 SHA-256 해시와 hmac.compare_digest를 사용합니다. 이는 로그인 상태 처리를 보여 주는 수업용 데모이며 실제 서비스 인증을 대체하지 않습니다.

빠른 실행

Python 3.11 이상을 권장합니다.

Windows PowerShell

git clone https://github.com/ahnharam/oss-license-detective.git
cd oss-license-detective
python -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install -r requirements.txt
streamlit run app.py

macOS / Linux

git clone https://github.com/ahnharam/oss-license-detective.git
cd oss-license-detective
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -r requirements.txt
streamlit run app.py

브라우저에서 http://localhost:8501을 열면 됩니다. 외부 배포는 필요하지 않습니다.

캐싱 설계

Streamlit은 라디오 버튼, 슬라이더, 메뉴 같은 위젯을 조작할 때마다 스크립트를 위에서부터 다시 실행합니다. 캐시가 없다면 매번 다음 작업이 반복됩니다.

  1. UTF-8 JSON 파일 읽기와 파싱
  2. 필수 필드·중복 ID·정답·HTTPS 근거 링크 검증
  3. 데이터 SHA-256 지문 생성
  4. 카테고리 집계와 라이선스 역색인 구축

src/data_loader.pyload_quiz_bundle()@st.cache_data를 적용했습니다. 파일 수정 시각(st_mtime_ns)을 캐시 키에 넣어 원본 JSON이 바뀌면 자동으로 새 데이터를 만들고, 바뀌지 않으면 위 작업을 재사용합니다.

앱의 캐시 감식실에서 다음을 직접 확인할 수 있습니다.

  • 메뉴를 오가도 캐시 생성 시각과 데이터 지문이 유지되는지 확인
  • 캐시 적중 속도 측정
  • 함수 전용 캐시를 비운 뒤 새 생성 시각 확인

로그인 상태와 퀴즈 답변은 사용자별 상태이므로 캐시하지 않고 st.session_state에 저장합니다.

점수와 결과

  • 10문제, 문제당 10점, 총 100점
  • 90–100: 라이선스 아키텍트
  • 70–89: 컴플라이언스 탐정
  • 50–69: 수습 조사관
  • 0–49: 증거 보강 필요

문제는 다음 네 분야로 분석됩니다.

분야 확인하는 능력
고지·귀속 LICENSE, NOTICE, 저작권 고지와 변경 표시
소스 공개 판단 GPL/LGPL/AGPL의 배포·재링크·네트워크 조건
리스크 감지 무라이선스 코드, 콘텐츠·데이터의 이용 제한
커뮤니티 존중 비보증, 기여 계보와 이름·명성의 올바른 사용

확신도는 점수를 바꾸지 않습니다. 대신 높은 확신으로 틀린 과신 단서와 낮은 확신으로 맞힌 숨은 실력을 별도 표시합니다.

프로젝트 구조

oss-license-detective/
├─ app.py                       # Streamlit 메인 실행 파일
├─ SUBMISSION.md                # 최종 과제 제출 주소와 상태
├─ data/quiz.json               # 10개 사건, 라이선스 카드, 공식 근거
├─ src/
│  ├─ auth.py                   # 해시 기반 데모 인증
│  ├─ config.py                 # 제출자·앱 설정
│  ├─ data_loader.py            # JSON 검증 및 st.cache_data
│  └─ quiz_engine.py            # 순수 채점·결과 로직
├─ tests/                       # 단위 테스트와 Streamlit UI 스모크 테스트
├─ docs/
│  ├─ ASSIGNMENT_CHECKLIST.md   # 노션 요구사항 대응표
│  └─ DEMO_SCRIPT.md            # YouTube 데모 촬영 대본
├─ .streamlit/config.toml       # 앱 테마
├─ .github/workflows/tests.yml  # GitHub Actions 자동 테스트
├─ .gitignore                   # Python 프로젝트 제외 규칙
├─ requirements.txt             # 실행 의존성
└─ requirements-dev.txt         # 테스트 의존성

테스트

python -m pip install -r requirements-dev.txt
python -m pytest -q

테스트 범위는 인증 성공·실패, 데이터 스키마 오류, 캐시 재사용, 0–100점 채점 경계, 결과 등급, 첫 화면 학번·이름, 로그인 UI 흐름입니다. GitHub에 push하면 같은 테스트가 Actions에서 자동 실행됩니다.

과제 제출 준비

참고한 공식 자료

라이선스

애플리케이션 코드는 MIT License로 공개합니다. data/quiz.json의 문항과 설명은 본 과제를 위해 직접 구성했습니다.

About

Streamlit scenario quiz for learning open-source license decisions

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages