삼코딩@samcoding
Dev Hub

Wagmi v3로 시작하는 극도의 경량화 Web3 프론트엔드 아키텍처
기존 Web3 프론트엔드 앱은 여러 지갑 SDK가 복잡하게 얽히면서 번들 크기가 비대해지는 고질적인 문제를 안고 있었습니다. 2026년 출시된 Wagmi v3와 Viem v2.54.x는 이러한 모놀리식 구조에서 탈피하여, 개발자가 필요한 커넥터만 선택적으로 주입하는 완전한 모듈러 의존성을 지향합니다. 불필요한 패키지를 걷어내고 트리 쉐이킹 효율을 극대화해 초경량 dApp 프론트엔드를 구축하는 핵심 아키텍처 변화와 실무 패턴을 살펴보겠습니다.
의존성 다이어트: 선택적 피어 디펜던시 모델
Wagmi v3의 가장 결정적인 구조 변화는 지갑 커넥터를 코어 라이브러리에서 분리하여 선택적 피어 디펜던시(Optional Peer Dependency) 모델로 전환한 것입니다. 이전 버전에서는 메타마스크나 코인베이스 같은 특정 지갑만 지원하려 해도 사용하지 않는 수많은 지갑 SDK까지 한 번에 설치해야 했습니다.
이제 개발자는 dApp에 실제로 탑재할 지갑 커넥터 패키지만 명시적으로 설치하여 프로덕션 번들 크기를 극적으로 줄일 수 있습니다. 예를 들어, 새로운 EIP-1193 사양에 부합하는 경량화된 메타마스크 연결을 구성하려면 코어 라이브러리와 함께 개별 커넥터 패키지를 직접 설치하여 제어합니다.
최근 주요 서드파티 UI 라이브러리들이 새로운 피어 디펜던시 아키텍처로 전환하는 과정에서 호환성 업데이트가 지연되는 현상이 발생하고 있습니다. 이 때문에 프론트엔드 최적화와 안정성을 중시하는 프로덕션 환경에서는 무거운 외부 UI 킷에 의존하는 대신, useConnect 훅을 활용하여 가벼운 커스텀 인젝티드 커넥터 UI를 직접 설계해 적용하는 추세입니다.
계정 중심에서 연결 중심으로: useConnection의 도입
Wagmi v3는 단순한 지갑 주소 조회에서 벗어나 EIP-1193 공급자 연결 사양을 명확히 반영하기 위해 기존 useAccount를 useConnection 훅으로 개편했습니다. dApp과 지갑 간의 실제 통신 세션과 활성화된 연결 상태를 프론트엔드 아키텍처 관점에서 더 정확하게 정의하기 위한 변화입니다.
기존에는 멀티 체인 환경에서 단순히 지갑 주소의 유무만 확인하다 보니 연결이 다소 불안정할 때 예외 처리가 까다로웠습니다. 이제는 활성화된 지갑 연결 세션의 다중 체인 상태와 커넥터 객체를 직접 제어할 수 있어, 예기치 못한 연결 유실이나 네트워크 전환 오류에 한층 정밀하게 대응할 수 있습니다.
TanStack Query와 완벽한 정렬: Mutation 기반 트랜잭션
Wagmi v3는 트랜잭션 전송이나 메시지 서명처럼 블록체인 상태를 변경하는 액션 기반 훅들의 인터페이스를 TanStack Query의 Mutation 표준으로 완전히 통일했습니다. useWriteContract, useSignMessage, useSendTransaction 등의 훅이 이제 고유한 함수명 대신 표준 mutate 및 mutateAsync를 내장한 mutation 객체를 직접 반환합니다.
이전에는 여러 훅을 동시에 쓸 때 반환되는 쓰기 함수와 로딩 상태의 명칭이 서로 겹쳐서 일일이 별칭으로 구조 분해 할당을 해야 하는 번거로움이 있었습니다. 이제는 훅이 반환하는 객체를 변수에 그대로 담아두고, 점 표기법을 통해 직관적으로 제어할 수 있어 비대해지던 컴포넌트 코드가 깔끔하게 정리됩니다.
이렇게 정렬된 Mutation 기반 모델 덕분에 각 트랜잭션의 isPending, error 같은 세부 상태를 독립적으로 다루기 쉬워졌습니다. 또한 다른 TanStack Query 기능과의 생태계 호환성도 극대화되었습니다.
트리 쉐이킹 최적화: useClient와 useConnectorClient
Viem과의 통합 아키텍처에서도 번들 최적화를 위한 중대한 변화가 있었습니다. 기존에 흔히 쓰이던 usePublicClient와 useWalletClient는 클라이언트 인스턴스에 내장된 수많은 메서드를 통째로 불러오기 때문에 프론트엔드 트리 쉐이킹을 원천적으로 방해합니다. Wagmi v3는 이 문제를 해결하기 위해 최소한의 인터페이스만 갖춘 경량 클라이언트를 반환하는 useClient와 useConnectorClient 사용을 권장합니다.
이 최적화의 핵심은 클라이언트 자체에서 메서드를 호출하는 대신, viem/actions에서 필요한 개별 액션 함수만 직접 가져와 클라이언트를 인자로 주입하는 패턴입니다. 이렇게 하면 개발자가 실제로 호출하는 기능만 최종 번들에 포함되므로, 사용하지 않는 수많은 RPC 메서드와 무거운 내부 로직을 빌드 단계에서 완전히 분리하여 번들 크기를 극적으로 줄일 수 있습니다.
실무에서 이 모듈형 패턴을 적용해 블록 정보를 조회하는 코드는 다음과 같습니다.
이처럼 클라이언트와 액션을 분리하는 함수형 설계는 프로젝트 규모가 커질수록 dApp의 성능과 초기 로딩 속도에 결정적인 차이를 만들어냅니다. 모놀리식 클라이언트 호출을 걷어내고 모듈형 액션 구조를 도입하는 것만으로도 프로덕션 환경에서 가장 최적화된 Web3 프론트엔드를 구축할 수 있습니다.
프로덕션 표준 패턴: 시뮬레이션 후 트랜잭션 전송
실제 프로덕션 환경에서 트랜잭션 실패로 인한 가스비 낭비를 방지하려면 시뮬레이션 후 실행 패턴을 반드시 준수해야 합니다. 온체인 트랜잭션을 전송하기 전에 스마트 계약의 조건과 유효성을 오프체인에서 미리 시뮬레이션하여 계약 롤백 위험을 사전에 차단하는 안전장치입니다.
Wagmi v3에서는 useSimulateContract 훅으로 계약 호출을 먼저 안전하게 검증합니다. 시뮬레이션이 성공하면 반환된 request 객체를 useWriteContract가 반환하는 실행 함수에 전달하여 트랜잭션을 전송합니다. 이 흐름은 TanStack Query의 mutation 동작 모델과 결합하여 트랜잭션의 생명주기를 안정적으로 관리할 수 있게 돕습니다.
이렇게 전송한 트랜잭션은 useWaitForTransactionReceipt 훅과 유기적으로 연결됩니다. 반환받은 트랜잭션 해시를 이 훅에 전달하면 블록체인 네트워크에서 영수증을 수령할 때까지의 대기 상태를 안전하게 추적하고 사용자에게 실시간 피드백을 제공할 수 있습니다.
경량화된 웹 프론트엔드가 만드는 더 나은 사용자 경험
Wagmi v3와 Viem v2.54.x가 제시하는 모듈러 아키텍처는 비대해진 Web3 프론트엔드의 체질을 개선하는 확실한 해법입니다. 불필요한 지갑 커넥터 의존성을 과감히 덜어내고 트리 쉐이킹 최적화와 안전한 시뮬레이션 패턴을 결합하면, 네트워크 환경이 열악한 모바일 기기에서도 매끄럽게 진입할 수 있는 dApp을 만들 수 있습니다.
지금 바로 프로젝트의 package.json을 열어 무겁게 얽혀 있는 의존성부터 점검해 보는 것을 추천합니다. 가볍고 탄탄하게 구축된 프론트엔드 아키텍처는 dApp의 이탈률을 줄이고 실제 온체인 상호작용을 활성화하는 가장 직접적인 안전장치입니다.