새로운 강의는 이제 https://memi.dev 에서 진행합니다.
memi가 Vue & Firebase로 직접 만든 새로운 사이트를 소개합니다.

바로가기


일렉트론 앱 제작 후기

2 분 소요

최근에 데스크탑 앱을 하나 만들어서 배포했습니다.

바로 일렉트론을 이용해서 말이죠~

그래서 후기로 일렉트론의 생산성에 대해 얘기해보려 합니다.

강좌도 좋지만.. 실제 제작 사례가 없어서 한번 소개해봅니다.

약 5일만에 완성했습니다.

alt cal

그래서 간만에 야근행진을 했습니다…

과거에 c++ 만드는 시간에 비해 3배 이상 단축 된 것 같습니다.

alt dev

개발자스럽게 제작 정보를 넣어주는 쎈쓰도 잊지 않았죠~

바로 일렉트론과 뷰티파이로 뚝딱 유아이 만들고 neDB를 이용해 데이터 처리를 한 것이죠..

일렉트론

딱히 사용한 것이라고는 파일 선택창 정도 불러오는 용도로만 썼습니다.

아쉬운 것은 파일 선택창이 맥에서는 다중파일, 디렉토리중 아무거나 선택이 되는데 윈도우는 둘 중 하나의 기능만 수행하네요..

node.js

새로나온 fs.promise를 야심차게 써봤습니다.

import fs from 'fs'
const checkFile = async (p, ext, rs) => {
    const fp = fs.promises
    const bf = Buffer.alloc(4)
    let fh = null, rb = null, stat = null
    try {
      fh = await fp.open(p, 'r')
      rb = await fh.read(bf, 0, bf.length, 0)
      stat = await fh.stat()
      // 비즈니스로직~ 마음껏
    } finally {
      if (fh) await fh.close()
    }
}

일렉트론으로 구동되는 노드가 10이라 실험적인 기능이라고 경고를 주긴했습니다..

async/await 조합으로 다량의 파일처리를 매우 간결하고 빠르게 작업했습니다.

속도는 네이티브 언어로 제작한 앱보다 느리겠지만.. 편한게 최고입니다~

neDB

sqlite를 쓸까 무지 고민했는데.. 역시 저는 자유로운 영혼이라 noSQL을 택했습니다…

몽구스 같은 odm은 없었지만 다행히도!

nedb-promises 라는 모듈이 있었습니다.

모든 결과를 프라미스로 리턴하게 어느 고마운분이 래핑해놨습니다.

매우 매우 편리하네요~

const saveTrip = async (dv, d) => {
  const sf = d.seconds[0]
  const sl = d.seconds[d.seconds.length - 1]
  let t = await Trip.findOne({ _dv: dv._id, 'sf.t': new Date(sf.t) })
  const tr = {
    plateNo: d.header.plateNo,
    _dv: dv._id,
    sf,
    sl
  }
  if (!t) t = await Trip.insert(tr)
  return t
}

역시 어씽크와 같이 콜백지옥 없는 즐거운 코딩했습니다.

vue.js

말이 필요 없는 화면 처리 최고의 동반자입니다.

  methods: {
    // ..  
    fetch: async function () {
      if (this.searchDialog) this.searchDialog = false
      this.loading = true
      try {
        const f = {}
        if (this.modelDvs.length) f._dv = { $in: this.modelDvs }
        f.ymd = {
          $gte: Number(this.$moment(this.dp.sf).format('YYMMDD')),
          $lte: Number(this.$moment(this.dp.sl).format('YYMMDD'))
        }
        this.totalItems = await this.$gb.Day.count(f)
        const s = {}
        s[this.setOrder] = this.setSort
        this.items = await this.$gb.Day.find(f).sort(s).skip(this.setSkip).limit(this.pagination.rowsPerPage)
      } catch (e) {
        this.onError(e)
      }
      this.loading = false
      return this.items
    }
    // ..
  }

메쏘즈의 펑션을 아예 어씽크로 잡고 마구잡이로 사용했습니다~

어디로 튈지 모르는 에러만 캐치로 잡아주면 끝납니다~

vuetify

아무리 뷰가 최고의 화면동반자라도 부트스트랩, 뷰티파이 같은 css프레임웤 없이는 전 아무것도 할 수가 없답니다..

sass 같은 거 직접 써서 구현하시는 분들 정말 대단합니다.

  <v-card height="100%">
    <v-toolbar color="deep-purple" dense class="white--text">
      <v-toolbar-title class="subheading">
        운행 이력
      </v-toolbar-title>
      <v-spacer></v-spacer>
      <v-btn icon @click="list">
        <v-icon color="white">refresh</v-icon>
      </v-btn>
    </v-toolbar>
    <v-data-table
      :headers="headers"
  </v-card>

v-card와 v-toolbar를 닥치는대로 사용했습니다.

대충 만들어도 공대감성을 지워주는 뷰티파이는 늘 감사할 따름입니다.

alt vuetify

유튜브

매뉴얼도 좋지만 너무 간단한 앱이라 차라리 영상으로 설명하는 것이 빠르겠다 생각해서 추가해봤습니다.

사실 매뉴얼 만들기 싫어서…

alt ytb

import VueYouTubeEmbed from 'vue-youtube-embed'

Vue.use(VueYouTubeEmbed)

요렇게만 해주면 어느 페이지에서도 사용이 가능합니다~

자세한 것은 npm vue-youtube-embed 검색해서 다양하게 삽입이 가능합니다~

구글맵

키 권한이 문제입니다..

alt ytb

보통 도메인 주소로 키 제한을 두는데.. 로컬(http://localhost)에서 돌아가는 일렉트론은 대체 어찌해야할런지..

좀더 알아봐야할 숙제입니다..

결론

개발할 맛 납니다.

컴파일 없이 저장만 하면 바로바로 화면 반영되고 매우 빠릅니다.

일렉트론으로 전향하실 분들에게 좋은 참고가 되었으면 합니다~

숙제 끝냈으니 이제 다시 모바일하러 떠나야겠네요~

추후에 기회가 된다면 일렉트론도 다시한번 강좌를 리뉴얼해야겠습니다~

영상

댓글남기기