Network/GraphQL

    [Apollo GraphQL] 2. Android에서 Apollo GraphQL 사용 방법 한 번에 정리하기

    환경 세팅 Apollo GraphQL을 사용하기 위해서는 gradle에 설정과 GraphQL에서 사용할 수 있는 schema를 Apollo GraphQL을 사용해 받아올 수 있도록 하는 작업을 해야 한다. Gradle 파일 세팅 1. 모듈 수준의 Gradle에 plugin을 적용한다. plugins { .. id("com.apollographql.apollo3").version("3.1.0") } 2. 모듈 수준의 Gradle의 android 블록에 패키지 이름을 세팅한다. android { .. apollo { packageName.set("com.simpli.graphql") } } 3. 모듈 수준의 main 디렉토리에 graphql 디렉토리를 만든 후 2에서 설정한 패키지명의 폴더들을 만든다. 4...

    [Apollo GraphQL] 1. Apollo GraphQL이란 무엇인가?

    GraphQL Client Library가 필요한 이유 클라이언트에서 GraphQL을 사용하면 서버에서 원하는 데이터를 원하는 필드들만 가져올 수 있다는 장점이 있다. 하지만 클라이언트에서 GraphQL을 사용하기 위해서는 JSON 형태의 데이터를 다시 클라이언트에서 사용할 수 있는 객체로 바꾸기 위해 추가적인 작업을 해주어야 한다. 또한 클라이언트에서 GraphQL 쿼리를 작성하기 위해서 쿼리가 자동완성이 되지 않는다면 모든 필드를 일일히 찾아보고 작성해야 한다. 이러한 한계를 극복하기 위해 나온 것이 바로 GraphQL Client Library이다. GraphQL Client Library는 다양한 종류가 있으며 Kotlin 에서 사용 가능한 GraphQL Client Library의 목록은 아래 ..

    [JVM Garbage Collector] G1 GC 는 왜 효율적인가?

    Java 9 이전의 GC 이전 글에서 GC가 어떻게 일어나는지를 살펴보았다. 이전 글에서 살펴본 GC는 모든 메모리를 랜덤으로 찾아보면서 Memory 상의 객체들 중 Reference(Mark)되지 않은 객체를 GC하며 GC를 할 때마다 살아남은 객체들은 eden -> survivor0 -> survivor1 -> old 영역으로 순서대로 시킨다. G1 GC의 효율성 Region 으로 나누어 제거 Java9+ 부터 기본 GC로 자리잡은 G1 GC에서는 이전의 GC들처럼 일일히 메모리를 탐색해 객체들을 제거하지 않는다. 대신 메모리가 많이 차있는 영역(region)을 인식하는 기능을 통해 메모리가 많이 차있는 영역을 우선적으로 GC 한다. 즉, G1 GC는 Heap Memory 전체를 탐색하는 것이 아닌 ..

    [GraphQL] 9. GraphQL fragment 사용해 query의 중복 제거하기

    GraphQL의 fragment 앞선 글들에서 사용되었던 방법으로는 GraphQL의 특정 블록들을 여러 번 재사용해야 하는 블록의 경우 매번 중복해서 써야한다. 예를 들어 다음 두개 Query들이 있다고 해보자. query QueryFilm1 { film(filmID: 1) { title director producers } } query QueryFilm2 { film(filmID: 2) { title director producers } } 위 쿼리들에서는 title, director, producers들이 중복해서 사용된다. 이 필드들을 하나로 묶어 하나의 필드처럼 쓸 수 있다면 중복을 줄일 수 있을 것이다. GraphQL의 fragment가 바로 이 역할을 한다. GraphQL의 fragment는..

    [GraphQL] 8. @include, @skip 지시문 사용해 필드 값 포함시키거나 제외하기

    지시문이 필요한 이유 앞서 Alias를 사용해 필드명을 변경시키는 방법을 살펴봤다. 하지만 Alias를 사용해 필드명을 변경시키는 것은 데이터를 처리하는데 충분하지 않다. 예를 들어 Kotlin의 sealed class를 상속하는 data class를 사용해 데이터를 받을 경우 특정 데이터를 받을 경우 특정 데이터가 포함되거나 되지 않는 경우를 처리하기 어렵기 때문이다. 예를 들어 다음과 같은 영화 정보를 담는 FilmInfo sealed class가 있다고 해보자. sealed class FilmInfo(){ data class BasicFilmInfo(val filmTitle : String) : FilmInfo() data class FilmInfoWithDirector(val filmTitle :..