---
title: "Solana Program Library란 무엇인가?"
description: "Solana Program Library를 사용해 Solana에서 탈중앙화 애플리케이션을 개발하는 방법"
---

# Solana Program Library란 무엇인가?

Solana는 개발자가 탈중앙화 애플리케이션을 구축하고 배포할 수 있는 고속 프로그래머블 블록체인입니다. Solana는 Solana Program Library라는 전용 문서 라이브러리를 운영하는데, 이는 Solana 블록체인에서 사용할 수 있도록 미리 컴파일, 배포, 최적화된 프로그램\(즉, 스마트 컨트랙트\)의 모음입니다.

이 글에서는 Solana의 세계를 살펴보고 Solana Program Library로 어떻게 빠르게 개발할 수 있는지 알아보겠습니다. Solana를 처음 접하든 숙련된 개발자든, SPL을 사용하면 자체 커스텀 토큰이나 탈중앙화 거래소를 손쉽게 만들고 배포할 수 있습니다.

## **Solana의 프로그램이란?**

**Solana의 프로그램은 계정\(account\)이라는 버퍼 저장소에 저장되어 트랜잭션을 통해 실행되는 실행 코드로, Ethereum이나 다른 프로그래머블 블록체인의 스마트 컨트랙트와 유사합니다.** 다만 Ethereum에서는 프로그램과 상태가 스마트 컨트랙트에 함께 저장되는 반면, Solana는 데이터와 프로그램을 계정에 나누어 저장하는 [stateless program model](https://www.alchemy.com/overviews/solana-account-model) 방식을 채택하고 있습니다.

### **Solana의 계정이란?**

Solana 문서에 따르면, "계정은 데이터를 보유하거나 실행 가능한 프로그램인 Solana 원장의 레코드입니다."

Solana를 데이터베이스라고 생각해 보면, [계정](https://www.alchemy.com/overviews/solana-data-vs-program-accounts)은 행\(row\)에 해당하고, pub key는 ID 역할을 하며, 값은 계정에 저장된 정보입니다. 이 정보는 프로그램\(즉 _스마트 컨트랙트_\)일 수도 있고, 프로그램의 데이터/상태일 수도 있습니다.

계정은 "DM6n1qcUCLzJ1RaAuA4gUbBZ9sfHP6KvEwX8oExQqPhk"와 같은 형태의 고유한 Public Key\(256바이트\)로 식별됩니다.

Solana는 코드와 데이터를 논리적으로 분리하기 때문에 실행 가능\(executable\)한 계정과 실행 불가능\(non-executable\)한 계정, 두 종류의 계정이 존재합니다.

#### **1. 실행 가능한 계정**‍

변경 불가능한 프로그램 코드만 저장하며 '실행 가능\(executable\)'으로 표시된 계정입니다.

#### **2. 실행 불가능한 계정**‍

이 계정은 변수, 자산, 프로그램 상태를 포함하여 해당 프로그램이 사용할 수 있는 모든 데이터를 저장합니다. 누구나 이 계정의 데이터를 읽을 수 있지만, 프로그램의 소유자\(배포자\)만이 데이터를 변경할 수 있습니다.

이러한 계정은 [validator 노드](https://www.alchemy.com/overviews/what-is-firedancer)가 관리하며, 위 정보를 저장할 메모리 공간을 제공하는 대가로 '[Rent](https://www.alchemy.com/overviews/how-to-calculate-rent-for-solana-programs)'라는 유지 비용을 부과합니다. Rent는 **lamport**\(Solana의 네이티브 토큰인 SOL의 소수 단위\)로 지불됩니다.

Solana의 코드와 프로그램 데이터가 별도로 관리되는 것은 **Sealevel Parallel Runtime**이라는 시스템 때문입니다.

### **Sealevel parallel runtime이란?**

**Sealevel Parallel Runtime은 Solana가 구현한 병렬 트랜잭션 처리 시스템입니다.** Ethereum과 같은 기존의 단일 스레드 블록체인은 동시성 문제를 피하기 위해 한 번에 하나의 트랜잭션만 처리할 수 있습니다. 이는 Ethereum 스마트 컨트랙트가 **stateful**하기 때문인데, 즉 상태와 코드가 같은 컨트랙트 안에 결합되어 있기 때문입니다.

Sealevel의 도움으로 Solana는 서로 충돌하지 않는 수천 개의 트랜잭션을 병렬로 처리할 수 있습니다. 여러 validator 코어를 활용하여 Solana는 400밀리초의 블록 타임으로 최대 50,000 Tps까지 실행할 수 있습니다. 이는 트랜잭션 명령어가 stateless하며, 어떤 계정의 데이터를 수정할지 미리 결정하기 때문에 가능합니다. 따라서 동일한 계정 데이터를 공유하지 않는 프로그램들은 동시에 실행될 수 있습니다.

## **Solana 프로그램의 종류는?**

Solana 생태계는 네이티브 프로그램과 온체인 프로그램, 두 가지 뚜렷한 유형의 프로그램으로 구성됩니다. 이 둘을 살펴보겠습니다.

### **네이티브 프로그램이란?**

**네이티브 프로그램은 계정 저장 공간 할당 관리, 새 계정 생성, 트랜잭션 처리, Solana 네트워크 규칙 적용 등 Solana 네트워크의 핵심 기능을 구현하는 역할을 담당합니다.**

네이티브 프로그램은 Solana 핵심 블록체인 모델의 필수적인 부분입니다. 일반적으로 성능과 보안에 최적화된 Rust, C/C\+\+와 같은 저수준 언어로 작성됩니다. 네이티브 프로그램은 어떤 프로그램/사용자든 호출할 수 있는 반면, 운영체제의 커널 수준 프로그램은 사용자가 직접 호출하고 접근할 수 없습니다.

이러한 프로그램의 업데이트는 기능 추가, 버그 수정, 성능 개선을 위한 핵심 블록체인 업그레이드나 클러스터 업그레이드의 일환으로만 이루어질 수 있습니다.

validator를 보호하는 데 도움이 되는 네이티브 프로그램은 여러 가지가 있으며, 그중 일부는 다음과 같습니다.

#### **1. System program**

System program은 새 계정 생성, 두 계정 간 SOL 전송, 계정 소유권 할당 등 계정 관리 작업을 담당합니다.

#### 2. Berkeley Packet Filter \(BPF\):

Berkeley Packet Filter는 온체인 프로그램의 배포, 업그레이드, 실행을 처리합니다.

#### **3. Stake program**

Stake program은 Solana 블록체인에서 SOL 토큰의 스테이킹을 관리하는 역할을 합니다.

### **온체인 프로그램이란?**

**온체인 프로그램은 블록체인에 직접 배포되는 사용자 작성 프로그램\(즉, 스마트 컨트랙트\)입니다.** dapp, 거래소, 연습용 컨트랙트, 멀티시그 지갑 구현체, 기타 일반적인 프로그램 등 다양한 형태를 가질 수 있습니다.

네이티브 프로그램과 달리, 온체인 프로그램은 Solana 클러스터의 핵심을 구성하지 않습니다. 대신 개발자가 Solana 블록체인에 만들고 배포하는 커스텀 프로그램입니다. 즉, 온체인 프로그램은 Solana 블록체인의 운영에 필수적이지 않습니다.

이들은 네이티브 프로그램이 제공하는 핵심 인프라 위에 구축되며, 개발자가 Solana 블록체인에서 다양한 애플리케이션과 서비스를 만들 수 있게 해줍니다.

프로그램이 상호작용하는 데이터는 별도의 데이터 계정에 저장되어 명령어를 통해 참조로 전달됩니다. 계정 소유자만이 프로그램 데이터를 업그레이드할 수 있습니다.

<ImageBlock
  src="https://media.alchemy.com/1703692327-programs-in-solana.png"
  alt="Solana 프로그램이 별도의 데이터 계정에 상태를 저장하는 방식을 보여주는 다이어그램"
  width={557}
  height={385}
  caption="Solana의 프로그램"
/>

## **Solana Program Library란?**

Solana Program Library\(SPL\)는 Solana 블록체인에서 [탈중앙화 애플리케이션](https://www.alchemy.com/dapps/top/defi-dapps)을 구축하는 데 사용할 수 있는 미리 작성된 모듈식 프로그램 모음입니다. SPL은 재사용 가능한 모듈식 컴포넌트 세트를 제공하여 개발자가 애플리케이션을 더 쉽게 만들 수 있도록 하는 것을 목표로 하며, 이러한 컴포넌트는 애플리케이션에 손쉽게 통합할 수 있어 개발자가 복잡한 코드를 처음부터 작성할 필요를 줄여줍니다.

따라서 SPL은 개발자가 각 컴포넌트를 애플리케이션에 손쉽게 통합할 수 있는 "**빌딩 블록**" 방식으로 앱을 구축할 수 있게 해줍니다.

SPL에는 여러 온체인 범용 프로그램이 포함되어 있으며, 그중 Token program과 그 변형들이 가장 널리 사용됩니다. 이를 통해 처음부터 구현하지 않고도 프로젝트에 통합할 수 있습니다.

### **SPL 사전 준비 사항**

SPL과 상호작용하려면 CLI 방식이나 흔히 사용되는 JS 방식 중 선택할 수 있으며, JS 방식은 Javascript 코드가 Solana 블록체인과 상호작용하도록 solana/[web3.js](https://www.alchemy.com/dapps/web3-js)를 사용합니다.

Solana 클러스터와 상호작용하려면 [Solana CLI\(Command Line Interface\)를 설정](https://www.alchemy.com/docs/reference/solana-api-quickstart)해야 합니다. CLI는 초보 개발자에게 가장 친숙한 방식은 아닐 수 있지만, Solana 계정에 가장 직접적이고 안전하게 접근할 수 있는 방법을 제공합니다. 또한 CLI는 Solana Core Developer가 새로운 기능을 가장 먼저 배포하는 곳이기도 합니다.

## **SPL Token program이란?**

**SPL Token program은 Solana 블록체인에서 대체 가능\(fungible\) 토큰과 대체 불가능\(non-fungible\) 토큰을 위한 범용 구현체입니다.** 개발자가 자신만의 토큰을 만들 수 있도록 인터페이스와 상세한 구현을 제공합니다. 코드는 네이티브하게 Rust로 작성되었으며, 자동 생성된 바인딩은 C와 JavaScript로 제공됩니다. 소스 코드는 [SPL GitHub 저장소](https://github.com/solana-labs/solana-program-library/tree/master/token/program)에서 확인할 수 있습니다.

Ethereum에서 [ERC20](https://www.alchemy.com/overviews/erc20-solidity) Token program은 Ethereum ERC-20 컨트랙트와 다르게 동작합니다. 예를 통해 그 차이를 살펴보겠습니다.

Ethereum 블록체인에 서로 다른 세 개의 토큰을 발행하고 싶다고 가정해 봅시다. 이를 위해서는 각 토큰마다 별도의 컨트랙트를 3개 배포해야 합니다. 그리고 각 토큰 컨트랙트는 자신의 상태\(예: 잔액, 전송 내역\)를 각자 추적합니다.

Solana의 경우, 세 개의 토큰 프로그램을 각각 배포할 필요가 없습니다. 대신 여러 계정\(예: 민팅 계정과 수신 계정\)에서 동작할 수 있는 하나의 범용 토큰 프로그램을 배포하면 됩니다.

토큰 유형은 mint 주소로 고유하게 식별됩니다. 이 정보는 Solana 체인에 이미 배포된 단일 정적 ERC20 프로그램 인스턴스에 인자로 전달될 수 있습니다.

## **SPL Token program으로 대체 가능한 토큰을 만드는 방법**

SPL Token Program을 사용하면 몇 단계만으로 대체 가능한 토큰을 만들 수 있습니다. Token program에 바로 들어가기 전에, CLI 지갑을 설정했거나 [Phantom 지갑을 Solana의 Devnet에 연결](https://www.alchemy.com/docs/add-alchemy-rpc-to-any-project)했는지, 그리고 [충분한 devnet SOL을 지갑에 airdrop](https://www.alchemy.com/overviews/solana-devnet)했는지 확인하세요.

### 1단계: 대체 가능한 토큰 만들기

create token 명령어는 온체인 SPL Token Program에 새 토큰을 만들라는 지시입니다. 토큰이 성공적으로 생성되면 트랜잭션 서명과 함께 Token ID를 받게 됩니다. 다만 아직 토큰을 민팅해야 합니다.

**토큰 명령어는 다음과 같습니다**: `spl-token create-token`

<ImageBlock
  src="https://media.alchemy.com/1703692444-running-spl-token-create-token-command.png"
  alt="spl-token create-token 명령 실행 결과"
  width={1058}
  height={159}
  caption="spl-token create-token 명령 실행 결과"
/>

### **2단계: 토큰 계정 만들기**

토큰과 관련된 정보를 별도의 데이터 계정에 저장하기 위한 단계입니다. [토큰 계정](https://www.alchemy.com/overviews/associated-token-account)은 SPL-Token Program이 소유하며, 소유자 필드\(토큰을 소비/전송할 수 있는 Token-ID\)와 함께 이 토큰들에 대한 접근을 제어합니다.

이는 데이터 계정이므로, Token Program이 토큰을 추가/민팅, 전송, 소각함으로써 데이터를 수정할 수 있습니다.

**토큰 계정 생성 명령어는 다음과 같습니다**: `spl-token create-account`

아래에서 볼 수 있듯이, 토큰과 관련 계정을 생성하면서 트랜잭션 수수료로 약간의 SOL이 소모되었습니다. 또한 초기 공급량이 0이라는 점을 확인할 수 있는데, 이는 토큰을 민팅하여 원하는 만큼의 공급량을 추가해야 함을 의미합니다.

<ImageBlock
  src="https://media.alchemy.com/1703692522-solana-token-balance.png"
  alt="spl-token create-account 명령 실행 후 잔액"
  width={892}
  height={225}
  caption="spl-token create-account 명령 실행 후 잔액"
/>

### **3단계: 원하는 만큼 토큰 민팅하기**

원하는 개수의 토큰을 민팅하려면 다음 명령어를 실행하세요:

명령어가 실행되면 지정한 수의 토큰이 파일 시스템 지갑에 민팅되고, 토큰 공급량이 업데이트됩니다.

<ImageBlock
  src="https://media.alchemy.com/1703692591-results-after-minting-tokens.png"
  alt="SPL 토큰 2,000개를 발행한 후 업데이트된 supply를 보여주는 터미널 출력"
  width={841}
  height={80}
  caption="토큰 2,000개 발행 결과"
/>

다음 명령어를 실행하면 현재 토큰 공급량과 해당 토큰과 연결된 계정을 확인할 수 있습니다:

<ImageBlock
  src="https://media.alchemy.com/1703692668-checking-spl-token-supply.png"
  alt="spl-token supply와 계정 잔액을 확인한 결과"
  width={808}
  height={162}
  caption="spl-token supply와 계정 잔액을 확인한 결과"
/>

이제 토큰을 [Phantom 지갑](https://www.alchemy.com/dapps/phantom)—Solana에서 널리 쓰이는 지갑—으로 전송해 보겠습니다.

### 4단계: 토큰 전송하기

수신자, 즉 우리의 Phantom 지갑으로 'x'만큼의 토큰을 전송하려고 합니다. 'fund recipient'는 수신자의 토큰 계정이 존재하지 않을 경우 이를 생성하는 역할을 합니다. 이를 [Associated Token Account](https://www.alchemy.com/overviews/associated-token-account) 생성이라고 합니다.

**토큰을 전송하는 명령어는 다음과 같습니다:**

<ImageBlock
  src="https://media.alchemy.com/1703692742-token-transfer-results.png"
  alt="spl-token transfer 명령으로 Phantom 지갑에 토큰을 전송한 터미널 출력"
  width={1345}
  height={197}
  caption="토큰 전송 결과"
/>

전송이 성공하면 성공 메시지를 받게 됩니다.

<ImageBlock
  src="https://media.alchemy.com/1703692827-phantom-wallet-transfer-confirmation.png"
  alt="Phantom 지갑 전송 성공 메시지"
  width={358}
  height={533}
  caption="Phantom 지갑 전송 성공 메시지"
/>

다음 명령어를 실행하여 전송을 확인할 수 있습니다: `*spl-token accounts`

참고: token supply 명령어를 실행하면 여전히 2,000개의 토큰이 표시되는데, 이는 supply가 네트워크에서 유통 중인 토큰 수를 나타내는 반면, balance는 해당 토큰 계정이 보유한 토큰 수를 나타내기 때문입니다.

<ImageBlock
  src="https://media.alchemy.com/1703693162-token-balance-vs-token-supply.png"
  alt="SPL 토큰 계정 잔액과 전체 토큰 supply를 비교한 터미널 출력"
  width={812}
  height={163}
  caption="토큰 잔액 vs. 토큰 Supply"
/>

### **5단계: 토큰 공급량 제한하기**

컨트랙트 보안과 수요 관리에서 중요한 부분 중 하나는 토큰 공급량을 제한하는 것입니다. 민팅 기능을 비활성화하려면 mint authority를 'None'으로 설정하세요.

토큰 mint authority를 비활성화하는 명령어: `*spl-token authorize mint --disable`

<ImageBlock
  src="https://media.alchemy.com/1703693237-minting-extra-tokens.png"
  alt="발행 비활성화 전 추가로 토큰 3000개 발행하기"
  width={899}
  height={201}
  caption="발행 비활성화 전 추가로 토큰 3000개 발행하기"
/>

<ImageBlock
  src="https://media.alchemy.com/1703693326-mint-authority-disabled.png"
  alt="SPL 토큰 mint authority를 비활성화한 후의 터미널 출력"
  width={977}
  height={155}
  caption="Mint authority 비활성화 결과"
/>

### **6단계: 토큰 소각하기**

토큰 공급량을 줄이고 싶다면 토큰을 소각할 수 있습니다.

명령어는 다음과 같습니다: `spl-token burn`

<ImageBlock
  src="https://media.alchemy.com/1703693386-burning-spl-tokens.png"
  alt="spl-token burn 명령 실행 결과 터미널 출력"
  width={904}
  height={122}
  caption="SPL 토큰 소각하기"
/>

소각을 하면 공급량과 잔액이 모두 감소합니다. 예시에서 볼 수 있듯이, 잔액은 4,978에서 3,978로 감소했고, 공급량은 4,000으로 줄었습니다.

<ImageBlock
  src="https://media.alchemy.com/1703693454-spl-token-burn-results.png"
  alt="SPL 토큰 소각 후 감소된 잔액과 supply를 보여주는 터미널 출력"
  width={817}
  height={184}
  caption="SPL 토큰 소각 결과"
/>

SPL은 다음과 같은 추가 작업을 Token program으로 수행하는 방법에 대한 완전한 참조 가이드를 제공합니다:

- SOL을 토큰으로 wrapping하기
- 명시적인 수신자 토큰 계정으로 토큰 전송하기
- 대체 불가능한 토큰\(non-fungible token\) 만들기

## **SPL로 Solana 개발 여정을 시작하기**

Solana Program Library는 손쉽게 상호작용할 수 있는 다양한 사전 배포된 온체인 프로그램들을 제공합니다. SPL을 활용하면 개발자는 기본적인 boilerplate 토큰 생성 코드를 작성하는 데 시간을 쓰는 대신, 앱의 고유한 기능과 특성에 집중할 수 있습니다.

초보자로서 Solana 개발 여정을 시작하고 싶다면, 첫 단계로 SPL과 [Alchemy의 Solana API](https://www.alchemy.com/docs/reference/solana-api-quickstart), 그리고 [무료 Solana RPC 노드 계정](https://dashboard.alchemy.com/signup/?a=solana-program-library)을 살펴보세요. 이를 통해 프로그램을 빠르게 실행할 수 있을 것입니다.
