2025년 2학기 데이터베이스설계 기말 프로젝트
현재 동국대학교의 재학생 인증은 동국패스 및 nDrims와 같은 공식 시스템을 통해 이뤄지고 있다. 그러나 중앙동아리 부원의 소속 인증을 위한 공식 시스템은 존재하지 않는다. 실제로 동아리 연합회가 주관하는 행사에서는 중앙동아리 소속 여부를 확인하기 위해 각 동아리의 카카오톡 단체 방 참여 여부나 단순 구두 확인에 의존하고 있다. 이러한 절차는 다음과 같은 문제점을 갖는다.
-
위조 가능성
- 카카오톡 단체방 참여는 누구나 임의로 추가할 수 있어 신뢰성이 부족하다.
- 학생 본인의 학번, 이름 등 최소 정보만으로도 부원이라고 주장할 수 있어 보안성이 떨어진다.
-
공식성 부족
- 학교나 동아리 연합회에서 관리하는 공식 인증 체계가 아니므로 행정적 근거가 약하다.
-
데이터 관리 부재
- 중앙동아리의 구성원, 직책, 가입·탈퇴 이력 등 필요한 데이터를 중앙에서 관리하지 않아 통계, 감사, 행정 처리가 어렵다.
이러한 문제를 해결하기 위해 “중앙동아리 부원 인증 시스템”을 구축하고자 한다. 학생은 QR 코드 기반 인증 토큰을 발급받아 행사 및 행정 업무에서 공식적으로 본인을 증명할 수 있게 한다.
-
학생 정보 관리
- 학생의 학번, 이름, 소속 학과, 연락처 등을 관리한다.
- 재학생 인증을 위해 외부 인증 시스템(nDrims 등)과 연동될 수 있도록 식별 정보 기반 구조가 필요하다.
-
중앙동아리 정보 관리
- 중앙동아리 목록과 기본 정보를 저장한다.
- 동아리의 지도교수, 분과, 동아리장 등의 정보를 기록한다.
-
학생의 동아리 가입/탈퇴 관리
- 학생은 여러 동아리에 가입할 수 있다.
- 가입 승인 여부, 가입일자, 탈퇴일자, 직책 변경 이력을 관리해야 한다.
-
동아리 임원 및 연합회 간부 관리
- 동아리연합회 대의원으로서 동아리 내부 직책(회장, 부회장, 총무) 기록이 필요하다.
- 연합회 임원 정보와 해당 임원이 어떤 학생인지 연결해야 한다.
-
인증 기록 관리
- 학생이 QR 코드 혹은 토큰을 통해 인증을 시도할 때마다 로그를 기록한다.
- 성공 여부, 인증 시도 시각 등을 저장한다.
-
역할 기반 접근 제어
- 관리자(연합회), 동아리장, 일반 부원 등 사용자 권한을 구분해야 한다.
- 이를 위해 user_role 테이블이 필요하다.
-
부원 인증의 공식화
- QR 코드 기반 인증을 통해 부원 여부를 중앙에서 공식적으로 증명할 수 있다.
-
행정 효율성 향상
- 동아리 분과별 통계, 가입 현황 조사 등 행정 업무가 자동화된다.
-
보안 강화
- 위조가 어려운 인증 체계가 마련되어 부정 참여를 방지할 수 있다.
-
데이터 기반 의사결정 지원
- 동아리 운영 현황, 참여율 등 데이터를 활용해 정책 개선이 가능하다.
POST /api/students- 학생 등록GET /api/students- 학생 목록 조회GET /api/students/{id}- 학생 단건 조회DELETE /api/students/{id}- 학생 삭제
POST /api/clubs- 동아리 등록GET /api/clubs- 동아리 목록 조회GET /api/clubs/{id}- 동아리 단건 조회PATCH /api/clubs/{id}/division- 동아리 분과 변경DELETE /api/clubs/{id}- 동아리 삭제POST /api/clubs/join- 동아리 가입PATCH /api/clubs/memberships/{membershipId}/inactivate- 동아리 탈퇴
동아리 등록 요청 예시:
POST /api/clubs
Content-Type: application/json
{
"name": "컴퓨터과학 동아리",
"designatedAt": "2024-03-01T00:00:00",
"professor": "김교수",
"presidentId": 2021110001,
"divisionId": 1
}모든 필수 필드(name, designatedAt, presidentId, divisionId)가 누락되면 400 Bad Request가 반환됩니다.
POST /api/divisions- 분과 등록GET /api/divisions- 분과 목록 조회GET /api/divisions/{id}- 분과 단건 조회DELETE /api/divisions/{id}- 분과 삭제
POST /api/executives- 집행부 직책 등록GET /api/executives- 집행부 목록 조회GET /api/executives/{id}- 집행부 단건 조회DELETE /api/executives/{id}- 집행부 삭제POST /api/executives/appoint- 학생을 집행부에 임명PATCH /api/executives/appointments/{appointmentId}/retire- 집행부 임명 해제
POST /api/auth/qr/generate- QR 코드 생성 (JWT 토큰 기반)POST /api/auth/qr/verify- QR 코드 검증 및 인증 로그 기록
GET /api/auth-logs- 전체 인증 로그 조회GET /api/auth-logs/student/{studentId}- 특정 학생의 인증 로그 조회
- Spring Security 기반 인증/인가
- CORS 설정 (프론트엔드 연동 준비)
- JWT 기반 QR 토큰 생성 및 검증
- 역할 기반 접근 제어 (RBAC) 구조
- Backend: Spring Boot 3.3.6, Java 21
- Database: MySQL + Spring Data JPA
- Query: QueryDSL 5.1 (jakarta)
- Security: Spring Security, JWT (JJWT 0.12.5)
- API 문서화: Springdoc OpenAPI 2.6.0 (Swagger UI
/docs, OpenAPI/v3/api-docs) - QR Code: ZXing (core/javase 3.5.3)
- Build Tool: Gradle
# 데이터베이스 연결
DB_URL=jdbc:mysql://localhost:3306/dgu_club_auth
DB_USER=your_username
DB_PW=your_password
# JWT 설정 (선택사항, 기본값 제공됨)
JWT_SECRET=your-secret-key-at-least-256-bits
JWT_EXPIRATION=300# 현재 세션에서만 유효
set DB_URL=jdbc:mysql://localhost:3306/dgu_club_auth
set DB_USER=root
set DB_PW=password
# 영구 설정 (새 터미널에서 유효)
setx DB_URL "jdbc:mysql://localhost:3306/dgu_club_auth"
setx DB_USER "root"
setx DB_PW "password"gradlew clean buildgradlew bootRun또는
java -jar build\libs\dgu-club-auth-system-0.0.1-SNAPSHOT.jar서버 실행 후 http://localhost:8080/docs 에서 API 테스트 가능
POST /api/auth/qr/generate
Content-Type: application/json
{
"studentId": 2021110000
}응답:
{
"token": "eyJhbGciOiJIUzI1NiIs...",
"qrCodeBase64": "iVBORw0KGgoAAAANSUhEUgAA...",
"expiresIn": 300
}POST /api/auth/qr/verify
Content-Type: application/json
{
"token": "eyJhbGciOiJIUzI1NiIs..."
}응답:
{
"success": true,
"message": "인증에 성공했습니다.",
"studentId": 2021110000,
"studentName": "홍길동",
"authLogId": 1
}