Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions EATSSU/App/Sources/Data/Network/Foundation/TokenManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ struct TokenPayload: Decodable {
let exp: TimeInterval
}

final class TokenManager {
class TokenManager {

Choose a reason for hiding this comment

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

medium

TokenManager 클래스가 final 키워드 없이 선언되었습니다. 만약 상속을 의도한 것이 아니라면, final 키워드를 추가하여 클래스가 상src되지 않음을 명시하고 잠재적인 오용을 방지하는 것이 좋습니다. 이는 성능 최적화에도 도움이 될 수 있습니다.

Suggested change
class TokenManager {
final class TokenManager {

static let shared = TokenManager()
private init() {}

Expand Down Expand Up @@ -41,7 +41,7 @@ final class TokenManager {
}

/// JWT Payload 디코딩
private func decodePayload(token: String) -> TokenPayload? {
func decodePayload(token: String) -> TokenPayload? {
let parts = token.split(separator: ".")
guard parts.count == 3 else { return nil }

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ final class LoginViewController: BaseViewController {
// MARK: - Properties

public static let isVacationPeriod = false
public var toastMessage: String?
private let authProvider = MoyaProvider<AuthRouter>(session: Session(interceptor: AuthInterceptor.shared))
private let myProvider = MoyaProvider<MyRouter>(session: Session(interceptor: AuthInterceptor.shared))

Expand All @@ -28,10 +27,11 @@ final class LoginViewController: BaseViewController {

// MARK: - Life Cycle

override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
handleAutoLogin()
}
// override func viewWillAppear(_ animated: Bool) {
// super.viewWillAppear(animated)
// showToastMessageIfNeeded()
//// handleAutoLogin()
// }

override func viewDidLoad() {
super.viewDidLoad()
Expand Down Expand Up @@ -80,16 +80,7 @@ final class LoginViewController: BaseViewController {
Analytics.logEvent("LoginViewControllerLoad", parameters: nil)
#endif
}

/// Realm에 저장된 토큰이 있는지 확인 후, 있으면 홈 화면으로 이동한다.
private func handleAutoLogin() {
guard hasStoredToken() else { return }
#if DEBUG
print("저장된 AccessToken: ", RealmService.shared.getToken())
#endif
changeIntoHomeViewController()
}


private func hasStoredToken() -> Bool {
!RealmService.shared.getToken().isEmpty
}
Expand All @@ -108,30 +99,33 @@ final class LoginViewController: BaseViewController {
/// 닉네임 설정이 필요한지 확인 후, 필요하면 닉네임 설정 화면으로, 아니면 홈 화면으로 이동한다.
private func handleNicknameCheck(info: MyInfoResponse) {
if let nickname = info.nickname {
// 사용자의 닉네임을 업데이트하고 홈 화면으로 이동
if let currentUserInfo = UserInfoManager.shared.getCurrentUserInfo() {
UserInfoManager.shared.updateNickname(for: currentUserInfo, nickname: nickname)
print("[디버깅] 닉네임 존재함: \(nickname)")

let currentUser = UserInfoManager.shared.getCurrentUserInfo()
print("[디버깅] currentUserInfo: \(String(describing: currentUser))")

if let u = currentUser {
UserInfoManager.shared.updateNickname(for: u, nickname: nickname)
print("[디버깅] 닉네임 업데이트 완료")
} else {
print("[디버깅] currentUserInfo가 nil임")
}
changeIntoHomeViewController()
} else {
// 닉네임 설정이 필요한 경우
print("[디버깅] 닉네임이 없음 → 닉네임 설정 화면으로 이동")
let setNicknameVC = SetNickNameViewController()
navigationController?.pushViewController(setNicknameVC, animated: true)
}
Comment on lines 101 to 117

Choose a reason for hiding this comment

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

medium

디버깅 목적으로 추가된 print 구문들이 남아있습니다. 머지 전에는 삭제하는 것이 좋습니다.

        if let nickname = info.nickname {
            if let currentUser = UserInfoManager.shared.getCurrentUserInfo() {
                UserInfoManager.shared.updateNickname(for: currentUser, nickname: nickname)
            }
        } else {
            let setNicknameVC = SetNickNameViewController()
            navigationController?.pushViewController(setNicknameVC, animated: true)
        }

Copy link
Member Author

Choose a reason for hiding this comment

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

로그 보면서 작업해서 print 문들은 아직 다 그대로 냅뒀습니다!

}


/// 토큰을 Realm에 저장하고, 디버깅 로그를 출력한다.
private func storeTokensAndPrintDebugLogs(accessToken: String, refreshToken: String) {
RealmService.shared.addToken(accessToken: accessToken, refreshToken: refreshToken)
#if DEBUG
print("⭐️⭐️ 토큰 저장 성공 ⭐️⭐️")
#endif
}

private func showToastMessageIfNeeded() {
guard let toastMessage = self.toastMessage else { return }
view.showToast(message: toastMessage)
}


// MARK: - 액션 메서드

Expand Down Expand Up @@ -192,14 +186,15 @@ extension LoginViewController {
let accessToken = data.accessToken
let refreshToken = data.refreshToken

// 토큰을 로컬에 저장
// 1) 토큰 저장
storeTokensAndPrintDebugLogs(accessToken: accessToken, refreshToken: refreshToken)

// 로컬 매니저에 유저 정보 생성
// 2) 인증 상태 업데이트 (SceneDelegate.observeAuthState가 화면 전환 처리)
AuthService.shared.login(accessToken: accessToken, refreshToken: refreshToken) //

// 3) 로컬 매니저에 유저 정보 생성
_ = UserInfoManager.shared.createUserInfo(accountType: accountType)

// 닉네임 등 정보를 확인하기 위해 프로필 조회
getMyInfo()
} catch {
switch accountType {
case .apple:
Expand Down Expand Up @@ -255,27 +250,6 @@ extension LoginViewController {
}
}
}

/// 서버에서 현재 유저 정보를 조회
private func getMyInfo() {
myProvider.request(.myInfo) { [weak self] result in
guard let self else { return }
switch result {
case let .success(moyaResponse):
do {
let responseData = try moyaResponse.map(BaseResponse<MyInfoResponse>.self)
guard let responseData = responseData.result else {
return
}
handleNicknameCheck(info: responseData)
} catch {
print(error.localizedDescription)
}
case let .failure(error):
print(error.localizedDescription)
}
}
}
}

// MARK: - 카카오 사용자 정보 가져오기
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -105,17 +105,6 @@ final class SetNickNameViewController: BaseViewController {
currentKeyboardHeight = 0.0
}
}

private func navigateToLogin() {
let loginVC = LoginViewController()
loginVC.toastMessage = "세션이 만료되었습니다. 다시 로그인해주세요."
DispatchQueue.main.async {
if let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene,
let keyWindow = windowScene.windows.first(where: { $0.isKeyWindow }) {
keyWindow.replaceRootViewController(UINavigationController(rootViewController: loginVC))
}
}
}
}

// MARK: - Network
Expand All @@ -129,23 +118,17 @@ extension SetNickNameViewController {
UserInfoManager.shared.updateNickname(for: currentUserInfo, nickname: nickname)
}
self.showAlertController(title: "완료", message: "닉네임 설정이 완료되었습니다.", style: .cancel) {
if let myPageViewController = self.navigationController?.viewControllers.first(where: { $0 is MyPageViewController }) {
self.navigationController?.popToViewController(myPageViewController, animated: true)
} else {
let homeViewController = HomeViewController()
if let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene,
let keyWindow = windowScene.windows.first(where: { $0.isKeyWindow })
{
keyWindow.replaceRootViewController(UINavigationController(rootViewController: homeViewController))
}
}
// 인증 상태만 업데이트 → SceneDelegate.observeAuthState()가 Home으로 전환
let at = RealmService.shared.getToken()
let rt = RealmService.shared.getRefreshToken()
AuthService.shared.login(accessToken: at, refreshToken: rt)
}

case let .failure(err):
print(err.localizedDescription)

RealmService.shared.resetDB()
self.navigateToLogin()
AuthService.shared.logout(message: "세션이 만료되었습니다. 다시 로그인해주세요.")
}
}
}
Expand Down Expand Up @@ -174,13 +157,13 @@ extension SetNickNameViewController {
print(err.localizedDescription)

RealmService.shared.resetDB()
self.navigateToLogin()
AuthService.shared.logout(message: "세션이 만료되었습니다. 다시 로그인해주세요.")
}
case let .failure(err):
print(err.localizedDescription)

RealmService.shared.resetDB()
self.navigateToLogin()
AuthService.shared.logout(message: "세션이 만료되었습니다. 다시 로그인해주세요.")
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ final class HomeViewController: BaseViewController {

@objc
private func didTapRightBarButton() {
if RealmService.shared.isAccessTokenPresent() {
if AuthService.shared.isTokenValid() {
navigateToMyPage()
} else {
presentLoginAlert()
Expand All @@ -114,16 +114,19 @@ final class HomeViewController: BaseViewController {
}

private func presentLoginAlert() {
let alert = UIAlertController(title: "로그인이 필요한 서비스입니다",
message: "로그인 하시겠습니까?",
preferredStyle: .alert)
let confirmAction = UIAlertAction(title: "확인", style: .default) { [weak self] _ in
self?.navigateToLogin()
let alert = UIAlertController(
title: "로그인이 필요한 서비스입니다",
message: "로그인 하시겠습니까?",
preferredStyle: .alert
)
let confirm = UIAlertAction(title: "확인", style: .default) { _ in
AuthService.shared.logout(message: nil)
self.navigateToLogin()

Choose a reason for hiding this comment

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

high

AuthService.shared.logout()을 호출하면 SceneDelegateobserveAuthState에 의해 자동으로 로그인 화면으로 전환됩니다. 따라서 self.navigateToLogin()를 명시적으로 호출할 필요가 없으며, 중복 호출로 인해 예기치 않은 동작이 발생할 수 있습니다.

Copy link
Member Author

Choose a reason for hiding this comment

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

이건 수정해야합니다.

}
let cancelAction = UIAlertAction(title: "취소", style: .cancel, handler: nil)
alert.addAction(confirmAction)
alert.addAction(cancelAction)
present(alert, animated: true, completion: nil)
let cancel = UIAlertAction(title: "취소", style: .cancel)
alert.addAction(confirm)
alert.addAction(cancel)
present(alert, animated: true)
}

private func navigateToLogin() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,9 @@ final class MyPageViewController: BaseViewController {

nickName = UserInfoManager.shared.getCurrentUserInfo()?.nickname ?? "실패"
mypageView.setUserInfo(nickname: nickName)
showToastMessageIfNeeded()
}

// MARK: - Functions

override func setCustomNavigationBar() {
Expand Down Expand Up @@ -97,26 +98,17 @@ final class MyPageViewController: BaseViewController {

/// 로그아웃 Alert를 스크린에 표시하는 메소드
private func logoutShowAlert() {
let alert = UIAlertController(title: "로그아웃",
message: "정말 로그아웃 하시겠습니까?",
preferredStyle: UIAlertController.Style.alert)

let cancelAction = UIAlertAction(title: "취소하기",
style: .default,
handler: nil)

let fixAction = UIAlertAction(title: "로그아웃",
style: .default,
handler: { _ in
RealmService.shared.resetDB()

let loginViewController = LoginViewController()
if let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene,
let keyWindow = windowScene.windows.first(where: { $0.isKeyWindow })
{
keyWindow.replaceRootViewController(UINavigationController(rootViewController: loginViewController))
}
})
let alert = UIAlertController(
title: "로그아웃",
message: "정말 로그아웃 하시겠습니까?",
preferredStyle: .alert
)

let cancelAction = UIAlertAction(title: "취소하기", style: .default, handler: nil)

let fixAction = UIAlertAction(title: "로그아웃", style: .default) { _ in
AuthService.shared.logout(message: nil)
}

alert.addAction(cancelAction)
alert.addAction(fixAction)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -120,17 +120,6 @@ final class MyReviewViewController: BaseViewController {
noMyReviewImageView.isHidden = true
}
}

private func navigateToLogin() {
let loginVC = LoginViewController()
loginVC.toastMessage = "세션이 만료되었습니다. 다시 로그인해주세요."
DispatchQueue.main.async {
if let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene,
let keyWindow = windowScene.windows.first(where: { $0.isKeyWindow }) {
keyWindow.replaceRootViewController(UINavigationController(rootViewController: loginVC))
}
}
}
}

extension MyReviewViewController: UITableViewDelegate {}
Expand Down Expand Up @@ -171,13 +160,13 @@ extension MyReviewViewController {
print(err.localizedDescription)

RealmService.shared.resetDB()
self.navigateToLogin()
AuthService.shared.logout(message: "세션이 만료되었습니다. 다시 로그인해주세요.")
}
case let .failure(err):
print(err.localizedDescription)

RealmService.shared.resetDB()
self.navigateToLogin()
AuthService.shared.logout(message: "세션이 만료되었습니다. 다시 로그인해주세요.")
}
}
}
Expand All @@ -194,7 +183,7 @@ extension MyReviewViewController {
print(err.localizedDescription)

RealmService.shared.resetDB()
self.navigateToLogin()
AuthService.shared.logout(message: "세션이 만료되었습니다. 다시 로그인해주세요.")
}
}
})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -129,15 +129,9 @@ extension UserWithdrawViewController {
do {
let responseData = try moyaResponse.map(BaseResponse<Bool>.self)
guard let data = responseData.result, data else { return }

RealmService.shared.resetDB()
let loginViewController = LoginViewController()
if let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene,
let keyWindow = windowScene.windows.first(where: { $0.isKeyWindow })
{
loginViewController.toastMessage = "탈퇴 처리가 완료되었습니다."
keyWindow.replaceRootViewController(UINavigationController(rootViewController: loginViewController))
}
AuthService.shared.logout(message: "탈퇴 처리가 완료되었습니다.")
} catch let err {
print(err.localizedDescription)
}
Expand Down
Loading