전체 글 32

[Fig] UseCase 계층 도입기: 중복 로직 해결과 비즈니스 로직 분리

🚨 문제 상황대시보드 형태의 홈 Fig의 홈 화면은 각 탭의 정보를 요약해서 보여주는 대시보드 형태입니다. 가계부 섹션에서는 월별 수입/지출 요약을, 챌린지 섹션에서는 현재 진행 중인 챌린지들을, 차트 섹션에서는 카테고리별 지출 분석을 표시했습니다.문제는 이런 구조 때문에 홈 화면과 각 전용 탭 간의 로직 중복이 발생했습니다. Section 0. 가계부 탭의 월별 수입/지출 계산 로직Section 1. 챌린지 탭의 진행률 계산 및 성공/실패 판정 및 상태 업데이트 로직Section 2. 카테고리별 차트 데이터를 생성하는 현재달/지난달 거래 조회 후 비교 계산 로직 코드 중복단순한 몇 줄의 중복이 아니라 각각 50~100줄에 달하는 복잡한 비즈니스 로직이 중복되고 있었습니다. 전체적으로 300줄 이상의 ..

iOS 2025.09.13

[Fig] Coordinator 적용기

정신 없이 MVP 구현을 마치고 나니 남은건 너덜너덜한 coordinator들.. 초반에 잡아놓았던 coordinator에 정말 기능만 돌아가게 하도록 덕지덕지 붙여나가 각기 다른 생성 패턴과 책임이 혼재되어있던 상태였다.그리하여 추가 기능을 구현하기 전에 구조를 명확히 하면서 책임을 분리할 필요가 있었다. ✅ 시작 전 문제점1. 일관적이지 않은 ViewController 생성 패턴TabBarCoordinator에서 직접 생성:// TabBarCoordinator.swift - 홈 탭let homeReactor = HomeViewReactor( transactionRepository: TransactionRepository(), challengeRepository: ChallengeReposi..

iOS 2025.09.07

[iOS] RxSwift + Swift Testing

✅ 왜 RxBlocking이 필요할까? RxSwift는 비동기 스트림을 다루는 라이브러리입니다. 하지만 테스트는 동기적으로 결과를 확인해야 합니다// ❌ 이렇게 하면 안 됨 - 비동기라서 테스트가 끝나기 전에 완료됨func test_잘못된_방법() { let result = userRepository.getUser(id: 1) // Single // result는 아직 실행되지 않은 스트림일 뿐! #expect(result == expectedUser) // 컴파일 에러!}// ✅ RxBlocking으로 동기화func test_올바른_방법() throws { let result = try userRepository.getUser(id: 1) .toBlocking() ..

iOS 2025.07.31