스토리 홈

인터뷰

피드

뉴스

조회수 1844

CTE for postgresql and sqlalchemy

저희 서비스는 가게마다 웹에서 접속할 수 있는 어드민을 제공하는데, 프렌차이즈가 아닌 하나의 독립적인 가게들일 경우 정보를 가져와 나타내는 데는 굳이 CTE 를 쓸 필요가 없지만 프렌차이즈일 경우 본사와 지점들로 나누어져 있어서 본사와 지점들 정보를 다 가져오기 위해서 CTE 를 사용하게 되었습니다.그럼 postgresql 의 CTEReadme 에 나와 있는 예제와 sqlalchemy core 로 변환하는 것까지 살펴보겠습니다.CTE란?Common table expression 의 약자로 ‘공통 테이블 식’입니다.CTE 특징WITH절 같은 SELECT 문에서 효과적으로 테이블 식을 정의 할 수 있습니다.CTE는 VIEW의 사용방법과 비슷하지만, VIEW보다 편리합니다.VIEW와 달리 사전에 CTE를 정의할 필요가 없습니다.개체로 저장되지 않고, 쿼리 지속시간에만 존재합니다.CTE는 재귀 쿼리를 사용할 수 있습니다.재귀 CTE는 여러행을 반환 가능합니다.동일 문에서 결과 테이블을 여러번 참조 가능합니다.재귀 CTE 예제아래 예제는 ‘A’부서 하위에 있는 부서만 추출하는 예제입니다.일단 재귀 CTE를 이용한 쿼리를 사용하려면 ‘WITH RECURSIVE’ 키워드를 추가해야 합니다.Table ‘department’ 인접 리스트로 조직 구조를 나타냅니다.CREATE TABLE department ( id INTEGER PRIMARY KEY, -- department ID parent_department INTEGER REFERENCES department, -- upper department ID name TEXT -- department name ); INSERT INTO department (id, parent_department, "name") VALUES (0, NULL, 'ROOT'), (1, 0, 'A'), (2, 1, 'B'), (3, 2, 'C'), (4, 2, 'D'), (5, 0, 'E'), (6, 4, 'F'), (7, 5, 'G');부서 구조:ROOT-+->A-+->B-+->C | | | +->D-+->F +->E-+->G A의 하위 부서를 추출, 다음과 같은 재귀 쿼리를 사용할 수 있습니다.WITH RECURSIVE subdepartment AS ( -- non-recursive term SELECT * FROM department WHERE name = 'A' UNION ALL -- recursive term SELECT d.* FROM department AS d JOIN subdepartment AS sd ON (d.parent_department = sd.id) ) SELECT * FROM subdepartment ORDER BY name;위의 쿼리는 다음과 같이 설명할 수 있습니다.중간 테이블(Intermediate table), 작업 테이블(work table), 결과 테이블(result table)이 있습니다.초기화비재귀 구간을 실행 (SELECT * FROM department WHERE name = ‘A’)ResultTable = WorkTable = (‘A’) 결과 테이블과 작업 테이블에 결과를 배치합니다.IntermediateTable = () 중간 테이블을 비웁니다.재귀 쿼리 실행(SELECT d.* FROM WT AS d JOIN subdepartment AS sd ON d.parent_department = sd.id) 하위 부서와 작업 테이블을 바꾸고, 재귀 구간을 실행합니다.중간 테이블에 쿼리 결과를 할당합니다.결과 테이블 및 작업 테이블에 중간테이블 추가합니다.중간 테이블을 비웁니다.재귀가 끝났는지 확인2번 과정의 중간테이블이 비어 있으면 재귀의 실행이 종료되고, 결과 테이블은 반환됩니다.중간테이블이 비어 있지 않으면 다시 2번의 과정으로 돌아갑니다.“subdepartment”는 재귀 표현을 포함하고 있는 CTE입니다. 먼저 비재귀항이 평가되고, 다음 재귀항이 평가됩니다. 재귀항은 평가하고 처리하는 데이터가 없을 때까지 결과가 반복적으로 이전 결과에 추가됩니다. 끝으로 마지막 SELECT가 실행되고 데이터는 결과 집합에서 추출됩니다.CTE의 한계점SEARCH 및 CYCLE 절은 구현되지 않습니다.상호 재귀는 허용되지 않습니다.UNION ALL의 마지막 SELECT만 재귀 이름을 포함할 수 있습니다.재귀와 재귀스캔(RecursiveScan) 계획의 비용은 항상 0입니다sqlalchemy 로 변환sqlalchemy 에서 필요한 모듈들을 불러옵니다.from sqlalchemy import Table, Column, Text, Integer, MetaData, select metadata = MetaData() department 테이블을 정의합니다.department = Table('department', metadata, Column('id',Integer), Column('parent_department',Integer), Column('name',Text)) WITH 절부터 시작되는 CTE 부분의 비재귀항을 subdepartment로 만듭니다. 재귀 사용을 위해 .cte( recursive=True) 부분을 붙여줍니다.subdepartment = select([ department.c.id, department.c.parent_department, department.c.name]).where(department.c.name == 'A') \ .cte(recursive=True) department 와 subdepartment 에 각각 alias를 붙여줍니다.subd_alias = subdepartment.alias() department_alias = department.alias() CTE 부분의 재귀항과 비재귀 항을 union all 해주는 subdepartment를 만듭니다. (이 부분이 postgresql 예제 쿼리에서 봤던 WITH RECURSIVE subdepartment 전체를 나타내는 부분이라 할 수 있습니다.)subdepartment = subdepartment.union_all( select([ department_alias.c.id, department_alias.c.parent_department, department_alias.c.name]) \ .where(department_alias.c.parent_department == subd_alias.c.id)) 마지막으로 결과 쿼리를 출력하기 위한 statement를 만듭니다.statement = select([ subdepartment.c.id, subdepartment.c.parent_department, subdepartment.c.name]).order_by(subdepartment.c.name) 원문: CTEReadme참조: 공통 테이블 식 사용 ,공통 테이블 식을 사용하는 재귀 쿼리#스포카 #개발 #개발자 #서버개발 #개발팀 #꿀팁 #인사이트 #조언
조회수 946

스타트업을 시작하며...8

Phase 37. 실물을 판매하는 start-up난 이번 startup을 준비하면서 부터.. "앞으로 만드는 회사에서는, 고객들의 손에 뭔가를 쥐어주어야겠다"라는 생각을 했다. 서비스 자체만으로는 고객들이 아무리 편해도 돈을 주고 쓰겠다는 생각을 하기가 쉽지 않고, 또 다른 대체제들이 계속 생겨나게 되면 그냥 바꿔타면 되는 것이다. 그래서 실물을 만들기로 한 것이고..그렇다보니, 너무나도 많은 challenge가 있었다. 제품에 대한 지식 부족, 관리 부족, communiction 부족 등등.. 이제 한바퀴를 돈 시점에서는 조금 더 잘 할 수 있겠지만, 상품의 코팅 방법, 종이 인쇄의 질감 등등은 아직도 나에겐 도전의 영역이다.그렇기 때문에 각각의 영역에서 나보다 뛰어난 역량을 가진 사람들이 join해야 하지 않을까? 라는 생각을 한다.총 7개의 글로 나누어서 기록하였고.. 그간 빠진 내용들도 많겠지만, 아무튼 9월 11일 결국 paffem이 세상에 나올 수 있었다. 제품을 만들어냈고 출시했다는 즐거움 이면에는 아직 부족한게 너무나도 많아 보인다는 그 생각에 잠을 이룰 수 없을 지경이다. 그래 이제부터가 시작이다. 파펨의 런칭파티 당시의 현장 사진Phase 38. 그렇게 런칭을 하고.. 런칭을 하고서는 새로운 고민들의 연속이다... 이 제품을 어떻게 알릴 것인가? 필요한 것들의 수급은 문제없이 잘 이루어지고 있는지? 함께 일할 인재들을 어떻게 찾을 것인지? 등등그런데.. 사실 paffem의 서비스가 설명하기엔 그리 쉬운 것이 아니라서, 어떻게 쉽게 설명할까? 가 고민의 포인트였다. 그러던 중, flea market에 가서 상품 판매를 해 보았는데.. 역시나 현장에서 말로 설명해봐야 고객이 어떤 포인트에서 이해를 쉽게 하고, 구매까지 연결시켜 볼 수 있을지? 에 대한 아이디어가 나오는 듯 하다. 결국 그렇게 flea market을 2회 참여하고서 만든 서비스 소개카드!! 앞으로는 10~15초 길이의 동영상 버젼으로도 만들어봐야 겠다. 다음 글 부터는 런칭 후에 마주치게 되는 이슈들에 대해서 포스팅 예정!!#파펨 #스타트업 #창업가 #창업자 #마인드셋 #인사이트
조회수 2183

비전공자를 위한개발자 되기 5 스텝

안녕하세요. 언제 어디서나 함께하는 코딩 교실 엘리스입니다 :)아이디어만 좋다면 뭐든 실현해볼 수 있는 시대! 지금은 '프로그래밍'이라는 강력한 무기를 통해 원하는 세계를 실현할 수 있는 잠재적 가능성이 폭발적인 때입니다. 그리고 그 기회는 비단 '개발자'라는 특정 직업에 국한하지 않더라도 각계 분야에 펼쳐져 있는데요. 이미 마케터, 기획자, 디자이너, 콘텐츠 창작자, 금융업계 종사자, 지리학자, 연구원 등 다양한 분야의 많은 사람들이 프로그래밍을 통해 각자의 영역과 세계 곳곳을 새로운 곳으로 만들고 있습니다.높은 급여와 삶의 질을 보장하고 나의 꿈을 펼칠 수 있는 탁월한 수단인 프로그래밍.프로그래밍을 업으로 삼고 있는 사람들의 시작은 어땠을까요?이 글에서는 소프트웨어 엔지니어가 되고자 이제 막 마음먹은 분들을 위해 프로그래머가 되기 위한 다섯 가지 짚고 넘어가면 좋을 팁들을 알려드릴게요.STEP 1. 개발 친화적인 환경 찾아가기서당개 삼 년이면 풍월을 읊는다컴퓨터 공학 전공자와 비전공자가 가지게 되는 가장 큰 차이는 무엇일까요? 개발에 대한 이론 지식? 개발 능력?물론 모든 게 상대적인 것이겠지만 일반적으로 한 가지 큰 차이가 있다면 바로 '환경'이라고 할 수 있을 듯합니다. 내 주변에 개발과 관련된 자원이 얼마나 풍부한가 하는 점입니다.전공자가 개발을 시작하고자 마음을 먹으면 주위에서 좋은 리소스를 쉽게 찾을 수 있습니다. 한편 비전공자는 개발 공부를 시작하려고 할 때 레퍼런스로 삼을만한 좋은 예가 없으니 망망대해에 홀로 떠있는 기분이 들 수밖에 없겠죠! 그렇다고 해서 반드시 컴퓨터 공학 전공에서부터 다시 시작하거나 고액의 학원에 다닐 필요는 없습니다. 먼저 개발과 관련된 인적, 물적 자원이 풍부한 곳으로 적극적으로 다가가보세요. 작은 환경의 변화가 큰 변화의 시작점이 될 수 있습니다.엘리스가 추천하는 방법!온라인 커뮤니티 활동하기 : 코딩과 관련된 페이스북 그룹에 가입하여 많은 정보를 접하고 질문도 하면서 활동해보세요. 나와 비슷한 상황인 사람을 만나 서로 도움을 주고받을 수도 있고, 내 롤모델이 될만한 훌륭한 개발자를 만나 공부의 동력이 될지도요!개발 동아리, 스터디 등에 참여하기★ 엘리스 코딩 클래스 활용하기 : PC로도, 모바일 앱으로도 언제 어디서든 프로그래밍을 위한 환경에 접속하세요! 엘리스에 로그인하는 것만으로 공부하기 위한 모든 리소스를 얻을 수 있을 뿐만 아니라 과목별 채팅방을 통해서 함께 공부하고 있는 수강생들, 과목 튜터와의 활발한 대화에 참여할 수 있습니다. STEP 2. 강력한 동기와 조력자 만들기하늘은 스스로 돕는 자를 돕는다컴퓨터 공학 전공자라고 하면 모두 다 개발을 잘할까요? 적어도 아주 조금은 더 잘할까요? 대답은 NO!아무리 많은 이론을 배웠다고 해도 직접 개발을 하지 않는다면 아무런 소용이 없겠지요. 이해도가 다르기 때문에 배움의 속도는 조금 다를 수도 있겠지만 이런 차이보다는 개인의 학습 의지와 동기가 얼마나 분명하냐가 더 중요합니다.막연하게 '개발자'라는 너무 먼 목표만 보고 달리는 것보다는 보다 가까이에 있고 달성하기 쉬운 분명한 목표를 단계별로 설정해보세요. 그리고 '즐거움'을 느낄 수 있는 수단을 찾아 목표 달성을 위한 집중력을 높이세요. 동시에 내가 어려움에 처하거나 헤매고 있을 때 도와줄 조력자가 있다면 금상첨화!Photo by Mimi Thian on Unsplash엘리스가 추천하는 방법!동기 부여를 위한 작은 목표 설정 : 지식 습득 및 학습과 관련된 목표로 그룹 스터디 참여, 부족한 부분의 프로그래밍 강의 완강, 책 한 권 떼기 등이 있을 수 있고, 더 적극적인 형태의 개발 경험을 위해 공모전, 경진 대회 등 기간과 보상이 정해져 있는 대외 활동 참가 및 수상도 좋은 목표가 될 수 있을 거예요.★ 엘리스 코딩 튜터 활용하기 : 엘리스에는 학습을 도와주는 튜터가 있습니다. 엘리스 튜터는 답을 알려주는 사람이 아니라 답을 찾는 법을 알려주는 길잡이입니다. 공부하다가 막힐 때, 길을 잃은 것 같을 때 엘리스 튜터를 멘토로 삼아 보세요! 구독 및 트랙 이용 시 담당 튜터가 배정되어 개인 채팅방을 통해 1:1 튜터링을 받을 수 있고, 클래스 수강 시 단체 채팅방을 통해 언제든 질문할 수 있습니다.STEP 3. 원하는 개발 분야 탐색해보기  콩 심은 데 콩 나고 팥 심은 데 팥 난다개발에는 아주 숱~한 다양한 분야가 있습니다. 그리고 그 분야에 따라 특성도, 익혀야 하는 언어와 기술도 천차만별인데요. 아래 몇 개의 개발 분야와 사용 언어 및 기술에 대해서 적었으니 참고해보세요. 그리고 이보다 더 다양한 개발의 세계를 탐색해보면서 흥미가 가는 분야가 있다면 구체적으로 검색하고 공부를 시작할 계획을 세워보세요.Photo by Victoriano Izquierdo on Unsplash잘 모르겠다 or 코알못이다파이썬은 분야를 막론하고 많은 분야에서 사용되며 익히기에 쉬워 처음 코딩을 시작하는 입문자에게 가장 적합한 언어 중 하나입니다. 개발 언어부터 접해보고 싶다면 파이썬 언어 학습에서 시작해보세요!웹 개발 '콩 심은 데 콩 나고~'라는 속담을 인용했지만, 사실 다양한 개발 영역의 많은 지식들이 서로 겹치는 부분도 있고, 어느 한 분야를 잘할 수 있을 때 다른 분야로 전향하거나 옮겨가는 일은 보다 수월할 수 있습니다. 개발의 시작을 보다 쉽게 하고 싶다면 웹 개발부터 접근해보세요. 공부할 수 있는 자원이 풍부하고 추후 다른 개발 분야로의 전향도 가능하기 때문이에요.프론트엔드프론트엔드 개발은 주로 웹 환경에서 사용자와 맞닿는 가시적인 부분을 개발하는 영역입니다. 사용자가 코드를 작성하지 않고도 컴퓨터에게 명령을 내리는 등의 의사소통을 그래픽적으로 쉽게 할 수 있도록 가시적으로 만들어주는 것이 바로 프론트엔드 개발자의 역할이라고 할 수 있는데요. 예를 들어 엘리스에 로그인하고 싶을 때 '로그인 버튼을 클릭'하여 쉽게 로그인할 수 있는 인터페이스도 프론트엔드에 해당합니다. * 익혀야 하는 기본기 : HTML, CSS, JavaScript* 좀 더 나아가서 : JavaScript의 프레임 워크인 React.js 또는 Vue.js 또는 Angular.js 백엔드/서버백엔드 개발은 웹 환경에서 보통 사용자에게는 보이지 않는 서버(컴퓨터) 단의 개발을 의미하며, 사용자가 웹 상에서 활동함으로 인해 쌓이는 데이터가 모이는 DB(Data Base)를 다루는 영역을 개발합니다.* 익혀야 하는 기본기데이터베이스에 대한 지식 : MariaDB, PostgreSQL, MongoDB 등. 서버 쪽의 언어- 금융, 제약 등 전통적인 대기업 : Java의 프레임 워크인 Spring을 많이 사용- 과거 많이 쓰이던 기술 : Php(학습 속도와 개발 속도가 빠르며 무료!)를 많이 사용- 요즘 떠오르는 기술 : Python 기반 프레임 워크인 Django 또는 Flask. JavaScript의 프레임 워크인 Node.js* 좀 더 나아가서 : 클라우드 컴퓨팅 기술 Amazon AWS 또는 Azure에 대한 지식데이터 사이언스 - 데이터 분석가21세기에 가장 각광받는 직업 중 하나로 떠오른 '데이터 사이언티스트'에 대해서 모두 다 한 번쯤은 들어보셨을 거예요. 데이터 사이언스 분야에도 아주 복잡하고 다양한 영역들이 존재하는데요. 통상 데이터 사이언스라고 하면 수학 및 통계에 대한 지식, 컴퓨터 공학에 대한 지식, 인공지능 및 머신러닝과 관련된 기술을 사용하게 됩니다. 너무 많아 보이나요? 아래에는 데이터 사이언스의 많은 영역 중에서도 '데이터 분석가'로서 꼭 알아야 하는 내용을 적었습니다.* 익혀야 하는 기본기수학적 지식 : 통계, 선형대수학분석을 위한 언어 : Python, R* 좀 더 나아가서 : 머신러닝 기술임베디드 개발계산기, 에어컨, 자동차 등의 기계가 일정 기능을 컴퓨터처럼 수행할 수 있도록 기계 내부의 하드웨어 시스템을 구축하는 것이 임베디드 개발입니다. 사물 인터넷(IoT, Internet of Things)이나 하드웨어 부품과 관련된 분야에 관심이 간다면 임베디드 개발에 대해서 좀 더 알아보세요!* 익혀야 하는 기본기임베디드 개발 언어- 가장 많이 사용하는 언어 : C언어 - 국내 전통적인 대기업 : Java- 수요가 많은 언어 : Python (임베디드 분야에서도 빠지지 않고 자주 사용하는 언어! 국내 채용 사이트에서 임베디드 관련 개발 스택으로 많이 요구.)* 좀 더 나아가서 : 무선 통신 기술에 대한 지식*(공통) 개발자라면 익히고 있어야 할 기본기 : Git을 사용한 버전 관리 방법엘리스가 추천하는 실습 기반 과목HTML/CSS | JavaScript | 모바일 웹 코딩Git과 Git 버전 관리 (6월 오픈 예정)Python 기초 I | Python 기초 IIC 언어 | C++Java 기초 및 심화인공지능/머신러닝 기초 | 프로그래밍 수학데이터 분석 | Numpy, Pandas | 크롤링 | Kaggle 문제R 기초 |  R 패키지 | R 데이터 분석STEP 4. 실습, 프로젝트 기반으로 공부하고 개발 경험 쌓기구슬이 서 말이어도 꿰어야 보배다책을 사고 인강을 결제해도 직접 만들어보면서 익히지 않으면 절대 내 것이 될 수 없는 것이 또 개발!처음 언어를 익히는 단계에서부터 실습 기반으로 직접 코딩하고 그 결과를 확인해보면서 학습하는 것이 중요해요! 필요한 공부를 실습 단위로 쪼개어 직접 구현해보면서 익히고, 좀 더 나아가서는 프로젝트 단위로 구현하면서 실전 기술을 습득해보세요. 또한 실무에서는 혼자 개발하는 것이 아니라 뭐든 '협업'해야 하기 때문에 혼자 하는 프로젝트 외에도 여러 사람들과 함께하는 그룹 프로젝트의 경험이 큰 도움이 될 거예요. 자기소개서, 포트폴리오, 면접 시에도 어떤 프로젝트에서 내가 맡은 부분은 어느 부분이었고 어떻게 주도적으로 이끌었는지가 관건이 될 수 있습니다.엘리스가 추천하는 방법!★ 온라인 코딩 실습으로 기본기 다지기 : 엘리스는 별도의 코딩 환경 세팅 없이 온라인에서 바로 코딩 문제를 풀고 내가 짠 코드의 결과를 확인할 수 있어서 실습 기반으로 학습하기에 탁월한 플랫폼입니다. :) KAIST, SKT, 삼성 SDS 등에서도 활용하는 검증된 플랫폼에서 코딩 실습으로 기본기를 다지세요!프로젝트 단위로 혼자서 만들어보기 : 프로그래밍 언어의 기본에 익숙해졌다면, 직접 A to Z를 구현하는 작은 프로젝트를 통해 실제 필요한 기술이 뭔지 파악해가며 실전 기술을 익혀보세요. 그룹 프로젝트에 참여해서 협업 경험을 통해 익히기 : 취업을 위해서 중요한 것 중 하나인 '협업'능력! 그룹 프로젝트에 참여하여 비단 개발 실력뿐만 아니라 실무에 필요한 다양한 역량 또한 길러보세요.STEP 5. 포트폴리오, 시험 준비하고 개발 직군에 지원하기시작이 반, 그 이상이다!아시겠지만 개발자가 되면 끝인 그런 일은 없겠죠. (어떤 직무에서도 마찬가지일 거예요.) 끊임없는 공부, 새로운 기술 연마, 리팩토링, 문서화, 코딩 공부 코딩 공부!그러니 완벽에서 시작해야 한다는 생각은 버리고 지금까지 최선을 다해온 결과물을 가지고서 개발 직군에 지원하세요. 실제 개발자로 일하게 되면 그 속에서 배우고 성장할 수 있는 자원이 훨씬 더 많아집니다!'자리가 사람을 만든다'라는 말이 괜한 말이 아니니, 더 큰 성장과 가능성이 있는 곳으로 가기 위한 준비와 지원을 주저 없이 해보시길 바라요!Photo by Green Chameleon on Unsplash엘리스가 추천하는 방법!나를 잘 보여줄 포트폴리오 만들기 : (사용한 언어 / 프레임 워크 / 앞의 것을 적용하여 프로젝트에서 내가 한 역할) 별로 정리해두고 내가 커밋한 코드와 함께 보여주기.   블로그 쓰기 : 거창한 것이 아니어도 좋으니 공부하면서 느꼈던 것, 새로 알게 된 지식들, 프로젝트하면서 고민했던 것들을 블로그로 정리해보세요. 내가 구현한 것들을 이미지를 통해서 가시적으로 보여줄 수 있다면 금상첨화!★ 엘리스에서 알고리즘 시험 준비하기 : 이미 많은 수강생 분들이 엘리스 알고리즘 과목을 통해서 코드를 발전시키고 알고리즘 시험 및 취업에 성공하고 있습니다. :) 대기업 입사를 준비하시는 분이라면 엘리스 알고리즘 과목들을 꼭 수강해보세요.이다음의 6번째 스텝은 무엇이 될까요? 아마도 1~5 스텝을 계속 반복해나가면서 익숙해지고, 다른 역할로 각각의 스텝에 참여하게 되는 일이 아닐까요.엘리스는 누구나 프로그래밍을 통해 원하는 일을 할 수 있도록 좋은 강의 콘텐츠와 서비스, 플랫폼으로 여러분의 다섯 스텝에 함께하고자 합니다. :) 막막한 초심자 분들에게 앞으로의 방향성을 그려보는 데에 조금이라도 도움이 되길 바라며 글을 발행합니다.그럼 엘리스에서 만나요! >> 엘리스 아카데미 바로가기* 이밖에 조언, 첨언, 질문 등을 댓글로 남겨주시면 이 글의 독자분들에게 큰 도움이 됩니다.
조회수 1858

실패를 딛고 성공한 창업자들의 칠전팔기 도전기

디캠프에 참여해서 좋은 강연을 듣고 왔다. 에이컴메이트,띵동 대표님들로부터 실패에 관한 얘기들을 , 그리고 그런 실패를 통해 어떤 깨달음과 발전으로 연결시켰는지를 들어본 시간이였다.[에이컴메이트]에이컴메이트는 cross-border 이커머스로 한국 제품들을 08년부터 중화권에 파는 비즈니스를 시작했다.지금은 중,장기적으로 글로벌 제품을 글로벌 하게 파는 G2G 모델이다.역직구 모델로 보면 되고, 상해 베이스로 홍콩을 왔다갔다 거리신다고 하셨다.중국에서는 상당히 많은 실수와 실패들을 했는데 그것들을 말해보고자 한다고 하셨다."05년때 어학연수로 중국에서 1년 공부했다.이때 무역회사 했던 형이랑 같이 회사를 운영했다. 벽걸이 시계랑,해골 팔찌를 팔았는데,벽걸이는 조금 잘 됬다. 해골은 1,000개 중에 하나 팔아 다 재고 되고 999개 15,000원주고 고물상한테 재고처리했다.""300만원으로 벽걸이 사서 지마켓에 200개 올인했다. 그때 객단가는 14,000원 정도. 근데 이 중에 100개 반품이 되더라. 나중에는 자본력과 비즈니스를 잘하는 대상자들이 벽걸이를 파니깐, 상대가 안되더라. 그러다보니 시장을 볼 때는 단기적인 것만 보는 것이 아니라 중,장기적으로 시장을 바라보는 눈이 필요하다고 생각했다.""무역업 하면서 돈은 다 까먹었고 이제 돌아갈건지,한번 더 뭐 해볼건지 고민이였다. 08년쯤.중국 직원이 갑자기 지마켓 메인에 옷 3,000원 너무 싼거 아니냐면서 이거 사와달라고 해서 그거 이미지 올리고 , 2주 걸린다고 해놓고 주문 들어오면 한국에 오더 놓고 보내는 식으로 했다. 1년 동안 거의 매출이 없었는데 2008 서브프라임 터지고 나서 환율 변동 때문에 고객들한테는 할인이 되고 우리쪽에서는 결제 대금이 좋아졌다. 이게 천운이였다.""4명으로 시작했떤 작은 무역회사가 지금은 500명의 회사가 됬다. 이제는 진짜 기업의 문화를 만들어나갈 시기가 됬구나 했다.우리는 resell (JAMY 패션 카테고리에서 스타일난다,난닝구,체리코코 같은 업체들을 중국으로 유통)을 통해서 죽음의 계곡에서 벗어났고 이때 바이두쪽에서 바이두 코리아 운영해보는거 어떠냐고 했을 떄 이것도 천운일 거라고 생각했다. 근데 여기에 투자했는데 실패했다. 검색으로 청바지를 사는 사람이 없었기 때문이다. 청바지 역사나 이런거를 찾더라. 광고 효율이 망했다. 그리고 나서 알리바바가 전체 이커머스 80% 차지하고 난 뒤 그 안에서 검색 광고 시장이 생겨났다.""알리바바쪽에서 tmall 한국관 운영에 대해서 제의가 들어왔다. 이때 내부적으로 판단도 잘했고 바이두에서 했던 실수들을 관리했고 슈퍼 그룹을 껴안고 일 방문 7천만에 꽂히는 곳에 10억원 한국 투자는 나쁘지 않았다. 근데 1년 반동안 BEP(순익 분기점) 못넘었고 갑자기 알리바바에서 닫으라고 했다.""2011년. 이전에 같이 했던 한 업체에서 계속 하고 싶은데, 한국관 다시 운영해줄 수 있냐라고 제의가 들어왔다.그래서 이걸 계기로 제일 모직이라든지,이마트라든지 이런 업체들이랑 함께할 수 있었다.""실패할 때에 가장 많이 성장할 수 있었다. 보통 실패라고 할 때 망했다라고 표현을 쓰지만, 실패할 때 드는 멍이 사실 보면 몽이다. 꿈으로 더 빨리 갈 수 있게 해주는 멍일 뿐이다."Q1) 각자 다른 생각들을 하는데, 어떻게 이런 생각들을 하나로 모으고 출발할 수 있었나?A1) 처음에는 선배형이 거의 CEO였고, 형이 몸이 안좋으지면서 내가 CEO를 한 2년 했다.(대학교만 졸업하고 바로 창업한 케이스다) 그래서 조금 나는 경영의 능력이 어색했고 다시 형이 경영을 잡았다. 우리는 밤을 새서라도 토론했고,약간의 암묵적 원칙이라고 한다면 감정적인 부분으로 싸우지 않고 화해하는 것이다.그리고 잘못 판단한 사람이 먼저 사과하는 것이였다.Q2) 스타트업들이 중국 진출할 때 유의사항과 초기 중국에서 네트워크를 쌓는 방법은?A2) 중국 진출하겠다는 스타트업들 보면 되게 강력한 팀이 있습니까? 좋은 시그널이 무엇입니까? 라고 물으면 대게 제대로 대답하는 곳이 없다. 언어를 먼저 공부하고, 마켓 서치를 하면 된다.카카오톡 서비스나, 위챗이나 이런건 거의 3~4년전부터 있었다. 중국 시장 조사하면 가능성에 대해서 판단할 수 있다.Q3) 중국과 관련해서 또 해주고 싶은 말은?A3) 한국인들이 네트워킹할 때 안타까운 것은 모든 걸 다 먹고자 한다. 근데 중국은 어쩄든 그 큰 대륙을 다 먹을 수 없는 걸 알기 때문에 넌 이거 하고 난 이거 할게 사고가 갖추어져 있다. 즉 시장을 같이 키워나가자는 식이다.어차피 다 먹을 수 없다는 거 아는 거고 쿨한 거다. 비즈니스 마인드로 같이 시장을 만들고 합에서 더 큰 퍼센테이지를 먹는 마인드가 중요하다. 내가 어떤 아이템을 하느냐에 따라 거기에 대한 도매, 그 도시의 선택이 달라질 수 있다. 중국 내에서만 가격 차이가 2,3배가 난다. 가령 예를 들면 1$이면 불량이 50%이고 1.5$ 이면 20% 2$이면 5~10% 이런 식이다.중국에서는 확인하고 또 확인하고 또 확인해야 된다. 중국에서 그 도시에 맞는 가격을 판매하면 된다.농촌에서는 너무 좋은거 필요없다. 타겟하고 있는 성격에 맞는 아이템을 팔면 된다.Q4) 꽌시에 대해서는 어떻게 접근해야 되는가?A4)꽌시 문화의 핵심은 내 지인을 잃지 않는 선에서 최대한 해주고 이를 통해 내가 얻어갈 수 있는 것을 보는 것이다.관계에 한 호의. 근데 한국에서는 당장의 어려움을 꽌시로 풀어내려고 한다.나는 이런 어려움을 겪고 있는데 니가 이거하고 그럼 내가 이거해주고 이런식. 꽌시는 관계를 쌓아가는 것이고 내가 그 사람을 위해서 해줄 수 있는 것이 무엇인지를 먼저 생각하는 것이 꽌시의 첫걸음이다.Q5) 마지막으로, 어떨 때가 가장 고민인가?A5) 사람 떄문에 잠을 꺠는 것 같다. 이 친구가 이 포지션에서 최대한 능력을 발휘하고 있는지.[띵동]띵동은 사람들이 살면서 겪게 되는 각종 액션들의 불편함을 온디맨드로 해결하고자 하는 스타트업이다. 한 카테고리의 특화되지 않고 다양한 범주를 다루다보니 어려움이 많을 건데, 대표님께서 운영 과정에서의 여러 얘기들을 해주셨다.크게 1.조직 관리의 실패 ,  2.투자 유치 실패에 대해서 말씀을 나눠주셨다."처음에는 카리스마 있는 리더십이였다.모든 의사결정에 내가 참여했는데, 조직이 커지다보니 섬기는 리더십으로 바꿨다. 그랬는데 훨씬 더 힘들더라.""우리는 고객 접점이 두개다. 1.주문 접점(정신적 노동) 2.물건 전달 접점(육체적 노동). 그러니깐 접점을 관리하는 동료들이 정말 고생이 많은 것이다. 그래서 그때 깨달았다. 일에 의미를 부여하고 일 자체가 즐거워야된다고. 그래서 회사의 철학이 세상의 인식과 사회적 시선을 바꾸어가는 회사라고 정의했다. 사람이 기회를 만들고 기회가 사업을 만들더라.""사업하면서 제일 힘들 때는 월급 제대로 못주고 안좋게 사람들이랑 헤어질 때다.""처음에 나는 한명의 고객을 감동시키기 위해 벌꿀 옷 입고 고객한테 가고 그랬다. 그러니깐 전화가 막 오더라. 근데 고객한테 전화오게 만들고 나니 우리 상담원이 고객한테 썅욕을 하더라. 그래서 고객이 도대체 직원들의 고객을 어따구로 시켰냐고 컴플레인이 왔다. 근데 내가 직접해보니깐 알겠더라.진상 고객이 특정 상담원을 지목해서 계속 욕하더라.폐업을 심각하게 고민했었다. 그런 일이 계속 발생했다.일주일에 3~4번.""창업한지 4년이 넘었다. 고객 만족에 집착하다보니깐 회사가 성장해있더라.유명한 개발자를 만나러 다녔는데 아무도 우리를 탐탁해하지 않더라.어느날 대기업 PM분 기존 연봉보다 더 주고 데려왔다.기존 직원들과 근데 갈등이 있었다.개발은 정말 어려운 거라고 느꼈다.내가 개발을 하려다보니 주로 끌려다니거나 돈도 많이 까먹고 한 사람 때문에 조직 전체가 힘들어지고 그랬다.""이게 실패로 끝났으면 이 사업도 없었을 것이다.근데 실패를 통해 나아갔다. 힘들 때는 동료구나 라고 생각했다. 적절한 시기에 내가 경영을 잘하는 공동 대표를 영입했는데, 그때 느낀게 진짜 경영을 잘하는 사람이 경영을 해야되구나 라고 느꼈다.""중간에 사람들이 엄청 나갔다. 왜 나갔는지 생각해보니깐 배달이 업이라고 아니라고 생각하는 사람이 배달을 하기 때문이라고 생각했다. 배달이 얼마나 힘든지 내가 직접해봤다.보통 배달원들 월급이 200~220만원이였는데, 우리는 230만원으로 고용하고 연차 별로 좀 더 주는 방향으로 했다.근데 해보니깐 이 돈으로는 못하겠더라.아무리 해볼려고 해도 안됬다. 몸도 몸이고 정신적으로 더 힘들더라.그래서 보상체계를 더 올려야겠다고 생각했다. 소통을 통해서 어느 정도 선까지 되겠냐라고 했을때 점차 소통을 하면서 400~450 실수령 맞췄다. 급여제에서 인센티브제로 전환했다. 그 중간에 회사가 손해도 안보고 직원들이 이익을 보고 균형을 맞췄다. 매월 15%씩 상승하면서 서로의 신뢰가 쌓이고 2년 정도가 걸렸다. 회사가 계속 노력하는 모습을 보여주니, 회사에 소속감을 느끼게 되고 하나의 영원사업들이 되서 일을 하더라."Q1. 언제 사업을 멈춰야 된다고 생각했나?A2. 3번 사업했다.  첫번째 망했고 두번쨰는 조금 잘됬다. 세번째는 과정 중에 있다. 두번째때는 쇼핑몰을 운영했는데 치열한 경쟁 속에서 회사는 어려워지고 있었고 진지하게 고민해봤을 떄 내가 옷에 대해서 잘 아는지,좋아하는지 그런 걸 따지게 되었다.잘 생각해보니 빨리 접어야겠다고 생각이 들었다. 관심도 능력도 난 좋지 않았다.Q2. 투자 유치는 어땠나?A2. 처음에 투자 유치는 계속 실패했다. 통과되지 못한 이유가 경영진에 대한 불신이였다. 나는 고졸에 뭐 잘하 는게 딱히 없었다.이거에 대한 필터링이 굉장히 많았다.처음에는 너무 열정만 있었고 핵심 경쟁력이 없었다. 처음 VC 찾아갔을 때 꿀벌 옷을 입고 찾아갔다. 투자 받기 위해 내부 지표 관리 안했다. 보통 주변에 보면 기획/마케팅 이런거 어떻게 할거다 저런거 어떻게 할거다 했는데 우리가 할 수 있는 건 고객한테만 집중했다.Q3. 인재에 대한 감은 어떻게 잡는지?A3.능력보다는 항상 태도를 많이 보려고 노력한다. 10명이 있을 때 7명이 긍정적이면 그 조직은 성공하는 것 같다.보통 내가 내 의지로 사람을 떠나 보낸 적은 별로 없었다.Q4. 직원들에게 자율성에 대한 부분은 어떻게 하고 있나?A4.처음에 상담원들이 자꾸 손님이랑 싸우는게 이해가 안됬다.그래서 내가 직접 전화를 받아봤다.근데 죄송하다고 수백번 했는데 1~2시간 동안 끊지 않더라.그게 너무 화가나더라.그래서 그냥 10만원 이내에 피해가 나는 선이면 알아서 하라고 했다.남들이 설득할 수 있는 만큼의 진상 고객이면 끊어도 상관없다고 했다.Q5. 더 해주고 싶은 말이 있는지?"무조건 내부 고객에 집중하는게 답이라고 생각한다. 배달원들이 을이 아니라 병,정일 떄 그들이 월급이 오르고 여자친구 데리고 가니깐 사장들이 달리 보더라.그떄부터는 갑/을 관계가 아니라 서로가 고객이 되더라.서비스를 사랑하는 고객보다 서비스를 싫어하는 고객들의 바이럴이 훨씬 더 높다.그래서 우린 고객 한명 한명에게 최선을 다한다는 집착이 있다. 선발 업체 "해주세요"의 블랙리스트가 가장 먼저 우리의 팬이더라.""우리는 월급제로 3개월 수습해서 다양한 문제를 해결할 수 있도록 훈련하게 지원해준다. 문제 해결에 집중하자. 경쟁을 하지 않고 회사 외부적으로 봤을 때 가장 해결을 빨리/잘 할 수 있는 것에 초점을 맞춘다."아주 좋은 시간이였다.에이컴메이트 대표님으로부터는 사업에서 가장 중요한 것은 타이밍이지만, 그 타이밍을 컨트롤 하는 것은 강력한 팀이라는 것을 알게 되었다.그리고 빨리 실패하고 빨리 배우는 것.띵동 대표님으로부터는 사업은 경영자가 가장 최전선에서 현장을 뛰어다녀야 되고 그것을 시스템으로 묶어야 된다는 점이다.고객 만족을 최우선 순위로 내실을 다지며 꾸준히 성장한 대표님께 존경을 표한다.강한 자가 이기는 시대는 지났다.꾸준하게 성장하는 사람이 살아남는다.빨리 적응하고 그 변화를 즐기는 자가 생존한다.게임의 시대는 이미 많이 바뀌었다.편법은 통하지 않고 세상이 점차 투명해지고 있다.새로운 게임의 방식이 오고 있다.디지털의 물결과 절대 가치의 물결이다.받아들이거나 죽거나.#페오펫 #peopet #CEO #인사이트 #마인드셋 #조언 #경험공유
조회수 1793

비트윈의 스티커 시스템 구현 이야기 - VCNC Engineering Blog

 비트윈에는 커플들이 서로에게 감정을 더욱 잘 표현할 수 있도록 스티커를 전송할 수 있는 기능이 있습니다. 이를 위해 스티커 스토어에서 다양한 종류의 스티커를 제공하고 있으며 사용자들은 구매한 스티커를 메시지의 첨부파일 형태로 전송을 할 수 있습니다. 저희가 스티커 시스템을 구현하면서 맞딱드린 문제와 이를 해결한 방법, 그리고 프로젝트를 진행하면서 배운 것들에 대해 소개해 보고자 합니다.스티커 시스템 아키텍처비트윈에서 스티커 기능을 제공하기 위해 다양한 구성 요소들이 있습니다. 전체적인 구성은 다음과 같습니다.비트윈 서버: 이전에 소개드렸었던 비트윈의 서버입니다. 비트윈의 채팅, 사진, 기념일 공유 등 제품내의 핵심이 되는 기능을 위해 운영됩니다. 스티커 스토어에서 구매한 스티커는 비트윈 서버를 통해 상대방에게 전송할 수 있습니다.스티커 스토어 서버: 스티커를 구매할 수 있는 스토어를 서비스합니다. 스티커 스토어는 웹페이지로 작성되어 있고 아이폰, 안드로이드 클라이언트와 유기적으로 연동되어 구매 요청 등을 처리합니다. 처음에는 Python과 Flask를 이용하여 구현하려 하였으나 결국엔 서버 개발자들이 좀 더 익숙한 자바로 구현하기로 결정하였습니다. Jetty와 Jersey를 사용하였고, HTML을 랜더링하기 위한 템플릿 엔진으로는 Closure Template을 이용하였습니다. ORM으로는 Hibernate/JPA, 클라이언트와 웹페이지간 연동을 위해서 Cordova를 이용하였습니다. EC2에서 운영하고 있으며 데이터베이스로는 RDS에서 제공하는 MySQL을 사용합니다. 이미 존재하는 솔루션들을 잘 활용하여 최대한 빨리 개발 할 수 있도록 노력을 기울였습니다.스티커 다운로드 서버: 스티커는 비트윈에서 정의한 특수한 포맷의 파일 형태로 제공됩니다. 기본적으로 수 많은 사용자가 같은 스티커 파일을 다운로드 받습니다. 따라서 AWS에서 제공하는 CDN인 CloudFront을 이용하며, 실제 스티커 파일들은 S3에서 호스팅합니다. 그런데 스티커 파일들은 디바이스의 해상도(DPI)에 따라 최적화된 파일들을 내려줘야하는 이슈가 있었습니다. 이를 위해 CloudFront와 S3사이의 파일 전송에 GAE에서 운영중인 간단한 어플리케이션이 관여합니다. 이에 대해서는 뒷편에서 좀 더 자세히 설명하도록 하겠습니다.구현상 문제들과 해결 방법들적정 기술에 대해 고민하다스티커 스토어 서버를 처음 설계할때 Flask와 SQLAlchemy를 이용하여 구현하고자 하였습니다. 개발팀 내부적으로 웹서버를 만들때 앞으로 Python과 Flask를 이용해야겠다는 생각이 있었기 때문이며, 일반적으로 Java보다는 Python으로 짜는 것이 개발 효율이 더 좋다는 것은 잘 알려진 사실이기도 합니다. 하지만 Java에 익숙한 서버 개발자들이 Python의 일반적인 스타일에 익숙하지 않아 Python다운 코드를 짜기 어려웠고, 오히려 개발하는데 비용이 더 많이 들어갔습니다. 그래서 개발 중에 다시 웹 서버는 자바로 짜게 되었고, 여러가지 스크립트들만 Python으로 짜고 있습니다. 실제 개발에 있어서 적절한 기술의 선택은 실제 프로젝트에 참여하는 개발자들의 능력에 따라 달라져야한다는 것을 알게되었습니다.스티커 파일 용량과 변환 시간을 고려하다사용자는 스티커 스토어에서 여러개의 스티커가 하나로 묶인 스티커 묶음을 구매하게 됩니다. 구매 완료시 여러개의 스티커가 하나의 파일로 압축되어 있는 zip파일을 다운로드 받게 됩니다. zip파일내의 각 스티커 파일에는 스티커를 재생하기 위한 스티커의 이미지 프레임들과 메타데이터에 대한 정보들이 담겨 있습니다. 메타데이터는 Thrift를 이용하여 정의하였습니다.스티커 zip파일 안에는 여러개의 스티커 파일이 들어가 있으며, 스티커 파일은 다양한 정보를 포함합니다카카오톡의 스티커의 경우 애니메이션이 있는 것은 배경이 불투명하고 배경이 투명한 경우에는 애니메이션이 없습니다. 하지만 비트윈 스티커는 배경이 투명하고 고해상도의 애니메이션을 보여줄 수 있어야 했습니다. 배경이 투명한 여러 장의 고해상도 이미지를 움직이게 만드는 것은 비교적 어려운 점이 많습니다. 여러 프레임의 이미지들의 배경을 투명하게 하기 위해 PNG를 사용하면 JPEG에 비해 스티커 파일의 크기가 너무 커집니다. 파일 크기가 너무 커지면 당시 3G 환경에서 다운로드가 너무 오래 걸려 사용성이 크게 떨어지기 때문에 무작정 PNG를 사용할 수는 없었습니다. 이에 대한 해결책으로 투명 기능을 제공하면서도 파일 크기도 비교적 작은 WebP를 이용하였습니다. WebP는 구글이 공개한 이미지 포맷으로 화질 저하를 최소화 하면서도 이미지 파일 크기가 작다는 장점이 있습니다. 각 클라이언트에서 스티커를 다운 받을때는 WebP로 다운 받지만, 다운 받은 이후에는 이미지 로딩 속도를 위해 로컬에 PNG로 변환한 스티커 프레임들을 캐싱합니다.그런데 출시 된지 오래된 안드로이드나 iPhone 3Gs와 같이 CPU성능이 좋지 않은 단말에서 WebP 디코딩이 지나치게 오래 걸리는 문제가 있었습니다. 이런 단말들은 공통적으로 해상도가 낮은 디바이스였고, 이 경우에는 특별히 PNG로 스티커 파일을 만들어 내려줬습니다. 이미지의 해상도가 낮기 때문에 파일 크기가 크지 않았고, 다운로드 속도 문제가 없었기 때문입니다.좀 더 나은 주소 포맷을 위해 GAE를 활용하다기본적으로 스티커는 여러 사용자가 같은 스티커 파일을 다운받아 사용하기 때문에 CDN을 이용하여 배포하는 것이 좋습니다. CDN을 이용하면 스티커 파일이 전 세계 곳곳에 있는 엣지 서버에 캐싱되어 사용자들이 가장 최적의 경로로 파일을 다운로드 받을 수 있습니다. 그래서 AWS의 S3와 CloudFront를 사용하여 스티커 파일을 배포하려고 했습니다. 또한, 여러 해상도의 디바이스에서 최적의 스티커를 보여줘야 했습니다. 이 때문에 다양한 해상도로 만들어진 스티커 파일들을 S3에 올려야 했는데 클라이어트에서 스티커 파일을 다운로드시 주소 포맷을 어떻게 가져가야 할지가 어려웠습니다. S3에 올리는 경우 파일와 디렉터리 구조 형태로 저장되기 때문에 아래와 같은 방법으로 저장이 가능합니다.http://dl.sticker.vcnc.co.kr/[dpi_of_sticker]/[sticker_id].sticker하지만, 이렇게 주소를 가져가는 경우 클라이언트가 자신의 해상도에 맞는 적절한 스티커의 해상도를 계산하여 요청해야 합니다. 이것은 클라이언트에서 서버에서 제공하는 스티커 해상도 리스트를 알고 있어야 한다는 의미이며, 이러한 정보들은 최대한 클라이언트에 가려 놓는 것이 유지보수에 좋습니다. 클라이언트는 그냥 자신의 디스플레이 해상도를 전달하기만 하고, 서버에서 적절히 계산하여 알맞은 해상도의 스티커 파일을 내려주는 것이 가장 좋습니다. 이를 위해 스티커 다운로드 URL을 아래와 같은 형태로 디자인하고자 하였습니다.http://dl.sticker.vcnc.co.kr/[sticker_id].sticker?density=[dpi_of_device]하지만 S3와 CloudFront 조합으로만 위와 같은 URL 제공은 불가능하며 따로 다운로드 서버를 운영해야 합니다. 그렇다고 EC2에 따로 서버를 운영하는 것은 안정적인 서비스 운영을 위해 신경써야할 포인트들이 늘어나는 것이어서 부담이 너무 컸습니다. 그래서, 아래와 같이 GAE를 사용하기로 하였습니다.GAE는 구글에서 일종의 클라우드 서비스(PaaS)로 구글 인프라에서 웹 어플리케이션을 실행시켜 줍니다. GAE에 클라이언트에서 요청한 URL을 적절한 S3 URL로 변환해주는 어플리케이션을 만들어 올렸습니다. 일종의 Rewrite Engine 역할을 하는 것입니다. 서비스의 안정성은 GAE가 보장해주고, S3와 CloudFront의 안정성은 AWS에서 보장해주기 때문에 크게 신경쓰지 않아도 장애 없는 서비스 운영이 가능합니다. 또한 CloudFront에서 스티커 파일을 최대한 캐싱 하며 따라서 GAE를 통해 새로 요청을 하는 경우는 거의 없기 때문에 GAE 사용 비용은 거의 발생하지 않습니다. GAE에는 클라이언트에서 보내주는 해상도를 보고 적당한 해상도의 스티커 파일을 내려주는 아주 간단한 어플리케이션만 작성하면 되기 때문에 개발 비용도 거의 들지 않았습니다.토큰을 이용해 보안 문제를 해결하다실제 스티커를 구매한 사용자만 스티커를 사용할 수 있어야 합니다. 스티커 토큰을 이용해 실제 구매한 사용자만 스티커를 전송할 수 있도록 구현하였습니다. 사용자가 스티커 스토어에서 스티커를 구매하게 되면 각 스티커에 대한 토큰을 얻을 수 있습니다. 스티커 토큰은 다음과 같이 구성됩니다.토큰 버전, 스티커 아이디, 사용자 아이디, 유효기간, 서버의 서명서버의 서명은 앞의 네 가지 정보를 바탕으로 만들어지며 서버의 서명과 서명을 만드는 비밀키는 충분히 길어서 실제 비밀키를 알지 못하면 서명을 위조할 수 없습니다. 사용자가 자신이 가지고 있는 스티커 토큰과 그에 해당하는 스티커를 비트윈 서버로 보내게 되면, 비트윈 서버에서는 서명이 유효한지 아닌지를 검사합니다. 서명이 유효하다면 스티커를 전송이 성공하며, 만약 토큰이 유효하지 않다면 스티커의 전송을 허가하지 않습니다.못다 한 이야기비트윈 개발팀에게 스티커 기능은 개발하면서 우여곡절이 참 많았던 프로젝트 중에 하나 입니다. 여러 가지 시도를 하면서 실패도 많이 했었고 덕분에 배운 것도 참 많았습니다. 기술적으로 크게 틀리지 않다면, 빠른 개발을 위해서 가장 익숙한 것으로 개발하는 것이 가장 좋은 선택이라는 알게 되어 스티커 스토어를 Python 대신 Java로 구현하게 되었습니다. 현재 비트윈 개발팀에서 일부 웹사이트와 스크립트 작성 용도로 Python을 사용하고 있지만 Python을 잘하는 개발자가 있다면 다양한 프로젝트들를 Python으로 진행할 수 있다고 생각합니다. 팀내에 경험을 공유할 수 있는 사람이 있다면 피드백을 통해 좋은 코드를 빠른 시간안에 짤 수 있고 뛰어난 개발자는 언어와 상관없이 컴퓨터에 대한 깊이 있는 지식을 가지고 있을 것이기 때문입니다.네 그렇습니다. 결론은 Python 개발자를 모신다는 것입니다.
조회수 917

유노윤호마냥 살았던 시간에 대하여(오만가지 공부썰2부)

1부에선 오만가지 알바를 주저리거려봤어요!https://brunch.co.kr/@roysday/304 사실 2부까지 갈 정도로 알바를 많이 했던 건 아니예요. 일도 하고 직장도 다녔으니까요..ㅋㅋㅋ.. 긁적긁적.. 대신 알바만큼 많이 했던 게 쓰잘데기 없는 것들 공부하기였어요. 덕분에 성적은 폭망했지만 당시엔 재밌었답니다. (당시에만)뭔가 어렸을 땐 주인의식 뽐뿌가 솟구쳐서 이것저것 닥치는 대로 공부하고 사람들에게 인정받고 칭찬받는게 좋았어요. 인정욕구에 챱챱 쩌들어서 '조낸 멋진 사람'이 되고 싶었거든요. 물론 지나고 나니 부끄럽고 손발오글이토글이지만... 그 혼란찌질한 시간이 무의미했던 것은 아니에요. 나름 얻어간 것이 있었답니다.(....추억은 미화되기 마련이니까..) 그 썰을 한 번 풀어볼까 해요.믿기지 않겠지만 저는 잡학지식을 굉장히 사랑해요. 그 시작은 6살 때였었는데, 엄빠의 사랑이 가득담긴 공룡대백과가 그 시작이었어요. 놀라운 건 지금도 하나도 빠짐없이 다 기억나는데... 공룡의 이름뿐만 아니라 공룡뼈의 구조와 치골의 위치, 근육구조를 달달 외우는 걸 좋아했어요..(왜 그랬지?)1. 지구의 역사가 너무 재밌어어어!!!이후론 신생대의 시작에서 유카탄 반도의 운석대충돌로 사랑하는 공룡들이 다 죽어버렸다는 사실을 깨닫고는... 지구과학에 흠뻑 빠져버리고 말았어요. NHK에서 해줬던 '생명, 그 영원한 신비' 라는 다큐를 보고 완전히 중독이 되버린 거예요.혹시 얘 아시는 분 있나요? 아노말로카리스... 이름도 안잊어버림그래서 지구의 45억년 역사를 달달달달 외우고 다녔었어요. 달은 왜 생겼고..DNA는 어떻게 만들어지고.. 맨틀은 어떻게 형성되고.. 오르도비스기와 실루리아기 대멸종은 어떻고... 주절주절....물론 인생에 큰 도움이 되진 않았어요.달은 뭘로 만들어졌을까? 대충...뭐 돌로 만들어짐2. 으아아!! 반물질은 존재하는 것인가!!!초등학교 때 아부지가 친척형네 집에서 뭔가 빨간 잡지를 잔뜩 가져왔어요. 뉴튼지였죠. 솔직히 누구나는 아닌 듯아시는 분이 계실 것 같아요. 뉴튼 지는 조낸 재미있어요. 당시만 해도 온통 빅뱅과 초끈이론, 블랙홀 등등의 내용이 가득했었죠. 뭔가 뉴튼지는 지금도 그런 내용들이 가득한데 은근 과학계의 가십지같은 느낌도 들어요. 초끈이론을 어떻게 초딩나부랭이가 이해하겠어요? 그냥 뭔가 11차원이 있다는 게 너무 놀랍고 신기했을 따름이었죠. 그래서 일단 모르겠고 달달달 외우고 다녔어요.3. 프랙탈과 양자역학!!그렇게 달달 외우고 다닌 채로 중학생이 되었는데..중학교도서관에 만화로 된 겁나 재미있는 물리학시리즈가 있었어요. 그중에서 제 눈길을 확 잡아끈 것은 프랙탈이론과 양자역학이었죠. 특히 양자역학 이론중에 슈뢰딩거의 고양이와 하이델베르크의 불확정성원리는... 충격 그 자체였어요. 난 앉아있기도 서있기도 하다... 상대성이론보다 더욱 마법같은 이야기들이거든요. 양자역학은 어찌보면 좀 초자연적인 내용같기도 하고..한편으론 철학과 비슷한 느낌이기도 해요. 그래서 흠뻑 빠져들고 말았죠. 지금도 쿼크단위의 세계에 대해서 흥미진진한 호기심이 가득하답니다. 그러나 아무와도 이런 말을 할 수 없음....(그랬다간 아싸되벌임)4. 인간의 마음과 지지고 볶은 역사에 대하여고등학생이 되고나니.. 확실히 교과목에 집중해야 했어요. 그 중 수학은 루비콘 강 너머의 지옥문과 같았고, 영어는 샘이 너무 재미없었어요. 그 와중에 국사선생님이 오지게 재미있는 거예요. 그래서 국사를 달달 공부하게 되었어요. 샘이 재미있었던 이유가..단순히 년도별로 외우라는 게 아니라 인과관계를 잘 설명해주셨거든요. 그 와중에 야사도 중간중간 섞이기도 하구요. 너무 재미있었음... 예를 들면 고려시대에는 오히려 여성의 위상이 높아서 부엌에 남자가 안들어간게 아니라 못들어간 것이라는 (부엌은 여성의 전용공간 내지는 금남의 공간이었거든요.) 이야기 등등 말예요. 거기에 플러스해서 누구나 한번쯤은 관심가져봤을 심리학서적도 찾아보곤 했었어요. 왜냐면 한참 성욕폭발일 때였던 지라... 프로이트의 리비도개념이 뭔가 크게 공감갔거든요(사실, 리비도는 그냥 하앍하앍 성욕에 대한 얘긴 아닙니다.) 그 중에서도 특히 사회심리학에 대해 관심이 있었는데, 이건 2차세계대전 이야기를 들으면서 알게된 1961년 밀그램의 복종실험 때문이었어요. 당시엔 너무 큰 충격이었거든요. 인간은 얼마나 쉽게 복종에 굴복하는가..그 때 이후로 전 성무성악설을 믿게 되었습니다. 이황보단 이이의 이통기국론에 손을 들어주게 되었죠. 기억이 새록새록 나시죠 문과여러분?...5. 난 왜 감기에 걸릴까!!...고2때 담임샘은 생물샘이었어요. 초딩때 DNA의 탄생에 대해서 탐구했다고 했잖아요. 그 이후로 DNA의 복제에 대하여 늘 궁금했었어요. 그러다 고등학생이 되서야 센트럴도그마의 개념이 이해되기 시작했죠. 이름부터 개멋져... 이건 1958년의 크릭이 내놓은 가설이었는데, 분자생물학의 기본원리라는 뜻이예요. 골자는 생명의 기원이 사실 DNA가 아닌 RNA일 수도 있단 내용이었는데.. 초딩때부터 믿어왔던 DNA가 사실은 훼이크일수도 있단 사실은 거의 카이저소제급의 대반전이었어요. 디! 엔! 에이!~....아니 이게 아니...고..센트럴도그마를 공부하다보면, 예외사항이 하나 등장하는데 그게 바로 HIV바이러스예요. 바로 에이즈죠. 원래는 DNA가 RNA로 바뀌는게 정방향인데... 에이즈를 일으키는 레트로바이러스는 RNA를 DNA로 바꾸는 역전사효소를 지니고 있단 내용이었어요. *(바이러스는 RNA만을 지니고 있어요.) 본인이 가진 RNA를 이래저래해서 DNA로 바꾼 다음 몸 속의 면역세포안의 DNA와 결합해서 프로바이러스로 변신한다는 거의 마블세계관 같은 기똥찬 내용이었죠. 레트로 바이러스는 이름부터 개멋져이 때부터 면역에 대하여 급하게 빠져들기 시작해서..암세포와 에이즈, 루푸스, 에볼라, 흑사병 등등.. 사람들을 공포에 떨게 했던 주요 질병들의 메커니즘에 빠져들기 시작했어요. 거의 뭐 약간 미치광이 과학자느낌..?6. 철학자들의 세계로 풍덩!!....물리학과 생물학을 얼핏얼핏 건들다보면 늘 등장하는게..바로 철학자들이에요. 사실 고대의 철학자님들은 죄다 투잡 쓰리잡이어서, 철학자를 전업으로 하신 분들은 거의 없었거든요. 대부분 발명가, 미술가, 물리학자, 의사 등등...겸업을 밥먹듯이 하신 분들이라 자연스럽게 철학자님들의 이야기에 빠져들 수 밖에 없었어요. 게다가 전 사탐 선택과목이 윤리와사상이어서 달달달 외우기도 해야했구요.그러니까, 아타락시아란 무엇이냐.. 바로 에피쿠로스 학파에서 이상으로 삼은 상태로써...특히 서양철학은 계파가 이성중심, 본성중심으로 쪼개져서 고대그리스 시절부터 하나의 스토리를 그릴 수 있거든요. 스토아학파의 후예들과, 에피크로스학파의 후예들의 이야기를 쪼개서 생각해보면 중간중간 나름 변절자 소리를 들었더 사람들도 이해가 가고, 왜 계파가 쪼개졌는지 뒷얘기들이 꽤나 흥미진진 했었어요. 동양철학보단 서양철학사를 더 좋아했었어요 :) (왜냐면 뭔가 영어단어를 주절주절하는 게 조금이라도 더 멋져보였나봐요..허세 지렸던 사춘기시절이라..... 부끄)7. 스피치...?학원도 다니고...강의도 듣고, 개인레슨도 받고 했었는데...저는 말에 소질이 없었습니다...8. 갑자기 공인중개사..(현타)음?...갑작스럽게 공인중개사 공부를 했어요. 1차 합격하고 2차는 안봤어요. 아부지가 씨알데기 없는 짓 하지말고 니 하는 거나 잘하라고 쿠사리주셔서.. 맘을 고쳐먹었죠.(안그래도 공법공부 하기 싫었는데 앗싸..) 하지만 1차 과목에 민법총론과 부동산법이 있는데, 아주 재미있습니다. 특히 민법총론을 공부하다보면 아..........우리가 사는 세상이 우리 상식과 굉장히 다르구나...라는 생각을 느끼게 돼요. 다들 시간나시면 한번쯤은 공부해보시길 추천드립니다. 계약관계에 대한 흥미진진한 이야기들 뿐 아니라 실질적으로 도움되는 내용들이 너무 많거든요. 혹시 2차까지 자신있으면 따놓으시면 더욱 좋을 것도 같고...9. 리더쉽공부...(감기도 긍정으로 이겨라)7 habit, 크리스토퍼, 피닉스, CS교육 등등... 영업뛸 때 오지게 리더쉽교육을 받았어요. 심지어 감기걸린 것도 긍정의 힘으로 이겨낼 수 있대. 미쳐부러.....  확실히 사람은 분위기가 중요한 것 같아요. 다같이 막 기합넣고 구호외치고 나는 할 수 있다!!! 이런 분위기면 휩쓸리거든요. 돌이켜 생각해보면 약간 다단계 느낌이기도 했던 것 같은데... 당시에는 고객님들에게 매번 개털리고도 다시 웃으면서 긍정긍정!!! 화이팅!! 할 수 있는 원동력이기도 한 것 같아요. 약간...내 영혼의 몰핀?...느낌10. 경제 공부도 스멀스멀..(돈은 내 것이 아니란 걸 깨달음)공인중개사 공부하면서 '돈의 흐름' 에 대해 고민해보게 되었어요. 그 와중에 서브프라임 모기지론 사태를 다룬 빅쇼트랄지, 인사이드 잡, 마진콜등을 찾아보게 되면서 개소름을 느꼈죠. 일단 크리스챤 베일 연기가 미쳤거든요. 그 후로 세계경제가 어찌어찌 돌아가게 되는지 찾아보게 되었어욤. 엔화는 어떻게 달러돌려막기의 수단이 되는지, 금리정책이 실물경제에 어떤 영향을 미치는 지, 자원전쟁은 실체화 될 것인지 등등... 흥미진진한 내용들이 가득하더군요. 에라이 망할 돈이건 저희 아부지 영향이 커요. 아부지가 망하시기 전에는 증권회사에 다니셨던 터라, 뭣도 모르는 초딩이지만 매일 아침 MBN을 보면서 다우와 나스닥, S&P지수를 아버지께 보고해야 했거든용.. 그 땐 그게 뭔지도 몰랐는데... 이제 알겠움.11. 그리고 교육으로..29살때는 청소년센터 활동진로팀에서 일했었어요. 덕분에 방송대 청소년교육과에서 열심히 공부도 했답니당. 전 대학교를 1학년 다니다가 때려쳐부렀기 때문이죠. 하지만..공부를 하면 할수록 현실과의 괴리와 슬픔이 커져만 갔어요. 열정은 폭발하는데 현실에는 제도와 절차라는 것이 있었으니까요.안해..12. 번아웃된 후로 디자인공부...느아아아아앙!!!!5년을 교육계에서 열폭하며 지내다가..결국 하얗게 불타선 고갤 숙이고 뒤돌아서고 말았어요. 못해먹겄다...하고 손 털고 나온 것이죠. 그 이후로 본격 애프터모멘트가 시작되었답니다. 디자인공부를 우르르 해보았어요. 처음엔 핀터레스트를 겁나 베끼고, 미술사를 공부하다가 이건 아니다 싶어서 이론서들을 사서 달달 외우기 시작했어요. 그 땐 무슨 책이 좋은 지 몰라서 "디자인관련 서가에 있는 책을 다 읽어불자!!!" 라는 목표로 공부했었어요. 물론 수백권을 다 읽진 못했지만... 되는 대로 마구 읽어댔던 건 후에 꽤나 도움이 되었어요. 툴도 책으로 공부해 봤는데 그건 아닌 것 같아요. 툴은 그냥 누군가에게 탈탈 털리면서 배우는 편이 효율이 높아욤. 지나고 보니 이래저래 잡다한 것들을 뒤적뒤적하며 살아왔네요. 사실 뭔갈 깊이 공부했던 것은 아니었어요. 하나하나 파고들 때 심하게 집중하는 스타일이라..중고등학교 때 성적은 죄다 말아먹었구요. 그렇다고 그 때 공부한 것들이 지금 뭐 인생에 도움이 되냐..하면 딱히 그런 것도 아니에요. 에이즈바이러스에 대해 달달 외우고 다니는게 뭔 도움이 되겠어요. 그냥 뭐랄까 지적허영심을 채우는 달콤케익같은 느낌이랄까요.하지만 확실히 이런 건 있더라구요. 무언가를 공부할 때 어떻게 어떤 순서로 파고들어야 할 지.. 대강 알 것 같아요. 그냥 방법적인 것만 본능적으로 체화된 느낌이랄까요..?(근데 문젠 공부를 안함) 그러나.... 혹시 교과목을 공부하셔야 되는 분들이라면 수능 또는 자격증 성적에 집중하시길 바랍니다. -.- 쓸데없는 거 공부하지 말고..끝. 앙농.
조회수 1374

스타트업이 사랑하는 단어

태극기가 바람에 펄럭입니다~~!!머나먼 외국에서 잠시 세상구경하며 살던 때에,태극기만 봐도 집생각에 울컥했던 기억이 있다.그런데 요즘은 태극기를 보면,왠지 애국심이라던가, 아련한 추억보다는뒤 끝이 묘하게 정치적인 이슈가 떠오른다.촛불이건, 태극기건그 자체가 가지는 고유의 의미와 이미지보다둘로 나뉘어진 이념, 세대, 계층간의 대결구도를언론과 호사가들이 더욱 부추기는 것 같다.정치적인 이야기를 하려는 건 아니다.지나간 3.1절에태극기를 계양하느냐, 마느냐에 대한 이야기를 나누었고나는 태극기를 다는 것에 굳이 눈치 볼 필요는 없다고 생각한다.태극기를 특정한 정치적 의도에 사용하는 사람들로 인해태극기를 혐오하게 된다는 것이 웃긴 일이지.태극기에 대한 부정적인 인식은잘못된 의도로 사용하기 때문에 생긴다.내가 애국자는 아니지만일제치하에 저항하던 태극기가,우리나라 자유와민주주의의 상징이던 태극기가다른 의미로 퇴색되버리는 모습에안타까움과 측은함이 든다.이제는 다시 태극기가정상적인 모습으로 돌아오겠지?창업자가 동료들 또는 직원들에게자주 언급하는 몇몇 단어가 있다.어릴 적부터 좋아하던 단어들인데...지금은 섣불리 쉽게 내뱉을 수 없는...한 번 쯤 더 생각해보고 꺼내야 하는 이상한 세계에 살고 있다."열정""경청""끈기(또는 노력)""헌신"등등이 좋은 단어들은 스타트업에게꼭 필요한 덕목들인데...이걸 직설적으로 이야기하기엔망설여진다.부정적인 언어 사용에 포함되어일상적으로 퍼져버렸기에단어 자체가부정적인 이미지를 덮어썼다고 할까?창업자의 입에서 쉽게 나오기 어려워진 이 단어들.어디서부터, 무엇이 잘 못 되었나.1. 열정은 연료가 있어야 한다."돈보다 열정만 있으면 돼"처음에 열정페이에 대한 논란이 일어났을 때,터질게 터졌구나 하는 생각이 들었다.아르바이트를 경험한 사람이라면,열정페이가 피부에 잘 다가오겠지.비정규직이 늘어나고,단기근로의 허술한 법망과망가진 시스템을 악용하는 기업들이늘어나면서어느 샌가,사회 곳곳에서 열정페이라는 독버섯이세상을 뒤엎었다.열정이라는 것은 일이나 어떤 분야 등에불과 같은 뜨거운 마음으로 임하는 것을뜻할진대...그랬던 사람의 뜨거운 온기만 쏙~ 빼먹고타다남은 재마냥 버리는 그런 시스템.그러다보니 구직공고에"열정"이란 단어는"널 단기간에 왕창 부려먹고 버릴거야~"라는 고용인의 속마음이라 부르게 되었다.열정은 불과 같다.우리 다들 발화의 3대요소 기억하려나?비전이라는 불씨(발화점)가 있어야 한고,태울 수 있는 연료(탈 것)가 있어야하고,잘 타기 위해 공기(산소)가 꾸준히 유입되어야 한다.매일 정신교육하듯이 열정만 강요하는 것은얼마가지 않아 공허한 꼰대의 외침이 되버린다.열정은회사의 비전과 개인의 장래가부비부비 함께 마찰해야 불씨가 생긴다.여기에 불쏘시개가 되도록급여든, 인센티브든, 복리후생이든간에지속적으로 공급되는 탈 것이 공급되어야 한다.월화수목금금금,새벽별보고 출근해서새벽별보고 퇴근하려다가귀찮아서 사무실에 눈붙이는 삶이아니라개인의 삶과 여유라는 산소가 있어야 한다.우리 회사의 쉼은 재생산을 위한 충전이며 직원과 함께 공유하는 시간이고, 회사가 생각하는 시간이다.스타트업이 이 모든 것을 해 줄 만큼자금적, 시간적 여유가 어디있냐고?법이라는 최소한의 규정만이라도지켜줘야지.그것마저도 해 줄 수 없다면,열정 같은 소리로 사람 꼬드기지 말라구.스타트업에선 현실적으로 어렵다고?아니, 그것은 의지와 행동의 문제야.주위에 지극히 현실적이면서,열정을 북돋아주는 스타트업도 많아.2. 경청은 자~알 듣는 것이 아니다."윗사람이 말하면 가만히 경청하라구"직장인 시절, 회의가 꽉 막힐 때,상급자가 이런 말을 했었다.순간 욱~ 했지만, 어쩔 수 없이 참고 넘겼고,그 이후 나는 회의 시간에 입을 다물었다.지금에 와서 뒤늦게 딴지 걸자면,위의 문장에서 두가지 집고 넘어갈 것이 있다.일단 "윗사람"은 어떤 사람을 말하는 건가?그리고 왜 경청하는데 "가만히" 있어야하는건가?윗사람이라는게 경력자를 말하는건지,직급으로 나누어진 상급자를 말하는건지,C레벨이라고 불리는 경영진을 말하는건지...그런건 사실 스타트업에 중요하지 않다.누구든지 자유롭게수평적인 입장에서의견을 제시 할 수 있어야 한다.윗사람 운운할거면,회의 같은 거 하지마!그렇게 할거면,"윗사람"들끼리 회의해서"윗사람"들끼리 결정해.그리고 "아랫사람"들은시키는대로만하고,월급날만 기다리는게 당연하지.이번에는 "가만히" 듣기다.경청이 잘 듣는거라고 착각하는데...그건 경청의 순서 중 하나일 뿐이야.경청(傾聽)은 순서와 마음이 있는 단어이다.상대방을 공경하고 존중하는 입장에서맑고 밝은 진실한 마음으로 대화에 임하는 것.일일이 한자 파자(破字)해서 설명하긴 귀찮으니까그냥 의미만 남길께.경청의 순서는1) 마음을 비우고 마주 하는 것2) 상대방의 이야기를 끝까지 듣는 것3) 상대방의 이야기에 대한 내 의견을 전하는 것4) 서로의 의견을 취합하고, 보완해서 보다 나은 의견을 재생산하는 것자...많이들 2)만을 강조해.잘 듣게만 하는거면, 그건 세뇌교육이야.잘 듣게만 하는거면, 주입식 교육이야.이건 경청의 한 단계일 뿐이지 전부가 아니란말야.우선은1)이라는 공감대가 있어야 한다.서로의 입장과 논리가 다를 수 있어.그리고 사전에 상대방에 대한 선입견을 가지고 있으면무슨 이야기를 하든 귀에 안 들어오거든.맨날 대표가 프로젝트를 뒤집고,지난 주에 했던 말을 번복하고 그러면구성원들은 그 대표의 말을 귀담지 않아.어차피 금방 또 뒤집을거 같으니까.그리고 3)은 수평적인스타트업 회의의 특징이야.듣는 건 커뮤니케이션이 아니야.상호간에 의견과 생각을 주고 받아야 되는거지.그리고 4)가 중요한 이유는어떤 회의, 미팅이든...이전보다 나아진 결과가 필요하거든.아무 성과없는 회의는구성원들에게 회의의 필요성을 의심하게 만들지.그냥 시간만 날리는 꼴이거든.그렇지 않으려면,회의의 마지막에는꼭 뭔가 변화가 있다는 것을모두가 느낄 수 있게 해야 해.경청은 또한 마음이야.서로를 존중하고 경외하는 마음이지.상대방의 이야기를 들으며,비난하거나 공격할 건덕지를 찾는게 아니라내 관점과 상대방의 관점을이해하려는 노력에서 시작되는거야.그 때는 맞았고, 지금은 틀릴 일이일상다반사인게 스타트업 업무야.내가 아는 범위에서의 논리보다내가 모르는 범위에서의 논리가더 강하게 영향을 미치는게 이 쪽 일이라고.그럼 다양한 시각에서 바라본 의견을수용할 줄 알아야하고,상대방의 입장에서 역지사지해야 하는거야.그러한 마음가짐이 바로 경청이지.3. 노력과 끈기가 없음은 누가 정하는건가요?"요즘 젊은 것들은 노~~오~~력이 부족해""끈기가 없어서 중간에 포기하는 허약한 세대!"어떤 근거로 젊은 세대들에게노력이 부족하다고, 끈기가 없다고판단하는 건지 의구심이 든다.나처럼 어정쩡하게끼어버리는 나이가 되면깨닫는 것보다 궁금증이 더 많아진다랄까?어쨌든...인정하고 넘어갈 현실이 있다.노력을 해도 안 되는 일들이 있다는 것!어떤 일은 끝까지 밀고가기보다는빠르게 철수(포기)하고새로이 시작하는게 낫다는 것!한 우물의 예를 들어볼께.한 우물만 파면 뭐가 되도 된다던 시절이 있었어.뭐 지금도 어떤 분야에서는 그렇기도 해.우물을 파려는데...바닥이 화강암이야.우물을 파려는데 도구 없이 맨손이야.우물을 파려는데 법으로함부로 우물을 파면 안된다고 해.젊은 친구들에게 노력만을 강요하지마.노력할 수 있는 환경을 만들어 주는 것이 먼저야.맨손이더라도 파면 파질수 있다는 것을솔선수범해서 보여주면 안 될까?최소한의 도구를 주고 파라고 하면 안 될까?제도적으로 팔 수 있는 기회를 주면 안 될까?그리고 계속 우물을 파라고무작정 강요하지마.우선은파는 자리가 물이 나올 곳인지판단하는게 중요해.파도, 파도 물길이 없는 곳을 파는 것은무덤을 파는 거랑 같아.끈기?사방이 깜깜한 막장에서힘들게 석탄을 캐던 광부들이고되고 위험해도 일을 할 수 있던건돌아갈 수 있는 길이 있어서야.요즘 시대에젊은 세대에게 돌아갈 길은 막혔어.이미 대학 졸업하면 열에 여덣은학자금대출이라는 짐을 지고 있어.비정규직이라는 굴레를 가까스로 벗어나도언제 짤릴지 모르는 말만 정규직이야.직장생활을 끈기만으로 버틸 수도 없는 시대야.스타트업은 더 심해.대표조차도 늘 어둠속을 헤메이고 있어.당장 내일에는 또 어떤 일이 있을지알 수 없는게 스타트업이라고.막무가내로 직원들에게 "끈기"를 강요하지말고,"끈기"를 가질 수 있도록 우리부터 "노오력"을 해야해.창업을 위해 이것저것 공부하다...인사노무 관련한 강의나 멘토를 통해직원들에게 희망 또는 비전을 주라고 교육 받았을거야.좋은 강연과 교육을 듣는 것도 중요하지만 어떻게 적용하고, 행동에 변화를 만드는지가 더 중요하다.딱 거기서 "아~ 지당하신 말씀"하고 넘어가면,딱 거기서 끝인거야.희망 또는 비전은 말로 만들어지는게 아니야.단계적으로 구현되는 것을 체감하도록 해야 해.말로만 번르르르하게 핑크빛 미래를설명하는 것은 근거없는 주장일 뿐이야.투자자든, 파트너든, 거래처든간에창업자들이 더 잘 알고 있는 사실이잖아.미래에 대해 제시하면,그것을 어떻게 구현할지 계획을 보여주고계획이 이루어지는 결과물들을만들어내야 신뢰를 이끌어내듯이...직원들에게도 마찬가지야.우리 회사의 미래를 말했으면,어떻게 이루어 가고,우리가 무엇을 해야하는지를 말할 수 있어야 해.그리고나서결과물을 공유해야 해.그것이 급여 인상이 되든,복리후생이 되든,인센티브가 되든간에...단계적으로 진행되고 있고,그것이 우리에게 영향을 끼치고 있다는 사실을체감할 수 있게 해야하는거지.그래야,고난과 리스크가 있는 길임에도그 이상의 가치를 위해끝까지 동행 할 근거가 생기는거야.그리고노력, 끈기라는 것이 왜 필요한지굳이 설명하지 않아도자발적으로 움직이게 되는거지.입장 차이가 있다는 것을 늘 명심해야해.창업자는 보이지 않는 길이더라도 의지로 갈 수 있지만동료들에게는 길이 보이도록 만들어 주어야 의지를 줄 수 있어.4. 헌신은 선택이다.직장인 유머랄까?씁쓸한 이야기가 하나 눈에 들어오더라."회사에 헌신하다간 헌신짝처럼 버려질거다"스타트업에 합류한 직원들의 끝은대다수가 후회로 끝난다.스타트업이 성공할 확률이 낮은 것도 이유겠지만잘 나간다는 스타트업에서도직원들의 엑소더스는 흔한 일이더라고.스타트업에 지원한 분들의 대다수는각오를 다지고 지원한다.불안정한 고용환경,적은 연봉,빡빡한 근무강도 등열악한 조건임에도 스타트업에 합류하기로마음 먹는다는 것은 어느 정도 뜻이 세워진사람들이라는거다.자!회사에 대한 헌신을 강요하는 것은얼마나 이기적인 것인지 알아보자.고용이라는 것은 철저하게계약에 의한 상호 약속이다.계약 이외의 조건을 강요하는 것은그에 합당한 합의가 이루어져야 가능한 일이지.근데...막상 합류한 다음에 고용계약서에도 없던일들을 막 시키고, 압박을 넣는다.불합리해 보이지 않나?중소기업에 인력난은사회 시스템의 문제도 있지만분명 사용자의 불합리한 대우가 중요한 원인이 된다.헌신이라는 것은그에 대한 보상이 약속되어야 한다.종교에서 헌신이라는 것이아무 목적과 보상이 없이 이루어지는 걸까?아니,적어도 헌신을 통해서나 좀 더 잘 봐달라고,설령 내세에서라도내가 헌신했던 모습들을 기억해 달라는 것이다.회사에서도 마찬가지다.헌신은 목적이 있고,보상이 있어야 한다.지금 당장은 헌신이지만,향후에 그보다 더 큰 보상을 해 주어야 하는일종의 투자 유치라고 생각해야 한다.직원들은 회사에 헌신이라는 이름으로투자를 하는 것이고, 회사는 직원들에게보상에 대한 구체적인 계획과 방법을 제시해야 한다.회사를 위해 헌신하는 직원들을투자자 대하듯이 존중하라.돈만이 투자가 아니라시간과 노력, 고민과 끈기 등의무형의 가치들도 투자이다.스타트업의 동료들도강력한 내부 투자자다.창업자들은 외부 고객에 신경쓰는데 심혈을 기울인다.특히,창업 초기에는 투자자와 거래처에 완전 깎듯하더라.제품/서비스가 출시 될 때는고객들에게 심장을 바칠듯한 구애를 한다.당연히 그래야한다.그리고 더불어서....내부 고객에게는 항상 더 신경을 써야 한다.내부 고객을 만족 시키지 못 하는 회사가어떻게 외부 고객을 만족 시키겠는가.내부 고객이 등을 돌리면,그 회사는 미래가 없다.스타트업이 좋아하는 단어들을남발하는 것은 추천하지 않는다.남발한 만큼 그에 대한 책임을 져야 하고,액션을 취해야하고, 노력을 해야한다는 사실을 인지하자.좋은 의미로,좋은 뜻으로 사용하는 단어들이지만,그것이 좋은 결과로 만들어지기까지는말뿐으로 끝나는 단어가 아니라행동으로 마무리하는 단어가 되어야 한다.#클린그린 #스타트업 #스타트업창업 #창업자 #고민 #성장 #인사이트 #조언
조회수 1758

Docker, NodeJS, Nginx! 너로 정했다!

편집자 주아래와 같이 용어를 표기하기로 저자와 협의함Docker, NodeJS, NginxOverview안녕하세요. 칼 같은 들여쓰기에 희열을 느끼는 브랜디 개발자 강원우입니다! 서버를 운영해본 개발자라면 Fatal 에러, 아웃오브메모리 에러, 또는 전날 흡수한 알코올로 인해 손을 떨다가 한 번쯤 서버를 요단강 너머로 보내봤을 겁니다. 만약 테스트 서버였다면 잠시 마음을 가다듬으면 되지만, 현재 상용 서비스 중인 서버라면 얘기는 달라집니다.님아, 그 강을 건너지 마오!이런 간담이 서늘해지는 경험은 저 하나로 족합니다. 그래서 고군분투했던 지난 날을 되돌아보면서 빠르고 안정적이며, 죽어도 죽지 않는 좀비 같은 서버 구축 방법을 쓰려고 합니다.준비물서비스를 운영할 때 가장 중요하게 여겨야 하는 건 역시 안정성입니다. 이번 글에서는 오래 전부터 개발 세계의 뜨거운 감자였던 Docker와, 단일 스레드와 이벤트 루프로 태생적으로 심플하고 민첩한 NodeJS, 마지막으로 고성능을 목표로 개발된 Nginx를 활용하겠습니다.1. DockerDocker는 컨테이너 기반의 오픈소스 가상화 플랫폼입니다. 대표적으로 LXC(Linux Container)가 있습니다. 화물 컨테이너처럼 어떠한 일련의 기능을 완전히 격리된 소프트웨어 환경에서 작동하게 만드는 기술을 말합니다.OS 가상화와 별반 다를 게 없는 것 같지만 소프트웨어적으로 작동한다는 차이가 있습니다. 다시 말해, 현재 OS의 자원을 그대로 사용하기 때문에 하이퍼 바이저가 가상환경을 위해 가상의 커널을 만드는 오버헤드가 거의 없다는 것이죠.이미지와 속도도 차이를 보입니다. 완벽하게 구성한 세팅을 그대로 이미지화할 수 있고, 해당 이미지는 Docker 위에서 완벽히 동일하게 동작하는 걸 보장합니다. 해당 이미지로 컨테이너를 제작할 땐 1~2초면 새로운 컨테이너가 생겨날 정도로 엄청나게 빠른 속도도 자랑합니다. 1)또한 Docker는 자주 사용되는 다양한 이미지를 퍼블릭 레포지토리에 공유해 사용할 수 있기도 합니다. 양파도 아닌데 특징이 계속 나오죠? 다음 글에서 Docker의 특징을 더 자세히 다루겠습니다.Docker는 리눅스만 지원했었지만, 요즘은 Docker for Windows와 Docker for Mac으로 거의 모든 OS에서 사용할 수 있습니다. 2) Docker 설치 링크는 윈도우와 맥으로 나뉘어져 있습니다. 리눅스는 아래를 참고하세요.curl -fsSL https://get.docker.com/ | sudo sh 2. NodeJSNodeJS는 구글이 구글 크롬에 사용하려고 제작한 V8 오픈소스 자바스크립트 엔진을 기반으로 제작된 자바스크립트 런타임입니다. NodeJS에는 몇 가지 특징이 있습니다.단일 스레드입니다.비동기 방식입니다.이벤트 루프를 사용합니다NPM이라는 끝내주는 동반자가 있습니다.비유하자면 예전엔 낡은 곡괭이로 큰 돌을 캐내려고 수십 명의 인부가 달라 붙었는데, 지금은 육중한 포크래인으로 거대한 돌을 쑥! 뽑아버리는 것과 비슷합니다. 굉장히 효율적이죠. NodeJS는 단일 스레드의 장점을 극대화하려고 이벤트 루프를 통해 모든 처리를 비동기로 수행합니다. 서버 사이드의 묵직한 CPU들이 빠르게 일을 처리하고 이벤트 루프에 등록된 일을 감지해 다음 작업을 빠르게 수행하는 방식입니다.마지막으로 NPM(Node Package Manager)은 NodeJS에서 사용할 수 있는 다양한 모듈을 관리해주는 프로그램입니다. 도커와 상당히 유사합니다. NodeJS에서는 무언가 기능을 만들기 전에 NPM을 먼저 뒤져보라는 말이 있을 정도로 풍부한 모듈 생태계가 구성되어 있습니다. 이는 로깅이나 날짜 계산 등 생각보다 까다로운 것들을 가져다 사용할 수 있게 도와주기 때문에 개발이 빨라집니다. NodeJS 설치링크는 여기를 클릭하세요. 이 글의 예제에서는 NodeJS의 현재시점 LTS인 codename Carbon버젼을 사용합니다!8.x 버젼이 Active LTS 상태입니다.LTS은 Long Term Support의 약자로 가장 오랜기간 지원하는 버전입니다.우선 서비스 구성을 위해 간단한 NodeJS 어플리케이션을 작성해보겠습니다.첫째, packge.json를 작성합시다.{   "name": "nodejs_tutorial_server",   "version": "0.0.0",  "private": true,   "scripts": {     "start": "node nodejs_tutorial_server.js"   },   "description": "NodeJS Tutorial Server",   "author": {     "name": "WonwooKang"   },   "dependencies": {     "express": "^4.16.3",     "uuid": "^3.2.1"   } } nodejs_tutorial_server.js 파일을 메인으로 실행합니다. HTTP Request를 처리하려면 express를 사용해야 하며, 서버를 구분하려면 uuid모듈이 필요합니다.둘째, package.json의 의존 파일들을 설치합시다.npm install npm install 전npm install 후셋째, 간단한 웹 어플리케이션을 작성합시다.var express = require('express'); var app = express(); const port = 3000;  var server = app.listen(port, function () {     console.log("Express server has started on port : "+port);  });  app.get('/', function (req, res) {     res.send('Hello?');  }); 넷째, package.json의 script start 구문을 실행하여 서버를 로드합시다.npm start 3000번 포트로 서버가 시작되었습니다!접속해볼까요?잘 접속됩니다.그런데 수정할 때마다 서버를 매번 다시 띄우면 귀찮을 겁니다. 이럴 땐 nodemon 모듈을 사용합시다. nodemon은 Nodejs의 파일이 수정되는 걸 감지해 자동으로 리로드해주는 편리한 도구입니다.nodemon설치npm install nodemon -g package.json script 변경"scripts": {     "start": "nodemon nodejs_tutorial_server.js"   }, nodemon 실행확인을 위해 약갼의 수정//nodejs_tutorial_server.js 수정 app.get('/', function(req, res) {     res.send('Hello Nodemon');  }); nodemon을 통해 어플리케이션이 실행된 모습파일수정 후 저장했을 때 자동 감지한 모습서버 잘 떴습니다!성공적으로 단 하나의 GET 요청을 처리할 수 있는 심플한 NodeJS 기반 웹 어플리케이션을 완성했습니다. 이제 웹 어플리케이션을 Docker Container위에서 구동해봅시다!3. Docker로 NodeJS Express 서버 구동하기이제 Docker Container위에서 NodeJS서버를 구동할 건데요. 그러려면 우선 Dockerfile을 작성해야 합니다. 물론 Docker의 이미지를 당겨 받고, 컨테이너를 생성하고, 또 컨테이너를 실행해서 Attach하고, 필요한 파일들을 밀어넣는 등 귀찮은 방법도 있습니다. 하지만 개발자에게 이것은 힘든 작업이므로 Dockerfile을 적극 활용합시다. (Dockerfile의 D는 대문자여야 합니다! 꼭이요)Node 도커 이미지에 어플리케이션 파일을 추가해 실행하는 Dockerfile 작성하기FROM node:carbon MAINTAINER Wonwoo Kang [email protected] #app 폴더 만들기 - NodeJS 어플리케이션 폴더 RUN mkdir -p /app #winston 등을 사용할떄엔 log 폴더도 생성 #어플리케이션 폴더를 Workdir로 지정 - 서버가동용 WORKDIR /app #서버 파일 복사 ADD [어플리케이션파일 위치] [컨테이너내부의 어플리케이션 파일위치] #저는 Dockerfile과 서버파일이 같은위치에 있어서 ./입니다 ADD ./ /app #패키지파일들 받기 RUN npm install #배포버젼으로 설정 - 이 설정으로 환경을 나눌 수 있습니다. ENV NODE_ENV=production #서버실행 CMD node nodejs_tutorial_server.js Dockerfile 내용은 node:carbon에서 :carbon이 NodeJS의 이미지 버전 Tag 입니다.Dockerfile을 통해 docker image 빌드하기docker build –tag 레포지토리명: 태그 Dockerfile 경로docker build --tag node_server:0.0.1 [Dockerfile이 위치하는 경로] 호오... 게이지가 마구마구 차오르는군요?build가 완료된 화면입니다. Dockerfile의 내용 순서가 각 Step별로 진행된 것을 알 수 있습니다.빌드 결과 생성된 이미지 확인하기docker images 빌드 명령어에서 입력했던 버전 태그까지 잘 입력된 것을 알 수 있습니다.NodeJS Carbon 이미지를 기반으로 한 node_server 이미지를 제작했습니다. 사이즈는 둘이 합쳐 1Gb가 넘을 것 같지만 실제로는 변경된 부분만 저장됩니다. 그러므로 node_server 이미지의 크기는 6~10Mb 정도입니다.생성된 이미지로 컨테이너 만들기컨테이너 생성 명령어는 아래와 같습니다.docker create --name [서버명] -p [외부 포트:컨테이너 내부포트] [이미지명:버전태그] 주의할 점이 있습니다. 포트번호 바인딩 중 왼쪽은 우리가 접속할 실제 포트이고, 오른쪽은 컨테이너 내부의 NodeJS서버 할당 포트가 된다는 것입니다. 공유기의 포트포워딩 설정과 같습니다.docker create --name NODE_SERVER_0 -p 3000:3000 node_server:0.0.1 알 수 없는 코드가 생성되었습니다. 응?컨테이너 확인하기생성한 컨테이너를 확인해볼까요?docker ps 어.. 없잖아?옵션을 추가합니다.docker ps -a 나타났다!docker ps 명령어는 현재 실행 중(STATUS:Up)인 컨테이너의 목록을 보여줍니다. -a 옵션은 실행하지 않는 모든 컨테이너를 보여줍니다. 위의 이미지에서 node_server:0.0.1이미지로부터 NODE_SERVER_0 이라는 이름으로 2분 전에 생성되었다는 걸 알 수 있습니다. 3)컨테이너 실행하기docker start NODE_SERVER_0 다시 확인하기docker ps 19초 전에 Up상태가 되었다는 걸 알 수 있다.외부 3000번 포트 -> 내부 3000번 포트로 연결되었습니다. 서버도 실행되었고요! 이제 접속해볼까요?내용도 안 바꾸고 새로고침도 빨라서 뜬 건지 잘 모르겠군요. 내용을 수정해서 다시 확인하겠습니다.//nodejs_tutorial_server.js 수정 app.get('/', function (req, res) {     res.send('Hello I\'m In Docker Container Now!');  }); 파일 변경해서 다시 확인하기//버전 태그도 0.0.2로 업해주고 docker build --tag node_server:0.0.2 [Dockerfile위치] 잘 생성되었습니다.//이미지가 잘 생성되었는지 확인하고 docker images 0.0.2가 나타났습니다.//기존 컨테이너를 삭제합니다. -f 옵션은 실행중인 컨테이너도 강제로 삭제하겠다는 뜻입니다.  docker rm -f NODE_SERVER_0 // 잘지워졌나 확인하고  docker ps -a 잘 지워집니다.//0.0.2 버젼 이미지로 컨테이너를 다시 생성합니다.  docker create --name NODE_SERVER_0 -p 3000:3000 node_server:0.0.2   //서버를 실행합니다. docker start NODE_SERVER_0 잘 실행됩니다.이제 다시 접속해봅시다.안녕! 나 지금 Docker 안에 있어!이제 Docker로 여러 개의 서버를 띄우겠습니다. NodeJS는 싱글 스레드이기 때문에 하나의 CPU를 여럿이 나눠 갖는 건 비효율적입니다. 따라서 CPU 숫자에 맞춰서 서버를 띄워보겠습니다.제 맥북엔 CPU가 4개뿐입니다.CPU수에 맞춰 추가로 생성하기추가로 컨테이너를 생성하고, 서버를 실행합니다. 서버 목록도 확인해야겠죠.서버 생성서버 실행서버 목록 확인포트번호는 같은 포트를 쓸 수 없기 때문에 3001, 3002, 3003으로 매핑합니다. 브라우저로 접속해서 확인해보겠습니다.각 포트별 접속 화면미리 만들어둔 이미지 덕분에 서버 3대를 띄우는 데에 5분도 안 걸렸습니다. 하지만 Docker 서버를 여러 개 띄워도 결국 사람의 손이 닿아야 합니다. 따라서 이번에는 NodeJS의 Cluster를 활용해 적은 수의 Docker Container를 이용하면서도 다수의 CPU를 사용하겠습니다. 또 죽은 워커를 다시 살려 서버가 다운되는 것을 막아 안정적인 서비스도 구축해보겠습니다.4. 멀티코어대응 NodeJS Cluster 구성2컨테이너용 NodeJS Cluster서버 어플리케이션 작성하기var cluster = require('cluster'); var os = require('os'); var uuid = require('uuid'); const port = 3000; //키생성 - 서버 확인용 var instance_id = uuid.v4();  /**  * 워커 생성  */ var cpuCount = os.cpus().length; //CPU 수 var workerCount = cpuCount/2; //2개의 컨테이너에 돌릴 예정 CPU수 / 2  //마스터일 경우 if (cluster.isMaster) {     console.log('서버 ID : '+instance_id);     console.log('서버 CPU 수 : ' + cpuCount);     console.log('생성할 워커 수 : ' + workerCount);     console.log(workerCount + '개의 워커가 생성됩니다\n');        //CPU 수 만큼 워커 생성     for (var i = 0; i < workerCount>         console.log("워커 생성 [" + (i + 1) + "/" + workerCount + "]");         var worker = cluster.fork();     }        //워커가 online상태가 되었을때     cluster.on('online', function(worker) {         console.log('워커 온라인 - 워커 ID : [' + worker.process.pid + ']');     });        //워커가 죽었을 경우 다시 살림     cluster.on('exit', function(worker) {         console.log('워커 사망 - 사망한 워커 ID : [' + worker.process.pid + ']');         console.log('다른 워커를 생성합니다.');                 var worker = cluster.fork();     });  //워커일 경우 } else if(cluster.isWorker) {     var express = require('express');     var app = express();     var worker_id = cluster.worker.id;         var server = app.listen(port, function () {         console.log("Express 서버가 " + server.address().port + "번 포트에서 Listen중입니다.");     });        app.get('/', function (req, res) {         res.send('안녕하세요 저는 워커 ['+ cluster.worker.id+'] 입니다.');     });  } CPU 숫자를 받아 CPU 수(4)를 컨테이너 수(2) 로 나눠 워커를 생성하는 NodeJS 클러스터 구성입니다. 이렇게만 해도 운영에는 무리가 없지만 컨테이너 2개의 구분이 안 되서 확인할 수가 없습니다.그러므로 마스터와 워커의 통신을 이용해 마스터의 uuid를 얻겠습니다. (워커와 마스터 간의 데이터 이동은 통신 말고는 메모리DB 등의 데이터 저장소밖에 없습니다)마스터의 아이디를 알아오는 로직이 추가된 어플리케이션 작성var cluster = require('cluster'); var os = require('os'); var uuid = require('uuid'); const port = 3000; //키생성 - 서버 확인용 var instance_id = uuid.v4();  /**  * 워커 생성  */ var cpuCount = os.cpus().length; //CPU 수 var workerCount = cpuCount/2; //2개의 컨테이너에 돌릴 예정 CPU수 / 2  //마스터일 경우 if (cluster.isMaster) {     console.log('서버 ID : '+instance_id);     console.log('서버 CPU 수 : ' + cpuCount);     console.log('생성할 워커 수 : ' + workerCount);     console.log(workerCount + '개의 워커가 생성됩니다\n');         //워커 메시지 리스너     var workerMsgListener = function(msg){                    var worker_id = msg.worker_id;             //마스터 아이디 요청             if (msg.cmd === 'MASTER_ID') {                 cluster.workers[worker_id].send({cmd:'MASTER_ID',master_id: instance_id});            }      }        //CPU 수 만큼 워커 생성     for (var i = 0; i < workerCount>         console.log("워커 생성 [" + (i + 1) + "/" + workerCount + "]");         var worker = cluster.fork();                //워커의 요청메시지 리스너         worker.on('message', workerMsgListener);     }        //워커가 online상태가 되었을때     cluster.on('online', function(worker) {         console.log('워커 온라인 - 워커 ID : [' + worker.process.pid + ']');     });        //워커가 죽었을 경우 다시 살림     cluster.on('exit', function(worker) {         console.log('워커 사망 - 사망한 워커 ID : [' + worker.process.pid + ']');         console.log('다른 워커를 생성합니다.');                 var worker = cluster.fork();         //워커의 요청메시지 리스너         worker.on('message', workerMsgListener);     });  //워커일 경우 } else if(cluster.isWorker) {     var express = require('express');     var app = express();     var worker_id = cluster.worker.id;     var master_id;        var server = app.listen(port, function () {        console.log("Express 서버가 " + server.address().port + "번 포트에서 Listen중입니다.");     });        //마스터에게 master_id 요청     process.send({worker_id: worker_id, cmd:'MASTER_ID'});     process.on('message', function (msg){         if (msg.cmd === 'MASTER_ID') {             master_id = msg.master_id;         }     });        app.get('/', function (req, res) {         res.send('안녕하세요 저는 ['+master_id+']서버의 워커 ['+ cluster.worker.id+'] 입니다.');    });  } Docker Container에 올리기 전 로컬 테스트를 먼저 진행합니다. 서버 구동!두 개의 워커가 실행되었습니다.똑같은 localhost:3000번 접속이지만 워커의 번호가 다릅니다.이제 워커로 CPU 수만큼 워커를 생성할 수 있게 되었습니다. 이제 워커가 어떻게 안정적으로 서비스되는지 테스트하겠습니다. 워커 킬링 테스트하기워커 킬러 로직 작성//워커 킬링 테스트     app.get("/workerKiller", function (req, res) {         cluster.worker.kill();         res.send('워커킬러 호출됨');     }); 실험에 앞서 똑같은 상황 재연 마스터 아이디를 유심히 봐주세요. 워커 킬러를 실행하겠습니다.워커 킬러 호출아래는 호출된 결과입니다. 하나의 워커가 죽자마자 곧장 다른 워커가 태어나(?) 3000번을 Listen하기 시작했습니다. 워커 킬러가 호출된 화면이제 워커 킬러를 여러 번 호출해보겠습니다. CMD+R을 꾸욱 눌러 연속으로 킬링해봤는데 아래 화면처럼 바로 살아납니다.접속해서 현재 워커를 확인합니다.위의 화면처럼 마스터의 UUID가 그대로인데 워커만 교체되었습니다. 준비는 끝났습니다. 이제 Docker를 이용해 2명의 워커를 가진 2개의 NodeJS서버를 실행하고, 4개의 귀여운 CPU를 불살라봅시다! 5. Docker로 NodeJS Cluster 서버 실행하기docker build --tag node_server:0.0.3 /Users/kww/eclipse-workspace/nodejs-for-article docker create --name NODE_SERVER_0 -p 3000:3000 node_server:0.0.3 docker create --name NODE_SERVER_1 -p 3001:3000 node_server:0.0.3 docker start NODE_SERVER_0 docker start NODE_SERVER_1 cluster가 적용된 2개의 컨테이너 start0.0.3번 이미지로 생성된 2개의 컨테이너 서버가 무사히 로드되었습니다. 이제 접속해서 확인해볼까요?cluster가 적용된 2컨테이너 4서버 구동화면WOW! 2개의 URL, 2개의 UUID, 각 2명의 워커까지. 완벽한 2.2.2입니다. 마치 홍진호를 보는 듯한 서버 현황입니다. 이제 워커 킬러로 습격해보겠습니다.워커 킬러 습격 후위의 이미지를 보면 3000번 포트서버에서 13명, 3001번 포트서버에서 22명의 워커가 사망했습니다. UUID를 통해 2개의 서버에서 일정량의 워커가 매우 안정적으로 서버를 지키고 있는 걸 알 수 있었습니다.지금까지 2개의 컨테이너로 4개의 서버를 구성해보았습니다. CPU 숫자와 나눠지는 수에 따라 컨테이너의 수, NodeJS 클러스터 서버의 수를 유동적으로 조정할 수 있습니다. 전에 운영하던 API서버는 16코어 서버였고, 로드벨런서 및 기타 작업용 1코어의 여분을 남기고 15코어 / 3 으로 5개의 워커를 가진 3개의 NodeJS서버를 도커 컨테이너로 운영했었습니다.여기서 문제점이 생깁니다. 우리는 어떤 서비스를 할 때 하나의 도메인을 쓰는데 포트번호가 2개죠? 어떻게 해야 할까요. 여기서 바로 한참을 기다렸던 불곰국의 Nginx가 등장합니다.6. Nginx로 로드밸런싱 하기Nginx은 “더 적은 자원으로 더 빠르게”를 지향합니다. 러시아의 이고르 시쇼브(Игорь Сысоев)는 Apache에서 10,000개의 접속을 동시에 다루기 힘든 걸 해결하려고 Nginx를 개발합니다.Nginx는 NodeJS와 유사하게 싱글 스레드 방식에 이벤트 드리븐 구조 사용하는 오픈소스 HTTP서버로 최근 아파치의 점유율을 상당히 뺏고 있는 서버입니다. 다운로드 링크를 아래에 써두었습니다.Nginx 설치WindowNginx 다운로드Macbrew install nginx Linuxapt-get install nginx or yum install nginx Nginx 설치 성공Nginx 기본 접속 화면서버 조작방법서버 시작 : nginx 서버 중지 : nginx -s stop 서버 재시작 : nginx -r reload (맥에선 이건 안되는듯?) 기본 설정은 8080포트로 되어있습니다. 원하는 포트르 로드벨런싱 설정을 해보겠습니다. Nginx 로드밸런싱 설정아래는 Nginx의 로드밸런싱입니다.#http블럭 내부에 추가     #NodeJS 서버 로드밸런싱     upstream nodejs_server {         #least_conn;         #ip_hash;         server localhost:3000 weight=10 max_fails=3 fail_timeout=10s;         server localhost:3001 weight=10 max_fails=3 fail_timeout=10s;     }        #3333번 포트 NodeJS 서버로 연결     server{         listen               3333;         server_name  localhost;                location / {             proxy_pass http://nodejs_server;         }     } 로드밸런싱이 잘 적용되었는지 확인해보겠습니다. 로드밸런싱 적용 이후모든 브라우저에서 3333번으로 접속했는데 서로 다른 2개의 서버가 번갈아 접속되고, 워커가 가끔 바뀌는 걸 확인할 수 있습니다. 이번엔 로드밸런서로 워커 킬러를 호출하겠습니다.로드밸런싱 포트인 3333번 포트로 여러 번 호출결과 확인Nginx 로드밸런서가 확실하게 작동하는 걸 확인할 수 있었습니다. 위의 이미지에서 서버가 자꾸 바뀌는 모습을 볼 수 있는데, 이는 세션이 유지되지 않기 때문입니다. 실제 서비스에서는 세션의 유지를 위해 ip_hash 옵션이 꼭 필요합니다.ip_hash : 동일한 IP의 접속은 같은 서버로 접속하도록 하는 옵션입니다.  least_conn : 가장 접속이 적은 서버로 접속을 유도하는 옵션으로 ip_hash와 같이쓰입니다. Conclusion자, 고생하셨습니다. 여기까지 Docker와 NodeJS, Nginx를 이용해 관리하기 쉽고, 일부러 죽여도 죽지 않는 안정적인 서비스 환경을 구축해봤습니다. 한 가지 주의할 점이 있습니다. NodeJS의 Cluster는 죽은 워커를 바로 살리는데 싱글스레드여서 그런지 그 속도가 정말 어마어마합니다. 따라서 NodeJS Cluster를 사용할 땐 여러 핸들링에 신중하세요. 모든 promise에 반드시 catch를 달아 핸들링하고, 오류가 날 것 같은 로직엔 반드시 try - catch를 달아 핸들링을 해야 합니다. 그렇지 않으면 다시 살아나는 워커에 의해 서버의 자원이 고갈될 수 있습니다.예전에 16코어 서버를 운영할 땐 서버 자원에 비해 사용자가 적어서..(눈물) 5워커 2개의 서버만 구동하고 여유를 두었습니다. 그리고 서버 패치가 있을 때 3번째 서버를 대기시켰습니다. 앱에서 업데이트가 완료되는 시점에 Docker Container를 바꿔치기 하는 방식으로 Non-Stop서비스를 운영했죠. 혹시 코어가 빵빵한 여유 서버가 있는데 재빠르고 좀비 같은 서비스를 구성해야 한다면 위와 같은 환경 구축을 강력히 추천합니다. 지금까지 긴 글을 읽어주셔서 감사합니다.ps. 글 쓰다 보니 해가 떴네요. 하하.참고1) 가상 머신은 작은 이미지라도 기가바이트 단위의 사이즈와 Load되기까지 상당한 시간이 소요된다.2) 그러나 Windows의 경우, Hiper-v위에 리눅스를 띄워 도커를 구동한다. Mac에서도 가상 머신 위에서 구동된다. 따라서 성능적인 강점은 리눅스에만 적용된다.3) 도커에서는 NAME 속성을 지어주지 않으면 알아서 이름을 지어주는데 romantic한 단어가 많다.글강원우 과장 | R&D 개발2팀[email protected]브랜디, 오직 예쁜 옷만#브랜디 #개발팀 #개발자 #개발환경 #업무환경 #인사이트 #경험공유
조회수 1234

스타트업이 가는 길

학창시절부터 여행을 좋아하고,지금도 새로운 곳, 멋진 풍경을 경험하고 싶은 열망이 가득하다.이러한 성향이 스타트업의 길에 들어서는데 큰 영향을 주었겠지?타고난 방향치라서 길잃는데는 선수급이다.휴학을 하고 막무가내로 떠났던 호주!그곳에서 여행 이야기를 풀면 많이들 놀란다.소위  "OO 100배 즐기기"란 책을 접한 친구라면내 호주여행에 대해 고개를 갸우뚱할 것이다.들어보지 못한 여행지와 먹거리, 경험에 대해 호기심을 가진다.글렌애플의 보이즌베리 와인,뉴캐슬의 바다수영장과 벽화들,필립아일랜드 가는 길에 있는성산일출봉같이 생긴 관광지(다들 필립아일랜드는 펭귄만 떠올리지),기억을 더듬을수록 미소가 지어진다."어떻게 알고 거길 간거예요?""글쎄요. 길을 잃어서?"그렇다.여행초기에 난 호주 8대도시를자동차를 타고 돌면서 해안선 따라 일주를 하려했다.가장 보편적이고,가장 단순하고 쉬우며, 넓은 도로인A1 도로를 쭉 타고 달리는 간단한 코스였다.근데...가는 길중간에 좋은 낚시포인트도 있고,야영지에,작아서 운치있는 타운에 들리기도 하고,마을사람들이 가보라는 식당도가고...그러다보니 원래 목적과 행선지와 다르게A2도로타고 내륙도 갔다가,지도에 좁쌀만큼 표시된 지역도 갔다가,축제에 휩쓸려 1주일을 그냥 머물기도하고...결국 처음 어림짐작했던 시간과 예산을 초과했는데여전히 뉴사우스웨일즈와 빅토리아,퀸슬랜드,사우쓰 오스트레일리아 주까지만 돌아 볼 수 있었다.목표한 여정의 딱 반이랄까?물론 새로운 경험과 사람들, 음식, 문화 등을마주하며 매일매일이 즐거웠다.그럼 이쯤에서 다시 복기해보자.어쨌든 실패한 여행이다,계획은 너무 허술했고,예산은 초과 되었으며,시간은 다 소진했다.아무리 즐겁고, 재미있었다지만더 가고 싶어도 그쯤에서 포기하고,베이스캠프로 돌아가야했다.이야깃거리는 남았지만,내가 보고 싶었고, 가고 싶었던 곳들은흙 한번 밟아 보지 못하였다.여행의 목적이 무엇이고, 스타일이 다르기에무조건 실패라고 단정지을 수는 없다.누군가에겐 이런 식의 방식이 더 가치있을 수도 있고,누군가에겐 너무나 비효율적이고, 의미없을 수도 있으니까.여행의 가치는 관점에 따라다르기에절대적으로 좋다,나쁘다를 말할 수는 없지만여행의 과정에 대해서는 명확한 실수들을 지적할 수 있다.내가 실패라고 생각하는 이유는초기 계획에서 세운 목표를 달성하지 못 하였기 때문이다.계획 따로,실행 따로였으니까.그리고 중간에 수정하고, 보완할 타이밍도 많았지만  그러지 못한 사실이 실패로 인정할 근거이다.1) 기간과 예산, 경로, 핵심방문지 등에 대한충분한 고려가 없었기에 편차가 누적되어 리스크가 발생하고,그로 인해 중도에 여행을 보류할 수 밖에 없었던 점.-> 사전/ 시장조사 미흡, 초기사업계획서 미흡2) 길을 잃을 가능성이 높다는걸 알면서도 대비 안한 점.-> 단점 보완 미흡, 리스크를 예상하고도 무대처.3) 길을 잘못 들고 일정에 이상이 생겼음에도'여행은 원래 그런 맛'이라는 안일한 사고로 자기세뇌.-> 징후에 대한 관리능력 부재, 자기만의 세계로 현실도피그 외에도 문제점은 참  많은 여행이었고,이때 느끼고, 반성한 포인트들이 그 이후 여행에 많은 도움을 주었다.지금의 우리회사의 방향에 영향을 끼치고 있다.그래서 후회하냐고  묻는다면,"전혀 후회하지 않습니다. 오히려 고마운 경험입니다."배우고, 깨달은 점이 많았다.그래서 지금의 삶에 큰 도움과 기준이 형성되었으니,비록 여행의 과정상 실패였지만, 돌이켜보면들어간 인풋 대비 얻은 아웃풋이 더 큰 남는 장사였다.이것은 피보팅(수정)이라고 볼 수 있다.비록 초기 생각했던 계획과는 많이 달라졌지만,그 과정에서 다른 가치를 발견한다.다른 인사이트를 얻게 된다.실패한 여행을 통해형성된 내 여행의 가치관은"즐거움과 배움, 만남"이다보니과정의 실패 반, 가치의 성공 반이랄까?창업초기에는이러한 실수나 실패를 통해 얻는 것이 많아야 한다.스타트업에게성공이든 실패든...그 후에 얻는게 없으면 독이다.우리는 알게 모르게 매일 실패에 익숙하다.내일은 더 실패를 줄이기 위한 몸부림이오늘의 실패에서 찾은 대안에서  만들어진다.그냥 지나쳐버리면 내일은 또 같은 실패를 만날 것이다.성장이란걸 달성해야할 지표로 오해하는데...그 지표들은 성장을 확인하기 위한 근거,정량적인 수치라는 도구이자 방법론일뿐이다.성장의 본질은 "이전과 지금 그리고 앞으로의 다른 점"이다자! 바로 앞에서는 여행을 스타트업과 비교하였다.여행이 외로울 수도 있고,멋진 풍경을 기대하고,때론 안 좋은 날씨도 만나고,목마름과 배고픔도 있고,시간, 비용이 한정 된 점도 유사하다.그리고 다수의 창업자와 여행자들이 좋아하는 말!"재미있잖아요"그런데 현실적으로여행과 스타트업 사이에는 큰 괴리감이 있다.즐거움/재미라는 요인은스타트업이나 여행에서 가질 수 있는 공통분모이다.그러나 여행과 달리 스타트업이가지는 또 하나의 조건이 있다.바로 "절실함"그렇기에 나는창업자와 탐험가의 비유에 더 공감을 한다.내가 콜럼버스라고 상상하자.난 미지의 땅과 황금, 진귀한 향신료를 믿는다.그리고 그곳을 찾을 생각에 가슴이 뛰고, 잠을 못 이룬다.누가 나보다 먼저 그 땅을 밟을까봐 걱정도 되고,그런 소식이 들려올까봐노심초사 매일 바다 건너 소식을 체크한다.단순한 여행이 아니라여왕에게 받은 투자금과 배와 사람들이 있고,꼭 그 이상의 가치를 증명해야 한다.해도를 보고, 길을 확인하길 수백번,지구가 둥글다는 소수의 의견을 기준으로계획을 짰지만, 아닐때의 플랜B도 있어야한다.목적이 확실하다.반드시 이행되어야 할 명확한 미션이 주어져 있다.단지 재미있었다,놀라운 경험이었다로 끝날 일이 아니다.예상치 못 한 리스크도 걱정한다.선상 반란이 일어날 수도 있다.해적을 만날 수도 있고경쟁자인 스페인 군함을 만날 수도 있다.여행이라기보다는부담이 큰 탐험이다.목숨이 걸린 비지니스다.솔직히 나도 큰 파도가 몰려오고,태풍이 몰아치는 것에 겁이 날 수 밖에 없다.중간중간 거쳐가는 육지에서보급품을 얻지 못 할 수도 있다.동료들이 굶어서선상 반란을 일으킬 수도 있고,막상 도착예정이었던 스케쥴보다더 늦어지면서 식량과 물을 살 자금이일찍 동날 수도 있다.도착한 곳에 향신료가 없으면 어쩌지?분명히 있다고 들었는데....황금이 많다고 믿었는데....배 안에서 자기의심이 들기 시작한다.우리가 걷고 있는 길이이렇지 아니한가!마냥 웃으면서 사업을 할 수는 없다.즐거움만으로 버틸 수 없다.절실함이 있어야 한다.그것이 선장의 진심을 보일 수 있다.보다 더 위험에 예민해 질 수 있다.보다 더 나은 대안을 얻을 수 있다.보다 더 빠른 경로를 찾으려 애쓰게 된다.한 동안...글을 쓸 생각조차 못 했다.그리고 사실 지금도 너무 많은 업무에이렇게 글을 남기는게 사치로 느껴진다.너무 팽팽하게 당겨진 고무줄은끊어진다고, 그러다가 번아웃된다고....그래서 잠시나마 생각을 비우고글을 남겨본다.이래야 미래의 내가 이 글을 보고과거의 나에게 "우쭈쭈~ 그때 그랬쪄?"하고대견 해 하겠지?#클린그린 #스타트업 #스타트업창업 #창업가 #창업자 #고민 #성장
조회수 564

트리거 : 행동의 방아쇠를 당기는 힘

출처 : 네이버 책사고 방식을 바꾼 계기가 된 몇 권의 중요한 책들이 있다. 마셜 골드스미스(Marshall Goldsmith)의 트리거(Triggers)가 그 중의 하나다. 이 책은 ‘스스로를 변화시키는 방법'에 대해 다루고 있다. 우리가 왜 스스로를 바꾸는데 서툰 것인지, 어떻게 하면 더 잘 할 수 있을지. 우연히 서점에서 트리거를 처음 발견했을 때는 ‘여느 자기 계발 서적들과 비슷하게 원론적이고 추상적인 이야기 뿐이지 않을까’ 의심했었다. 하지만 이 책을 다 읽은 후 이제는 이 책의 내용이 습관적 자기회고(self-reflection)의 잣대가 되어 주고 있다. 스스로에 대해 실질적으로 변화를 만들어 내기는 무엇보다 어려운 일이다. 마음을 굳게 먹어도 얼마 지나지 않아 포기해 버리기 일쑤다. 변화를 만들기 힘들어지면 그것의 필요성마저 부정하게 된다. 심지어 이런 과정이 반복되면 변화하지 못하는 나 자신을 합리화하는 데 익숙해지기도 한다. 우리는 때로 타인에게 변화를 요구하고 기대하기도 한다. 하지만 스스로도 변화하지 못하면서 어떻게 타인에게 긍정적인 변화를 기대할 수 있겠는가. 흔히 자신에게 냉정하고 상대에게는 관대하라고 하지만, 오히려 자신에게는 관대하면서 상대에게는 냉정한 기준을 강요하는 것이나 마찬가지일 것이다. 규칙적인 생활하기렌딧을 창업한 이후 규칙적인 생활의 필요성이 커졌다. 함께 일하는 동료들도 늘어나고 일의 복잡도 역시 계속 높아져 왔기 때문이다. 절대적인 업무량이 비슷하거나 오히려 더 많아진 상황에서 복잡도는 이전보다 훨씬 더 높아졌기 때문에 롱런(long-run)하기 위해 수립한 나름의 목표다. 트리거를 접하기 전에도 나는 가끔씩 스스로를 되돌아 보며 ‘규칙적인 생활하기'라는 목표를 잘 지켜내고 있는지 평가하는 시간을 가졌다. 이것이 변화를 만들어 내기 위한 나 스스로의 방식이었다. 하지만 이 방식에는 결정적인 문제가 있었다. 목표 달성에 지장을 주는 그럴싸한 이유들이 자주 생겨났다는 점이다. 이를테면 중요한 미팅이 갑자기 생겨나는 일들이 자주 발생하게 된 것이다. 목표 달성에 실패하게 되었지만, 나는 중요한 미팅 같은 외부 요인 때문에 그렇게 되었다고 해석하게 된다. 이렇게 되면 자기회고가 사실상 의미없는 결과를 가져 오게 되고, 결과적으로는 변화의 정도 역시 미미하게 되어 버린다. 규칙적인 생활을 하기 위해 최선을 다했는가?트리거를 읽으며 깨우친 가장 중요한 한가지는 ‘능동적인 질문의 중요성' 이다. 단지 ‘규칙적인 생활을 했는가?’ 라고 묻는 것은 수동적인 질문이다. 규칙적인 생활을 하지 못한 여러가지 그럴싸한 이유를 얼마든지 생각해 낼 수 있기 때문이다. 이에 대한 능동적인 질문은 ‘규칙적인 생활을 하기 위해 최선을 다했는가?’ 이다. 이렇게 ‘최선을 다했는가?’ 라는 말을 추가하는 것으로 스스로의 노력을 회고할 수 있는 잣대로 삼을 수 있게 되었고, 비로소 스스로에게 정말 냉정해질 수 있게 되었다.
조회수 2183

JIRA하고 자빠졌네!?

Overview“JIRA하고, 자빠졌네!” 세종대왕은 확실히 개발자의 두뇌를 가지고 있었던 게 분명합니다. 먼 시대를 지나 오늘날 QA를 하는 저에게 응원을 해주시니 말입니다. 하지만 그는 틀렸습니다. 걱정과는 다르게 다행히 자빠지진 않았거든요. 지라(JIRA) 덕분입니다.갑자기 지라 이야기가 나와 당황하셨죠? 축하해주세요. 드디어 브랜디도 지라를 사용하게 되었답니다. (짝짝짝!) 지라 도입은 처음이라 세팅부터 쉽지 않았는데요. 이번 글은 눈물겨웠던 지라 세팅 과정과 브랜디의 이슈관리를 소개하겠습니다. 스크럼을 쓰면 좋은 점스크럼(Scrum)은 요구 사항 분석부터 하는 칸반(Kanban)보다 효율적입니다. 안드로이드와 iOS로도 나눠져 있고 업무를 짧게 반복하기 때문이죠. 스크럼에 적합한 워크플로우(Workflow)를 볼까요? 이것은 실제로 브랜디 R&D본부에서 사용하고 있기도 합니다. 스크럼에 적합한 워크플로우IN PROGRESS: 이슈나 개발 요건을 티켓으로 만들면 IN PROGRESS 상태가 됩니다. RESOLVED: 이슈나 개발 요건이 완료되면 RESOLVED 상태로 변경합니다.QA: QA가 필요한 개발 요건은 QA상태로 변경합니다.PASS: 이슈 또는 개발 요건이 수정되었거나 문제가 없다면 PASS 상태로 변경합니다.FAIL: 이슈 또는 개발 요건이 제대로 수정되지 않았거나 다른 이슈가 발생하면 FAIL 상태로 변경합니다.QA불필요: QA가 필요하지 않은 개발 요건은 QA불필요 상태로 변경합니다.DONE: 이슈를 해결했거나 개발을 완료하면 DONE 상태로 변경합니다CLOSE: 담당 팀장님이 이슈 확인 후 CLOSE 처리합니다. 예를 들어보겠습니다. 킥오프 서비스 회의를 하고, SB를 제작, 리뷰합니다. 이후에 디자인팀과 개발팀 일정을 공유하고 스크럼 마스터는 스프린트 주기를 책정하죠. 스프린트가 시작되면 개발자는 스토리 티켓을 작성하는데요. 개발이 끝나면 QA가 필요한 티켓은 테스트를 진행하고, QA가 종료되면 스프린트도 종료됩니다.Epic 티켓위의 이미지는 Epic 티켓입니다. Android, iOS, 이슈 등 모든 티켓은 Epic 안에서 관리합니다. 한 곳에서 한꺼번에 관리하기 때문에 히스토리 관리가 편하고, 진행 상황도 확인할 수 있습니다.티켓 생성개발팀의 티켓 생성입니다. 개발자는 SB를 보고 개발 티켓을 작성합니다. 개발 티켓 작성 후에 개발이 진행되며 QA 판단 여부를 체크해 QA 상태로 변경합니다. 변경된 티켓에 관한 QA가 진행되며 문제가 없으면 해당 티켓은 종료됩니다.이슈 생성다음은 이슈 생성입니다. 파악한 SB는 디자인 시안과 비교하며 개발이 된 Android, iOS 테스트 파일을 QA합니다. QA를 진행할 때 발생한 이슈는 지라 티켓으로 등록하여 이슈를 관리합니다. 모든 이슈 티켓 종료되면 해당 차수의 QA는 끝나고 마침내 상용에 배포합니다. 배포가 완료되면 필수 및 크리티컬 리그레이션 테스트가 진행됩니다. Conclusion실수는 항상 모든 것이 끝난 이후에 보이기 마련입니다. 수십 번 QA를 해도 보이지 않던 문제들이 상용에 올라간 이후부터 보이기 시작하죠. 스크럼은 이런 실수들을 가장 최소화할 수 있는 툴이 아닐까 생각합니다. 물론 아무리 좋은 툴을 써도 팀원들과 함께 뭉치는 것보다 중요한 것은 없겠죠. 다음 글은 자동화를 주제로 찾아뵙겠습니다. JIRA하고 자빠지지 않는 개발자가 됩시다!글김치영 대리 | R&D PM팀[email protected]브랜디, 오직 예쁜 옷만#브랜디 #개발자 #개발팀 #인사이트 #경험공유 #JIRA
조회수 1134

카카오 뱅크, 미완성.

일단, 가장 큰 문제는 '성능장애'문제이다. 아직도, 가입에 불편을 겪는 사용자들이 존재하고, 대출 서비스를 이용하려는 사람들은 거의 신청을 제대로 했다는 사람을 보기가 어렵다. 이 문제는 예측하건대, 기존의 뱅킹 시스템을 그대로 옮겨왔다는 이야기가 거의 기정사실로 보인다고 이야기할 수 있다.기존의 뱅킹 시스템들의 특징은 매우 당연하게도 대출신청과 같은 시스템들이 일반 고객들에게까지 오픈된 환경을 고려하여 디자인되어 있지 않았을 것이라고 추측할 수 있다.현재는 그나마 오류를 발생시키고, 사용자가 많다는 메시지를 지속적으로 보여주고 있기 때문에, 기존 다른 신용조회 서비스의 용량이나 내부 프로세스의 성능 부분들에 대해서 추가적인 개발이 거의 되지 않았다고 보이는 것은 이런 오류들의 상황 때문이다. 몇 가지 사례를 정리해보자.1. 가입 신청 시에 '오류'를 일으킨다. 문제는 대량의 요청이 들어왔을 때이다.2. 가입이 되는 절차상에서도 휴대폰 인증과 관련된 대량의 요청에도 '오류'를 일으킨다.3. 가입 이후에도 '대출신청'이나 '대출조회'와 같은 대량의 요청에도 '오류'를 일으킨다.대부분 '대량 요청'에 대해서는 처리를 못하고 있다는 것을 보면, 카카오 뱅크의 시스템은 모바일 앱은 카카오의 신규 개발자들이 만들었지만, 내부 백엔드 서비스는 기존의 은행 솔루션이나 은행의 기존 서비스 형태의 모습 그대로인 것으로 보인다.사실, 이러한 '오류'와 '장애'에 대해서 '앱'을 통한 서비스를 하게 되면 다음과 같은 방법으로도 충분하게 개선시킬 수 있었을 것이다.1. 사용자의 요청이 카카오 뱅크에게 들어온다.2. 대량의 사용자의 요청이 들어왔을 경우에는 '신청'만 받고, 처리가 되는 순서대로 '서버에 등록'한다.3. '서버에 등록된 순서'대로 처리를 한 다음, 처리된 내용을 '앱'으로 Push 서비스한다.4. 사용자는 앱에 Push 된 절차에 따라서, 다음 절차로 진행한다.모바일을 중심으로 디자인되었다면, Pull/Push방식이 적절하게 사용되면서, 아무리 폭주가 된다고 하더라도, 느리지만, 서비스의 동작은 가능하도록 설계되거나 디자인되고, 개발되었을 것이다.하지만, 이런 방식으로 카카오 뱅크의 앱은 동작하지 않고 있다.그래서, 아직 카카오 뱅크의 서비스는 완성된 것이 아니라고 이야기할 수 있다.이 부분이 기존 은행 앱들이거나 다른 은행들이 시도할 수 있는 좋은 방식이며, 너무도 당연한 방식이다.다만, '모바일'을 모르는 경영진들의 생각 때문에 그런 UX가 가동되고 있지 못하는 것 같다.물론, 보안 문제나 순서가 틀어졌을 때의 상황에 대한 걱정을 한다는 것 자체가 보안과 모바일에 무지한 생각이라는 것을 간단하게 적어두자.분명한 것은 아직 카카오 뱅크는 미완성이라는 것이다.다른 모바일 앱과 은행 앱들은 공인인증서를 빨리 사라지게 하고, UX를 개선하는 것으로 충분하게 카카오 뱅크에 대응이 가능하다. ( 물론, 안 하거나 늦겠지만... )아예, 카카오 뱅크의 서류제출 기능도 공인인증서나 PC가 아니어도 가능하게 하면 어떨까?파격적인 은행 앱을 기대해본다.뭐, 어렵겠지만...

기업문화 엿볼 때, 더팀스

로그인

/