데이터 로딩 및 캐싱은 GraphQL에서 중요한 부분이다. 이 두 가지 기능은 성능 최적화를 위한 핵심 기술로서, 네트워크 사용을 줄이고 응답 시간을 빠르게 하는데 중요한 역할을 한다.
GraphQL에서는 종종 여러 데이터 소스에 대해 복잡한 쿼리를 실행해야 할 수 있다. 예를 들어, 사용자가 작성한 글과 댓글, 그리고 그 사용자의 프로필 정보 등을 한 번의 요청으로 불러와야 할 수 있다. 이러한 경우, 효율적인 데이터 로딩 전략을 사용해야 한다.
하나의 방법은 데이터 로더(DataLoader) 패턴을 사용하는 것이다. DataLoader는 Facebook이 개발한 일반적인 캐싱 및 배치 로딩 메커니즘이며, 많은 GraphQL 라이브러리에서 사용된다. DataLoader를 사용하면 동일한 데이터를 여러 번 요청하는 것을 방지하고, 여러 요청을 하나의 배치 요청으로 병합할 수 있다. 이렇게 하면 데이터베이스나 다른 백엔드 시스템에 대한 부하를 줄일 수 있다.
캐싱은 최근에 사용된 데이터를 저장하여 후속 요청의 성능을 향상시키는 기술이다. GraphQL에서는 클라이언트 측과 서버 측 모두에서 캐싱을 사용할 수 있다.
// 서버 측에서 Guava의 LoadingCache를 사용한 예제
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import java.util.concurrent.TimeUnit;
public class UserService {
// User 정보를 저장하는 Cache 정의
private final LoadingCache<String, User> userCache = CacheBuilder.newBuilder()
.expireAfterAccess(10, TimeUnit.MINUTES) // 10분 동안 접근이 없으면 만료
.build(new CacheLoader<>() { // Cache에서 User를 로드하는 방법 정의
@Override
public User load(String id) {
return getUserFromDatabase(id); // 실제로는 DB에서 User 정보를 가져옴
});
public User getUser(String id) {
return userCache.getUnchecked(id); // Cache에서 User를 가져옴
}
private User getUserFromDatabase(String id) {
// DB에서 User 정보를 가져오는 로직 생략
return new User(id, "User name", "[email protected]");
}
}
**LoadingCache**는 제공된 key에 해당하는 데이터가 캐시에 없을 경우 **CacheLoader**를 이용하여 데이터를 로드하고, 캐시에 저장한다.
이렇게 구현하면, getUser 메서드를 호출할 때마다 데이터베이스에 질의를 하지 않고 캐시에서 먼저 User 정보를 가져올 수 있다. 따라서 같은 User 정보에 대해 여러 번의 요청이 발생하더라도 데이터베이스 부하를 줄일 수 있다.