Wagmi v3 모바일 웹3 연동: 백그라운드 탭 중단과 EIP-712 서명 오류 해결 패턴

삼코딩

@samcoding

Wagmi v3 모바일 웹3 연동: 백그라운드 탭 중단과 EIP-712 서명 오류 해결 패턴

Wagmi v3 모바일 웹3 연동: 백그라운드 탭 중단과 EIP-712 서명 오류 해결 패턴

모바일 브라우저에서 디앱을 빌드할 때 개발자를 가장 괴롭히는 문제는 백그라운드 전환 시 발생하는 연결 끊김과 모바일 지갑의 불안정한 서명 처리입니다. 앱이 백그라운드로 전환되면서 자바스크립트 실행이 일시 중단되고 웹소켓 세션이 끊기는 현상은 모바일 웹3 환경의 고질적인 문제입니다. 최근 출시된 Wagmi v3와 메타마스크 커넥트 EVM은 이러한 환경적 한계를 극복할 수 있는 세션 복구 및 엄격한 타입 규격을 제공합니다. 이번 가이드에서는 모바일에서도 끊김 없는 사용자 경험을 보장하는 Wagmi v3 기반의 프로덕션 레벨 구현 패턴을 정리했습니다.

useConnection과 피어 의존성: Wagmi v3가 선택한 극단적인 경량화

Wagmi v3는 번들 크기를 줄이고 라이브러리 제어권을 개발자에게 온전히 돌려주기 위해 내장형 커넥터를 피어 의존성 구조로 완전히 전환했습니다. 이제 메타마스크나 월렛커넥트 같은 핵심 커넥터조차 디앱 프로젝트의 종속성에 개발자가 직접 명시해서 설치해야 합니다.

이와 함께 연결 상태를 관리하는 핵심 API 역시 대폭 개편되었습니다. 기존의 useAccount 훅은 연결 상태 제어에 초점을 맞춘 useConnection으로 대체되었으며, 지갑을 연결하는 내부 로직은 탠스택 쿼리의 뮤테이션 패턴을 준수하도록 설계가 최적화되었습니다.

가장 중요한 변화는 메타마스크 연동 시 레거시 SDK를 버리고 새로운 @metamask/connect-evm 패키지를 전면에 도입했다는 점입니다. 이 새로운 라이브러리는 CAIP-25 표준을 기반으로 디앱과 지갑 간의 통신 프로토콜을 처리하므로, 그동안 모바일 환경에서 잦은 오류를 유발했던 다중 체인 세션 관리와 플랫폼별 딥링크 연결의 신뢰성을 근본적으로 해결해 줍니다.

모바일 백그라운드 탭 차단 극복: Page Visibility API와 useReconnect 연동

모바일 웹 브라우저는 배터리와 메모리를 절약하기 위해 백그라운드로 전환된 탭의 자바스크립트 실행을 강력하게 통제합니다. 이 과정에서 지갑 앱과 dApp 사이의 통신을 담당하는 웹소켓 릴레이 세션이 강제로 해제되면서, 사용자가 브라우저로 복귀했을 때 지갑 연결이 끊어지는 고질적인 문제가 발생합니다.

이를 극복하기 위해 Wagmi v3는 세션 재연결을 수동으로 트리거할 수 있는 useReconnect 훅을 제공합니다. 브라우저의 화면 활성화 여부를 감지하는 Page Visibility API와 이 훅을 조합하면, 사용자가 브라우저 탭으로 복귀하는 즉시 백그라운드에서 유실된 연결을 자동으로 복구할 수 있습니다.

다음은 React 환경에서 페이지 시각 상태 변화를 감지해 유실된 세션을 자동으로 재연결하는 커스텀 훅 예시입니다.

typescript
import { useEffect } from 'react';
import { useReconnect } from 'wagmi';

export function useMobileReconnect() {
  const reconnect = useReconnect();

  useEffect(() => {
    const handleVisibilityChange = () => {
      if (document.visibilityState === 'visible') {
        reconnect.mutate();
      } 
    };

    document.addEventListener('visibilitychange', handleVisibilityChange);
    return () => {
      document.removeEventListener('visibilitychange', handleVisibilityChange);
    };
  }, [reconnect]);
}

이 패턴을 애플리케이션 최상단 컴포넌트에 적용하면 유저가 브라우저를 다시 여는 순간 어떠한 수동 조작 없이 세션이 원래대로 돌아옵니다. 모바일 사용자에게 네이티브 앱 수준의 매끄러운 멀티태스킹 환경을 제공하기 위해 프로덕션 배포 시 필수적으로 구축해야 하는 모범 사례입니다.

엄격해진 EIP-712 서명: useSignTypedData 실전 오류 예방

모바일 지갑의 인앱 브라우저나 딥링크 환경에서 가장 빈번하게 발생하는 골칫거리 중 하나는 EIP-712 구조화 데이터 서명 요청이 아무런 반응 없이 묻히는 버그입니다. Wagmi v3는 하부 라이브러리인 Viem v3의 엄격한 타입 규격을 전면 수용하면서, 기존 버전의 모호한 서명 파라미터 전달 방식을 더 이상 허용하지 않습니다. 이 규칙을 생략하면 모바일 지갑이 요청을 무시하고 소리 없이 실패하는 현상이 발생하므로 빌드 단계에서 스키마 타입을 확실하게 잡아주어야 합니다.

Wagmi v3의 useSignTypedData 훅에서 꼭 기억해야 할 변화는 두 가지입니다. 첫째, 기존 value 속성이 EIP-712 표준 스펙에 맞춰 message로 변경되었습니다. 둘째, 과거에는 내부 엔진이 자동으로 추론해주던 primaryType이 이제는 필수값으로 강제됩니다. 타입스크립트의 as const 단언을 활용해 타입 구조를 리터럴로 고정해주면 컴파일러가 스키마 정밀도를 정확하게 검증합니다.

tsx
import { useSignTypedData } from 'wagmi'

const types = {
  Person: [
    { name: 'name', type: 'string' },
    { name: 'wallet', type: 'address' },
  ],
} as const

function SignForm() {
  const signTypedData = useSignTypedData()

  return (
    <button onClick={() => signTypedData.mutate({
      domain: { name: 'My dApp', version: '1', chainId: 1 },
      types,
      primaryType: 'Person',
      message: { name: 'Alice', wallet: '0x123...' },
    })}>
      서명 요청하기
    </button>
  )
}

이 구조를 적용하면 모바일 지갑의 딥링크 콜백 과정에서 데이터가 유실되거나 잘못 전달되어 트랜잭션 서명이 끊기는 런타임 오류를 완벽하게 예방할 수 있습니다.

월렛커넥트 다중 체인 전환: isNewChainsStale 옵션의 역할

모바일 기기에서는 유니버설 링크 대신 지갑 앱을 직접 호출하는 커스텀 딥링크를 우선 사용해야 리다이렉트 충돌이나 브라우저 무한 루프 문제를 방지할 수 있습니다. 특히 다중 체인을 지원하는 디앱은 사용자가 처음 연결할 때 지원하는 체인 목록을 명시적으로 승인받는 과정이 필수적입니다.

하지만 디앱에 새로운 네트워크가 추가되었을 때 기존 연결 세션을 그대로 유지하면 심각한 UX 마찰이 발생합니다. 지갑에 미처 등록되지 않은 체인으로 무리하게 전환을 시도하다가 연결이 소리 없이 해제되거나 비정상적인 동기화 오류를 내뱉기 쉽습니다.

Wagmi v3는 이를 제어하기 위해 walletConnect 커넥터 옵션에 isNewChainsStale 설정을 기본적으로 true로 활성화해 둡니다. 이 설정은 지갑이 승인하지 않은 새 체인이 발견되면 기존 세션을 만료된 상태로 처리하여 안전한 재연결과 일괄 재승인을 유도하므로, 모바일 멀티체인 환경에서 연결 안전성을 크게 높여줍니다.

모바일 디앱 완성도를 높이는 최종 체크리스트

Wagmi v3 기반의 모바일 웹3 연동은 단순한 패키지 마이그레이션을 넘어 모바일 운영체제의 생명주기 제약을 프론트엔드 레벨에서 극복해야 완성됩니다. 피어 의존성 구성부터 백그라운드 전환 시 세션 복구, 엄격해진 EIP-712 서명 타입 매칭과 다중 체인 전환 규칙까지 꼼꼼히 검증하는 프론트엔드 설계가 핵심입니다.

메타마스크나 트러스트 월렛 같은 주요 모바일 지갑 환경에서 직접 트랜잭션 시나리오를 테스트하며 예외 처리를 보완해 나가는 것이 견고한 서비스를 만드는 지름길입니다.

(수정됨)

아직 댓글이 없습니다.