<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Jade Yeom on Medium]]></title>
        <description><![CDATA[Stories by Jade Yeom on Medium]]></description>
        <link>https://medium.com/@endlessdev?source=rss-79408899f0c------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/2*SXwr2LgV3mdsZ4aUKvBQuw.jpeg</url>
            <title>Stories by Jade Yeom on Medium</title>
            <link>https://medium.com/@endlessdev?source=rss-79408899f0c------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Wed, 11 Nov 2026 05:55:43 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@endlessdev/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[더 성장할 2020년을 맞이하며.]]></title>
            <link>https://medium.com/@endlessdev/%EB%8D%94-%EC%84%B1%EC%9E%A5%ED%95%A0-2020%EB%85%84%EC%9D%84-%EB%A7%9E%EC%9D%B4%ED%95%98%EB%A9%B0-26be8557f51e?source=rss-79408899f0c------2</link>
            <guid isPermaLink="false">https://medium.com/p/26be8557f51e</guid>
            <category><![CDATA[2019]]></category>
            <category><![CDATA[2020]]></category>
            <category><![CDATA[purpose]]></category>
            <category><![CDATA[diary]]></category>
            <dc:creator><![CDATA[Jade Yeom]]></dc:creator>
            <pubDate>Sat, 11 Jan 2020 22:15:31 GMT</pubDate>
            <atom:updated>2020-01-12T00:18:48.058Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*2kQ-lOPHbv2-W5Od-f6nVw.png" /></figure><p>2019년을 보내고, 2020년을 맞이하며 늦게나마 2019년도의 회고를 올린다. 본인이 많은 성장을 이뤘다고 생각된 부분을 중점으로 다룬다.</p><h4><strong>👨🏻‍💻 블랭크코퍼레이션 이직</strong></h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*aPIOWs9d5yBATstHBmJlSg.png" /><figcaption>ITDA 서비스 소개</figcaption></figure><p>블랭크코퍼레이션(이하 “블랭크&quot;)은 사실 내가 재직하고 있었던 회사의 모회사였다. 2018년 4월부터 블랭크의 프리랜서 개발자로 일 하다가, 자회사 입사 제의를 받았다. 그 회사에서 나는 “ITDA” 라는 패션 버티컬 커머스 플랫폼을 개발했는데, 해당 플랫폼이 회사의 경영실적에 좋지 않아, 빠르게 포기하고 다른 플랫폼 개발에 박차를 가하고 있었다.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*VDPWPCJsHGH6mL_CiPCr_g.png" /><figcaption>처음 팀이 꾸려질 당시의 인스타그램 포스팅 캡쳐 (왼쪽부터 환, 승우, 재희)</figcaption></figure><p>그러다가 모회사 미디어사업 유닛에서 내가 개발했던 커머스 플랫폼을 좋게 봐주었는지, 인플루언서를 활용해보자고 제안이 왔었다. 그래서 인플루언서 사업을 공략하고 있는 미디어 사업 유닛의 재희님이 Operation을, 마케팅 유닛의 환님이 Product Owner를, 자회사의 나는 Full-stacked Engineer로 나를 포함해서 총 3명으로 급하게 “레이블스토어”라는 제품의 TF팀을 꾸렸다.</p><h4><strong>📈</strong><a href="https://www.labelsto.re"><strong> 레이블스토어</strong></a><strong> 서비스 런칭</strong></h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*OImgbumohtXDbjHMyBKTLw.png" /><figcaption>레이블스토어 랜딩페이지 캡쳐 화면</figcaption></figure><p>레이블스토어는 인플루언서들에게 최대한 쉬운 커머스 서비스를 제공해준다. 기존 인플루언서들은 자신의 소셜 채널에 상품을 판매하려면, 해당 브랜드 측의 수수료 협의, 진행 날짜, 판매 형태, 결제 방식, CS 고객응대 등 정말 많은 부분들을 신경써야 한다.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*8y5rh0US9rWMYJPBSoHUbA.png" /></figure><p>레이블스토어에서는 이러한 고충들을 한 번에 해결해준다. 인플루언서 본인이 직접 원하는 상품과 진행 기간, 수수료 협의를 제안할 수 있고, 브랜드가 해당 제안에 협의과정을 거치면 자동으로 스토어 페이지를 만들어주며, 정산과 스토어 페이지 개인화 등 많은 부분들의 고충을 해결해준다. 런칭부터 반응은 뜨거웠고, 현재는 거래액 30억, 사용자 40만명을 가진 어엿한 중견규모의 플랫폼이 되었다.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*9FvaJXhNEunXR7MPCxfupg.png" /></figure><p>한 달 동안의 한 명의 개발 리소스로 짧은 개발기간을 걸쳐 시장에 빠르게 내어 검증해 볼 수 있었다. Front-end 부문에서는 Vue.js와 Nuxt.js를 사용하여 개발을 시작했으나, 컴포넌트 중심 개발방법과 서버사이드 랜더링의 고도화, 그리고 해당 기술들의 생태계 현황 등으로 인해 React.js와 Next.js로 사용 기술을 변경했다. Back-end 부문에서는 Sequelize와 Koa.js를 통해 REST 방식의 API 서버를 구성했으나, 얼리스테이지의 제품답게 빠른 도메인 변경에 대응하기 위해 Prisma를 통한 GraphQL을 도입하기 시작했다.</p><h4>📦 E-Commerce SCM 개발</h4><p>이 부분이 다른 분야의 도메인보다 크게 다르고 복잡하다는 생각이 들었다. SCM은 Supply Chain Management를 뜻하며, 전자상거래 분야에선 빠질 수 없는 개념이다.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*KeTeGH6d8jb-Zsr3njX1NA.png" /><figcaption>SCM 개발 작업 중 사용자 여정(User Journey) 정리</figcaption></figure><p>우리가 상품을 구매하는 행위에 대해 생각해 본다면 생각보다 많은 일련의 과정이 있다는 것을 알 수 있다. 상세페이지에서 상품이 마음에 들어 장바구니에 담아, 주문서 작성부터 시작해서 완료, 내역 조회, 배송조회. 거기다가 오주문이나 단순변심으로 취소나 반품이 이뤄질 수 있고, 교환도 마찬가지다. 여기에는 또 반송장이나 맞교환 송장이 붙고, 배송지 주소도 배송 준비중 전에 변경할 수 있어야 한다. 또 그런 과정에서 귀책사유가 구매자인지, 판매자인지에 따라 환불 되는 금액을 다르게 산정해야 하는 등 여러가지 예외의 상황들을 수반해야 한다.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*LrSmEz9r1f4zp6sdhO74aw.png" /><figcaption>레이블스토어 SCM 관리자 페이지 (테스트 서버)</figcaption></figure><p>기존에 레이블스토어는 공동구매 특성상 예외적인 상황들이 너무 많아 이를 CS 인바운드(전화나 카카오 플러스 친구 등의 창구로 인입된 요청들)로 받아서 상담원 한 명이 직접 수기로 처리했다면, 이번 SCM 도입으로 수기처리 되는 부분들을 점진적으로 줄여나가고, 모든 클레임들을 입점 업체가 직접 확인하고, 해결하는 방식으로 개선되었다.</p><h4>🛍 그리고, 결국, “자체 커머스 플랫폼”!</h4><p>SCM 개발을 끝으로, 우리 팀은 어떻게 보면 쿠팡이나 티몬, 그 외 쇼핑몰 호스팅 서비스 Cafe 24나 고도몰 같은 전자상거래 플랫폼의 대부분 기능들을 (물류, CS, 배송, 샵, 개인화 등)자체적으로 개발 한 것이다. 🎉 이는 즉 블랭크의 자체 커머스 플랫폼을 만든것이다. 어떠한 전자상거래 플랫폼이건, 우리만의 자체 개발 플랫폼을 기반으로 개발하여 더욱 빠르고 안정적으로 개발할 수 있고, 새로운 사업 확장에도 큰 도움이 될 것이며, 이 플랫폼 자체가 블랭크의 엄청난 자산이 될 것이다. <strong><em>어쩌면 블랭크가 쿠팡같은 큰 소셜커머스 플랫폼을 만들게 될 수도 있을지도! 👀</em></strong></p><h4><strong>💁🏻‍♂️ Software Architect 로써의 성장</strong></h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*wBTk2jWMZN8__gRv" /><figcaption>스탠드업 미팅을 진행하고 있는 레이블스토어 구성원들</figcaption></figure><p>3명으로 시작한 팀이 지금은 11명이 됐다. 1년만에 사람도 정말 많아졌는데 그 만큼 신경써야 할 일도 많아졌다. 우리는 1주일 간격으로 스프린트를 돌리며, 하루에 한 번씩 스탠드업 미팅을 진행하고 빠르게 이슈나 태스크 진행 경과를 확인한다. 스프린트가 끝나면, 다 함께 자체 QA를 하고, 이번주 했던 태스크에 대한 회고와 코드리뷰를 진행하며, 릴리즈 날짜를 정해 운용 서버에 배포한다.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*asM-AUtFmx2mE_SPEja_Ug.png" /></figure><p>개발자 분들도 점차 늘어나고 조직이 커지다가 자연스럽게 Tech Lead 같은 역할을 하게되었다. 단순히 Front-end, Back-end 엔지니어링에 국한되는게 아니라 HCL과 Kubernetes를 활용한 인프라 운용이라던지, 실제 발생할 수 있는 취약점에 대한 웹 보안, CI/CD 자동화, Amplitude를 통한 데이터 트래킹 같은 Dev-Ops 분야, 개발 문화등 여러가지 측면에서 비즈니스 사고 중심적으로 어떤 기술을 도입할지 고민하고, 태스크를 정하고, 매주 스프린트를 진행한다. 또 제일 중요한 것. 나 뿐만 아니라, 조직 구성원들 모두의 성장을 도모한다.</p><blockquote>비즈니스를 소프트웨어로 명확히 증명해내는 Architect가 되고싶다 😊 지금은 작고 귀엽지만, 레이블에서의 활약하고 있는 지금의 내가 첫 발걸음이 되었길.</blockquote><h4><strong>🚀 </strong><a href="https://www.zeze.at"><strong>제제스토어</strong></a><strong> 런칭</strong></h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ZlwFlKtjaWbOCZ19SGU4Lg.png" /><figcaption>제제스토어 스크린샷</figcaption></figure><p>레이블스토어는 브랜드와, 유명한 소셜 채널의 영향력이 있는 인플루언서를 대상으로 서비스 한다면, 제제스토어는 일반 사용자들에게 공동구매라는 개념을 가지고 다가간다. 나 포함해서 지인들 모아 총 3명이 모이면 할인 가격으로 살 수 있는 플랫폼이다.</p><p>아까 위에서 말했다시피 우리만의 자체 커머스 플랫폼이 있었기에 빠르게 다른 사업 방향으로 시도할 수 있었다. 이 플랫폼 역시 한 달 정도 개발기간의 엄청난 속도로 만들어졌고, 가설검증 기간동안에는 리스크를 줄이기 위해 나만 개발 포지션으로 참여해 개발했다. 이제 한 달도 안된 서비스라 설래고 훨씬 더 큰 시장을 확보할 수 있어 기대가 크다.</p><h4>🏃🏻‍♂️ 회사 10분거리, 강남으로 이사!</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*J4RMqqnCvnfAjVQWfA-cXw.png" /><figcaption><a href="https://www.youtube.com/watch?v=uYNu1wFpWFk">대광님 인터뷰</a> 중 보증금 관련 설명 영상</figcaption></figure><p>돈이 없던 나에게 은혜로운 블랭크의 복지가 정말 많았는데, 그 중 정말 소중하게 이용하고 있는 제도가 “전세자금 복지제도”다. 그거슨,, 바로,,, <strong>최대 1억원 한도에 무이자로 전세자금을 지원해주는 제도이다. 🤩</strong></p><p>원래 신림에서 살았는데, 그 신림도 역세권 신림이 아니라, 대학동 녹두거리라고, 버스타고 쭉 들어가야 하는 신림이다. 출퇴근길에 버스가 막혀 한 시간동안 계속 도로 위에서 기다린적이 허다하다. 그래서 출퇴근 하는 데 크게는 왕복 3시간이 걸리는데 이게 어지간히 시간 낭비가 아닐 수 없겠다. 그래서 전세자금 대출 복지를 통해 회사에서 무려 10분거리 밖에 떨어져있는 집으로 이사를 왔다.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*GQNXfuraR7XP5_S8wCtsdA.jpeg" /><figcaption>이사한 우리집 침실 일부</figcaption></figure><p>사실 이사한게 별것 아닌 것 같지만, 대광님과 같이 부동산에서 “시간을 돈으로 샀다. 하루에 3시간, 한 달에 60시간, 일 년에 720시간을 벌었다.” 라는 얘기가 장난식으로 오갔다. 그런데 진짜 장난이 아니라 내 삶에 3시간이 더 생긴 것 만으로도 삶의 질이 배로 좋아졌다. 내가 벌은 3시간 덕분에 운동도 하고 취미도 찾고 삶의 여유도 챙기며 일에 더 집중할 수 있게 되었다. 행복을 돈으로 살 순 없지만 행복할 시간을 돈으로 살 순 있더라.</p><h4>💪🏻 어떻게 더 빨리 성장할 수 있을까?</h4><p>첫 직장에 취직한 이후 프로그래머로 월급쟁이가 된지 4년이 지난걸 은행 업무 처리 중 급여 통장 개설일을 보고 우연히 알았다. 그 동안 참 많은 일들이 있었고, 많은 전환점 들이 주마등처럼 스쳐 지나갔는데, 그 중에서도 제일 뜻 깊게 느낀 점들을 추려보자면.</p><ul><li>더 큰것들을 생각하기 위해 위임할 수 있는 것들은 다른 사람에게 최대한 위임하자. [1]</li><li>소프트웨어 개발은 비즈니스라는 목적을 이루기 위한 수단이다. 코드 한 줄 안짜고 해결할 수 있으면 그 방법이 제일이다.</li><li>항상 내가 생각하는 것이나 추구하는 것이 틀렸을 수도 있다. 그 사실을 인정하고 받아들이며, 변화와 성장의 기회로 생각한다.</li></ul><p>큰 것 들은 이 정도. 사실 이것보다 훨씬 많지만 나머지는 비밀. 😇</p><h4>👏🏻 마치며</h4><p>뭔가 글을 다 쓰다보니 블랭크로 시작해서 블랭크로 끝났는데, 그 정도로 블랭크가 나의 성장에 정말 많은 영향을 주었다. 함께 고생한 우리 레이블 식구들, 같이 응원해주고 도와주신 블랭커 여러분들, 대광님까지 이 자리를 빌어서 감사했다는 말씀 올리고 글 마친다. 읽어주셔서 감사해요.</p><blockquote>아 참, 2020년도 올해의 내 목표는 작년, 재작년과 똑같다. “<strong>어떻게 더 빨리 성장할 수 있을까?” 성장. 또 성장이다.🚀🔥</strong></blockquote><p><strong>References</strong></p><ul><li>[1] <strong>머니맨 에세이</strong> <a href="http://moneyman.kr/archives/9672">“가장 확실하게 부자가 되는 방법”</a></li></ul><blockquote>특히 나는 실무 하는 걸 좋아하고 잘하는 편이라 남에게 일 시키는 게 더 힘들었다. <strong>일이 서툰 동료들 보면 답답해서 직접 해결하고 싶은 적이 한두 번이 아니다. 그래도 꾹 참고 맡겼다. 동료들이 나보다 잘하지 못하면 나는 평생 그 일에서 해방될 수 없으니까.</strong> 이젠 분야별로 선수들이 있어서 내가 신경 쓸 필요 없다.</blockquote><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=26be8557f51e" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Prisma로 GraphQL을 쉽게 도입하기]]></title>
            <link>https://medium.com/labelstore/prisma%EB%A1%9C-graphql%EC%9D%84-%EC%89%BD%EA%B2%8C-%EB%8F%84%EC%9E%85%ED%95%98%EA%B8%B0-fa64dcf63382?source=rss-79408899f0c------2</link>
            <guid isPermaLink="false">https://medium.com/p/fa64dcf63382</guid>
            <category><![CDATA[graphql]]></category>
            <category><![CDATA[prisma]]></category>
            <dc:creator><![CDATA[Jade Yeom]]></dc:creator>
            <pubDate>Tue, 09 Jul 2019 04:25:59 GMT</pubDate>
            <atom:updated>2019-07-09T04:25:59.436Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*fPkZPoXWhKd_ILtbVVR9pw.png" /></figure><p>안녕하세요. <a href="http://blankcorp.kr">블랭크코퍼레이션</a>에서 인플루언서 공동구매 플랫폼 <a href="https://labelsto.re">레이블스토어</a>의 개발팀을 이끌고있는 염승우 입니다! 🚀</p><p>급속도로 성장중인 레이블스토어의 새로운 버전을 개발하면서 <a href="https://www.prisma.io/">Prisma</a>로 GraphQL을 도입 할 수 있었던 경험을 공유해보려고 합니다.</p><h4>우리는 왜 Prisma를 선택했는가?</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*xOlvHbx2va7-sjhdwRNhUA.png" /><figcaption><a href="https://prisma.io">Prisma 랜딩페이지</a>의 메인 화면</figcaption></figure><p>Prisma를 도입하기 전, 레이블스토어 개발팀은 <a href="http://docs.sequelizejs.com/">Sequelize ORM</a>을 사용했었습니다. Sequelize는 Node.js 개발 진영에서는 다른 ORM 보다 뛰어난 성능, 간편한 마이그레이션 및 모델 작성 등으로 독보적으로 유명합니다.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*aGTbz_5eBDI2_lz8aD3pRA.png" /><figcaption>변경점마다 관리해야하는 Sequelize의 마이그레이션과 모델들</figcaption></figure><p>하지만 변경점이 생길 때 마다 모델과 마이그레이션을 따로 관리해야 한다는 점이 매우 불편했습니다. 얼리스테이지 제품 개발의 특성상 테이블과 컬럼 그리고 그것들의 관계(Relationship)에 대한 추가와 수정이 잦았는데, 이에 대응하는것이 많이 불편했죠.</p><p>또한 단순히 모델과 마이그레이션을 관리하는 것이 아니라, RESTful API 에서의 추가적인 대응 작업마저 번거롭기 일쑤였습니다. API가 추가될 때는 Endpoint를 계속해서 만들어 주어야 하고, 그것들을 별개로 관리하기란 참으로 불편했죠.</p><p>저희 개발팀은 이런 불편에 대안을 찾던 중 Prisma를 찾게되었습니다. Prisma는 앞서 말했던 불편한 점을 개선했음은 물론, 아래와 같은 강력한 기능을 제공하고 있었어요.</p><ol><li>GraphQL 형식의 데이터모델만 작성하면 <strong>사용하는 언어와 DBMS에 구애받지 않고, ORM 클라이언트와 모델, 그리고 Data Schema 가 자동으로 생성된다.</strong></li><li><strong>GraphQL, REST API의 구현체를 제공</strong>해준다.</li><li><strong>자체 어드민 페이지를 제공</strong>하여 쉬운 데이터 운용이 가능하다. (비개발자도 손쉽게 쓸 수 있을 정도.)</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*txZ2irkp1vNB43y6ANMFCw.png" /></figure><p>이런 장점들 외에도 ZEIT, GraphQL, Heroku, Netlify 등과 같은 유명한 회사나 기술창립자 분들, 그리고 스탠포드 대학교, 클라이너 퍼킨스 와 같은 대규모 단체의 투자도 함께 받았다는 점이 저희에게 신뢰감을 주었습니다.</p><h4>Prisma는 어떻게 동작하는가?</h4><p>Prisma는 기존 ORM의 동작방식과는 조금 다릅니다. Sequelize나 TypeORM과 같은 기존 ORM은 DB 호스트에 직접적인 Connection을 이루어 트랜잭션을 수행하는데요. Prisma 같은 경우는 Scala로 작성된 <a href="https://github.com/prisma/prisma">Prisma의 서버</a>가 DB 호스트를 앞단에서 관리합니다.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/1*p17uapNIac8Grmm8r7wp6Q.png" /></figure><p>이 후 GraphQL 형식의 DataModel을 정의하면 Prisma가 알아서 <strong>사용하고있는 DBMS와 언어의 종류에 맞게 실제 DB 배포부터, 클라이언트와 모델 그리고 타입정의까지 자동으로 만들어 제공해 줍니다.</strong> 또한 GraphQL의 구현체까지 모두 정의되어있죠.</p><p>글 작성 날짜를 기준으로, 현재 지원하고 있는 언어는 JavaScript, TypeScript, Go 이며, DBMS는 Postgres, MySQL, mongoDB을 지원하고 있습니다. (추후에는 Elastic Search와 Oracle을 지원할 예정이라고 합니다.)</p><p>만들어진 클라이언트와 모델 그리고 구현체 등을 바탕으로 실제 서버에 적용하면 끝입니다. 주로 apollo-server을 이용하여 구현체(Resolvers)를 그대로 활용합니다.</p><h4>한 번 사용해볼까요?</h4><p>Prisma를 사용하기 위해선 일단 CLI 애플리케이션을 설치해야합니다. 사용하시는 패키지 매니저로 아래와 같이 설치해주세요.</p><pre>// Yarn을 사용한다면<br>$ yarn global add prisma</pre><pre>// NPM을 사용한다면<br>$ npm i -g prisma</pre><p><strong>Prisma CLI를 통해 로컬환경에서 설정하기</strong></p><pre>$ prisma init</pre><p>방법은 정말 간단합니다. 위 커맨드를 실행하시고 원하는 DBMS와 Client 언어를 선택하면 되는데요. 저는 MySQL과 TypeScript의 Prisma 클라이언트를 선택했습니다.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*-3sUDM2F89bZvktQqN7Wbg.png" /></figure><p>그러면 Prisma CLI는 그에 맞게 Prisma Server를 컨테이너 형태로 올릴 수 있는 docker-compose 파일, prisma 설정 파일인 prisma.yml, 그리고 GraphQL 형태로 데이터 모델링을 할 수 있는 datamodel.prisma 파일을 자동으로 생성합니다. 우린 이 세가지 파일들로 Prisma를 사용해볼겁니다.</p><p><strong>Prisma Server 구동</strong></p><pre>$ docker-compose up -d</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*6UT6Cq_9oaZDZpIWcqWv2w.png" /></figure><p>이렇게 Docker 이미지를 받고, 컨테이너로써 실행되면 localhost:4466 으로 prisma 서버가 실행됩니다. 우린 이제 이 엔드포인트로써 Prisma 서버를 사용할 수 있습니다.</p><p><em>이제 기본 설정은 끝났습니다! </em>🙆‍♂️</p><blockquote><em>해당 과정이 번거롭다면 AWS Cloudformation를 통해 쉽게 구축할 수 있으니 이 방법을 시도해보는것도 좋습니다. </em><a href="https://www.prisma.io/tutorials/deploy-prisma-to-aws-fargate-ct14"><em>(튜토리얼 링크)</em></a></blockquote><p><strong>데이터 모델 작성</strong></p><p>데이터 모델은 <a href="https://graphql.org/learn/schema/">GraphQL 형식</a>의 작성 방식과 거의 동일합니다. 예시로 계정과 프로필 그리고 그 계정으로 글을 쓴다는 시나리오를 가정하고 Account, Profile, Post 각각 1:1:N 관계에 있는 타입을 간단히 정의해보겠습니다. <em>datamodel.prisma</em> 파일을 아래와 같이 작성해주세요.</p><pre>type Account {<br>  id: ID! @id<br>  email: String!<br>  profile: Profile!<br>  posts: [Post!]!<br>  createdAt: DateTime! @createdAt<br>  updatedAt: DateTime! @updatedAt<br>}</pre><pre>type Profile {<br>  id: ID! @id<br>  account: Account! @relation(link: INLINE)<br>  bio: String<br>  websiteURL: String<br>  createdAt: DateTime! @createdAt<br>  updatedAt: DateTime! @updatedAt<br>}</pre><pre>type Post {<br>  id: ID! @id<br>  content: String!<br>  author: Account! @relation(link: INLINE)<br>  createdAt: DateTime! @createdAt<br>  updatedAt: DateTime! @updatedAt<br>}</pre><p><strong>기존 데이터베이스에서 데이터 모델 작성</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ipPBcfA5ssVfIBmx89Gq6Q.png" /></figure><p>Prisma에는 Introspect라는 기능이 있습니다. 이 기능은 Prisma에서 해당 데이터베이스의 정보를 읽고 자동으로 DataModel 을 작성해주는데요. 기존 데이터베이스를 그대로 Prisma 에서 사용하려면 아래와 같이 입력 후 데이터베이스 서버 정보를 입력합니다. 이 후 Prisma에서 기존 데이터베이스 정보들을 바탕으로 DataModel을 자동으로 작성해줍니다.</p><p><strong>Prisma 서버에 변경점 적용</strong></p><pre>$ prisma deploy</pre><p>이제 위와 같이 입력해주세요. 모든 변경점이 실제 데이터베이스에 적용되며, 모델과 클라이언트들이 자동으로 변경점에 대한 업데이트를 진행할겁니다.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*-csHskp9uhfdZoQcBDP3cw.png" /></figure><p>위처럼 변경점이 적용되었다는 결과가 뜨면 성공적으로 서버에 적용되었다는 뜻입니다. 이제 <a href="http://localhost:4466">http://localhost:4466</a> 으로 접속해볼게요.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*y3YWTMqX285iir-Y8M2XfQ.png" /></figure><p>지금 보시는 화면은 GraphQL Playground 인데요. Prisma 서버에 직접적으로 질의(Query, Mutation, Subscription)을 요청할 수 있으며, 응답 결과를 보여주고, Schema와 Docs를 제공해주는 역할을 합니다. 여기에 GraphQL 문법을 사용해서 간단히 계정을 생성하고, 자기소개를 적고, 글도 같이 한 번 써보는 질의를 던져볼게요.</p><blockquote>GraphQL 질의 문법은 <a href="https://graphql.org/learn/queries/">여기</a>를 참고하세요.</blockquote><p><strong>요청된 Query</strong></p><pre>mutation {<br>  createAccount(<br>// 생성될 계정의 데이터<br>    data :{<br>      email : &quot;<a href="mailto:jade@yeom.me">jade@yeom.me</a>&quot;,<br>      profile :{<br>        create : {<br>         bio : &quot;I&#39;m Jade&quot;  <br>        }<br>      }<br>      posts : {<br>        create : {<br>          content : &quot;이렇게 GraphQL Mutation으로 계정을 만들 수 있네요.&quot;<br>        }<br>      }<br>    }<br>  ){ <br>// Response로 받을 Account의 Fields를 명세 <br>    profile {<br>      id<br>      bio<br>      createdAt<br>      updatedAt<br>    }<br>    posts {<br>      content<br>      createdAt<br>      updatedAt<br>    }<br>  }<br>}</pre><p><strong>응답된 Response</strong></p><pre>{<br>  &quot;data&quot;: {<br>    &quot;createAccount&quot;: {<br>      &quot;profile&quot;: {<br>        &quot;id&quot;: &quot;cjxudbg9d00680937b5ihuyb1&quot;,<br>        &quot;bio&quot;: &quot;I&#39;m Jade&quot;,<br>        &quot;createdAt&quot;: &quot;2019-07-08T12:34:49.481Z&quot;,<br>        &quot;updatedAt&quot;: &quot;2019-07-08T12:34:49.481Z&quot;<br>      },<br>      &quot;posts&quot;: [<br>        {<br>          &quot;content&quot;: &quot;이렇게 GraphQL Mutation으로 계정을 만들 수 있네요.&quot;,<br>          &quot;createdAt&quot;: &quot;2019-07-08T12:34:49.482Z&quot;,<br>          &quot;updatedAt&quot;: &quot;2019-07-08T12:34:49.482Z&quot;<br>        }<br>      ]<br>    }<br>  }<br>}</pre><p>어떤가요? 정말 간단하죠! 기존의 고전적인 ORM을 사용해서 만들었으면, Relation 신경써야하고, JOIN 걸어야 하고, 트랜잭션 하나하나 일일이 신경쓸게 많아서 정말 시간이 들었을거예요.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*CHc0mpIuDtZRZg8ZoxoQaQ.png" /><figcaption>Prisma가 자동으로 만들어준 Resolvers</figcaption></figure><p>이런 기본적인 CRUD 형태의 간단한 질의 말고도 Sorting, Filtering, Subscription의 Resolvers는 Prisma가 모두 자동으로 만들어 제공합니다.</p><blockquote>실 운영 환경에서는 Prisma GraphQL 서버를 그대로 사용해서는 안되며, Apollo Server와 같은 GraphQL Server의 Resolver를 Prisma에서 제공해준 구현체와 연결하여 사용하는 것이 좋습니다.</blockquote><h4>레이블스토어 ❤️ Prisma</h4><p>레이블스토어는 Sequelize를 사용하던 모든 애플리케이션들을 Prisma로 대체하였습니다.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*osTF0NHsLsLcndjZ37FBvw.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*nc-noaxJFumEqeQ1tv5uKQ.png" /></figure><p>레이블스토어의 <a href="https://partner.labelsto.re">백오피스</a>와 <a href="https://labelsto.re">B2C 애플리케이션</a> 모두 Prisma의 GraphQL로 개발되었습니다. 프론트엔드는 React, Next.js와 <a href="https://github.com/apollographql/apollo-client">apollo-client</a>를 사용하여 대부분의 애플리케이션을 개발하고 있으며, 백엔드는 Express기반의 <a href="https://github.com/apollographql/apollo-server">apollo-server</a>를 사용하고 있습니다. 아직까지는 저희 Prisma 서버의 다운타임은 발생하지 않았습니다. 비교적 Stable 하게 Production 환경에서 운용되고 있고, 혹여 모를 대규모 트래픽에 대비하기 위해 ECS 위에서 운용되고 있는 모든 클러스터는 Auto Scaling 설정이 되어있습니다.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*AODw_amv-rXHu5B_eXoLPg.png" /><figcaption>레이블스토어의 Prisma <strong>개발서버</strong> 어드민</figcaption></figure><p>Prisma에서 기본적으로 제공하는 어드민 페이지도 적극 활용하고 있습니다. 이 덕분에 비개발 영역에 있으신 분들이지만, 운영업무를 보시는 분들께서 백오피스에서 건들기 힘든 세세한 부분들도 쉽게 수정할 수 있으며, 퍼포먼스 마케터 분들과 같이 날 것의 데이터를 원하시는 분들도 손쉽게 데이터를 뽑아서 볼 수 있도록 열어드리고 있습니다.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/660/1*u1YEhgnFFT3X2kGK7h4C2A.gif" /><figcaption>정말 초고속으로 만든 유저간 채팅기능 with Prisma</figcaption></figure><p>Prisma로 정의한 모든 타입들은 <a href="https://graphql.org/blog/subscriptions-in-graphql-and-relay/">Subscription</a>을 지원합니다. Subscription은 Pubsub 패턴의 실시간성 API로써 데이터의 Created, Updated, Deleted에 대한 모든 이벤트를 WebSocket을 통해 받아볼 수 있는데요. 이번 레이블스토어 개발팀은 유저간의 채팅을 구현하기 위해 Subscription 기능을 통해 채널톡과 유사하지만 유저들 간의 채팅이 가능한 기능을 단 이틀 만에 만들었습니다! 😊</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*HCcEp_V3Ut3Y5cD1KKhc5g.png" /><figcaption>WebSocket을 통한 실시간 트랜잭션</figcaption></figure><h4>Prisma 2 is Coming</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*-mbgI2FMaSjgcr78.png" /></figure><p>Prisma의 새로운 버전의 <a href="https://github.com/prisma/rfcs">RFC</a>가 작성된 이후 새로운 버전 개발에 박차를 가하고 있습니다. 주요 변경점은 별도로 운용해야했던 Prisma Server의 의존성을 없애고 자체 쿼리 엔진과 마이그레이션 엔진을 Standalone 형태로 사용할 수 있다는 점이 크며, 기존 버전의 알려진 많은 이슈들을 해결했다고 합니다. 로드맵 상으로는 올해 안으로는 나올 것 같고, 이번에 열린 <a href="https://www.graphqlconf.org">GraphQL Conf Berlin 2019</a> 행사 이후 <a href="https://github.com/prisma/prisma2">Prisma2의 Preview</a>를 공개했다고 하니 체험해보셔도 좋을 것 같습니다.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ARq-yfdSWTVl2BGnBXT12g.png" /><figcaption>레이블스토어를 이루는 기술들</figcaption></figure><h3>끝 마치며</h3><p>레이블스토어는 날마다 성장하고 있고, 이에 빠르게 변화하는 모든 상황에 준비하고 있습니다. 다음은 레이블스토어의 시스템 아키텍쳐에 대해 공유해보려고 합니다.</p><p><strong>읽어주셔서 감사합니다!</strong></p><p>―</p><p><em>우리는 더 빠르게 달리기 위해 뜻을 같이 할 동료를 찾고있습니다. 혹시나 저희 팀에 관심이 있으시면 아래 채용공고도 함께 둘러봐주세요. </em>🙏</p><p><a href="https://www.notion.so/0e8054e02cf840ac8578b02108abc32a"><strong><em>레이블스토어 개발자 채용공고</em></strong></a><strong><em> </em>🚀</strong></p><p><a href="http://blankcorp.kr/sp.php?p=51"><strong><em>블랭크코퍼레이션 채용공고</em> </strong></a><strong>🙌</strong></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=fa64dcf63382" width="1" height="1" alt=""><hr><p><a href="https://medium.com/labelstore/prisma%EB%A1%9C-graphql%EC%9D%84-%EC%89%BD%EA%B2%8C-%EB%8F%84%EC%9E%85%ED%95%98%EA%B8%B0-fa64dcf63382">Prisma로 GraphQL을 쉽게 도입하기</a> was originally published in <a href="https://medium.com/labelstore">LABELSTORE ENGINEERING</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>