> ## 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.

# getAccountInfo 사용 방법

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

[`getAccountInfo`](https://www.helius.dev/docs/api-reference/rpc/http/getaccountinfo) RPC 메소드는 Solana 블록체인을 쿼리하는 데 기본적인 도구입니다. 특정 계정 공개 키와 관련된 모든 저장된 정보를 검색할 수 있습니다. 여기에는 계정의 lamport 잔액, 소유 프로그램, 실행 가능 여부 및 저장된 데이터가 포함됩니다.

## 일반적인 사용 사례

* **SOL 잔액 확인:** 모든 계정의 기본 SOL 잔액을 확인합니다.
* **계정 존재 여부 확인:** 주어진 공개 키로 초기화된 계정이 있는지 확인합니다(예: lamport 또는 데이터가 있는지).
* **프로그램 계정 검사:** 프로그램의 소유인 계정 내에 저장된 데이터를 검색하여 프로그램 상태를 이해하는 데 중요합니다.
* **계정 소유자 식별:** 계정을 소유한 프로그램이 무엇인지 확인합니다. 이를 통해 계정 데이터를 해석하는 방법이나 시스템 소유 계정인지 여부를 결정할 수 있습니다.
* **계정이 실행 가능한지 확인:** 계정이 배포된 프로그램을 포함하는지 식별합니다.

## 매개변수

1. `publicKey` (string, required): 쿼리할 계정의 base-58로 인코딩된 공개 키입니다.

2. `config` (object, optional): 다음 필드를 포함하는 설정 객체:
   * `commitment` (string, optional): 쿼리에 사용할 [커밋 수준](https://www.helius.dev/blog/solana-commitment-levels)을 지정합니다. 기본값은 `finalized`입니다.
     * `finalized`: 노드는 클러스터 과반수가 최대 잠금을 달성한 것으로 확인된 가장 최근의 블록을 쿼리합니다.
     * `confirmed`: 노드는 클러스터 과반수가 투표한 가장 최근의 블록을 쿼리합니다.
     * `processed`: 노드는 가장 최근의 블록을 쿼리합니다. 이 블록이 완전하지 않을 수 있습니다.
   * `encoding` (string, optional): 계정 데이터의 인코딩을 지정합니다. 기본값은 `base64`입니다.
     * `base58` (느림)
     * `base64`
     * `base64+zstd` (데이터가 압축된 경우)
     * `jsonParsed`: 계정 데이터가 알려진 프로그램 상태일 경우(예: 토큰 계정, 스테이크 계정), 노드는 이를 JSON 구조로 구문 분석하려고 시도합니다. 일반적인 프로그램 계정의 경우 보통 base64의 이진 데이터로 돌아갑니다.
   * `dataSlice` (object, optional): 특정 슬라이스로 반환 계정 데이터를 제한합니다. `base58`, `base64` 또는 `base64+zstd` 인코딩에 대해서만 사용 가능합니다.
     * `offset` (number): 계정 데이터 시작에서 슬라이스를 시작할 바이트 수입니다.
     * `length` (number): 반환할 바이트 수입니다.
   * `minContextSlot` (number, optional): 요청이 평가될 수 있는 최소 슬롯입니다.

## 응답

계정을 찾으면 `result` 필드에 두 가지 주요 속성을 포함하는 객체가 있습니다.

* `context` (object): 요청에 대한 메타데이터를 포함합니다.
  * `slot` (number): 정보가 검색된 슬롯입니다.
  * `apiVersion` (string, optional): RPC API 버전입니다.

* `value` (object | null): 계정이 존재하지 않으면 `null`이 됩니다. 그렇지 않으면 다음을 포함하는 객체입니다.
  * `lamports` (number): 계정에 의해 소유된 lamports의 수 (1 SOL = 1,000,000,000 lamports).
  * `owner` (string): 이 계정을 소유한 프로그램의 base-58 인코딩된 공개 키입니다.
  * `data` (array | object | string): 계정에 저장된 데이터입니다. 요청에서 사용된 `encoding` 매개 변수에 따라 형식이 달라집니다.
    * 기본값인 `base64`, `base58`, `base64+zstd`에 대해서는 일반적으로 배열 `[encoded_string, encoding_format]`, 예: `["string_data", "base64"]`입니다.
    * `jsonParsed`의 경우, 데이터가 RPC 노드에서 구문 분석 가능한 경우(예를 들어 SPL 토큰 계정), JSON 객체일 수 있습니다. 그렇지 않으면 표준 레이아웃으로 인식되지 않는 경우 `["", "base64"]` 또는 유사한 것으로 기본 설정될 수 있습니다.
  * `executable` (boolean): 계정에 프로그램이 포함되어 있으면 `true`, 그렇지 않으면 `false`입니다.
  * `rentEpoch` (number): 이 계정이 다음 에포크에서 임대료를 지불할 시점입니다.
  * `space` (number, optional): 데이터 길이를 바이트 단위로 나타냅니다. (참고: 공식 Solana 문서에는 `space`가 나와 있고 일부 RPC 공급자는 이를 포함할 수 있습니다.) 계정 데이터에 대한 자세한 내용은 [계정 데이터 및 역직렬화](https://www.helius.dev/blog/solana-dev-101-deserializing-account-data-on-solana)에 대한 자세한 안내를 참조하십시오.

계정을 찾을 수 없는 경우, 결과의 `value` 필드는 `null`가 됩니다.

## 예제: 계정 정보 가져오기

메인넷에서 Serum Program V3 ID (`9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin`)에 대한 정보를 가져와 보겠습니다.

**참고:** 아래 예제에서 `YOUR_API_KEY`을 실제 Helius API 키로 교체하십시오.

<CodeGroup>
  ```bash curl theme={"system"}
  curl https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY -X POST -H "Content-Type: application/json" -d \
  '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "getAccountInfo",
    "params": [
      "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin",
      {
        "encoding": "jsonParsed"
      }
    ]
  }'
  ```

  ```javascript JavaScript (using @solana/web3.js) theme={"system"}
  const { Connection, PublicKey } = require('@solana/web3.js');

  async function getAccountDetails() {
    const rpcUrl = 'https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY'; // Replace YOUR_API_KEY
    const connection = new Connection(rpcUrl, 'confirmed');
    const accountPubKey = new PublicKey('9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin');

    try {
      const accountInfo = await connection.getAccountInfo(accountPubKey);

      if (accountInfo === null) {
        console.log('Account not found.');
        return;
      }

      console.log('Account Info:');
      console.log(`   Lamports: ${accountInfo.lamports}`);
      console.log(`   Owner: ${accountInfo.owner.toBase58()}`);
      console.log(`   Executable: ${accountInfo.executable}`);
      console.log(`   Rent Epoch: ${accountInfo.rentEpoch}`);
      // Data is a Buffer, you might need to deserialize it based on the account type
      // console.log(`   Data: ${accountInfo.data.toString()}`); 
    } catch (error) {
      console.error('Error fetching account info:', error);
    }
  }

  getAccountDetails();
  ```

  ```typescript Kit theme={"system"}
  import { address, createSolanaRpc } from "@solana/kit";

  const rpc_url = "https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY";
  const rpc = createSolanaRpc(rpc_url);

  const publicKey = address("vines1vzrYbzLMRdu58ou5XTby4qAqVRLmqo36NKPTg");
  const accountInfo = await rpc.getAccountInfo(publicKey).send();

  console.log("Account Info:", accountInfo);
  ```

  ```rust Rust theme={"system"}
  use solana_client::nonblocking::rpc_client::RpcClient;
  use solana_sdk::{commitment_config::CommitmentConfig, pubkey::Pubkey};
  use anyhow::Result;
  use std::str::FromStr;

  #[tokio::main]
  async fn main() -> Result<()> {
      let client = RpcClient::new_with_commitment(
          String::from("https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY"),
          CommitmentConfig::confirmed()
      );
      let pubkey = Pubkey::from_str("vines1vzrYbzLMRdu58ou5XTby4qAqVRLmqo36NKPTg")?;
      let account = client.get_account(&pubkey).await?;

      println!("{:#?}", account);

      Ok(())
  }
  ```
</CodeGroup>

## 개발자 팁

* **성능:** 여러 계정을 자주 확인해야 하는 애플리케이션의 경우 `getMultipleAccounts`를 사용하여 요청을 일괄 처리하고 왕복 횟수를 줄이십시오.
* **데이터 역직렬화:** `data` 필드는 소유 프로그램의 데이터 구조에 따라 자주 역직렬화가 필요합니다. 프로그램에 특화된 도구와 라이브러리 (예: 토큰 계정의 SPL 토큰 라이브러리)가 보통 필요합니다. 우리의 [계정 데이터 역직렬화](https://www.helius.dev/blog/solana-dev-101-deserializing-account-data-on-solana) 블로그 포스트가 유용한 기술과 예제를 제공합니다.
* **요금 제한:** 많은 수의 계정을 쿼리하거나 자주 요청할 때는 RPC 노드 요금 제한을 주의하십시오.
* **비용 관리:** `getAccountInfo`는 일반적으로 저비용 쿼리지만 빈번한 폴링은 비용을 증가시킬 수 있습니다. 쿼리 패턴을 최적화하십시오.
* **`jsonParsed`를 현명하게 사용하십시오:** `jsonParsed`는 편리할 수 있지만 모든 계정 유형을 지원하지 않을 수 있으며 프로그램이 데이터 구조를 업데이트하면 출력이 변경될 수 있습니다. 중요한 애플리케이션의 경우, 이진 데이터를 알려진 레이아웃으로 파싱하는 것이 더 안정적입니다.
* **`dataSlice`를 고려하십시오:** 계정 데이터의 일부분만 필요하다면, `dataSlice`를 사용하여 전송되는 데이터 양을 줄이고 쿼리 비용을 잠재적으로 낮추십시오.

## 관련 메서드

<CardGroup cols={2}>
  <Card title="getMultipleAccounts" href="/docs/ko/api-reference/rpc/http/getmultipleaccounts">
    성능 향상을 위해 단일 요청으로 여러 계정을 일괄 가져오기
  </Card>

  <Card title="getBalance" href="/docs/ko/api-reference/rpc/http/getbalance">
    전체 계정 세부 정보 없이 SOL 잔액만 가져오기
  </Card>
</CardGroup>
