ReactNative: 8081 port 서버 없이 빌드하기 (react-native bundle)

이미지
(글 작성한 시점의 최신 ReactNative ver: 0.40) 일반적으로 ReactNative를 사용하며 개발 시에는  react-native run-android  명령어로 빌드하며 8081 포트를 띄우거나  react-native start  명령어로 바로 포트를 띄워서, script 파일을 인터넷 연결을 통해 가져오게 되어있다. 5.0 버전 이상에서는  adb reverse tcp:8081 tcp:8081  명령어로 붙고 5.0 미만 버전에서는 pc와 동일한 wifi에 붙은 뒤 ip 설정을 해주는 방식으로 서버에 붙는다. - 해당 내용에 대한 ReactNative doc의 설명 On Android 5.0+ devices connected via USB, you can use the adb command line tool to setup port forwarding from the device to your computer: adb reverse tcp:8081 tcp:8081 Alternatively, select "Dev Settings" from the Developer Menu, then update the "Debug server host for device" setting to match the IP address of your computer. 그러나 릴리즈 할 때는 이 방법을 사용할 수 없기 때문에 script 파일을 ①외부 server에 업로드하여 접근하거나 ②프로젝트 내부에 ReactNative bundle을 포함시켜야 한다. 이 포스팅에서는 ②프로젝트 내부에 ReactNative bundle을 포함시키는 방법으로 빌드할 것이다. 일단 curl 명령어를 사용해야 하기 때문에 cURL이 설치가 되어있어야 한다. ( 다운로드 페이지 ) 일반적으로는 다운로드 페이지에서  curl executable > OS 선택 > Gen...

ReactNative: 'UnsatisfiedLinkError: could find DSO to load' 해결하기

이미지
(글 작성한 시점의 최신 ReactNative ver: 0.40) 기존에 존재하는 Android 프로젝트에 ReactNative를 화면 단위나 view 단위로 이식할 수 있는지를 테스트하기 위해서 ReactNative doc 을 참고하며 진행중이었다. 일단 기존 프로젝트에 잘못 이식하다가 프로젝트 자체가 풍비박산 될 수 있기 때문에, 그냥 AndroidStudio에서 'New Project'하여 버튼 하나를 넣어서 그 버튼을 누르면 ReactNative 화면을 띄우도록 제작하려고 했다. 코드는 대충 이렇다. 그 외 코드는 그냥 doc에 언급된대로 생명주기 메소드별 호출 및 back key 등의 이벤트 처리만 했다. 그런데..! 해당 Activity를 띄우려하니 RuntimeException이 발생했다. 자세히 보니 해당 로그 아래에 Caused by로 UnsatisfiedLinkError가 같이 찍혀있었다. (UnsatisfiedLinkError 로그는 캡쳐를 안해놔서 같은 현상의 다른 개발자 로그를 대신 첨부하였다.) ???? DSO를 찾을 수 없다고??? 열심히 검색검색하니 대충 다른 개발자들은 써드파티 라이브러리를 사용하는 기존 프로젝트에 ReactNative를 이식하는 과정에서 해당 에러가 발생하는 것 같았다. 근데 난 그냥 Hello World에 버튼 하나 있는 프로젝트인데?? 외부 라이브러리 상속받은거 전혀 없는데????? gradle을 자세히보니 안드로이드가 기본적으로 넣어주는 Appcompat 서포트 라이브러리가 있었다. 물론 혹시 몰라 그 부분도 지워봤지만 에러는 똑같았다.. ^^.. ㅠㅠ 1. 이슈 원인 일단 결론을 먼저 말하자면, ReactNative가 32비트 라이브러리만 지원하고 64비트 라이브러리는 지원하지 않기 때문에 64비트인 ARM64 장치에서는 이런 이슈가 발생 한다. 이 이슈가 특정 단말에서 재현되는 현상도 그런 이유에서이다. 해당 이슈는 ReactNativ...

RxAndroid: 비동기 및 이벤트 기반 프로그래밍을 위한 라이브러리

이미지
RxAndroid: 비동기 및 이벤트 기반 프로그래밍을 위한 라이브러리 from Stella Kim 2017년 1월 24일, 사내에서 진행한 RxAndroid 주제의 세미나 발표 자료이다. ReactiveX를 알게 되고 RxJava를 공부하며, 다음으로 착수하게 될 프로젝트에 RxJava를 도입하기로 결심을 했다. 같이 프로젝트 개발을 진행할 개발자들과 PL, PM에게는 간략한 기술검토 내용을 설명하여 설득을 했지만, 단순히 특정 프로젝트에 그치는 것이 아니라 향후에도 Rx 개념을 지속적으로 사용하고 싶었다. 또한 내가 투입되지 않는 프로젝트에서도 Rx를 사용하기를 원했다. 그렇게 되기 위해서는 최소 사내 개발자들은 Rx의 개념을 알고 사용법을 알아야하는데, 사실 누군가가(심지어 말단사원이) 제안했다고해서 가뜩이나 바쁜 연구원들이 바로 Rx를 공부하며 실무에 적용해볼리가 만무했다. 사내에는 2-3명 정도가 Rx에 대해 관심을 가지고 공부했을 뿐, 그 외에는 모두 Rx에 대해 잠시 들어만 봤거나 아예 모르는 연구원들이 대다수였다. 어떻게 해야 타 연구원들이 Rx에 대해 관심을 가지고 공부를 할 수 있을까 생각하다가, 최소한 'Rx가 뭔지 들어는 개발자'로 만들기 위해 아예 전사 세미나를 주최하기로 했다. (PL이 먼저 세미나 주최를 제안했던 것이 가장 큰 계기가 되었다.) 그리고 나름 성공적으로 마쳤다. '생산성이 좋습니다.' 한마디를 이야기하기 위해서는, 왜 좋은지, 어떻게 좋은지, 기존의 방법보다 어떤 것이 나으며 어떤 것이 부족한지에 대한 설명과 근거 자료들이 준비가 되어있어야 했고, 예상치 못한 질문에도 최대한 사실에 근거하며 잘 대답할 수 있게끔 전반적인 이해가 완전히 되어야 했기 때문에 공부와 세미나 자료 준비를 거의 동시에 진행했다. 공부도 공부 나름인게 Rx를 설명하기 위해서는 멀티코어 프로세서가 등장한 환경부터 동시성 프로그래밍, 반응성 프로그래밍 등...

Android: App 프로파일링과 최적화

이미지
안드로이드는 방대하며 하나의 이슈에 대해서도 수많은 솔루션들이 있다. Stackoverflow 에서는 많은 추천을 받은 답변이 Best solution으로 인정되는 경향이 있는데, 특히 다른 개발자들의 긍정적인 코멘트들이 달린 답변의 경우에는 더 그렇다. 그러나 사실 백그라운드에서 비동기로 실행되는 것과 관련되어 보고된 이슈들을 보면, 많은 추천을 받은 답변들을 좋은 답변이라고 하기에는 어렵다. 그 중엔 종종 앱의 성능과 안정성에 미치는 영향을 완전히 무시한 솔루션들이 있는데, 경우에 따라서 이 솔루션들은 단지 약간의 성능저하 정도만 발생시킬 수 있겠지만, 어떤 경우에는 앱이 충돌할 가능성도 있다. Splash 화면의 예 참고: 다음은 단지 최적화되지 않은 코드의 예시일 뿐이며, splash 화면을 구현하는데에 있어서 추천하는 방법이 절대 아니다. splash 화면 구현을 위한 적절한 솔루션은 Ian Lake의 Pro-tip 게시물을 참고하길 바란다. Splash 화면을 만든다고 가정해보자. 어떻게 만들지에 대한 아이디어는 있지만 그것이 과연 최적의 방법인지는 확신할 수 없다. 일단 최선의 방법을 찾기 위해 구글링을 해볼것이고, Stackoverflow나 블로그들에서 여러 솔루션들을 얻게 될 것이다. 예를 들자면 이런 답변 말이다: 이러한 코드는 구글에서 바로 검색되는 일반적인 솔루션이다. 이 코드는 Handler를 인스턴스화하고 Runnable로 postDelayed를 호출하여 splash 화면을 구현한 Activity다. SPLASH_DISPLAY_LENGTH만큼의 딜레이가 지연되고 나면 Runnable이 실행될 것이고, main Activity가 실행되며 splash가 종료될 것이다. 나는 이 코드를 복사하여 내 코드에 붙여넣은 뒤 원하는대로 잘 작동하는 것을 확인하며 만족해할 것이다. 여기까지는 아주 좋다. 코드 분석 이 코드에는 몇가지 결함이 있다: 1. Splash 화면이 보여지는 동안 ...

꿈을 가진 사람으로 산다는 것 - 은평문화예술전문학교 강연

이미지
은평문화예술전문학교에서 "꿈을 가진 사람으로 산다는 것"이라는 주제에 대한 강연을 진행했다. 고등학교 3학년 학생들을 대상으로 한 강연이다보니 '꿈'에 대한 포커스를 주로 맞췄는데, 내가 꿈을 갖게 된 계기와 현재의 위치에 서있기까지의 학교생활을 주 중심으로 이야기 했다. 아울러 꿈이 없어 고민하는 친구들에게 최대한 내 이야기를 중심으로 조언을 해주었다. (내가 뭐라고 조언까지 해주나 싶지만^^;) 청소년들 앞에서 강연자로 서는것에 대한 꿈이 있었지만 그것은 내 기준으로 내가 '조금 더 성공했을 때'의 이야기고, 더군다나 이번 강연은 '금년기에 고등학교를 졸업한 내가 감히 선배랍시고 고등학생 앞에서 강연자로 서도 되는것인가!' 하는 부담감(?)이 들어서 사실 '에잇 학생들이 코웃음쳐도 난 모른다! 내가 하고싶은 말이나 해야지' 싶은 마음으로 했다. 창업진흥원이나 마이크로소프트웨어에서 진행했던 강연은 '내가 뭔 말을 짓껄여도 귀여운 여고생 정도로 봐주겠지' 싶은 보험(?) 심리가 있었는데 자칫 자라나는 꿈나무들 앞에서 말실수하면 큰일난다는 생각에 되려 그때보다 더 열심히 준비했던 것 같다. 더군다나 그 때는 기껏 해봐야 15분남짓한 발표였는데 이번엔 한시간반짜리라서..... 내가 과연 학생들을 휘어잡을 수 있는 카리스마가 있는지 걱정을 가득 안은 채 무척 겁을 먹으며 강연을 시작했는데, 의외로 학생분들이 딴청도 안 피우고 질문도 많이 해줘서 굉장히 편안한 분위기에서 했다. 후에 선생님 말씀으로도 아이들이 전문 강사님이 오셨을 때보다 더 집중을 잘해서 깜짝 놀랐다고 하심 (아싸) 더군다나 예상치 않게 아이들에게 강연 도중에 중간중간 독설을(..) 좀 많이 했다고 생각했는데, 선생님들은 그점을 굉장히 만족해하셨다고 한다 사실 강연 자체가 내 꿈이고 난 그다지 대단한 사람도 아니라서, 오히려 어떻게보면 내가 더 영광이라고 생각했는데, 다행히 성...

꿈에 어떠한 미련도 남겨두지 않기를

이미지
당신이 글을 진정 사랑한다면 독서가 취미인 카페 주인보다 소설가가 될 수 있기를. 당신이 노래를 진정 사랑한다면 노래 잘하는 요리사보다 무대 위 가수가 될 수 있기를. 당신이 여행을 진정 사랑한다면 휴가를 손꼽아 기다리는 회사원보다 여행 작가가 될 수 있기를. 당신이 코미디를 진정 사랑한다면 유머러스한 거래처 직원보다는 유머러스한 코미디언이 될 수 있기를. 당신이 진정 사랑하는 것이 온전히 당신이 될 수 있기를. 당신이 진정 사랑하는 것이 당신이 될 수 있을 때까지 용기와 끈기를 지닐 수 있기를. 꿈에 어떠한 미련도 남겨두지 않기를. 그런 당신에게 삶은 기회를 주기를. 그러나 설령 당신이 원하는 만큼 이루어지지 않더라도 가시가 아닌 진주처럼 아름다운 삶의 한 부분으로 안을 수 있기를. 실패가 아닌 도전이었다 말할 수 있기를. 꿈을 가졌던 것을 후회하지 않기를. 지나간 꿈보다 더 아름다운 현재를 웃으며 살아가기를. 1cm+

10대 여고생이 만난 프로그래밍 - 마이크로소프트웨어 31주년 컨퍼런스

이미지
마이크로소프트웨어 31주년 컨퍼런스에서 "10대 여고생이 만난 프로그래밍"이라는 주제로 컨퍼런스를 진행했다.  내가 어떻게 프로그래밍을 시작하게 되었는지, 그리고 어떤 노력을 했었는지와 프로그래밍을 향한 나의 열정(?)에 대해 했다. 발표하는 동안 많은 분들이 내 이야기를 경청해주고 공감해주셔서 그래도 끝에 가선 긴장이 많이 풀린 것 같다ㅠㅠ 많이 긴장했었고 또 많이 미숙했었지만 나를 주제로 한 이야를 누군가 앞에서 이야기할 수 있어 좋았고, 더군다나 다른 발표자분들이 정말 대단하신 분들로만 모여있어서 이 자리에 섰다는 것 자체가 황송할 따름이었다...ㅎㅎ 관련 링크 :  http://onoffmix.com/event/34936