{{{위키노트 ì–´í”Œì„ ê°œë°œí•˜ë©´ì„œ ì–»ì€ ê²½í—˜ í˜¹ì€ ê¸°ìˆ ë“¤ì„ ì„œìˆ í•˜ëŠ” 페ì´ì§€ìž…니다. }}} [[TableOfContents]] = Backend = == 9ì›” 24ì¼ == * Docker와 nginxì˜ Reverse proxy와 Virtual Host ì„¤ì •ì„ ìžë™ìœ¼ë¡œ 해주는 docker-genì´ë¼ëŠ” í”„ë¡œê·¸ëž¨ì„ ìœ„í‚¤ì„œë²„ì— ì„¤ì¹˜ - 참조: https://github.com/jwilder/docker-gen * ubuntu를 기반으로 wikinote, nodejs를 깔아둔 Docker ì´ë¯¸ì§€ ì œìž‘ 완료 - 참조: https://hub.docker.com/r/wraithkim/wikinote_docker/ == 10ì›” 24ì¼ == * ì„œë²„ì˜ static 파ì¼ë“¤(image,text,mp3 등등..)ì— ì ‘ê·¼í•˜ê¸° 위해 nginx ì„¤ì •ì„ í•´ì£¼ì—ˆë‹¤. (static 파ì¼ì€ flask를 통해 가는게 ì•„ë‹ˆë¼ nginxì—서 처리한다.) * flaskì—서 render_templateê¸°ëŠ¥ì„ ì‚¬ìš©í•´ë³´ì•˜ë‹¤.(htmlê³¼ì˜ ì—°ë™) 하지만 jinja2 ë¬¸ë²•ì„ ì¡°ê¸ˆ ìµí˜€ì•¼ í• ë“¯ 하다. * 현재 ë©”ì¸íŽ˜ì´ì§€ëŠ” render_templateê°€ëŠ¥ì„ ì‚¬ìš©í•´ì„œ index.html í…œí”Œë¦¿ì— ì—°ë™í–ˆê³ , 404페ì´ì§€ëŠ” 404.html 페ì´ì§€ì— ì—°ë™í•´ë†“았다. (404처리는 nginxì—서 처리하는게 ì•„ë‹ˆë¼ flaskì—서 처리한다.) * http://wikinote.zeropage.org/templates/index.html 와 ê°™ì´ í…œí”Œë¦¿ì— ì§ì ‘ì ‘ê·¼ì„ í•˜ë ¤í•˜ë©´, nginxëŒ ì—서 HTTP 403(Permission Denied)ì„ ë¦¬í„´í•˜ë„ë¡ í•´ë‘었다. = Frontend = == Design == * ê¸°ì¡´ì˜ ìžˆë˜ ë¡œê³ ê°€ 조금 어색해서, êµ¬ê¸€ì— ë– ëŒì•„다니는 ì´ë¯¸ì§€(Free icon)ì— í´ë¼ê³¤ë””ìžì¸ì„ 씌워서 ë¡œê³ ë¥¼ ì œìž‘í•´ë´„. (http://wikinote.zeropage.org/images/logo_test.png) * ì´ëŸ°ì‹ìœ¼ë¡œë„ ì‘ìš©ì´ ê°€ëŠ¥í•˜ë‹¤. (http://wikinote.zeropage.org/images/logo_404.png) == DEX Loader == * 사실 ì´ ë¶€ë¶„ì€ í¬ê²Œ 중요해보ì´ì§„ 않지만, 새로운 시ë„를 해본다는ë°ì— ì˜ì˜ë¥¼ ë‘ê³ ì§„í–‰í•˜ê³ ìžˆëŠ” 브랜치. * ì–´í”Œì˜ ë²„ì „ê´€ë¦¬(ì—…ë°ì´íЏ)를 위해 ê³ ë¯¼í•˜ë˜ ì¤‘, 기본ì 으로 서버ì—서 새로운 ë²„ì „ì •ë³´ë¥¼ 받아와 ì—…ë°ì´íŠ¸ë¥¼ ìœ ë„하는 ë°©ì‹ì´ 대부분ì´ì—ˆê³ , ìœ ë„하는 ë°©ì‹ìœ¼ë¡œëŠ” 1. Play Storeì— ì—°ê²° 2. 서버ì—서 APK다운로드 후 íŒ¨í‚¤ì§€ë§¤ë‹ˆì € 호출 3. 그런거 없다. 그냥 Play Storeì— ì—…ë°ì´íЏ 올리면 알아서 ë°›ì•„ë¼ 4. Runtime update (ì€í–‰ì•±, 게임앱들) ë“±ì˜ ë°©ì‹ì´ 존재했다. * ì´ì¤‘ì—서 가장 좋아보ì´ëŠ” runtime updateì— ëŒ€í•´ ì—°êµ¬í•˜ë˜ ì¤‘, ì´ìŠ¹í•œ ë©˜í† ë‹˜ê»˜ì„œ 'êµ¬ê¸€ì€ JAR(DEXí¬í•¨)ì„ ë‹¤ìš´ë¡œë“œ 시켜서, ì—…ë°ì´íŠ¸í•œë‹¤' ë¼ëŠ”ë§ì— í˜¸ê¸°ì‹¬ì´ ìƒê²¨, ì—°êµ¬ì¤‘ì¸ ë‚´ìš©. === 성과 === * DexClassLoader와 Reflection API 둘다 기본으로 ì œê³µë˜ëŠ” ë¼ì´ë¸ŒëŸ¬ë¦¬ì¸ë°, ì´ë¥¼ ì´ìš©í•´ì„œ ì™¸ë¶€ì˜ DEX파ì¼ì˜ 함수를 ì´ìš©í•˜ëŠ” ê²ƒì€ ì„±ê³µí–ˆë‹¤. * 하지만, Reflection API를 ì´ìš©í•˜ë©´ 코드를 ì§œëŠ”ë° ìžˆì–´ì„œ 매우 ë‚œìž¡í•˜ê³ , ì„±ëŠ¥ë©´ì— ìžˆì–´ì„œë„ ê·¸ë‹¥ 좋ì€íŽ¸ì´ ì•„ë‹ˆë¼ì„œ ë”ê°€ 새로운 ë°©ë²•ì´ ì—†ë‚˜ ì—°êµ¬í•˜ë˜ ì¤‘, MultiDEX 빌드를 사용í–는 ë°©ë²•ì´ ìžˆì—ˆë‹¤. * MultiDEX 빌드란, 기존 í•œê°œì˜ APPì—서 í•œê°œì˜ DEX(byte code)를 만들어내는ë°, APPì—서 사용하는 메소드가 65000개가 넘어갈 경우(충분히 가능하다. 외부 ë¼ì´ë¸ŒëŸ¬ë¦¬ì˜ ë©”ì†Œë“œë„ í•˜ë‚˜ì˜ DEX로 묶어서 빌드하므로..) 빌드(컴파ì¼)ê°€ ë˜ì§€ 않는다. ì´ëŸ¬í•œ ë¬¸ì œë¥¼ 해결하기 위해 ì œì‹œëœ ë°©ì•ˆì´, 외부ë¼ì´ë¸ŒëŸ¬ë¦¬ëŠ” 따로 빌드하여 DEX파ì¼ì„ ìƒì„±í•˜ê³ , ìš°ë¦¬ì˜ main-DEX는 따로 ìƒì„±í•´ì„œ, run-timeì— ë¼ì´ë¸ŒëŸ¬ë¦¬ì˜ DEX(Secondary-DEX)를 로딩 시키는 방법ì´ë‹¤.(메소드가 6만개가 넘어가는 ì•±ë“¤ì€ ì´ëŸ°ì‹ìœ¼ë¡œ 주로 êµ¬í˜„í•œë‹¤ê³ í•œë‹¤.) * 여기ì—서 착안하여, MAIN-DEX는 ì—…ë°ì´íŠ¸ë¥¼ ì²´í¬í•˜ëŠ” 로ì§ë§Œ, Secondary-DEXì—는 ì‹¤ì œ 어플리케ì´ì…˜ì˜ 로ì§ì„ 담아서 Secondary DEX를 Run-timeì— load하는 ë°©ì‹ìœ¼ë¡œ 해보는게 ì˜³ë‹¤ê³ ìƒê°ì„ 하지만, Android Studioì—서 ì´ë ‡ê²Œ 빌드시키는 Gradle Script를 어떻게 ì§¤ì§€ì— ëŒ€í•´ì„œ ê³ ë¯¼ì¤‘ì— ìžˆë‹¤. * ì´ ë¶€ë¶„ì— ëŒ€í•´ì„œ ê´€ì‹¬ì´ ìžˆëŠ” 사람ì´ë¼ë©´, (http://shloves.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-DexClassLoader-%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%BB%A4%EC%8A%A4%ED%85%80-%ED%81%B4%EB%9E%98%EC%8A%A4-%EB%A1%9C%EB%94%A9) ì„ ì°¸ê³ í•´ë³´ìž. 다만 Eclipse-ANT기준으로 빌드 스í¬ë¦½íŠ¸ê°€ 작성ë˜ì–´ìžˆìœ¼ë‹ˆ, ì•Œê³ ë¦¬ì¦˜ì„ ì°¸ê³ í•´ë³´ìž. == Volley == === 1ì°¨ === * 설치는 git clone https://android.googlesource.com/platform/frameworks/volley * Android Studioì—서 작업 시, File → Import Moduleì„ í•˜ê³ clone한 í´ë”를 ì 어주면 알아서 ì ìš©ëœë‹¤. * ~~ì´í´ë¦½ìŠ¤ëŠ” 알아서 찾아보ìž.~~ * 기본ì 으로 Http ìš”ì²ì„ 하기위해서는 RequestQueue, RequestObjectê°€ 필요한ë°, RequestObject를 Queueì— ë„£ìœ¼ë©´ ìš”ì²ì´ ì´ë£¨ì–´ì§„다. * RequestObject는 StringRequest, JSONRequest ë“±ë“±ì´ ìžˆë‹¤. ìƒì„±ìžë¡œëŠ” Method, Response를 위한 콜백 메서드 ì§€ì •, Error 처리를 위한 콜백 메서드를 ì§€ì •í•´ì¤€ë‹¤. * 가장 기본ì ì¸ RequestQueue ìƒì„±ë°©ë²•ì€ Volley.newRequestQueue(context)를 ì´ìš©. * 만약 Queue를 어플리케ì´ì…˜ 시작부터 ë까지 ìœ ì§€ì‹œí‚¤ê³ ì‹¶ì„ ë•ŒëŠ” 싱글톤 í´ëž˜ìŠ¤ë¥¼ ì´ìš©í•´ë³´ìž. === 2ì°¨ === * POST ì „ì†¡ 형ì‹ì€ GET ì „ì†¡ 형ì‹ê³¼ 같지만, 리퀘스트 오브ì 트ì—서 몇몇 메서드를 오버ë¼ì´ë”© 해야 한다. (Key-Value 형태는 갖춰야하므로..) * 현재 프로ì 트ì—서는 기존 Volley ë‚´ì— ìžˆëŠ” í´ëž˜ìŠ¤ë¥¼ ìƒì†ë°›ì•„ í•´ê²° == Oauth == * Android/iOS는 Google Sign-inì´ë¼ëŠ” ê²ƒì„ ì‚¬ìš©í•˜ë©´ 비êµì 간단하게 êµ¬í˜„í• ìˆ˜ ìžˆë‹¤ê³ í•œë‹¤. * keystoreê°€ í•„ìš”í•˜ë‹¤ëŠ”ë° ì•„ì§ ì¡°ì‚¬ì¤‘.. * Sign-inì—서 로그ì¸í–ˆì„ 때 íŠ¹ì • í† í°ì„ 받아낼 수 있는지 알아내야 í• ë“¯ 싶다. (구글 ê³„ì • ì •ë³´ëŠ” 받아올 수 있는 듯 ì‹¶ì€ë° ì›í•˜ëŠ” í† í° ê°’ì´ ë‚˜ì˜¤ëŠ”ì§€ëŠ” 조금 ë” ì•Œì•„ë´ì•¼..) = 페ì´ì§€ 댓글 = * page not found ê°€ì ¸ë‹¤ ì¨ì•¼ê² 다. - [bluemir]