내일배움캠프 58일차

김재현·2024년 5월 23일
post-thumbnail

오늘은 스탠다드반 과제에 hilt를 적용해봤다.

1. gradle에 dependency 추가

  • 먼저 libs.versions.toml에서 versions에 다음과 같이 hilt, room, ksp를 추가해주고

  • libraries에 다음과 같이 hilt와 room에 관해서 추가해주었다.

  • plugins에는 hilt와 ksp를 추가해주었다.

  • 프로젝트 build.gradle에서 alias hilt와 ksp를 추가해주고 dependencies 추가하러 가면된다.

  • 모듈 build.gradle에서도 plugins에 hilt와 ksp 추가해주고

  • dependencies에 hilt와 room을 추가하고 hilt-compiler, room-compiler를 ksp로 바꿔주면 끝!
    (원래는 room-ktx를 튜터님은 안쓰셔도 구동이 잘되던데 나는 추가하라고 오류가 떠서...ㅠㅠ)

2. presentation layer의 datamodel에서 entity 지우기

  • 원래는 GitHubUserListEntity, GitHubUserEntity 라고 네이밍되어 있었는데 Entity를 지워주었다.
  1. data layer의 data model은?
    1. remoteData → Response
    2. cacheData → Entity

원래 data layer의 data model이 각각 response와 entity가 되는것 같다!

3. Application - @HiltAndroidApp 생성

  • presentation layer에 StandardApp이라는 class를 만들었다.

  • @HiltAndroidApp 어노테이션을 달아주고

  • manifests에서 다음과 같이 name을 설정해준다.

4. RetrofitClient 수정

  • 원래 RetrofitClient는 다음과 같은 형태였다.


@Module과 @InstallIn, 그리고 @Provides 어노테이션을 추가하여 바꿔주었다.

@Provides

  • 클래스가 외부 라이브러리에서 제공되어 생성자 삽입이 불가능한 경우 사용 (ex. Retrofit, Room)

@Binds

  • Interface는 생성자 삽입이 불가능하기에 Interface의 인스턴스를 제공해야 할 때 사용한다.

@HiltAndroidApp

  • HiltAndroidApp은 Hilt 컴포넌트의 코드 생성과 컴포넌트를 사용하는 Application의 기본 클래스를 생성합니다.

  • onCreate() 호출 후 Application 필드에 의존성 주입이 이루어진다.

@AndroidEntryPoint

  • Application에서 멤버 주입이 가능하게 설정하면 안드로이드 클래스에 AndroidEntryPoint 어노테이션을 사용하여 멤버 주입을 해줘야 한다.

    • AndroidEntryPoint 사용할 수 있는 타입
      • Activity
      • Fragment
      • View
      • Service
      • BroadcastReceiver

@InstallIn

  • Hilt 표준 텀포넌트들 중 어떤 컴포넌트에 모듈을 설치할 지 결정한다. Hilt 컴포넌트가 생성될 때 모듈들은 추가된 InstallIn과 함께 알맞은 컴포넌트, 서브 컴포넌트에 설치한다.

  • 컴포넌트 내 다른 바인딩 또는 하위 컴포넌트에 바인딩이 접근하는 것을 허용한다.

Annotation 프로세서

  • Hilt는 Annotation 기반으로 동작함.
  • Annotation 프로세서는 컴파일 타임에 Annotation을 스캔하고, 소스코드를 검사 또는 생성함.
    • 빌드가 완료된 후 프로젝트 소스코드가 자동으로 생성되는 원리가 Annotation 프로세싱으로 인해 생성된 코드임.
      • 하나의 Annotation을 처리하는 단계를 round라 부름.
        • 몇차례의 round를 거치며 Annotation 프로세서가 코드를 스캔하게됨.
  • Interceptor 생성

    interceptor는 이 부분을 말씀해주신것 같은데 어떻게 사용하는 부분인지...한번 검색해보았다!
  • Interceptor는 해당 네트워크 통신을 하는 중간에 요청과 응답을 보내거나 받거나 간섭하는 역할을 수행하는데 원래 Retrofit의 Header를 사용해도 토큰을 헤더로 보낼 수 있지만 매 API마다 작성해야 하므로 이를 개선하기 위해 InterCeptor를 통해 request시 전달할 수 있다고 한다.

이 Interceptor를 OkHttpClinet에 추가해주고 Retrofit에 client로 등록해주면 일일이 Header에 값을 넣어 줄 필요없이 Interceptor를 통해 전달할 수 있다.

출처: https://velog.io/@jdsaeyqo/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-InterCeptor

5. data layer repository module 생성

  • data layer에 Module을 추가해주었다.

6. RepositoryImpl @Inject constructor 추가

  • 원래 파라미터에 @Inject constructor를 추가해주었다.

7. Activity와 Fragment에 AndroidEntryPoint 추가

  • SearchMainActivity와 GitHubUserFragment에 어노테이션을 추가해주었다.

10. ViewModel에 viewmodel @Inject constructor, @HiltViewModel 어노테이션 추가

  • 여기서 오류가 많이났는데 libs.version.toml에서 hilt, ksp, room 수정하니까 잘 되더라 ㅠㅠ
    .
    .
    .
    .
    .
    주말에는 팀 프로젝트도 hilt의 형태로 한번 변환시켜봐야겠다.

하루의 마무리

  • 벌써 3개월이 지났다니

0개의 댓글