Skip to content

feat/100 :: 크리에이터 밴/언밴/탈퇴 API 구현#15

Open
lian2945 wants to merge 7 commits intofeat/98from
feat/100
Open

feat/100 :: 크리에이터 밴/언밴/탈퇴 API 구현#15
lian2945 wants to merge 7 commits intofeat/98from
feat/100

Conversation

@lian2945
Copy link
Copy Markdown
Collaborator

@lian2945 lian2945 commented Apr 6, 2026

📌 관련 이슈

  • KAN-100

📝 변경 사항 요약

작업 유형

  • ✨ feat: 새로운 기능 추가 (기능 단위 완료 후 PR)
  • 🐛 fix: 버그 수정 (버그 1개 = PR 1개)
  • ♻️ refactor: 코드 리팩토링 (작업 단위 완료 후 PR)
  • ✅ test: 테스트 코드 추가/수정 (작업 단위 완료 후 PR)

변경 내용

  • 관리자 밴/언밴 API를 추가했습니다.
  • 탈퇴 처리 및 도메인 이벤트 발행 흐름을 구현했습니다.
  • 유저 이벤트 연계 소비 로직을 반영했습니다.

변경 이유

  • 운영 제재 시나리오를 독립 기능으로 분리해 변경/장애 대응을 빠르게 하기 위해서입니다.

✅ 테스트 체크리스트

  • 단위 테스트 작성 및 통과
  • 통합 테스트 통과
  • 기존 기능 정상 동작 확인 (Regression)
  • API 응답값 확인
  • 예외 케이스 처리 확인
  • 로컬 환경에서 직접 테스트 완료

📸 스크린샷 / 로그

펼쳐보기

🔄 동작 플로우 (Mermaid)

%%{init: {'flowchart': {'useMaxWidth': true, 'htmlLabels': true}} }%%
flowchart TD
    A[밴/언밴 요청] --> B[Creator 상태 변경]
    B --> C[도메인 이벤트 저장]
    D[탈퇴 요청] --> E[DELETED 변경]
    E --> C
    C --> F[후속 처리 전파]
Loading

💬 리뷰어에게

크리에이터 밴/언밴/탈퇴 API 구현 범위를 중심으로 리뷰 부탁드립니다.

Copilot AI review requested due to automatic review settings April 6, 2026 10:50
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

크리에이터/유저의 밴·언밴·탈퇴 시나리오를 서비스 단위로 분리하고, 도메인 이벤트 발행 및 타 서비스(creator/auth) 연계 소비 흐름까지 포함해 운영 제재 플로우를 확장한 PR입니다.

Changes:

  • User 서비스: 밴/언밴 상태 및 도메인 이벤트(USER_UNBANNED) 추가, 세션/프로필/탈퇴 유즈케이스 시그니처를 Command/Query 기반으로 정리
  • Creator 서비스: 밴/언밴/탈퇴 처리 및 유저 이벤트(Kafka) 소비 로직/영속화(outbox 형태) 기반 구성 추가
  • Auth/공통: DTO 패키지 정리(command/query/result), 일부 API 유즈케이스 시그니처 변경 및 SonarCloud 분석 워크플로 업데이트

Reviewed changes

Copilot reviewed 49 out of 60 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
services/user/src/main/java/kr/magicbox/user/domain/exception/UserSessionNotActiveException.java 세션 종료 예외 신규 정의
services/user/src/main/java/kr/magicbox/user/domain/exception/UserNotBannedException.java 언밴 불가 케이스 예외 신규 정의
services/user/src/main/java/kr/magicbox/user/domain/exception/UserBannedException.java 밴 상태 탈퇴 불가 예외 신규 정의
services/user/src/main/java/kr/magicbox/user/domain/exception/UserAlreadyInactiveException.java 기존 비활성 예외 제거
services/user/src/main/java/kr/magicbox/user/domain/event/UserUnbannedEvent.java 유저 언밴 도메인 이벤트 추가
services/user/src/main/java/kr/magicbox/user/domain/event/UserDomainEventType.java USER_UNBANNED 타입 추가
services/user/src/main/java/kr/magicbox/user/domain/enums/UserStatus.java 상태 값 조정(INACTIVE→BANNED)
services/user/src/main/java/kr/magicbox/user/domain/aggregate/User.java activate/ban/unban/delete 메서드로 상태 전환 정리
services/user/src/main/java/kr/magicbox/user/application/service/WithdrawUserService.java Withdraw 입력을 Command로 변경 및 락 조회 사용
services/user/src/main/java/kr/magicbox/user/application/service/UserQueryService.java 프로필 조회 입력을 Query로 변경
services/user/src/main/java/kr/magicbox/user/application/service/UserCommandService.java 프로필 수정 입력을 Command 단일 인자로 변경
services/user/src/main/java/kr/magicbox/user/application/service/UnbanUserService.java 유저 언밴 유즈케이스 및 이벤트 발행 추가
services/user/src/main/java/kr/magicbox/user/application/service/ManageUserSessionService.java 세션 시작/종료 입력을 Command로 변경 및 예외 교체
services/user/src/main/java/kr/magicbox/user/application/service/LoginService.java 리포지토리 save/update 메서드명 변경 반영
services/user/src/main/java/kr/magicbox/user/application/service/CheckUserActiveService.java 활성 여부 조회 입력을 Query로 변경
services/user/src/main/java/kr/magicbox/user/application/service/BanUserService.java 밴 처리 도메인 메서드명 변경 반영
services/user/src/main/java/kr/magicbox/user/application/port/out/UserRepositoryPort.java save/update 메서드명 변경 및 WithLock 조회 추가
services/user/src/main/java/kr/magicbox/user/application/port/out/ReviewQueryPort.java DTO 패키지 변경 반영
services/user/src/main/java/kr/magicbox/user/application/port/in/WithdrawUserUseCase.java Withdraw 입력을 Command로 변경
services/user/src/main/java/kr/magicbox/user/application/port/in/UserQueryUseCase.java 프로필 조회 입력을 Query로 변경
services/user/src/main/java/kr/magicbox/user/application/port/in/UserCommandUseCase.java 프로필 수정 입력을 Command 단일 인자로 변경
services/user/src/main/java/kr/magicbox/user/application/port/in/UnbanUserUseCase.java 유저 언밴 유즈케이스 추가
services/user/src/main/java/kr/magicbox/user/application/port/in/ManageUserSessionUseCase.java 세션 유즈케이스 입력을 Command로 변경
services/user/src/main/java/kr/magicbox/user/application/port/in/LoadUserCredentialUseCase.java DTO 패키지 변경 반영
services/user/src/main/java/kr/magicbox/user/application/port/in/CheckUserActiveUseCase.java 활성 여부 조회 입력을 Query로 변경
services/user/src/main/java/kr/magicbox/user/application/port/in/BanUserUseCase.java 포맷/정리
services/user/src/main/java/kr/magicbox/user/application/dto/UpdateUserProfileCommand.java 기존 command DTO 제거(패키지 이동)
services/user/src/main/java/kr/magicbox/user/application/dto/result/UserReviewResult.java result 패키지로 이동
services/user/src/main/java/kr/magicbox/user/application/dto/result/LoadUserCredentialResult.java result 패키지로 이동
services/user/src/main/java/kr/magicbox/user/application/dto/result/GetUserProfileResult.java result 패키지로 이동
services/user/src/main/java/kr/magicbox/user/application/dto/query/GetUserProfileQuery.java 프로필 조회 Query DTO 추가
services/user/src/main/java/kr/magicbox/user/application/dto/query/CheckUserActiveQuery.java 활성 여부 Query DTO 추가
services/user/src/main/java/kr/magicbox/user/application/dto/command/WithdrawUserCommand.java 탈퇴 Command DTO 추가
services/user/src/main/java/kr/magicbox/user/application/dto/command/UpdateUserProfileCommand.java 프로필 수정 Command DTO 신규(패키지 이동/확장)
services/user/src/main/java/kr/magicbox/user/application/dto/command/UnbanUserCommand.java 언밴 Command DTO 추가
services/user/src/main/java/kr/magicbox/user/application/dto/command/StartSessionCommand.java 세션 시작 Command DTO 추가
services/user/src/main/java/kr/magicbox/user/application/dto/command/LoadUserCredentialCommand.java command 패키지로 이동
services/user/src/main/java/kr/magicbox/user/application/dto/command/EndSessionCommand.java 세션 종료 Command DTO 추가
services/user/src/main/java/kr/magicbox/user/application/dto/command/BanUserCommand.java 밴 Command DTO 추가
services/user/src/main/java/kr/magicbox/user/adapter/out/persistence/UserJpaAdapter.java WithLock 조회 및 save/update 메서드명 변경 반영
services/user/src/main/java/kr/magicbox/user/adapter/out/persistence/repository/UserJpaRepository.java PESSIMISTIC_WRITE 락 조회 쿼리 추가
services/user/src/main/java/kr/magicbox/user/adapter/out/persistence/entity/UserEntity.java @Version 제거 및 status 업데이트 반영
services/user/src/main/java/kr/magicbox/user/adapter/out/communication/grpc/ReviewQueryGrpcAdapter.java DTO 패키지 변경 반영
services/user/src/main/java/kr/magicbox/user/adapter/in/web/UserQueryController.java 프로필 조회 Query DTO 사용
services/user/src/main/java/kr/magicbox/user/adapter/in/web/UserCommandController.java 수정/탈퇴를 Command로 전달하도록 변경
services/user/src/main/java/kr/magicbox/user/adapter/in/web/exception/handler/GlobalExceptionHandler.java OptimisticLock 예외 핸들러 제거
services/user/src/main/java/kr/magicbox/user/adapter/in/web/dto/response/GetUserProfileResponse.java response 패키지로 이동 및 import 정리
services/user/src/main/java/kr/magicbox/user/adapter/in/web/dto/request/UpdateUserProfileRequest.java request 패키지로 이동 및 userId 주입 방식 변경
services/user/src/main/java/kr/magicbox/user/adapter/in/web/AdminUserCommandController.java 유저 언밴 API 엔드포인트 추가
services/user/src/main/java/kr/magicbox/user/adapter/in/kafka/AuthEventKafkaListener.java 세션 유즈케이스 호출을 Command로 변경
services/user/src/main/java/kr/magicbox/user/adapter/in/grpc/UserGrpcService.java 활성 여부 체크를 Query DTO로 변경
services/creator/src/main/resources/application-prod.yml creator-prod 환경 설정 신규
services/creator/src/main/resources/application-local.yml local 설정 확장(grpc/kafka/db/security 등)
services/creator/src/main/resources/application-dev.yml creator-dev 환경 설정 신규
services/creator/src/main/java/kr/magicbox/creator/global/exception/SystemError.java 5xx 전용 시스템 예외 추가
services/creator/src/main/java/kr/magicbox/creator/global/exception/BusinessException.java 4xx 전용 비즈니스 예외 추가
services/creator/src/main/java/kr/magicbox/creator/global/exception/BaseException.java creator 공통 예외 베이스 추가
services/creator/src/main/java/kr/magicbox/creator/global/configuration/PropertiesConfiguration.java @ConfigurationPropertiesScan 설정 추가
services/creator/src/main/java/kr/magicbox/creator/domain/vo/UserId.java UserId VO 추가
services/creator/src/main/java/kr/magicbox/creator/domain/vo/Nickname.java Nickname VO 추가 및 정책 검증
services/creator/src/main/java/kr/magicbox/creator/domain/vo/CreatorId.java CreatorId VO 추가
services/creator/src/main/java/kr/magicbox/creator/domain/exception/InvalidFieldException.java 필드 검증 예외 추가
services/creator/src/main/java/kr/magicbox/creator/domain/exception/CreatorNotFoundException.java NotFound 예외 추가
services/creator/src/main/java/kr/magicbox/creator/domain/exception/CreatorNotBannedException.java 언밴 불가 예외 추가
services/creator/src/main/java/kr/magicbox/creator/domain/exception/CreatorAlreadyExistsException.java 중복 생성 예외 추가
services/creator/src/main/java/kr/magicbox/creator/domain/event/CreatorUnbannedEvent.java creator 언밴 이벤트 추가
services/creator/src/main/java/kr/magicbox/creator/domain/event/CreatorRevokedEvent.java creator revoke(탈퇴/제재) 이벤트 추가
services/creator/src/main/java/kr/magicbox/creator/domain/event/CreatorDomainEventType.java creator 도메인 이벤트 타입 정의
services/creator/src/main/java/kr/magicbox/creator/domain/event/CreatorDomainEvent.java creator 도메인 이벤트 인터페이스 추가
services/creator/src/main/java/kr/magicbox/creator/domain/enums/MagicGenre.java 장르 enum 추가
services/creator/src/main/java/kr/magicbox/creator/domain/enums/CreatorStatus.java 상태 enum 추가
services/creator/src/main/java/kr/magicbox/creator/domain/constants/CreatorPolicyConstants.java 정책 상수 추가
services/creator/src/main/java/kr/magicbox/creator/domain/aggregate/Creator.java Creator 애그리게잇 및 상태 전환 로직 추가
services/creator/src/main/java/kr/magicbox/creator/application/service/WithdrawCreatorService.java 탈퇴 처리 + revoke 이벤트 발행
services/creator/src/main/java/kr/magicbox/creator/application/service/UnbanCreatorService.java 언밴 처리 + 언밴 이벤트 발행
services/creator/src/main/java/kr/magicbox/creator/application/service/HandleUserWithdrawnService.java 유저 탈퇴 이벤트 소비 후 creator 삭제 처리
services/creator/src/main/java/kr/magicbox/creator/application/service/HandleUserBannedService.java 유저 밴 이벤트 소비 후 creator 밴 처리
services/creator/src/main/java/kr/magicbox/creator/application/service/BanCreatorService.java 관리자 밴 처리 + revoke 이벤트 발행
services/creator/src/main/java/kr/magicbox/creator/application/port/out/CreatorRepositoryPort.java Creator 저장소 포트 정의
services/creator/src/main/java/kr/magicbox/creator/application/port/out/CreatorDomainEventRepositoryPort.java 도메인 이벤트 저장 포트 정의
services/creator/src/main/java/kr/magicbox/creator/application/port/in/WithdrawCreatorUseCase.java 탈퇴 유즈케이스 정의
services/creator/src/main/java/kr/magicbox/creator/application/port/in/UnbanCreatorUseCase.java 언밴 유즈케이스 정의
services/creator/src/main/java/kr/magicbox/creator/application/port/in/HandleUserWithdrawnUseCase.java 유저 탈퇴 이벤트 핸들러 유즈케이스 정의
services/creator/src/main/java/kr/magicbox/creator/application/port/in/HandleUserBannedUseCase.java 유저 밴 이벤트 핸들러 유즈케이스 정의
services/creator/src/main/java/kr/magicbox/creator/application/port/in/BanCreatorUseCase.java 밴 유즈케이스 정의
services/creator/src/main/java/kr/magicbox/creator/application/dto/command/WithdrawCreatorCommand.java Withdraw command 추가
services/creator/src/main/java/kr/magicbox/creator/application/dto/command/UnbanCreatorCommand.java Unban command 추가
services/creator/src/main/java/kr/magicbox/creator/application/dto/command/HandleUserWithdrawnCommand.java 유저 탈퇴 이벤트 command 추가
services/creator/src/main/java/kr/magicbox/creator/application/dto/command/HandleUserBannedCommand.java 유저 밴 이벤트 command 추가
services/creator/src/main/java/kr/magicbox/creator/application/dto/command/BanCreatorCommand.java Ban command 추가
services/creator/src/main/java/kr/magicbox/creator/adapter/out/persistence/repository/CreatorJpaRepository.java Creator JPA repo 및 락 쿼리 추가
services/creator/src/main/java/kr/magicbox/creator/adapter/out/persistence/repository/CreatorDomainEventRepository.java 도메인 이벤트 JPA repo 추가
services/creator/src/main/java/kr/magicbox/creator/adapter/out/persistence/mapper/CreatorMapper.java 도메인↔엔티티 매퍼 추가
services/creator/src/main/java/kr/magicbox/creator/adapter/out/persistence/entity/CreatorEntity.java Creator 엔티티 및 genre 컬렉션 매핑 추가
services/creator/src/main/java/kr/magicbox/creator/adapter/out/persistence/entity/CreatorDomainEventEntity.java creator 도메인 이벤트 엔티티 추가
services/creator/src/main/java/kr/magicbox/creator/adapter/out/persistence/entity/BaseEntity.java Sonyflake ID + auditing 베이스 엔티티 추가
services/creator/src/main/java/kr/magicbox/creator/adapter/out/persistence/CreatorJpaAdapter.java CreatorRepositoryPort JPA 어댑터 추가
services/creator/src/main/java/kr/magicbox/creator/adapter/out/persistence/CreatorDomainEventAdapter.java 도메인 이벤트 저장 어댑터 추가
services/creator/src/main/java/kr/magicbox/creator/adapter/out/persistence/configuration/JpaConfiguration.java JPA auditing 활성화
services/creator/src/main/java/kr/magicbox/creator/adapter/in/web/exception/handler/GlobalExceptionHandler.java creator 전역 예외 핸들러 추가
services/creator/src/main/java/kr/magicbox/creator/adapter/in/web/exception/handler/ErrorResponse.java 에러 응답 DTO 추가
services/creator/src/main/java/kr/magicbox/creator/adapter/in/web/AdminCreatorCommandController.java creator 밴/언밴 관리자 API 추가
services/creator/src/main/java/kr/magicbox/creator/adapter/in/security/properties/TrustedIpProperties.java 신뢰 IP 설정 바인딩 추가
services/creator/src/main/java/kr/magicbox/creator/adapter/in/security/filter/UserInfoExtractFilter.java X-User-Id 헤더 기반 principal 주입 필터 추가
services/creator/src/main/java/kr/magicbox/creator/adapter/in/security/configuration/SecurityConfiguration.java SecurityFilterChain 구성 추가
services/creator/src/main/java/kr/magicbox/creator/adapter/in/kafka/UserEventKafkaListener.java user-withdrawn/user-banned 이벤트 소비 추가
services/creator/src/main/java/kr/magicbox/creator/adapter/in/kafka/properties/KafkaRetryProperties.java Kafka retry 설정 바인딩 추가
services/creator/src/main/java/kr/magicbox/creator/adapter/in/kafka/KafkaConfiguration.java DLT+재시도 에러 핸들러 구성 추가
services/creator/src/main/java/kr/magicbox/creator/adapter/in/kafka/event/UserWithdrawnEvent.java Kafka 이벤트 DTO 추가
services/creator/src/main/java/kr/magicbox/creator/adapter/in/kafka/event/UserBannedEvent.java Kafka 이벤트 DTO 추가
services/creator/build.gradle creator 모듈 의존성/프로토 설정 추가
services/auth/src/main/java/kr/magicbox/auth/domain/exception/UserInactiveException.java 비활성 사용자 예외 신규 정의
services/auth/src/main/java/kr/magicbox/auth/domain/exception/UserBannedException.java 밴 사용자 예외 신규 정의
services/auth/src/main/java/kr/magicbox/auth/domain/exception/InActiveUserException.java 기존 예외 제거
services/auth/src/main/java/kr/magicbox/auth/application/service/RefreshTokenService.java refresh 입력을 Command로 변경
services/auth/src/main/java/kr/magicbox/auth/application/service/LogoutService.java logout 입력을 Command로 변경 및 예외 교체
services/auth/src/main/java/kr/magicbox/auth/application/service/LoginService.java DTO 패키지 변경 반영
services/auth/src/main/java/kr/magicbox/auth/application/service/HandleUserWithdrawnService.java 유저 탈퇴 이벤트 핸들러 입력을 Command로 변경
services/auth/src/main/java/kr/magicbox/auth/application/service/HandleUserBannedService.java 유저 밴 이벤트 핸들러 입력을 Command로 변경
services/auth/src/main/java/kr/magicbox/auth/application/port/out/UserCredentialPort.java DTO 패키지 변경 반영
services/auth/src/main/java/kr/magicbox/auth/application/port/in/RefreshTokenUseCase.java refresh 입력을 Command로 변경
services/auth/src/main/java/kr/magicbox/auth/application/port/in/LogoutUseCase.java logout 입력을 Command로 변경
services/auth/src/main/java/kr/magicbox/auth/application/port/in/LoginUseCase.java DTO 패키지 변경 반영
services/auth/src/main/java/kr/magicbox/auth/application/port/in/HandleUserWithdrawnUseCase.java 입력을 Command로 변경
services/auth/src/main/java/kr/magicbox/auth/application/port/in/HandleUserBannedUseCase.java 입력을 Command로 변경
services/auth/src/main/java/kr/magicbox/auth/application/dto/result/UserResult.java result 패키지로 이동
services/auth/src/main/java/kr/magicbox/auth/application/dto/result/TokenResult.java result 패키지로 이동
services/auth/src/main/java/kr/magicbox/auth/application/dto/result/IssueTokenResult.java result 패키지로 이동
services/auth/src/main/java/kr/magicbox/auth/application/dto/command/RefreshTokenCommand.java refresh command 추가
services/auth/src/main/java/kr/magicbox/auth/application/dto/command/LogoutCommand.java logout command 추가
services/auth/src/main/java/kr/magicbox/auth/application/dto/command/LoginCommand.java command 패키지로 이동
services/auth/src/main/java/kr/magicbox/auth/application/dto/command/HandleUserWithdrawnCommand.java 이벤트 command 추가
services/auth/src/main/java/kr/magicbox/auth/application/dto/command/HandleUserBannedCommand.java 이벤트 command 추가
services/auth/src/main/java/kr/magicbox/auth/adapter/out/communication/grpc/UserGrpcAdapter.java DTO 패키지 변경 반영
services/auth/src/main/java/kr/magicbox/auth/adapter/in/web/dto/response/AccessTokenResponse.java response 패키지로 이동
services/auth/src/main/java/kr/magicbox/auth/adapter/in/web/dto/request/LoginRequest.java request 패키지로 이동
services/auth/src/main/java/kr/magicbox/auth/adapter/in/web/AuthCommandController.java refresh/logout를 Command 기반으로 변경
services/auth/src/main/java/kr/magicbox/auth/adapter/in/security/oauth2/OAuth2LoginSuccessHandler.java DTO 패키지 변경 반영
services/auth/src/main/java/kr/magicbox/auth/adapter/in/kafka/UserEventKafkaListener.java 이벤트 핸들러 호출을 Command 기반으로 변경
.github/workflows/sonarcloud-analyze.yml SonarCloud 분석 시 Java binaries 설정 추가 및 classes 컴파일 단계 추가

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +40 to +46
Long userIdLong = Long.valueOf(userIdRequestHeader);
UserId userId = UserId.of(userIdLong);
log.info(String.valueOf(userId));

UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(userId, null);
SecurityContextHolder.getContext().setAuthentication(authenticationToken);

Copy link

Copilot AI Apr 6, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

요청마다 userId를 INFO로 로깅하면 개인정보 로그 축적 및 로그 볼륨 증가로 운영 리스크가 있습니다. 필요하다면 DEBUG로 낮추거나, 감사 목적이면 마스킹/샘플링 등으로 노출을 줄이는 방식으로 변경하는 것을 권장합니다.

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

넵 지우겠습니다.

lian2945 and others added 3 commits April 6, 2026 22:39
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
lian2945 and others added 4 commits April 6, 2026 22:52
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@sonarqubecloud
Copy link
Copy Markdown

sonarqubecloud bot commented Apr 7, 2026

@lian2945 lian2945 requested a review from f-lab-ted April 8, 2026 02:55
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.

2 participants