Aggregation API 도입 (네트워크 최적화, 서버 부하, 의존성 관리)
- 공유 링크 만들기
- X
- 이메일
- 기타 앱
처음 마이크로서비스 환경에서 개발할 때 클라이언트가 여러 API를 동시에 호출하는 구조를 보고 당황했던 기억이 있습니다. 하나의 대시보드 화면을 띄우는데 API 요청이 5개씩 나가는 걸 보면서 '이게 맞나?' 싶었습니다. 그래서 도입하게 된 것이 바로 Aggregation API였습니다. 여러 서비스의 데이터를 서버에서 한 번에 묶어서 내려주는 방식인데, 네트워크 호출 횟수는 확실히 줄었지만 동시에 서버 부하라는 새로운 고민거리가 생겼습니다.
네트워크 최적화
Aggregation API의 가장 큰 장점은 클라이언트 요청 횟수를 대폭 줄일 수 있다는 점입니다. 제가 작업했던 프로젝트에서는 사용자 정보, 주문 내역, 포인트 잔액, 추천 상품 등 4개의 서비스에서 데이터를 가져와야 했습니다. 기존 구조에서는 클라이언트가 각각 API를 호출했기 때문에 최소 4번의 HTTP 요청이 발생했고, 각 요청마다 네트워크 레이턴시(Latency)가 더해졌습니다. 여기서 레이턴시란 데이터가 출발지에서 목적지까지 도달하는 데 걸리는 시간을 의미합니다. 특히 모바일 환경에서는 네트워크 상태가 불안정한 경우가 많아서 이 지연 시간이 사용자 체감 속도에 직접적인 영향을 줬습니다.
Aggregation API를 도입한 후에는 클라이언트가 단 한 번의 요청만으로 필요한 모든 데이터를 받을 수 있게 되었습니다. 네트워크 왕복 횟수가 줄어들면서 화면 로딩 시간이 약 30% 정도 개선되었습니다. 사용자 입장에서는 대시보드가 훨씬 빠르게 뜨는 느낌을 받았고, 실제로 이탈률도 소폭 감소하는 효과가 있었습니다. 다만 이건 네트워크 환경이 좋지 않은 사용자에게 특히 유리한 구조라는 점을 염두에 둬야 합니다.
서버 부하
네트워크 최적화라는 장점이 있는 반면, Aggregation API는 서버에 새로운 부담을 안겨줍니다. 클라이언트가 여러 번 호출하던 작업을 이제 서버가 대신 처리하기 때문입니다. 제 경험상 이건 예상했던 것보다 훨씬 민감한 문제였습니다. 서버가 여러 서비스를 동시에 호출하면서 내부 네트워크 트래픽이 증가했고, 특정 시간대에는 서버 응답 시간이 오히려 늘어나는 현상도 발생했습니다. 특히 호출해야 하는 서비스 수가 많을수록 서버의 동시 처리 부담은 기하급수적으로 커집니다.
이 문제를 해결하기 위해 저희 팀은 몇 가지 전략을 적용했습니다. 우선 자주 변하지 않는 데이터는 Redis 같은 캐시(Cache) 계층에 저장해두고 재사용했습니다. 캐시란 한 번 조회한 데이터를 임시 저장소에 보관해두고 같은 요청이 들어오면 원본 서비스를 거치지 않고 바로 응답하는 방식을 말합니다. 또한 비동기 처리 방식을 적용해 여러 서비스 호출을 병렬로 실행하도록 구조를 개선했습니다. 그 결과 서버 부하를 어느 정도 완화할 수 있었지만, 여전히 Aggregation API를 운영하려면 서버 리소스를 충분히 확보해야 한다는 사실을 체감했습니다. 일부 개발자들은 "차라리 클라이언트가 직접 호출하는 게 낫지 않나"라고 생각하는 분들도 있는데, 저는 사용자 경험 개선이라는 측면에서 서버 부하는 감수할 만한 트레이드오프라고 봅니다.
실제로 한국정보통신기술협회(TTA)에서 발표한 자료에 따르면, 마이크로서비스 환경에서 API 통합 계층을 두는 경우 클라이언트 응답 시간은 평균 25% 감소하지만 서버 CPU 사용률은 15~20% 증가하는 경향이 있다고 합니다. 이 수치는 제가 현장에서 경험한 것과 거의 일치합니다.
의존성 관리
Aggregation API를 운영하면서 가장 까다로웠던 부분은 의존성 관리였습니다. 여러 서비스에 동시에 의존하는 구조이다 보니 특정 서비스 하나만 응답이 느려져도 전체 응답 시간에 영향을 주는 문제가 발생했습니다. 실제로 한 번은 추천 상품 서비스에서 데이터베이스 쿼리가 지연되면서 Aggregation API 전체가 5초 이상 응답하지 못하는 상황이 벌어졌습니다. 사용자 입장에서는 화면이 통째로 안 뜨는 것처럼 느껴졌고, 고객 문의가 급증했습니다.
이 경험 이후 저희는 서비스 간 의존성을 좀 더 세밀하게 설계하기 시작했습니다. 구체적으로는 다음과 같은 방식을 적용했습니다.
- 타임아웃(Timeout) 설정: 각 서비스 호출마다 최대 대기 시간을 지정하고, 이를 초과하면 기본값이나 캐시된 데이터를 반환하도록 처리했습니다.
- 서킷 브레이커(Circuit Breaker) 패턴 도입: 특정 서비스가 연속으로 실패하면 일시적으로 해당 서비스 호출을 차단하고 대체 응답을 제공하는 방식입니다. 이를 통해 장애가 전파되는 것을 막을 수 있었습니다.
- 우선순위 기반 데이터 로딩: 사용자 정보나 주문 내역처럼 필수적인 데이터는 반드시 가져오고, 추천 상품처럼 부가적인 데이터는 실패해도 화면이 뜨도록 구조를 분리했습니다.
일반적으로 Aggregation API는 모든 데이터를 한 번에 내려준다고 알려져 있지만, 제 경험상 일부 데이터는 선택적으로 처리하는 게 더 안정적입니다. 특히 외부 서비스나 응답 시간이 긴 서비스에 의존할 때는 장애 격리 전략을 반드시 세워두는 게 좋습니다.
정리하면, Aggregation API는 네트워크 최적화라는 분명한 장점이 있지만 동시에 서버 부하와 의존성 관리라는 새로운 과제를 안겨줍니다. 제가 여러 프로젝트를 거치면서 느낀 건, 이 구조가 만능 해결책은 아니라는 점입니다. 클라이언트 호출 패턴, 서비스 특성, 인프라 여건을 종합적으로 판단해서 선택적으로 도입하는 게 현실적입니다. 만약 여러분도 Aggregation API 도입을 고민하고 있다면, 우선 병목이 되는 화면이나 기능부터 시범 적용해보고 효과를 측정한 뒤 범위를 확대하는 방식을 추천합니다.
- 공유 링크 만들기
- X
- 이메일
- 기타 앱
댓글
댓글 쓰기