스토리 홈

인터뷰

피드

뉴스

조회수 2970

ReactorKit 시작하기

ReactorKit 시작하기오늘은 StyleShare에서 ReactorKit을 사용한지 딱 1년이 되는 날입니다. ReactorKit은 반응형 단방향 앱을 위한 프레임워크로, StyleShare와 Kakao를 비롯한 여러 기업에서 사용하고 있는 기술입니다.StyleShare의 iOS 프로젝트 첫 커밋은 2011년 8월 23일입니다. 그 뒤로 약 7년간 크고 작은 기능을 추가하며 굉장히 큰 코드베이스를 가지게 되었습니다. 특히 2015년에는 스토어 기능을 런칭하면서 기존 서비스 만큼이나 많은 코드를 작성했습니다. 서비스 복잡도는 점점 높아졌고, 지속 가능한 코드베이스를 위해 많은 개선이 필요했습니다.ReactorKit은 많은 부분에 있어서 StyleShare가 가진 고민을 해결해주었습니다. Flux와 Reactive Programming의 개념을 결합하여 만들어진 ReactorKit에서는 사용자 인터랙션과 뷰 상태가 관찰 가능한 스트림을 통해 단방향으로 전달됩니다. 뷰와 비즈니스 로직을 분리할 수 있게 되면서 모듈간 결합도가 낮아지고 테스트하기 쉬워졌습니다. 또한, 자칫 복잡해질 수 있는 비동기 코드를 일관되게 작성할 수 있게 되었습니다.이 글에서는 ReactorKit의 기본 개념과 테스트를 위한 기법을 소개 합니다.데이터 흐름ReactorKit에는 뷰(View)와 리액터(Reactor)라는 개념이 존재합니다. 뷰는 상태를 표현합니다. 뷰 컨트롤러나 셀도 모두 뷰에 해당합니다. 뷰는 사용자 인터랙션을 추상화하여 리액터에 전달하고, 리액터에서 전달받은 상태를 각각의 뷰 컴포넌트에 바인드합니다. 뷰는 비즈니스 로직을 수행하지 않습니다.반대로, 리액터는 뷰의 상태를 관리합니다. 뷰에서 액션을 전달받으면 비즈니스 로직을 수행한 뒤 상태를 변경하여 다시 뷰에 전달합니다. 리액터는 UI 레이어에서 독립적이기 때문에 비교적 테스트하기 쉽습니다.ViewView 프로토콜을 적용하면 뷰를 정의할 수 있습니다. DisposeBag 속성과 bind(reactor:) 메서드를 필수로 정의해야 합니다.import ReactorKit import RxSwift class UserViewController: UIViewController, View { var disposeBag = DisposeBag() func bind(reactor: UserViewReactor) { } }<iframe width="700" height="250" data-src="/media/78a16e327ba4eb073cc5bdbb703c81f9?postId=c7b52fbb131a" data-media-id="78a16e327ba4eb073cc5bdbb703c81f9" data-thumbnail="https://i.embed.ly/1/image?url=https://avatars2.githubusercontent.com/u/931655?s=400&v=4&key=a19fcc184b9711e1b4764040d3dc5c07" class="progressiveMedia-iframe js-progressiveMedia-iframe" allowfullscreen="" frameborder="0" src="https://medium.com/media/78a16e327ba4eb073cc5bdbb703c81f9?postId=c7b52fbb131a" style="display: block; position: absolute; margin: auto; max-width: 100%; box-sizing: border-box; transform: translateZ(0px); top: 0px; left: 0px; width: 700px; height: 236.984px;">이 프로토콜을 정의하면 reactor 속성이 자동으로 생성됩니다. 이 속성에 새로운 값이 지정되면 bind(reactor:) 메서드가 자동으로 호출됩니다. 이곳에는 사용자 인터랙션을 리액터에 바인드하거나, 리액터의 상태를 각각의 뷰 컴포넌트에 바인드하는 코드를 작성합니다.func bind(reactor: UserViewReactor) { // Action self.followButton.rx.tap .map { Reactor.Action.follow } .bind(to: reactor.action) .disposed(by: self.disposeBag) // State reactor.state.map { $0.isFollowing } .distinctUntilChanged() .bind(to: self.followButton.rx.isSelected) .disposed(by: self.disposeBag) }<iframe width="700" height="250" data-src="/media/6a6d5aa66b156cae7d4475f6ed13efb0?postId=c7b52fbb131a" data-media-id="6a6d5aa66b156cae7d4475f6ed13efb0" data-thumbnail="https://i.embed.ly/1/image?url=https://avatars2.githubusercontent.com/u/931655?s=400&v=4&key=a19fcc184b9711e1b4764040d3dc5c07" class="progressiveMedia-iframe js-progressiveMedia-iframe" allowfullscreen="" frameborder="0" src="https://medium.com/media/6a6d5aa66b156cae7d4475f6ed13efb0?postId=c7b52fbb131a" style="display: block; position: absolute; margin: auto; max-width: 100%; box-sizing: border-box; transform: translateZ(0px); top: 0px; left: 0px; width: 700px; height: 325px;">Reactor리액터를 정의하기 위해서는 Reactor 프로토콜을 사용합니다. 사용자 인터랙션을 표현하는 Action과 뷰의 상태를 표현하는 State, 그리고 상태를 변경하는 가장 작은 단위인 Mutation을 클래스 내부에 필수로 정의해야 합니다. 또한 가장 첫 상태를 나타내는 initialState가 필요합니다.import ReactorKit import RxSwift final class UserViewReactor: Reactor { enum Action { case follow } enum Mutation { case setFollowing(Bool) } enum State { var isFollowing: Bool } let initialState: State = State(isFollowing: false) }<iframe width="700" height="250" data-src="/media/572f53fb442c67060d2a69f90a42a07b?postId=c7b52fbb131a" data-media-id="572f53fb442c67060d2a69f90a42a07b" data-thumbnail="https://i.embed.ly/1/image?url=https://avatars2.githubusercontent.com/u/931655?s=400&v=4&key=a19fcc184b9711e1b4764040d3dc5c07" class="progressiveMedia-iframe js-progressiveMedia-iframe" allowfullscreen="" frameborder="0" src="https://medium.com/media/572f53fb442c67060d2a69f90a42a07b?postId=c7b52fbb131a" style="display: block; position: absolute; margin: auto; max-width: 100%; box-sizing: border-box; transform: translateZ(0px); top: 0px; left: 0px; width: 700px; height: 435px;">Action이나 State와 달리 Mutation은 리액터 클래스 밖으로 노출되지 않습니다. 대신, 클래스 내부에서 Action과 State를 연결하는 역할을 수행합니다. Action이 리액터에 전달되면 두 단계를 거쳐서 뷰의 상태를 변경합니다.mutate() 함수에서는 Action 스트림을 Mutation 스트림으로 변환하는 역할을 합니다. 이곳에서 네트워킹이나 비동기로직 등의 사이드 이펙트를 처리합니다. 그 결과로 Mutation을 방출하면 그 값이 reduce() 함수로 전달됩니다. reduce() 함수는 이전 상태와 Mutation을 받아서 다음 상태를 반환합니다.func mutate(action: Action) -> Observable { switch action { case .follow: return UserService.follow() .map { Mutation.setFollowing(true) } .catchErrorJustReturn(Mutation.setFollowing(false)) case .unfollow: return UserService.unfollow() .map { Mutation.setFollowing(false) } .catchErrorJustReturn(Mutation.setFollowing(true)) } } func reduce(state: State, mutation: Mutation) -> State { var newState = state switch mutation { case let setFollowing(isFollowing): newState.isFollowing = isFollowing } return newState }<iframe width="700" height="250" data-src="/media/dc8fbdce8314a7eba99be944241c5432?postId=c7b52fbb131a" data-media-id="dc8fbdce8314a7eba99be944241c5432" data-thumbnail="https://i.embed.ly/1/image?url=https://avatars2.githubusercontent.com/u/931655?s=400&v=4&key=a19fcc184b9711e1b4764040d3dc5c07" class="progressiveMedia-iframe js-progressiveMedia-iframe" allowfullscreen="" frameborder="0" src="https://medium.com/media/dc8fbdce8314a7eba99be944241c5432?postId=c7b52fbb131a" style="display: block; position: absolute; margin: auto; max-width: 100%; box-sizing: border-box; transform: translateZ(0px); top: 0px; left: 0px; width: 700px; height: 522.984px;">테스팅테스트를 위해 가장 먼저 고민하게 되는 것은 ‘무엇을 테스트할 것인가’에 대한 것입니다. ReactorKit을 사용하면 뷰와 로직이 분리되어 상대적으로 쉽게 해답을 얻을 수 있습니다.View사용자 인터랙션이 발생했을 때 Action이 리액터로 잘 전달되는지리액터의 상태가 바뀌었을 때 뷰의 컴포넌트 속성이 잘 변경되는지ReactorAction을 받았을 때 원하는 State로 잘 변경되는지뷰 테스팅리액터의 stub 기능을 이용하면 뷰를 쉽게 테스트할 수 있습니다. stub 기능을 활성화하면 리액터가 받은 Action을 모두 기록하고, mutate()와 reduce()를 실행하는 대신 외부에서 상태를 설정할 수 있게 됩니다.func testAction_refresh() { // 1. Stub 리액터를 준비합니다. let reactor = MyReactor() reactor.stub.isEnabled = true // 2. Stub된 리액터를 주입한 뷰를 준비합니다. let view = MyView() view.reactor = reactor // 3. 사용자 인터랙션을 발생시킵니다. view.refreshControl.sendActions(for: .valueChanged) // 4. Reactor에 액션이 잘 전달되었는지를 검증합니다. XCTAssertEqual(reactor.stub.actions.last, .refresh) } func testState_isLoading() { // 1. Stub 리액터를 준비합니다. let reactor = MyReactor() reactor.stub.isEnabled = true // 2. Stub된 리액터를 주입한 뷰를 준비합니다. let view = MyView() view.reactor = reactor // 3. 리액터의 상태를 임의로 설정합니다. reactor.stub.state.value = MyReactor.State(isLoading: true) // 4. 그 때 뷰 컴포넌트의 속성이 잘 변하는지를 검증합니다. XCTAssertEqual(view.activityIndicator.isAnimating, true) }<iframe width="700" height="250" data-src="/media/9e5e0349766c69076a5081cbd680645b?postId=c7b52fbb131a" data-media-id="9e5e0349766c69076a5081cbd680645b" data-thumbnail="https://i.embed.ly/1/image?url=https://avatars2.githubusercontent.com/u/931655?s=400&v=4&key=a19fcc184b9711e1b4764040d3dc5c07" class="progressiveMedia-iframe js-progressiveMedia-iframe" allowfullscreen="" frameborder="0" src="https://medium.com/media/9e5e0349766c69076a5081cbd680645b?postId=c7b52fbb131a" style="display: block; position: absolute; margin: auto; max-width: 100%; box-sizing: border-box; transform: translateZ(0px); top: 0px; left: 0px; width: 700px; height: 721px;">리액터 테스팅리액터는 뷰에 비해서 상대적으로 테스트하기 쉽습니다. Action이 전달되었을 때 비즈니스 로직을 수행하여 State가 바뀌는지를 확인하면 됩니다.func testBookmark() { // 1. 리액터를 준비합니다. let reactor = MyReactor() // 2. 리액터에 액션을 전달합니다. reactor.action.onNext(.toggleBookmarked) // 3. 리액터의 상태가 변경되는지를 검증합니다. XCTAssertEqual(reactor.currentState.isBookmarked, true) } func testUnbookmark() { // 1. 리액터를 준비합니다. 액션을 미리 한 번 전달해서 테스트 환경을 만들어둡니다. let reactor = MyReactor() reactor.action.onNext(.toggleBookmarked) // 2. 리액터에 액션을 한 번 더 전달합니다. reactor.action.onNext(.toggleBookmarked) // 3. 리액터의 상태가 변경되는지를 검증합니다. XCTAssertEqual(reactor.currentState.isBookmarked, false) }<iframe width="700" height="250" data-src="/media/32af3eac8c1c9646bf95ea1442ad8ff4?postId=c7b52fbb131a" data-media-id="32af3eac8c1c9646bf95ea1442ad8ff4" data-thumbnail="https://i.embed.ly/1/image?url=https://avatars2.githubusercontent.com/u/931655?s=400&v=4&key=a19fcc184b9711e1b4764040d3dc5c07" class="progressiveMedia-iframe js-progressiveMedia-iframe" allowfullscreen="" frameborder="0" src="https://medium.com/media/32af3eac8c1c9646bf95ea1442ad8ff4?postId=c7b52fbb131a" style="display: block; position: absolute; margin: auto; max-width: 100%; box-sizing: border-box; transform: translateZ(0px); top: 0px; left: 0px; width: 700px; height: 522.984px;">마치며ReactorKit은 지금까지 CocoaPods에서 약 3만 7천회 다운로드 되었고, 약 730개 앱에서 사용되고 있습니다. 최근에는 Wantedly에서 사용하며 일본에서도 많은 호응을 얻고 있습니다. 공개된지 1년밖에 되지 않았지만 굉장히 좋은 평을 받으며 성장하고 있는 프레임워크입니다. 만약 새로운 프로젝트를 시작하거나, StyleShare와 비슷한 고민을 하고 계신다면 ReactorKit을 강력하게 추천합니다.ReactorKit GitHublet’Swift 2017 ReactorKit 발표 영상let’Swift 2017 ReactorKit 발표 자료#스타일쉐어 #개발팀 #개발자 #경험공유 #인사이트
조회수 5175

유용한 Javascript UI Component 라이브러리 소개

웹 애플리케이션을 개발할 때 기능적으로는 무관하지만, 사용자에게 인터렉티브하고 심미적으로 예쁜 디자인을 제공하고 싶은 경험이 있을 것입니다. 하지만 막상 직접 구현을 하는 것은 생각보다 시간이 오래 걸리고, 구현하더라도 양질의 UI가 나오지 않는 경우들이 있습니다. 그래서 이번 글에서는 쉽고 빠르게 양질의 UI를 제공해주는 라이브러리를 소개해 드리려고 합니다.Spin.js작업을 완료하거나 페이지가 넘어갈 때 아무런 말도 없이 그냥 기다리는 경우가 있습니다. 이럴 경우 사용자에게 현재 기다리는 중이라는 것을 표현하는 것이 좋습니다. 이러한 기능을 제공해주는 라이브러리가 바로 Spin.js입니다.Spin.js는 위의 그림과 같이 로딩 중이나 무언가를 진행 중이라는 것을 알려주는 사용하기 쉬운 Javascript 라이브러리입니다. 이미지 없이 사용되어 매우 가볍게 사용할 수 있습니다. 그리고 사용할 때 쉽게 설정하여 사용할 수 있으며 대다수 브라우저를 지원합니다.Spin.js / DownloadDatatables많은 양의 정보를 쉽게 볼 수 있도록 테이블로 정리해야되는 경우가 있습니다. 그러나 많은 양의 정보를 처리할 때 쉽게 원하는 정보를 찾을 수 있어야 하고 정보가 쉽게 정렬이 될 수 있어야 합니다. 이러한 기능을 제공해주는 라이브러리가 바로 Datatables입니다.Datatables는 위의 그림과 같이 테이블을 동적인 테이블을 만들어주는 JQuery Javascript 라이브러리입니다. 다양하게 정렬할 수 있도록 테이블을 만들수 있으며, 따로 정보를 찾아주는 기능을 만들어주지 않아도 검색을 할 수 있는 기능을 제공하고, 정보를 편하게 볼 수 있도록 구성을 제공합니다. 그리고 DOM, Ajax, Server-Side Processing으로 쉽게 정보를 Datatables로 만들 수 있습니다.DatatablesCurtain.js긴 내용으로 된 하나의 페이지를 섹션별로 효과적으로 내용을 전환해야 되는 경우가 있습니다. 그러나 사용자에게 혼란을 주지 않으면서 전환 효과를 만들어 내야 합니다. 이러한 기능을 제공해주는 라이브러리가 바로 Curtain.js입니다.Curtain.js는 위의 그림과 같이 마치 커튼이 걷히는 것처럼 내용 전환 효과를 주는 JQueryJavascript 라이브러리입니다. 각 내용을 화면에 고정하고 스크롤이나 키보드를 통해 화면을 전환하여 트렌디하면서 인터렉티브한 느낌을 쉽게 제공할 수 있습니다.Curtain.js / DownloadTurn.js위의 Curtain.js가 세로형태의 전환 효과를 내는 것이었다면 가로형태의 전환 효과를 내야 하는 경우가 있습니다. 이러한 기능을 제공해주는 라이브러리가 바로 Turn.js입니다.Turn.js는 위의 그림과 같이 책장을 넘기는 듯한 내용 전환 효과를 주는 JQuery Javascript 라이브러리입니다. 하나에 페이지를 섹션별로 나눠서 키보드를 통해 화면을 전환하여 책장을 넘기는 느낌을 제공해 스마트폰이나 태블릿에서 책을 읽는 듯한 느낌을 쉽게 제공할 수 있습니다.Turn.js / DownloadGlfx.js이미지를 따로 수정해서 올리는 것이 아니라 웹에서 바로 밝기를 조정하거나 다양한 효과를 주고 싶은 때도 있습니다. 이러한 기능을 제공해주는 라이브러리가 바로 Glfx.js입니다.Glfx.js는 위의 그림과 같이 다양한 효과를 주는 WebGL기반의 Javascript 라이브러리입니다. 이미지에 Blur 효과, 세피아, 밝기 조절, 모자이크처리 등 다양한 효과를 다양한 설정을 통해 쉽게 사용 할 수 있습니다. 그러나 WebGL 기반으로 되어 있어서 WebGL을 지원하는 브라우저만 가능합니다.Glfx.js / DownloadJQuery Tag-it태그를 넣을 때 쉽게 수정 가능하게 하고 자동완성기능을 넣고 싶은 때도 있습니다. 이러한 기능을 제공해주는 라이브러리가 바로 JQuery Tag-it입니다.JQuery Tag-it은 위의 그림과 같이 태그에 대한 JQuery Javascript 라이브러리입니다. 쉽게 태그를 넣고 지울 수 있으며 태그에 대해 자동완성 기능을 지원합니다. 그리고 각 태그에 대해 이벤트를 줄 수 있어서 매우 유용하게 사용하실 수 있습니다.JQuery Tag-it / DownloadTinycon새 글의 개수나 접속자 수에 대한 정보를 사용자에게 알리고 싶은 때도 있습니다. 이럴 경우 브라우저 탭에 정보를 제공하는 경우가 있습니다. 이러한 기능을 제공해주는 라이브러리가 바로 Tinycon입니다.Tinycon는 위의 그림과 같이 파비콘에 동적인 숫자를 통해 정보를 알리는 Javascript 라이브러리입니다. 매우 쉽게 사용할 수 있으며, 설정을 통해 어떤 내용을 숫자로 표현할 것인지를 쉽게 사용자화 할 수 있습니다. 파비콘에 경우 브라우저 탭에 항상 보이기 때문에 아주 유용하게 사용할 수 있을 것 같습니다. 그러나 현재 크롬, 파이어폭스, 오페라 브라우저만이 지원 가능합니다.Tinycon / Download3D GALLERY사진이나 슬라이드 탭을 보여주기 위해 갤러리 공간을 만듭니다. 그래서 좀 더 효과적으로 보여주기 위해 다양한 효과를 넣는 경우가 있습니다. 이러한 기능을 제공해주는 라이브러리가 바로 3D GALLERY입니다.3D GALLERY는 위의 그림과 같이 내용을 3D로 나열해 보여주는 JQuery Javascript 라이브러리입니다. 간단한 설정으로 3D로 배치하고 움직이도록 할 수 있습니다. 그리고 자동으로 내용을 넘어가게 할 수도 있고 다양하게 바뀌는 효과를 줄 수 있습니다.3D GALLERY / Demo글을 마치면서이번 글에서는 UI Component Javascript 라이브러리들에 대해 알아봤습니다. 위의 라이브러리로 좀 더 쉽고 빠르게 양질의 웹 애플리케이션을 개발할 수 있었으면 좋겠습니다.#스포카 #개발자 #디자이너 #협업 #Javascript #라이브러리 #꿀팁 #유용한정보
조회수 1171

왕에게서 배우는 스타트업(2)

임진왜란 하면다들 이순신 장군에게 환호하고,선조를 실책이 많은 임금으로 기억한다.뭐...나도 좀 아쉽게 생각하는 면이 많다.일부러 그런 것은 아니겠지만...몇 가지 중대한 실수와 행동들은참... 상식 밖이다.1. 선조를 통해 리더십을 경계한다.우선 선조가 즉위하였을 때,적어도 그때까지는그래도 괜찮아 보였다.나름 왕권도 강화하고,무난했다.아니 오히려,잘할 수 있었다고나 할까?이이, 이황, 류성룡, 이항복 등한 번쯤 들어 봤을 봄 직한 든든한 신하도 있었다.잘 나갈 수 있는 스타트업 같은 느낌!그리고 거북선이 하루아침에 뚝딱 만들어진 게 아니다.이미 임진왜란 전부터 거북선은 건조되어 있었다.군대가 힘이 없는 것도 아니었다.솔직히 당시 군대 편성이 정규군 위주가 아니라전시에 편제에 따라 동원되는 형태였기에급작스런 전란에 대응이 늦은 것이지...제대로 일본과 붙었다면,그리 쉽게 물러나지 않았을 전투력이었다.그것을 증명하는 것이조선군이 재정비된 이후,일본군이 연전연패하며 후퇴한 점이다.(물론 General Lee께서 보급을 끊어주셨기에 가능했지만)여기까지 되짚어볼 것은스타트업으로 비유하자면,꽤 해 볼만한 상황이었다.문제는 이제부터 리더의 상황판단 미스와사적인 감정이입으로 망쳐진 사례이다.뚜둥~~!!외세 침략(임진왜란)이 발생한다.물론 임진왜란은 일본의 상황에 의한외부 리스크라고 볼 수 있다.어쨌든 리스크가 터져 나왔다.이제는 수습을 해야 하는데....경쟁사가 속전속결로 치고 들어왔다.그동안 갈고닦은 치명적인 한 수로먼저 시장 진입을 하였다.멘틀이 붕괴되는 상황!위기의 상황에 리더의 진면목을 볼 수 있다.그리고 선조에 대한 평가는 여기서부터 시작이다.1) 선조는 정보 검증이 미흡하였다.왜(일본)의 전국시대가 종결되면서급성장한 군사력에 대한 우려가 보고 되었고,이를 확인하기 위해 통신사를 보낸다.문제는 3명의 보고자 중2명이 전쟁의 위험을 경고하였으나1명의 안전하다는 보고에 손을 들어준다.(상식적으로 이해가 안 된다.)하긴 전쟁을 대비하자니...신경 쓸 것도 많고,골치 아프겠지.해야 하는데 하기 싫은 일이겠지,반복되는 회의도 귀찮고,그리고 설마 하는 안일한 생각도 있었을 거고.듣고 싶은 쪽으로 듣고넘어가버린다.정확한 정보 조사와검증이 안 되었다.회사 대표의 업무 중에서각종 미팅과 제안과 영업을 하다 보면밀려있는 서류 작업과결정을 하기 위한 검증작업이 필요하다.내가 하고 싶은 일 한 가지를 위해서9가지의 하기 싫은 일을 해야 한다.그걸 생략하거나축약해버리면....도박이 된다.설마~~ 혹시나~~이런 식의 마음으로 일을 진행하게 되지.팀원들의 의견들을 꼭 다수결로 결정하라는 법은 없지만,다수가 생각하는 이유에 대해서,소수가 생각하는 이유에 대해서면밀하게 고찰해 볼 필요가 있다.왜냐면 대표는 가장 최선의 결정을 내려야 하는 사람이니까.2) 선조는 고객을 버렸다.전략적으로 왕이 붙잡혀 전쟁에서 지는 것은 피해야 한다.회사가 살아남아야 후일을 도모할 수 있듯이상황 상 궁을 버리고 때로는 물러날 필요가 있다.하지만 그럼에도 지켜야 할 것들이 있다.백성들에게도 그 위험을 알렸어야 한다.일견 백성들에게 알리면 동요하게 되고질서 있는 도망이 어렵다는 의견도 있지만,백성이 있기에 왕이 있다.비밀리에 도망하기 위해서였다는 의견도 있지만,왜군의 길잡이는 한양 도피 이후부터 발생한다.나라에 실망하고,왕에게 실망하고,자신은 살아야 하는 민초들이왜군에 투항하여 앞잡이가 되는 시점은명확하게 왕이, 국가가 백성을 버린 이후이다.뒤도 안 돌아보고 도망하는 선조의 모습은 리더로서 크나큰 허물이다.앞장서서 죽기를 각오하고 싸우라는 게 아니라도망하더라도 후일을 기약할 수 있도록백성들을 도피시키면서 가던가,각지로 신하들을 보내서 의명을 모집하던가...뒤늦게 멀리 도망가서 한 숨 돌리자 한다는 짓이광해군에게 왕위를 떠넘기는 모습은멘틀 붕괴를 가져온다.(이건 진짜 화나는 일!!)왕자들에게 돌아다니면서 의병을 모으라고 하는 타이밍은...늦어도 한참 늦었다고 생각된다.고객들의 클레임이 빗발칠 때,대표는 도망가면서다른 임원에게...네가 수습해하는 꼴이다.책임지지 않는 모습 정도가 아니라그 피해는 고스란히 고객이 부담하게 된다.3) 선조는 사적인 감정으로 큰 일을 그르치다.임진왜란 중에뒷이야기지만,어느 정도 위기를 넘어갈 때 선조의 모습은 더 가관이다.이순신의 파직, 원균의 임명, 칠천량 해전 패전,전쟁 후, 논공행상에 불합리성 등에휴...절호의 찬스에 왜 이런 삽질을...;;;이 때는 이순신 장군의 연승과 의병들의 집결,명나라 군대의 지원과 왜군의 연패 소식이들려올 때다.특히, 이순신 장군의 파직과 원균의 임명은...사적인 감정에서 우러나온의심병과 질투심이라고 볼 수밖에 없다.혹시나 백성들이 따르는 이순신 장군이딴마음을 품지는 않을까, 백성들은 날 싫어하는데이순신 장군을 저리 따르는 모습에이성적인 판단을 못 내린듯하다.기록에 따르면,선조가 이런 말을 하였다고 한다."통제사 이순신이 사소한 왜적을 잡은 것은 바로 그의 직분에 마땅한 일이며 큰 공이 있는 것도 아닌데"  -선조실록 93권 중에서 발췌-사소한 왜적에게 쫓겨서 도망간 게 누군데...ㅡㅡ;;회사 대표로 치면...유능한 직원을 칭찬을 못 할망정깎아내리고, 벌을 주는 치졸함의 극치를 보여 준다.그러면 회사 관두지.그런 인재가뭣하러 충성을 다하나?하지만 장군님은 내 상상 이상이더라.이순신 장군은 임진왜란 7년 동안 나라와 백성을 위한 충성심에 감탄한다.선조의 질투심? 그리고 백의종군을 보면서나라면... 그렇게까지 못할 거라 생각되더라.그럼에도 불구하고,다시 전장에 나가는 모습에반해버렸다.또한,연속된 승리에도 매너리즘에 빠지지 않고,늘 승리하는 방법을 연구하였다.그럴 수 있었던 이유 중 하나는 바로 일기였다.지금으로 치면 블로깅, SNS에 자신의 이야기를 꾸준히 쓰고,스스로 돌아보며 초심을 지키는 것이랄까?내가 브런치와 네이버 블로그에이런 일기 같은 이야기를 남기는 이유도벤치마킹한 거다.잠시 나도 감정이 격해졌다.이러면 안 되는데... 아...이래 가지고 선조를 뭐라 할 자격이 있으려나.팬심을 뒤로하고,어쨌든....선조는 사적인 감정을나라의 공적인 선택에 적용하였다.그 선택으로 인해 칠천량 해전에서 대패하여많은 병사들과 백성들이 죽음을 당해야 했다.2. 영조를 통해 리더십을 돌이켜 본다이번에는 영조의 이야기를 하자.영조는 조선 후기에 최고의 성군이며,애민(愛民)의 모범이 되는 사례이다.1) 자기관리를 잘 한다.특히 앉는 자리에 방석을 제거한 이야기가 있는데자리가 편해지면 마음이 흐트러진다 하여 제거했다더라.또한 자기 관리에 철저해서 술도 끊고, 소식을 하였으며, 조선 역대 왕 중 최고령이었다.물론 붕당정치에 의하여 노론에 약간 치우친 면이 있지만,(노론 덕을 본 과거 전례가 있다 보니...)탕평책을 시행하여 한쪽으로 기울어져가던붕당정치의 본질을 회복하는데 힘을 썼다.많은 사람들이 사도세자 이야기를 통해영조를 엄하고, 꼰대로 보는 경향도 있는데...어찌 아버지로서 아들을 뒤주에서죽도록 하는 상황이 마음 편할 수 있을까.그리고 사도세자가 태어났을 때,얼마나 이뻐하였으며,조선 역사상 가장 이른 나이에 세자로 책봉하였을 정도로...현대식으로 보면 입사한 지 얼마 안 되어서 후계자 교육에 들어간 케이스랄까?그런데 그 이후,기록에 따르면...세자는 공부하기를 싫어하였으며,과식을 즐겨하였다고 전해진다.영조가 소식 주의자라는 점과공부하기를 즐긴 왕이라는 점에서섣불리 세자 책봉한 것을 후회하였을지도 모른다.기대가 컸기에,강압적으로라도 공부시키고,바꾸어보려고 했지만...그것이 스트레스가 되어 세자가 더 엇나갔을 수도 있다.2) 예외는 없다.그러다가...세자가 사고를 치고 만다.살인을 하였다.왕이지만,엄연히 국법이 있고, 살인죄를 저지른 아들이다.영화에서는 유아인의 멋짐에 넘어갈 수 있겠지만,후계자라 하더라도범죄를 저지른 점을 유야무야 넘어가기는 어렵다.그렇게 되면 신하들을 어떻게 따르게 할 것이며,백성들을 어떻게 대할 수 있단 말인가.설령 아들이더라도,잘못에 대한 죄는 치루어야 한다.삼국지의 읍참마속이라는 고사성어처럼인정에 의해 움직이는 결정이 아니라정해진 규칙에 의해 예외상황을 만들면 안 된다.더군다나 매우 가까운 사이더라도더더욱 그냥 넘어가면 안 된다.무자비하게 보일지 모르겠지만,절대적으로 이 부분에서 난 영조를 동의한다.3) 실수를 반복하지 않는다.정조는 영조의 손자이며,사도세자의 아들이다.사실 영조의 뒤를 이어서 왕이 된 정조는 영조의 영향을 많이 받았다.영조와 정조가 나라를 다스릴 때의기록들은 얼마나 두 왕이 백성들을 생각했는지 알게 해준다.정조가 기록으로 남긴 말들은성군으로서 자세를 엿볼 수 있다."백성이 배가 고프면, 내가 배가 고프고백성이 배가 부르면, 내가 배가 부르다.""나는 소설보다 상소문이 더 좋다."또한 정조는 사적인 감정에 치우치지 않는다방에 편액을 걸어놓고 매일 일어나고, 잘 때 확인하였다고 한다.이는 아버지의 복수는 기억하되, 지금은 탕평이 중요하다고 생각하여공적인 일에 사적인 감정을 이입하지 않았다.영조에서 정조로 이어지는 정신은영조가 왕으로서는 괜찮았지만,아버지로서는 좀 아니었던 점을 보완하지 않았나 싶다.사도세자의 건은 너무나 엄한 영조의 성격과과도한 기대로 인한 부작용이었을 테다.그리고 아들이 죽은 후,영조는 정조를 제대로 후계자가 되도록이전의 실수를 반복하지 않기 위해신경을 썼을 테다.그 결과,후계자로서 반듯하게 성장한정조는 영조에 이어 성군으로 기록되는올바른 리더가 될 수 있었다.임금님들도 완벽하지 않다.리더들도 완벽하지 않다.성격이 괴팍할 수도,선택을 잘 못할 수도,편애가 있을 수도 있다.하지만 중요한 점은그대로 멈춰있는 게 아니라앞서 나아가야 하고,더 나아져야 하고,리더의 본분을 잊지 말아야 한다.절대 개인이 아니라공동체이다.늘 기억하자.그리고 행동으로 실천하자.배우는 것은 어렵지 않다.배움을 삶에 녹여가기가 쉽지 않다.지식을 지혜로 바꾸는 것이 어렵다.역사를 통해 선현들에게서 (주)클린그린이 나아갈 길을 찾아본다.#클린그린 #스타트업 #창업자 #창업가 #마인드셋 #조언
조회수 623

에이스프로젝트 교육비 지원

외부 전문가의 도움을 받아 역량을 더더 성장시킬 수 있도록 에이스프로젝트에서는 사외 교육비를 전액 지원하고 있습니다.  본인의 업무와 관련이 있는, 역량발전에 도움이 되는 교육이라면금액에 관계없이 사외 교육비를 전액(100%) 무제한 지원합니다!실제로 회사에 걸어둔 포스터!2017년에 에이스인이 들었던 교육 리스트를 살펴 보면,기획팀 - 엑셀VBA, 프로젝트 관리 교육그래픽팀 - Adobe After Effects, 타이포그래피 컨퍼런스프론트 - 회계, 글쓰기 교육개발팀 - 파이썬 컨퍼런스, 개발자 컨퍼런스 참여 등다양한 분야의 교육을 수강했습니다. 꾸준히 공부하는 에이스인!에이스프로젝트는 교육비 뿐만 아니라 교육 받을 수 있는 시간도 지원합니다.평일 낮 교육이어도 업무 스케줄을 조율해, 얼마든지 교육을 받으러 갈 수 있습니다. 교육 듣는 날은 공결!! 개인 연차를 소진하지 않습니다 :)교육을 들은 후에는 교육 내용이 궁금한 동료들을 위해 컨플루언스를 이용하거나 사내 발표를 통해 내용을 공유합니다. (나만 똑똑해지기 없기 ! 공유로 에이스인을 널리 이롭게 하자.)내 직무의 전문성을 높이기 위해 자격증에 도전하고 싶다면 그것도 OK!자격증 응시 비용도 지원해 드립니다. 두려워말고 자격 시험에 도전해보세요. 에이스프로젝트는 전문가가 되는 길을 응원합니다.회사에서 일만 한다고 생각하면 오산!에이스프로젝트는 회사와 직원의 성장 모두를 응원합니다♥︎(부러우면 지는거!!!)
조회수 1142

스타트업의 기업 문화는 왜 다를까요?

공기업 출신의 P씨는 최근 창업을 시작한 대학교 선배의 권유로 동물병원과 애견인을 연결하는 O2O 업체 스타트업 초기 멤버로 합류했다.대표 선배를 포함해 5명의 멤버와 함께 일을 시작했지만 적응이 어려운 부분이 있다.그 이유는...선배 하나만 믿고 따라와봤는데 직원들은 복장부터 너무 성의 없어 보이고, 나보다 한참 어린 직원은 대놓고 내 의견에 반박하는데 적응이 안 되네...스타트업은 원래 이런 건가?스타트업은 '무엇'일까요?이제 스타트업(startup)을 이야기할 때 그게 뭐냐고 물어보는 사람은 드물 겁니다. 수년간 국내에도 각종 미디어를 통해 '스타트업'이라는 단어가 오르내리고 정부, 지자체 부터 민간에 이르기까지 다양한 인프라를 갖추며 생태계를 조성하고 있기 때문이죠. 하지만 스타트업이 무엇인지 정확히 정의를 내리라고 하면 바로 자신 있게 대답할 수 있는 사람은 많지 않을 것 같습니다.여기, 미국 실리콘밸리의 대표적인 스타트업 액셀러레이터, 와이컴비네이터(Y-Combinator)를 설립한 폴 그레이엄(Paul Graham)은 자신이 쓴 칼럼에서 스타트업을 이렇게 정의하고 있습니다.(@ paulgraham.com)스타트업은 빠르게 성장하도록 설계된 기업입니다. (Startup = Growth)그의 칼럼에 따르면 스타트업을 다른 기업과 구분할 수 있는 유일한 기준은 '빠른 성장'이라고 강조합니다. 더 나아가 이 빠른 성장을 실현하려면 1) 많은 사람들이 원하는 것을 만들고 2) 그 많은 사람들에게 원하는 것을 제공할 수 있어야 합니다. 이렇게 스타트업이 빠른 성장을 위해 앞만 보고 달려 가다 보니 기존 기업과 일하는 방식에 차이가 생기고 필연적으로 색다른 기업 문화를 가지게 된 것 같습니다.스타트업 구성원은 '문제 해결'에 집중합니다스타트업에 있는 사람들은 힙(hip)하다는 인식이 있습니다. 격식 없는 옷차림, 탄력적인 출퇴근, 심지어 사무실 없이 원격으로 일하는 곳까지. 우리가 흔히 생각하는 회사의 모습에서 벗어나 보이는 근무 환경들이 많습니다. 어떤 곳은 '정말 이렇게 해서 회사가 돌아갈까?' 하는 의문이 들기도 합니다.페이스북을 창업한 마크 주커버그를 한 번 생각해볼까요? 우선 어디서나 항상 트레이드 마크 같은 회색 티셔츠와 후드티, 청바지를 입고 다니는 모습이 먼저 떠오릅니다. 한 번은 그가 참여한 세미나에서 왜 항상 같은 옷을 하고 다니냐는 질문을 받았을 때 '페이스북 서비스에만 내 에너지를 사용하고 싶다'라고 이유를 말했습니다. 즉, 오늘은 무슨 옷을 입을까 고민하고 쇼핑하는 것 자체가 그에게는 낭비라는 것이죠. 그래서 같은 옷을 여러 벌 구입해서 입고 다니는 것으로 옷에 대한 고민을 없애고 그 에너지를 페이스북 비즈니스에만 집중하는 것입니다.같은 회색 티셔츠와 후드티로 가득 찬 그의 옷장 사진은 유명한 일화이다. (@ Mark Zuckerberg facebook)빠르게 성장하는 스타트업들을 살펴보면 이런 식으로 업의 본질, 즉 '문제 해결'에만 집중하기 위해 방해되는 요소들을 과감하게 버리기도 합니다. 방금 예를 든 복장을 시작으로 고정적인 출퇴근, 심지어 직급까지도 버리죠. 하지만 겉보기에 자유로워 보이는 스타트업의 일면에는 빠른 성장을 위해 간절하고 치열하게 움직이는 모습이 숨겨져 있습니다. 이렇게 뚜렷한 목적의식 없이 스타트업의 자유로운 모습만 흉내 내는 곳에게 빠른 성장을 기대할 수 있을까요?스타트업은 '대부분' 수평적인 문화를 지향합니다앞에 직급 이야기가 나왔으니 스타트업의 '수평적인 기업 문화' 이야기를 빼먹을 수 없을 것 같습니다. 스타트업 구성원들이 일하는 모습을 떠올리면 대표와 막내 직원이 허울 없이 비즈니스에 대해 이야기를 나누고 열정적으로 토론하는 모습을 그리곤 합니다. '오늘만큼은 계급장 떼고 이야기 해보자'가 아니라 수평적인 기업 문화를 이루기 위해 정말 계급장을 없애는 스타트업이 늘어나고 있습니다.이렇게 많은 스타트업이 수평적인 문화를 지향하는 이유는 명료합니다. 앞서 이야기한 '빠른 성장'을 위해서입니다. 빠른 성장을 이루려면 그만큼 빠른 의사결정이 필요하고 직급을 없애거나 단순화하는 것으로 의사결정 시간을 단축시켜 빠르게 실험하고 검증하는 것을 반복합니다. 스타트업의 수평적인 문화는 구성원 개개인에게 높은 심적 부담감과 업무 강도를 요구하지만 그만큼 책임감을 심어줄 수 있고 주인의식을 가지고 일할 수 있게 합니다.앞서 소개한 P씨가 스타트업에 합류하기 전에 재직한 공기업은 호봉제를 통한 연공서열과 위계질서가 확실하게 잡힌 수직적인 구조입니다. 회사 내 프로세스가 정립되어있고 그 안에 개인의 역할이 자로 잰 듯 명확하게 구분되어 있습니다. 회사가 크고 작은 의사결정을 하기 위해 아래에서 위로 많은 직급을 거쳐야 하며 자연히 긴 시간이 소요됩니다.물론 수직적인 기업 문화는 잘못됐고 수평적인 기업 문화가 정답이라는 뜻은 아닙니다. 기업의 규모와 형태에 따라 수직적인 문화가 적합할 수 있고 이를 통해 빠른 성장을 이루는 스타트업도 있습니다. 하지만 대부분의 스타트업은 소규모로 시작하고 구성원 한 사람 한 사람에게 많은 역할을 부여하다 보니 빠른 성장을 위해 빠른 의사결정과정을 요구합니다. 이런 환경에서 수평적인 기업 문화를 지향하게 된 것은 어찌 보면 자연스러운 흐름일지도 모르겠습니다.패스트파이브 '역시' 스타트업입니다대부분의 기업들이 사무 공간과 여러 가지 환경 문제 때문에 본업에 집중하기 힘든 문제를 해결하고자 2015년 3월부터 공유오피스 서비스를 시작한 패스트파이브는 지난 3년간 누적 350억 원 투자를 유치하고 12개 지점 5,000명 입주자 규모로 성장했습니다. 글을 작성하는 2018년 연말까지 20개 지점 오픈을 목표로 빠르게 확장하고 있습니다. 이렇게 빠른 성장이 가능한 이유는 패스트파이브 역시 '문제 해결'에 집중하고 있는 스타트업이기 때문입니다.패스트파이브도 앞서 설명한 스타트업의 문화를 지향하고 있습니다. 온전히 업에 집중하기 위해 대표부터 자유로운 복장으로 일하고 하고 싶은 것, 바꾸고 싶은 것이 있으면 직급을 막론하고 의견을 제시할 수 있고 실행할 수 있습니다. 협력과 공존의 가치를 믿는 사람들이 모여 각자 맡은 역할에 주인의식을 가지고 책임 있게 일하고 있으며, 동료들과 협력하며 긍정적인 에너지를 주고 받습니다. 각 지점 현장에서 발생하는 여러 가지 일에 대해서 커뮤니티 매니저에게 권한을 일임하여 빠른 의사결정과정을 지닌 모습들도 스타트업 문화의 일면을 엿볼 수 있는 부분입니다.스타트업 뿐 아니라 다양한 형태의 기업들이 겪고 있는 문제를 잘 알고 필요를 찾아 제공해드릴 수 있는 것은 패스트파이브 역시 스타트업이기 때문에 가능한 일입니다. 공간을 혁신해 보다 많은 기업의 사무실 문제를 해결하고 본업에만 집중할 수 있도록 도와드리고 있는 패스트파이브가 앞으로 더 많은 기업들을 만날 수 있길 바랍니다.패스트파이브 – 편리하고, 쉽게 시작하는 사무실www.fastfive.co.kr  
조회수 858

커피, 와인 그리고 투자

요즘 날씨가 좋다. 따뜻한 봄날이다.  얼마 전 회사 동료들과 점심을 먹고 날씨를 만끽하며 잠깐 산책을 하고는 커피숍으로 향했다. 너무도 당연한듯한 발걸음으로 말이다.지난해(2016년) 우리나라 국민의 커피 소비량은 약 250억 잔이라고 한다. 국민 한 사람당 약 500잔을 마셨단다. 하루에 2잔 정도 마신 것이다. 불과 몇 년 전까지 커피를 전혀 마시지 않았던 내가 하루에 2잔은 마시고 있는 듯하니 통계가 얼추 맞는 듯하다.많은 사람들이 커피를 즐기게 됐다. 커피가게는 동네 구석구석까지 생겨났다. 내가 일하는 회사 근처에도 수십 개의 커피가게가 있다. 브랜드가 있는 가게, 프랜차이즈부터 개인이 하는 곳까지 형태도 맛도 다양하다. 아메리카노 한잔 가격이 몇천 원부터 1,500원까지 가격도 다양하고 맛도 다양하다. 편의점에서 파는 1,200원짜리 커피도 나쁘지 않다. 거꾸로 고급화 전략으로 나가는 곳들도 있다. 너무 다양해 맛을 구분하기는커녕 이름을 외우기도 어렵다.통계적인 근거를 찾아보진 않았지만 고급화, 다양화한 커피집이 오히려 장사가 잘 되는 것 같기도 하다. 사람들은 맛있는 커피를 마시고 싶지만, 커피를 공부하고 싶어 하진 않는다. 누가 알아서 추천해주면 그냥 그걸 마신다.비슷한 경험이 또 있다. 지인 중에 와인 강의를 하시는 분이 있다. 그 분과의 저녁 모임은 즐겁다. 음식에 어울리는 다양한 와인을, 음식 순서에 맞춰 마시면 그 맛이 일품이다. 굳이 비싼 와인이 아니어도, 입의 즐거움은 부족하지 않다. 그에 곁들여지는 와인에 대한 설명은 맛을 한층 업그레이드한다.잠시 와인을 공부해본 적이 있다. 책을 사서 봤는데, 반쯤 읽다 말았던 기억이 있다. 와인에 대한 애정이 부족했거나, 혹은 다른 이유가 있었을거다. 좋아는 하지만, 공부하고 싶진 않았다.그냥 소주와 맥주로 회귀했다. 투자 역시 커피나 와인에서의 경험과 다르지 않다.사람들은 돈을 벌기 위해 직장을 다니거나 사업을 한다. 애써 모은 돈을 어떻게 해야 할지 모르는 사람들이 많다. 돈을 좋아하긴 하지만, 돈을 공부하고 싶진 않은 것이다. 커피나 와인을 공부하고 싶지 않은 것과 같다.누군가가 나 대신 공부해서 알아서 굴려주면 좋겠다 싶은 것이다. 이러한 사람들의 습성이 변하진 않을 것이다. 커피나 와인은 기호품이지만, 돈은 기호품이 아닌데도 그렇다.남의 손을 빌리면 돈이 든다. 그 '남'에게 수고비를 줘야 하는 것이다. 돈을 굴려주는 값을 치러야 한다.가장 대표적인 게 펀드다. 돈을 모아 굴려주는 펀드에 사람들이 돈을 넣는다. 나보다는 더 잘할 것이라는 기대 때문이다. 펀드에 들어가는 수수료는 결코 싸지 않다. 1~2%의 수수료를 받아 가지만, 그 수수료 이상의 수익을 매년 주지는 않는다. 수익과 상관없이 수수료를 받아 간다. 좋은 커피와 와인을 즐기기 위해 공부를 해야 하듯이, 돈 역시 좋은 수익을 위해서는 공부를 해야 한다. 하지만 모든 사람이 공부를 좋아하는 것도 아니요. 돈을 공부하지도 않는다. 결국 아무 커피나 마시듯 아무렇게나 돈을 놔둔다. 실질금리 마이너스 시대에 돈을 예금에만 넣어두는 것은 돈을 잃는 행위다. 몰라서 놔두는 경우가 대부분이고 나머지는 귀찮아서 그렇다.커피나 와인은 대충 아무거나 마셔도 상관없을 수 있다. 하지만, 애써 모은 내 돈을 아무렇게나 굴려도 되겠는가? 생각 외로 안전한 투자법도 많다. 조금은 공부를 하자.
조회수 967

실무의 핵심은 대충, 빨리, 잘!

오늘은 디자이너님들께 도움이 되는 얘기지만, 혹시 직원에게 전해주고 싶은 말이 될 수도 있겠네요 :)일이란 건 시작이 있고 끝이 있어요. 하나 끝나면 다른 게 들어오는 꼬리물기가 되면 좋겠지만, 대다수의 일이란 것은 항상 돌림노래처럼 겹쳐서 움직이기 마련입니다. 그러니 하루에도 3,4개 일을 동시에 조금씩 진행시켜야 해요. 안구건조증이 생기고 3번 디스크가 눌리거나 거북목으로 변해가는 몸을 보면서 그제서야 깨달아요.'아 일이란 건 능력이 아니라 생명력을 바탕으로 완성되는 것이구나. 이것이 진정한 흑마법이구나.'지옥마법!!!네 맞습니다. 가뜩이나 힘든 게 일이예요. 근데 그 자체로도 힘든 일을 더 어렵게 만드는 것이 있습니다. 바로 동료의 장인정신과 다른 언어를 쓰고 있는 수많은 타종족들이예요. 동료는 자꾸 요청한 걸 안줍니다. 좀만 기다려보래요. 국어사전에 '좀' 은 짧은 시간을 의미해요. 저 분은 국어를 잘못 배웠어요.그리고 팀장님을 비롯해서 클라이언트나 부하직원이나 심지어 다른 팀원들도 모두 각자의 언어를 쓰고있어요. 생긴 건 다들 한국사람인데 완전 글로벌해요. 갤럭시한 것같기도 해요. 내가 한 말을 못 알아들어요. 마찬가지로 당신의 말도 이해를 못하겠어요. 오늘의 얘긴 매우 짧습니다. 왜냐면 이 얘길 길게 해봐야 같은 말이 반복될 것 같거든요. 하지만 디자인뿐만 아니라 다른 어떤 업무에도 비슷하게 적용될 얘기라고 생각합니다. 실제로 저도 이것때문에 뒷목을 잡은 경험이 많아요. 여러분도 많으실 거예요.일단 뒷목의 추억을 되새겨 보겠습니당.- 자꾸 안줘- 시안만들어 오랬더니 예술하고 있음- 표지 만드는데 2시간씩 걸리고 있음- 메일 하나 보내는데 30분- 폰트 크기만 바꿔서 가져오랬는데 1시간 째 안와- 막상 인쇄했더니 오타 오져벌임- 제작단계에서 실수했대뭐 보통 이런 것들이죠. 압축하면 "시간은 오래걸리는데, 결과물은 엉망진창." 인 경우예요.회사의 시간은 나에게만 국한되지 않습니다. 내가 끝나야 일이 시작되는 다른 누군가도 있죠. 그는 시간은 내가 자료를 전달한 후부터 흐르기 시작해요. 각자의 시간이 모여 회사의 시계가 돌아가요. 서로의 시계가 꼬이기 시작하면 누군가의 시공간이 휘어지고 퇴근을 못하고 애인과 헤어지고, 결혼도 못하고, 과로로 쓰러지는 사태가 발생합니다. (?)그러니 이 시공간의 왜곡을 막을 수 있는 3가지 단어를 알려드릴께요.대충해요1차 시안은 어차피 갈아엎어져요. 레퍼런스 찾는 거 고민하지 마요, 표지에 공들이지 마요, 엑셀에 선 예쁘기 넣을 필요없어요, 누끼 예쁘게 안따도 돼요, 생각나는 대로 막 뱉어야 할 때도 있어요. 일단 졸라맨이든 손그림이든 막 그려서 이렇게요? 라고 얼른 보여줘요. 괜히 어설프게 예쁘게 만들면 상대방은 진짜 그렇게 만들어질 줄 알아요.대충의 좋은 예빨리해요뭔가 대충 정했으면 이제 빨리해요. 물론 무언갈 빨리하기 위해선 타인의 도움도 필요하고 컴터도 좋아야합니다. 하지만 무엇보다 내 손이 제일 빨라야 하죠. 자주 들어갈 것 같은 폴더는 즐겨찾기로 옆에 걸어놓습니다. 계속 똑같은 파일 찾으려고 7번씩 폴더 눌러서 들어가지말고. 전화할 때 상대방이 10번 울리는데도 안받으면 그냥 끊고 다른 데 전화를 겁시다. 삐소리가 들리고 사랑의 메시지를 남길게 아니라면 말예요.레이어 정리하고 미세하게 그림자효과의 투명도를 조정하는 건 지금 할 일이 아닙니다. 그냥 빨리 만들어요.시각정렬 맞추는 것도 지금은 할 일이 아닙니다. 그냥 끝선만 잘 맞춰서 보여줘요. 이거 확정안 아니예요. 시안이예요.엑셀자료를 받았는데 뭔 말인지 모르겠으면 혼자 끙끙대지 말고 빨리 가서 물어봐요. 복사기가 안되면 멀뚱히 서있지 말고 전화를 걸거나 옆구리를 열어서 막힌 종이를 빼내요.파일 날리지마요. 단발마와 함께 다시해야해요.... 라고 울먹거리면 물론 슬프긴 하지만 솔직히 그건 민폐이기도 해요. 잠들어있는 그대의 손에 키보드를 가져다대면 본능적으로 컨트롤 에스를 누를 수 있어야 해요.일은 빨리 할수록 좋아요. 물론 일손이 빠르다는 걸 굳이 자랑하거나 알릴 필욘없어요. 그러면 이 세상 모든 일은 혼자 다 하게 될테니까요. 잘해요수정사항까지 다 받았고, 자료정리도 다 되었고 이제 최종시안을 제작할 때는 '잘' 해야해요. 이 때의 잘은 3가지의미가 있어요.- 실수없이- 고퀄리티- 정리완료맞아요. 제작단으로 넘기거나, 인쇄소에 보내거나, 발표장에 가져가거나 등등.. 최종적으로 나오는 콘텐츠에 실수가 있어선 안돼요. 돌이킬 수 없어요. 돌이키려면 돈이 엄청 들어가요. 당신의 월급으론 그 비용을 충당할 수 없어요. 퀄리티도 당연히 좋아야해요. 위에서 못했던 시각정렬이나 톤조절, 미세한 픽셀정리, 머리카락까지 누끼따기 등등은 이 단계에서 하는 거예요. 물론 이것도 빠르면 빠를수록 좋겠죠.(본인에게)그리고 정리를 잘해야해요. 뭔갈 '잘한다.' 라는 것엔 항상 이것이 포함되어 있습니다. 요리사는 주방을 폭발시키면서 요리를 만들지 않죠. 디자이너도 폴더나 바탕화면을 폭발시키면서 만들면 안돼요. 물론 나만 이해하면 될지도 몰라요. 그러나 그 습관이 쉽게 고쳐지지 않더라구요. 회사 컴퓨터는 내 개인소유물이 아니니까요.보고파일에 201802902.png 이런 파일명을 써서 올린다거나... 다른사람이 내 컴터에서 파일찾으려면 직박구리폴더, 참수리폴더를 일일이 열어봐야 하는 사태가 생기기도 합니다. 새로운 우주가 탄생이미지는 이미지대로, 기획안은 기획안대로 PSD는 버전순서대로, 기타 아트웍자료들은 파일명 잘붙여서 소스파일폴더에 잘 모아놓아놓습니다. 최상위 폴더는 당연히 프로젝트명과 제작날짜를 함께 기재해줘야 하구요. 대충, 빨리, 잘 :)
조회수 1221

이유가 필요한 #데이터

그렇다. 항상 이유가 필요했다.무엇을 하든지 자세하진 않더라도 대략적인 방향성이 잡힌 이유가 필요했다. 그래서일까. 그 때문에 내 인생의 방향성을 찾기 위해서 어른들이 흔히 말씀하시는 쓸데없는 짓(?)을 꽤 많이 했던 것 같다. 핀다에 합류하게 된 것도 그 때문이었다. (그렇다고 핀다의 조인한 게 쓸데없는 짓이라는 뜻은 아니다) 학교에서 가르치는 과목들을 왜 배우는 지도, 실무에서 어떤 식으로 쓰이는지도 모르고 수업을 듣자니 좀이 쑤셨다. 그래서 선택한 게 ‘인턴’이었다. 컴퓨터 공학을 전공하고 있는 나는, 미래창조과학부에서 주최한 이공계 인턴쉽 프로그램 ‘오픈 챌린지'에 참여한 덕분에 ‘핀다’를 만날 수 있었고, 얼떨결에 우수 인턴으로 선정되었다. 25개의 인턴쉽 참여 기업들과 참여 인턴들 앞에서 대표로 성과공유를 발표해보는 좋은 경험도 해볼 수 있었다. 인턴쉽이 끝나고 정식 인턴으로 채용되어 현재 나는 핀다의 Database를 맡고 있다.미래창조과학부에서 주최한 이공계 인턴쉽 프로그램 ‘오픈 챌린지' / 우수인턴으로 발표하는 영광을!핀다에서의 많은 업무 중에서도 제일 재미있었던 것은 데이터 분석(Data Analysis)이다. 특히, 데이터를 여러 관점에서 나누고 그 안에서 인사이트를 내는 것은 굉장히 두근거리는 일이었기 때문이다. 처음 입사했을 때 간결하게 정돈되어 있는 Data Sheet를 보고 감동했을 정도였으니까.# 소비자(유저) 리뷰 분석핀다에서는 사용자들의 실질적인 리뷰를 중요시한다. 다만, 우리나라 문화상 (미국에 비해) 리뷰에 대한 태도가 자발적이지 못한 편이다. 따라서, 퀄리티 높은 리뷰를 많이 얻는데 굉장히 힘이 드는 것도 사실이다. 그렇게 힘들게 얻은 상품 리뷰가 어느덧 1,000개 정도가 되었다. 이를 분석함으로써 현재 우리 서비스를 이용하는 고객들은 어떤 고객들이고 금융 상품을 선택할 때 어떤 특징들에 민감한지, 나아가 앞으로 핀다가 집중해야 하는 고객은 어떤 특성을 가진 고객인지를 알아보는 데에 기본 바탕이 될 수 있다.1) 먼저 상품 카테고리 별 만족도는 ‘주택담보대출’이 가장 높았으며 ‘신용대출’이 가장 낮았고 할 말이 제일 많았던 카테고리는 전세대출(리뷰당 단어 수 전체 평균: 33.4 / 전세대출 평균: 42.2)이었다.2) 내용면으로 봤을 때 ‘금리’에 대한 관심이 높다는 것을 다시 한번 확인할 수 있었고 (‘금리’ 언급 비율: 55.9%) 흥미로웠던 것은 2030을 타겟으로 하는 핀다에서의 리뷰임에도 직원 혹은 지인 추천, 오프라인 가입과 같은 ‘오프라인 관련 요소’(21.6%)가 끼치는 영향이 적지 않다는 것, 그리고 영업점이 가까워서 혹은 처음 계좌를 만들 때 엉겁결에 가입하게 되는 ‘주거래은행’(17.5%) 역시 상품을 선택하는 데에 있어서 크게 기여한다는 것이다.3) 여담이지만 오프라인, 온라인 상담 관련한 내용(30.9%)도 많았는데 그중 83%가 상담이 친절했다거나 설명을 알아듣기 쉽게 해주었다는 등 긍정적인 내용이었다. 보통 리뷰는 리워드가 있는 이벤트성이 아닌 이상 부정적인 내용이 많을 거라고 생각했던 나에겐 신선한 충격이었다.핀다가 전하는 경제 소식, 오늘의 뉴스는 매일 오전8시에 업데이트 된다.# 오늘의 뉴스 분석핀다에서는 매일 아침 금융 관련 주제를 가진 ‘오늘의 뉴스’를 페이스북 페이지에 게시한다. 당연한 소리겠지만 같은 시간대에 올려도 어떤 기사는 좋아요, 공유, 도달률 등의 수치가 좋고 어떤 기사는 좋지 못하다. 그리고 이건 핀다의 페이스북 페이지 전체 도달률에 영향을 주게 되는데 때문에 오늘의 뉴스에 엮여있는 수치들을 분석하여 페이스북에서의 뉴스는 어떤 주제를 어떤 식으로 게시해야 반응이 좋은 지 인사이트를 내야 했다.도달률을 결과로 보고, 원인으로 기사 주제, 게시할 때 사용하는 헤드라인과 사진 등이라 했을 때,데이터를 분석하는 일에는 어느새 매의 눈이 되는 나! 집중 :)A. 전기세, 공카족(카페에서 공부하는 사람들)과 같이 생활에 밀접한 관련이 있는 주제이거나 특정 영화나 미디어의 어투, 워딩을 패러디한 헤드라인을 사용했을 경우, 또 전체적인 글의 분위기가 비교적 가벼운 기사들이 도달률이 높았다.B. 반면에 사드 배치로 인한 중국 관련 주식 하락, 미국 기준 금리 상승과 같이 거시적이거나 노령화, 보이스피싱과 같이 SNS 이용자의 대부분인 2030에게는 와 닿지 않는 주제인 기사는 도달률이 낮았다.C. 그리고 다른 부수적인 조건에 상관없이 높은 도달률을 달성하는 기사 주제가 있었는데 그건 바로 대기업이나 정부의 비리 관련된 주제의 기사였다. 요즘 사회 분위기를 대변하는 데이터가 아니었나 싶다. ‘어떤 데이터든 그 데이터가 발생된 이유(원인)가 있고 그 데이터는 또 다른 결과의 이유가 되기도 한다. 하지만 그런 데이터들 역시 목적이 없으면 한낱 글자나 숫자에 불과하다. 즉, 데이터는 그에 맞는 목적을 갖게 될 때 빛난다.’라는 게 현재까지 내린 결론이다.앞으로도 핀다는 데이터를 통해 다양한 소비자들의 반응을 보고 컨텐츠와 서비스의 방향을 고도화해 나갈 예정이다. 그 과정에서 내가 분석한 인사이트들이 반영이 되고, 조금씩 더 나은 컨텐츠와 더 발전된 서비스로 세상과 만날 수 있다면 정말 기쁘지 않을까! :)ㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎ핀다의 데이터 꿈나무,권영진 드림Database AnalystYoungjin from Finda#핀다 #데이터애널리스트 #DataAnalyst #팀원소개 #인사이트
조회수 2808

야놀자 앱은 왜 자동실행 되나요?

pluu 04 JUL 2018저는 야놀자 CX서비스실의 Android 파트에서 레이아웃 깎기와 Kotlin과 새로운 Android 기술을 전파하는 노현석입니다. 야놀자에 합류하고서 경험한 가장 독특한 케이스에 대해서 이야기해 보려고 합니다.시작은 물음표부터언제부터인가 야놀자앱을 설치하거나 업데이트하면 앱이 자동으로 실행된다는 리뷰가 들어오기 시작했습니다.네?! 그게 무슨 말이에요?안드로이드 개발을 시작한 이래로 처음 들어보는 내용이라, 원인도 정확한 해결책도 떠오르지 않는 그런 리뷰였습니다. 그래서 자연스럽게 브라우저를 켜서 구글에 검색을 먼저 해봤습니다. Android, Auto Start, Install 등 다양한 검색 결과로 일정한 패턴의 내용을 확인할 수 있습니다.  Intent Action 관련 내용android.intent.action.PACKAGE_ADDEDandroid.intent.action.PACKAGE_CHANGEDetc.Broadcast Receiveretc.일반적으로 안드로이드 앱이 설치 및 업데이트될 때 발생하는 이벤트(이하 Broadcast)를 받는 방법에 대한 설명이 많습니다. Broadcast는 배터리 변화, 전화 여부, 와이파이 등 시스템의 상태 변화를 감지하거나 서비스 내부적에서 이벤트를 전달하기 위해 사용합니다. ???? 실질적인 해결책은 되지 않지만, 범위를 좁혀서 찾아볼 포인트로 Intent 의PACKAGE관련 액션을 포커스로 잡았습니다. 하지만, 야놀자앱에서는 마케팅 성과 측정을 위해com.android.vending.INSTALL_REFERRER를 광고 트래킹 SDK에서 사용하는 것 이외에는 별도의 작업을 하지는 않습니다. 그러나, 이를 알 리가 없는 사용자는야놀자 앱이 일으키는 문제라고 인지하기 쉽습니다.  일차적으로, 어느 경로를 통해서인지는 모르지만 누군가가 야놀자 앱을 실행하는 것이라고 생각했습니다.야놀자 앱 사용자의 기기에 설치된 모든 앱 리스트를 받아올 수도 있고, 리퍼럴에 따른 앱 실행경로를 모두 수집할 수도 있지만, 단순히 버그를 찾기 위해 사용자의 동의 없이 정보를 수집할 수는 없기 때문에 장기전으로 돌입하게 되었습니다. 하지만 동일한 리뷰는 계속되었고 여전히 뚜렷한 해결책이 없는 채로 시간이 흘러갔습니다.  저 재현되는데요증상이 나타나지만 재현은 되지 않고, 재현 경로를 단기간에 파악하기는 어려운 과제였습니다. 한두 명에 불과하던 제보가 시간이 지날수록 Android 파트의 목을 조르듯이 점점 유입되는 횟수가 늘어만 갔습니다. 그런데 어느 날, 다른 팀의 분께서저 재현되는데요라는 한 줄기의 빛과 같은 언급을 해주셨습니다.믿고 싶지 않은 일이 현실이 되었다네? 그게 … 정말로 일어났습니다.이제부터가진짜시작역시버그는재현이되어야제대로잡을수있겠죠! 저에게는재현되는 단말이 있어요!Android에서 디버깅을 할 수 있는 다양한 수단이 있습니다. 이번 사례의 경우는Log혹은Dump를 확인해보는 선택지가 있습니다.Log민감한 정보라고 판단되는 부분은 모자이크했습니다.앱 설치 후 광고 SDK가 수집하는 것으로 보이는 Log에는 다양한 항목들이 나열되는 것을 볼 수 있습니다. 이때 설치한 앱의 정보가 SDK를 통해 특정 API로 전송되는 것도 확인할 수 있습니다. 하지만 Log는 Log일 뿐입니다.  Dumpsys이렇게 Log만으로 추적이 어려울 때, 추가적으로 시스템의 상태를 얻어내 디버깅 할 수 있는 방법이 있는데 바로dumpsys입니다. dumpsys는 Android 단말에서 실행되며 시스템 서비스에 대한 다양한 정보를 제공하는 도구입니다. ADB(Android Debug Bridge)를 사용하여 dumpsys를 호출 시 해당 단말에서 실행 중인 모든 시스템 서비스에 대한 정보를 가져올 수 있습니다. 간단하게 말하면 배터리의 잔량, 메모리 소비량, 네트워크 통신 상태 등을 명령어로 확인할 수 있습니다. dumpsys의 기능에 대해서는 방대한 설명이 필요하므로, 자세한 내용은 아래 링크로 대체합니다.  Android Developers ~ dumpsyshttps://android.googlesource.com/platform/frameworks/native/+/master/cmds/dumpsys/dumpsys.cppActivity DumpDumpsys 에서 좀 더 Activity 와 관련된 정보를 얻기 위해서는 아래의 명령어를 적용해볼 수 있습니다.// Activity Log Dump adb shell dumpsys activity activities 결과를 확인해봅니다. 아래와 같은 Activity 의 활동 이력을 얻을 수 있습니다.Activity Dump에 나타난mCallingPackage값으로 야놀자 앱을 시작시킨 앱의 패키지를 확인할 수 있습니다. 해당 패키지를 실제 Play Store에서 확인해본 결과, 사진 보정 필터앱으로 유명한카메라 앱중 하나였습니다.???? 야놀자와는 전혀 연관성이 없는 앱인데, 호출하고 있네요… ????Process ID// 애플리케이션의 Process ID 취득 adb shell ps Activity Dump에서 확인한mCallingUid는u0a423였는데, 이는 Activity를 호출한 uid 값을 가리킵니다. 실제로 Process 가 호출되는 Application ID도 카메라 앱에서 호출한 ID 정보와 일치합니다.대상 앱 자료 분석단순하게는 APK 를 분석하여 추측하는 방법이 있습니다. Android Studio 에서 제공되는Analyze APK기능을 이용하여 해당 앱에서 사용되는 서비스의 정보를 파악할 수 있습니다. 이 방법을 이용하여 문제의 앱이 사용하는 광고 SDK 서비스에서 패키지 설치/제거 관련 Broadcast Receiver를 수집하는 것을 확인 할 수 있습니다.패키지 관련 Broadcast인android.intent.action.PACKAGE_ADDED, android.intent.action.PACKAGE_REMOVED를 앱이 사용하는 것은 잘못된 것이 아닙니다. 예를 들어 런처 앱의 경우 단말기 내부의 앱 정보가 변경되었다는 이벤트를 이용하여 화면 렌더링 및 동작을 변경하는 처리를 할 수 있습니다 해당 광고 SDK의 경우에는 앱을 설치 및 실행하는 것으로 사용자에게 포인트 및 여러 혜택을 제공할 것이라고 예상할 수 있습니다.개인적인 의견으로는 사용자의 액션과 상관없이 동작하는 부분에 대해서는 분명히 Android 의 개선도 필요하다고 생각됩니다. 이런 정상 동작과 어뷰징은 아슬아슬한 경계에 있지만, 자칫 어뷰징으로 이어지는 경우 서비스의 품질이 떨어지게 되면서 사용자와 개발사 모두에게 좋지 않은 경험을 줄 뿐입니다.설마 이것도 되려나?동일 패키지명이번 포스팅을 작성하게 된 카메라 앱과 야놀자 서비스 사이에 특별한 관계가 없다면, 왜 이런 현상이 발생하는지 고민해봤습니다. SDK도 연결하지 않았다면, 앱을 추적할 수 있는 유일한 키는패키지명이지 않을까라는 생각으로 패키지명만 야놀자 앱과 동일한 샘플 앱으로 테스트해봤습니다.동일 재현 성공!!그럼… 해결… 끝?많은 사람들에게 이름이 널리 알려진 여러 서비스에서조차 이번 포스팅에서 다룬 내용과 같은 현상이 발생하고 있습니다. 발생 유무에 따른 차이점이나 현상의 인과 관계를 명확히 판단하기엔 아직 정보가 많이 부족합니다. 그리고 이번 분석에서 발견한 문제의 앱을 비롯하여 또 다른 제2, 제3의 앱들이 등장할 거란 가능성도 배제할 수 없는것이 현재 상황입니다. 슬프게도 아직 이 현상은 지금도 계속되고 있으며, 불편을 호소하는 리뷰가 등록되어 서비스 전체의 이미지와 평점을 갉아먹고 있습니다. 안드로이드 생태계가 사용자 및 서비스 제공자에게 더 유익한 방향으로 나아갔으면 하는 바람을 담아 작성했습니다.도움 주신 분동일 증상을 발견하고, 단말을 빌려주신 R&D SF팀 전호숙님같이 추적해주신 R&D CX 서비스실 유관종님Dump/Log 관련 조언을 주신 Wind River의 차영호님 (????????????)국어가 많이 부족한 저를 도와주신 리뷰어 ???????????? R&D CX 서비스실 강미경님, 송요창님, 유관종님, 유용우님, 이미혜님이번 현상 추적에 도움을 주신 분들에게 감사함을 전합니다.#야놀자 #개발자 #개발팀 #문제해결 #버그수정 #안드로이드 #인사이트 #경험공유
조회수 1665

니들이 브랜딩에 대해 알아!?

브랜딩에 관한 이야기브랜딩을 총괄 책임지고 계시는 김성철 상무이사님의 브랜딩 강연에 관한 내용입니다.강연이 시작되기 전 이사님이 한 말씀해주셨습니다.'사람들의 인사이트에는 답은 없다'시작하겠습니다.결정과 실행 / 블루오션은 존재하지 않는다1. 브랜딩 '강점'을 무기로 삼아라- 약점을 보완하는 방법을 하면 모두가 실패하는 법,차라리 브랜딩의 중요한 요소는 자사가 소유한 가장 큰 '강점을 무기로 삼아야 한다.2. 경쟁사가 아닌 소비자를 공략하라 (제안하기)- 정말 누군가 이기는 게임을 하는 게 옳은 방법은 아니다.- 지금 현재 중요한 단어'내가 소비자에게 어떤 걸 제안할 수 있는지' 그러한 제안이 수요창출을 만들 수 있는지 고민해야한다.- 소비자를 공략할 게임을 찾아야한다. 이기겠다는 명목하에 한다면 질 수 밖에 없다.3. 씨줄과 날줄 안에 소비자를 가둬라.- Life Time Value- 애플을 개인적으로 좋아하지 않는다. 하지만 애플은 씨줄과 날줄을 정말 잘  만든다 (itunes)- 플랫폼을 잘 봐라. 자신들의 플랫폼에 소비자를 가둬 넣었다.4. 브랜드의 경계를 뛰어 넘아라.- 업의 경계를 뛰어 넘어라. 네이버는 삼성과 싸워야한다. 전통방식으로는 내 업종이 아니라 무시할 수 있지만,코어벨류를 생각하라.5. 알리지 말고 표현하라.- 전통적 광고의 시대는 끝났다.- 모든 것들의 접점에서 표현하라.- 내가 어떤 사람인지를 표현하는 방법을 연구해야한다.ex) 현대카드는 '교회오빠'를 싫어한다. 삐뚤어지고 시장의 질서를 깨려는 브랜딩의 느낌을 만들고 있다.6. 자신만의 고유한 화법이 표현을 완성한다.- '애플의 30년'이라는 책이 있다. 그 책은 애플의 제품 역사가 담겨 있는데,컴퓨터 사양과 같은 내용은 없고 그냥 이미지만 있다. 비싼 컴퓨터인데, 제품 사용 설명서도 허접하다.그게 애플의 표현 방식이다.7. 스피릿을 공유하라- 철학과 정신은 정말 중요하다.- 내가 가진 확실한 정신을 알아야한다.- 설령 제품에도 철학과 정신이 있어야한다. ex) 아이리버와 아이팟 누가 성공했나?- 아이팟이 성능면에서는 떨어졌지만 사람들은 아이팟을 선택했고, 결국 애플이 이겼다.철학과 정신이 새겨있지 않으면 사람들은  관심있게 못 본다.8. '게임의 규칙은 내가 정한다' (제일 중요한 부분)- 기울어진 운동장에서는 축구를 하면 기울어진 쪽이 유리하고 이긴다. 그러면 따라가지 말고 차라리 물을 채워서 수영을 해라.- 말도 안되는 시장에서 내 마음대로 정해라- 현대카드 : 대한민국 신용카드가 손해가 연 2000억인데 신용카드 발급하면 돈을 못 번다. (그래도 한다. 싸움은 늘 내가 하고 싶은대로 해야한다.브랜드 = 만능의 열쇠?1. Quality2. Awareness3. Assocition4. Loyalty아니다. 생각이 바뀔 수 있다.새로운 정의파워브랜드는 약속하지 않는다. 다만 기대하게 만들 뿐이다.생각해보자 아마존, 페이스북, 애플이 약속을 한 적이 있나?한번 자세하게 알아보자한국 대기업들은 '고객을 믿습니다' 맨날 고객타명만 한다.이케아를 '정직한 가격에 스타일리쉬한 제품을 만듭니다' 이게 브랜딩입니다. 약속 ㄴㄴ해요핵심- 더 좋은 이념을 정립하라- 소비자들이 알아서 구매할 것이다.- 싸움의 법칙을 가져가서 해라김성철 상무이사님은 '황금펜타곤'이라는 프로그램에서 심사역을 맡았다.거기서 만난 스타트업은 '호텔나우','마이리얼트립' 등이 있었다.이들의 회사 신념은 명확하고 단순했다.호텔나우 : 실시간으로 싼 호텔 공급하겠다.마이리얼트립 : 지긋한 패키지 여행 싫다. 시장을 바꿀 것이다.존재 이유에 대해 확립하는게 제일 중요하다.Quantum leap = 브랜드는 축적의 과정축적은 시간으로 만드는게 아니라 이념과 신념의 누적치이다.사례를 한번 보자.반기문 유엔사무총장이 대선 후보로 참여했지만, 결국 포기했다. 왜?여러가지 이유가 있었겠지만사람들에게'유엔사무총장의 브랜드는 있었지만''반기문이라는 브랜드는 없기 때문이다'브랜드는 명사가 아니라. 동사다. 동사로 자리잡는 것을 공부해야 한다.+ 질문 나온 이야기"디자인과 브랜딩은 중요하다. 로고라든지 인지를 시키기 위한 전략적 지침에 대해 설명해달라"현대카드는 3가지 키워드로 구성되어 있다.- 심플: 모든 커뮤니케이션을 간단하게- 골드: 아웃스탠딩한 남들이 안하는 걸 심플하게- 위티: 보다 사람들과 웃을 수 있도록브랜드가 가져야할 단어 2~3개를 가지고 디자인에 비쥬얼 매칭이 되는지 중요하다.추가 이야기소비자의 인사이트를 안다?아니다"소비자는 하고 싶은대로 하는거에요. 정답과 트렌드가 없기 때문에 브랜딩이 어렵다고 하는거죠"실시간 질문앱 오누이에서 마케팅을 담당하는 건포어입니다 :)저도 강연을 들으며 새삼 브랜딩에 대해 고민을 해야하는 시간을 가져야겠습니다.나중에 "오누이"에 대한 브랜딩 이야기도 글로 써보겠습니다 ^^#오누이 #인사이트 #경험공유 #브랜딩 #브랜드 #마케팅 #마케터 #이벤트참여 #후기
조회수 6080

초보 디자이너를 위한 안드로이드 DP(Dip), PX, DPI의 개념

안드로이드 앱 디자인은 처음인데요안드로이드 앱 디자인 처음 접하게 되면 dp, px(픽셀), Dpi이란 말을 듣게 됩니다. 안드로이드는 다양한 스마트폰 화면 크기와 해상도를 지원하고 있기 때문에 필요한 개념입니다. 처음에는 헷갈리기 쉽지만 생각보다 어렵지 않습니다. 그리고 이와 관련된 지식을 알고 있으면 디자인,개발 작업에 도움이 됩니다.스크린의 실제 단위 Pixel많이 들어봤을 법한 픽셀은 화면을 구성하는 최소 단위입니다.Pixel 단위는 화면의 전체 화면 크기와 상관없이 지정한 수치만큼 표시되는 절대적 표시 단위이므로 안드로이드에서는 Pixel보다 dp 단위를 사용하는 것이 개발이 이루어질 때 수월합니다.그 이유는 아래 DP단위 개념을 설명에서 알 수 있습니다.DPIDPI는 Dot Per Inch로 1인치에 들어가는 픽셀을 나타내는 단위입니다. 예를 들면 100DPI는 1인치당 픽셀이 100개 포함된다는 것을 말합니다. 개수가 많을 수록 고밀도이며 안드로이드에서 주요 DPI는 아래와 같습니다.DPI기준ldpi120dpimdpi160dpi (기본)hdpi240dpixhdpi320dpixxhdpi480dpixxxhdpi640dpi안드로이드의 기준 DPI는 160 DPI 입니다. 160 DPI인 경우 밀도 독립단위 DP와 PX이 같은 크기를 갖습니다. 즉, 16DPI에서는 1dp는 1px이 됩니다.다양한 디바이스 크기에 대응하기 위해 필요한 DPDP는 픽셀 독립 단위입니다.화면의 크기가 달라도 동일한 비율로 보여주기 위해 안드로이드에서 정의한 단위이며 큰 화면,작은 화면에 상관 없이 같은 크기로 나타납니다.예시1) 같은 사이즈의 애플리케이션에 Low, Medium, High-density 화면에 PX 단위로 크기를 지정했을 때예시2) 같은 사이즈의 애플리케이션에 Low, Medium, High-density 화면에 DP 단위를 지원했을 때위의 예시들을 보면 안드로이드에서 왜 DP단위를 써야 하는지 알 수 있습니다.위의 개념들을 실무에 응용DP, Px, DPI는 안드로이드 앱 디자인 할 때 꼭 알아야 합니다. 실제로 디자이너는 디자인 후 이미지를 보내줄때 해상도별로 Png파일을 보내줘야 하고 개발자도 리소스 파일을 해상도별로 관리해야 합니다.DP와 PX의 단위 변환개발을 하다보면 DP를 PX로 바꿔줘야할 경우가 있습니다. 안드로이드 레이아웃을 코드 작성 할때 는 DP를 사용할 수가 없기 때문입니다.사용하는 공식은 아래와 같습니다.px = dp * 단말 DPI/기본 160dp = px * 기본 160/단말 DPImdpi 지원 단말일 경우 dpi는 160 이므로 1dp 160/160 = 1pixel이 됩니다.xxhdpi 지원 단말일 경우, 5dp를 pixel로 계산하면5dp 480/160 = 15 pixel 이므로 xxhdpi 단말의 5dp는 15pixel이 됩니다.단위 변환을 계산해주는 도구디자이너는 가이드를 작성할 때 DP계산이 필요하고 개발자는 코드를 작성할 때 PX 계산이 필요합니다.머릿속으로 계산이 빨리 되면 상관없겠지만, 일하면서 여간 쉬운 일은 아닙니다.(숫자에 약한 디자이너라면 더더욱…!) 그래서 계산이 힘든 사람들을 위해 작업 시간도 줄여주는 도구 몇가지 소개합니다.1. Android DP/PX converter   각 화면 밀도 별로 dp 를 pixel 로 pixel 을 dp 로 간단하게 확인 해 볼 수 있다.(바로가기)2. Pixplicity DP/PX converter   각 화면 밀도 별로 pixel, dp, sp, mm, inch, pt 로 계산 값을 확인 할 수 있다. (바로가기)3. Cracker9의 Unit Converter   디자이너가 작업하면서 쓰기 유용한 포토샵 플러그인이다. (바로가기)안드로이드 앱 디자인 하실 때 도움이 많이 되셨으면 좋겠습니다.#에이치나인 #디자이너 #개발자 #협업툴 #크래커나인 #솔루션기업

기업문화 엿볼 때, 더팀스

로그인

/