---
title: "Solana의 associated token account란?"
description: "Associated Token Account란 무엇인지, 어떻게 작동하는지, 어떻게 생성하는지 알아보세요"
---

# Solana의 associated token account란?

[Solana Account Model](https://www.alchemy.com/overviews/solana-account-model)은 모든 온체인 데이터를 정리하고 저장하며, Associated Token Accounts(ATA)는 이 모델의 핵심 구성 요소 중 하나입니다. 이 글에서는 ATA가 무엇인지, 어떻게 작동하는지, 그리고 직접 Associated Token Account를 생성하는 방법을 설명합니다.

## **Associated Token Account란 무엇인가?**

**Associated Token Account는 Solana Associated Token Account Program을 통해 생성되며, 특정 토큰과 그 잔액, 소유자에 대한 정보를 담고 있습니다.** 이는 [Program Derived Address](https://www.alchemy.com/overviews/program-derived-address)의 한 변형입니다.

각 용어의 의미는 다음과 같습니다:

- **Associated Token Account** - 토큰과 연결된 계정(Solana Token Program을 떠올리면 됩니다)
- **Program Derived Address** - Solana Program, 여기서는 Associated Token Account Program으로부터 "파생"(생성)된 주소

### Associated Token Account와 이들 간의 전송은 어떻게 작동하는가?

**Associated Token Account 간 전송은 계정 간에 직접 이루어지며, 지갑 주소를 통해 간접적으로도 이루어집니다.**

토큰 계정은 Ethereum의 ERC-20 토큰과 동등하지만 근본적인 차이가 있습니다: Ethereum 스마트 컨트랙트는 자신의 상태와 코드를 소유하지만, Solana의 토큰 계정은 코드만을 담고 있으며 그 상태(예: 토큰 잔액)는 해당 토큰의 각 소유자를 위해 생성된 Associated Token Account로 "내보냅니다".

**지금까지 배운 내용을 정리하기 위해 USDC를 간단히 살펴보겠습니다:**

- Solana의 USDC는 토큰 계정입니다
- 토큰 계정은 [System Program](https://www.alchemy.com/overviews/solana-data-vs-program-accounts)에 의해 생성되지만, SPL Token Program에 의해 Token mint로 초기화됩니다
- USDC 토큰이 초기화되면, 사용자는 전송을 시작할 수 있습니다
- USDC 토큰을 보유한 사용자는 Associated Token Account Program(ATP)을 통해 생성된 Associated Token Account를 가지고 있습니다
- 두 사람 간의 USDC 교환은 각 사용자의 ATA 간에 이루어집니다

<ImageBlock
  src="https://media.alchemy.com/1703696237-associated-token-account-on-solana.jpg"
  alt="Solana에서 Associated Token Account 간 USDC 전송 흐름을 보여주는 다이어그램"
  width={1600}
  height={901}
  caption="Solana의 Associated Token Account"
/>

USDC 전송은 [Solana nodes](https://www.alchemy.com/overviews/solana-nodes)에서 사용자의 ATA 간에 직접 이루어지며, 지갑 주소를 통해 간접적으로 이루어집니다. 이러한 전송은 동일한 token mint seed로 ATA가 생성된 사용자들 간에만 이루어져야 합니다.

## **Associated Token Account Program이란 무엇인가?**

[**Solana Program Library**](https://www.alchemy.com/overviews/solana-program-library)의 일부인 Associated Token Account Program은 모든 ATA의 상위 프로그램으로, 사용자의 지갑을 그가 권한을 가진 ATA들에 매핑합니다. 또한 ATA Program은 사용자가 다른 사용자에게 토큰을 보내려 할 때, 수신자가 해당 토큰에 대한 ATA를 가지고 있지 않더라도 토큰을 받을 수 있도록 보장합니다. 이 경우 스마트 컨트랙트가 [RPC node](https://www.alchemy.com/overviews/solana-rpc)에서 실행되는 동안 프로그램이 자동으로 ATA 계정을 생성합니다.

Associated Token Account Program의 소스 코드는 Rust로 작성되어 있으며 [GitHub](https://github.com/solana-labs/solana-program-library)에서 확인할 수 있습니다.

TypeScript에서 ATA가 내부적으로 어떻게 생성되는지 살펴보겠습니다:

<ImageBlock
  src="https://media.alchemy.com/1703696380-creating-associated-account-source-code.jpg"
  alt="Solana에서 Associated Account Program을 생성하는 소스 코드"
  width={1600}
  height={1338}
  caption="Solana에서 Associated Account Program을 생성하는 소스 코드"
/>

### **Associated Token Account Program은 어떻게 작동하는가?**

ATA program 내부에서 일어나는 일은 다음과 같습니다:

#### **1. 상수들의 ID 가져오기**

먼저 \`TOKEN_PROGRAM_ID\`과 \`SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID\` 상수를 가져옵니다. 프로그램 ID는 프로그램 주소를 나타내는 다른 표현입니다.

#### **2. findAssociatedTokenAddress 함수 가져오기**

다음으로 \`findAssociatedTokenAddress\` 함수를 진행하며, 이 함수는 새로 생성된 ATA의 주소가 될 publicKey를 반환합니다.

#### **3. findProgramAddress 메서드 호출**

함수 본문에서 \`findProgramAddress\` 메서드가 호출되며 다음 두 개의 인자가 전달됩니다:

- Seed 배열
- SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID

ATA는 Program Derived Address(PDA)의 한 형태이므로, 프로그램에 인자를 전달하여 계정을 생성할 수 있습니다. PDA를 생성할 때는 seed를 인자로 전달하며, 이 경우 다음과 같습니다:

1. ‍**wallet_address** - ATA 내 자금을 소유하게 될 계정의 주소(authority)‍
1. **token_program_id** - SPL Token Program의 프로그램 ID
1. ‍**token_mint_address** - ATA에 저장될 Token 계정의 주소

Associated Token Account Program의 ID는 SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID입니다.

## **Associated Token Account 생성 방법**

Associated Token Account를 생성하는 것은 Solana의 spl-token-cli를 사용해 create-token을 호출하는 것만큼 간단합니다. ATA를 생성한다는 것은 그것이 "연결"될 토큰이 이미 존재한다는 것을 전제로 합니다.

<ImageBlock
  src="https://media.alchemy.com/1703696504-creating-associated-token-account-on-solana.jpg"
  alt="Solana에서 associated token account 생성하기"
  width={1600}
  height={749}
  caption="Solana에서 associated token account 생성하기"
/>

‍이 코드는 \`create-account\` 명령을 호출하며, 이 명령은 \`&lt;TOKEN_MINT_ADDRESS&gt;\`를 인자로 받습니다.

Associated Token Account를 생성하려면 다음 네 단계를 따라야 합니다:

1. SOL 전송 - System Program이 ATA를 초기화하고 rent-exempt 상태로 만듭니다
1. 여유 공간 생성 - System Program이 ATA를 위한 여유 공간을 할당합니다.
1. 소유권 이전 - System Program이 계정의 소유권을 SPL Associated Token Account Program으로 이전합니다
1. 계정 초기화 - 계정 초기화 과정을 마무리하며 토큰 주소, 새로 생성된 ATA 주소, 그리고 그 소유자를 설정합니다

### **소유자(owner)와 권한(authority)의 차이는 무엇인가?**

*Owner*는 ATA를 제어하는 Solana 프로그램의 유형이고, *authority*는 owner 프로그램에 트랜잭션을 전송하여 authority를 대신해 ATA의 데이터를 변경하는 계정(지갑)입니다.

### **Associated Token Account의 비용은 얼마인가?**

기본적으로 Associated Token Account는 생성 시 [**rent-exempt**](https://www.alchemy.com/overviews/how-to-calculate-rent-for-solana-programs) 상태로 표시되어야 하므로, 계정이 보유해야 하는 최소 금액은 0.00203928 SOL 이상이어야 합니다. System Program이 이 SOL을 ATA로 전송하며, 이는 트랜잭션을 시작하는 계정에서 차감됩니다.

이 초기 비용을 제외하면, 이후의 상호작용은 Solana의 일반 트랜잭션 비용보다 더 들지 않습니다.

### **Associated Token Account 확인 방법**

**Phantom과 같은 클라이언트를 통해 Associated Token Account를 확인할 수 있으며, 이러한 클라이언트는 사용자 지갑이 권한을 가진 모든 ATA를 자동으로 도출합니다.** 또한 블록체인은 공개되어 있으므로 Solscan.io와 같은 익스플로러를 통해서도 이 정보에 접근할 수 있습니다.

확인하고자 하는 지갑의 주소를 붙여넣으면 해당 ATA들이 Token Accounts 아래에 표시됩니다:

<ImageBlock
  src="https://media.alchemy.com/1703696658-solscan-interface.png"
  alt="지갑의 ATA를 확인하는 Solscan.io 인터페이스"
  width={1600}
  height={785}
  caption="지갑의 ATA를 확인하는 Solscan.io 인터페이스"
/>

### **Associated Token Account를 기존 계정에 연결할 수 있는가?**

**Associated Token Account를 기존 계정에 연결하는 것은 기본적으로 내부에서 자동으로 이루어집니다. ATA가 생성되는 방식 때문에 프로그램이나 클라이언트는 각 계정의 seed를 쉽게 확인할 수 있습니다.** 이는 다음에 대한 '연결고리'로 볼 수 있습니다:

- ATA에 대한 권한을 가진 지갑
- Token 계정의 주소(즉, ATA가 보유한 토큰 유형)

## **Alchemy로 Solana 앱 구축하기**

Associated Token Account에 대해 배우는 것은 완전한 Solana 개발자가 되기 위한 첫걸음 중 하나입니다. Solana node와 RPC provider 선택에 대해 익힌 후에는, 사용하기 쉬운 [Solana API](https://www.alchemy.com/docs/reference/solana-api-quickstart)를 활용해 첫 dApp 구축을 빠르게 시작할 수 있습니다.

## 자주 묻는 질문

### Solana에서 Associated Token Account(ATA)란 무엇인가?

Associated Token Account는 Solana Associated Token Account Program을 통해 생성되며, 특정 토큰과 그 잔액, 소유자에 대한 정보를 담고 있습니다. 이는 사용자의 지갑을 특정 토큰에 매핑하는 Program Derived Address의 한 변형입니다.

### ATA는 일반 토큰 계정과 어떻게 다른가?

Solana의 토큰 계정은 코드만을 담고 있으며, 그 상태를 해당 토큰의 각 소유자를 위해 생성된 Associated Token Account로 "내보냅니다". ATA는 지갑과 특정 token mint 모두에 연결된 결정론적으로 도출된 주소입니다.

### Associated Token Account Program이란 무엇인가?

Associated Token Account Program은 Solana Program Library의 일부로, 사용자의 지갑을 그가 권한을 가진 ATA들에 매핑합니다. 이 프로그램은 사용자가 해당 토큰에 대한 ATA가 없는 수신자에게 토큰을 보낼 때 자동으로 ATA 계정을 생성합니다.

### Associated Token Account를 생성하는 데 비용이 얼마나 드는가?

ATA는 생성 시 rent-exempt 상태여야 하며, 최소 0.00203928 SOL의 잔액이 필요합니다. 이 금액은 트랜잭션을 시작하는 계정에서 전송되며, 지속적인 rent 요건을 충당합니다.

### ATA 주소를 도출하는 데 어떤 seed가 사용되는가?

ATA 주소는 세 가지 seed, 즉 지갑 주소(authority), token program ID, token mint 주소를 사용해 도출됩니다. 이들은 Associated Token Account Program에 전달되어 결정론적 주소를 생성하는 데 사용됩니다.

### Associated Token Account는 어떻게 생성하는가?

spl-token-cli를 사용해 \`create-account\` 명령을 token mint 주소를 인자로 호출하여 ATA를 생성할 수 있습니다. 이 과정은 SOL 전송, 공간 생성, 소유권 이전, 계정 초기화를 포함합니다.

### 내 Associated Token Account는 어떻게 확인하는가?

Phantom과 같은 지갑을 통해 자신의 지갑이 권한을 가진 모든 ATA를 자동으로 확인하거나, Solscan.io와 같은 블록체인 익스플로러에서 지갑 주소를 검색하여 Token Accounts 섹션을 확인할 수 있습니다.

### ATA가 없는 사람에게 토큰을 보내면 어떻게 되는가?

Associated Token Account Program은 전송 중 수신자의 ATA가 존재하지 않으면 자동으로 생성하며, 새 ATA를 위한 rent-exempt SOL 금액을 발신자의 계정에서 차감합니다.
