Skip to content

Conversation

@saokiritoni
Copy link
Member

@saokiritoni saokiritoni commented Jan 1, 2026

🌱 관련 이슈

🌱 작업 사항

  • 기존에는 Slack 메시지를 스케줄러 시간에 맞추어 전송했습니다.
  • Slack Rate Limit은 짧은 시간 안에 여러번 요청을 보내면 차단을 합니다. (429)
  • 그래서 Redis에 담아두고 메시지 큐를 활용하여 수정하였습니다.

🌱 참고 사항

1. 트랜잭션 정합성 확보 (Event-Driven Architecture)

  • 기존 문제: DB 트랜잭션이 롤백되어도 슬랙 알림이 발송되는 문제 (유령 알림).
  • 해결: ApplicationEventPublisher@TransactionalEventListener(phase = AFTER_COMMIT)을 도입.
  • 결과: DB 커밋이 완벽하게 성공한 직후에만 사용자에게 알림이 발송되도록 보장. 실패 시에는 관리자에게만 에러 로그 알림이 감.

2. JPA N+1 문제 및 지연 로딩 해결

  • 기존 문제: checkAndProcessExpiredRequests 실행 시 UserResourceGroup 조회 과정에서 N+1 문제 및 LazyInitializationException 발생.
  • 해결: RequestRepositoryJOIN FETCH를 적용한 조회 메서드 추가.
    @Query("SELECT r FROM Request r JOIN FETCH r.user JOIN FETCH r.resourceGroup ...")

3. 삭제 로직의 Cascade 설정 및 FK 에러 수정

기존 문제: Request 삭제 시 UsedId와 Group 간의 상호 참조로 인해 Foreign key constraint fails 발생.

해결:

  • UsedId ↔ Group 관계에 CascadeType.ALL, orphanRemoval=true 적용.
  • Request → UsedId 관계를 CascadeType.REMOVE로 조정하여, 요청 삭제 시 연관 리소스가 깔끔하게 정리되도록 수정.

4. AOP Self-Invocation 이슈 해결

기존 문제: 같은 서비스 클래스 내에서 @Transactional 메서드를 호출(this.delete...)하여 트랜잭션이 적용되지 않음 (No existing transaction found 에러).

해결: ApplicationContext를 주입받아 자기 자신(Proxy Bean)을 호출하는 방식으로 변경.

5. 알림 비즈니스 로직 고도화

  • 사용자 알림: 삭제 예정(7, 3, 1일 전)과 삭제 완료 메시지를 명확히 구분.
  • 관리자 알림: 리소스 삭제 실패 시에만 에러 로그를 전송하고, 성공 시에는 간단한 요약만 전송 (Lab/Farm 태그 구분).

🧪 테스트 결과
통합 테스트 (RequestSchedulerServiceTest): PASS

  • [만료 계정 삭제 및 Event 리스너 동작 검증
  • 1일/3일/7일 전 알림 발송 검증
  • 트랜잭션 롤백 시나리오 검증
  • 외부 API(Mock) 호출 횟수 검증

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[ feat ] 우분투 계정 정리 스케줄러 기능

2 participants