구글 스프레드시트를 개인적으로든 업무적으로든 다양하게 사용중입니다.

드랍다운 기능이 생기면서 엄청 유용하게 사용하고 있는데요
리스트를 자주 추가해줘야 하는 경우 드랍다운 목록으로 관리하든 범위로 관리하든 불편하기는 매한가지입니다.

그래서
드랍다운 대상 시트에 내용 입력 시 드랍다운 목록 범위에 있으면 그대로 사용하고
목록 범위에 없으면 목록 범위에 추가해주도록 스크립트를 만들었습니다.

function onEdit(e){
  //e.range.getColumnIndex() : 수정될 시트의 컬럼 번호
  //listEdit 함수의 두번째 파라미터 column : 참조할 리스트가 있는 컬럼 번호
  var colNum = 0;
  
  //여러 컬럼 리스트를 사용해야 하는 경우 수정할 컬럼과 참조할 컬럼을 여기에 추가
  if(e.range.getColumnIndex() == 1) colNum = 1;
  if(e.range.getColumnIndex() == 3) colNum = 4;

  if(colNum != 0) listEdit(e.value, colNum);
}

function listEdit(value, column){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sh = ss.getSheetByName('list');
  var row = 2;
  var lists = [];
  while(sh.getRange(row, column).getValue() != ''){
    lists.push(sh.getRange(row, column).getValue());
    row++;
  }
  var result = false;
  for(var list of lists){
    if(value == list){
      result = true;
      break;
    }
  }
  if(!result){
    sh.getRange(row, column).setValue(value);
    row++;
  }
}

위 코드에서 몇가지 제약사항이 있는데요
1. 목록 시트명 고정 필요
2. 참조 리스트는 공백이 생기지 않게 할 것(리스트 삭제 시 아래 엤는 내용 끌어올려야함)

위 두가지만 지켜주시면 됩니다.

나중에 견본 시트 같이 올려드리겠습니다.

블로그 이미지

ligilo

행복한 하루 되세요~

,

3월 한빛출판사의 '나는 리뷰어다'에서 선정된 도서는 '모던 자바스크립트로 배우는 리액트 입문'입니다.

말 그대로 '리액트 입문'에 정말 좋은 책입니다. 입문에 좋다는 얘기는 결국 맛보기에는 좋지만 깊이있게 들어가려면 또다른 공부를 해야 한다는 말이기도 한데요 이 책으로 기본을 쌓고 깊이있게 들어가거나 필드에서 경험하면 괜찮겠다는 생각을 했습니다.

책의 구성을 보면 1~3장까지는 모던 자바스크립트에 대한 얘기를 합니다. 개발자를 그만두고 보안 업무를 한지도 벌써 5년이 넘은 지금 제가 사용하는 자바스크립트 구문이 너무 오래 된 구문이라는 걸 알고는 있었지만 너무 강하게 느끼게 해준 챕터입니다. 그리고 너무나 당연하게 쓰고 있던 자바스크립트 연산자 등도 다시한번 생각하게 해준 챕터입니다.

자바스크립트 잘 쓰고 있으니 바로 리액트로 들어가면 되겠다 생각하셨던 개발자 분들도 한번쯤 훑어보면 괜찮을 것 같다는 생각이 듭니다.

4장에서는 리액트 기본에 대해 얘기하는데요 백엔드에서는 node.js, 프론트앤드에서는 jquery를 주로 써왔던 저로서는 같은듯 다른듯 한 부분이 너무 많아 혼란스러운 부분이 없지는 않았습니다만 정말 리액트의 기본이 되는 개념들에 대한 얘기라 반드시 알고 지나가야 할 챕터입니다.

5장에서는 CSS에 대해 얘기하는데요 개인적으로 기존 프론트앤드 작업을 할 때에도 CSS는 너무나 어려웠고 지금도 CSS는 계속 어렵지만 스타일을 잡는게 어려운거지 문법이 어려운건 아닌만큼 이 챕터는 기존 CSS가 이런 방식으로 사용되는구나를 알고 넘어갈 수 있을 것 같습니다.

6장은 랜더링에 관한 내용인데요 저처럼 예전의 모든 처리는 백엔드에서 하고 프론트엔드는 단순히 뿌려주기만 했던 시기에 머물러 계신 분들이라면 7장과 더불어 너무나 혼란스러울만한 챕터입니다. 6장에서는 랜더링과 재랜더링 과정에서 최적화를 얘기하고 있고 7장은 여러 컴포넌트에서 사용할 수 있는 글로벌 State 관리에 대해 얘기하는데 이전의 프론트엔드에서는 전혀 고려할 필요가 없었던 부분이지만 프론트엔드에서 처리하는 범위가 넓어짐에 따라 성능관리나 상태관리가 중요해진 듯 합니다. 이 부분이야말로 책을 보면서 개념은 익혔지만 대규모 접속이 발생하는 프로젝트를 경험해보지 않으면 와닿지 않는 챕터가 아닐까 싶습니다.

8장은 타입스크립트에 대한 내용입니다. 자바스크립트를 사용하시던 많은 분들이 이미 타입스크립트를 사용하고 계시는걸로 알고 있는데요 어찌보면 자바스크립트가 유난히 타입에 대한 고민이 불필요했고 그게 장점이자 단점으로 작용한 만큼 문법을 익혀야 하기는 하지만 다른 언어를 공부해보신 분들이라면 그리 낯선 개념은 아닐것 같습니다.

9장에서는 사용자 정의 훅을 다루고 있는데요 컴포넌트를 분리하여 사용하는데 꼭 필요한만큼 대규모 프로젝트로 가면 갈수록 유용해질만한 기능입니다.

부록으로 실전 연습할만한 문제를 제시해 주고 있습니다. 새로운 언어를 배우고 나면 사이드 프로젝트를 고민하는 경우도 많은데요 본인이 필요로 하는 어플리케이션을 만들어보는것도 좋지만 막막하다면 이런 문제를 풀어나가보는것도 좋을 것 같습니다.

 

리액트에 대해 들어본지는 꽤 됐습니다만 공부해볼 생각을 하지 못했고 아직 프론트엔드는 백엔드에서 처리한 내용 불러와서 뿌려주기만 하면 되는거 아닌가 라고 생각했던 저에게는 발상의 전환을 일으켜 준 책입니다. 프론트엔드 엔지니어로 시작하려는 분들은 말할 것도 없고 복잡한 프론트엔드 작업을 하는게 아니더라도 프론트엔드 엔지니어와 협업이 필요한 백엔드 엔지니어도 훑어보시면 많은 도움이 되지 않을까 싶습니다.

"한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다."

블로그 이미지

ligilo

행복한 하루 되세요~

,

2월 한빛출판사의 '나는 리뷰어다'에서 선정된 도서는 '업무에 바로 쓰는 AWS 입문'입니다.

이 책에 대해 한마디로 정리하자면 책 제목 그대로 'AWS 입문서'입니다.

AWS를 3년 넘게 사용해 왔지만 개발보다는 보안 입장에서 사용해온 저로서는 개발자 입장에서 알아야 하는 가장 기본적인 서비스가 모두 담겨져 있어 너무나 좋았습니다.

책의 구성을 보면

1장. 'AWS 개요'에서는 AWS가 무엇이고 왜 사용해야 하는지에 대해 알 수 있는 챕터입니다. 기술적인 내용보다는 AWS 서비스가 어떤 것인지를 알 수 있는 챕터이니 가볍게 읽어볼 수 있습니다.

2장부터 10장까지는 IAM, EC2, RDS, S3, CloudWatch, Lambda, CloudFront, DynamoDB, API Gateway 각각 서비스에 대해 설명하고 있습니다. 전체적인 구성은 각 서비스에 대한 설명 후 실습하기가 있는데 실습 이미지가 상세하게 나와 있어 글로만 나와있는 '따라하기'보다 더 좋은 구성이라고 생각합니다.(따라하기는 말 그대로 따라하기에 급급해져 내용에 대한 이해가 떨어지는 경우가 발생하는 듯 합니다.)
전체적으로 2장부터 10장까지의 각각의 서비스에 대한 내용이 자세하다고 말할 수는 없습니다. AWS 서비스는 하나하나가 너무나 방대하고 그 범위는 끊임없이 늘어나고 있습니다. 제가 주로 활용해 온 CloudWatch만 하더라도 매년 AWS Re:Ivent를 할 때마다 새로운 기능이나 확장된 기능이 생기고 있습니다. 다만, 이 책에서는 각 서비스의 가장 기초적인 부분을 다루고 있어 해당 서비스에 접근할 수 있게 만들어 주는 그런 내용들입니다.

11장은 CI/CD 파이프라인을 얘기하고 있습니다. 물론 CI/CD 파이프라인 역시 AWS에서 제공하는 서비스이긴 합니다만 결국 제대로 사용하려면 AWS와 Github 등의 코드 Repository와 연결되어야 한다고 생각해서 설명은 별도로 뺐습니다. 이 챕터는 개인적으로 이런게 있다 정도만 보고 본인이 사용하는 Code Repository와 AWS의 연동을 깊이있게 살펴보는게 더 좋지 않을까 싶습니다.

이 책을 처음 한두 챕터 봤을 때 너무 기초적인 내용이기 때문에 볼 필요가 있을까 싶은 생각도 들긴 했습니다만 수많은 AWS의 서비스 중 웹서비스를 하기 위해 필수적인 서비스들의 기본을 익히기에는 더할 나위 없다는 생각이 듭니다. 특히나  앞에서 얘기했듯이 AWS 서비스는 하나하나가 너무나 방대한 양을 공부해야 하기 때문에 이 책을 이용해 기초를 훑은 후 본인이 필요한 서비스에 대해 깊이있게 익히면 보다 쉬운 접근이 되지 않을까 싶습니다.

"한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다."

블로그 이미지

ligilo

행복한 하루 되세요~

,

구글드라이브에 너무 많은 파일을 넣어놓다보니
나름 폴더 정리를 한다고 생각했는데도 찾기가 힘들때가 상당히 자주 있습니다.
그래서 구글드라이브의 파일 리스트를 만들 필요성을 느꼈는데요
개인적으로도 잘 사용하고 있지만 특히 회사에서 공유드라이브의 파일 목록을
매일 새벽에 업데이트 하도록 트리거를 걸어놓아서 매우 잘 사용하고 있습니다.

아래 스크립트를 이용하시면 될 것 같습니다.
두개의 function을 이용하고 있고
특정 폴더 아래의 파일 리스트를 추출하고자 하시는 경우
9행의 getFileList의 파라미터를
폴더명, folderID, 0 으로 입력해 주시면 됩니다.

혹시 질문 있으시다면 댓글로 달아 주시면 친절히 답해 드리겠습니다.

var maxlevel = 0;
var filelist = [];

function fileList() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sh = ss.getSheetByName('FileList');
  sh.clear();
  var root = DriveApp.getRootFolder().getId();
  getFileList('root', root, 0);
  sh.getRange(1, 1).setHorizontalAlignment('center');
  
  sh.getRange(1, 1).setValue('Folder');
  sh.getRange(1, 2).setValue('FileName');
  sh.getRange(1, 3).setValue('FileUrl');
  sh.getRange(1, 4).setValue('FileMimeType');
  sh.getRange(1, 5).setValue('Description');
  var row = 2;
  for(var i in filelist){
    sh.getRange(row, 1).setValue(filelist[i].folderName);
    sh.getRange(row, 2).setValue(filelist[i].fileName);
    sh.getRange(row, 3).setValue(filelist[i].fileUrl);
    sh.getRange(row, 4).setValue(filelist[i].fileMimeType);
    sh.getRange(row, 5).setValue(filelist[i].fileDescription);
    row++;
  }
  sh.getRange(2, 1, 5).sort(1);
}

function getFileList(name, id, level){
  if(maxlevel < level) maxlevel = level;
  var folder = DriveApp.getFolderById(id); // I change the folder ID  here 
  var subfolders = folder.getFolders();
  while(subfolders.hasNext()){
    subfolder = subfolders.next();
    getFileList(name + '\\' + subfolder.getName(), subfolder.getId(), ++level);
    level--;
  }
  var files = folder.getFiles();
  while(files.hasNext()){
    file = files.next();
    filelist.push({
      folderName: name, 
      fileName: file.getName(),
      fileUrl: file.getUrl(),
      fileMimeType: file.getMimeType(),
      fileDescription: file.getDescription() == null ? '' : file.getDescription()
    });
  }
}
블로그 이미지

ligilo

행복한 하루 되세요~

,

7월 한빛출판사의 '나는 리뷰어다'에서 선정된 도서는 '구글앱스 스크립트 완벽 가이드'입니다.

이 책에 대한 소감을 한마디로 정리하자면 '구글 앱스 스크립트를 애용하는 사람에게 사전과 같은 책'입니다.

이전부터 구글의 다양한 문서시스템이나 기능을 사용하고 있었지만 3년 전 구글을 주 업무시스템으로 사용하는 회사에 입사하게 되면서 구글스프레드시트를 이용한 업무 자동화에 매우 큰 관심을 갖게 되었고 현재도 매우 잘 활용하고 있습니다만 기능이 필요할때마다 검색해보고 그것도 구글스프레드시트에 한정되어 사용하면서 생겼던 답답함을 어느정도 해소할 수 있었습니다.

책의 구성을 보면

Chapter1. '구글 앱스 스크립트 기본지식'에서는 구글앱스에 대한 기본적인 지식을 전달하고 있습니다. 구글 서비스와 기반 언어 등에 대해 설명하는 챕터이고 양도 그리 많지 않으니 가볍게 읽고 넘어가도 괜찮을 것 같습니다.

Chapter2. '스크립트 편집기와 대시보드'에서는 편집기와 대시보드를 어떻게 다뤄야 하는지를 얘기하고 있습니다. 저 역시 그랬습니다만 많은 이들이 문서에서 'Google Apps Script'메뉴를 이용해 편집기에 들어오기 때문에 편집기에는 익숙하더라도 대시보드에는 익숙하지 않은 경우가 많고 로그나 디버그에 대해 신경을 쓰지 않는 경우가 많지만 스크립트에 대한 전체적인 파악을 위해서 대시보드도 활용도가 상당하고 디버그나 로그는 힘들게 말할 필요가 없을 만큼 중요한 영역이니 놓치지 말고 읽어보셨으면 하는 영역입니다.

Chapter3. '기본문법'과 Chapter4. '제어문', Chapter5. '함수', Chapter6. '클래스와 객체', Chapter7. '자바스크립트의 내장객체'는 GAS에서 사용하는 문법을 다루고 있습니다. 자바스크립트를 기반으로 하기 때문에 자바스크립트에 익숙하신 분이라면 굳이 이걸 봐야하나 싶을 정도로 유사합니다만 자바스크립트와 완벽하게 동일한 언어는 아니기 때문에 가볍게 한번 훑으시는 것도 괜찮을 것 같습니다. 또한 자바스크립트를 모른다고 하더라도 그리 어렵지 않게 받아들일 수 있으니 하나씩 따라 하다보면 익숙해질 수 있습니다. 다만, 이 내용이 너무 많은 양을 차지하기 때문에 자바스크립트에 익숙한 저로서는 시간이 아깝다는 생각이 들기도 한 챕터입니다.

Chapter8. '스프레드시트', Chapter9. '지메일', Chapter10. '드라이브', Chapter11. '캘린더', Chapter12. '문서', Chapter13. 프리젠테이션, Chapter14. '설문지', Chapter15. '번역'은 각각의 서비스에서 사용할 수 있는 클래스, 메서드와 더불어 각 서비스의 특성에 맞는 기능을 설명하고 있습니다. 제가 앞에서 '사전'과 같은 책이라고 표현한 것은 이 챕터와 뒤에 나오는 공통 영역에서의 클래스, 메서드때문에 그렇게 표현한 것입니다.

Chapter16. 'Base서비스'는 GAS의 모든 영역에서 호출이 가능한 Base에 대한 설명으로 어디서나 사용하는 console 클래스를 생각하시면 편할 것 같습니다.

Chapter17. '사용자 인터페이스'는 UI에 대한 내용을 담고 있습니다. 다이얼로그는 기존부터 계속 다뤄왔던 부분이라 새로울 것이 그닥 없었습니다만 Menu작성은 매유 새롭기도 했습니다. 이 영역을 잘 응용한다면 아주 효율화된 구글 문서를 만들 수 있지 않을까 싶습니다.

Chapter18. '파일과 데이터 조작', Chapter19. 'Utilities 서비스', Chapter20. 'Properties 서비스'는 Base서비스나 UI와 마찬가지로 GAS의 모든 영역에서 사용할 수 있는 서비스들에 대한 설명입니다. 저같이 특정 서비스에서 업무 자동화를 목적으로 사용해오신 분들에게는 자동화 또는 효율화를 한층 업그레이드 시키고자 할 때 이 영역을 참고하시면 많은 도움이 되지 않을까 싶습니다.

Chapter21. '이벤트와 트리거'는 매우 유용한 기능이고 특히 대량의 데이터를 다루는 작업을 자동화 할 때 개인적으로 매우 유용하게 사용하는 기능입니다. 다만, 심플 트리거만 사용하고 있었고 심플 트리거의 조합을 이용해 자동화를 시킨 입장에서 조금 더 발전시킬 수 있지 않을까 하는 기대를 해보고 있습니다.

Chapter22. '외부 서비스 접속'에서는 다양한 웹의 데이터를 가져오는 내용에 대해 설명하고 있습니다. 이것을 잘 이용한다면 업무중 활용되는 데이터중 일부를 쉽게 끌어올 수도 있을 것으로 생각됩니다.

Chapter23. '라이브러리'는 제가 불편해하던 영역에 대해 시원하게 해결을 해준 챕터였습니다. 시간 처리나 DB 접속처럼 자주 사용하는 스크립트를 그동안 파일 하나를 만들어서 거기에 집어넣어서 보관하고 새로 만든 스크립트 파일에서 필요한 내용이 있다면 복사하는 방식을 사용해 왔는데요 라이브러리를 이용해 굳이 번거롭게 그런 작업을 할 필요가 없었습니다.

아무래도 대부분 언어 기초와 각 서비스별 클래스, 메서드 설명이 주를 이루기 때문에 재미있는 책이라고 말씀드리기는 어려울 것 같습니다. 다만, 항상 옆에 두고 인덱스를 해두고 언제든 필요할 때 찾아보기 너무나 좋은 책이라는 생각이 들었습니다.

 

"한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다."

블로그 이미지

ligilo

행복한 하루 되세요~

,

Google Document를 업무에 상당히 많이 사용하게 되면서 자동화 시킬 수 있는건 상당수의 업무를 자동화 시키고 있습니다. 특히 보안 업무를 하다보면 로그 데이터를 보게 되는 경우가 엄청 많은데요 이 과정에서 스크립트를 이용하면 엄청 업무가 편해집니다.(일부 개발을 해서 사용하는 경우도 있지만 대부분의 보안 담당자는 개발을 해 본 경험이 없기 때문에 가능하면 스크립트를 사용하려고 합니다. 제가 퇴사하고 나서도 봐줄수는 없으니까요...)

점검하다보면 날짜 기반의 검토가 필요한 경우가 있는데요 구글스크립트에서 날짜를 아무리 찍어봐도 계속 GMT+5의 시간이 나오고 있어 이걸 DB나 DW로 연결시키는데 틀어지는 부분이 계속해서 나타나고 있었습니다.

그래서 구글링을 한 결과 다음과 같이 변경하면 쉽게 대한민국 표준시로 변경해서 모든 작업을 수행할 수 있습니다.

일단 설정을 변경하기 전 화면을 보겠습니다.

보시다시피 GMT+5 기준의 시간이 나타나고 있습니다.

이걸 설정만 변경하면 대한민국 표준시로 변경할 수 있습니다.

1. 설정에서 '편집기에 appscript.json 매니페스트 파일 표시'에 체크합니다.

2. 다시 편집기로 돌아오면 appscript.json 파일이 보여지는데요 이 파일을 열어서 timeZone 부분을 변경합니다. 대한민국 표기는 'Asia/Seoul'입니다.

3. 설정 변경된 파일 저장 후 다시 설정에서 appscript.json 매니페스트 파일은 숨기셔도 괜찮습니다.

이렇게 하면 설정 변경이 끝납니다.

위 코드를 다시 실행시키면 다음과 같이 출력되는 모습을 볼 수 있습니다.

이걸 못찾아서 포맷도 변경했다가 데이터에서 시간 값을 추출한 후에 더하기도 해봤다가 별짓을 다 해봤네요..

혹시 이 부분때문에 고생하고 계신 분이 계셨다면 부디 도움이 되셨으면 좋겠습니다.

 

혹시 앱 스크립트 관련해서 이 글과 관련없는 부분이라도 모르는 부분이 있다면 댓글 또는 방명록에 글 남겨주시면 힘 닿는데까지 도와드리도록 하겠습니다.

블로그 이미지

ligilo

행복한 하루 되세요~

,

2021년의 마지막 한빛출판사의 '나는 리뷰어다'에서 선정된 도서는 모던 자바스크립트 핵심 가이드입니다.

현재 전업 개발자는 아닙니다만 필요에 따라 꾸준히 개발을 하고 있는 입장에서 자바스크립트가 개발자 시절에도 주 언어였고 현재도 Node js를 이용한 개발을 주로 하다보니 자바스크립트의 발전에는 꽤나 관심이 많은 편입니다.

다만, 이번 도서를 보다보니 제가 사용하고 있는 언어가 꽤나 오래됐고 그동안 불편하다고 느꼈던 부분이 이미 개선된 문법으로 나와있다는것을 많이 알게 되었습니다.

이 책의 구성은 다음과 같습니다.

Chapter00. 자바스크립트의 개요에서는 변수나 자료형, 함수, 스코프처럼 자바스크립트의 중요한 개념에 대해 설명하고 있습니다.

Chapter01. var, let, const
Chapter02. 화살표 함수
Chapter03. 함수 기본값 인수
Chapter04. 템플릿 리터럴
Chapter05. 문자열 메서드
Chapter06. 디스트럭처링
Chapter07. 루프
Chapter08. 배열 메서드
Chapter09. 스프레드 연산자와 레스트 매개변수
Chapter10. 객체 리터럴의 업그레이드
Chapter11. 심벌
Chapter12. 클래스
Chapter13. 프로미스
Chapter14. 제너레이터
Chapter15. 프록시
Chapter16. 세트 위크셋, 맵, 위크맵
까지는 각 문법을 설명하고 있습니다. 기존에 있던 문법이지만 혼용하거나 잘못 사용하는 경우가 많은 개념도 있고 자바스크립트가 발전해 나가면서 새로 생긴 문법도 많이 있습니다.

개인적으로 개발하면서 필요한 기능, 문법을 찾아서 사용하다보니 대부분의 문법은 상당히 오래된 문법을 사용하고 있었지만 프로미스 등 몇몇 기능은 이미 사용하고 있는 문법이나 기능도 있었습니다.

Chapter17. ES2016의 새로운 기능
Chapter18. ES2017 : 문자열 패딩, Object, entries(), Object, vaues()등
Chapter19. ES2017 : async와 await
Chapter20. ES2018의 새로운 기능
Chapter21. ES2019의 새로운 기능
Chapter22. ES2020의 새로운 기능
은 각 버전별 새로 생긴 매우 유용한 기능들에 대해 설명하고 있습니다.

Chapter23. 타입스크립트 기초는 말그대로 타입스크립트를 아주 기초적인 수준으로 다루고 있습니다.

부록으로 ES2021 기능에 대해서도 간단히 얘기하고 있습니다.

자바스크립트 자체가 진입장벽이 그리 어려운 언어는 아니었습니다. 특히, 대부분의 로직을 백엔드에 의존하고 프론트엔드에서는 아주 단순한 제어만 하던 시절에는 자바스크립트는 언어가 아니라고 주장하는 이들도 있었으니까요.. 하지만 자바스크립트를 이용해 백엔드나 크로스플랫폼 프로그램까지 개발이 가능한 시절이 오다보니 엄청난 발전이 이뤄지고 이에 따라서 언어 자체도 많이 복잡해지고 있는 듯 합니다.

이 책은 그럼에도 불구하고 진입장벽이 다른 언어에 비해서는 많이 낮다고 생각되는(제 개인적인 생각입니다) 자바스크립트의 문법을 설명하는 만큼 초급자가 보기에도 아주 어려운 책은 아니라고 생각됩니다. 하지만, 작은 책에 많은 양을 집어넣다보니 자바스크립트를 완전히 처음 접해보는 사람이 보기에는 쉽지 않은 책일지도 모르겠다는 생각이 듭니다.

가장 추천하고 싶은 사람은 저처럼 자바스크립트를 꾸준히 써옸지만 개선된 기능들을 모르고 예전 방식 그대로 개발을 해온 개발자입니다.(실제로 이 책을 보고 현재 개발중인 프로젝트의 많은 부분을 개선했습니다.)
하지만, 자바스크립트의 기본만 알고 있어도 어렵지 않게 이해할 수 있고 그만큼 더 빠른 발전을 이룰 수 있지 않을까 하는 생각을 해봅니다.

 

"한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다."

블로그 이미지

ligilo

행복한 하루 되세요~

,

회사의 모든 개발자는 맥을 사용한다.

그러나 항상 엑셀과 한글을 써야하고 온갖 대관업무를 해야하는 내가 굳이 익숙하지도 않은 맥북을 사용하고싶지는 않아 끝까지 윈도우를 고수하고 있다. 난 개발자가 아니니까...
(이 블로그의 대부분의 글은 보안 뉴스가 차지하고 있다. 나는 보안담당자이고 업무상 필요한 부분까지만 개발을 하고 있을 뿐이다)

그런데 내부 관리용 툴을 만들어서 서비스를 실행시키려고 했으나 인프라 담당 부서에서 지금 떠있는 쿠버네티스를 이용했으면 한다는 연락을 받았다.

그러나, 문제는 아무도 윈도우에서 쿠버네티스 환경을 구성해서 개발을 해본 사람이 없다는거...

결국 나 혼자 열심히 삽질을 하게 됐다.

어차피 도커라이징이야 지금도 열심히 도커 환경에서 돌고있는 개인 서비스도 있고 하니 별 어려움 없이 넘어갔는데
쿠버네티스를 설치하고 실행시키는것 까지도 전혀 문제가 없었다.

쿠버네티스의 튜토리얼을 열심히 따라했다.
대시보드까지도 잘 띄웠다.
문제는 로컬에 있는 도커 이미지를 쿠버네티스에서 실행시키는거...

오전 내내 kubectl get events 명령을 실행했을때 아래 명령을 보고 있었다

Error response from daemon: pull access denied for testimage, repository does not exist or may require 'docker login': denied: requested access to the resource is denied

인터넷에서 찾아봤을 때 @FOR /f "tokens=*" %i IN ('minikube -p minikube docker-env') DO @%i 구문을 입력하고 동일한 터미널에서 도커 빌드하면 쿠버네티스에서 사용할 수 있는 도커 이미지로 생성된다고 하는데 아무리 해도 여전히 도커 이미지를 웹에서 찾고있다

결국 찾아낸 방법은 쿠버네티스 deploy를 yaml 파일로 하면서 로컬에 있는 도커 이미지를 사용하도록 만드는 것.

그래서 어차피 만들어야 하는거 서비스까지 실행하도록 했다.(예시는 express 프로젝트 이미지라 3000번 포트를 이용했다)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: testdeployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: test
  template:
    metadata:
      labels:
        app: test
    spec:
      containers:
      - name: test
        image: testimage
        imagePullPolicy: Never

위 내용으로 kubernetes.yml 파일을 만들고(파일명은 상관없다)

kubectl create -f kubenetes.yml

명령을 입력하니 정상적으로 디플로이 되었다.

여기에서 나머지 쿠버네티스 튜토리얼에 따라

kubectl expose deployment test --type=LoadBalancer --port=3000

을 실행시키고 

minikube service test

를 실행시키니 서비스가 정상적으로 올라오더라...

블로그 이미지

ligilo

행복한 하루 되세요~

,

 

이번달 한빛출판사의 '나는 리뷰어다' 프로그램에서 선정된 도서는 <이벤트 기반 마이크로서비스 구축> 입니다.

전반적으로 보면 옮긴이의 말에서처럼
이벤트 기반 '마이크로서비스 구축'이 아닌 '이벤트 기반' 마이크로서비스입니다.

어찌보면 말장난일 수도 있겠지만 마이크로서비스보다는 이벤트 기반 시스템 구축에 방점이 맞춰져 있다고 생각됩니다.

책 구성은 다음과 같습니다.

총 17개 챕터로 구성되어 있습니다.

첫번째 챕터에서는 마이크로서비스에 대한 이야기를 하고 있는데요 마이크로서비스에 대한 이해가 없다면 이 챕터를 반드시 정독해야 합니다.

두번째 챕터에서는 이벤트 기반 마이크로서비스에 대한 기초적인 내용을 설명하고 있습니다. 마이크로서비스에 대해서는 첫번째 챕터에서 다뤘기 때문에 이 챕터에서는 이벤트 기반 서비스 구축을 중심으로 설명하고 있습니다.

세번째 챕터는 통신 및 데이터 규약에 대해 설명하고 있으며 네번째 챕터에서는 기존 시스템과 이벤트 기반 아키텍처를 통합하는 문제에 대해 얘기하고 있습니다. 

다섯번째 챕터부터는 구체적인 이야기를 하고 있는데요 다섯번째 챕터에서는 이벤트 기반 처리에 대한 기본적인 내용을 다루고 있으며 여섯번째 챕터에서는 스트림 처리, 일곱번째 챕터에서는 상태저장 스트리밍에 대해 얘기하고 있습니다. 여덟번째 챕터에서는 실제 워크플로 구축하는 방법을 설명하고 있으며 아홉번째 챕터에서는 FaaS를 응용한 마이크로서비스에 대한 얘기를 하고 있습니다.
개인적으로는 FaaS 서비스를 이용하고 있기도 하고 관심도 있고 해서 상당히 흥미롭게 본 챕터이긴 합니다.

열번째 챕터에서는 프로듀서/컨슈머 마이크로서비스를 얘기하고 있고 열한번째, 열두번째에서는 각각 대용량과 경량 프레임워크에 대한 얘기를 하고 있습니다.

열세번째 챕터에서는 이벤트 기반 마이크로서비스와 요청-응답 마이크로서비스의 통합에 대한 얘기를 하고 있는데요 이미 마이크로서비스를 구축하고 계신 상태에서 이벤트 기반의 서비스 구축으로 변경하고자 하신다면 이 챕터가 가장 큰 관심사가 아닐까 싶습니다. 어차피 기존의 요청-응답 구조의 마이크로서비스를 한순간에 이벤트 기반으로 완전히 옮기는 일이 쉬운 일은 아닐테니까요..

열네번째 챕터부터는 지원도구와 테스트, 통합 그리고 마무리를 짓는 챕터입니다.

 

사실 개발이 주업무가 아니고 마이크로서비스 시스템 구축을 해본적도 없는 저에게 결코 쉽지 않은 책이었습니다. 마이크로서비스에 대해 관심을 가져 이 책을 보긴 했습니다만 마이크로서비스도 익숙하지 않은데 너무나 생소한 이벤트 기반 서비스에 대한 내용은 상당히 어렵게 느껴진 책임에는 틀림없습니다.

하지만 아키텍처는 꾸준히 발전하고 있고 클라우드의 발전과 함께 다가온 마이크로서비스 아키텍처의 대중화 물결 속에서 또 개발의 범위가 무한히 확장되고 있는 속에서 기존의 요청-응답 방식에서 벗어난 이벤트 기반의 서비스 구축을 고민해보고 있다면 쉬운 책은 아닐지라도 개발에서 한발 벗어나 있는 제가 볼만하다고 느낀 책이니만큼 실제 개발하면서 머릿속에서나마 현장을 접목시켜볼 수 있는 수많은 엔지니어에게는 많은 도움이 될 수 있는 책이 아닐까 싶습니다.

 

 "한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다."

블로그 이미지

ligilo

행복한 하루 되세요~

,

joseph.woobi.co.kr/addtogeo.html

 

http://joseph.woobi.co.kr/addtogeo.html

 

joseph.woobi.co.kr

 

 

기억도 안날 예전에 필요해서 만들었던 주소 -> 좌표 변환 페이지가 있었습니다만

불필요해지면서 관리를 안하고 API는 종료된 채로 방치시키다가

약간 개선해서 네이버 지도를 이용해 다시 만들었습니다.

주소는 엔터로 구분하시면 대량의 주소도 검색이 가능하며

결과 검색 시 옅은 보라색으로 나오는 주소는 한개의 입력값에서 여러개의 주소가 나온 경우,

짙은 보라색으로 표시되는 행은 주소가 나오지 않은 경우입니다.

결과로 나오는 표 전체 복사하시면 (Ctrl+A, Ctrl+C) 엑셀에 복사하실 수 있습니다.

블로그 이미지

ligilo

행복한 하루 되세요~

,