- 학내 자체적으로 전자 투표를 진행할 수 있는 시스템 구축을 제안하고자 합니다.
- 학생들이 자유롭게 의견을 나눌 수 있는 커뮤니티 기능도 포함합니다.
- 우리 학교 학생회의 대표자 선거(총학생회 선거, 단과대 학생회 선거 등)는 오프라인 투표 방식과 온라인 투표 방식을 병행하여 진행하고 있습니다.
- 이 중 온라인 투표는 Univote와 같은 학외 전자 투표 시스템 업체에 비용을 지불하여 진행하고 있습니다.
- 매해마다 이루어지는 학생회 선거의 특성상 이는 학생회비 중 일정 비용이 학외 업체에 매년 반복적으로 지출되는 결과로 이어지고 있습니다.
- 또한 여론 조사를 위한 공식적인 커뮤니티가 없어 학내 중요 사안에 대한 공신력 있는 여론 수합이 어렵다는 문제를 느꼈습니다.
- 이와 같은 문제 상황을 해결하기 위해 학생회와의 협의를 통해 학내 자체적으로 전자 투표를 진행할 수 있는 시스템 구축을 기획했습니다.
김재민(odumag99) - 팀장 | 김동규(morecleverer) | 오정윤(nyunn2) | 정희우(huiwoo1010) |
FastAPI | FastAPI | Android | Android |
- 김재민
- 팀장 역할 수행 및 일정 관리
- 데이터베이스 총 관리
- 소셜 로그인 구현
- 투표 참여 및 댓글 api 구현
- 김동규
- 앱 디자인 설계 및 CI/CD 설계
- 사용자 로그인 api 구현
- 투표 리스트 조회, 유저 페이지 api 구현
- 오정윤
- 회원 가입 구현
- 투표 리스트 조회 기능 구현
- 투표 생성 및 참여, 회원 페이지 구현
- 댓글 기능 구현
- 정희우
- 사용자 로그인 페이지 및 자동 로그인 구현
- 소셜 계정 연동 및 로그인, 로그아웃 구현
- 투표 리스트 페이지네이션 구현
fastapi = "^0.115.0" // Python 기반 비동기 웹 프레임워크
uvicorn = "^0.30.6" // ASGI 서버 (FastAPI 실행용)
sqlalchemy = "^2.0.35" // ORM (Object Relational Mapper)
alembic = "^1.13.3" // 데이터베이스 마이그레이션 도구
email-validator = "^2.2.0" // 이메일 형식 검증 라이브러리
pydantic-settings = "^2.5.2" // 환경 변수 및 설정 관리
cryptography = "^43.0.1" // 암호화 및 보안 관련 기능 제공
python-jose = "^3.3.0" // JWT 및 JOSE(JSON Object Signing and Encryption) 구현
python-multipart = "^0.0.17" // 멀티파트 폼 데이터 처리 (파일 업로드 등)
social-auth-core = "^4.5.4" // 소셜 로그인 및 인증 기능 제공
aiomysql = "^0.2.0" // MySQL 비동기 드라이버
python-dotenv = "^1.0.1" // .env 파일을 사용한 환경 변수 로드
boto3 = "^1.36.2" // AWS SDK for Python (S3 등 AWS 서비스 연동)
bcrypt = "^4.2.1" // 비밀번호 해싱 라이브러리
httpx = "^0.28.1" // 비동기 HTTP 클라이언트 (Requests 대체)
- Android SDK & Jetpack
`androidx.core:core-ktx` (`1.15.0`) // Kotlin 확장 기능 제공
`androidx.appcompat:appcompat` (`1.7.0`) // 구형 버전과의 호환성 유지
`androidx.swiperefreshlayout:swiperefreshlayout` (`1.1.0`) // 새로고침
- Jetpack 아키텍처 컴포넌트
`androidx.lifecycle:lifecycle-livedata-ktx` (`2.6.1`) // LiveData를 통한 데이터 관리
`androidx.navigation:navigation-fragment-ktx` (`2.8.3`) // Jetpack Navigation (Fragment 간 이동)
`androidx.navigation:navigation-runtime-ktx` (`2.8.5`)
`androidx.navigation:navigation-ui-ktx` (`2.5.3`)
- 네트워크 통신
`com.squareup.retrofit2:retrofit` (`2.11.0`) // REST API 요청 처리
`com.squareup.retrofit2:converter-gson` (`2.11.0`) // JSON 파싱 지원
`com.squareup.okhttp3:okhttp` (`4.10.0`) // HTTP 클라이언트
`com.squareup.okhttp3:logging-interceptor` (`4.10.0`) // HTTP 요청 로그 확인
- 의존성 주입 (Dependency Injection)
`com.google.dagger:hilt-android` (`2.52`) // 구글 공식 DI 라이브러리
`com.google.dagger:hilt-android-compiler` (`2.52`) // Hilt 코드 생성
- 이미지 로딩
`com.github.bumptech.glide:glide` (`4.16.0`) // 이미지 로딩
- 소셜 로그인
`com.kakao.sdk:v2-user` (`2.18.0`) // 카카오 로그인
`com.navercorp.nid:oauth` (`5.4.0`) // 네이버 로그인
- 회원가입
- 이미 DB에 동일 ID 또는 이메일을 가진 회원이 있을 경우 회원가입 거부
- Password의 조건이 충족되지 않을 경우 회원가입 거부
- ID, PW로 로그인을 하거나 소셜계정으로 로그인합니다.
- ID나 PW가 일치하지 않을 경우 회원가입 거부
- 회원이 소셜 계정과 연동한 경우 소셜 계정을 통한 로그인도 가능
- 자동로그인 선택 시 앱 재실행시에도 로그인 상태가 유지됩니다.
- 최신 순으로 진행 중인 투표 리스트를 확인할 수 있습니다.
- 투표 제목, 투표글 썸네일, 투표 종료까지 남은 시간, 투표 참여자 명수가 표시됩니다.
- 투표글 10개 단위의 페이지네이션이 적용되어 있습니다.
- 투표 참여자 수가 5명 이상인 투표 리스트를 확인할 수 있습니다.
- 투표 제목, 투표글 썸네일, 투표 종료까지 남은 시간, 투표 참여자 명수가 표시됩니다.
- 투표글 10개 단위의 페이지네이션이 적용되어 있습니다.
- 마감된 투표 리스트를 확인 할 수 있습니다.
- 투표 제목, 투표글 썸네일, 투표 참여자 명수가 표시됩니다.
- 투표글 10개 단위의 페이지네이션이 적용되어 있습니다.
진행 중인 투표 | 종료된 투표 |
-
투표 제목, 투표 설명, 투표 설정값을 확인할 수 있습니다.
-
댓글을 작성, 수정, 삭제할 수 있습니다.
-
진행 중인 투표의 경우 투표 참여가 가능합니다. (참여코드가 필요할 수 있습니다)
- 중복 선택 가능 투표의 경우 여러 개의 선택지에 투표할 수 있습니다.
- 참여코드가 필요한 투표의 경우 투표를 위해 참여코드를 입력해야 합니다.
- 참여코드가 일치하지 않는 경우 투표 참여가 거부됩니다.
- 투표 마감 시간이 도래한 경우 투표 참여가 거부됩니다.
-
결과 공개 기능
- 종료된 투표의 경우 투표 결과를 확인할 수 있습니다.
- 실시간 결과 공개 투표의 경우, 진행 중인 투표에서도 투표 결과를 확인할 수 있습니다.
- 익명 투표의 경우 선택지 참여자의 이름은 공개되지 않고, 각 선택지별 선택자 수만 공개됩니다.
- 중복 투표의 경우, 각 선택지별 선택자 수의 합과 투표 참여자 총 명수가 일치하지 않을 수 있습니다. 이 경우 투표 참여자 총 명수가 중복 선택자 수를 제외한 값입니다.
- 사진, 제목, 설명, 투표 선택지, 투표 설정값, 마감 시간을 설정할 수 있습니다.
회원 페이지 | 비밀번호 변경 | 내가 참여한 투표 | 내가 만든 투표 |
- 비밀번호 변경이 가능합니다.
- 내가 참여한 투표, 내가 만든 투표를 확인할 수 있습니다.
- 소셜 계정 연동이 가능합니다.
- 네이버는 현재 네이버측에서 검수 진행중이어서 사전에 등록된 네이버 계정만 연동 가능합니다.
- 이미 소셜 계정에 연동한 회원의 경우 연동 요청이 거절됩니다.
- 회원 탈퇴
- 탈퇴한 회원과 동일한 ID, 이메일로 회원가입을 시도할 경우 거부됩니다.
- 탈퇴한 회원의 이름은 '탈퇴한 회원'으로 표시됩니다.
- 로그아웃이 가능합니다.
- docker + github action으로 CI/CD 구현
- 소수 정예로 똘똘 뭉친 기획팀