스토리 홈

인터뷰

피드

뉴스

조회수 950

이직 후, 어떤 변화가 있었을까

어딘가로 떠나는 퇴사 로망을 꿈꾸던 내게, 스타트업 행이라는 기회가 열려버렸다. 그리고 에이전시 UI 디자이너였던 내가, 스타트업 UX 디자이너가 됐다."괜찮아요? 지낼만해요?"라는 질문에는"후하, 심호흡 좀 하고 말할게요."라고 답하고 싶다.4달이 지난 이 시점에서, 어떤 변화가 있었는지 풀어 보려 한다.괜.찮.아.요?역할을 바꿨더니 모든 역할(기획자, 디자이너, 개발자)의 마음이 이해되기 시작했다.1. 기획자 입장수정을 해야 했던 기획자의 그 마음이 이해되더라이전에는 UI만 담당했기에 종종, 기획을 틀어버리는 기획자가 원망스러웠다. 사용자 경험을 고려해 전체 플로우를 짜 놓은 상태에서, 부분적으로 바뀐 기획안을 보고 있자면 물음표 투성이었다. 또한 약 200여 장 넘는 문서를 다루면서 바뀐 기획을 반영하는 데는 꽤 많은 공수가 들기도 했었기에 너그럽지 못했다.그런데 기획부터 UI까지 함께 하다 보니 기획자의 마음과 그 과정이 이해된다.막상 디자인(image)과 개발된 것(interaction)을 보면  더 나은 방향이 떠오르기에,머리는 하나지만 고민할 케이스는 수십 가지기에,어제의 내가 정답이 아니기에, 등등(문제는 오늘의 나도 정답이 아닐 수 있다)2. 디자이너-개발자 입장수정을 마주하는 그 마음도 이해되더라수정에 민감했던 나의 과거를 생각하며... 이제는 막을 수 없다면 줄이자 ^*^ 기획 단계에서 최대한 많은 파이의 고민을 하고, 구현 전에 디자이너-개발자와 함께 검토하는 시간을 가져야 오류를 최소화할 수 있다. (무려 시행착오 끝에... 오늘에서야 깨달았다!)고상하게 표현했지만, 후폭풍을 막기 위해서는 기획서를 두고 서로를 설득하기 위한 치열한 논의가 필요하다.3. UX 디자이너 입장나의 다음 스텝(진화과정)이 이해되더라이전에는 여러 프로젝트를 병행했기에 기획 쪽 이슈는 팀 내 시니어에게 전달받았고, 디자인-개발의 이슈의 경우엔 이슈 리스트로만  주고받았다. 또한 디자이너들과 소통할 일이 90%였고, 눈빛만 봐도 척하면 척이었기에 나의 역할을 잘 수행하는 것이 가장 큰 목표였다.하지만 이제는 '기획-디자인-개발' + 운영팀의 흐름을 항상 놓치지 않아야 할 역할이 되었다.이전에는 디자인 팀을 관리하는 PM(프로젝트 매니저)이 다음 스텝이었다면, 스타트업에서는 프로덕트를 관리하는 PO(프로덕트 오너)가 다음 스텝이라는 것.(지난해 함께 합류하게 된 개발자 호성님께서 '스크럼'이라는 프로젝트 방법론을 제시하셨다. '스크럼'을 실행한 지 2달 여째, 나는 나의 역할이 조금씩 이해되고 있다.)아우, 쓰고 보니 한참 멀었다.변화의 묘미근래에 스타트업 생활을 하면서 와 닿았던 두 대표님의 이야기가 있다." 지금까지도 그래 왔고, 앞으로도 새로운 것을 만들어나가는 사람들이기에 어려운 문제들과 상황들을 잘 해결하려고 부담 갖기보다 조금 더 즐기며 도전하는 마음가짐으로 맞이 합시다 "  8퍼센트 이효진 대표님" 스타트업 생활을 하면서 '이렇게 세상을 빠르게 변화시킬 수 있는 사람들과 함께 일을 할 수 있다는 것'이 큰 힘이 되었습니다. "패스트캠퍼스 이강민 대표님아직은 이해하는 단계지만, 이 무지막지한 모든 변화들이 스타트업에서만 겪을 수 있는 묘미인 것 같다.핀테크를 꿈꾸며... 열일중인 인(人)테크의 현장#8퍼센트 #에잇퍼센트 #협업 #사내문화 #조직문화 #팀플레이 #팀워크
조회수 715

궁금해서 여행다녀오겠습니다 - 1

"한 사람의 삶에서 무엇이 영향을 미쳤고, 어떻게 시간을 보내며 살아가고 있을까? "집에 방문해보면 그 사람이 어떤 사람인지 더 깊이 알 수 있다."궁금해서 여행 다녀오겠습니다" 누군가의 책장을 살펴보면 관심분야와 생각을 알 수 있고, 가지고 있는 물건들을 보면 취미나 취향을 알 수 있다. 그렇게 한 사람을 좀 더 잘 파악할 수 있게 된다. 그렇다면 사람들, 인류 전체 역사에서 무엇이 중요한 영향을 미쳤고, 사람들(인류)은 어떻게 시간을 보내며 살아가고 있을까? 앞으로 우리는 어떻게 살게 될까?  이 질문에 대한 답을 찾으려면 사람들이 살고 있는 곳을 방문해야했다. 사람들이 살고 있는 도시에 가서, 역사와 흔적을 찾아보면 사람들(인류)을 더 잘 파악할 수 있을거라 믿었다. 그렇게 나의 500일에 걸친 도시 관찰 일기가 시작됐다.Prologue : 관찰 여행의 시작 사실 대학 입학 후, 나의 목표는 졸업 전까지 5대양 6대주를 다 보는 것이었다. 국제적인 이벤트에 지원받아서 참가할 수 있는 기회를 계속 찾고, 방학이 되면 해외로 나가기 위해 학기 중에 돈을 모았고, 그렇게 남미, 북미, 유럽, 중동, 동남아, 동북아를 하나하나 여행해 나갔다. 본격적으로 관찰 여행을 시작하게 된 것은 졸업 후 회사를 다니면서다. 언젠가는 창업을 하리라 라는 마음이 있었기에 스타트업에 계속 관심을 가지고 있었고 아이폰이 세상에 등장한 이후, 실리콘밸리에 대해 궁금증은 커져갔다. 그래서 회사를 다니는 동안, 휴가를 활용하여 세계적인 스타트업 허브들을 방문하기로 마음먹은 것이 첫 번째 관찰 여행의 시작이었다. 가서 어떻게 더 많은 것을 얻어올 수 있을까 라는 고민을 하면서 본격적으로 나만의 글로벌 탐방 여행을 기획하기 시작했다. 미국의 실리콘밸리, 이스라엘의 텔아비브 (이스라엘은 미국 나스닥(한국 코스닥에 해당)에 가장 많은 기업을 상장시켰다), 중국의 선전, 싱가폴 등 주요 도시를 목표로 기획서를 작성하고 차례로 방문하기 시작했다. 처음 실리콘밸리에 갈 때는 매일매일의 점심, 저녁 시간에 인터뷰 약속을 잡아놓고 출발했다. 인터뷰를 하면서 meetup을 통해 현지 event 에 참가하는 방법을 배웠고, 기회가 닿아 회사에도 방문하게 되었다. 그렇게 점점 기획하는 능력이 개선되어서, 텔아비브 방문 시에는 개인 인터뷰뿐만 아니라, meetup 등 현지 이벤트 참가, 기업 방문(startup, 대기업, VC, 엑셀러레이터) 등을 조합하여 기획해서 다니게 되었다. 결과적으로 이렇게 다닌 여행은 기존의 여행과는 다른 경험이 되었다. 다녀와서 생각이 달라지기도 했고, 세계의 흐름을 조금 더 이해할 수 있었다.To be Continued 
조회수 1896

지금이 중요하다

"나중에 이직 생각은 안 해?"스타트업에 갔다고 하니까 친구가 물어봤다.대기업에 가야 나중에 이직도 편하지 않냐고. 질문을 들었는데 아무 생각 없더라. 회사를 찾으면서 이직이라는 걸 생각을 별로 안해봤다. 근데 난 왜 별로 생각이 없었지? 친구 말도 분명 맞는데? 궁금했다.그 친구와 헤어지고 생각이 정리가 됐다. 첫째. 내 관심은 미래가 아니라 바로 지금에 있다. 미래의 주어질 수 있는 안정보다 지금 해보고싶은 것이 더 중요하고, 지금 행복한 것이 더 중요하다. 해보고싶은 것. 행복할 수 있는 환경을 쫓아 지금 스타트업에 왔다.둘째. 내가 다닌 회사 이름이 아니라 내가 한 일을 가지고 이직할 것을 그리고 있다. 그래도 여전히 전 회사 네임밸류가 치명적으로 중요할 수도 있는지 모르겠다. 어디일까 그런 곳? 그런 곳이라면 내가 안 갈 생각이다. 셋째. 계속 이직할 생각보다는 언젠가 1인 기업, 1인 브랜드가 될 생각이 커서인 것 같다. 지금 회사에서 다른 곳 이직할 수도 있지만 평생 이직할 생각은 없다.모르겠다... 난 이직 (비슷한 의미로 노후) 미리 걱정 안한다. 다 길은 있다. 내가 추구하는 방향으로 먹고살 길. 없으면 만들 것이고...결론. 나는 내가 지금의 일을 어떻게 해내는지가 중요하다고 생각한다. 역시나 어떤 게 옳다 그르다, 더 현명하다 어리석다는 판단 없는 나의 생각.
조회수 894

루프 속 브랜딩: 벌려놓은 일과 마무리되는 일

일이 생기다, 일이 밀리다.일이란 게 참 그렇습니다. 오늘의 일이 끝났다고 내일 일이 없는 것이 아니죠. 심지어 오늘의 일이 안 끝났다면 내일의 일은 괴물이 되기 시작하고, 그렇게 하루이틀 밀리다보면 '아!!...난 왠지 백수에 적성이 있지 않을까?!' 싶어집니다.바로 백수야!!흔하게 일이 밀리는 프로세스는 다음과 같습니다.오늘 다 끝내지못한 PPT 나머지 8장은 내일로 넘어갑니다.내일은 보도자료 작성과 행사기획, 카드뉴스제작, 블로그글쓰기을 해야합니다. PPT를 만들다보니 블로그가 또 다음 날로 밀렸습니다.다음 날엔 또 그 날의 일이 있는데 블로그도 해야합니다.그런데, 그 순간 대표님이 어디가서 IR해야하니 PPT좀 만들자고 합니다.(아니 욕! 엊그제 만들었잖아!? 욕욕) 하지만 하라니까 해야죠.문제는 오늘의 일을 끝낼 수 없게 되었습니다. 난데없이 IR제작이 추가되면서 오늘 일 몽땅과 블로그작성도 또 미뤄집니다.그렇게 일주일이 지나니 블로그는 아예 누락되어버렸고, 월요일날 혼납니다. IR먼저 만들으래서 만들었는데, 왜 다른 일 못했냐고 꾸중을 듣습니다.협력업체에선 빨리 자료달라고 메일이 옵니다.겨우 IR 제작이 끝나서 지난 일주일간 밀린 것을 하려고 보니 양이 엄청납니다.이번 주에는 행사준비가 시작되는데, 이걸 다 하다간 아무것도 못할 것 같습니다.음. 해결책이 있습니다. 밤의 신에게 소원을 비는 것이죠. 새벽포텐으로 이 일을 마법처럼 끝낼 수 있게 해주세요...소원이 이루어졌습니다. 이번 주의 모든 저녁약속을 취소되었고...꿈의 야근이 시작됩니다. 여기서 꿈은 '비몽사몽'을 의미합니다. 대부분, 일이란 건 한 번 밀리기 시작하면 종잡을 수 없이 계속 밀어내기식으로 진행되다가 새로운 일이 하나 들어오는 순간부터 사채이자를 빌려쓴 카드 돌려막기의 폐해를 몸소 느낄 수 있게되는데..이 일 빼서 저걸 막으면, 저기에서 또 다른 일이 생기고... 도무지 정리가 안되고 하면 할수록 많아지는 느낌만 들게 됩니다.특히 브랜딩업무는 더더욱 그렇습니다. 브랜딩이란 단어는 굉장히 설렙니다. 사람들이 보통 이 단어를 들으면 희망과 꿈이 가득해지고 흥분을 하는 경향이 있더라구요. 그러나 엄밀히 따지고 보면 브랜딩은 딱히 새로운 시작을 알리는 축포 같은 게 아닙니다. 사실 명백히 따지면 시작부터 이미 되어있었어야 하는 걸 이제서야 하고 있는 거죠. 그리고 이제부터 브랜딩을 할끄야!!!! 라는 외침은 새해 해돋이를 보면서 올해는 살을 뺼거야!!! 와 같은 느낌의 결심의 톤과 비슷합니다. 브랜딩은 '기질과 속성'에 가까운 것인지라 결심으로 해결될 문제는 아닙니다. 기존의 일들을 정립하기원래 말도 잘 못하고 응..너가 좋으면 나도 좋아...스러운  웹툰주인공같은 성격을 지닌 세희씨는 2017년 내내 호갱으로 아스트랄하게 살다가 새해가 되어 문득 생각했습니다 '이렇게 살아선 안돼!!! 이제부턴 거칠거 강렬한 카리스마를 뿜을거야!!' 라고 결심을 했습니다. 다음 날 팀장님이 '세희씨 이런거 잘하지? 이거 세희씨가 해~' 라고 던진 썡뚱맞은 업무앞에서 그녀는 과연 결심을 지킬 수 있을까요.하루아침에 무언가가 슉~하고 바뀔 순 없습니다. 더군다나 원래 기질과 맞지 않은 옷을 입으려고 할 땐 더더욱 심각해지죠. 해결책이야 일반적인 자기계발서에 나오는 얘기와 비슷할 것 같습니다. 자신을 알고 어쩌고 뭐 하는 것이죠. 브랜드는 매출과 확장의 목표가 분명하므로 단순한 자기성찰을 넘어서 구체적인 '행동'이 추가되어야 합니다. 그것도 아주 명백한 결과를 낼 수 있는 행동들 말이죠.그런데 브랜딩을 한다고 해서 시작되는 행위는 대부분...좀 어딘가 동떨어진 느낌의 업무가 추가되는 느낌입니다.브랜딩 = 새로운 전환점! 시작, 터닝포인트! = 회사소개서 리뉴얼???과 같이 말이죠. 목적과 행위가 좀 따로논다는 느낌이 있지 않나요? 대부분의 회사 브랜드 프로젝트의 목적은 '우리 회사의 아이덴티티를 정립하고 알리겠다!' 입니다....그렇다면 일단 '정립'을 해야하고 '알려야하죠. https://dribbble.com/shots/1618339-Brand-Identity-System정립이란 건 = 태양계를 만드는 일과 같습니다. 핵심을 태양위치에 두고 회사를 구성하는 메인 BM과 부가적인 BM을 내행성계와 외행성계로 나누어 궤도에 돌리는 일이죠. 중간에 자잘한 것들은 소행성계에 넣어놓고 우리 회사의 영향력이 어디까지 미치는 지 시장의 범위를 정해서 헬리오포스(태양의 힘이 미치는 태양중력영향권)를 규정합니다.과학실에 있던 태양계 모형마냥 항상 지구를 돌리면 톱니바퀴장치로 다른 아이들도 빙글빙글 돌아가곤 했는데...이것과 유사하다고 생각됩니다. 예를 들어 태양. 즉 핵심가치가 "일은 먹고살자고 하는 거다."라고 해봅시다.'식사'라는 키워드로 7개 행성이 그 가치를 공전하기 시작합니다.내행성(주요BM)3개는 "도시락/샐러드/간편식" 제조와 배달입니다.외행성(보조BM)4개는 "강의/건강검진서비스/앱광고/굿즈판매" 입니다.그리고 중간에 "행사, 이벤트, 무슨 R&D사업유치, IR, 박람회, 해외지사 설립" 부수적인 이슈들이 있죠. 일단 브랜딩에서 업무구분을 할 때 중요한 건 무엇이 안쪽에 있고 무엇이 바깥에 있는지..어떤게 큰지 작은지를 나누고 구분하는 일입니다. 정립이란 건 "제대로 세운다" 라는 의미입니다. 회사에서 하는 일이 하나가 아닌만큼 하나가 자빠지면 우르르 넘어지기 시작하는데 그게 유튜브 도미노영상처럼 아름답게 넘어지진 않더라구요. 그냥 뜯다가 터져버린 아몬드후레이크처럼 사방에 널브러지는 거죠.위와 같이 일종의 동심원구조의 궤도를 구축했다면 각 궤도를 구성하는 상세한 업무들을 생각해봐야 합니다. 행성에 딸린 위성과 같은 느낌이죠. 업무를 정리하다.기존의 일을 정리하는 방식은 3가지로 구분할 수 있습니다.1) 없애거나2) 합치거나3) 바꾸는것이죠. '줄인다' 라는 표현은 좋아보이긴 하지만..절대량이 똑같다면 어떨까요? 100의 일을 해야하는데 하루2시간씩 50일을 해던걸 1시간으로 줄여 100일을 한다?... 어차피 똑같거나 아니면 더 힘들어질 수 있습니다. 우리가 신경써야 하는 건 절대량100을 80으로 줄이는 겁니다.쓸데없는 일들은 없애는 것이 맞습니다. 작게는 자잘하게 많은 서류작성이나, 출장계획서, 복귀 후 보고서(심지어 이런것도 있음) 등 불필요한 양식들을 정리해내고 크게는 소행성계에 있거나 외행성계에 있는데 지나치게 업무시간을 많이 할당하고 있거나 메인업무가 오히려 밀리는데 심지어 딱히 가성비도 좋지 않다!!..라고 하면 그냥 STOP! 해야죰. 존버는 답이 아니니까요.유사한 업무끼리는 합치는 게 좋아요. 소개서와 제안서는 비슷한 부분이 많아서 제작시에도 모듈화시킬 수 있는 부분이 있다면 또 새롭게 소개페이지를 만들고 간지를 제작할 필요가 없죠. 모든 PPT양식을 하나로 통일해서 지정된 디자인으로만 사용한다면, 필요할 때마다 템플릿 디자인을 다시 해야할 필요도 없죠. 내용만 갈아끼우면 되니까요. 지금까지 쓰던 서류철을 웹클라우드서비스로 바꿔서 데이터정리를 한다거나, 협업툴을 바꿔보거나 일반 종이계약 과정을 전자계약으로 바꾼다거나 하는 등 자동화/간소화 시스템을 활용해서 업무의 효율을 높이는 방법도 있어요. 이는 절대량100을 줄이진 않지만 내 능력치10에서 빛나는반지를 장착하여 +3의 어드밴티지 효과를 부여해주죠. 궤도정립과정에서 각각의 일들이 구체적으로 등장해준 후 위와 같이 각 일에 대해 마이너한 리뉴얼을 거치고 나면 그 떄 비로소 새로운 일을 만들 수 있습니다.후우..드디어그리고 실제로 위와 같이 마이너하게 업무정리를 하기 위해선 상당부분이 통일/정리/자동화가 이루어져야 하죠. 이미 이 과정자체가 브랜딩의 기초단계를 만드는 역할을 하기도 하고, 이 후에 새롭게 진행될 일의 절대량도 현저하게 줄어드는 꿀이득을 누릴 수 있죠. 일을 시작하다.이제 일을 시작해봐야겠습니다. 무슨 일을 어떻게 시작할 지는 앞서 적은 매거진 내용을 통해 언급했으니 구체적인 내용은 '뒤로 가기'를 누른 후 지난 1~14화를 쭈루룩....(이렇게 조회수를 늘리나요..)우리가 여행갈 때 셀카봉은 빼먹어도 되지만, 신발을 안신고 갈수는 없잖습니까. 일을 함에 있어도 중요한 요소와 부가적인 요소가 존재합니다. 초등학교 국어시간에 배웠던 6하원칙을 모두 지키라는 건 너무 가혹한 일이므로 3가지만 지키도록 하죠.'누가/언제/어떻게'무엇. 에 해당하는 건 이미 과업으로 정해졌을 테니 위의 3가지만 정확하게 잡아보도록 합시다.1) 누가...는 업무분장을 의미합니다. 지난 회의실에 브랜딩에서 익히 정리했던 내용이지요. 다시 한 번 요약하자면 정/부를 정확히 쪼개고 누구에게 보고하고 누가 컨펌하느냐 하는 사람에 대한 체계를 잡는 일입니다. 이게 제대로 안잡혀있으면 내 일이야? 네 일이야? 하다가 결국 일은 구멍이 났는데 책임지는 사람은 아무도 없고 돈만 날리는 경우가 종종 있습니다. 2) 언제. 는 데드라인을 의미하죠. 마무리 시점을 잡는 것 이외에 각 단계별 일정을 구축하고 다른 협업자와의 일정조율을 하는 모든 일을 포함합니다. 달력으로 하는 일이니만큼 책상위엔 2018년 예쁜 달력이 반드시 있어야 할 듯 합니다.3) 어떻게...는 업무방식에 대한 얘기이죠. 커뮤니케이션만 담당하고 외주로 돌릴 것인지, 직접제작 할지 아니면 TF팀을 구성할 지 등등 부터 오프라인/온라인 등의 채널 잡기, 구체적인 기획안에 적히는 콘텐츠의 내용들을 의미합니다. 이를 종합해보면 다음과 같은 과업지시 내용이 등장하죠.그래! 리플렛을 만들어서 우리 앱을 소개해보자!~라는 목표가 생겼다면"지혜가 정을 잡고, 가희가 부를 잡아. 각 업무분장은 지혜가 기힉/커뮤니케이션을 잡고, 가희가 자료조사/취합/전달의 역할을 하자. 자료조사는 12일까지, 취합전달은 13일까지 그리고 그동안 지혜가 컨택을 담당하고 13일에 디자이너에게 전달하는 걸로. 22일까지 1차시안을 완료하고 30일까지 최종시안 인도받아서 30일날 인쇄넘기는 걸로 정리한당. 리플렛은 오프라인 행사장에서 나눠줄 용도라서 2,000부 정도 인쇄 진행하고 AI원본파일 요청하고 해당비용에 대한 이슈는 알려줘요. 리플렛 내에 들어갈 내용은 기존 리플렛을 참고하되 업데이트된 부분들에 대한 정리와, 우리 브랜드가이드에 맞춰서 디자인리뉴얼에 초점을 맞추자."로 정리가 된달까요. 그럼 업무확인은 어떻게 하느냐.. 13일날 전달확인 / 22일 1차시안 확인 / 30일 최종시안 수령확인 으로 3번만 하면 됩니다. 누구에게 확인할까용? 지혜씨죠.인쇄이슈는 최종시안 컨펌 후 다시 과업지시로 전달합니다. 뭐 이 때 실무자는 대략 고민을 해봐야죠. 사이즈나 부수를 대략 확인했으니 인쇄비용에 대한 견적을 미리 받아야 할 거고, 비교견적을 내고 결재를 미리 올려야겠죠. 인쇄 및 수령일자를 확인하고 감리일정도 미리 업체와 조율해야 합니다. 택배방식도 확인해야합니다. 박람회 일정이 그리 넉넉치 않으니 일반배송으로 할지 다마스퀵으로 할 지 등등. 조금 더 깨어있는 현대인이라면 2,000부가 행사장에서 모두 소진되지 않을 것임을 알고있을 겁니다. 그렇다면 배포 후 남은 리플렛은 어디에 어떻게 활용하면 좋을지에 대한 B안을 가져갈 수도 있겠죠. 이런식으로 일을 줄이고 쳐내고 정리한 후 새로운 일을 잘 오물거려서 끼워넣는 방식으로 총량을 맞춰가는 게 정말 중요합니다. 일이 과다하게 쌓이기 시작하면 모든 일의 퀄이 떨어져갑니다. 퀄이 떨어진단 얘기는 브랜드관리가 허술해지기 시작한단 얘기고 헛점이 많아지는 것이죠. 내부업무에서 허점이 늘어나기 시작하면 반드시 고객접점까지 그 영향이 미칠 수 밖에 없어요.클레임 피드백이 안되거나, 간담회가 엉망이 되거나, 베타테스터 모임이 허접해지거나...또는 제품납품 일정, 서비스UX의 문제가 개선되지 않는 등...브랜드이미지와 운영관리가 똥망이 되어갑니다.회사소개서가 예쁘지 않아서 브랜딩이 안되는 게 아니예요.무리한 회사소개서 제작때문에 브랜딩이 어려워지는 것이죠. 내일은 전체회의를 하면서 태양계를 한 번 그려보는 게 어떨까용 (강츄) :)
조회수 1440

Navigation Controller 자유롭게 다루기

Intro: The Navigation Controller예고했던 Navigation Controller와 TabBar Controller의 커스터마이즈 중, Navigation Controller의 구조와 간단한 커스텀 방법을 나누겠습니다. Navigation Controller(이하 내비게이션 컨트롤러)는 거의 모든 iOS 앱에서 사용된다고 해도 과언이 아닌 자주 사용되며, 간결하지만 막강한 기능을 가진 컨트롤러입니다. 앞선 글에서 소개했듯, TabBar Controller와 함께 iOS의 양대 컨트롤러라고 불러도 대부분의 iOS 개발자들이 동의하리라고 생각합니다. 이번 글에서는 내비게이션 컨트롤러를 커스텀하는 방법을 소개하겠습니다.Navigation Cotroller (출처: apple developer)목차1. Push, Pop 애니메이션 커스터마이징2. Pop 제스처 사용하기, 사용하지 않기3. Back 버튼 타이틀 숨기기4. 상단 좌우의 버튼 추가하기5. NavigationBar 숨기기, 보여주기6. What’s NEXT?1. Push, Pop 애니메이션 커스터마이징Push, Pop 트랜지션 기능은 내비게이션 컨트롤러의 핵심적인 기능입니다. Stack에 다음 View Controller를 쌓으며 디스플레이하는 것이 Push, 이전의 View Controller로 되돌아가는 것이 Pop 액션입니다. Pop 액션에는 최초에 디스플레이됐던 View Controller로 돌아가는 Pop to Root 액션이 포함되어 있습니다.<iframe width="560" height="315" src="https://www.youtube.com/embed/NqfYhI5ySKk" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="">Pop View Controller(animated)이러한 액션에는 애니메이션이 포함됩니다. 대개 기본적으로 적용된 애니메이션을 사용하면 되지만, 어떤 이유로 애니메이션을 커스텀하고 싶은 경우가 생깁니다. 이럴 때는 UINavigationController를 상속하는 커스텀 클래스를 만들어서 커스텀할 수 있습니다. 물론 Extension 형식으로 함수를 작성할 수도 있습니다.// UINavigationController를 상속하는 커스텀 클래스를 작성 class BRNavigationController: UINavigationController { // 애니메이션을 적용하는 함수를 작성 func overrideAnimation() { //여기에서 커스텀 애니메이션을 작성합니다. let transition = CATransition() transition.duration = 0.3 transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) transition.type = kCATransitionFade self.view.layer.add(transition, forKey: nil) } // popToRootViewController(animted)를 오버라이드 override func popToRootViewController(animated: Bool) -> [UIViewController]? { print("Custom Animation Triggered") if(viewControllers.last!.isKind(of: PersonalViewController.self)) { // 커스텀 애니메이션을 사용할 ViewController의 케이스를 분기한다 // 작성된 커스텀 애니메이션 트리거 self.overrideAnimation() //UINaivgationController의 Function을 그대로 반환 return super.popToRootViewController(animated: false) } else { // 다른 모든 케이스의 경우 디폴트 애니메이션을 사용 //UINavigationController의 Function을 그대로 반환 return super.popToRootViewController(animated: animated) } } } 위의 코드로 작성한 애니메이션 아래의 영상과 같이 동작합니다.<iframe width="560" height="315" src="https://www.youtube.com/embed/g_XCo1Hmnj0" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="">커스텀 Pop 애니메이션이 적용된 Navigation Controller위와 같이 커스텀된 내비게이션 컨트롤러는, 단지 애니메이션을 오버라이드하는 데 그치지 않고 다양한 방식의 효율적 코드 작성을 할 수 있게 합니다. 우리가 아는 것처럼, 수퍼클래스의 위용과 유용을 마음껏 누릴 수 있습니다.2. Pop 제스처 사용하기, 사용하지 않기내비게이션 컨트롤러에서는 화면 왼쪽 끝에서 오른쪽으로 스와이프하는 Pop 제스처를 사용해 이전 View Controller로 돌아갈 수 있습니다. 하지만 종방향 스크롤이나 스와이프 이벤트를 사용하는 ViewController의 경우 어쩔 수 없이 Pop 제스처를 막아야 하는 일이 생깁니다. 이럴 때에는 해당하는 ViewController에서 다음과 같이 간단한 코드로 Pop 제스처를 방지하거나, 방지 해제할 수 있습니다.// 아래의 코드를 트리거하면 Pop 제스처를 비활성화할 수 있습니다 self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false 이 코드를 한 번 적용하면, 해당 내비게이션 컨트롤러의 Stack에 쌓인(또는 쌓일) View Controller에 일괄적으로 적용되기 때문에 반드시 다른 ViewController에서는 기본적으로 isEnabeld를 True값으로 지정하도록 코드를 구성하여 모든 ViewController에 일괄적용되는 것을 방지해야 합니다.다만 이 부분에서 중요한 것은, Back 버튼을 숨기거나 커스텀할 때 각별히 주의해야 한다는 것입니다. 제스처를 사용하는 사용자들도 있지만, 제스처의 존재 자체를 모르는 사용자들도 있기 때문에 Back 버튼은 대부분의 경우 유지하는 것이 좋습니다. 제스처를 비활성화할 때는 더더욱 유지해야 하고요.Back Button이 없다면 어떻게 뒤로 돌아갈 수 있을까요.3. Back 버튼의 타이틀 숨기기내비게이션 컨트롤러에 포함된 Navigation Bar(이하 내비게이션 바)의 Back 버튼은 자동으로 이전 ViewController의 타이틀을 보여주도록 디폴트 설정되어 있습니다. 이렇게 자동지정된 타이틀이 마음에 들지 않는다면, 간단한 트릭을 사용하여 타이틀을 없앨 수 있습니다.먼저, Back 버튼의 타이틀이 되는 이전 ViewController의 타이틀은 ViewController에서 다음과 같이 지정됩니다.// 직접 ViewController의 타이틀을 지정 viewController.title = "이것이 바로 타이틀입니다" Back Button에 '상품정보' 타이틀이 보입니다.위의 코드로 지정한 ViewController의 타이틀은 Push 액션을 통해 다음 ViewController로 넘어갔을 때 Back 버튼의 타이틀로 사용됩니다. 그래서 이 코드를 사용하지 않고, 커스텀 Label을 titleView에 넣어주는 것으로 대신할 수 있습니다.// titleView로 사용할 Label을 생성 let label = UILabel(frame: customFrame) label.text = "이것을 타이틀로 사용합니다" // viewController의 titleView를 생성한 Label로 셋업 viewController.titleView = label 짜잔- Back Button의 타이틀이 사라졌습니다!4. 상단 좌우 버튼 추가하기여러 iOS 앱들을 사용하다 보면, 내비게이션 바의 좌/우측단에 위치한 버튼들을 자주 보게 됩니다. 이 버튼들은 BarButtons(이하 내비게이션 바 버튼) 라고 불리우는 컴포넌트들입니다. 내비게이션 바 버튼들은 배열 방식으로 좌/우측에 각각 배치됩니다. 원하는 이미지와 텍스트 등으로 내비게이션 바 버튼을 생성한 후, 좌/우측의 버튼 배열 중 원하는 곳에 각각 넣어주면 디스플레이 되는 방식입니다. 다음의 코드 예제를 통해 내비게이션 바 버튼을 추가할 수 있습니다.// RightBarButtons에 추가할 UIBarButtonItem을 생성 let customButton = UIBarButtonItem(customView: customView) // Container가 될 Array를 생성 (혹은 직접 지정하는 방법도 있습니다) let rightBarButtons: [UIBarButtonItem] = [] // Array에 버튼 아이템을 추가 rightBarButtons.append(customButton) // RightBarButtonItems 배열을 셋업 viewController.navigationItem.rightBarButtonItems = rightBarButtons //LeftBarButtons에 추가할 UIBarButtonItem을 생성 let customButtonCopy = UIBarButtonItem(customView: customView) // Container가 될 Array를 생성 (혹은 직접 지정하는 방법도 있습니다) let leftBarButtons: [UIBarButtonItem] = [] // Array에 버튼 아이템을 추가 leftBarButtons.append(customButtonCopy) // LeftBarButtonItems 배열을 셋업 viewController.navigationItem.leftBarButtonItems = leftBarButtons 타이틀뷰, LeftBarButton, RightBarButton이 모두 커스텀된 브랜디의 홈5. NavigationBar 숨기기, 보여주기앱의 UI가 전체화면으로 컨텐츠를 표시해야 할 때, 또는 다른 목적에 의해서 내비게이션 바를 숨기거나 보여주어야 할 때가 있습니다. 이럴 때는 간단한 코드 트리거로 내비게이션 바를 숨기거나 보여줄 수 있습니다.// 단 한 줄의 코드로 내비게이션 바를 숨길 수 있다구요? navigationController.setNavigationBarHidden(false, animated: true) <iframe width="560" height="315" src="https://www.youtube.com/embed/ldpe-M8Uyy8" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="">내비게이션바를 숨겼다가 보였다가6. What’s NEXT?현재 앱스토어에 배포된 브랜디 iOS 앱은 내비게이션 컨트롤러를 적극적으로 활용하여 작성되었습니다. 내비게이션 컨트롤러는 기본 설정으로 사용할 때에도 여전히 막강한 특징들을 많이 가지고 있기 때문에, 선택적으로 알아두어야 할 컴포넌트가 아닌 필수적으로 그 장단점과 용법을 꿰고 있어야 하는 중요한 컴포넌트입니다. 내비게이션 컨트롤러만 잘 다루어도 앱을 개발할 때 굉장히 도움을 많이 받을 수 있다는 것이죠.내비게이션 컨트롤러는 다양한 방식으로 커스터마이즈를 할 수도 있습니다. 물론 이러한 커스터마이즈는 필수사항은 아닙니다. 디자인적 요소를 적용하기 위해 커스터마이즈하는 경우가 대부분이지만, 그에 못지 않게 개발자가 프로젝트의 컴포넌트를 정규화하고 모듈화하기 위해 커스텀하는 경우도 많은 만큼 StackOverflow나 애플 개발자 문서를 참고해 다양한 커스터마이즈를 해보는 것도 재미있을 겁니다.다음 글에서는 TabBar Controller의 커스터마이즈 방식에 대해 간략하게 공유하겠습니다. iOS 루키들의 장수와 번영을 바라며, 글을 마칩니다. Live long and prosper!참고UINavigationController - UIKit | Apple Developer Documentation글이정환 과장 | R&D 개발MA팀[email protected]브랜디, 오직 예쁜 옷만
조회수 936

중국 마케팅은 내 손안에! YDM차이나 '초언리'

안녕하세요, 매력만점의 옐로피플을 발굴해 소개하는 사내기자 Y의 인터뷰 그 16번째 이야기입니다! 이번 주인공은 바로 옐로디지털마케팅차이나에서 중국 마케팅을 담당하고 있는 초언리 대리입니다. 대륙의 그녀가 12년 전 낯선 한국 땅에 오게 된 계기는 바로 케이팝 때문이었다는데, 어떤 숨은 사연이 있을까요? 옐플의 첫 글로벌 옐로패밀리! 그녀의 이야기를 놓치지 마세요:)Y: 안녕하세요. 옐블 독자들을 위해 간략한 자기소개 부탁드려요:)안녕하세요, 옐블 독자 여러분! 옐로디지털마케팅차이나에서 중국 마케팅 운영을 담당하고 있는 초언리입니다. 반갑습니다:) Y: 옐플 인터뷰 사상 첫 외국인이세요! YDM차이나에서는 어떤 업무를 맡고 있나요? 영광입니다! YDM차이나에서 페이스북, 웨이보, 웨이신 등 다양한 SNS 채널을 운영하며 브랜드 마케팅을 담당하고 있습니다. 특히 요즘 한국을 찾는 중국 관광객들이 점점 많아지고 있는데, 그들을 타겟팅한 마케팅을 하는 거죠. 현재는 인천에 위치하고 있는 리조트를 담당하며 SNS 페이지를 만들어 중국인을 대상으로 프로모션 등의 마케팅을 진행하고 있습니다.Y: 마케팅이라는 직무를 선택하게 된 계기가 무엇인가요? 학생때부터 미디어 광고 분야에 관심이 많았습니다. 다양한 채널을 통해 다른 사람들에게 브랜드의 가치를 전달하는 일이 매력적으로 다가왔거든요. 그래서 한국으로 와 디지털미디어를 전공했고요. 졸업 후에는 한국에 오래 거주하며 체득한 현지 문화에 대한 이해도를 바탕으로 대중국 마케팅을 하면 잘 할 수 있을 거라는 생각이 들었습니다.Y: 한국어가 너무 유창하십니다! 한국에는 언제 오셨어요?고등학교를 졸업하고 2005년도에 한국에 처음 오게 됐어요. 대학을 여기서 졸업하고 일을 시작하고 보니 벌써 12년이 흘렀네요. 사실 고등학생때 유학이나 해외취업에는 전혀 관심이 없었습니다. 그런데 친구가 굉장한 케이팝 광팬이었어요. 친구에게 전파 당해서 케이팝에 빠져들게 됐고 한국 연예인을 보겠다는 일념으로 한국 유학을 결심하게 됐죠ㅋㅋㅋY: 오~ 어떤 연예인인지 여쭤봐도 될까요? 신화요♥ 12년부터 신화창조로 활동하고 있고 팬싸인회랑 콘서트도 꾸준히 가고 있어요! :)Y: YDM과는 어떻게 인연이 닿게 되었나요? 이전 직장에서 블로그 마케팅을 할 때 ‘위드블로그’와 마케팅 파트너로 일했어요. 이를 계기로 옐로스토리라는 회사를 알게 되었고 옐로스토리 안에 중국 마케팅팀이 있다는 사실을 알고 지원하게 됐습니다. 하고 싶었던 일 하면서 즐겁게 일하고 있어요:) Y: 특별한 취미나 사회경험이 있나요?직원분들을 대상으로 중국어를 가르치고 있어요ㅎㅎ 일주일에 한 번, 원하는 분들을 대상으로 수업을 진행하고 있는데, 보람도 있고 사람들과 친해질 기회도 많은 것 같아 좋습니다. 처음에는 중국어를 아예 못하던 분들이 저를 통해 배우면서 어느 정도 의사소통이 되는 것도 매우 보람있고 신기해요.Y: 중국어 수업! Y도 좀 듣고 싶네요 ㅠㅠ 나중에 기회가 된다면 언제든 환영입니다!! +_+Y: 일하면서 가장 보람을 느끼는 순간은 언제인가요? 브랜드 마케팅을 위해 페이지를 새로 개설해 운영을 담당했어요. 콘텐츠 관리부터 프로모션 기획까지 페이지에 많은 공을 들였는데, 어느 순간 팔로워수가 1만명이 넘어가더니 최근에는 7만명을 달성했어요. 가장 보람을 느낀 순간인 것 같아요.Y: 입사 후 가장 기억에 남는 재미있는 에피소드가 무엇인가요? 지난 12월 옐로스토리에서 연말 행사를 했습니다. 각 팀마다 장기자랑을 해서 이긴 팀에게 상품을 나눠주는 자리를 가졌어요. 모두가 퇴근한 후 사내카페에서 춤 연습을 하고 노래방에 가서 노래연습을 하는 등 그 준비 과정이 너무 즐거웠습니다. ㅎㅎY: 어떤 무대를 준비하셨는지 궁금합니다!!반전 무대를 준비했죠ㅋㅋㅋ 처음에는 여자 팀원들 셋이서 치파오를 입고 중국 발라드를 열창하다가 갑자기 남자 팀원 셋이 무대로 난입(?)하면서 박진영의 ‘허니’에 맞춰 춤을 췄어요. 세상에, 치파오를 입고 ‘허니’를 추는게 왜 그렇게 어렵던지ㅋㅋㅋ 아무튼 그 무대로 3등을 해서 상도 받았답니다! Y: YDM차이나와 함께 하면서 좋은 점은 무엇인가요? 한국인 직원들과 중국인 직원들이 서로 문화에 대한 이해도가 높고 새로운 문화에 대해 배우려는 자세가 정말 좋아요. 특히 장대규 대표님이 중국 직원들이 업무를 하는데 있어서 많은 도움을 주시면서 업무 적응 하는데 큰 역할을 해주고 계시죠:) Y: 앞으로는 어떤 일을 해보고 싶으세요? 마지막으로 옐로가족들에게 전하는 말씀도 부탁드립니다.현재는 리조트 분야만 담당하고 있지만 앞으로는 코스메틱 분야도 담당해보고 싶어요! 그리고 꾸준히 배워서 중국 마케팅 분야에 꼭 필요한 전문 인력이 되고 싶습니다. 앞으로도 잘 성장해 나갈테니 YDM차이나와 제가 함께 성장하는 모습 계속해서 지켜봐 주세요. 새해 복 많이 받으세요! 新年快乐!!
조회수 1168

​[인스팅터스] 이브에 속하다 (feat. 2주 된 따끈따끈한 인턴 첫 경험)

제 1막 휴학신청서를 내다 저는 대학교 2학년을 마치고 돌연 휴학을 선포했습니다. 그 이유는 이대로 계속 공부만 하다가는 아무런 비전이나 목표의식 없이 아무 회사나 들어가서 평생 월급의 노예로 살며 일하게 될 것 같다는 불안감 때문이었습니다. 죽어라 공부만 열심히 해서 일류대학에 오긴 했지만 정작 나 자신이 원하는 삶을 살고 있는지 돌아봤을 때는 성취감이나 만족, 보람을 느끼는 일 보다는 남들의 시선에 맞춰져서 남들이 부러워하는 삶, 돈과 명예를 추구하는 삶이 내 목표가 되어버린 현실을 깨달았습니다. 이때 문득 어린 시절의 꿈이 떠올랐습니다.  남에게 도움이 되고 이 사회에 도움이 되는 삶을 사는 것, 어렸을 때부터 저는 아프리카나 소외된 계층에 많은 관심을 가졌습니다. 하지만 각박한 입시현실과 사회생활에 내던져져 그 목표를 잊고 이기주의, 개인주의에 어느새 적응되어 살아가고 있던 제 자신을 발견했습니다. 저는 휴학 신청을 했고, 제가 원하는 삶을 추구하기 위해 한걸음 내디뎠습니다.제 2막 뭘 할지 모르겠다면 이것저것 다 해보자 저는 제가 무엇을 좋아하고 잘하는지 몰랐습니다. 그저 제가 노력파라는 점과 하나를 잡으면 끈질기게 놓지 않는다는 점만 알고 있었어요. 2018년이 되어 가장 먼저 한 활동은 글로벌 프론티어입니다. 글로벌 프론티어란 해외 탐방 프로그램인데요. 팀별로 주제를 직접 정하고 직접 탐방기관과 컨텍하여 기관 탐방 및 인터뷰 등을 하는 프로그램이었어요. 저는 여기서 ‘여성을 위한 여성에 의한 적정기술’을 주제로 잡아 유럽 탐방을 진행했고, 탐방을 다녀온 후에는 적정기술 동아리를 만들어서 현재까지도 활동하고 있답니다. (여기서 적정기술이란? 주로 개발도상국 지역의 문화적, 정치적, 환경적 면들을 고려하여, 삶의 질 향상과 빈곤 퇴치 등을 위해 적용되는 기술) 유럽 이외에도 태국, 필리핀에서는 APYE(Asia Pacific Youth Exchange)프로그램에 참여해서 각국의 청년들과 유엔에서 지정한 SDGs(Sustainable Development Goals)를 이용해 지역 문제를 해결하였고, 말레이시아에서 열린 SVYE(Social Venture Youth Exchange)에서는 비즈니스 모델까지 직접 설계하였습니다. 국내 프로그램으로는 희망한대 성동청년 문제해결 활동단을 시작으로 성동구 청년정책위원회의 문화 교육 분과장을 맡아 활동하고 있고, 한양여성공학인재양성센터 서포터즈와 한국여성과학기술인지원센터 서포터즈를 통해 홍보 캠페인, 카드뉴스 제작 등을 했습니다. 이 밖에도 기업의 CSR(기업의 사회공헌활동)교육을 한 학기 동안 들으며 휴학러지만 학교에 일주일에 2번 이상은 갔던 불상사를 맞기도 하였답니다. (눈물)제가 한 활동들은 공대라는 저의 전공과는 무관해 보일 수도 있지만 저는 그 속에서의 연관성을 느낄 수 있었습니다. (예를 들어, SDGs와 적정기술은 하나의 뿌리에서 파생된 개념이라는 사실^^) 또한 저의 활동들을 크게 묶어 보면 여성, 소셜, 기업, 기술이라는 뭔가 이브와 맞닿아 있는 듯한 느낌이 드는 건 저 뿐인가요? 제 3막 이브를 만나다 저는 성적 불평등이나 페미니즘, 성적 권리에 대해서 아무 생각이 없던 대학생에 불과했습니다. 하지만 공대라는 특성상 남성비율이 여성비율보다 많고 학교의 모 교수님조차 여성이 학생회장이 되면 안된다는 소리를 하신다는 걸 전해 들으며 아직 사회에 만연한 불합리성에 대해 생각해보았습니다. 이런 생각은 한양여성공학인재양성센터 서포터즈를 하면서 사회 인식을 개선하려는 활동으로까지 이어지게 된 것 같아요. 찾아보지 않아서 그렇지 우리 사회에는 아직 자리 잡고 있어서 나도 모르게 ‘성적인 것은 숨겨야해. 여자는 00해야 돼. 남자는 00해야 돼.’라는 이런 인식 속에 갇혀 살고 있던 것은 아닌지 저 자신도 돌아보게 되었지요. 앞서 다양한 활동을 하면서 저는 앞으로의 제 진로를 취업, 창업, 학업 연장 중에 고민하기 시작했습니다. 아직 취업에 대한 어떠한 경험도 해보지 못했기 때문에 학교에서 주관하는 겨울방학 단기 현장실습을 알아보게 되었습니다. 네0버, 카00트연구소, 서울0정 등 이름만 알면 유명한 회사와 공기업들이 많았지만 저는 이브에 눈길이 갈 수밖에 없었습니다. 무엇보다 제가 관심있는 소셜벤처, CSR, 성문제를 다루고 있는 유일한 기업이었고, 제 전공을 활용해 이런 활동들을 고려해볼 수 있는 좋은 경험이 될 것 같았습니다. 이브는 남들이 꺼려하는 성적권리를 표면에 내세워 사회공헌활동을 하는 유일한 기업이고, 무엇보다 청소년들에게 성교육을 하는 점이 마음에 들었습니다. 알아야 올바르게 대처하고 판단할 수 있는 것처럼 실제로 성교육이 올바르게 진행되지 않는 아프리카나 제 3세계에서는 그만큼 조산, 기형아, 성범죄율이 높게 나타나는 것을 보면 이브의 사회공헌 활동이 왜 사회적 잣대를 동시에 받는 지 이해되지 않았습니다. 제 4막 이브에 속하다. (Feat. 2주 된 따끈따끈한 인턴 첫 경험) 이브에 들어오기 전 회사 생활을 오래한 친한 언니들은 인턴은 무조건 상사 발 밑에서 잔심부름 다해야 된다는 거나 위계질서가 엄청 심할거라는 어마 무시한 말들을 들었습니다. 회사 첫날 긴장하고 출근했지만 의외로 회사 직원분들은 모두 친절했고 위계질서 따위는 존재하지도 않았습니다. 무엇보다 마음에 든 점은 모든 사원들이 나이나 직급에 상관없이 이름 뒤에 님 자를 붙여 00님으로 호칭하는 점이었습니다. 인턴은 이름 없이 “어이 인턴~”이렇게 불리는 경우가 많다 들었는데 저를 존대해가며 존중해주시는 직원분들이 계셔서 너무 감사했습니다. 또한 휴가제도(30분 씩 쓸 수 있는 점)와 이브 제품을 제공받을 수 있는 것, 읽고 싶은 책을 신청하면 사내 도서관을 통해 구입이 가능하고, 심지어 먹고 싶은 간식까지 직접 신청할 수 있다는 점이 특히 더 좋았습니다.(사심 가득) 보통 인턴은 컴퓨터 앞에만 앉아서 잡일 시키는 걸 다 해가며 배운다고 들었는데 이브에서는 일반 사원과 비슷한 일을 하고 저는 1, 2학년 때 배운 실험보다 이브에서 배운 실험이나 기구사용법이 더 알차고 재밌었습니다. 개인 프로젝트 측면에서도 제가 직접 아이디어 생성, 평가단계를 거쳐 인턴에 불과한 저지만 직접 시제품 생산까지 해볼 수도 있다는 말에 감격의 눈물을 흘리고야 말았던 거죠(이브 짱!) 앞으로의 이브에서의 프로젝트 진행을 통해 저도 이브도 함께 성장할 수 있는 계기가 되었으면 하는게 저의 작은 소망이랍니다^^ 마지막으로 분위기 최강 설계 구현팀(D&R)으로 들어와서 너무 행복하고, 앞으로 남은 시간 동안 잘 부탁드린다고 말씀드리고 싶어요~ evecondoms.com☘️생식 건강을 가장 먼저 생각하기에, 자연을 닮은 제품을 지향하기에, 소비자의 권리와 기업의 양심을 잃지 않기에 - 그래서 EVE는 성인용품이 아닌섹슈얼 헬스케어(Sexual healthcare) 브랜드입니다. 이브에 대해 더 알아보고 싶으시다면 지금 이브의 홈페이지에 방문해보세요:)Click me!
조회수 1324

페르소나웨이 오픈데이타 포럼 참석

다녀왔습니다~~ 화요일 아침에 귀국하고 오후에 오픈데이타 포럼에서 데이타를 사용하는 스타트업 사례 발표와 패널 토크를 했어요 :) 이번엔 진행 아니고 패널로! 호오...우리 사업으로 여러 분들 앞에서 피칭하는 두 번째 시간! 진행은 1도 안 떨리는데..으헝! 긴장돼🤣좋은 자리에 불러주셔서 감사합니다! 데이터 분석전문 여성 개발자느님을 영접해서 더 벅찼던 시간...패널로 초대해주셔서 감사합니다!.안녕하세요, 신체 사이즈 데이타를 기반으로 체형을 그룹으로 분류해서 각 그룹에 특화된 세미 커스토마이징 의류를 제작 및 큐레이팅하는 페르소나 웨이입니다! 요기에 이미지 컨설팅 데이타를 합쳐서 앉아있는 시간이 긴지, 활동량이 많은지 추구하시는 이미지가 무엇인지 등등의 라이프스타일 조건도 반영해가고 있습니다. 시간이 지날수록 더 날카로운 솔루션을 선보일꺼구요, 요걸 기반으로 다양한 체형이 쇼핑 스트레스, 스타일링 고민없이 이용할 수 있도로 타겟 그룹도 확장해갈꺼에요 :)첫 그룹은 66사이즈구요, 66이시라면 저희 옷 중 무엇을 입어도 찰떡 핏 보장!!(아. 상통, 하통. 전체통통 별 코멘트가 상세 페이지에 있습니다) 한 달 간의 시범 운영으로 여러 피드백을 받아 상세페이지 개편 중입니다. 다음 주를 기대해주세요😆.올라가기 전에 핀마이크 차고 입도 풀고..그런데 핀마크에 뽈 눌리는거 저 뿐입니꽈...'ㅅ'a .
조회수 2231

스포카 서버의 구조

안녕하세요. 스포카 개발팀에서 서버 관련 개발 업무를 담당하고 있는 문성원입니다. 오늘은 스포카 서버의 구조와 사용된 기술들에 대해서 함께 살펴보겠습니다.스택이란?먼저 스택(Stack)이란 용어에 대해서 함께 생각해보죠. 컴퓨터 과학을 공부하신 분들이라면 선입후출(FILO)이나 스택 오버플로우(Stack Overflow)등의 개념으로 익숙하실만한 용어기도 합니다. 그런데 서버 구조를 설명한다면서 왠 스택이냐구요? 다행히(?)도 지금부터 살펴 볼 스택은 솔루션 스택(Solution Stack)입니다. 스포카 서버라는 큰 솔루션이 원활히 동작하기 위해서 쓰이고 있는 각종 서브 시스템과 컴포넌트들의 묶음을 이야기하는 것으로 바꿔말하자면 이 글에서 다룰 기술 이야기는 모두 이 스택에 관한 이야기입니다.2011년 12월 현재 스포카 서버를 구성하고 있는 스택은 다음과 같습니다.DotcloudLinux 2.6.38.2nginx 0.8.53uwsgi 0.9.8.5Python 2.6.5Redis 2.2.2Celery 2.2.7Amazon Relational Database ServiceMySQL 5.5.12Amazon Simple Storage ServiceDotcloudDotcloud는 지금부터 설명드릴 스택을 묶어서 제공해주는 PaaS(Platform as a Service)의 일종입니다. Amazon Elastic Cloud Computing(Amazon EC2) 기반으로 동작하며 거기에 더해 손쉬운 확장과 배포가 장점입니다. 스포카 서버는 데이터베이스(Amazon RDS)와 업로드되는 데이터(Amazon S3) 이외의 모든 서비스를 Dotcloud를 통하여 제공하고 있습니다.nginx, uwsgi. 그리고 WSGI기본적으로 스포카 서버는 HTTP 형식의 요청을 받아 응답을 돌려주는 웹 어플리케이션입니다. 이러한 처리는 1차적으로 nginx를 통해 이뤄지는데, 이 중 서버사이드에서 처리가 필요한 경우에는 uwsgi라는 데몬이 이 처리를 담당합니다. (구버젼의 Apache Tomcat을 사용하시던 Java개발자분들은 Apache Tomcat과 Apache httpd와의 관계를 떠올리시면 편합니다.)이 경우 uwsgi는 일종의 어플리케이션 컨테이너(Application Container)로 동작하게 됩니다. 적재한 어플리케이션을 실행만 시켜주는 역할이죠. 이러한 uwsgi에 적재할 어플리케이션(스포카 서버)에는 일종의 규격이 존재하는데, 이걸 WSGI라고 합니다.(정확히는 WSGI에 의해 정의된 어플리케이션을 돌릴 수 있게 설계된 컨테이너가 uwsgi라고 봐야겠지만요.) WSGI는 Python표준(PEP-033)으로 HTTP를 통해 요청을 받아 응답하는 어플리케이션에 대한 명세로 이러한 명세를 만족시키는 클래스나 함수, (__call__을 통해 부를 수 있는)객체를 WSGI 어플리케이션이라고 합니다.정리하자면 스포카 서버는 WSGI에 맞게 작성된 프로그램을 nginx와 uwsgi를 통해 운용하여 요청을 처리하는 웹 어플리케이션이라고 할 수 있습니다.RedisRedis란 키-값(Key-Value) 저장 서버로 확장이 용이하며 속도가 우수합니다. 스포카 서버에선 이를 내부적인 임시 데이터 관리와 Celery의 작업(Task) 분배에 사용하고 있습니다.CeleryCelery는 Python으로 작성된 비동기 작업 큐(Asynchronous task queue/job queue)입니다. 앞서 소개한 작업(Task)를 브로커(Broker, 스포카 서버는 Redis를 사용)를 통해 전달하면 하나 이상의 워커(Worker)가 이를 처리하는 구조입니다. 포인트 적립-공유에 따른 분배처리, 포스팅 기능, 페이스북/트위터 공유등의 비동기 처리가 필요한 작업을 Celery에 위임하여 처리하고 있습니다.Amazon Relational Database Service대부분의 웹 어플리케이션과 마찬가지로 스포카 서버는 영속적으로 저장되어야하는 정보(회원 목록, 구매 내역)들을 디스크 기반의 데이터베이스(Database)에 저장합니다. Amazon Relational Database Service(Amazon RDS)는 Amazon EC2를 기반으로 그러한 데이터베이스를 간편하게 관리(모니터링, 백업, 접근제어)할 수 있게 도와주는 웹서비스입니다. Oracle과 MySQL을 지원하는데 스포카 서버는 그 중 MySQL을 사용하고 있습니다.Amazon Simple Storage ServiceAmazon Simple Storage Service(Amazon S3)는 Amazon RDS와 마찬가지로 Amazon EC2를 기반으로 한 데이터 저장 관리 서비스입니다. 스포카 서버에 업로드 되는 사진이나 문서등의 파일들을 통합하여 관리하여 서버의 인스턴스를 늘려 확장하는 경우에도 문제없이 대처할 수 있도록 하는 것이 주 목적입니다.#스포카 #스택 #개발 #개발자 #개발팀 #인사이트 #조언 #스킬스택 #스택설명
조회수 4967

Gradle Dependency 분리하기

본 포스팅은 아래 코드를 보시면 좀 더 이해하기 쉽습니다.build.gradledependencies-variable.gradledependencies-classpath.gradledependencies-app.gradleGradle 의 역할Gradle 은 이제 안드로이드 개발에 있어서 그 중심이 되는 빌드 환경입니다. 안드로이드 빌드에 대한 기본 설정 뿐만 아니라 빌드에 필요한 Task 를 지정하거나 의존성을 추가할 수 있습니다.특히 의존성에서 일반적인 서비스들은 다양한 오픈소스를 활용하게 됩니다. 네트워크 라이브러리, 이미지 라이브러리, DI 라이브러리, Support 라이브러리,Play-Service 라이브러리 등등 이젠 프로젝트를 시작함에 있어서 기본적으로 10개 이상의 라이브러리를 추가하게 됩니다. 이러한 라이브러리들이 많아질수록 필연적으로 빌드 스크립트가 길어지게 됩니다. 이는 나중에 빌드에 관련된 코드를 추가/수정할 때 유지보수에 영향을 끼치게 됩니다.Gradle 의존성 분리하기토스랩에서는 꽤 많은 숫자의 라이브러릴 사용하고 있습니다. 테스트용 라이브러리들까지 포함해서 60여개의 라이브러리를 쓰고 있습니다. 이러한 라이브러리 코드들이 1개의 빌드 스크립트 안에 포함되어 진다면 라이브러리의 버전을 변경하거나 수정하는 작업을 할 때에는 불가피하게 시간이 소요될 수 밖에 없습니다.그에 따라 Gradle 에서 라이브러리들을 변수화 해서 분리하는 작업을 하였습니다.1. 라이브러리 변수화 하기ext { retrofit = 'com.squareup.retrofit2:retrofit:2.1.0' retrofit2_gson = 'com.squareup.retrofit2:converter-gson:2.1.0' retrofit2_rxjava2 = 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:2.1.0' } 가장 간단한 변수화였습니다. 하지만 Retrofit 은 관련 라이브러리들이 함께 수반되기 때문에 버전명을 다시 분리하였습니다.2. 라이브러리 버전 변수화 하기ext { retrofit_version = '2.1.0' retrofit = "com.squareup.retrofit2:retrofit:$retrofit_version" retrofit2_gson = "com.squareup.retrofit2:converter-gson:$retrofit_version" retrofit2_rxjava2 = "com.jakewharton.retrofit:retrofit2-rxjava2-adapter:$retrofit_version" } 하지만 버전명과 라이브러리이름이 함께 있는 것이 깔끔해보이진 않습니다. 그래서 아래와 같이 바꿨습니다.3. 라이브러리 이름과 버전의 분리ext { retrofit = '2.1.0' } ext.dependencies = [ retrofit2 : "com.squareup.retrofit2:retrofit:$ext.retrofit", retrofit2_gson : "com.squareup.retrofit2:converter-gson:$ext.retrofit", retrofit2_rxjava2 : "com.jakewharton.retrofit:retrofit2-rxjava2-adapter:$ext.retrofit_rxjava2", ] 실제에는 다음과 같이 사용하면 됩니다.dependencies { compile rootProject.ext.dependencies.retrofit2 compile rootProject.ext.dependencies.retrofit2_gson compile rootProject.ext.dependencies.retrofit2_rxjava2 } 이제 라이브러리를 변수화 해서 분리를 하였습니다.이제 변수로 지정한 라이브러리들은 build.gradle 파일안에 존재하게 됩니다.// build.gradle ext { retrofit = '2.1.0' } ext.dependencies = [ retrofit2 : "com.squareup.retrofit2:retrofit:$ext.retrofit", retrofit2_gson : "com.squareup.retrofit2:converter-gson:$ext.retrofit", retrofit2_rxjava2 : "com.jakewharton.retrofit:retrofit2-rxjava2-adapter:$ext.retrofit_rxjava2", ] buildscript { // blah blah } 라이브러리가 3개뿐이니 깔끔해보이는군요. 하지만 토스랩의 라이브러리는 60여개 입니다. 변수명도 60여개라는 말이죠. 그래서 라이브러리 변수들만 파일을 분리하기로 했습니다.4. 라이브러리 변수를 파일로 분리하기// dependencies-variable.gradle ext { retrofit = '2.1.0' } ext.dependencies = [ retrofit2 : "com.squareup.retrofit2:retrofit:$ext.retrofit", retrofit2_gson : "com.squareup.retrofit2:converter-gson:$ext.retrofit", retrofit2_rxjava2 : "com.jakewharton.retrofit:retrofit2-rxjava2-adapter:$ext.retrofit_rxjava2", ] // build.gradle apply from :'dependencies-variable.gradle' buildscript { // blah blah } 이제 좀 교통정리가 되어가는 기분이네요.하지만 app 의 build.gradle 을 보았습니다.// app 의 build.gradle apply plugin: 'com.android.application' dependencies { // 라이브러리 60개 compile rootProject.ext.dependencies.library.retrofit2 compile rootProject.ext.dependencies.library.retrofit2_gson compile rootProject.ext.dependencies.library.retrofit2_rxjava2 } android { // 중략 } 뭔가 잘못되어 가고 있습니다. 여전히 dependencies 가 큰 부분을 차지하고 있습니다.5. app.dependencies 분리하기이제 dependencies 를 분리할 차례입니다.// dependencies-app.gradle repositories { jcenter() } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile rootProject.ext.dependencies.library.retrofit2 compile rootProject.ext.dependencies.library.retrofit2_gson compile rootProject.ext.dependencies.library.retrofit2_rxjava2 compile rootProject.ext.dependencies.library.okhttp3 compile rootProject.ext.dependencies.library.okhttp3_logging compile rootProject.ext.dependencies.library.stetho_okhttp3 } // app 의 build.gradle apply from: 'dependencies-app.gradle' 이제 dependencies 와 관련된 스크립트가 분리되었습니다.하지만 저 apply from 이 항상 app 의 build.gradle 에 따라 붙어야 하는 것이 아쉽습니다. 그래서 buildscript 에 아예 추가하기로 하엿습니다.6. 빌드 스크립트에 dependencies 추가 동작하기먼저 빌드 스크립트용 스크립트를 만들겠습니다.// dependencies-classpath.gradle rootProject.buildscript.repositories { jcenter() } rootProject.buildscript.dependencies { classpath rootProject.ext.dependencies.classpath.android } 그리고 buildscript 가 시작될 때 모든 dependencies 스크립트가 인식할 수 있게 하겠습니다. 인식할 스크립트는 다음과 같습니다.dependencies-variable.gradle - 라이브러리 변수 저장dependencies-classpath.gradle - 빌드용 스크립트 저장dependencies-app.gradle - 라이브러리 추가 스크립트 저장rootProject 의 build.gradle 를 아래와 같이 변경합니다.// rootProject 의 build.gradle buildscript { apply from: "dependencies-variable.gradle" apply from: "dependencies-classpath.gradle" } apply from: 'dependencies-app.gradle' 위와 같이 변경을 하면 빌드스크립트가 동작하는 시점에 변수를 인식하고 빌드용 스크립트를 인식합니다.하지만 앱용 라이브러리 추가 스크립트는 아직 준비가 덜 되었습니다. “app” 프로젝트가 인식이 된 시점에 라이브러리가 추가되어야 하기때문에 처음 만들었던 스크립트로는 한계가 있습니다.그래서 아래와 같이 변경하겠습니다.// dependencies-app.gradle rootProject.allprojects { project -> if (project.name == 'app') { project.afterEvaluate { repositories { jcenter() } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile rootProject.ext.dependencies.library.retrofit2 compile rootProject.ext.dependencies.library.retrofit2_gson compile rootProject.ext.dependencies.library.retrofit2_rxjava2 } } } } afterEvaluate 는 프로젝트의 인식이 완료되면 동작이 되는 함수이기 때문에 모든 것이 끝나고 dependencies 가 추가되는 것으로 이해하시면 됩니다.정리위의 과정을 거침으로써 gradle 파일은 좀 더 나뉘었지만 app 의 build.gradle 은 안드로이드 프로젝트 그 자체에 집중 할 수 있도록 하였습니다.이렇게 나누었던 본래의 목적은 의존성 라이브러리와 코드 품질 관리용 스크립트가 1개의 스크립트 파일에 담겨지면서 관리하는 데 있어서 큰 문제가 발생하게 되었습니다. 그에 따라 각각을 나누고 그 목적에 맞도록 각가의 파일 만들었습니다.라이브러리의 변수용 파일buildscript 용 classpath 를 관리하는 파일본 프로젝트의 라이브러리 의존성 관리 파일참고 소스Github : https://github.com/ZeroBrain/DataBind-MVVM-Sample#토스랩 #잔디 #JANDI #개발 #개발후기 #인사이트
조회수 1028

스타트업, 사대주의에 빠지지 말자.

하지만, 탈한국적이라는 것이 사대주의를 의미하는 것은 아니다.분명한 것은 한국적인 환경이 더 좋지 않다는 것을 의미하는 것이지 미국이나 일본, 중국의 환경만을 부러워하는 것은 아니다. 아주 단순하게 일반화시켜서 그들의 환상적인 성공사례만 수집해서 이야기하려고 하는 것도 아니다.정말 중요하게 전달하고 싶은 메시지는 한국적인 환경은 정말 암울하다고 경고하고 싶을 뿐이다.미국에서 창업하거나 M&A 이후에 가볍게 버림받는 것은 너무도 당연한 것인지도 모른다. 오히려, 국내 특정 대기업의 분위기는 한번 식구로 받아들여지면 쉽게 내치지 않는 문화를 가진 특정 상황들도 있다고 이야기할 수 있다.하지만, 그런 케이스들은 특정 케이스 들일뿐, 대부분의 분위기는 어느 정도 일반화되어있다고 이야기하겠다.사실, 계약관계에 의해서 더 이상 단물이 나오지 않는 조직과 사람에 대해서 가차 없이 인사관계를 진행하는 것은 미국적인 관행이 더 살벌하게 받아들여질 가능성이 더 높다고 이야기한다.하지만, 최소한 그들은 법적인 단계나 계약서를 뛰어넘는 행위에 대해서는 윤리적인 행위에 대해서 대부분은 지키려 한다고 이야기하겠다.국내 대기업들처럼 유망하거나 의미 있는 서비스를 만든 중소기업과 유사한 제품을 만들거나, 더 싸게 하기 위해서 비슷한 기업들에게 해당 기업의 노하우를 비공식적으로 공개한다던지 하는 행위는 분명하지 막 매우 적다.그들의 세계에서 그른 올바르지 않은 행위들이 자신의 신뢰를 깎아먹는 것인지에 대해서 너무도 잘 알고 있기 때문이다.그래서, 대부분 그들의 세계는 신뢰와 계약, 윤리적인 단계에 의해서 시스템이 움직인다. 그래서, 그들은 계약관계가 끝나거나 계약에 의해서 정해진 목적이 부족하다고 생각하면 가차 없이 잣대를 들이댄다.가끔 제가 글을 올리는 것에 대해서 너무 심한 일반화가 아니냐는 비판을 하시는 분도 계신다. 물론, 그 의견에도 공감한다. 왜냐하면 내가 글을 올리는 것은 내 경험을 기반으로 나열되는 것일 뿐, 완전 일반화가 되는 이야기가 아니기 때문이다.그냥, 내 경험상 그랬다는 것이고, 후배들에게 조금이라도 그 경험적인 가치에 대해서 전달하고 싶을 뿐이다. 가능한 많은 실패에 대해서 많이 전달하는 것 그것이 선배가 경험한 것을 최소한 전달해야 한다고 느끼기 때문이다.한국이건 중국이건 일본, 미국이건 스타트업을 만들고 생태계를 넘어서서 무언가 혁신을 이룬다는 것은 정말 매우 힘든 행위이다. 하지만, 불행한 것은 불행하다고 이야기해야 하는 것이 선배 된 입장이라고 생각한다.기존의 악습과 관습을 그대로 유지해야 시스템에서 받아들여주지, 그것을 조금만 벗어나려고 한다면, 수많은 잣대와 기준으로 사업 자체를 틀어막는 행위가 가장 극심한 나라가 한국이라고 악평을 해야겠다.차라리 틀이 잘 짜인 일본의 생태계를 성급하게 일반화시킨다면, 정해진 룰을 넘어선 방법으로 소비자들과 공급자를 연결하는 방법을 고안한다면 해당 시스템에 대해서 진지하게 기존 생태계가 바라보며, 그 혁신적인 시스템이 그대로 사장되지 않도록 보호하려고 애를 쓴다. 다만, 그 속도가 너무 느리기 때문에 일본의 시스템이 불안해 보이는지도 모르겠다.하지만, 일본의 시스템은 그런 움직임이 조금씩 진보적으로 움직인다.중국의 경우에는 악습이나 관습이 완전하게 경제 시스템 전체를 지배하고 있지 않기 때문에 매우 혁신적인 시스템이 시장에 도입되고 사용되는 것에 대해서 굉장히 빠른 속도로 움직이다. 일종의 불협화음 마저도 혁신의 속도의 과실까지 시스템이 허용하고 있다는 것을 느낀다.각 국가마다 나름대로 혁신을 포용하는 방법이 다르다.느리다는 일본도 다양한 방식으로 경제활동이 파급되도록 시스템이 개방되고 있다. 중국이나 미국은 두말을 할 이유가 없다.하지만, 한국은 아니다.슬프게도 꼰대들이 만들어 놓은 기존 시스템이 가진 관습을 그대로 유지해야 한다.헬스케어이건 금융이건 똑같다. 한국적 창조경제의 핵심은 그러하다. '기존의 악습과 관습이 유지되는 혁신'을 하라는 것이다.그 말이 가능한지 모르겠지만, 그렇게 사용되고 있다. 매우 창조적으로...하지만, 희망은 버리지 않고 있다. 우리가 분명하게 할 수 있는 일들이 많으며, 주변의 스타트업은 국내의 상황과 꼰대들의 바람과는 다르게 움직이고 있다.굳이 한국적인 서비스를 만들지 않으며, 꼰대들이 만들어 놓은 생태계에 몰입하지 않으며, 중국보다 더 디테일한 서비스를 만들며, 일본보다 빠르게 움직이고, 미국보다 더 창의적이고 지식기반으로 움직이는 사업들이 분명 존재한다.그런 멋진 후배들에게서 한국의 미래를 발견한다. 다들 파이팅이다!

기업문화 엿볼 때, 더팀스

로그인

/