Skip to content

[WTH-159] user 도메인 마이그레이션#14

Merged
hyxklee merged 14 commits intodevfrom
refactor/WTH-159-user-도메인-마이그레이션
Feb 27, 2026

Hidden character warning

The head ref may contain hidden characters: "refactor/WTH-159-user-\ub3c4\uba54\uc778-\ub9c8\uc774\uadf8\ub808\uc774\uc158"
Merged

[WTH-159] user 도메인 마이그레이션#14
hyxklee merged 14 commits intodevfrom
refactor/WTH-159-user-도메인-마이그레이션

Conversation

@hyxklee
Copy link
Contributor

@hyxklee hyxklee commented Feb 20, 2026

📌 Summary

어떤 작업인지 한 줄 요약해 주세요.

유저 도메인 마이그레이션을 진행했습니다.

📝 Changes

변경사항을 what, why, how로 구분해 작성해 주세요.

What

  • 유저 도메인 마이그레이션
  • 변경 전파

Why

  • 유지보수 용이를 위해

How

  • OneToMany 제거, 미사용 enum 제거
  • 소셜 로그인 용이성을 위한 테이블 분리
  • 미사용 API 및 코드 제거

📸 Screenshots / Logs

필요시 스크린샷 or 로그를 첨부해주세요.

💡 Reviewer 참고사항

리뷰에 참고할 내용을 작성해주세요.

  • 유저 도메인 정말 크네요.. 우선 마이그레이션 중점적으로 봐주시고, board와 마찬가지로 후에 리팩토링 한 번 들어가야할 것 같습니당
  • 스케줄 쪽에 일부 코드 수정이 있었습니다.. 큰 충돌은 아닐 것 같긴 한데 한 번 확인 해주세욥..!
  • todo 주석을 남겨둔 부분은 후에 손을 다시 봐야할 것 같아요. 소셜 로그인, 다음 기수로 넘기기 등등 맘에 안드는 부분들이 좀 있는데 시간이 없어서.. 마이그레이션 완료 후에 최우선으로 리팩토링 진행 하겠습니다!
  • 감사드립니다..

✅ Checklist

  • PR 제목 설정 완료 (WTH-123 인증 필터 설정)
  • 테스트 구현 완료
  • 리뷰어 등록 완료
  • 자체 코드 리뷰 완료

@hyxklee hyxklee requested a review from soo0711 February 20, 2026 09:38
@hyxklee hyxklee self-assigned this Feb 20, 2026
@hyxklee hyxklee added the 🔨 Refactor 코드 구조 개선 및 리팩토링 label Feb 20, 2026
@coderabbitai
Copy link

coderabbitai bot commented Feb 20, 2026

Important

Review skipped

Too many files!

This PR contains 171 files, which is 21 over the limit of 150.

📥 Commits

Reviewing files that changed from the base of the PR and between 8c80d06 and 532d250.

📒 Files selected for processing (171)
  • src/main/java/com/weeth/domain/schedule/application/usecase/EventUseCaseImpl.java
  • src/main/java/com/weeth/domain/schedule/application/usecase/MeetingUseCaseImpl.java
  • src/main/java/com/weeth/domain/schedule/application/usecase/ScheduleUseCaseImpl.java
  • src/main/java/com/weeth/domain/schedule/domain/repository/MeetingRepository.java
  • src/main/java/com/weeth/domain/schedule/domain/service/MeetingGetService.java
  • src/main/java/com/weeth/domain/user/application/dto/request/CardinalSaveRequest.java
  • src/main/java/com/weeth/domain/user/application/dto/request/CardinalUpdateRequest.java
  • src/main/java/com/weeth/domain/user/application/dto/request/UserRequestDto.java
  • src/main/java/com/weeth/domain/user/application/dto/response/CardinalResponse.java
  • src/main/java/com/weeth/domain/user/application/dto/response/UserCardinalDto.java
  • src/main/java/com/weeth/domain/user/application/dto/response/UserResponseDto.java
  • src/main/java/com/weeth/domain/user/application/exception/CardinalNotFoundException.java
  • src/main/java/com/weeth/domain/user/application/exception/DepartmentNotFoundException.java
  • src/main/java/com/weeth/domain/user/application/exception/DuplicateCardinalException.java
  • src/main/java/com/weeth/domain/user/application/exception/EmailNotFoundException.java
  • src/main/java/com/weeth/domain/user/application/exception/InvalidUserOrderException.java
  • src/main/java/com/weeth/domain/user/application/exception/PasswordMismatchException.java
  • src/main/java/com/weeth/domain/user/application/exception/RoleNotFoundException.java
  • src/main/java/com/weeth/domain/user/application/exception/StatusNotFoundException.java
  • src/main/java/com/weeth/domain/user/application/exception/StudentIdExistsException.java
  • src/main/java/com/weeth/domain/user/application/exception/TelExistsException.java
  • src/main/java/com/weeth/domain/user/application/exception/UserCardinalNotFoundException.java
  • src/main/java/com/weeth/domain/user/application/exception/UserExistsException.java
  • src/main/java/com/weeth/domain/user/application/exception/UserInActiveException.java
  • src/main/java/com/weeth/domain/user/application/exception/UserMismatchException.java
  • src/main/java/com/weeth/domain/user/application/exception/UserNotFoundException.java
  • src/main/java/com/weeth/domain/user/application/exception/UserNotMatchException.java
  • src/main/java/com/weeth/domain/user/application/mapper/CardinalMapper.java
  • src/main/java/com/weeth/domain/user/application/mapper/UserMapper.java
  • src/main/java/com/weeth/domain/user/application/usecase/CardinalUseCase.java
  • src/main/java/com/weeth/domain/user/application/usecase/UserManageUseCase.java
  • src/main/java/com/weeth/domain/user/application/usecase/UserManageUseCaseImpl.java
  • src/main/java/com/weeth/domain/user/application/usecase/UserUseCase.java
  • src/main/java/com/weeth/domain/user/application/usecase/UserUseCaseImpl.java
  • src/main/java/com/weeth/domain/user/domain/entity/Cardinal.java
  • src/main/java/com/weeth/domain/user/domain/entity/SecurityUser.java
  • src/main/java/com/weeth/domain/user/domain/entity/User.java
  • src/main/java/com/weeth/domain/user/domain/entity/UserCardinal.java
  • src/main/java/com/weeth/domain/user/domain/entity/enums/CardinalStatus.java
  • src/main/java/com/weeth/domain/user/domain/entity/enums/Department.java
  • src/main/java/com/weeth/domain/user/domain/entity/enums/LoginStatus.java
  • src/main/java/com/weeth/domain/user/domain/entity/enums/Position.java
  • src/main/java/com/weeth/domain/user/domain/entity/enums/Role.java
  • src/main/java/com/weeth/domain/user/domain/entity/enums/Status.java
  • src/main/java/com/weeth/domain/user/domain/entity/enums/StatusPriority.java
  • src/main/java/com/weeth/domain/user/domain/entity/enums/UsersOrderBy.java
  • src/main/java/com/weeth/domain/user/domain/repository/CardinalRepository.java
  • src/main/java/com/weeth/domain/user/domain/repository/UserCardinalRepository.java
  • src/main/java/com/weeth/domain/user/domain/repository/UserRepository.java
  • src/main/java/com/weeth/domain/user/domain/service/CardinalGetService.java
  • src/main/java/com/weeth/domain/user/domain/service/CardinalSaveService.java
  • src/main/java/com/weeth/domain/user/domain/service/UserCardinalGetService.java
  • src/main/java/com/weeth/domain/user/domain/service/UserCardinalSaveService.java
  • src/main/java/com/weeth/domain/user/domain/service/UserDeleteService.java
  • src/main/java/com/weeth/domain/user/domain/service/UserGetService.java
  • src/main/java/com/weeth/domain/user/domain/service/UserSaveService.java
  • src/main/java/com/weeth/domain/user/domain/service/UserUpdateService.java
  • src/main/java/com/weeth/domain/user/presentation/CardinalController.java
  • src/main/java/com/weeth/domain/user/presentation/UserAdminController.java
  • src/main/java/com/weeth/domain/user/presentation/UserController.java
  • src/main/java/com/weeth/domain/user/presentation/UserResponseCode.java
  • src/main/kotlin/com/weeth/domain/account/application/usecase/command/ManageAccountUseCase.kt
  • src/main/kotlin/com/weeth/domain/account/application/usecase/command/ManageReceiptUseCase.kt
  • src/main/kotlin/com/weeth/domain/attendance/application/dto/response/AttendanceInfoResponse.kt
  • src/main/kotlin/com/weeth/domain/attendance/application/mapper/AttendanceMapper.kt
  • src/main/kotlin/com/weeth/domain/attendance/application/usecase/command/CheckInAttendanceUseCase.kt
  • src/main/kotlin/com/weeth/domain/attendance/application/usecase/query/GetAttendanceQueryService.kt
  • src/main/kotlin/com/weeth/domain/attendance/domain/service/AttendanceSaveService.kt
  • src/main/kotlin/com/weeth/domain/board/application/usecase/command/ManagePostUseCase.kt
  • src/main/kotlin/com/weeth/domain/comment/application/dto/response/CommentResponse.kt
  • src/main/kotlin/com/weeth/domain/comment/application/mapper/CommentMapper.kt
  • src/main/kotlin/com/weeth/domain/comment/application/usecase/command/ManageCommentUseCase.kt
  • src/main/kotlin/com/weeth/domain/penalty/application/usecase/command/SavePenaltyUseCase.kt
  • src/main/kotlin/com/weeth/domain/penalty/application/usecase/query/GetPenaltyQueryService.kt
  • src/main/kotlin/com/weeth/domain/user/application/dto/request/CardinalSaveRequest.kt
  • src/main/kotlin/com/weeth/domain/user/application/dto/request/CardinalUpdateRequest.kt
  • src/main/kotlin/com/weeth/domain/user/application/dto/request/SignUpRequest.kt
  • src/main/kotlin/com/weeth/domain/user/application/dto/request/SocialLoginRequest.kt
  • src/main/kotlin/com/weeth/domain/user/application/dto/request/UpdateUserProfileRequest.kt
  • src/main/kotlin/com/weeth/domain/user/application/dto/request/UserApplyObRequest.kt
  • src/main/kotlin/com/weeth/domain/user/application/dto/request/UserIdsRequest.kt
  • src/main/kotlin/com/weeth/domain/user/application/dto/request/UserRoleUpdateRequest.kt
  • src/main/kotlin/com/weeth/domain/user/application/dto/response/AdminUserResponse.kt
  • src/main/kotlin/com/weeth/domain/user/application/dto/response/CardinalResponse.kt
  • src/main/kotlin/com/weeth/domain/user/application/dto/response/SocialLoginResponse.kt
  • src/main/kotlin/com/weeth/domain/user/application/dto/response/UserDetailsResponse.kt
  • src/main/kotlin/com/weeth/domain/user/application/dto/response/UserInfoResponse.kt
  • src/main/kotlin/com/weeth/domain/user/application/dto/response/UserProfileResponse.kt
  • src/main/kotlin/com/weeth/domain/user/application/dto/response/UserSummaryResponse.kt
  • src/main/kotlin/com/weeth/domain/user/application/exception/CardinalNotFoundException.kt
  • src/main/kotlin/com/weeth/domain/user/application/exception/DuplicateCardinalException.kt
  • src/main/kotlin/com/weeth/domain/user/application/exception/EmailNotFoundException.kt
  • src/main/kotlin/com/weeth/domain/user/application/exception/InvalidUserOrderException.kt
  • src/main/kotlin/com/weeth/domain/user/application/exception/PasswordMismatchException.kt
  • src/main/kotlin/com/weeth/domain/user/application/exception/RoleNotFoundException.kt
  • src/main/kotlin/com/weeth/domain/user/application/exception/StatusNotFoundException.kt
  • src/main/kotlin/com/weeth/domain/user/application/exception/StudentIdExistsException.kt
  • src/main/kotlin/com/weeth/domain/user/application/exception/TelExistsException.kt
  • src/main/kotlin/com/weeth/domain/user/application/exception/UserCardinalNotFoundException.kt
  • src/main/kotlin/com/weeth/domain/user/application/exception/UserErrorCode.kt
  • src/main/kotlin/com/weeth/domain/user/application/exception/UserExistsException.kt
  • src/main/kotlin/com/weeth/domain/user/application/exception/UserInActiveException.kt
  • src/main/kotlin/com/weeth/domain/user/application/exception/UserMismatchException.kt
  • src/main/kotlin/com/weeth/domain/user/application/exception/UserNotFoundException.kt
  • src/main/kotlin/com/weeth/domain/user/application/exception/UserNotMatchException.kt
  • src/main/kotlin/com/weeth/domain/user/application/mapper/CardinalMapper.kt
  • src/main/kotlin/com/weeth/domain/user/application/mapper/UserMapper.kt
  • src/main/kotlin/com/weeth/domain/user/application/usecase/command/AdminUserUseCase.kt
  • src/main/kotlin/com/weeth/domain/user/application/usecase/command/AuthUserUseCase.kt
  • src/main/kotlin/com/weeth/domain/user/application/usecase/command/ManageCardinalUseCase.kt
  • src/main/kotlin/com/weeth/domain/user/application/usecase/query/GetCardinalQueryService.kt
  • src/main/kotlin/com/weeth/domain/user/application/usecase/query/GetUserQueryService.kt
  • src/main/kotlin/com/weeth/domain/user/domain/converter/EmailConverter.kt
  • src/main/kotlin/com/weeth/domain/user/domain/converter/PhoneNumberConverter.kt
  • src/main/kotlin/com/weeth/domain/user/domain/entity/Cardinal.kt
  • src/main/kotlin/com/weeth/domain/user/domain/entity/User.kt
  • src/main/kotlin/com/weeth/domain/user/domain/entity/UserCardinal.kt
  • src/main/kotlin/com/weeth/domain/user/domain/entity/UserSocialAccount.kt
  • src/main/kotlin/com/weeth/domain/user/domain/entity/enums/CardinalStatus.kt
  • src/main/kotlin/com/weeth/domain/user/domain/entity/enums/Role.kt
  • src/main/kotlin/com/weeth/domain/user/domain/entity/enums/SocialProvider.kt
  • src/main/kotlin/com/weeth/domain/user/domain/entity/enums/Status.kt
  • src/main/kotlin/com/weeth/domain/user/domain/entity/enums/StatusPriority.kt
  • src/main/kotlin/com/weeth/domain/user/domain/entity/enums/UsersOrderBy.kt
  • src/main/kotlin/com/weeth/domain/user/domain/repository/CardinalReader.kt
  • src/main/kotlin/com/weeth/domain/user/domain/repository/CardinalRepository.kt
  • src/main/kotlin/com/weeth/domain/user/domain/repository/UserCardinalReader.kt
  • src/main/kotlin/com/weeth/domain/user/domain/repository/UserCardinalRepository.kt
  • src/main/kotlin/com/weeth/domain/user/domain/repository/UserReader.kt
  • src/main/kotlin/com/weeth/domain/user/domain/repository/UserRepository.kt
  • src/main/kotlin/com/weeth/domain/user/domain/repository/UserSocialAccountRepository.kt
  • src/main/kotlin/com/weeth/domain/user/domain/service/UserCardinalPolicy.kt
  • src/main/kotlin/com/weeth/domain/user/domain/vo/AttendanceStats.kt
  • src/main/kotlin/com/weeth/domain/user/domain/vo/Email.kt
  • src/main/kotlin/com/weeth/domain/user/domain/vo/PhoneNumber.kt
  • src/main/kotlin/com/weeth/domain/user/presentation/CardinalController.kt
  • src/main/kotlin/com/weeth/domain/user/presentation/UserAdminController.kt
  • src/main/kotlin/com/weeth/domain/user/presentation/UserController.kt
  • src/main/kotlin/com/weeth/domain/user/presentation/UserResponseCode.kt
  • src/main/kotlin/com/weeth/global/auth/apple/AppleAuthService.kt
  • src/main/kotlin/com/weeth/global/auth/apple/dto/AppleUserInfo.kt
  • src/main/kotlin/com/weeth/global/auth/kakao/dto/KakaoAccount.kt
  • src/main/kotlin/com/weeth/global/auth/kakao/dto/KakaoProfile.kt
  • src/main/kotlin/com/weeth/global/config/SecurityConfig.kt
  • src/test/kotlin/com/weeth/domain/account/application/usecase/command/ManageAccountUseCaseTest.kt
  • src/test/kotlin/com/weeth/domain/account/application/usecase/command/ManageReceiptUseCaseTest.kt
  • src/test/kotlin/com/weeth/domain/attendance/application/mapper/AttendanceMapperTest.kt
  • src/test/kotlin/com/weeth/domain/attendance/application/usecase/command/CheckInAttendanceUseCaseTest.kt
  • src/test/kotlin/com/weeth/domain/attendance/application/usecase/query/GetAttendanceQueryServiceTest.kt
  • src/test/kotlin/com/weeth/domain/attendance/domain/repository/AttendanceRepositoryTest.kt
  • src/test/kotlin/com/weeth/domain/attendance/domain/service/AttendanceSaveServiceTest.kt
  • src/test/kotlin/com/weeth/domain/attendance/fixture/AttendanceTestFixture.kt
  • src/test/kotlin/com/weeth/domain/board/application/mapper/PostMapperTest.kt
  • src/test/kotlin/com/weeth/domain/board/application/usecase/command/ManagePostUseCaseTest.kt
  • src/test/kotlin/com/weeth/domain/comment/application/usecase/command/CommentConcurrencyTest.kt
  • src/test/kotlin/com/weeth/domain/comment/application/usecase/command/ManageCommentUseCaseTest.kt
  • src/test/kotlin/com/weeth/domain/comment/application/usecase/query/CommentQueryPerformanceTest.kt
  • src/test/kotlin/com/weeth/domain/comment/application/usecase/query/GetCommentQueryServiceTest.kt
  • src/test/kotlin/com/weeth/domain/user/application/usecase/UserManageUseCaseTest.kt
  • src/test/kotlin/com/weeth/domain/user/application/usecase/command/AdminUserUseCaseTest.kt
  • src/test/kotlin/com/weeth/domain/user/application/usecase/command/AuthUserUseCaseTest.kt
  • src/test/kotlin/com/weeth/domain/user/application/usecase/command/CardinalUseCaseTest.kt
  • src/test/kotlin/com/weeth/domain/user/application/usecase/query/GetUserQueryServiceTest.kt
  • src/test/kotlin/com/weeth/domain/user/domain/entity/CardinalTest.kt
  • src/test/kotlin/com/weeth/domain/user/domain/entity/UserTest.kt
  • src/test/kotlin/com/weeth/domain/user/domain/service/CardinalGetServiceTest.kt
  • src/test/kotlin/com/weeth/domain/user/domain/service/UserCardinalGetServiceTest.kt
  • src/test/kotlin/com/weeth/domain/user/domain/service/UserCardinalPolicyTest.kt
  • src/test/kotlin/com/weeth/domain/user/domain/service/UserGetServiceTest.kt
  • src/test/kotlin/com/weeth/domain/user/fixture/CardinalTestFixture.kt
  • src/test/kotlin/com/weeth/domain/user/fixture/UserTestFixture.kt

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch refactor/WTH-159-user-도메인-마이그레이션

Tip

Try Coding Plans. Let us write the prompt for your AI agent so you can ship faster (with fewer bugs).
Share your feedback on Discord.


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

Copy link
Collaborator

@soo0711 soo0711 left a comment

Choose a reason for hiding this comment

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

수고하셨습니다!! 마이그레이션과 테스트 위주로 보았슴니당
아래에 피드백 남겨뒀으니 확인 부탁드립니다!! 👍 👍

Comment on lines +45 to +46
var penaltyCount: Int = 0,
var warningCount: Int = 0, // todo: 경고시 자동 페널티 기능도 제거
Copy link
Collaborator

Choose a reason for hiding this comment

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

자동페널티 기능은 Leets가 적용하던 기능이기 때문에 제거하는건가용?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

넵넵 맞습니당 해당 기능은 리츠의 요구사항이었으니 우선은 제거했서용

Comment on lines +6 to +7
fun getByCardinalNumber(cardinalNumber: Int): Cardinal

Copy link
Collaborator

Choose a reason for hiding this comment

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

port 인터페이스에서는 JPA 네이밍과의 일관성을 위해 get보다 find를 사용하는 것이 어떨까요?!!

Copy link
Contributor Author

Choose a reason for hiding this comment

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

타 도메인들에서는 대부분 Reader에서 list를 받고 있어서 이런 차이가 없었는데, 유저 도메인의 경우는 개별 조회가 들어가다 보니 get: 없으면 예외, find: 그냥 반환 이렇게 구분을 해주는건 어떨까요??

Copy link
Collaborator

Choose a reason for hiding this comment

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

넵 좋습니다!!

Comment on lines 13 to 18
fun getCurrentCardinal(user: User): Cardinal =
userCardinalReader
.findAllByUser(user)
.maxByOrNull { it.cardinal.cardinalNumber }
?.cardinal
?: throw CardinalNotFoundException()
Copy link
Collaborator

Choose a reason for hiding this comment

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

현재 구현은 전체 조회 후 max를 계산하고 있는데 최신 기수 조회라는 의도를 고려하면 DB에서 정렬 후 1건만 조회하는 방식으로도 구현 가능할 것 같습니다! 해당 방식은 어떨까요?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

좋습니당! 쿼리 복잡도랑 성능 한 번 확인해서 리팩토링 해볼게욥

Copy link
Contributor Author

Choose a reason for hiding this comment

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

쿼리가 그렇게 복잡하게 나오지 않고, 단건 조회부터 대량 반복 조회까지 모두 DB 정렬이 빨라서 그렇게 리팩토링 했습니다!

Comment on lines 126 to 132
@DeleteMapping
@Operation(summary = "동아리 탈퇴")
fun leave(
@Parameter(hidden = true) @CurrentUser userId: Long,
): CommonResponse<Void> {
adminUserUseCase.leave(userId)
return CommonResponse.success(UserResponseCode.USER_LEAVE_SUCCESS)
Copy link
Collaborator

Choose a reason for hiding this comment

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

탈퇴는 사용자 본인의 행위로 보이는데 AdminUserUseCase에서 처리하기보다 User 쪽 UseCase로 이동하는 것이 더 자연스럽지 않을까염?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

그러네요.. 옮기겠습니다

Copy link
Contributor Author

Choose a reason for hiding this comment

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

우선 AuthUserUseCase로 이전하고, 리팩토링 할 때 유스케이스 하나 더 분리해서 옮겨둘게요!

Comment on lines +31 to +32
@Service
class AuthUserUseCase(
Copy link
Collaborator

Choose a reason for hiding this comment

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

현재 UseCase가 인증, 회원 생성, 프로필 수정 등 여러 책임을 함께 가지고 있어서 추후 리팩토링 시점에 역할을 분리해도 좋을 것 같습니다!!

Comment on lines 93 to 100
it("회원 추방 시 상태를 BANNED로 변경한다") {
val user = UserTestFixture.createActiveUser1(1L)
every { userReader.findAllByIds(listOf(1L)) } returns listOf(user)

useCase.ban(UserIdsRequest(listOf(1L)))

user.isInactive() shouldBe true
}
Copy link
Collaborator

Choose a reason for hiding this comment

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

여기도 마찬가지로요!

Comment on lines 119 to 120
verify(exactly = 1) { attendanceSaveService.init(user, meetings) }
verify(exactly = 1) { userCardinalRepository.save(any()) }
Copy link
Collaborator

Choose a reason for hiding this comment

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

현재는 save(any())로 호출 여부만 확인하고 있어서 기대한 user와 cardinal로 저장됐는지도 검증하면 테스트가 더 명확해질 것 같습니당

Comment on lines 162 to 164
verify(exactly = 1) { cardinalRepository.save(any()) }
verify(exactly = 1) { attendanceSaveService.init(user, meetings) }
verify(exactly = 1) { userCardinalRepository.save(any()) }
Copy link
Collaborator

Choose a reason for hiding this comment

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

여기도! 기대한 기수로 저장되었는지까지 검증하면 좋을 것 같아요 !!

Comment on lines 12 to 19
user.accept()
user.isInactive() shouldBe false

user.ban()
user.isInactive() shouldBe true

user.leave()
user.isInactive() shouldBe true
Copy link
Collaborator

Choose a reason for hiding this comment

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

여기도 true말고 정확한 상태를 검증하는 방향으로 바꾸는 게 어떨까요?!

Comment on lines 22 to 30
"attendance 카운터 및 출석률 계산" {
val user = User(name = "test", email = "test@test.com", studentId = "20200001")
user.attend()
user.attend()
user.absent()

user.attendanceCount shouldBe 2
user.absenceCount shouldBe 1
user.attendanceRate shouldBe 66
Copy link
Collaborator

Choose a reason for hiding this comment

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

66이라는 값이 조금 뜬금없이 느껴질 수 있을 것 같아서 계산식을 명시해 검증하면 더 좋을 것 같습니당

@soo0711
Copy link
Collaborator

soo0711 commented Feb 23, 2026

아! 스케줄쪽 수정은 UseCaseImpl로 마이그레이션하면서 다 삭제해서 큰 충돌은 아닐 것 같습니당

@hyxklee hyxklee merged commit b1bd576 into dev Feb 27, 2026
2 checks passed
@hyxklee hyxklee deleted the refactor/WTH-159-user-도메인-마이그레이션 branch February 27, 2026 05:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🔨 Refactor 코드 구조 개선 및 리팩토링

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants