Conversation
There was a problem hiding this comment.
Code Review
This pull request introduces the MLSAuthFeature module, implementing a complete authentication system including social login, terms agreement, and onboarding flows. The changes cover data, domain, and presentation layers using ReactorKit, supported by unit tests and an example app. Feedback focuses on maintaining unidirectional data flow by removing side effects from Reactors, improving layout robustness for multi-window environments, and optimizing performance through the reuse of expensive objects like DateFormatter. Additionally, suggestions were made to enhance the reliability of window detection and social login timing logic.
|
전반적으로 SPM 패키지 분리가 잘 이루어진 것 같고 Interface 타깃에 Entity, Error, Repository, UseCase 등을 모아 의존성 방향을 명확히 한 점과 Testing 모듈이 구현체를 몰라도 Mock을 생성할 수 있도록 한 부분도 좋은 것 같습니다. 다만 몇 가지 팀 차원에서 한 번 논의해보면 좋을 만한 내용이 생겼어요... 전체적으로는 모듈 경계가 명확해졌고 테스트 구조까지 잘 정리된 완성도 높은 리팩토링이라고 생각합니다. |
|
@pinocchio22 먼저 변경사항이 많았음에도 빠르게 리뷰해주셔서 감사합니다!
|
pinocchio22
left a comment
There was a problem hiding this comment.
제가 단단히 착각한 부분이 있었네요 ㅎㅎ;; 타입 추상화에 관련해서는 동일한 의견입니다!!
📌 이슈
✅ 작업 사항
1. MLSAuthFeature SPM 패키지 생성
인증 관련 코드를 독립 SPM 패키지로 분리하고 4개의 타깃으로 구성했습니다.
2. 아키텍처 경계 재정립 — DomainInterface 폴더 제거
초기 설계에서는 패키지 내부에
DomainInterface폴더를 두어 Repository/UseCase 프로토콜을 관리했지만, Testing 모듈이 구현체(MLSAuthFeature)를 몰라도 Mock을 만들 수 있어야 한다는 원칙 때문에 별도 폴더가 아닌MLSAuthFeatureInterface타깃 자체로 통합했습니다.결론: "외부 소비자가 알아야 하는 모든 것 = MLSAuthFeatureInterface"
3. UseCase 통합 — Apple/Kakao 분리 구조 제거
플랫폼별로 분리된 UseCase를
LoginPlatform파라미터로 분기하는 단일 UseCase로 통합했습니다.4. 불필요한 UseCase 제거 — Repository 직접 호출로 전환
단순히 Repository 메서드를 한 번 감싸기만 하는 UseCase는 레이어를 늘릴 이유가 없다고 판단해 제거했습니다. 해당 Reactor에서 Repository를 직접 주입받아 호출합니다.
대표 예시:
OnBoardingInputReactor의 직업 목록 조회5. CheckUseCase — 불필요한 Observable 래핑 제거
레벨 유효성 검사, 레벨·직업 공백 검사는 네트워크·I/O 없는 순수 동기 연산이므로
Observable로 감쌀 이유가 없었습니다.Reactor에서도
.map,.flatMap체인 대신 결과를 바로Observable.of(...)에 담는 방식으로 단순해졌습니다.6. Credential — Protocol → Struct 단순화
AppleCredential,KakaoCredential두 구현체의 구조가token,providerID로 동일해 프로토콜이 불필요한 추상화였습니다.7. MLSAuthFeatureTesting — Mock 객체 모듈화
테스트 파일 내
private struct형태로 흩어진 Mock들을MLSAuthFeatureTesting모듈로 이동해 재사용 가능하게 만들었습니다.MockAuthAPIRepositoryFCMFailingMockAuthAPIRepositoryFailingMockTokenRepositoryMockTokenRepository/MockUserDefaultsRepositoryMockSocialLoginUseCase/MockSocialSignUpUseCaseResult주입으로 성공/실패 제어MockSocialCredentialProvidersCredential.mock/LoginResponse.registered/.unregistered8. 단위 테스트 작성
Repository 레이어 테스트는 작성하지 않고, 비즈니스 로직이 있는 곳에만 집중했습니다.
CheckUseCaseTestsSocialLoginUseCaseTestsTermsAgreementReactorTestsLoginReactorTests@testable import로 internal 접근 — 테스트를 위해 접근제어를 변경하는 것은 설계 오염이라 판단했습니다.9. BaseViewController — Loggable 프로토콜 적용
os_log직접 호출 대신MLSCore의Loggable프로토콜을 채택해 init/deinit 로그를 일관되게 남기도록 수정했습니다.구동 영상 (Mock 주입)
Simulator.Screen.Recording.-.iPhone.17.Pro.-.2026-04-13.at.21.59.07.mov
디렉토리 이미지