[4주차 트러블 슈팅] 홍성준 - boostcampwm2023/iOS04-HeatPick GitHub Wiki
🖼️ 배경
🫠 트러블
🏃🏻 시도했던 방법
- 별 다른 처리를 하지 않았지만 로그아웃 시키면 되겠다 생각을 했음
- 싱글톤을 사용해야 하나? 생각이 들었고 테스트 가능하게 하려면 어떠한 방식으로 해야할 까 고민을 하였음
✅ 솔루션
- NetworkProvider에 싱글톤을 주입시키자
- 로그아웃 서비스에 대한 싱글톤 객체를 생성자로 의존성 주입시켰음
- 로그아웃 서비스 기능을 나누자
- 어떠한 곳은 로그아웃을 요청할 수 있는 기능이 필요하고 다른 곳은 로그아웃에 대한 결과만 받으면 되었음
- 서비스를 프로토콜로 잘게 쪼개어 그 기능이 필요한 곳에 해당 프로토콜을 가지고 있도록 하여 특정 기능만 사용하도록 제한하였음
public protocol SignOutServiceInterface: AnyObject {
var signOutCompleted: AnyPublisher<Bool, Never> { get }
}
public protocol SignOutRequestServiceInterface: AnyObject {
func signOut()
func signOut(type: AlertType)
}
public final class SignoutService: SignOutServiceInterface, SignOutRequestServiceInterface {
public static let shared = SignoutService()
public var signOutCompleted: AnyPublisher<Bool, Never> {
return signOutCompletedSubject.eraseToAnyPublisher()
}
private var signOutCompletedSubject = PassthroughSubject<Bool, Never>()
private init() {}
public func signOut() {
SecretManager.remove(type: .accessToken)
signOutCompletedSubject.send(true)
}
public func signOut(type: AlertType) {
presentAlert(type: type) { [weak self] in
self?.signOut()
}
}
}