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

통신을 위한 네트워크 관련 베이스 코드 작성 #17

Open
heechokim opened this issue Mar 21, 2022 · 3 comments
Open

통신을 위한 네트워크 관련 베이스 코드 작성 #17

heechokim opened this issue Mar 21, 2022 · 3 comments
Assignees
Labels
feature 새로운 기능
Milestone

Comments

@heechokim
Copy link
Collaborator

heechokim commented Mar 21, 2022

내용

@heechokim heechokim added the feature 새로운 기능 label Mar 21, 2022
@heechokim heechokim added this to the v1.0.0 milestone Mar 21, 2022
@heechokim heechokim self-assigned this Mar 21, 2022
@heechokim heechokim moved this to Backlog in 모여런 Mar 22, 2022
@ethan-223 ethan-223 moved this from Backlog to Todo in 모여런 Mar 25, 2022
@heechokim heechokim moved this from Todo to In Progress in 모여런 Mar 27, 2022
@heechokim
Copy link
Collaborator Author

heechokim commented Mar 29, 2022

Retrofit Client

  • Retrofit 라이브러리 추가(v2.9.0), gson-converter 추가(v2.9.0)
  • Retrofit 라이브러리 사용을 위한 레트로핏 인스턴스를 생성한다.
  • 이 때, base url과 CallAdapter, Converter를 설정한다.
  • HTTP API를 인터페이스화 해놓은 Service 클래스를 연결해준다.

@heechokim
Copy link
Collaborator Author

heechokim commented Mar 29, 2022

깊이 있는 스터디는 건너뛰고 코드 먼저 작성하며 코드에 맞춰서 이해한 것이라 명확한 설명은 아닐 수 있습니다..😂

CallAdapter

  1. Retrofit 라이브러리에서 콜어댑터 라는 것을 제공 중 입니다. (처음 알게 되었네요 ㅎㅎ)
  2. 비동기 통신을 위해 Rxjava를 쓸 것이라면?
    • Retrofit에서 이미 Rxjava용 콜 어댑터를 제공해주고 있다 => 링크
    • rxjava용 callAdapter 라이브러리 추가하고 바로 사용 가능하다.
  3. 비동기 통신을 위해 코루틴을 쓸 것이라면?
    • 아쉽게도.. 코루틴 용 callAdapter는 제공해주지 않는다.(아직까진..)
    • 즉, 직접 구현해야 한다..
  4. call Adapter를 사용하지 않았을 때
    data class GitRepositoryResponse {
        val userName: String,
        val repoList: List<Repo>
    }
    
    interface GithubService {
         @GET("users/{user}/repos")
         fun getRepoList(@Path("user") user: String): Call<GitRepositoryResponse>
    }
    
    // Repository 클래스
    val call: Call<GitRepositoryResponse> = RetrofitClient.service.getRepoList("choheeis")
    call.enqueue(
         object : Callback<GitRepositoryResponse>{
             override fun onFailure(call: Call<GitRepositoryResponse>, t: Throwable) {
             }
    
             override fun onResponse(
                 call: Call<GitRepositoryResponse>,
                 response: Response<GitRepositoryResponse>
             ) {
             }
         }
     )
    • API 호출 시 매번 Call 인터페이스를 직접 구현해줘야 한다.
  5. call Adapter를 사용했을 때(rxjava용)
    // build.gradle(app)
    implementation 'com.squareup.retrofit2:adapter-rxjava2:latest.version'
    
    // retrofit client
    Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("https://example.com/")
        .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
        .build();
    
    // interface 
    interface GithubService {
         @GET("users/{user}/repos")
         fun getRepoList(@Path("user") user: String): Observable<GitRepositoryResponse>
    }
    
    // Repository 클래스
    RetrofitClient.service.getRepoList("choheeis")
            .subscribeOn(Schedulers.computation())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe({ gitRepositoryResponse ->
                // 성공
            }, { thowable ->
                // 실패
            }, {
                    
            })
    • Call 인터페이스 구현 없이, Rxjava로 API 호출과 동시에 응답 받아와서 사용 가능
    • rxjava용 callAdapter 내부에서 enqueue 처리 해주고 있음
  6. 확실히 콜 어댑터 사용하면 편할 것 같다! 코루틴 용도 직접 구현해보자. (rxjava용 콜어댑터 오픈 소스 코드 참고하여 비슷하게 만들면 된다 ㅎㅎ....화이팅..)

코루틴용 CallAdapter 구현하기

  1. 5개의 클래스(또는 파일) 구현해야 합니다.
    • Response.kt
    • NetworkResult
    • NetworkResponseCall
    • NetworkResponseCallAdapter
    • NetworkResponseAdapterFactory
  2. Response.kt
  3. NetworkResult
    • 네트워크 통신 요청(API 호출)에 대해, 발생할 수 있으며 핸들링 해야 할 것들(예외 상황 포함) 입니다.
    • Success : 정상적인 응답 (서버 팀과 합의한 성공 응답 케이스)
    • Failure : 실패 (서버 팀과 합의한 실패 응답 케이스)
    • NetworkError : 해당 포트의 서버에 연결할 수 없는 경우로 알고 있습니다.(명확하진 않음)
    • UnknownError
    • 등등 더 추가 가능 (토큰 만료 예외 라던지..)
  4. NetworkResponseCall
    • Call 인터페이스 구현하는 곳�
  5. NetworkResponseCallAdapter
    • CallAdapter 인터페이스 구현하는 곳
    • NetworkResponseCall을 적용해줌
  6. NetworkResponseAdapterFactory
    • CallAdapter.Factory() 추상 클래스 구현하는 곳
    • 뭐하는 곳인지 명확히는 모르겠지만.. 레트로핏 콜 어댑터 만들어 주는 곳이라고 생각.
  7. retrofit client 에 추가
    private val retrofit: Retrofit = Retrofit.Builder()
        .baseUrl(BASE_URL)
        .addCallAdapterFactory(NetworkResponseAdapterFactory())
        .build()
  8. 느낀점
    • 이해하기 어렵다. (조금 더 공부해야 할 듯)
    • 유지 보수 괜찮을까?
    • 왜 코루틴 용은 만들어 놓지 않은 거야 레트로핏아..
    • 확장 함수로 구현해볼까...

heechokim added a commit that referenced this issue Mar 31, 2022
heechokim added a commit that referenced this issue Apr 1, 2022
heechokim added a commit that referenced this issue Apr 4, 2022
@jisungbin
Copy link

retrofit + coroutine 은 suspend 키워드 하나만 붙여서 바로 사용하실 수 있습니다.

heechokim added a commit that referenced this issue Apr 25, 2022
heechokim added a commit that referenced this issue Apr 25, 2022
heechokim added a commit that referenced this issue Apr 25, 2022
heechokim added a commit that referenced this issue Apr 25, 2022
heechokim added a commit that referenced this issue Apr 25, 2022
- 포스트맨 가짜 서버 적용 테스트
heechokim added a commit that referenced this issue Apr 25, 2022
heechokim added a commit that referenced this issue Apr 26, 2022
heechokim added a commit that referenced this issue Apr 26, 2022
heechokim added a commit that referenced this issue Apr 26, 2022
heechokim added a commit that referenced this issue Apr 26, 2022
- 포스트맨 가짜 서버 적용 테스트
heechokim added a commit that referenced this issue Apr 26, 2022
heechokim added a commit that referenced this issue Apr 26, 2022
heechokim added a commit that referenced this issue Apr 28, 2022
- 리뷰 반영
- 레트로핏 버전 변수 정의
- Failure 시 Throwable로 다루도록 변경
- request url 기록
- Exception 구조화
heechokim added a commit that referenced this issue Apr 30, 2022
- 클래스 구현부가 비어있는 경우 중괄호를 제거합니다.
- 네이밍 변경합니다.
heechokim added a commit that referenced this issue Apr 30, 2022
- 클래스 구현부가 비어있는 경우 중괄호를 제거합니다.
- 네이밍 변경합니다.
heechokim added a commit that referenced this issue May 10, 2022
heechokim added a commit that referenced this issue May 10, 2022
heechokim added a commit that referenced this issue May 10, 2022
heechokim added a commit that referenced this issue May 10, 2022
- 포스트맨 가짜 서버 적용 테스트
heechokim added a commit that referenced this issue May 10, 2022
heechokim added a commit that referenced this issue May 10, 2022
heechokim added a commit that referenced this issue May 10, 2022
- 리뷰 반영
- 레트로핏 버전 변수 정의
- Failure 시 Throwable로 다루도록 변경
- request url 기록
- Exception 구조화
heechokim added a commit that referenced this issue May 10, 2022
- 클래스 구현부가 비어있는 경우 중괄호를 제거합니다.
- 네이밍 변경합니다.
heechokim added a commit that referenced this issue May 10, 2022
- 통신 예제 코드 제거
- local.properties에 baseUrl 선언 및 적용
heechokim added a commit that referenced this issue May 11, 2022
[#17] 통신을 위한 네트워크 관련 베이스 코드 작성
ethan-223 added a commit that referenced this issue Sep 4, 2022
[#17] 통신을 위한 네트워크 관련 베이스 코드 작성 - 컨버터 추가
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
feature 새로운 기능
Projects
Status: In Progress
Development

No branches or pull requests

2 participants