How to SCORE #1
Declare & Initialize SCORE member variables
이번 시리즈를 이해하기 위해서는 Python
언어 및 ICON 이 제공하는 CLI 개발도구인 T-Bears 및 ICON SDK 활용법에 대한 약간의 사전지식이 필요합니다.
시리즈의 첫번째 파트에서는 SCORE 프로젝트 생성부터 SCORE 에서 사용할 변수를 선언 및 초기화하는 과정까지 살펴보겠습니다.
Table of Contents
SCORE 프로젝트
IconScoreBase
__init__
on_install
on_update
Hands-on Exercise
SCORE 프로젝트
SCORE 프로젝트를 생성하기 위해서는 갖추어야 할 구조가 있습니다.
물론 직접 파일을 하나씩 생성하고, 내용을 채워가면서 구조를 맞춰갈 수도 있겠지만, T-Bears 를 통해 필수 뼈대를 갖춘 SCORE 프로젝트를 생성하는 것이 보다 효율적일 것입니다.
이미지는 tbears init sample_one SampleOne
를 실행하면 자동으로 생성되는 SCORE 프로젝트의 뼈대에 해당합니다. tests
디렉토리는 SCORE를 테스트하기 위한 테스트 코드가 작성되어 있는 디렉토리로, 실제로 SCORE를 배포할때는 테스트와 관련된 내용이 포함되지 않습니다.
__init__.py : 해당 디렉토리가 Python
패키지라는 것을 의미합니다.
package.json : main_file
, main_score
, version
같은 SCORE와 관련된 데이터들을 기록합니다.
T-Bears 1.1.0.1 버전의 package.json을 기준으로 작성된 내용입니다.
sample_one.py : SCORE를 실제로 작성하는 Python
파일입니다. T-Bears 를 통해 간단하게 생성된 sample_one.py
를 보다 자세히 살펴보며 가장 기본적인 SCORE의 형태에 대해 살펴봅시다.
IconScoreBase
모든 SCORE 클래스는 생성된 SampleOne
같이 IconScoreBase
클래스를 상속받아야 합니다. IconScoreBase
에 대해서는 앞으로 다가올 파트에서 보다 자세히 알아보는 것으로 하고, 이번 파트에서는 상속받은 클래스가 반드시 구현해야 하는 추상메소드들에 대해 살펴보도록 하겠습니다.
__init__
실행 시기 : 클래스의 생성자로 SCORE 클래스의 인스턴스가 생성될 때 마다 실행됩니다.
Usage : SCORE 내부에서 사용할 변수를 선언하기에 적합합니다. 따라서 데이터 저장 및 변경과 같은 쓰기 작업은 권장하지 않습니다. SCORE 에서 사용할 멤버 변수들은 모두 state DB에 의해 관리되어야 합니다.
def __init__(self, db: IconScoreDatabase) -> None:
super().__init__(db)
부모클래스의
__init__
메소드를 반드시 호출해야 합니다.
on_install
실행 시기 : SCORE가 배포되는 순간 단 한번 실행됩니다.
Usage : __init__
에서 선언한 변수들의 초기값을 설정하기에 적합합니다.
def on_install(self) -> None:
super().on_install()
부모클래스의
on_install
메소드를 반드시 호출해야 합니다.
on_update
실행 시기 : 기존에 배포된 SCORE 가 업데이트될 때 마다 실행됩니다.
Usage : 기존의 상태(state)들을 새로운 형태로 저장하기에 적합합니다.
def on_update(self) -> None:
super().on_update()
부모클래스의
on_update
메소드를 반드시 호출해야 합니다.
Hands-on Excercise
IconScoreBase
의 추상메소드들이 어떠한 상황에서 어떠한 목적으로 사용되
는지 알아보았으니, 이제 코드를 통해 실제로 __init__
과 on_install
메소드에서 사용할 변수가 어떻게 선언되고, 초기화되는지 알아봅시다.
아직 VarDB
, ArrayDB
, DictDB
와 같이 ICON 에서 제공하는 DB Abstraction 사용법에 대해서는 다루지 않았으니, 일단 예시를 따라서 작성해 봅시다.
from iconservice import *TAG = 'SampleOne'class SampleOne(IconScoreBase):
_OWNER_NAME = "owner_name" def __init__(self, db: IconScoreDatabase) -> None:
super().__init__(db)
self._owner_name = VarDB(self._OWNER_NAME, db, str) def on_install(self) -> None:
super().on_install()
self._owner_name.set("Life4honor") def on_update(self) -> None:
super().on_update() @external(readonly=True)
def hello(self) -> str:
return f"Hello {self._owner_name.get()}"
SCORE가 처음 배포될 때
on_install
메소드가 실행되며self._owner_name
을Life4honor
로 초기화합니다.
작성한 SCORE 를 T-Bears CLI 를 통해 로컬 T-Bears 환경에 배포하고 변수의 초기화 작업이 제대로 수행 되었는지 확인해 봅시다.
tbears deploy sample_one
tbears txresult 0x96ca69fb6b96ca21e0d13...
편의를 위해 ICONex 를 활용하여 T-Bears 환경에 배포한 SCORE 의 메소드를 호출하여 결과를 확인합니다. 물론 T-Bears CLI 와 ICON SDK 도 메소드를 호출하여 결과를 확인할 수 있습니다.
업데이트를 통해 self._owner_name
의 상태를 수정하고 작업이 제대로 수행 되었는지 확인해 봅시다.
def on_update(self) -> None:
super().on_update()
self._owner_name.set("Life4honor v2")@external(readonly=True)
def hello(self) -> str:
return f"Hello {self._owner_name.get()}. Update Completed."
SCORE가 수정된 소스코드로 업데이트될 때
on_update
메소드가 실행되며 처음on_install
메소드에서Life4honor
로 설정하였던self._owner_name
를Life4honor v2
로 재설정합니다.
tbears deploy -m update -o cx21322d25c2633... sample_one
tbears txresult 0x511599fb8fc144b0d0b4190...
이것으로 How to SCORE 시리즈의 첫번째 파트를 마치겠습니다.
다음 파트에서는 이번 파트에서 설명을 생략하고 넘어간 DB Abstraction 들에 대해 알아보고, 사용 방법까지 알아보도록 하겠습니다.
ICON 과 관련된 추가적인 질문사항이 있는 경우, ICON 의 공식 개발자포럼 혹은 페이스북 그룹에 질문하시면 답변을 얻으실 수 있습니다.