내가 프로덕트 매니저의 길을 걷기로 결심했을 때, 나에게 필요한 것은 실질적인 지식과 경험이었다. '서비스 기획 PM 완주반'은 이러한 내 요구를 충족시켜줄 완벽한 강의처럼 보였다. 국비지원을 통해 경제적 부담 없이 수강할 수 있다는 점도 매력적이었다.
Part 0. 짚고가기 - 프로덕트 매니저의 기초
'프로덕트 매니저가 되기 위한 만반의 준비'는 이 강의의 첫걸음이었다. 이 세션은 프로덕트 매니저로서 필요한 기본적인 자세와 스킬셋에 대한 개요를 제공했다. 이론보다는 실제 업무에 필요한 실질적인 준비에 중점을 두었던 내용이 매우 유익했다. 여기서 배운 내용은 향후 내 커리어에 귀중한 자산이 될 것이라는 확신이 들었다.
Part 1. 개론 - 문제 발견부터 서비스 운영까지
이 부분은 서비스 기획의 전 과정을 다루었다. 문제 발견, 기회 창출부터 서비스 런칭, 운영, 회고에 이르기까지의 모든 단계를 아우르는 깊이 있는 학습이었다. 특히 SWOT, STP 등 다양한 분석 기법들을 배우면서 시장과 고객을 이해하는 데 큰 도움이 되었다. 이 섹션에서의 학습은 나에게 서비스 기획자로서의 통찰력을 제공했다.
Part 2-1. 역기획 프로젝트 - 실전 같은 실습
이커머스, O2O, 핀테크 등 다양한 분야에서의 역기획 프로젝트는 마치 실전에 참여하고 있는 듯한 경험을 제공했다. 각 분야의 실제 사례를 분석하고, 서비스 내에서 개선점을 찾는 과정은 매우 도전적이었다. 특히 핀테크 강의에서 강사님이 직접 진행한 과정을 보여주면서 진행한 방식은 마치 실제 업무를 수행하고 있는 것처럼 느껴졌다.
강의 수강 팁과 실무적 조언
강의를 수강하면서 가장 중요한 것은 파이널 프로젝트 과제를 먼저 확인하고, 그에 맞춰 강의를 듣는 것이었다. 이렇게 함으로써 강의 내용을 보다 실질적으로 적용할 수 있었다. 또한, 실무 진행 시에는 문제를 다양한 차원에서 접근하고, 시각화를 통해 문제를 명확히 하는 방법을 배웠다. 이러한 접근은 실제 업무에서도 큰 도움이 될 것으로 기대된다.
수강 후기: 장점과 단점
이 강의의 가장 큰 장점은 경력과 내공이 깊은 강사님들의 실무적인 접근법과 문서 작성법을 배울 수 있었다는 것이다. 실제 업무에서 바로 적용 가능한 실무 템플릿 제공도 큰 도움이 되었다. 단, 강의 페이지의 로그인 시스템과 자료 접근 방식에 있어서는 다소 불편함을 느꼈다
결론: 나의 성장과 발전
개인적인 아이디어 기획서를 작성하는데 도움이 된것 같다!!!
이 강의를 통해 서비스 기획의 전체적인 흐름을 이해할 수 있었으며, 프로덕트 매니저로서 필요한 핵심 역량을 키울 수 있었다. '내일배움카드'와 '국비지원교육' 덕분에 경제적 부담 없이 이 귀중한 학습 기회를 얻을 수 있었다는 점도 매우 감사하게 생각한다. 이 강의를 통해 얻은 지식과 경험은 내 커리어에 큰 전환점이 될 것이며, 이를 바탕으로 앞으로 더 큰 도전과 성장을 기대하고 있다.
나는 프로그램을 본업으로 삼고자 많은 패캠에서 많은 프로그램 강의를 듣고 있다. 그리고 올해 7월 중반까지 내일배움카드를 통한 교육을 듣고 있었다. 열심히 프로그래밍 공부를 하다 패스트 캠퍼스 페이지에서 K-디지털 기초역량훈련에 대한 광고를 보게 되었고 마침 나에게도 내일배움카드도 있고, 그렇다면 추가로 일부 훈련비를 환급식으로 해서 단기간 강의를 들을수 있다고?! 이 얼마나 좋은가!!
바로 강의들을 살펴보았고 평소 게임과 VR 관련해서 관심이 있던 나는 내가 만든 캐릭터를 직접 만든 프로그램에 올려서 사용하는 미래를 꿈꾸며 "블렌더로 만드는 정교한 3D 캐릭터 제작" 강의을 신청하여 듣게 되었다!
강의는 입문자용으로 딱 좋은 커리큘럼을 가지고 있는데 나는 아직 듣고 있는 수업이 있었다. 이게 끝나야 집중이 가능한데( 보통 그렇듯 수업 마지막이 바쁘다 ) 패캠 K-디지털 기초역량훈련은 온라인이므로 중반부터라도 무제한 동영상 학습 방식으로 몰아서 들을수 있을 수 있어 나에게는 아주 정말루~ 딱 좋은 강의였다! 또한 추가로 일찍신청하면 얼리버드로 NFT 관련 캐릭터 제작에 대한 강의도 주고 강의를 다듣고 일부 미션을 성공하면 추가 강의 3개월 제공을 해준다고 하니 환급금이라는 목표 외에도 열심히 들어야한다!
# 폴더 생성
mkdir truffle721
# 폴더 진입
cd truffle721
# truffle 초기화
truffle init
# npm 초기화
npm init
개발 환경 준비를 마쳤다면, VScode를 실행합니다.
콘솔에 'code .' 입력
VScode에 나타나는 폴더와 파일의 구조는 다음과 같습니다.
먼저 몇 가지 세팅을 하고, 코드를 가져오겠습니다.
truffle-config.js 를 열고, solc를 설정합니다. solc 는 Solidity, Compiler의 버전 등을 설정합니다. 이 예시에서 사용하는 Solidity의 버전은 "0.8.7"이고, Compiler의 버전은 "london"입니다. 주석을 제거하고, 다음과 같이 설정을 수정합니다.
다음은 네트워크 설정을 편집합니다. Ganache를 이용해 로컬 환경에서 테스트할 예정이므로, 먼저 Ganache를 등록합니다. 다음과 같이 주석을 제거하고, developement를 구분하기 좋게 ganache 로 변경합니다.
이제 로컬 환경에서 Truffle과 Ganache를 이용해 개발하는 환경을 구축했습니다. Ganache를 이용한 배포는 다른 콘텐츠에서 다룹니다.
이전 콘텐츠에서 작성한 코드를 가져오겠습니다. 몇 가지 방법이 있지만, 간단한 코드이므로 복사 & 붙여넣기로 콘텐츠를 진행합니다.
//Contract based on [https://docs.openzeppelin.com/contracts/3.x/erc721](https://docs.openzeppelin.com/contracts/3.x/erc721)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
contract MyNFTs is ERC721URIStorage, Ownable {
using Counters for Counters.Counter;
Counters.Counter private _tokenIds;
constructor() public ERC721("MyNFTs", "MNFT") {}
function mintNFT(string memory tokenURI)
public onlyOwner
returns (uint256)
{
_tokenIds.increment();
uint256 newItemId = _tokenIds.current();
_mint(msg.sender, newItemId);
_setTokenURI(newItemId, tokenURI);
return newItemId;
}
}
함수 mintNFT 에서 변경된 부분은 다음과 같습니다.
파라미터 address recipient 삭제
파라미터 address recipient 를 사용하는 _mint 함수 실행부에서, recipient 를 msg.sender 로 대체
이렇게 변경하면, 오너의 지갑 주소에서만 함수 mintNFT 를 실행할 수 있고, 새로운 NFT는 항상 오너의 지갑 주소로 발행됩니다.
mint 함수는 사용하려는 형태에 따라 편집해서 사용합니다. 정해진 수량의 NFT만 제공하는 경우, NFT를 미리 발행해둔 채 tokenUri 만 업데이트하는 형태로 사용하기도 합니다. 개인 작가처럼 꾸준히 새로운 작품을 NFT로 발행하려면, mint 함수를 생성해두는 편이 좋습니다. 상황에 따라 알맞는 형태로 함수를 구현하세요.
편집한 코드를 복사하세요. VScode로 넘어가서 계속 진행합니다.
contract/ 폴더 아래에 MyNFTs.sol 파일을 생성합니다. 이 파일에 아까 복사해 둔 코드를 붙여넣습니다.
[주의] 이때 Remix에서 복사해오지 않은 경우(ex. 메모장에 코드를 붙여넣고 다시 복사한 경우 등), 코드의 컨벤션이 깨질 수 있습니다. 코드 편집기에서 복사하여, 코드 편집기로 붙여넣는 편이 가장 안전합니다.
이 파일에서는 OpenZeppelin의 파일을 참조하고 있습니다. 따라서, npm 을 통해 openzeppelin 을 설치해야 합니다.
이 경로의 터미널에서 다음의 명령어를 통해 openzeppelin 을 설치하세요.
npm install @openzeppelin/contracts
붙여넣은 코드가 정상적으로 배포되기 위해서는, migration 파일을 설정해야 합니다. migration/ 폴더로 이동하여 1_initial_migration.js 파일을 엽니다. 그리고 다음과 같이 편집합니다.
const Migrations = artifacts.require('Migrations');
const MyNFTs = artifacts.require('MyNFTs.sol'); // MyNFTs.sol 파일 추가
module.exports = function (deployer) {
deployer.deploy(Migrations);
deployer.deploy(MyNFTs); // MyNFTs를 배포에 추가
};
이걸로 ERC721을 이용한 개발을 마쳤습니다. 배포 콘텐츠를 통해, 작성한 컨트랙트를 로컬에서 Truffle과 Ganache로 배포합니다.
2. Truffle로 ERC-721 배포하기
로컬 환경에서 Ganache를 이용해 컨트랙트를 배포합니다. 먼저, 새로운 터미널을 열고 ganache-cli 를 실행합니다.
# 새로운 터미널에서 ganache-cli 실행
ganache-cli
기존의 터미널에서 Truffle로 배포합니다. 이때, truffle-config.js 파일의 network 에 설정한 ganache 로 실행해야 합니다.
[주의] 실행하는 터미널의 현 위치가 package.json, truffle-config.js 의 위치와 동일한지 확인하세요. 맨 처음 truffle init 을 실행한 위치와 동일합니다.
truffle migrate --compile-all --network ganache
위 명령어에서 --network 에 이어 나오는 ganache 는 truffle-config.js 에서 설정한 network 의 키입니다. 위 명령어를 통해 로컬의 ganache-cli 와 연결하고, 컨트랙트를 배포합니다.
컨트랙트의 배포가 잘 이루어졌다면, Truffle console을 이용해 컨트랙트를 조작할 수 있습니다. 다음의 명령어를 터미널 프롬프트에 입력하고, Truffle console에 진입합니다.
truffle console --network ganache
Truffle console에서, 배포한 컨트랙트의 인스턴스를 받아옵니다. 그리고 배포한 컨트랙트가, 작성한 코드와 일치하는지 확인합니다.
배포된 컨트랙트에 대한 확인을 마쳤으면, 작성한 함수가 잘 동작하는지 확인합니다. 이때 함수의 마지막 파라미터로 실행할 지갑 주소를 함께 전달해야 합니다. 이 지갑의 주소는 ganache-cli 의 첫번째 지갑(0번째 인덱스 지갑) 주소입니다. Ganache를 이용해 컨트랙트를 배포할 때에는, default로 첫번째 지갑(0번째 인덱스 지갑)의 주소에서 컨트랙트를 배포합니다.
instance.mintNFT("https://urclass-images.s3.ap-northeast-2.amazonaws.com/beb/section4/unit4/test.json", { from: accounts[0] })
# Tx Information