2021.12.27~2022.1.20 기업협업 회고

성종호·2022년 1월 28일
0

위코드 마지막 과정 기업협업

위코드 사전스터디 1개월 + 정규과정 2개월 + 마지막 단계인 기업협업 회고를 써보려고 한다.

3개월간 위코드에서 공부한 것과 프로젝트를 진행하며 했던 협업 을 토대로 기업에 가서 실제 서비스중이거나 기업에서 내주는 프로젝트 과제를 진행하면 된다.

내가 가게된 기업은 소셜리뷰 앱 '버지'와 소셜공구정보 모음 '셀러브리티' 서비스를 운영중인 머치스퀘어 라는 기업에 가게되었다.

가게된 구성인원은
프론트 : 1명
백엔드 : 2명

내가 진행할 프로젝트는 BSC기반 MIntClub 내의 미니 프로젝트이고
민트토큰사이트에서 팀 토큰을 발행하고, 발행한 토큰을 활용 할 웹페이지 (corknft)안에서 Admin 관리자페이지 API를 맡게 되었다.

4주간의 스케줄은

  • 1주차

    블록체인의 이해 + 기존 코드분석

  • 2주차

    Node.js + MongoDB 사용해서 C.R.U.D 작성

  • 3주차

    Admin 관리자페이지 API 작성
    (실제 서비스에 녹아든 코드라 블로깅 불가)

  • 4주차

    NFT상품 가격 주기적으로 업데이트 하는 API 작성

1주차

첫날 긴장반 설렘반으로 기업에 출근을 했고 오후에 대표님과 간단한 면접 후 NFT관련하여 공부를 했는데 유튜브, 블로그를 보다보니 이해가 안가서 첫날은 너무 졸렸다.. 솔직하게

NFT를 진짜 간단하게 설명하자면

  • 대부분이 이더리움 기반
  • Non-fungible Token (대체불가능토큰)의 약어
  • 거래시 모든 블록체인 파일에 거래내역이 저장

그리고 Wecode 에서 사용한 Python Django 가 아니고 Node.js 와 Express를 사용하고 있었고 개발 패턴에 대해 먼저 공부를 시작

Python Django

  • MVT 패턴
    Model - View - Templat 이며 MVC를 기반으로 생긴 패턴

Templat
프레임 워크에서 실제 브라우저에 보이는 프레젠테이션 로직을 처리하고
사용자에게 인터페이스를 제공

View
실제 API 는 여기서 모두 작성되고 흐름을 처리하거나
Model의 데이터를 업데이트 처리하는 로직

Model
데이터베이스와 상호 작용하는 인터페이스

+URLconf
URLconf 는 장고에서 URL과 일치하는 뷰를 찾기 위한 패턴들의 집합

Node.js Express

  • MVC 패턴
    Model - View - Controller 패턴

View
Django Templat 과 같음

Controller
Django View 와 같음

Model
Django Model 과 같음

+Router
Django URLconf 와 같음


이런식으로 Django 와 대조하여 흐름을 파악

2주차

Node.js + Express + MongoDB 사용해서 간단한 C.R.U.D 작성

### ProductsModel ###

const mongoose = require('mongoose');

const productSchema = new mongoose.Schema({
    product_name:{
        type:String,
        required:true,
        unique: true
    },
    product_thumbnail: {
        type:String, 
        required: true
    },
    product_description: {
        type:String, 
        required: true
    },
    product_price: {
        type:Number, 
        required: true
    }
});
const products = new mongoose.model("product", productSchema);
module.exports = products;

###ProductController ###

const db = require('../models');

module.exports = {
    addproduct:(req, res) =>{
        if(!req.body){
            return res.json({
                success : 0,
                status  : 400,
                msg     : "body null"
            })
        }
        const product = new db.products({
            product_name        : req.body.product_name,
            product_thumbnail   : req.body.product_thumbnail,
            product_description : req.body.product_description,
            product_price       : req.body.product_price
        })
        product.save().then(result => {
            res.json({
                success : 1,
                status  : 201,
                data    : result
            })
        }).catch((err)=>{
            res.json({
                success : 0,
                status  : 400,
                msg     : "not save"
            })
        })
    },
    getproduct:(req, res)=>{
        db.products.find({},(err,data)=>{
            if(err){
                res.json({
                    success : 0,
                    status  : 400
                })
            }
                res.json({
                    success : 1,
                    status  : 200,
                    data : data
            })
        })
    },
    updateproduct:(req, res)=>{
        if(!req.body.id){
            return res.json({
                success : 0,
                status  : 400
            })
        }
        console.log(req.body.price)
        db.products.update(
            {_id:req.body.id},
            {$set:{product_price:req.body.price}},
            (err,result)=>{
                if(err){
                    return res.json({
                        msg:"err"
                    })
                }
                res.json({
                    data:result
                })
            })
    },
    deleteproduct:(req, res)=>{
        if(!req.body.id){
            return res.json({
                success : 0,
                status  : 400
            })
        }
        db.products.deleteOne({_id:req.body.id},(err, result)=>{
            if(err){
                res.json({
                success : 0,
                status  : 400,
                })
            }
            res.json({
                success : 1,
                status  : 200,
                data    : result
            })
        })
    }
}

### index Router ###

const express = require('express');
const router = express.Router();
const productCtrl = require('../controllers/productsController');

/* GET home page. */
router.get('/', function(req, res, next) {
  res.json({
    success: 0,
    status: 404,
    msg: 'Invalid request!'
  })
});

/* product */
router.post('/products', productCtrl.addproduct)
router.get('/products', productCtrl.getproduct)
router.delete('/products', productCtrl.deleteproduct)
router.patch('/products', productCtrl.updateproduct)

module.exports = router;

3주차

3주차의 경우 OpenSea OpenAPI를 사용해서 OpenSea측 NFT상품데이터(상품, Collection의 모든상품, Collection)를 가져와서 사측 DB에 저장할수있는 Admin 관리자 API를 작성하는 것이였는데

이부분은 기업의 실제 서비스중인 코드에 녹아있어 블로깅은 불가합니다.


4주차

NFT상품의 경우 코인으로 구매해야하고 코인같은경우 실시간으로 가격변동이 계속 이루어지기 때문에 주기적으로 사측 DB의 상품 가격을 주기적으로 업데이트 시켜주는 API를 만드는 과제를 받음

기획단계에서 일단은 2가지 방법이 나왔는데

  1. 멀티쓰레딩 형식으로 while문으로 무한루프 돌리며 시간을 정해두고 OpenSea측에 Request 보내서 데이터 받아온뒤 저장
  1. WebSocket 라이브러리 사용해서 업비트 서버와 실시간 양방향 통신으로 데이터 받아오고 정해진 시간마다 DB에 가격 업데이트

위2가지 방법중 먼저 WebSocket 과 Request 라이브러리 사용해서 업비트 서버에 와 양방향 통신을 하면서 데이터를 받아왔는데 1~2시간마다 통신이 끊기는 문제가 발생 그리고 시간을 두고 저장을 해서 굳이 소켓통신을 할 필요가 없어서 다른방법 모색

그러다가 구글링중 node-cron(스케줄러)패키지라는걸 알게되었고 모듈 설치후 코드작성

var cron = require('node-cron')
var db = require('./models/mongo')
var opensea = require('./api/opensea')

cron.schedule('0 * * * *', async ()=>{

  const result = await db.art.find()
  const OpenSeaAPI = new opensea.OpenSeaAPI()

  for(i=0;i<=result.length;i++){

    var opensea_uri = result[i].art_opensea.split("/")

    if(opensea_uri[4] != "klaytn" && opensea_uri[2] == "opensea.io"){
      const data  = await OpenSeaAPI.GetArt(result[i].art_nftaddress, result[i].art_token_id)
      const price = data.orders[0] ? data.orders[0].payment_token_contract.usd_price : 0
      const currency = data.collection.payment_tokens[0].usd_price

      await db.art.updateOne({
          art_id: result[i].art_id}, {$set: {
              art_price: price,
              art_currency: currency}
      })
    }
  }
});

매 정각 0분에 실행되는 코드를 작성해서 가격 업데이트


소통, 협업

기업협업을 같이간 2명의 동기(백엔드1,프론트,1)중 프론트엔드 황주영님은 가자마자 기존코드 리팩토링을 시작해서 바뻤고 백엔드 이주명님은 나와 매일같이 회의실에 들어가서 기존코드를 분석하며 본인이 이해한 내용을 서로 공유하며 많은 의지가 되었다. 그리고 어드민 관리자페이지를 과제로 맡게 되었을때 서로 기능을 나누고 블로커가 생겼을때 서로서로 고민을 나눠 빠르게 해결하였고 황주영님, 이주명님과 관리자페이지 레이아웃부터 통신을 어떻게 할것인지에 대해 회의를 하고 설계를 해서 마지막 날까지 큰문제없이 과제를 완성할수 있었다.

profile
아자

0개의 댓글