# \[korean\] 나의 첫 프로젝트 OpenZeppelin SDK (Your first project)

**URL:** <https://forum.openzeppelin.com/t/korean-openzeppelin-sdk-your-first-project/1966>\
**Category:** Guides and Tutorials\
**Tags:** korean\
**Created:** [December 20, 2019, 5:21pm UTC](https://forum.openzeppelin.com/t/korean-openzeppelin-sdk-your-first-project/1966 "2019-12-20T17:21:25Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![Blue](https://sea2.discourse-cdn.com/flex022/user_avatar/forum.openzeppelin.com/blue/32/1508_2.png) [@Blue](https://forum.openzeppelin.com/u/Blue)\
**Post date:** [December 20, 2019, 5:21pm UTC](https://forum.openzeppelin.com/t/korean-openzeppelin-sdk-your-first-project/1966/1 "2019-12-20T17:21:26Z")

</div>

# 나의 첫 프로젝트

이 튜토리얼을 통해 OpenZeppelin SDK 사용법을 배웁니다. 간단한 컨트랙트를 포함한 새 프로젝트를 만들고, 개발 네트워크에 한 후, 터미널을 이용해 프로젝트와 상호 작용 해 보고, 컨트랙트를 업그레이드 해 볼것입니다.

## 준비

OpenZeppelin SDK 는 [npm package](https://npmjs.com/package/@openzeppelin/cli)로 빌드되었습니다. 설치 및 실행을 위해[node.js](https://nodejs.org/)가 필요합니다. 설치 방법에 대한 지침은 [its website](https://nodejs.org/)를 참고 해 주세요.

`node`를 설치하면, OpenZeppelin SDK CLI를 설치할 수 있습니다:

```auto
npm install --global @openzeppelin/cli

```

NOTE: CLI 는 [global](https://docs.npmjs.com/downloading-and-installing-packages-globally) 로 설치 할 것입니다. 또는, 프로젝트별로 `npm install --save-dev @openzeppelin/cli` 명령어를 이용하여 [local](https://docs.npmjs.com/downloading-and-installing-packages-locally) 로 설치할 수 도 있습니다. 이 경우에는 매번 명령어 접두어로 `npx`를 붙여야 합니다. local 로 설치하는것은, 프로젝트별로 다른 버전의 `openzeppelin` 을 사용할 수 있지만, 새 프로젝트를 시작할때마다 재설치 해야 합니다.

## 프로젝트 설정

먼저 새 디렉토리에 node.js 프로젝트를 만듭니다. 터미널로 가서 다음을 실행하세요:

```auto
mkdir my-project
cd my-project
npm init -y

```

이제 CLI를 사용하여 OpenZeppelin SDK 프로젝트를 초기화하겠습니다:

```auto
openzeppelin init

```

CLI를 이용하여 프로젝트 이름과 버전을 설정하고, package.json에서 기본값을 선택한 다음, OpenZeppelin 프로젝트를 실행할 파일과 폴더를 설정하라는 메시지를 표시합니다.

NOTE: `openzeppelin`의 알리아스는 `oz`입니다. 예시) `openzeppelin init` 대신 `oz init`로 입력해도 결과는 동일합니다.

이제 코딩할 준비가 완료되었습니다.

NOTE: 튜토리얼간 길을잃을경우, [`Github repo`](https://github.com/OpenZeppelin/openzeppelin-sdk/tree/v2.4.0/examples/first-project)에서 모든 소스코드를 참고할 수 있습니다.

## 나의 첫 컨트랙트

이더리움 스마트 컨트랙트에 가장 널리 사용되는 언어인 [Solidity](https://solidity.readthedocs.io/) 로 간단한 컨트랙트를 작성해 보겠습니다. 프로젝트에 새로운 파일 `contracts/Counter.sol`을 생성 후 다음 내용을 작성 해 주세요:

```auto
pragma solidity ^0.5.0;

contract Counter {
  uint256 public value;
  
  function increase() public {
    value++;
  }
}

```

이 컨트렉트는 단순한 숫자인 `value`를 가지며, `increase()` 함수로 트랜잭션을 보낼때마다 값을 1 증가 시킵니다.

터미널에서 명령어 `openzeppelin compile`을 실행하여 컨트랙트를 컴파일 하고 에러가 나오는지 확인해 보세요. 성공적으로 컴파일 된 후 컨트랙트를 배포할 수 있게 됩니다.

NOTE: 컨트랙트 컴파일을 잊었다고 해서 걱정할 필요 없습니다. CLI는 명령을 실행할 때 계약이 변경되었는지 자동으로 확인하고, 필요한 경우 컴파일합니다.

## 개발 네트워크에 배포

_development network_ 로써 [ganache](https://truffleframework.com/ganache) 를 이용하여 컨트랙트를 배포해 보겠습니다. 가나슈가 설치되어 있지 않은 경우, 바로 `npm install -g ganache-cli`를 실행하여 설치 해 주세요.

개발 네트워크는 컴퓨터에서만 실행되는 미니 블록 체인으로 실제 이더리움 네트워크보다 훨씬 빠릅니다. 코딩 및 테스트용으로 사용할 것 입니다.

새로운 터미널을 열고, 가나슈 프로세스를 시작 해 주세요:

```auto
ganache-cli --deterministic

```

임의의 계정 대신, 결정적인 계정 세트를 사용하여 새로운 개발 네트워크를 시작합니다. 이제 `openzeppelin create`를 실행하여 `Counter` 컨트랙트를 개발 네트워크에 배포하도록 선택할 수 있습니다.

```auto
$ openzeppelin create
✓ Compiled contracts with solc 0.5.9 (commit.e560f70d)
? Pick a contract to instantiate: Counter
? Pick a network: development
✓ Added contract Counter
✓ Contract Counter deployed
? Call a function to initialize the instance after creating it?: No
✓ Setting everything up to create contract instances
✓ Instance created at 0xCfEB869F69431e42cdB54A4F4f105C19C080A601

```

NOTE: 컨트랙트가 생성될때 보이는 어드레스들이나 트랜잭션 식별자 들은, 여기 있는 값 과 다를 수 있습니다.

카운터 컨트랙트는 로컬 개발 네트워크에 배포되었으며 실행할 준비가 되었습니다! 터미널에서 상호 작용하여 테스트 할 수 있습니다. `openzeppelin send-tx`를 실행하여 `increase` 함수를 호출하는 트랜잭션을 보내, 값을 증가시켜 보세요.

```auto
$ openzeppelin send-tx
? Pick a network: development
? Pick an instance: Counter at 0xCfEB869F69431e42cdB54A4F4f105C19C080A601
? Select which function: increase()
✓ Transaction successful. Transaction hash: 0x20bef6583ea32cc57fe179e34dd57a5494db3c403e441624e56a886898cb52bd

```

컨트랙트의 퍼블릭값인 `value`를 확인하기 위해 `openzeppelin call`을 실행 후, 값이 0 에서 1 로 증가한 것을 확인 해 주세요.

```auto
$ openzeppelin call
? Pick a network: development
? Pick an instance: Counter at 0xCfEB869F69431e42cdB54A4F4f105C19C080A601
? Select which function: value()
✓ Method 'value()' returned: 1

```

## 컨트랙트 업그레이드

우리는 이제 `Counter` 컨트랙트의 `increase` 함수를 조금 더 흥미롭게 바꿔보려 합니다. 값을 1 증가 하는것 대신에, 요청자가 원하는만큼의 값을 증가 할 수 있도록 하려고 합니다. `contracts/Counter.sol`를 다음과 같이 변경 해 주세요:

```auto
pragma solidity ^0.5.0;

contract Counter {
  uint256 public value;
  
  function increase(uint256 amount) public {
    value += amount;
  }
}

```

이제 이전에 만든 인스턴스를이 새 버전으로 업그레이드 할 수 있습니다:

```auto
$ openzeppelin upgrade
? Pick a network: development
✓ Compiled contracts with solc 0.5.9 (commit.e560f70d)
✓ Contract Counter deployed
? Which proxies would you like to upgrade?: All proxies
Instance upgraded at 0xCfEB869F69431e42cdB54A4F4f105C19C080A601.

```

끝! 카운터 인스턴스가 최신 버전으로 업그레이드되었으며 주소 나 상태가 변경되지 않았습니다. 값을 10 늘려서 확인해 봅시다. 이미 1 늘렸기 때문에 11 이 나옵니다:

```auto
$ openzeppelin send-tx
? Pick a network: development
? Pick an instance: Counter at 0xCfEB869F69431e42cdB54A4F4f105C19C080A601
? Select which function: increase(amount: uint256)
? amount (uint256): 10
Transaction successful: 0x9c84faf32a87a33f517b424518712f1dc5ba0bdac4eae3a67ca80a393c555ece

$ openzeppelin call
? Pick a network: development
? Pick an instance: Counter at 0xCfEB869F69431e42cdB54A4F4f105C19C080A601
? Select which function: value()
Returned "11"

```

NOTE: 스마트컨트랙트가 변경 불가함에도 불구하고, OpenZeppelin SDK 이 어떻게 이러한 업적을 달성했는지 궁금하다면, [upgrades pattern guide](https://docs.openzeppelin.com/sdk/2.6/pattern)를 확인 해 주세요. 업그레이드를 지원하지 않는 변경사항이 있습니다. 예를 들어, 계약 상태 변수의 유형을 [제거하거나 변경](https://docs.openzeppelin.com/sdk/2.6/writing-contracts#modifying-your-contracts) 할 수 없습니다. 그럼에도 불구하고, 원하는 모든 함수를 변경, 추가 또는 제거 할 수 있습니다.

그게 다에요! 이제 간단한 OpenZeppelin 프로젝트를 시작하고, 계약을 작성하고, 로컬 네트워크에 배포하고, 개발할 때 업그레이드하는 방법을 알게되었습니다. 다음 자습서로 이동하여 코드에서 컨트렉트와 상호 작용하는 방법을 알아보세요.

---

<div class="post-metadata">

**Author:** ![abcoathup](https://sea2.discourse-cdn.com/flex022/user_avatar/forum.openzeppelin.com/abcoathup/32/415_2.png) [@abcoathup](https://forum.openzeppelin.com/u/abcoathup)\
**Post date:** [December 23, 2019, 1:58am UTC](https://forum.openzeppelin.com/t/korean-openzeppelin-sdk-your-first-project/1966/2 "2019-12-23T01:58:08Z")

</div>

Welcome to the community @Blue

Thank you for translating OpenZeppelin SDK "Your first project" into Korean.

The post is a wiki, so anyone can edit. (I changed the formatting from ASCII doc to Markdown).

### Google Translate:

> 커뮤니티 @Blue 에 오신 것을 환영합니다
> 
> OpenZeppelin SDK "Your first project"를 한국어로 번역 해 주셔서 감사합니다.
> 
> 게시물은 위키이므로 누구나 편집 할 수 있습니다. (포맷을 ASCII doc에서 Markdown으로 변경했습니다).
