시간 정지 주문의 이야기: Kotlin이라는 마법 세계에, 마법사와 마녀들은 자주
포션을 만들거나 생명체를 소환하는 등 시간이 오래 걸리는 마법 주문을 행하곤 합니다
각각의 작업이 끝나길 기다리면서
그들은 시간을 멈추고 다른 작업들을 지체없이 진행하길 바랐습니다
여기서 바로 일시 중지 주문의 역할이 중요해졌습니다
일시 중지 주문은 시간 정지 주문과 비슷합니다
시전되면 주문 시전자가 전체 마법 의식 스레드를 차단하지 않고
함수(function)의 실행을 일시 중지할 수 있습니다
여기서 thread는 main thread, UI thread의 비유입니다
이 긴 작업이 완료되면 함수는 중단된 부분부터 재개될 수 있습니다
따라서 기술적인 측면에서 non-blocking 중지 함수는 스레드를 막지 않고
대신에, co-routines execution을 중지합니다
결과가 준비되면 coroutine은 coroutine context를 재시작합니다
따라서 일시 중지 함수는 coroutine이나 다른 정지 함수에 의해서만 시전될 수 있습니다
이것은 비동기 프로그래밍 유연성에 대한 Kotlin의 핵심적인 접근 방식입니다
일시 중지된 동안, 다른 작업이나 함수는 실행될 수 있기에 특히 사용자 인터페이스가 있는
앱에서 리소스를 더 잘 활용하고 응답성을 향상합니다
그냥 짧은 이야기 였습니다
이제 프로젝트로 돌아가서 우리 앱에 이러한 개념을 적용하는 방법에 대해 보겠습니다
그러므로, 또 다시 새 파일 하나를 만들겠습니다
그래서 새 Kotlin 파일 클래스를 만듭니다
이번 것은 파일로 쓸 것입니다
인터페이스를 사용할 수는 있겠지만 파일로 해도 괜찮을 것입니다
파일을 사용해봅시다
이번 것은 ApiService라고 이름 짓겠습니다
자 가봅시다
이제 이 파일 안에 인터페이스를 만듭니다
인터페이스 키워드를 사용해서 인터페이스를 생성하겠습니다
아주 얼마 전에 인터페이스에 대해서 다뤘습니다
이제 해당 인터페이스가 실제로 어떻게 작동하는지 보겠습니다
ApiService라는 인터페이스를 만들 것입니다
이 인터페이스의 일은 하나의 함수를 포함하는 것입니다
그 함수는 서스펜드 함수(suspend function)입니다
이제 서스펜드 함수는 getCategories라는 이름을 얻고 CategoriesResponse를 반환(return)할 것입니다
데이터를 얻기 위해 말입니다
우리가
웹사이트를 호출할 때, GET 키워드를 사용해야 합니다
이제 이 @GET을 사용하면 get 키워드를 사용하도록 해줍니다
이 기능은 retrofit2.http에서 왔습니다
그래서 이 GET는 http요청을 수행하도록 해줍니다
이제 http 요청이 어디로 가야하는 지를 정의해야 합니다
이번 경우에는 categories.php로 가야합니다
이제 이 @GET을 사용하기 때문에 이 import가 추가가 되었습니다
그럼 이 GET(categories.php)가
어디서 온것인거냐 하면
우리가 사용한 MealDB에서 왔습니다
보시면 categories.php라는 웹사이트가 있습니다
이것은 php파일입니다만
우리랑은 상관이 없습니다
우리가 기본적으로 관심 있어야 하는 것은 엔드포인트입니다
이는 우리가 GET하기를 바라는 것, 바라는 파일의 이름입니다
그래서 우리는 이 categories.php라고 하는 파일이
필요합니다
그리고 다른 부분은 또 다른 곳에서 정의할 것입니다
따라서 이 링크는 우리가 retrofit을 이용해서 baseURL을 사용할 것입니다
여기 이것을 말입니다
그러고나서 그것을 이 categories.php에 연결합니다 왜냐하면 나중에 baseURL을 다른 많은 용도로
사용할 수 있기 때문이고 그것이 왜 우리가 호출하고 이 방식을 사용할 이유입니다
이제 우리 프로젝트로 돌아가봅시다
이제 categories.php를 get해서 카테고리 가져오기를 사용할 것입니다
CatergoryResponse를 get하기 위해서 말입니다
categoryResponse가 무엇인지 기억나십니까?
categoryResponse라고 부르는 데이터 클래스를 다뤄본적이 있습니다
설정을 해줬었고
여기에 포함된 것은 단지 카테고리 항목의 리스트입니다
앱 내부에 표시할 수 있도록 Api에서 로드하려는 항목이기 때문입니다
이제 우리는 getCategories를 사용합니다
이 GET 키워드는 특정 URL에 요청되어야 하는 요청의 유형을 특정하는데 사용됩니다
우리의 경우, categories.php URL은 get 요청이 보내질 엔드포인트를
나타냅니다
그래서 엔드포인트는 기본적으로 URL의 마지막 부분입니다
그리고 retrofit은 이러한 어노테이션을 사용합니다
그래서 예를들어 네트워크 요청을 하기 위한 필요 코드를 생성하기 위한
이 @기호, 이 @get은 특정된 URL에 get요청을 보내고 응답 데이터를 처리합니다
그리고 이것이 바로 이 retrofit의 기능입니다
우리 스스로 이것을 다룰 필요는 없습니다
이제 suspend 키워드를 살펴봅시다
API를 호출하는 이 suspend 키워드는 비용이 많이 드는 작업입니다
이는 인터넷 속도, 데이터 크기 등 여러가지 요인에 의해서 사용자 인터페이스의 UI에
데이터를 표시하는 데 평소보다 더 오래 걸릴 수 있기 때문입니다
이제 이러한 종류의 작업은 비동기식으로 처리되는데, 대시 시간 동안 사용자를
지루하게 만드는 것을 피하기 위해 백그라운드에서 처리된다는 것입니다
이것이 바로 suspend 키워드가 사용되는 곳입니다
이는 cocurrency(동시성)를 간단하고 구조화된 방식으로 관리하는 방법을 제공하는 coroutine API의 일부입니다
기본적으로 UI가 UI스레드를 관리하는 것 처럼 여러 작업을 동시에 실행하는 방식 말입니다
말하자면 UI에서 발생하는 모든 작업을 처리합니다
그렇지만 UI 스레드에서 많은 시간이 걸리는 작업을 실행하는 때에는 UI가
정지되기 시작하며 이는 결코 좋은 접근 방식이 아닙니다
그러니까 절대 그렇게 하시면 안 됩니다
이는 우리가 일시 중지를 사용하는 이유이고 그러면 시간이 얼마나 걸릴지 모르기에
데이터 로딩과 같이 느리거나 오래 걸리는 코드 실행과 같은 느린 계산이나 느린 작업을
실행할 수 있습니다
그래서 suspend 함수는 그저 "알겠습니다 걱정 마세요"라고 말합니다
실행이 끝나게 되면 다시 돌아와서 백그라운드에서 실행되거나
응답을 기다릴 것입니다
이제 키워드 coroutines을 사용하지 않습니까
이제 coroutines에 대해 조금 더 알아봅시다
Coroutines 은 Kotlin의 강력하고 가벼운 동시성 프레임워크이며
비동기 및 비차단, 차단 작업을 처리하기 위해서 특별하게 설계되었습니다
웹에서 케테고리를 가져오는 것과 마찬가지로 카테고리는 네트워크 요청과 같은 작업을 수행하는 데
자주 사용됩니다
말씀 드린것처럼 UI 스레드인 메인 스레드를 차단없이 데이터베이스를 읽고 쓰거나
시간이 많이 걸리는 작업을 처리하는 것입니다
잠재적으로 시간이 많이 소요되는 작업을 백그라운드에서 실행함으로써 효율적이고 반응이 빠른
사용자 인터페이스를 촉진합니다
그러면 이 키워드는 getCategories 함수 수행에 어떤 역할을 할지 아십니까?
데이터가 검색될 때까지 인터페이스의 응답성을 유지하면서 백그라운드에서 이를 처리합니다
이제 이것이 우리가 사용하는 인터페이스입니다
이제 우리는 전체 호출, service를 완성해야합니다
Service는 어떻게 설정하겠습니까?
보여드리겠습니다
retrofit 객체를 만들어야 하기 때문에 retrofit을 다시 사용합니다
좋습니다
전에 retrofit을 다뤄본적 있습니다
이제 이 retorfit은
몇가지 사항들이 필요합니다
So 우리가 사용할 수 있는 builder가 있는데, retrofit을 import 해야 합니다
retrofit을 import 해봅시다
보시다시피 http 요청을 하게 해줄, 특히 GET 요청말입니다 그것을 위해 http.GET을 import 했습니다
Post와 같은 다른 요청들도 있습니다
우리는 그저 데이터를 받을 뿐
웹에 데이터를 공유하려면 post를 사용해야 하는데 이 프로젝트에서는 사용하지 않습니다
그런 다음 baseURL을 사용해서 retrofit URL을 build해야합니다
앞서 설명한 것처럼
여기서 이 부분을 웹사이트에서 복사해야 합니다
따라서 이것이 우리가 사용해야 하는 baseURL입니다
그러니 이 부분을 복사해서 여기에 붙여 넣기하겠습니다
여기서는 조금 더 눈에 띄게 하겠습니다
그래서 이것이 baseURL입니다
이제 여기에 추가해줄 것이 있습니다
여기 우리가 추가할 수 있는 Dot(.)이 있습니다
여기에서 우리가 했던 것과 동일하게 마지막에 추가해 줍니다
그래서 .baseURL을 작성합니다
이는 함수 위에 함수 위에 함수를 적용하는 것과 마찬가지입니다
앞서 말씀드렸듯이 Kotlin의 모든 것은 객체에 대한 함수를 호출할 수 있는 객체입니다
이해가십니까?
그래서 여기에서는 baseURL에 converterFactory를 추가해 build해줍니다
제가 하려는 작업은 여기에 GsonConverterFactory.create를
추가해주는 것입니다
보시는 것처럼 build를 할 것인데 이 코드가 하는 일은
우리가 얻는 모든 것을 Kotlin의 객체로 변환할 수 있도록
baseURL에 대한 연결을 형식으로 build하자는 것입니다
이제 recipeService를 사용해서 이를 수행할 수 있습니다
이를 기반으로 service를 설정 중입니다
그래서 저는 이 retrofit 객체를 만들고 이제 설정한 API 서비스를 이용하여
객체를 만들겠습니다
여기서는 Apiservice:class.java를 사용합니다
이것은 기본적으로 우리가 해당 서비스를 필요해 한다는 것을 의미합니다
이를 통해서 categories.php 파일을 얻을 수 있고 이를 JSON 객체로 변환하면
사용할 수 있습니다
많은 일들이 일어나고 있습니다
코드 몇 줄이지만
정말 효율적입니다
그래서 여기 코드 몇 줄에 많은 일들이 일어나고 있고
그러나 기본적으로 이를 통해서 우리는 앱을 계속 사용하고 데이터를 얻고
이를 나중에 표시할 수 있습니다
따라서 이 retrofit builder는 엔드포인트를 준비시키고 JSON 컨버터를 추가하는 일을 합니다
그런 다음 creat 메소드를 제공합니다
이는 서비스 메소드에 대한 액세스 권한을 위함입니다
예를 들어 우리의 getCategories가
okay
이것이 우리가 설정한 recipeService 입니다
그리고 우리는 여러 다른 서비스들을 설정할 수 있습니다
그러나 우리는 예를 들어, ApiService에 관심을 두기에 예를 들어, getCategories를 사용합니다
만일 다른 것들을 GET하길 바란다면 이 인터페이스를 수정하면 됩니다
그리고 이는 저의 강의에서 나중에 해보게 될 내용이 되겠습니다
하지만 지금으로써는 우리가 필요로하는 것은 지금까지 내용입니다
오늘 영상은 여기까지가 되겠습니다
다음 영상에서 뵙겠습니다