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

Retrofit Provider 분리 #144

Merged
merged 3 commits into from
Nov 1, 2023
Merged

Retrofit Provider 분리 #144

merged 3 commits into from
Nov 1, 2023

Conversation

easyhooon
Copy link
Collaborator

@easyhooon easyhooon commented Oct 30, 2023

  • 로그인을 위한 (헤더에 로그인 토큰을 담지 않는) Retrofit Provider 추가
  • 각 화면에 배경색을 지정하는 코드 수정
  • 중복되는 코드 및, 주석 처리된 코드 제거

로그인 할 때는 헤더에 GuestLoginToken 을 포함 하지 않아야 하므로, 헤더에 GuestLoginToken 을 포함 하지 않는 Retrofit Provider 를 추가
modifier.background(color)로 원하는 배경색이 지정되지 않아 color 속성으로 배경색을 지정하는 식으로 변경
주석 처리된 코드 제거
@easyhooon easyhooon self-assigned this Oct 30, 2023
@easyhooon easyhooon added hotfix tasks related to fix bugs feature tasks related to feature development design tasks related to design aspects of the project refactoring Code restructure for better readability and efficiency labels Oct 30, 2023
@easyhooon
Copy link
Collaborator Author

Bitrise가 갑자기 왜 동작하지 ㄷ bitrise fail뜬거는 무시해도 될듯.. 확인해봐야겠다

Copy link
Collaborator

@likppi10 likppi10 left a comment

Choose a reason for hiding this comment

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

현상

image

해당 이미지를 보면 확실히 처음 다운로드가 됐을 때는, 헤더에 아무것도 담기지 않음 그리고 연이어 호출되는 연결에 헤더가 담김


그러면 왜 이렇게 되는 걸까

싱글톤으로 생성한 레트로핏 객체는 내부의 코드들을 한번에 관리하므로 확실히 유의미한 것이 맞음

  1. 인터셉터가 단일 통신이 일어날 때마다 통신의 흐름 끄트머리에 붙어 실행되는 메커니즘이기 때문에
  2. 동시에 우리가 유저 토큰을 싱글톤으로 불러오는 것이 아니기 때문에 (매번 새로 불러오지)

그래서 첫번째로 헤더 없이 토큰을 받아오는 통신을 하고, 그 다음의 통신에 바로 토큰이 들어가는 것으로 확인됨


그러면 지금 지훈이 형의 바뀐 코드는 어떤가?

표면상으로는 제일 첫번째가 아니면 호출되지 않을 레트로핏 객체임은 맞는 듯함
하지만, 서버에서 null을 체크하더라도 클라에서도 null을 체크해서 보내주 듯 안정성이나 확실성을 보면 이렇게도 구현되어도 괜찮은듯

@easyhooon
Copy link
Collaborator Author

easyhooon commented Nov 1, 2023

그러면 왜 이렇게 되는 걸까

addHeader를 통해 header 를 추가 할때(key, value의 형식), value 가 유효한 값이 아닌 경우(nullOrEmpty) header 에 추가되지 않는 것 같아. (addHeader 함수를 타고 들어가면 아래 코드를 확인할 수 있음)
image
하지만 key를 check하는 함수와는 다르게 (headersCheckName) 값이 유효하지 않은 경우 IllegalArgumentException 을 던져버리지는 않는 듯 함..
원래도 동작하는덴 이상은 없었으나, 코드 단에서 명시적으로 Header가 존재하는 Retrofit Provider 와 Header가 존재하지 않는 Retrofit Provider 를 구분하는게 그 결과를 예상할 수 있기에 더 나은 방법일 듯 함

@easyhooon easyhooon merged commit 8872a3f into develop Nov 1, 2023
1 of 2 checks passed
@easyhooon easyhooon deleted the feature/auth-httpclient branch November 1, 2023 00:38
@likppi10
Copy link
Collaborator

likppi10 commented Nov 1, 2023

지훈이형이 띄워준 캡쳐에는

addHeader를 통해 header 를 추가 할때(key, value의 형식), value 가 유효한 값이 아닌 경우(nullOrEmpty) header 에 추가되지 않는 것 같아.

이와 같은 내용은 확인되지 않는걸,,? 그냥 isSeneitiveHeader 일때만 ""로 하겠다는 의미만 있는 것 아닌가?

image

민감한 정보는 이런걸 의미한다는 구만,,

image

어찌됐든 우리는 현재 유제 토큰의 첫 값(값이 없을 때)을 ""으로 보내주고 있으니 null이 아니기 때문에 헤더에는 담겨가고 있는것 같아

image

null이 들어오면 헤더를 추가하지 않는게 아니라 오류가 뜨지 않을까? 함수가 null 자체를 허용하지 않는걸..?

@easyhooon
Copy link
Collaborator Author

함수가 null 자체를 허용하지 않는걸..?

ㅇㅎ 잘못 말했네 내가
nullOrEmpty 가 아니라 Emtpy 일때만 인게 맞겠구만

해당 이미지를 보면 확실히 처음 다운로드가 됐을 때는, 헤더에 아무것도 담기지 않음 그리고 연이어 호출되는 연결에 헤더가 담김

헤더에 추가되지 않는다는 건 이걸 통해 추론해본거였어 지금은 이미 merge 되어가지고 저때 코드 버전으로 돌려보진 않아서

@likppi10
Copy link
Collaborator

likppi10 commented Nov 1, 2023

아무튼 레트로핏은 생각보다 예민한 네이밍을 지양하는 것 같기도 하고,
이번 이슈는 그냥 로컬에서 찾으려는 값이 없으면 ""이다 에서 어쩌다 스무스하게 넘어가게된 일이 된거네 거럼

@easyhooon
Copy link
Collaborator Author

easyhooon commented Nov 1, 2023

서버에서 그렇게 header 가 넘어갈 경우 어떤식으로 핸들링 하는지 물어봐도 좋을 듯하네
헤더에 value 값이 "" 로 왔을때 이게 뭐야 이러고 쳐내버리는지, 아니면 유효하지 않은 값(빈값)이면 이걸 아예 무시해버리는지

image
일단 위에 올린 이 함수들이 클라이언트 단에서 validation을 검사하는 함수들인데 value 로 "" 같은 값이 들어가면 for 문 자체를 바로 빠져나와버리게 되어서 함수가 검사라는 역할을 못해주긴 하는것 같아 for 문 내부로 진입을 해야 illegalArgumentException을 던질 수 있는데 뭐 반환 값 같은 것도 없구 ㅇㅇ

@easyhooon
Copy link
Collaborator Author

easyhooon commented Nov 1, 2023

아무튼 레트로핏은 생각보다 예민한 네이밍을 지양하는 것 같기도 하고,

나도 sensitive 한 목록 중 Authorization 밖에 써보진 않았는데 Jwt 토큰을 통해 통신할 땐 쓰이는 헤더 네임이거든

("Authorization", "Bearer $AccessToken") 이런식으로 ㅇㅇ 아마 나머지는 jwt 토큰을 통한 방식이 아니라, 세션, 쿠키등을 이용한 통신이긴 할거야 많이 쓰일거구 다만 이런 헤더들을 sensitive 하게 음.. 좀 특별하게 다루는 듯

-> 아 다시 보니깐 Exception에 메세지를 로그에 뿌릴 때 검사하는거네 그렇지 아무래도 jwt 토큰이든, 세션이든 쿠키이든 다 민감한 정보이니까 Exception message 를 뿌리기 전에 민감한 정보라고 판단되면 감춰버리는 듯함 "" 로, 로그를 확인해서 토큰을 갈취할 수도 있는 것이니까, 얘네가 아니면 별로 민감한 정보라고 판단하지 않는 경우에만 로그에 $value 로 그냥 header 의 value 를 공개 해버리는 식인듯!

@likppi10
Copy link
Collaborator

likppi10 commented Nov 2, 2023

아 그러면 헤더에 담기는 현상 자체는

우리는 현재 유제 토큰의 첫 값(값이 없을 때)을 ""으로 보내주고 있으니 null이 아니기 때문에 헤더에는 담겨가고 있는것 같아

로 설명되는거고

저 캡쳐들은 예외로그 띄울 때 값을 보여주지 않기 위해 감춰둔거구나

@easyhooon
Copy link
Collaborator Author

저 캡쳐들은 예외로그 띄울 때 값을 보여주지 않기 위해 감춰둔거구나

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/require.html
ㅇㅇ kotlin의 저 require 문법이 괄호안에 있는 조건을 만족하지 않으면 illegalArgumentException을 던지는 함수인데
우리 ktlint, detekt 검사할때도 illegalArgumentException 를 직접 던지지 말고 kotlin 문법에서 권장하는 require 를 쓰라고 검사해주고 있음 ㅇㅇ

@likppi10
Copy link
Collaborator

likppi10 commented Nov 2, 2023

아주 멋지군.. 👍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
design tasks related to design aspects of the project feature tasks related to feature development hotfix tasks related to fix bugs refactoring Code restructure for better readability and efficiency
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants