Skip to content

[REFACTOR] #485 어플리케이션 레이어의 검증 메서드들의 책임을 도메인으로 위임#485

Merged
huncozyboy merged 15 commits intodevfrom
refactor/#484
Mar 11, 2026
Merged

[REFACTOR] #485 어플리케이션 레이어의 검증 메서드들의 책임을 도메인으로 위임#485
huncozyboy merged 15 commits intodevfrom
refactor/#484

Conversation

@huncozyboy
Copy link
Member

@huncozyboy huncozyboy commented Mar 11, 2026

Related issue 🛠

작업 내용 💻

이번 작업 목표 : usecase 비대화 해소를 위해 책임 위임
고민한점 : usecase에 과중되어 있던 로직들 중에, 위임하는 책임을 모두 domain에 두는 게 맞을지

  1. 기존 과도한 유스케이스의 책임중에, 도메인으로 위임할 수 있는 검증 로직들 위임
  • usecase에 흩어져 있던 도메인 상태 검증/상태 전이 로직 일부를 엔티티로 위임
  • Campaign이 참여 가능 여부, 관리자 승인 가능 여부, 수정 가능 여부, 승인 정원 초과 여부 도메인에서 검증하도록 수정
  • CampaignReview가 리뷰 수정 요청 가능 상태를 도메인에서 검증하도록 수정
  • User, Creator가 역할, SNS 연결 여부를 도메인으로 위임
  1. DTO/command 입력 조합 검증 책임은 유스케이스에서 분리 후 별도 클래스로 분리
  • CreatorCampaign 참여 상태 계산 로직은 별도 계산 객체인 CreatorCampaignStatusResolver로 분리
  • 기존 CampaignReviewValidationPolicy는 제거하고, DTO/command 입력 조합 검증 책임은 campaignReview/application/service/CampaignReviewValidationService로 이동

같이 얘기해보고 싶은 내용이 있다면 작성 📢

  • 도메인 상태 + 불변식 + 상태 전이처럼 엔티티가 스스로 알아야 하는 규칙은 domain으로 위임하는 쪽이 자연스럽다고 판단했습니다.
  • 하지만 CampaignReviewValidationPolicy가 맡고 있던 검증은 aggregate 상태 전이라기보다 DTO/command 입력 검증에 더 가까워서, 이 책임까지 모두 domain으로 올리는 건 과하다고 판단했습니다.
  • 그래서 해당 책임은 campaignReview/application/serviceCampaignReviewValidationService로 두는 쪽으로 두었습니다.
  • 아직 CampaignReviewUsecase 내부에 일부 MediaValidationUtil 직접 호출이 남아 있어서, 리뷰 업로드 검증 책임을 CampaignReviewValidationService로 분리할지 여부는 같이 얘기해보면 좋을거같아요

추후 작업할 내용

  • 추가로, 현재 CampaignReviewUsecase 내부에 일부 MediaValidationUtil 직접 호출이 남아 있어서, 리뷰 업로드 검증 책임을 CampaignReviewValidationService로 분리할지 여부는 같이 얘기해보면 좋을거같아요

Summary by CodeRabbit

릴리스 노트

  • 리팩토링

    • 캠페인 상태·승인 흐름 간소화로 관리·승인 처리 일관성 향상
    • 참여 검증 흐름 통합으로 참가 조건 검사 간결화
    • 사용자 역할·SNS 연결 확인 로직을 엔티티 수준에서 단순화
  • 버그 픽스

    • 리뷰 수정 요청은 제출된 리뷰에 대해서만 허용되도록 검증 강화
  • 테스트

    • 단위테스트 설정 완화로 안정적인 테스트 실행 보장

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Mar 11, 2026

Walkthrough

검증 책임을 애플리케이션 계층에서 도메인으로 위임하는 리팩토링이 적용되었습니다. 캠페인 리뷰 검증 유틸 삭제 후 검증 로직은 새로운 서비스 및 도메인 엔티티(Contributor/Creator/Campaign/CampaignReview)에 분산되었습니다.

Changes

Cohort / File(s) Summary
Validation util removed
src/main/java/com/lokoko/domain/campaignReview/application/utils/CampaignReviewValidationUtil.java
기존 캠페인 리뷰 검증 유틸 클래스 삭제(1차/2차 검증, 미디어 합계 등 정적 메서드 제거).
New validation service / wiring
src/main/java/com/lokoko/domain/campaignReview/application/service/CampaignReviewValidationService.java, src/main/java/com/lokoko/domain/campaignReview/application/usecase/CampaignReviewUsecase.java
검증 유틸을 대체하는 Spring 서비스 추가 및 Usecase에 주입해 기존 호출을 서비스로 대체.
Campaign domain overhaul
src/main/java/com/lokoko/domain/campaign/domain/entity/Campaign.java, src/main/java/com/lokoko/domain/campaign/application/service/CampaignService.java, src/main/java/com/lokoko/domain/user/application/service/AdminCampaignUpdateService.java
Campaign 엔티티 대대적 구현(생명주기·검증·업데이트 로직 추가). 서비스들에서 도메인 검증/승인 호출로 대체(validateEditable, validateCapacityForApproval, approveByAdmin 등).
Creator / User domain assertions
src/main/java/com/lokoko/domain/creator/domain/entity/Creator.java, src/main/java/com/lokoko/domain/user/domain/entity/User.java, src/main/java/com/lokoko/domain/creator/application/service/CreatorUsecase.java
Creator에 SNS 연결 검사(hasConnectedSns/assertHasConnectedSns) 추가, User에 역할 검증(hasRole/assertRole) 추가 및 호출부에서 도메인 어설션 사용으로 전환.
Status resolution refactor
src/main/java/com/lokoko/domain/campaignReview/application/service/CreatorCampaignStatusResolver.java, src/main/java/com/lokoko/domain/campaignReview/application/service/CreatorCampaignUpdateService.java
참여 상태 결정 로직을 별도 서비스로 분리(CreatorCampaignStatusResolver)하고 기존 서비스에서 위임하도록 변경.
CampaignReview domain validation
src/main/java/com/lokoko/domain/campaignReview/domain/entity/CampaignReview.java, src/main/java/com/lokoko/domain/campaignReview/application/service/CampaignReviewUpdateService.java
리비전 요청 가능성 검사(SUBMITTED 상태) 도메인으로 이동 및 일부 검증 제거/추가.
CreatorCampaign usecase simplification
src/main/java/com/lokoko/domain/creatorCampaign/application/usecase/CreatorCampaignUsecase.java
여러 개별 예외 검증을 campaign.validateParticipatableAt(now) 호출로 중앙화.
Tests / config tweak
src/test/java/com/lokoko/domain/brand/BrandApplicantManagementTest.java
Mockito strictness를 LENIENT로 변경 및 brand.getId() 스텁 추가.
Misc imports & refactors
multiple files (...)
여러 서비스에서 직접적인 상태·예외 검사 제거 후 도메인 어설션/메서드로 대체(임포트·에러 처리 간소화).

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

Suggested labels

🔨 Refactor

Suggested reviewers

  • hyoeunjoo
  • unrookie21

Poem

🐰 검증은 도메인 품에 안겼네
작은 책임들 제자리로 돌아가고
Usecase는 가벼운 발걸음만 남기네
당근 하나로 리팩토링 축하드려요 🥕✨

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 25.49% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed 제목이 PR의 주요 변경사항(어플리케이션 레이어의 검증 책임을 도메인으로 위임)을 명확하게 요약하고 있습니다.
Linked Issues check ✅ Passed PR의 모든 변경사항들이 링크된 이슈 #484의 목표를 충족합니다: 도메인 엔티티에 검증 책임 위임, 애플리케이션 레이어의 책임 감소, 유스케이스 계층의 오케스트레이션 역할 중심화.
Out of Scope Changes check ✅ Passed 모든 변경사항이 검증 로직의 도메인 계층으로의 책임 위임이라는 범위 내에 있으며, 범위 외 변경은 발견되지 않습니다.
Description check ✅ Passed PR description는 필수 섹션을 완벽하게 포함하며, 작업 내용, 고민한 점, 향후 계획이 상세히 설명되어 있습니다.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ 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
  • Commit unit tests in branch refactor/#484

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.

coderabbitai[bot]

This comment was marked as resolved.

@huncozyboy huncozyboy changed the title Refactor #485 어플리케이션 레이어의 검증 메서드들의 책임을 도메인으로 위임 [REFACTOR] #485 어플리케이션 레이어의 검증 메서드들의 책임을 도메인으로 위임 Mar 11, 2026
coderabbitai[bot]

This comment was marked as duplicate.

@LO-CO-CO LO-CO-CO deleted a comment from coderabbitai bot Mar 11, 2026
@LO-CO-CO LO-CO-CO deleted a comment from coderabbitai bot Mar 11, 2026
@LO-CO-CO LO-CO-CO deleted a comment from coderabbitai bot Mar 11, 2026
@LO-CO-CO LO-CO-CO deleted a comment from coderabbitai bot Mar 11, 2026
@LO-CO-CO LO-CO-CO deleted a comment from coderabbitai bot Mar 11, 2026
@LO-CO-CO LO-CO-CO deleted a comment from coderabbitai bot Mar 11, 2026
@huncozyboy huncozyboy added 🔨 Refactor 코드 수정 ✨ Feature 기능 개발(추가) labels Mar 11, 2026
@huncozyboy huncozyboy added the ✨ Feature 기능 개발(추가) label Mar 11, 2026
@huncozyboy huncozyboy merged commit 7eaa309 into dev Mar 11, 2026
2 of 3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

✨ Feature 기능 개발(추가) 🔨 Refactor 코드 수정

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[REFACTOR] 어플리케이션 레이어의 검증 메서드들의 책임을 도메인으로 위임

1 participant