3 min read

[T-001] 상태 기반으로 GraphQL 개발하기

상태 정규화 이해하기

상태 정규화라는 건, 많은 개발자들이 DB에서나 다루는 개념이라고 생각하기 쉬운데, 사실 클라이언트 상태 관리에서도 굉장히 중요한 개념이에요. Apollo Client나 Relay 같은 GraphQL 클라이언트들이 내부적으로 정규화된 캐시 구조를 사용하는 것도 이런 이유 때문이에요.

생각해보면 우리가 다루는 데이터는 결국 그래프 구조에요. 사용자가 있고, 그 사용자가 작성한 게시물이 있고, 게시물에 달린 댓글이 있고... 이런 관계들이 복잡하게 얽혀있죠. 전통적인 REST API에서는 이런 관계를 표현하기 위해 중복된 데이터를 여러 번 전송하거나, 여러 번의 API 호출이 필요했어요.

"그래서 여러 번의 API를 하나로 요청으로 묶어서 원하는 데이터를 받을 수 있고, under/over fetching의 문제, API 개발 비용의 문제를 해결하는 게 GraphQL의 장점 아니야?"

맞아요. 더 나아가 GraphQL을 제대로 활용하면, 이런 관계형 데이터를 정규화된 형태로 클라이언트에서 관리할 수 있어요. 예를 들어 특정 사용자의 정보가 여러 곳에서 사용된다고 해도, 캐시에는 단 한 번만 저장되고 참조로 연결되는 거에요. 이렇게 되면 mutation으로 사용자 정보를 수정했을 때, 별도의 캐시 키 관리 없이노드 아이디를 기반으로 그 사용자 정보를 보여주는 모든 UI가 자동으로 동기화돼요.

GraphQL은 단순한 쿼리 언어가 아니라, 클라이언트의 상태 관리 아키텍처를 결정짓는 핵심 요소에요. 이런 관점에서 보면, GraphQL 스키마를 설계하는 것은 단순히 API 인터페이스를 정의하는 게 아니라, 전체 애플리케이션의 상태 모델을 설계하는 작업이 되는 거겠죠.

똑똑하게 mutation을 정의하고 호출하기

보통 mutation을 작성할 때 response로 변경된 객체만 반환하도록 하는 게 일반적이라고 알고 있어요. 예를 들어 사용자 정보를 업데이트하면 업데이트된 User 객체만 반환하는 식이에요.

This post is for subscribers only