> ## Documentation Index
> Fetch the complete documentation index at: https://www.helius.dev/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# getMultipleAccounts 사용 방법

> getMultipleAccounts 사용 사례, 코드 예시, 요청 매개변수, 응답 구조 및 팁을 배웁니다.

[`getMultipleAccounts`](https://www.helius.dev/docs/api-reference/rpc/http/getmultipleaccounts) RPC 메서드는 Solana 계정 목록 정보를 동시에 가져오는 매우 효율적인 방법입니다. 각 계정에 대해 개별적으로 `getAccountInfo` 요청을 사용하는 대신, `getMultipleAccounts`를 사용하여 이러한 요청을 배치하여 네트워크 오버헤드를 줄이고 애플리케이션의 응답성을 향상시킬 수 있습니다.

## 일반 사용 사례

* **계정 데이터 배치 로딩:** 애플리케이션이 여러 개의 알려진 계정에서 데이터를 표시하거나 처리해야 할 때 (예: 사용자의 토큰 계정, 온체인 프로그램 구성 목록).
* **포트폴리오 추적기:** 사용자가 소유한 여러 토큰 계정의 잔액 및 상태를 가져오기.
* **마켓플레이스 UI:** 여러 NFT 또는 등록된 항목의 세부 정보를 한 번에 가져와서 표시하기.
* **dApp 성능 개선:** RPC 호출 수를 크게 줄여 더 빠른 로드 시간과 향상된 사용자 경험을 제공, 특히 많은 계정을 다룰 때.

## 요청 매개변수

1. **`pubkeys`** (`array`의 `string`, 필수):
   * 쿼리할 계정의 base-58로 인코딩된 공개 키 문자열 배열입니다.
   * 요청당 최대 100개의 공개 키.
   * 예: `["So11111111111111111111111111111111111111112", "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"]`

2. **`options`** (`object`, 선택 사항): 다음 필드 중 하나 이상을 포함하는 구성 객체:
   * **`commitment`** (`string`): 쿼리의 [커밋 수준](https://www.helius.dev/blog/solana-commitment-levels)을 지정합니다 (예: `"finalized"`, `"confirmed"`, `"processed"`).
   * **`encoding`** (`string`): 계정 데이터의 인코딩. 옵션은 다음과 같습니다:
     * `"base64"` (기본값): 표준 base64 인코딩.
     * `"base58"`: 느리지만 특정 상황에서 유용할 수 있음.
     * `"base64+zstd"`: Base64로 인코딩된 zstd 압축 데이터.
     * `"jsonParsed"`: 계정이 RPC 노드에 파서가 있는 프로그램(SPL 토큰 프로그램, 스테이크 프로그램 등)에 의해 소유되는 경우, `data` 필드는 JSON 객체가 됩니다. 이는 구조화된 데이터에 매우 유용합니다.
   * **`dataSlice`** (`object`): 계정 데이터의 특정 부분만 가져올 수 있게 해줍니다. 이는 큰 계정에서 필요한 정보만 가져오는 데 유용합니다.
     * `offset` (`usize`): 계정 데이터 시작 지점부터의 바이트 오프셋.
     * `length` (`usize`): 오프셋에서 반환할 바이트 수.
     * *참고: `dataSlice`는 `base58`, `base64` 또는 `base64+zstd` 인코딩에만 사용할 수 있습니다.*
   * **`minContextSlot`** (`u64`): 요청을 평가할 수 있는 최소 슬롯입니다.

## 응답 구조

JSON-RPC 응답 객체에는 다음을 포함하는 `result` 필드가 있습니다:

* **`context`** (`object`):
  * `slot` (`u64`): 정보가 검색된 슬롯.
  * `apiVersion` (`string`, 선택 사항): 노드의 API 버전.
* **`value`** (`array`):
  * 각 요소가 요청의 `pubkeys` 배열에서 동일 인덱스의 공개 키에 해당하는 배열.
  * 각 요소는 다음 중 하나가 됩니다:
    * `null`: 특정 공개 키에서 계정이 존재하지 않거나 특정 계정에 오류가 발생한 경우.
    * 다음 필드가 있는 **계정 객체**:
      * `lamports` (`u64`): 계정이 보유한 Lamport 수.
      * `owner` (`string`): 계정을 소유한 프로그램의 base-58로 인코딩된 공개 키.
      * `data` (`array` 또는 `object`): 계정 데이터. `encoding`이 `jsonParsed`이고 파서가 존재하는 경우, 이는 JSON 객체입니다. 그렇지 않으면 일반적으로 배열 `["encoded_string", "encoding_format"]` (예: `["SGVsbG8=", "base64"]`)입니다.
      * `executable` (`boolean`): 계정에 프로그램이 포함되어 있는지 여부(실행 가능 여부).
      * `rentEpoch` (`u64`): 이 계정이 다음에 임대료를 지불해야 할 에폭.
      * `space` (`u64`): 계정의 데이터 길이(바이트).

## 예시

### 1. 두 계정에 대한 기본 정보 가져오기

이 예제에서는 SOL Llama(NFT)와 Serum Dex 프로그램 v3에 대한 데이터를 가져옵니다.

<CodeGroup>
  ```bash cURL theme={"system"}
  # Replace <api-key> with your Helius API key
  # SOL Llama Mint: Abug4qgG1x23AEdjS2h9CEJ1m6ha2Z22LdK2kL2pys3F
  # Serum Dex Program v3: 9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin
  curl https://mainnet.helius-rpc.com/?api-key=<api-key> -X POST -H "Content-Type: application/json" -d \
    '{
      "jsonrpc": "2.0",
      "id": 1,
      "method": "getMultipleAccounts",
      "params": [
        [
          "Abug4qgG1x23AEdjS2h9CEJ1m6ha2Z22LdK2kL2pys3F",
          "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin"
        ]
      ]
    }'
  ```

  ```javascript JavaScript (using @solana/web3.js) theme={"system"}
  // Replace <api-key> with your Helius API key
  const { Connection, PublicKey } = require('@solana/web3.js');

  async function fetchMultipleAccountInfo() {
    const connection = new Connection('https://mainnet.helius-rpc.com/?api-key=<api-key>');
    const accountPubkeys = [
      new PublicKey('Abug4qgG1x23AEdjS2h9CEJ1m6ha2Z22LdK2kL2pys3F'), // SOL Llama
      new PublicKey('9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin')  // Serum Dex Program v3
    ];

    try {
      const accountsInfo = await connection.getMultipleAccountsInfo(accountPubkeys);
      
      accountsInfo.forEach((account, index) => {
        console.log(`--- Account ${index + 1} (${accountPubkeys[index].toBase58()}) ---`);
        if (account) {
          console.log(`  Owner: ${account.owner.toBase58()}`);
          console.log(`  Lamports: ${account.lamports}`);
          console.log(`  Executable: ${account.executable}`);
          console.log(`  Data length: ${account.data.length}`);
          // For brevity, not logging full data buffer
        } else {
          console.log("  Account not found or error fetching.");
        }
      });
    } catch (error) {
      console.error('Error fetching multiple accounts:', error);
    }
  }

  fetchMultipleAccountInfo();
  ```
</CodeGroup>

### 2. 파싱된 토큰 계정 데이터 가져오기

이 예제에서는 두 개의 SPL 토큰 계정에 대해 데이터를 가져오고 `jsonParsed` 인코딩을 요청하여 구조화된 데이터를 얻습니다.

<CodeGroup>
  ```bash cURL theme={"system"}
  # Replace <api-key> with your Helius API key
  # Example USDC Token Account 1: GqoZ2MCrdTtygoX1F2b8X7F2tDXxNxyvMvykR9RzQW8p
  # Example USDT Token Account 2: HYnLMbkaPMh9W2aPNy2yP4LzLSWWw9zSCYEZdX2g2E7m
  curl https://mainnet.helius-rpc.com/?api-key=<api-key> -X POST -H "Content-Type: application/json" -d \
    '{
      "jsonrpc": "2.0",
      "id": 1,
      "method": "getMultipleAccounts",
      "params": [
        [
          "GqoZ2MCrdTtygoX1F2b8X7F2tDXxNxyvMvykR9RzQW8p",
          "HYnLMbkaPMh9W2aPNy2yP4LzLSWWw9zSCYEZdX2g2E7m"
        ],
        {
          "encoding": "jsonParsed"
        }
      ]
    }'
  ```

  ```javascript JavaScript (using @solana/web3.js) theme={"system"}
  // Replace <api-key> with your Helius API key
  const { Connection, PublicKey } = require('@solana/web3.js');

  async function fetchParsedTokenAccounts() {
    const connection = new Connection('https://mainnet.helius-rpc.com/?api-key=<api-key>');
    const tokenAccountPubkeys = [
      new PublicKey('GqoZ2MCrdTtygoX1F2b8X7F2tDXxNxyvMvykR9RzQW8p'), // Example USDC account
      new PublicKey('HYnLMbkaPMh9W2aPNy2yP4LzLSWWw9zSCYEZdX2g2E7m')  // Example USDT account
    ];

    try {
      const accountsInfo = await connection.getMultipleAccountsInfo(tokenAccountPubkeys, 'confirmed'); // Can also pass commitment here
      // Note: @solana/web3.js's getMultipleAccountsInfo automatically requests jsonParsed if the node supports it for token accounts.
      // For explicit control with raw RPC, you use the options object as in the cURL example.

      accountsInfo.forEach((account, index) => {
        console.log(`--- Token Account ${index + 1} (${tokenAccountPubkeys[index].toBase58()}) ---`);
        if (account && account.data && typeof account.data !== 'string') { // Check if data is parsed
          // The actual structure of account.data depends on the program (e.g., SPL Token)
          // For SPL Token accounts, you'd typically find parsed data in account.data.parsed.info
          const parsedInfo = (account.data as any).parsed?.info;
          if (parsedInfo) {
              console.log(`  Mint: ${parsedInfo.mint}`);
              console.log(`  Owner: ${parsedInfo.owner}`);
              console.log(`  Amount: ${parsedInfo.tokenAmount.uiAmountString} (decimals: ${parsedInfo.tokenAmount.decimals})`);
          } else {
              console.log("  Account data is not in the expected parsed format or is not a token account.");
              // console.log("Raw data:", account.data.toString('base64')); // if buffer
          }
        } else if (account) {
          console.log("  Account found, but data is not parsed or is a string (binary data).");
          // console.log("  Raw data:", account.data.toString()); // if string
        } else {
          console.log("  Account not found or error fetching.");
        }
      });
    } catch (error) {
      console.error('Error fetching parsed token accounts:', error);
    }
  }

  fetchParsedTokenAccounts();
  ```
</CodeGroup>

## 개발자 팁

* **최대 100개 계정:** 호출당 최대 100개의 계정을 요청할 수 있습니다.
* **원자성:** 요청은 원자적이지 않아 한 계정 조회가 실패해도 다른 계정은 성공할 수 있습니다. `value` 배열의 각 요소를 체크하여 `null`를 확인하세요.
* **`jsonParsed` 편리함:** 일반 계정 유형(SPL 토큰 계정 등)을 다룰 때 `jsonParsed` 인코딩을 사용하는 것이 manual 역직렬화 없이 매우 권장됩니다.
* **`dataSlice`를 큰 계정에 사용:** 매우 큰 계정(예: 일부 프로그램 상태 계정)의 경우 필요한 바이트만 가져와 과도한 데이터 전송을 방지하세요.
* **오류 처리:** 계정이 발견되지 않았거나 가져올 수 없음을 나타내는 `null` 항목을 응답 `value` 배열에서 처리할 준비를 하세요.

`getMultipleAccounts`를 활용하여 보다 성능이 뛰어나고 확장 가능한 Solana 애플리케이션을 구축할 수 있습니다.

## 관련 메서드

<CardGroup cols={2}>
  <Card title="getAccountInfo" href="/docs/ko/api-reference/rpc/http/getaccountinfo">
    단일 계정에 대한 자세한 정보 검색
  </Card>

  <Card title="getProgramAccounts" href="/docs/ko/api-reference/rpc/http/getprogramaccounts">
    특정 프로그램이 소유한 모든 계정 가져오기
  </Card>
</CardGroup>
