Skip to content

Comments

admin 기능 추가 이메일 발송 준비#302

Merged
CSE-Shaco merged 4 commits intoGDGoCINHA:developfrom
CSE-Shaco:develop
Feb 20, 2026
Merged

admin 기능 추가 이메일 발송 준비#302
CSE-Shaco merged 4 commits intoGDGoCINHA:developfrom
CSE-Shaco:develop

Conversation

@CSE-Shaco
Copy link
Contributor

@CSE-Shaco CSE-Shaco commented Feb 20, 2026

📌 연관된 이슈

ex) #이슈번호, #이슈번호

✨ 작업 내용

이번 PR에서 작업한 내용을 간략히 설명해주세요

💬 리뷰 요구사항(선택)

Summary by CodeRabbit

릴리스 노트

  • 새로운 기능

    • 관리자 로그인 기능 추가
    • 신입생 지원 알림 이메일 시스템 구현
    • 관리자용 이메일 알림 템플릿 조회, 발송, 재시도 기능
    • 이메일 자동 처리 스케줄러
  • 기타

    • 권한 관리 규칙 업데이트
    • 관리자 설정 및 데이터베이스 스키마 추가

@coderabbitai
Copy link

coderabbitai bot commented Feb 20, 2026

Caution

Review failed

The pull request is closed.

Walkthrough

신입생 모집 알림 시스템을 구현하며, 관리자 인증 및 역할 기반 권한 관리를 강화했습니다. 스케줄링, REST API 엔드포인트, JPA 엔티티, 알림 처리 서비스, 데이터베이스 마이그레이션을 추가했습니다.

Changes

Cohort / File(s) Summary
Scheduling Configuration
src/main/java/inha/gdgoc/GdgocApplication.java
@EnableScheduling 어노테이션을 추가하여 Spring 스케줄링 기능 활성화.
Admin Recruitment Member Memo API
src/main/java/inha/gdgoc/domain/admin/recruit/member/controller/RecruitMemberMemoAdminController.java, src/main/java/inha/gdgoc/domain/admin/recruit/member/controller/message/RecruitMemberMemoAdminMessage.java, src/main/java/inha/gdgoc/domain/admin/recruit/member/service/RecruitMemberMemoAdminService.java
알림 템플릿 조회, 개시 알림 큐잉, 실패한 알림 재시도 기능을 제공하는 관리자 REST 엔드포인트 및 서비스 계층 추가.
Admin Recruitment Member Memo DTOs
src/main/java/inha/gdgoc/domain/admin/recruit/member/dto/request/RecruitMemberMemoOpeningNotificationRequest.java, src/main/java/inha/gdgoc/domain/admin/recruit/member/dto/response/RecruitMemberMemoOpeningNotificationEnqueueResponse.java, src/main/java/inha/gdgoc/domain/admin/recruit/member/dto/response/RecruitMemberMemoFailedRetryResponse.java, src/main/java/inha/gdgoc/domain/admin/recruit/member/dto/response/RecruitMemberMemoNotificationTemplateResponse.java
알림 요청/응답 데이터를 위한 검증 규칙 및 팩토리 메서드를 포함하는 레코드 타입 추가.
User Role Management Enhancement
src/main/java/inha/gdgoc/domain/admin/user/controller/UserAdminController.java, src/main/java/inha/gdgoc/domain/admin/user/service/UserAdminService.java
CORE 역할 이상 필수 권한 규칙 추가; 자체 편집 차단, 팀 검증, LEAD/CORE 정책 통합 로직 추가.
Admin Authentication System
src/main/java/inha/gdgoc/domain/auth/entity/AdminCredential.java, src/main/java/inha/gdgoc/domain/auth/repository/AdminCredentialRepository.java, src/main/java/inha/gdgoc/domain/auth/service/AdminCredentialInitializer.java, src/main/java/inha/gdgoc/domain/auth/dto/request/LoginRequest.java, src/main/java/inha/gdgoc/domain/auth/dto/response/AuthUserResponse.java, src/main/java/inha/gdgoc/domain/auth/controller/AuthController.java
관리자 로그인 엔드포인트, 자격증명 엔티티, 저장소, 초기화 로직 및 DTO 팩토리 메서드 추가.
Authentication Service Refactoring
src/main/java/inha/gdgoc/domain/auth/service/AuthService.java, src/main/java/inha/gdgoc/global/config/jwt/TokenProvider.java
관리자 토큰 생성, RefreshSession 프리캐플 타입 지원, 새로운 JWT 클레임 추가. RefreshResult 타입 변경 및 getAuthentication 다중 경로 지원.
Mail Service Enhancement
src/main/java/inha/gdgoc/domain/auth/service/MailService.java
순수 텍스트 메일 전송 오버로드 메서드 추가 (기본/커스텀 발신자 지원).
Recruitment Member Memo Notification Entity & Repository
src/main/java/inha/gdgoc/domain/recruit/member/notification/entity/RecruitMemberMemoNotification.java, src/main/java/inha/gdgoc/domain/recruit/member/notification/entity/RecruitMemberMemoNotificationStatus.java, src/main/java/inha/gdgoc/domain/recruit/member/notification/repository/RecruitMemberMemoNotificationRepository.java
상태 추적, 재시도 로직, 배치 페칭을 포함하는 알림 엔티티, 상태 열거형, 네이티브 SQL 쿼리 메서드 추가.
Recruitment Member Memo Notification Service
src/main/java/inha/gdgoc/domain/recruit/member/notification/service/RecruitMemberMemoNotificationService.java, src/main/java/inha/gdgoc/domain/recruit/member/notification/service/RecruitMemberMemoNotificationEnqueueResult.java, src/main/java/inha/gdgoc/domain/recruit/member/notification/service/RecruitMemberMemoNotificationRetryResult.java, src/main/java/inha/gdgoc/domain/recruit/member/notification/service/RecruitMemberMemoNotificationTemplate.java, src/main/java/inha/gdgoc/domain/recruit/member/notification/service/RecruitMemberMemoNotificationTemplateInfo.java
배치 처리, 메일 전송, 오류 처리, 재시도 지연 계산을 포함하는 알림 서비스 및 결과/템플릿 레코드 추가.
Recruitment Member Memo Notification Scheduler
src/main/java/inha/gdgoc/domain/recruit/member/notification/scheduler/RecruitMemberMemoNotificationScheduler.java
설정된 지연 시간에 따라 대기 중인 알림을 처리하는 스케줄된 작업 추가.
Recruitment Member DTO Updates
src/main/java/inha/gdgoc/domain/recruit/member/dto/response/RecruitMemberSummaryResponse.java, src/main/java/inha/gdgoc/domain/recruit/member/dto/response/SpecifiedMemberResponse.java
RecruitMemberSummaryResponse에서 admissionSemester 필드 제거; SpecifiedMemberResponse에 등록 분류, 전화번호, 이메일, 성별, 생년월일, 타임스탐프 필드 추가.
Team Type Enum Update
src/main/java/inha/gdgoc/domain/user/enums/TeamType.java
PR_DESIGN 열거형 상수의 라벨을 "PR/DESIGN"에서 "PR_DESIGN"으로 변경.
Configuration Files
src/main/resources/application-dev.yml, src/main/resources/application-local.yml, src/main/resources/application-prod.yml
관리자 로그인 자격증명(login-id, password) 및 메일 발신자(mail.recruit-from) 설정 속성 추가.
Database Migrations
src/main/resources/db/migration/V20260218__create_admin_credentials.sql, src/main/resources/db/migration/V20260220__create_recruit_member_memo_notification.sql
admin_credentials 및 recruit_member_memo_notification 테이블 생성, 인덱스 및 제약 조건 추가.
Unit Tests
src/test/java/inha/gdgoc/domain/admin/user/service/UserAdminServiceTest.java, src/test/java/inha/gdgoc/domain/recruit/member/notification/service/RecruitMemberMemoNotificationServiceTest.java
역할 기반 권한 검증 및 알림 처리 흐름에 대한 테스트 케이스 추가.

Sequence Diagram(s)

sequenceDiagram
    actor Admin as 관리자
    participant Controller as RecruitMemberMemoAdminController
    participant AdminService as RecruitMemberMemoAdminService
    participant NotifService as RecruitMemberMemoNotificationService
    participant Repository as RecruitMemberMemoNotificationRepository
    participant MailService as MailService
    
    Admin->>Controller: POST /api/v1/admin/recruit/member/memo/notifications/opening
    Controller->>AdminService: enqueueOpeningNotifications(request)
    AdminService->>NotifService: enqueueOpeningNotificationsForCurrentSemester(subject, body)
    NotifService->>Repository: 배치 SQL 실행 (대상 계산 및 큐잉)
    Repository-->>NotifService: 결과 반환 (distinctTargetCount, enqueuedCount)
    NotifService-->>AdminService: RecruitMemberMemoNotificationEnqueueResult
    AdminService-->>Controller: RecruitMemberMemoOpeningNotificationEnqueueResponse
    Controller-->>Admin: 200 OK (ApiResponse)
    
    Note over MailService: 스케줄러가 별도로 대기 중인 알림 처리
Loading
sequenceDiagram
    participant Scheduler as RecruitMemberMemoNotificationScheduler
    participant NotifService as RecruitMemberMemoNotificationService
    participant Repository as RecruitMemberMemoNotificationRepository
    participant MailService as MailService
    
    Scheduler->>NotifService: processPendingNotifications()
    NotifService->>Repository: findPendingBatchForUpdate(batchSize)
    Repository-->>NotifService: 대기 중인 알림 리스트
    
    loop 각 알림에 대해
        NotifService->>MailService: sendPlainMail(email, subject, body)
        alt 성공
            MailService-->>NotifService: 메일 전송 완료
            NotifService->>NotifService: markSent(notification)
        else 실패
            MailService-->>NotifService: 예외 발생
            NotifService->>NotifService: markFailed(notification, maxAttempts, retryDelay)
        end
    end
    
    NotifService->>Repository: saveAll(notifications)
    Repository-->>NotifService: 저장 완료
Loading
sequenceDiagram
    actor User as 사용자
    participant AuthController as AuthController
    participant AuthService as AuthService
    participant AdminCredRepo as AdminCredentialRepository
    participant PasswordEncoder as PasswordEncoder
    participant TokenProvider as TokenProvider
    
    User->>AuthController: POST /api/v1/auth/login/admin
    AuthController->>AuthService: adminLogin(adminId, password)
    AuthService->>AdminCredRepo: findByLoginId(adminId)
    AdminCredRepo-->>AuthService: AdminCredential
    AuthService->>PasswordEncoder: matches(password, passwordHash)
    PasswordEncoder-->>AuthService: true/false
    
    alt 자격증명 유효
        AuthService->>TokenProvider: createAdminAccessToken(id, loginId, sessionId)
        TokenProvider-->>AuthService: accessToken
        AuthService->>AuthService: createRefreshToken(adminId)
        AuthService-->>AuthController: LoginSuccessResponse
        AuthController-->>User: 200 OK
    else 자격증명 무효
        AuthService-->>AuthController: IllegalArgumentException
        AuthController-->>User: 401 Unauthorized
    end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

  • PR #204: RecruitMemberSummaryResponse 데이터 구조 수정 - 해당 PR은 admissionSemester 필드를 추가했으나, 이 PR에서는 이를 제거하므로 직접적인 코드 레벨 연관성 있음.
  • PR #281: TokenProvider의 getAuthentication 로직 및 인증/토큰 처리 코드 수정 - 동일한 클래스의 JWT 클레임 및 인증 흐름 변경으로 관련됨.
  • PR #277: AuthController, AuthService, UserAdminController, UserAdminService 등 동일 핵심 클래스 수정 - 인증 및 사용자 역할 관리 로직에서 광범위한 겹침 있음.

Suggested labels

enhancement, feature, admin, notification-system, authentication

Poem

🐰 새로운 기능 들고 뛰어왔네,
관리자 로그인, 알림은 스케줄링,
신입생들께 메일 쏙쏙 날아가고,
역할 관리도 더욱 촘촘해졌어,
데이터베이스에 차곡차곡 담겼다네! 🐇

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Tip

Issue Planner is now in beta. Read the docs and try it out! Share your feedback on Discord.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@CSE-Shaco CSE-Shaco merged commit cbc6873 into GDGoCINHA:develop Feb 20, 2026
1 of 2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant