과제/챌린지반과제

챌린지반과제 week5

crablo 2024. 4. 17. 23:40
728x90

이번주 챌린지반 과제는 Kakao API 이용 하여 이미지 검색 혹은 비디오 검색을 구현하는것이고

Bookmark 부분은 viewPager 와 tablayout만 붙이고 시간이 생각보다 오래걸려서 어떻게 코딩할지 방향만 잡아놓고

오늘은 여기까지 하는게 나을것 같다.

먼저 나는 크게 폴더 data network presentation 3개로 구분했는데

data 폴더안에는  model  remote  repository 3개로 또 구분하였다.

먼저 model 폴더안에는 SearchImgResponse.kt 파일이있다.

remote 폴더안에는 SearchImgRemoteDatasource 인터페이스 파일이 있다.

repository 폴더 안에는 SearchImgRepositoryImple 파일이있다.

그다음 network 폴더 안에는 RetrofitaImgClient 파일과 AuthorizationInterceptor.kt파일이 있다.

 

자, 여기까지가 우리눈에 보이지 않는 부분인데

network폴더안의 파일들은 눈에보이는 영역과 눈에 보이지 않는 영역 사이에서 통신해주는 역할을 한다.

presentaion 폴더는 눈에 보이는 view에 관한 파일들이 들어있다.

 

먼저 눈제 보이지 않는 data영역부터 코드를 살펴보겠다.

 

이부분은 이미지 검색에 대한 데이터 모델을 정의하는 부분이다. 각 데이터 클래스는 Gson 라이브러리의 @SerializedName 어노테이션을 사용하여 json 키와 매핑되는 속성을 지정한다.

SearchImageResponse: 이미지 검색에 대한 응답 데이터를 나타낸다.

  • meta: 이미지 검색 메타 데이터를 나타내는 MetaResponse 객체이다.
  • documents:이미지 검색 결과를 나타내는 ImageDocumentResponse 객체의 리스트이다.

 

MetaResponse: 이미지 검색 메타 데이터를 나타낸다.

  • totalCount: 검색 결과의 총 개수를 나타낸다.
  • pageableCount:페이지별로 표시 가능한 결과의 갯수
  • isEnd:검색 결과가 끝났는지 여부를 나타낸다.

ImageDocumentResponse: 각 이미지에 대한 세부 정보를 나타낸다.

  • collection: 이미지가 속한 컬렉션을 나타낸다.
  • thumbnailUrl: 이미지의 썸네일 URL
  • imageUrl:이미지의 원본 URL
  • width: 이미지의 너비
  • height: 이미지의 높이
  • displaySitename: 이미지를 제공하는 사이트의 이름
  • docUrl: 이미지에 대한 문서 URL을 나타냄
  • datetime: 이미지가 생성된 날짜와 시간

해당 코드는 Retrofit을 사용하여 이미지 검색에 대한 네트워크 통신을 처리하기 위한 클라이언트를 설정하는 파일이다.

또한 싱클톤 패턴을 구사하여 앱 전반에 걸쳐 하나의 인스턴스만 사용할 수 있다.

 

BASE_URL 상수

  • 이미지 검색 api의 기본 URL을 나타낸다. 

okHttpClient 속성

  • OkHttpClient를 생성한다. 이 클라이언트는 Retrofit에서 네트워크 요청을 처리할 때 사용된다.
  • AuthorizationInterceptor 를 추가하여 네트워크 요청에 사용될 인증 정보를 설정한다.

retrofit 속성

  • Retrofit을 설정한다.
  • baseUrl() 메서드를 통해 기본 url을 설정한다.
  • client() 메서드를 통해 앞서 생성한 OkHttpClient 를 설정한다.
  • JSON 데이터를 Kotlin 객체로 변환하기 위해 Gson 컨버터를 추가한다.

search 속성

  • Retrofit을 사용하여 생성된 인터페이스인 SearchImgRemoteDatasource 의 인스턴스를 반환한다.
  • 이 인터페이스는 이미지 검색에 필요한 원격 데이터를 제공한다.

 

SearchImgRemoteDatasource 인터페이스

  • 이미지 검색에 필요한 원격 데이터를 제공하기 위한 메서드를 제공한다.

 

getSearchImage 메서드

  • @GET 어노테이션을 사용하여 HTTP GET 요청을 정의한다.
  • suspend 키워드를 사용하여 코루틴에서 호출할 수 있도록 지정한다.
  • @Query 어노테이션을 사용하여 쿼리 매개변수를 정의한다.
  • query: 이미지 검색어를 나타낸다.
  • sort:검색 결과 정렬 기준을 나타낸다.
  • page: 검색 결과 페이지를 나타낸다.
  • size: 한 페이지에 표시할 검색 결과 수를 나타낸다.

메서드의 반환형은 SearchImageResponse이고 , 이는 이미지 검색 결과에 대한 데이터 모델을 나타내는 클래스이다.

이 코드는 이미지 검색과 관련된 데이터를 가져오는 레포지토리를 구현하는 클래스이다.

 

SearchImgRepositoryImpl 클래스

  • SearchImgRepository 인터페이스를 구현한다.
  • 생성자에서 SearchImgRemoteDatasource를 주입받는다. 이를 통해 원격 데이터를 가져올 수 있다.

getSearchImage 메서드

  • suspend 키워드를 사용하여 코루틴을 호출할 수 있도록 지정한다.
  • 주어진 검색 쿼리, 정렬 기준, 페이지 및 결과 수에 따라 이미지 검색을 실행한다.
  • remoteImgDatasource.getSearchImage()를 호출하여 원격 데이터를 가져온다.
  • 가져온 데이터를 애플리케이션의 내부 엔티티 형식으로 변환하기 위해 .toEntity()를 호출한다.

이 코드는 OkHttp의 Interceptor를 구현하여 네트워크 요청에 API 키를 추가하는 역할을 한다.

AuthorizationInterceptor 클래스

  • Interceptor 인터페이스를 구현하고, 이를 통해 OkHttp의 Interceptor로 동작할 수 있다.
  • 생성자에서 api키를 받아온다.

intercept 메서드

  • 네트워크 요청을 가로채고 조작하기 위한 메서드이다.
  • chain.request()를 호출하여 현재의 원본 요청을 가져온다.
  • 가져온 요청에 대해 새로운 요청을 만들기 위해 newBuilder()를 사용한다.
  • Authorization 헤더에 API 키를 추가한다. 여기서는 Kakao API를 사용하기 때문에 "KakaoAK"를 접두어로 사용하고, 이어서 API 키를 추가한다.
  • 새로운 요청을 만들고 이를 chain.proceed()를 통해 다음 인터셉터로 전달한다.

이러한 방식으로, 이 Interceptor는 모든 네트워크 요청에 인증 정보를 추가하여 보안이 유지되는 것을 보장한다.

이렇게 함으로써 서버는 요청의 유효성을 확인하고 권한이 있는 사용자에게만 데이터를 제공할 수 있다.

그리고 presentation계층은 여태껏 화면에 적용하는 파일들이라서 다음 북마크 기능을 구현할때

블로그에  기술해봐야할것 같다.

728x90