Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Network] #155 - Login View 로직 수정, Refresh Token 로직추가 #156

Merged
merged 7 commits into from
Aug 9, 2024

Conversation

shimseohyun
Copy link
Contributor

🔥 Pull requests

👷 작업한 내용

  • Login -> Onboarding -> Univ Select 으로 로직 변경했습니다. (나의 실수, 정말 미안)

  • HankkiList View Model에 Network Result 리펙토링이 안되어서 적용했습니다.

  • status code 204 대응
    success 중 status code가 204로 오는 경우 response가 nil로 와서 decode 에러가 발생합니다. 해당 이슈 대응 로직을 작성했습니다. (후술)

  • 401 에러(엑세스 토큰 만료)처리
    401 에러 발생시 postReissue를 통해 엑세스 토큰을 재발급합니다.
    이때 리프레시 토큰도 만료되었으면 application의 유저 정보를 지우고, 다시 로그인을 진행합니다.

🚨 참고 사항

  • status code 204 처리 방법
// NetworkResult.swift

extension NetworkResult {
    func handleNetworkResult(_ result: NetworkResult, onSuccess: ((T) -> Void)? = nil, onSuccessVoid: (() -> Void)? = nil) {
        switch result {
        case .success(let response):
            if let res = response {
                onSuccess?(res)
            } else if T.self == Void.self {
                onSuccessVoid?()
            } else {
                print("🚨 RESPONSE IS NIL 🚨")
            }
            
        case .unAuthorized:
            // 401 error
            // access token이 올바르지 않거나, 만료된 경우
            self.postReissue()
            
        default:
            // TODO: - 상세한 분기처리 필요 (기디 논의 필요)
            // 프로그램 로직 내부에 오류가 발생했을 경우, 모달창을 띄웁니다.
            if let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene,
                let delegate = windowScene.delegate as? SceneDelegate,
                let rootViewController = delegate.window?.rootViewController {
                rootViewController.showAlert(titleText: "오류 발생",
                                             subText: result.stateDescription,
                                             primaryButtonText: "확인")
            }
        }
    }
}

204의 경우 서버에서 별도의 data를 보내지 않습니다. Void값이 오는데, emptyDTO를 쓰는 경우 타입이 같지 않아 디코딩 오류가 나게 됩니다.
NetworkResult로 선언 할 경우 response의 optional을 푸는 과정에서 예외처리 과정으로 빠지게 됩니다. 그래서, response 값이 nil이어도 호출할 수 있는 onSuccessVoid 클로저를 추가했습니다.

//MypageViewModel.swift
func deleteWithdraw(authorizationCode: String) {
        NetworkService.shared.authService.deleteWithdraw(authorizationCode: authorizationCode) { result in
            result.handleNetworkResult(result, onSuccessVoid: {
                print("🛠️ RESTART APPLICATION 🛠️ - WITHDRAW")
                UIApplication.resetApp()
            })
        }
    }

위와 같은 방식으로 결과가 204인경우 실행할 로직을 작성해주시면됩니다.

✅ Check List

  • Merge 대상 브랜치가 올바른가?
  • 최종 코드가 에러 없이 잘 동작하는가?
  • 전체 변경사항이 500줄을 넘지 않는가?

📟 관련 이슈

@shimseohyun shimseohyun added ♻️ Refactor 전면 수정이 있을 때 사용 🤹🏻‍♀️ 서현 서현 공주 작업 🛜 Network API 연결 labels Aug 7, 2024
@shimseohyun shimseohyun self-assigned this Aug 7, 2024
Copy link
Member

@mcrkgus mcrkgus left a comment

Choose a reason for hiding this comment

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

훨씬 깔끔해졌구려 고생 많았소 최고입니다 서울우유 아기님

} else {
print(result)
print("🚨 RESPONSE IS NIL 🚨")
Copy link
Member

Choose a reason for hiding this comment

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

LGTM

@@ -11,6 +11,27 @@ import UIKit
final class LoginViewModel { }

extension LoginViewModel {
func getUniversity() {
Copy link
Member

Choose a reason for hiding this comment

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

p3
깔끔하오 소녀 굳굳

func getUniversity() {
// 사용자의 대학을 조회한다.
UserDefaults.standard.removeUniversity()
Copy link
Member

Choose a reason for hiding this comment

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

p3
온보딩에서 한 번 리셋 시키는건가유??

Copy link
Contributor Author

Choose a reason for hiding this comment

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

엇 이걸 논의 했어야했는데...!

access token 재발급 문제 때문에 splash 단계에서 api를 호출해서 access 토큰 상태를 한번 확인하는 로직이 있으면 좋겠다고 생각했습니다.
마침... university가 user defaults에 저정하는 것으로 변경되었기 때문에 + 혹시 오류로 꼬여서 user defaults에 대학 정보가 남아있을 수 있음으로 탈퇴, 로그아웃을 고려해 splash 단계에서 초기화 할 수 있다면 좋겠다고 생각했고...
-> 기존에 저장된 정보를 초기화하고 university api를 호출하며 그와 동시에 access token을 검사하는 것으로 로직을 짰습니다.

name: response.data.name,
longitude: response.data.longitude,
latitude: response.data.latitude)
UserDefaults.standard.saveUniversity(university)
Copy link
Member

Choose a reason for hiding this comment

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

p3
이 동무 애정하오

Comment on lines +141 to +146
viewModel.postZipBatchDelete(requestBody: request) {
self.setIsEditMode()
self.dismiss(animated: false) {
self.viewModel.zipList = []
self.viewModel.getZipList()
}
Copy link
Member

Choose a reason for hiding this comment

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

p3
이슈 해결한 소녀 조아요

Copy link
Member

@EunsuSeo01 EunsuSeo01 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 48 to 51
onSuccess?(res)
} else if T.self == Void.self {
onSuccessVoid?()
} else {
Copy link
Member

Choose a reason for hiding this comment

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

Void.self라는 건 한번도 작성해본 적 없는데 이럴 때 쓰이는군요

Comment on lines +143 to +146
self.dismiss(animated: false) {
self.viewModel.zipList = []
self.viewModel.getZipList()
}
Copy link
Member

Choose a reason for hiding this comment

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

zipList를 비웠다가 다시 가져오는 로직인가요>?.?

Copy link
Contributor Author

@shimseohyun shimseohyun Aug 8, 2024

Choose a reason for hiding this comment

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

네 맞습니다!
현재 플로우가 같은 페이지 내에서

  1. 수정 모드로 변경 + 삭제할 족보를 선택함
  2. 삭제 버튼을 누르면 팝업으로 뜸
  3. 팝업을 닫으면 삭제됨...
  4. 팝업을 닫음과 동시에 선택한 족보를 삭제된 리스트를 불러옴(zip list api를 한번 더 호출함)

인데, api 통신하는 동안 삭제 이전의 데이터가 떠서 그냥 아예 한번 배열을 초기화하고 다시 불러오는 방식으로 설정했습니다

@shimseohyun shimseohyun merged commit bb575ee into develop Aug 9, 2024
@shimseohyun shimseohyun deleted the network/#155 branch August 9, 2024 00:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
🛜 Network API 연결 ♻️ Refactor 전면 수정이 있을 때 사용 🤹🏻‍♀️ 서현 서현 공주 작업
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[Network] Refresh Token 발급 로직 수정
3 participants