| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
- 2022 KAKAO BLIND RECRUITMENT
- producestate
- Java
- genarics
- gradle jdk
- clean coder
- compose
- 무선 페어링
- State
- 안드로이드
- NavHost
- 선언형 ui
- ktor-auth
- rememberupdatedstate
- 양과 늑대
- snapshotflow
- derivedstateof
- mutableStateOf
- 선언형ui
- remembercoroutinescope
- 명령형 ui
- JCF
- 명령형ui
- bottomscaffold
- 자바
- 2989번
- mutablestate
- apollo3
- 2022 kakao blind
- android
- Today
- Total
버미
[안드로이드] GraphQL 사용하기 (Apollo3) 본문
GraphQL을 안드로이드에 적용하기에 앞서, 간단하게 GraphQL이 무엇인지 살펴보고 장단점이 무엇이 있는지 알아보자.
GraphQL
페이스북이 개발한 QL(Query Language, 질의 언어)이다. 대중적으로 사용되고 있는 Rest API의 경우, 서버 측에서 API의 구조를 정해주고 이를 클라이언트 측에서 사용하는 방식이다.
REST API 와 GraphQL의 차이
| REST API | GraphQL | |
| 데이터 요청 방식 | 여러 엔드포인트(/users, /posts)와 HTTP 메서드(GET, POST 등)를 사용하여 요청. | 하나의 엔드포인트(/graphql)를 통해 클라이언트가 원하는 데이터의 구조를 쿼리(Query) 또는 변경(Mutation) 요청으로 정의. |
| 언더페칭 문제 | 필요한 정보를 얻기 위해 여러 API 엔드포인트를 호출해야 하는 경우가 많음 | 하나의 요청으로 여러 개의 관련 데이터를 동시에 가져올 수 있다. |
| 오버페칭 문제 | 필요한 데이터 외에도 서버가 정의한 불필요한 데이터까지 함께 전달될 수 있다. | 클라이언트가 원하는 데이터 필드를 지정하여 최소한의 데이터만 가져온다. |
| HTTP 요청 메서드 | HTTP 메서드(GET, POST, PUT, DELETE 등)에 의존. | 요청이 POST 메서드를 통해 이루어짐. (엔드포인트는 항상 /graphql) |
| 캐싱 | REST API는 URL 기반 캐싱이 쉬워 CDN을 활용한 데이터 캐싱이 효과적. | GraphQL은 요청 구조가 동적이라 URL 기반 캐싱이 어렵지만, Apollo Client와 같은 클라이언트 도구를 통해 클라이언트 측에서 캐싱을 제공. |
| 오류 처리 | HTTP 상태 코드를 사용하여 오류를 나타냄 | 오류는 GraphQL 응답 내에서 처리되며, errors 필드로 제공된다. HTTP 상태 코드가 반드시 사용되지는 않음. |
요약하자면, REST API는 설계가 간단하고, URL 기반의 캐싱과 HTTP 상태 코드에 친숙하며 단점으로는 복잡한 데이터 관계 처리 시 오버페칭과 언더페칭 문제가 발생할 수 있다는 점이다. GraphQL은 클라이언트가 필요한 데이터만 요청이 가능하며, 하나의 요청으로 데이터 처리와 스키마 확장이 쉽다는 것이다. 단점으로는 캐싱이 어렵고, 학습곡선이 있으며 단순한 애플리케이션에는 과할 수 있다.
라이브러리 및 초기 세팅
1. Apollo3 라이브러리 Implementation
먼저, com.apollographql.apollo3:apollo-runtime 의 최신 버전을 Implementation한다. 이후 app 수준의 그래들 파일의 plugins 블럭에 Implementation한 버전과 동일한 버전을 작성한다.
- App 수준 Gradle
plugins {
...
id("com.apollographql.apollo3") version "x.y.z"
}
dependencies {
...
implementation("com.apollographql.apollo3:apollo-runtime:x.y.z")
}
2. App 수준 Gradle 파일 내부에 apollo 블럭 작성
apollo(apollo2)와 apollo3의 블럭을 작성하는 방법이 차이가 나기 때문에 Implementation하고자 하는 apollo버전을 확인한 후 작성한다.
apollo {
service("graphql") {
packageName.set("com.example.packagename")
schemaFiles.from("src/main/graphql/schema.graphqls")
// 스키마 파일 경로, apollo인 경우 schemaFile.set(file("src/main/graphql/schema.graphqls"))
srcDir("src/main/graphql")
// GraphQL 쿼리 경로, apollo인 경우 sourceFolder.set("src/main/graphql")
}
}
경로는 따로 지정하여 사용해도 된다.
참고
GraphQl 플러그인을 사용하면 폴더나 graphql.config.yml 를 자동으로 만들어 준다.
graphql.config.yml 의 코드에서 schema.graphql로 되어있는데, 이것을 schma.graphqls로 확장자를 일치시켜줘야 올바르게 반영할 수 있다.
schema: schema.graphqls
documents: '**/*.graphql'
3. 관련 코드 작성
이제 서버에 맞는 스키마와 쿼리를 이전에 App 수준의 Gradle 파일의 apollo 블럭에 작성한 곳에 만들어 빌드하면 apollo3 라이브러리가 build/source/apollo/graphql 폴더 내에 파일을 만들어 준다. 따라서 빌드를 하기 전에는 관련 코드를 사용하는 곳에 에러가 발생할 수 있다.
- schema.graphqls:
GraphQL 서버의 스키마 정의를 포함한다. 서버에서 제공하는 모든 타입, 쿼리, 뮤테이션, 그리고 서브스크립션에 대한 정보를 명시한다. - launches.graphql:
클라이언트가 서버에 요청하기 위해 작성하는 GraphQL 쿼리 문서. 필요한 데이터만 명시하여 요청한다.
스키마 관련 작성 법은 해당 사이트에서 자세히 친절히 나와있어서 해당 사이트에서 학습하면 된다.
'안드로이드' 카테고리의 다른 글
| [안드로이드] Compose Navigation 개괄적 이해 (0) | 2025.07.09 |
|---|---|
| [안드로이드] API 35 버전 업데이트 정리 (0) | 2025.06.28 |
| [Jetpack Compose] Side Effect ( 2 / 2 ) (0) | 2024.12.06 |
| [JetPack Compose] State, remember 그리고 MutableStateOf (0) | 2024.12.03 |
| [Jetpack Compose] Side Effect ( 1 / 2 ) (0) | 2024.12.01 |