대전대학교 컴퓨터공학과 박상돈 / 취창업역량강화 수업의 모의 지원 예제
지원 직무: 당근 Software Engineer, Backend - 피드 (ML Data Platform, 신입)
구현·검증일: 2026-09-06
클릭 이벤트를 저장하고 카테고리별 관심 횟수로 합성 게시글 6개의 순서를 바꾸는 로컬 웹 예제입니다. 교수자의 실제 구직 이력이나 학생 대상 운영 실적을 의미하지 않습니다. 인증, 결제, 채팅, 학습 기반 추천 모델은 구현 범위에 포함하지 않았습니다.
Python 3.12에서 확인했습니다. 폴더를 연 뒤 다음 명령을 실행합니다.
python -m venv .venv
.venv\Scripts\python.exe -m pip install -r requirements.txt
.venv\Scripts\python.exe -m uvicorn app:app --host 127.0.0.1 --port 8765
브라우저에서 http://127.0.0.1:8765 를 엽니다. API 문서는 http://127.0.0.1:8765/docs 에 있습니다. macOS/Linux에서는 위 명령의 실행 파일을 .venv/bin/python으로 바꾸면 됩니다.
데모 버튼을 위에서부터 누르면 첫 클릭 저장(201), 같은 클릭 재전송(200), 늦은 기록 저장(201)을 확인합니다. 고유 이벤트는 2건이고 최신 관심은 전공책으로 유지됩니다. 새로고침해도 DB는 유지됩니다. 처음부터 시연하려면 서버를 종료한 뒤 환경 변수 CAMPUS_FEED_DB에 새 DB 파일 경로를 지정하고 다시 실행합니다.
$env:CAMPUS_FEED_DB = ".runtime/demo-fresh.db"
.venv\Scripts\python.exe -m uvicorn app:app --host 127.0.0.1 --port 8765
별도 터미널에서 실행합니다. 재실행하면 evidence의 해당 결과 파일이 갱신됩니다.
.venv\Scripts\python.exe verify.py
.venv\Scripts\python.exe benchmark.py
POST /api/events에서 event_id를 고유 키로 사용합니다. 같은 ID와 같은 본문은 duplicate로 응답하고 집계하지 않습니다. 같은 ID에 다른 사용자·카테고리·발생 시각이 오면 409를 반환합니다.
이벤트 저장과 사용자 요약 변경은 BEGIN IMMEDIATE 트랜잭션으로 묶습니다. 중간 실패를 주입하는 테스트로 원본과 요약이 함께 롤백되는지 확인했습니다. 최신 관심은 발생 시각으로 결정하고, 시각이 같으면 event_id 순서로 일관되게 결정합니다. 카테고리별 횟수가 같으면 게시글의 합성 생성 순서로 정렬합니다.
조회 인덱스:
CREATE INDEX ix_events_user_category_time
ON events(user_id, category, occurred_at);
| 파일 | 내용 |
|---|---|
| app.py | 요청 검증, API, 합성 게시글과 피드 정렬 |
| store.py | SQLite 저장, 중복 처리, 트랜잭션, 관심 집계 |
| web/ | 실제 시연 화면 |
| test_app.py | 12개 검증 시나리오 |
| verify.py | 테스트 실행과 JSON/XML/텍스트 기록 생성 |
| benchmark.py | 합성 데이터 생성, 동일 SQL 비교, 실행 계획 검증 |
| evidence/verification.json | 테스트별 통과 결과 |
| evidence/tests.txt, tests.xml | 테스트 원본 로그 |
| evidence/benchmark.json | 실험 조건, 환경, 회차별 결과와 실행 계획 |
| evidence/latency.csv | 개별 측정값 1,800개 |
| evidence/source-manifest.json | 제출한 코드 파일의 SHA-256 |
| evidence/screenshots/ | 실제 실행 화면 캡처 |
사용자 인터뷰로 사용 상황 확인, 인증·권한, 데이터 보존 정책, PostgreSQL 이식, 배포, HTTP 부하 측정이 남아 있습니다. 이벤트 ID는 전체 시스템에서 고유하게 발급된다는 전제가 있습니다. SQLite의 쓰기 직렬화와 지속적으로 커지는 이벤트 원본은 서비스 규모가 커지면 다시 설계해야 합니다.
채용공고는 준비 방향을 정하는 데 사용했고, 회사의 내부 구현이나 성능을 재현한 프로젝트는 아닙니다. 학생은 자신의 코드·역할·측정 기록으로 바꾸어 발표해야 합니다.