SlideShare una empresa de Scribd logo
1 de 141
안드로이드 개발자를 위한
  오픈 소스 이야기
SW 아키텍트 포럼
        모바일 분과        fHalo 팀



손영수


       Filpboard 팀   ligbuf 팀
요즘 업계 흐름은
알고 가시죠 ^^
Google이
  꿈꾸는..

Android의 미래
Google은

  왜 MODU의
    특허를
50억에 샀을까?
MODU의 Jacket 시스템
이게
왜 중요하지?..
갈수록 증가하는 모바일 Traffic
              2010      2011     2012      2013    2014      2015

                                                              6253991




                                                   3805989


                                         2197563

                             1162950
                  546050
      236676



  Cisco (2012), Cisco Visual Networking Index                   단위 TB/월
사실 Google의
서비스는 Cloud에..
Android는 Google의 서비스를

(개인, 가정이) 소비하게 만드는 Hub
Android는
   더 이상
Gadget을 위한
 OS가 아니다.
Embedded
  System을
포괄할 OS로 봐야 함.
하지만..
제조사 입장에서
  Android는
 독이 든 성배..
오픈소스의 개방성
               Android    Qt       Symbian    Meego
               Mozilla    Webkit   Linux      Eclipse
                                                        84

                                         68    71
                                   65
                 58      58   61



          23




                              Openness


Vision Mobile Report July, 2011- http://bit.ly/oTmEmF
오픈 소스 이긴 한데..
구글러가 아니면 할수 있는게 없다…
정리하면..


버그만 잡아줘..
Android의 단점을
극복할 대체제들을 잘써야 한다.

  UI
         android-binding    android-actionbar      actionbar shelock     side-navigation   android ui
                                                                                            patterns




  Network
                                                Simple
                      gson (json)                                               Facebook (fhalo)
                                                (REST)




  Common
                 Android billing                              microlog
               (In app purchase)
                                      roboguice
                                                              4android
                                                                                      sensing



  BaaS
                             User Behavior                                             USERGRID
                               Analytics                                           (BaaS Open Source)
Welcome to my Journey!
Agenda
• 안드로이드 이해
  – Binder (Broker 패턴) 그리고 Intent

• 오픈 소스 그리고 사례
  –   Simple Framework (Restful)
  –   microlog4android
  –   불편하지 않은 화면 갱신 (Publisher-Subscriber)
  –   android-actionbar (+ actionbar sherlock)
  –   Android Binding Framework
  –   fHalo (facebook client famework)

• 분석 방법
  – Localytics 사용법
  – STAN을 이용한 Android App 분석 방법
# 1. Binder..
Contents
Activity
           Provider



           Broadcast
Service
           Reciever
하지만…

   우리가
주목해야 할 것은..
왜 Binder가
중요하지?
Android 내의
  모든 상황을
감독하는 감시관!
갑자기 뚝 하고
나온 녀석이 아니다.

    아주..
일반적인 아키텍쳐일뿐.
Binder Architecture

                        IDL
                        Compiler




                              in args
                              operation()
 Client                                       Object
                  OBJ
                  REF     out args,
                          return



                                             IDL
                                            SKEL
           IDL            Binder
          STUBS         INTERFACE              Object Adapter


Binder
Binder를
느낄 수 있는 예제

  AIDL 샘플 참고

http://bit.ly/85E5SV
1. AIDL 파일 생성

package aexp.aidl;

  // Adder service interface.
  interface IAdderService
 {
      int add( in int i1, in int i2 );
  }
2. AIDL 툴로 Java 파일 생성
수동 코드 생성
sdk/platforms/android- <n>/tools/aidl 에 간다

C:Android-projectApiDemossrccomexampleandroidapisapp>aidl -IC:Android-
    projectApiDemossrc IRemoteService.aidl



Eclipse에서는 aidl만 넣고 빌드하면 자동으로 소스 생성 됨
3. Service Class 구현
……
public class AdderServiceImpl extends Service {

    @Override
    public IBinder getBinder() {       return mBinder; }

    @Override
    public void onCreate() {       super.onCreate(); Log.d( "ADDERSERVICEIMPL","onCreate" ); }

    /** The IAdderService is defined through IDL */
    private final IAdderService.Stub mBinder = new IAdderService.Stub() {
              public int add( int i1, int i2 ) {
              return i1+i2;     }
    };

    @Override
    protected void onDestroy() {
      super.onDestroy( Log.d( "ADDERSERVICEIMPL","onDestroy" );         }

}
4. Manifest에 서비스 등록
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="aexp.aidl">
  <application>
    <activity class=".AIDLServiceActivity" android:label="AIDLServiceActivity">
       <intent-filter>
          <action android:value="android.intent.action.MAIN" />
          <category android:value="android.intent.category.LAUNCHER" />
       </intent-filter>
    </activity>

          <service class=".AdderServiceImpl"/>
  </application>
</manifest>
5. Client에 호출을 위해
               Binder로 이름 찾는 로직
class AdderServiceConnection implements ServiceConnection
  {
    public void onServiceConnected(ComponentName className,
                    IBinder boundService )
    {
      service = IAdderService.Stub.asInterface((IBinder)boundService);
           Log.d( "ADDERSERVICECLIENT","onServiceConnected" );
    }

      public void onServiceDisconnected(ComponentName className)
      {
        service = null;
             Log.d( "ADDERSERVICECLIENT","onServiceDisconnected" );
      }
 };
6. 시작, 해제 로직 넣을 것
private void initService()
{
     conn = new AdderServiceConnection();
     Intent i = new Intent();
     i.setClassName( "aexp.aidl", "aexp.aidl.AdderServiceImpl" );
     bindService( i, null, conn, Context.BIND_AUTO_CREATE);
}

private void releaseService()
{
     unbindService( conn );
     conn = null;
}
7. 클라이언트에서 서비스 호출하기

private void invokeService( int i1, int i2 ) {
      TextView t = (TextView)findViewById(R.id.invokeserv_result);
      if( service == null )
            t.setText( "Service not available" );
      else {
            try {
              int result = service.add( i1,i2 );
              t.setText( Integer.toString( result ) );
            } catch( DeadObjectException ex ) {
              t.setText( "Service invocation error" );
            }
    } ….
Broker
                      transfer                        transfer
                      message                         message
 Client-side                     Broker                          Server-side
 Proxy                                                           Proxy
                                 main_event_loop
 pack_data                                                       pack_data
                                 update_repository
 uppack_data                                                     uppack_data
                                 register_service
 send_request                                                    call_service
                                 acknowledgment
 return                                                          send_response
                                 find_server
                                 Find_client
calls                            Forward_request
                                 Forward_response


                  uses API                calls      uses API               calls

 Client                          Bridge                          Server

                                 pack_data                       initialize
 call_server
                                 uppack_data                     enter_main_loop
 start_task
                                 forward_message                 run_service
 use_Broker_API
                                 transmit_message                use_Broker_API
Registration
        Service, BR, Activity…                     Broker

start
               Initialize()                             main_evnet_loop()




                                   register_service()



                                                            update_repository()

               acknowledgment




               enter_main_loop()
Sending Request
          Client              Client-Side      Broker                  Server-Side          Server
                              Proxy                                    Proxy


call_server
                   send_request
                                       pack_data
                                    forward_request
                                                          find_server
                                                        call_service
                                                                                unpack_data
                                                                              run_service



                                                        forward_response        pack_data


                                      return               find_client



                                     unpack_data
                     result
사용하기
           힘든 Binder..

    Intent는 Binder를
쉽게 사용할 수 있는 추상화 도
             구.
Intent를 잘 알면.
 Android를 잘~~
 개발 할 수 있다.
Intent로 Activity 호출

Intent intent =
new Intent(getApplicationContext(), MyOtherActivity.class);
startActivityForResult(intent, SHOW_SUBACTIVITY);




그런데, Activity 이름이 바뀌면…
그래서 묵시적 Intent
Manifest 파일에 Intent Filter 등록
<activity android:name="DirectoryDialog"
    android:theme="@android:style/Theme.Translucent">

   <intent-filter>
          <action android:name="filemanager.action.PICKFILES" />
          <category android:name="android.intent.category.DEFAULT" />
   </intent-filter>




      Activity 만 되는
   </activity>


호출
Intent filemanager = new Intent("filemanager.action.PICKFILES");




          게 아님
startActivity(filemanager);
# 2.아직도 Logcat?
여러분이 만든 시스템이
    죽었다.

  미국에서….
Logcat 보러 출
새로운 log..

    4
먼저
Log Management
   패턴부터…
log4xxx
Microlog4android 사용법
• http://code.google.com/p/microlog4android/downloads/에서
  microlog4android-1.0.0.jar 다운

• Android 프로젝트에 jar 추가

• AndroidManifest.xml에
  android.permission.WRITE_EXTERNAL_STORAG​​E 추가
public class LogtestActivity extends Activity {
static public Logger logger = LoggerFactory.getLogger();
  @Override
  public void onCreate(Bundle savedInstanceState) {
     PatternFormatter formatter = new PatternFormatter();
     formatter.setPattern( " %d{ISO8601} [%P] %m %T " );
     logger.setLevel(Level.INFO);

    // write to LogCat
    LogCatAppender logCatAppender = new LogCatAppender();
    logCatAppender.setFormatter(formatter);
    logger.addAppender(logCatAppender);

    // write to text file of SD-card.
    FileAppender fileAppender = new FileAppender();
    fileAppender.setAppend( true );
    fileAppender.setFileName( "microlog4android.log" );
    fileAppender.setFormatter(formatter);
    logger.addAppender(fileAppender);
로그를
Network 서버로 보내는
   Appender도 있으나
 약간의 코딩이 필요.
# 3. REST의 귀찮음.



    Rest is unrest..
Stub



Controller          DAO



  Proxy      REST

    DTO
             GET
같이 뭉쳐 다니는 파라메터는
ParameterObject로 묶어라!
XML 파싱 이렇게??
                                  while(true) {
<categoryList>                        int eventType = xpp.nextTag();
  <categorys>                         if(eventType == XmlPullParser.START_TAG) {
     <category>                               String tag = xpp.getName();
        <id>1</id>                              if("id".equals(tag)) {
        <name>AA</name>                         category.setId(Integer.parseInt(xpp.nextText()));
        <date>2011-11-01</date>                 }else if ("name".equals(tag)) {
      </category>                               category.setName(xpp.nextText());
     <category>                                 }else if ("date".equals(tag)) {
        <id>2</id>                              category.setDate(xpp.nextText());
        <name>BB</name>                         }else{
        <date>2011-12-10</date>                           if(XmlPullParser.TEXT == xpp.next())
      </category>                                         xpp.nextTag();
   </categorys>                                 }
</categoryList>                       }
                                      else
                                             break;
                                      }
Simple Framework를
     이용하세요.

http://simple.sourceforge.net/
이렇게 됩니다.
<categoryList>                      @Root
  <categorys>                       public class CategoryList {
     <category>
        <id>1</id>                      @ElementList
        <name>fruit</name>              private ArrayList<Category> categorys;
        <date>201110051200</date>
      </category>                       public void setCategorys(ArrayList<Category> categorys)
     <category>                         {
        <id>2</id>                            this.categorys = categorys;
        <name>animal</name>             }
        <date>201110051200</date>
      </category>                       public ArrayList<Category> getCategorys() {
     <category>                               return categorys;
        <id>3</id>                      }
        <name>food</name>           }
        <date>201110051200</date>
      </category>
   </categorys>
</categoryList>
이렇게 됩니다.
        while(true) {
             int eventType = xpp.nextTag();
             if(eventType == XmlPullParser.START_TAG) {
                    String tag = xpp.getName();
                       if("id".equals(tag)) {
                      category.setId(Integer.parseInt(xpp.nextText()));
Serializer serializer =}else if ("name".equals(tag)) {
                         new Persister();
Reader reader = newcategory.setName(xpp.nextText());
                        StringReader(xmlData);
CategoryList categoryList if ("date".equals(tag)) {
                       }else =
serializer.read(CategoryList.class, reader, false);
                       category.setDate(xpp.nextText());
                       }else{
                                 if(XmlPullParser.TEXT == xpp.next())
                                 xpp.nextTag();
                       }
             }
             else
                    break;
             }
# 4. 화면 갱신
My Market을 기억하시나요?
시작하자마자
Loading.. 화면이 뜨면
 누가 접속하나요??
시작하자 마자 화면이 나오
       게.
그럼. 사용자가
직접 당겨서 동기화를?
Sync        Notificati
                          Service        on
                                    2. Insert



Activity
             1. Register

 XXX
Adapter      3. Notification
                                       Contents
                                       Provider

           4. GetData..
@Override
public Uri insert(Uri uri, ContentValues values) {
            String tableName;
            Uri contentUri;
            long id;

          switch(matcher.match(uri)){
          case SITES:
                    tableName = Bookmark.sites._TABLENAME;
    ContentValues values = new ContentValues();
                    contentUri = Bookmark.sites.CONTENT_URI;
    values.put(Bookmark.sites.NAME, stk[i][0]);
                    break;
    values.put(Bookmark.sites.ADDRESS, stk[i][1]);
          default:
    getContentResolver().insert(Bookmark.sites.CONTENT_URI, values);
                    throw new IllegalArgumentException();
    getContentResolver().notifyChange(Bookmark.sites.CONTENT_URI, null)
    ;     }

           id = mDB.insert(tableName, null, values);
           if(id > 0){
                       Uri itemUri = ContentUris.withAppendedId(contentUri, id);
                       return itemUri;
           }else
                       throw new SQLException();
}
# 5. UI Patterns

      다양한 안드로이드 UI 오픈소스들을 소


       http://bit.ly/QyDjMV
Android UI Pattern App


                           다양한
                       안드로이드 UI 기법을
                        오픈 소스로 공개




http://bit.ly/QyDjMV
Android UI Pattern App
Android UI Pattern App
예제 1 - android-actionbar
스크린샷1   스크린샷2   XML   기능   Action   Action예제   색변경
스크린샷1   스크린샷2   XML   기능   Action   Action예제   색변경
스크린샷1   스크린샷2   XML   기능   Action   Action예제   색변경
스크린샷1   스크린샷2   XML   기능   Action   Action예제   색변경
스크린샷1   스크린샷2   XML   기능   Action   Action예제   색변경
스크린샷1   스크린샷2   XML   기능   Action   Action예제   색변경
colors.xml




 스크린샷1   스크린샷2   XML   기능   Action   Action예제   색변경
예제 2
android-binding-framework

http://code.google.com/p/android-binding/

http://bit.ly/cxxwCF
Event에 대한 Binding




다음과 같이 버튼에 대한 이벤트
Method OnClick()
Main.xml
CalculateViewModel.java
Option.xml
Main Activity
Main Activity
# 6. fhalo

      framework


      facebook framework Project
세계에서 가장 큰 서비스
                (약 8억5천만)
           854,750,780
가장 오랜시간 이용하는 서비스
을 개발하려면…
너무 많은 것을 알아야 한다.


           Social Plugin ?
           Open Graph ?
           Social Channels ?
           Authentication ?
           Graph API ?
그래서 우리는..

            framework


            facebook framework Project

        를 시작했습니다.
Facebook 기본 개념 - 소셜 그래프




                      94
About Graph API
• Graph API
  – 소셜 그래프의 Object(친구, 페이지, 사진 등)를 다루는 API


• Graph API의 구조
  – https://graph.facebook.com/OBJECT_ID/CONNECTION_TYPE


• ID는 사용자, 페이지, 이벤트, 사진 등의 Object ID
  – 약 20개의 Object를 지원
  – 모든 Object의 ID는 unique하다
  – JSON 형태로 응답을 받는다




                                                       95
Graph API Example
• https://graph.facebook.com/100001066448386/

                                                신재명 ID




• https://graph.facebook.com/40796308305/


                                       코카콜라 페이지 ID




                                                         96
Graph API - Connection
• Graph API의 구조
  – https://graph.facebook.com/OBJECT_ID/CONNECTION_TYPE


• Connection이란 ?
  – Object의 연관(관계) 개념


• User object의 Connection 종류
  – Family, friends, album, likes, posts …
  – User object 경우 약 25개의 Connection 을 제공
  – https://developers.facebook.com/docs/reference/api/user/ 참고



                                                                  97
Connection - Example
• Graph API 예시
  – https://graph.facebook.com/100001066448386/friends




  그럼 보안문제는 ???
                                                         98
Access Token
• 페이스북 API를 사용하기 위해 Access Token(인
  증)이 필요하다.

• Graph API Explorer를 통하여 쉽게 Access Token
  을 받아올 수 있음




                                        99
About Graph API
• Graph API Explorer
   – Access Token 받을 수 있다
   – 각종 Graph API를 테스트 해볼 수 있다




 https://developers.facebook.com/tools/explorer#!/tools/explorer
사용법

Step1              Step2               Step3             Step4
Import fHalo.jar   Get access token    Create instance   Using API




                                                                     101
Access Token
• 페이스북 API를 사용하기 위해 Access Token(인
  증)이 필요하다.

• Graph API Explorer를 통하여 쉽게 Access Token
  을 받아올 수 있음




                                       102
친구 리스트 가져오기 (페이스북 API)
친구 리스트 가져오기
– Rest FB
  • Connection<User> myFriends =
    facebookClient.fetchConnection("me/friends", User.class);


– fHalo
  • Connection<Friends> friends = user.friends();
피드 올리기(페이스북 API)
피드 올리기
– Rest FB
   • FacebookType publishMessageResponse =
     facebookClient.publish("me/feed", FacebookType.class,
     Parameter.with("message", "RestFB
     test"), Parameter.with(“caption", “caption
     test"), Parameter.with(“description", “description test"),);

– fHalo
   • Feed feed = new feed();
     feed.setMessage("Message Test");
     feed.setCaption("Caption Test");
     feed.setDescription("Description Test");
     user.publishFeed(me, feed);
# 7. 분석은 어떻게?
Sleep If you can.
Thanks 신재명
Issue..
월드 와이드 앱
모바일 어플리케이션
  분석 플랫폼
메인 DASHBOARD
Daypart
Device (국내는…)
Device (월드 와이드 앱은..)
App Version
TagEvent (사용자가 많이쓰는 기능)
사용자가 어떤 화면을 많이 사용하는지
       (유료기능)
이외에도..
•   New vs Returning
•   Carrier
•   Country
•   OS Version
적용방법
• http://www.localytics.com/에서

•             탭 에서 어플리케이션 등록
• http://bit.ly/KnZzpx 에서 소스코드 다운

• Android 프로젝트
 src/폴더에 소스코드 추가

• AndroidManifest.xml에 퍼미션 추가
<uses-permission
 android:name="android.permission.INTERNET“>
• Main Activity에 Import
       import com.localytics.android.*;


• 클래스 내부에 session object 추가
       private LocalyticsSession localyticsSession;

• OnCreate 함수에 아래 소스 추가
   public void onCreate(Bundle savedInstanceState)
   {                                     .
                                             .
                                             .
         this.localyticsSession = new LocalyticsSession(this.getApplicationContext(),
                                "APP KEY FROM STEP 2");
         this.localyticsSession.open(); // open the session
         this.localyticsSession.upload(); // upload any data
                                             .
                                             .
                                             .
   }
• onResume 메소드 Override
  public void onResume()
  {
     super.onResume();
     this.localyticsSession.open();
  }

• onPause 메소드 Override
  public void onPause()
  {
     this.localyticsSession.close();
     this.localyticsSession.upload();
     super.onPause();
  }
• TagEvent남기기
 localyticsSession.tagEvent(“TagEvent남김
 ");
# 8. 1000 피트의 뷰.
높이 (30000 feet)봐야 할까?
높이 봐야 할까?
자세히 (0 feet) 봐야 할까?
자세히 봐야 할까?
3만 피트 vs 0 피트의 뷰.
      3만 피트
      • 다이어그램의 Line의 의미는?
       • 의존성?
       • 데이터 흐름?
       • 버스와 같은 공유자원?



          0 피트
          • 너무 상세한 정보임.
          • 전체적인 구조를 보지 못함.
해결책은..
적절한 1000 피트의 뷰
STAN (Structure Analysis for Java)




STAN - http://stan4j.com/eclipse/eclipse-integration.html
Robert C. Martin의 그래프
Instability

•패키지의 움직일             수 있는 여력을 판단하는
지표
•다른 패키지에 영향을 미치지 않고,
 해당 패키지를 쉽게 변경 할 수 있는가?
•Instability I = Ce / (Ca+Ce)
•Ce = Efferent Coupling (Ingoing Dependencies)
•Ca = Afferent Coupling (Outgoing Dependencies )
Instability




                   Instability I = Ce / (Ca+Ce)
당신의 패키지가 다른 사람이 많이 쓴다면,
즉 Outgoing, Ca가 많다면, 여러분의 패키지는 변경하기 어렵다.

반대로 Outgoing하는 Ca가 적고, Ingoing(다른 패키지만 사용만 하는) Ce,
여러분의 패키지는 쉽게 변경해도 된다.

즉 0.0에서 0.3이면 안정적인 버전, 0.7에서 1.0이면 불안정적인 상태다
Abstractness
  Interface(Abstract) 와 Concrete Class를 비교

A = (#abstract classes / total # of classes)
  •Abstract class = interface, abstract다 포함
  •Total # class = abstract class + concrete class
  •0 이면 concrete class만 있다.
  •1 이면 abstract class만 있다.
다시 보는 그래프




        다른데서 많이 쓰는
         녀석이니 조금 더
        abstract를 높여야
               돼!
그 외 용어

•Tangled Complexity
 •순환 참조가 있어 Boundary를 깰 때

•Cyclomatic Complexity
 •분기 문이 많아 hotspot이 될 가망성이 높은 곳
경고!!!
환자의 외부 증상만
고치는 의사가 되지 말자!!

이러한 정보는 좋은 가이드일뿐!!

숫자에 의존하다가
오히려 아키텍쳐가 무너진다.

Más contenido relacionado

La actualidad más candente

Dependency Injection 소개
Dependency Injection 소개Dependency Injection 소개
Dependency Injection 소개beom kyun choi
 
[11]Android DataBinding : 기초에서 고급까지
[11]Android DataBinding : 기초에서 고급까지[11]Android DataBinding : 기초에서 고급까지
[11]Android DataBinding : 기초에서 고급까지NAVER Engineering
 
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기NAVER Engineering
 
Jquery javascript_ed10
Jquery javascript_ed10Jquery javascript_ed10
Jquery javascript_ed10hungrok
 
Java script 강의자료_ed13
Java script 강의자료_ed13Java script 강의자료_ed13
Java script 강의자료_ed13hungrok
 
GraphQL overview #2
GraphQL overview #2GraphQL overview #2
GraphQL overview #2기동 이
 
Java advancd ed10
Java advancd ed10Java advancd ed10
Java advancd ed10hungrok
 
GraphQL overview
GraphQL overviewGraphQL overview
GraphQL overview기동 이
 
[112] 실전 스위프트 프로그래밍
[112] 실전 스위프트 프로그래밍[112] 실전 스위프트 프로그래밍
[112] 실전 스위프트 프로그래밍NAVER D2
 
유지보수 가능한 개발 원칙
유지보수 가능한 개발 원칙유지보수 가능한 개발 원칙
유지보수 가능한 개발 원칙Hyosang Hong
 
안드로이드App개발 10.activity데이터송수신 thread
안드로이드App개발 10.activity데이터송수신 thread안드로이드App개발 10.activity데이터송수신 thread
안드로이드App개발 10.activity데이터송수신 threadDaeHee Jang
 
Yapp a.a 2 2 android annotations
Yapp a.a 2 2 android annotationsYapp a.a 2 2 android annotations
Yapp a.a 2 2 android annotationsJunyoung Lee
 
Protocol Oriented Programming in Swift
Protocol Oriented Programming in SwiftProtocol Oriented Programming in Swift
Protocol Oriented Programming in SwiftSeongGyu Jo
 
Web server page_ed10
Web server page_ed10Web server page_ed10
Web server page_ed10hungrok
 
MyBatis에서 JPA로
MyBatis에서 JPA로MyBatis에서 JPA로
MyBatis에서 JPA로Dongmin Shin
 
[1D7]안드로이드 L-Preview 보안 아키텍처 및 설비
[1D7]안드로이드 L-Preview 보안 아키텍처 및 설비[1D7]안드로이드 L-Preview 보안 아키텍처 및 설비
[1D7]안드로이드 L-Preview 보안 아키텍처 및 설비NAVER D2
 
자바 테스트 자동화
자바 테스트 자동화자바 테스트 자동화
자바 테스트 자동화Sungchul Park
 
Angular2 router&http
Angular2 router&httpAngular2 router&http
Angular2 router&httpDong Jun Kwon
 
Android 기초강좌 애플리캐이션 구조
Android 기초강좌 애플리캐이션 구조Android 기초강좌 애플리캐이션 구조
Android 기초강좌 애플리캐이션 구조Sangon Lee
 

La actualidad más candente (20)

Dependency Injection 소개
Dependency Injection 소개Dependency Injection 소개
Dependency Injection 소개
 
[11]Android DataBinding : 기초에서 고급까지
[11]Android DataBinding : 기초에서 고급까지[11]Android DataBinding : 기초에서 고급까지
[11]Android DataBinding : 기초에서 고급까지
 
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
 
Jquery javascript_ed10
Jquery javascript_ed10Jquery javascript_ed10
Jquery javascript_ed10
 
Java script 강의자료_ed13
Java script 강의자료_ed13Java script 강의자료_ed13
Java script 강의자료_ed13
 
GraphQL overview #2
GraphQL overview #2GraphQL overview #2
GraphQL overview #2
 
Java advancd ed10
Java advancd ed10Java advancd ed10
Java advancd ed10
 
GraphQL overview
GraphQL overviewGraphQL overview
GraphQL overview
 
[112] 실전 스위프트 프로그래밍
[112] 실전 스위프트 프로그래밍[112] 실전 스위프트 프로그래밍
[112] 실전 스위프트 프로그래밍
 
유지보수 가능한 개발 원칙
유지보수 가능한 개발 원칙유지보수 가능한 개발 원칙
유지보수 가능한 개발 원칙
 
안드로이드App개발 10.activity데이터송수신 thread
안드로이드App개발 10.activity데이터송수신 thread안드로이드App개발 10.activity데이터송수신 thread
안드로이드App개발 10.activity데이터송수신 thread
 
Yapp a.a 2 2 android annotations
Yapp a.a 2 2 android annotationsYapp a.a 2 2 android annotations
Yapp a.a 2 2 android annotations
 
Protocol Oriented Programming in Swift
Protocol Oriented Programming in SwiftProtocol Oriented Programming in Swift
Protocol Oriented Programming in Swift
 
Redux
ReduxRedux
Redux
 
Web server page_ed10
Web server page_ed10Web server page_ed10
Web server page_ed10
 
MyBatis에서 JPA로
MyBatis에서 JPA로MyBatis에서 JPA로
MyBatis에서 JPA로
 
[1D7]안드로이드 L-Preview 보안 아키텍처 및 설비
[1D7]안드로이드 L-Preview 보안 아키텍처 및 설비[1D7]안드로이드 L-Preview 보안 아키텍처 및 설비
[1D7]안드로이드 L-Preview 보안 아키텍처 및 설비
 
자바 테스트 자동화
자바 테스트 자동화자바 테스트 자동화
자바 테스트 자동화
 
Angular2 router&http
Angular2 router&httpAngular2 router&http
Angular2 router&http
 
Android 기초강좌 애플리캐이션 구조
Android 기초강좌 애플리캐이션 구조Android 기초강좌 애플리캐이션 구조
Android 기초강좌 애플리캐이션 구조
 

Destacado

[H3 2012] 오픈소스로 개발 실력 쌓기
[H3 2012] 오픈소스로 개발 실력 쌓기[H3 2012] 오픈소스로 개발 실력 쌓기
[H3 2012] 오픈소스로 개발 실력 쌓기KTH, 케이티하이텔
 
SDC2013 : Monetization
SDC2013 : MonetizationSDC2013 : Monetization
SDC2013 : MonetizationYongSik Jeong
 
SpringCamp 2014 : 미국인에게 영어 프리젠테이션을 해봤어요
SpringCamp 2014 : 미국인에게 영어 프리젠테이션을 해봤어요SpringCamp 2014 : 미국인에게 영어 프리젠테이션을 해봤어요
SpringCamp 2014 : 미국인에게 영어 프리젠테이션을 해봤어요YongSik Jeong
 
게임 캐릭터의 움직임 제어장치 및 그 방법
게임 캐릭터의 움직임 제어장치 및 그 방법게임 캐릭터의 움직임 제어장치 및 그 방법
게임 캐릭터의 움직임 제어장치 및 그 방법kimsungryong
 
아두이노로 페이스북에 글 올리는법
아두이노로 페이스북에 글 올리는법아두이노로 페이스북에 글 올리는법
아두이노로 페이스북에 글 올리는법Junseong Kim
 
[발표] 멜팅팟 서버 사이드 레벨에서 자바 스크립트 엔진 Node.js의 가능...
[발표] 멜팅팟 서버 사이드 레벨에서 자바 스크립트 엔진 Node.js의 가능...[발표] 멜팅팟 서버 사이드 레벨에서 자바 스크립트 엔진 Node.js의 가능...
[발표] 멜팅팟 서버 사이드 레벨에서 자바 스크립트 엔진 Node.js의 가능...Dennis Kim
 
안드로이드 개발에 유용한 도구들
안드로이드 개발에 유용한 도구들안드로이드 개발에 유용한 도구들
안드로이드 개발에 유용한 도구들Sewon Ann
 
(안드로이드 개발자를 위한) 오픈소스 라이브러리 사용 가이드
(안드로이드 개발자를 위한) 오픈소스 라이브러리 사용 가이드(안드로이드 개발자를 위한) 오픈소스 라이브러리 사용 가이드
(안드로이드 개발자를 위한) 오픈소스 라이브러리 사용 가이드Taeho Kim
 
애자일 개발을 이용한 게임 기획 (Game Design In Agile Development) [GDC 2007]
애자일 개발을 이용한 게임 기획 (Game Design In Agile Development) [GDC 2007]애자일 개발을 이용한 게임 기획 (Game Design In Agile Development) [GDC 2007]
애자일 개발을 이용한 게임 기획 (Game Design In Agile Development) [GDC 2007]Kay Kim
 
아두이노기초 오픈강의1
아두이노기초 오픈강의1아두이노기초 오픈강의1
아두이노기초 오픈강의1성국 임
 
한상원, 친아티스트 3D 캐릭터 리깅, NDC2010
한상원, 친아티스트 3D 캐릭터 리깅, NDC2010한상원, 친아티스트 3D 캐릭터 리깅, NDC2010
한상원, 친아티스트 3D 캐릭터 리깅, NDC2010devCAT Studio, NEXON
 
LMS What's Out There and How to Decide
LMS What's Out There and How to DecideLMS What's Out There and How to Decide
LMS What's Out There and How to DecideLori Reed
 
펜션평창『LG777』.『XYZ』제주도팬션예약
펜션평창『LG777』.『XYZ』제주도팬션예약펜션평창『LG777』.『XYZ』제주도팬션예약
펜션평창『LG777』.『XYZ』제주도팬션예약dehryes
 
Lava Jato: Reclamação Constitucional
Lava Jato: Reclamação ConstitucionalLava Jato: Reclamação Constitucional
Lava Jato: Reclamação ConstitucionalLuiz Carlos Azenha
 
Los 7 hábitos de la gente altamente efectiva
Los 7 hábitos de la gente altamente efectivaLos 7 hábitos de la gente altamente efectiva
Los 7 hábitos de la gente altamente efectivadigennaromarina12
 
El mito de el Dorado - lectura octavo-noviembre
El mito de el Dorado - lectura octavo-noviembreEl mito de el Dorado - lectura octavo-noviembre
El mito de el Dorado - lectura octavo-noviembreColegio Camilo Henríquez
 

Destacado (18)

[H3 2012] 오픈소스로 개발 실력 쌓기
[H3 2012] 오픈소스로 개발 실력 쌓기[H3 2012] 오픈소스로 개발 실력 쌓기
[H3 2012] 오픈소스로 개발 실력 쌓기
 
SDC2013 : Monetization
SDC2013 : MonetizationSDC2013 : Monetization
SDC2013 : Monetization
 
SpringCamp 2014 : 미국인에게 영어 프리젠테이션을 해봤어요
SpringCamp 2014 : 미국인에게 영어 프리젠테이션을 해봤어요SpringCamp 2014 : 미국인에게 영어 프리젠테이션을 해봤어요
SpringCamp 2014 : 미국인에게 영어 프리젠테이션을 해봤어요
 
게임 캐릭터의 움직임 제어장치 및 그 방법
게임 캐릭터의 움직임 제어장치 및 그 방법게임 캐릭터의 움직임 제어장치 및 그 방법
게임 캐릭터의 움직임 제어장치 및 그 방법
 
CouchDB - Introduction - Korean
CouchDB - Introduction - KoreanCouchDB - Introduction - Korean
CouchDB - Introduction - Korean
 
아두이노로 페이스북에 글 올리는법
아두이노로 페이스북에 글 올리는법아두이노로 페이스북에 글 올리는법
아두이노로 페이스북에 글 올리는법
 
[발표] 멜팅팟 서버 사이드 레벨에서 자바 스크립트 엔진 Node.js의 가능...
[발표] 멜팅팟 서버 사이드 레벨에서 자바 스크립트 엔진 Node.js의 가능...[발표] 멜팅팟 서버 사이드 레벨에서 자바 스크립트 엔진 Node.js의 가능...
[발표] 멜팅팟 서버 사이드 레벨에서 자바 스크립트 엔진 Node.js의 가능...
 
안드로이드 개발에 유용한 도구들
안드로이드 개발에 유용한 도구들안드로이드 개발에 유용한 도구들
안드로이드 개발에 유용한 도구들
 
(안드로이드 개발자를 위한) 오픈소스 라이브러리 사용 가이드
(안드로이드 개발자를 위한) 오픈소스 라이브러리 사용 가이드(안드로이드 개발자를 위한) 오픈소스 라이브러리 사용 가이드
(안드로이드 개발자를 위한) 오픈소스 라이브러리 사용 가이드
 
애자일 개발을 이용한 게임 기획 (Game Design In Agile Development) [GDC 2007]
애자일 개발을 이용한 게임 기획 (Game Design In Agile Development) [GDC 2007]애자일 개발을 이용한 게임 기획 (Game Design In Agile Development) [GDC 2007]
애자일 개발을 이용한 게임 기획 (Game Design In Agile Development) [GDC 2007]
 
아두이노기초 오픈강의1
아두이노기초 오픈강의1아두이노기초 오픈강의1
아두이노기초 오픈강의1
 
한상원, 친아티스트 3D 캐릭터 리깅, NDC2010
한상원, 친아티스트 3D 캐릭터 리깅, NDC2010한상원, 친아티스트 3D 캐릭터 리깅, NDC2010
한상원, 친아티스트 3D 캐릭터 리깅, NDC2010
 
LMS What's Out There and How to Decide
LMS What's Out There and How to DecideLMS What's Out There and How to Decide
LMS What's Out There and How to Decide
 
펜션평창『LG777』.『XYZ』제주도팬션예약
펜션평창『LG777』.『XYZ』제주도팬션예약펜션평창『LG777』.『XYZ』제주도팬션예약
펜션평창『LG777』.『XYZ』제주도팬션예약
 
Lava Jato: Reclamação Constitucional
Lava Jato: Reclamação ConstitucionalLava Jato: Reclamação Constitucional
Lava Jato: Reclamação Constitucional
 
Los 7 hábitos de la gente altamente efectiva
Los 7 hábitos de la gente altamente efectivaLos 7 hábitos de la gente altamente efectiva
Los 7 hábitos de la gente altamente efectiva
 
El mito de el Dorado - lectura octavo-noviembre
El mito de el Dorado - lectura octavo-noviembreEl mito de el Dorado - lectura octavo-noviembre
El mito de el Dorado - lectura octavo-noviembre
 
iPad for Administrators
iPad for AdministratorsiPad for Administrators
iPad for Administrators
 

Similar a 안드로이드 개발자에 필요한 오픈소스이야기

Meetup tools for-cloud_native_apps_meetup20180510-vs
Meetup tools for-cloud_native_apps_meetup20180510-vsMeetup tools for-cloud_native_apps_meetup20180510-vs
Meetup tools for-cloud_native_apps_meetup20180510-vsminseok kim
 
스마트 팩토리: AWS 사물인터넷과 인공지능을 활용한 스마트 팩토리 구축 – 최영준 AWS 솔루션즈 아키텍트, 정현아 AWS 솔루션즈 아키...
스마트 팩토리: AWS 사물인터넷과 인공지능을 활용한 스마트 팩토리 구축 – 최영준 AWS 솔루션즈 아키텍트, 정현아 AWS 솔루션즈 아키...스마트 팩토리: AWS 사물인터넷과 인공지능을 활용한 스마트 팩토리 구축 – 최영준 AWS 솔루션즈 아키텍트, 정현아 AWS 솔루션즈 아키...
스마트 팩토리: AWS 사물인터넷과 인공지능을 활용한 스마트 팩토리 구축 – 최영준 AWS 솔루션즈 아키텍트, 정현아 AWS 솔루션즈 아키...Amazon Web Services Korea
 
Android Native Module 안정적으로 개발하기
Android Native Module 안정적으로 개발하기Android Native Module 안정적으로 개발하기
Android Native Module 안정적으로 개발하기hanbeom Park
 
구글 기술을 이용한 모바일 클라우드 애플리케이션 개발
 구글 기술을 이용한 모바일 클라우드 애플리케이션 개발 구글 기술을 이용한 모바일 클라우드 애플리케이션 개발
구글 기술을 이용한 모바일 클라우드 애플리케이션 개발LGU+
 
Bluemix meetup seoul 1st (bluemix + io t) v1.1 (20150714 kt hwang)
Bluemix meetup seoul 1st (bluemix + io t) v1.1 (20150714 kt hwang)Bluemix meetup seoul 1st (bluemix + io t) v1.1 (20150714 kt hwang)
Bluemix meetup seoul 1st (bluemix + io t) v1.1 (20150714 kt hwang)Kyoungtae (KT) Hwang
 
[GS네오텍] Google Stackdriver
[GS네오텍] Google Stackdriver[GS네오텍] Google Stackdriver
[GS네오텍] Google StackdriverGS Neotek
 
[Td 2015]구름 위로 올려 어느 곳에서든 연결되는 서비스 azure 앱 서비스(이종인)
[Td 2015]구름 위로 올려 어느 곳에서든 연결되는 서비스 azure 앱 서비스(이종인)[Td 2015]구름 위로 올려 어느 곳에서든 연결되는 서비스 azure 앱 서비스(이종인)
[Td 2015]구름 위로 올려 어느 곳에서든 연결되는 서비스 azure 앱 서비스(이종인)Sang Don Kim
 
[H3 2012] Open API 와 Ruby on Rails 에 대한 이야기
[H3 2012] Open API 와 Ruby on Rails 에 대한 이야기[H3 2012] Open API 와 Ruby on Rails 에 대한 이야기
[H3 2012] Open API 와 Ruby on Rails 에 대한 이야기KTH, 케이티하이텔
 
유엔진 오픈소스 클라우드 플랫폼 (uEngine Microservice architecture Platform)
유엔진 오픈소스 클라우드 플랫폼 (uEngine Microservice architecture Platform)유엔진 오픈소스 클라우드 플랫폼 (uEngine Microservice architecture Platform)
유엔진 오픈소스 클라우드 플랫폼 (uEngine Microservice architecture Platform)uEngine Solutions
 
안드로이드 개발자를 위한 스위프트
안드로이드 개발자를 위한 스위프트안드로이드 개발자를 위한 스위프트
안드로이드 개발자를 위한 스위프트병한 유
 
MSA(Service Mesh), MDA(Data Mesh), MIA(Inference Mesh) 기술동향 소개-박문기@메ᄀ...
MSA(Service Mesh), MDA(Data Mesh), MIA(Inference Mesh) 기술동향 소개-박문기@메ᄀ...MSA(Service Mesh), MDA(Data Mesh), MIA(Inference Mesh) 기술동향 소개-박문기@메ᄀ...
MSA(Service Mesh), MDA(Data Mesh), MIA(Inference Mesh) 기술동향 소개-박문기@메ᄀ...문기 박
 
델파이,C++빌더: 의료 시스템 개발 전문가를 위한 시장현황과 전략
델파이,C++빌더: 의료 시스템 개발 전문가를 위한 시장현황과 전략델파이,C++빌더: 의료 시스템 개발 전문가를 위한 시장현황과 전략
델파이,C++빌더: 의료 시스템 개발 전문가를 위한 시장현황과 전략Devgear
 
Jpa 쿼리 포함 자료
Jpa 쿼리 포함 자료Jpa 쿼리 포함 자료
Jpa 쿼리 포함 자료Hyosang Hong
 
Jpa 쿼리 포함 자료
Jpa 쿼리 포함 자료Jpa 쿼리 포함 자료
Jpa 쿼리 포함 자료Hyosang Hong
 
[오픈소스컨설팅]이기종 WAS 클러스터링 솔루션- Athena Dolly
[오픈소스컨설팅]이기종 WAS 클러스터링 솔루션- Athena Dolly[오픈소스컨설팅]이기종 WAS 클러스터링 솔루션- Athena Dolly
[오픈소스컨설팅]이기종 WAS 클러스터링 솔루션- Athena DollyJi-Woong Choi
 
20201121 코드 삼분지계
20201121 코드 삼분지계20201121 코드 삼분지계
20201121 코드 삼분지계Chiwon Song
 
HOONS닷넷 오픈소스 프로젝트 Part1.
HOONS닷넷 오픈소스 프로젝트 Part1.HOONS닷넷 오픈소스 프로젝트 Part1.
HOONS닷넷 오픈소스 프로젝트 Part1.Hojin Jun
 

Similar a 안드로이드 개발자에 필요한 오픈소스이야기 (20)

J2 Ee
J2 EeJ2 Ee
J2 Ee
 
Meetup tools for-cloud_native_apps_meetup20180510-vs
Meetup tools for-cloud_native_apps_meetup20180510-vsMeetup tools for-cloud_native_apps_meetup20180510-vs
Meetup tools for-cloud_native_apps_meetup20180510-vs
 
모바일을 위한 (AWS) 클라우드 기술 동향
모바일을 위한 (AWS) 클라우드 기술 동향 모바일을 위한 (AWS) 클라우드 기술 동향
모바일을 위한 (AWS) 클라우드 기술 동향
 
스마트 팩토리: AWS 사물인터넷과 인공지능을 활용한 스마트 팩토리 구축 – 최영준 AWS 솔루션즈 아키텍트, 정현아 AWS 솔루션즈 아키...
스마트 팩토리: AWS 사물인터넷과 인공지능을 활용한 스마트 팩토리 구축 – 최영준 AWS 솔루션즈 아키텍트, 정현아 AWS 솔루션즈 아키...스마트 팩토리: AWS 사물인터넷과 인공지능을 활용한 스마트 팩토리 구축 – 최영준 AWS 솔루션즈 아키텍트, 정현아 AWS 솔루션즈 아키...
스마트 팩토리: AWS 사물인터넷과 인공지능을 활용한 스마트 팩토리 구축 – 최영준 AWS 솔루션즈 아키텍트, 정현아 AWS 솔루션즈 아키...
 
Android Native Module 안정적으로 개발하기
Android Native Module 안정적으로 개발하기Android Native Module 안정적으로 개발하기
Android Native Module 안정적으로 개발하기
 
구글 기술을 이용한 모바일 클라우드 애플리케이션 개발
 구글 기술을 이용한 모바일 클라우드 애플리케이션 개발 구글 기술을 이용한 모바일 클라우드 애플리케이션 개발
구글 기술을 이용한 모바일 클라우드 애플리케이션 개발
 
Bluemix meetup seoul 1st (bluemix + io t) v1.1 (20150714 kt hwang)
Bluemix meetup seoul 1st (bluemix + io t) v1.1 (20150714 kt hwang)Bluemix meetup seoul 1st (bluemix + io t) v1.1 (20150714 kt hwang)
Bluemix meetup seoul 1st (bluemix + io t) v1.1 (20150714 kt hwang)
 
[GS네오텍] Google Stackdriver
[GS네오텍] Google Stackdriver[GS네오텍] Google Stackdriver
[GS네오텍] Google Stackdriver
 
[Td 2015]구름 위로 올려 어느 곳에서든 연결되는 서비스 azure 앱 서비스(이종인)
[Td 2015]구름 위로 올려 어느 곳에서든 연결되는 서비스 azure 앱 서비스(이종인)[Td 2015]구름 위로 올려 어느 곳에서든 연결되는 서비스 azure 앱 서비스(이종인)
[Td 2015]구름 위로 올려 어느 곳에서든 연결되는 서비스 azure 앱 서비스(이종인)
 
[H3 2012] Open API 와 Ruby on Rails 에 대한 이야기
[H3 2012] Open API 와 Ruby on Rails 에 대한 이야기[H3 2012] Open API 와 Ruby on Rails 에 대한 이야기
[H3 2012] Open API 와 Ruby on Rails 에 대한 이야기
 
유엔진 오픈소스 클라우드 플랫폼 (uEngine Microservice architecture Platform)
유엔진 오픈소스 클라우드 플랫폼 (uEngine Microservice architecture Platform)유엔진 오픈소스 클라우드 플랫폼 (uEngine Microservice architecture Platform)
유엔진 오픈소스 클라우드 플랫폼 (uEngine Microservice architecture Platform)
 
안드로이드 개발자를 위한 스위프트
안드로이드 개발자를 위한 스위프트안드로이드 개발자를 위한 스위프트
안드로이드 개발자를 위한 스위프트
 
MSA(Service Mesh), MDA(Data Mesh), MIA(Inference Mesh) 기술동향 소개-박문기@메ᄀ...
MSA(Service Mesh), MDA(Data Mesh), MIA(Inference Mesh) 기술동향 소개-박문기@메ᄀ...MSA(Service Mesh), MDA(Data Mesh), MIA(Inference Mesh) 기술동향 소개-박문기@메ᄀ...
MSA(Service Mesh), MDA(Data Mesh), MIA(Inference Mesh) 기술동향 소개-박문기@메ᄀ...
 
2015 oce specification
2015 oce specification2015 oce specification
2015 oce specification
 
델파이,C++빌더: 의료 시스템 개발 전문가를 위한 시장현황과 전략
델파이,C++빌더: 의료 시스템 개발 전문가를 위한 시장현황과 전략델파이,C++빌더: 의료 시스템 개발 전문가를 위한 시장현황과 전략
델파이,C++빌더: 의료 시스템 개발 전문가를 위한 시장현황과 전략
 
Jpa 쿼리 포함 자료
Jpa 쿼리 포함 자료Jpa 쿼리 포함 자료
Jpa 쿼리 포함 자료
 
Jpa 쿼리 포함 자료
Jpa 쿼리 포함 자료Jpa 쿼리 포함 자료
Jpa 쿼리 포함 자료
 
[오픈소스컨설팅]이기종 WAS 클러스터링 솔루션- Athena Dolly
[오픈소스컨설팅]이기종 WAS 클러스터링 솔루션- Athena Dolly[오픈소스컨설팅]이기종 WAS 클러스터링 솔루션- Athena Dolly
[오픈소스컨설팅]이기종 WAS 클러스터링 솔루션- Athena Dolly
 
20201121 코드 삼분지계
20201121 코드 삼분지계20201121 코드 삼분지계
20201121 코드 삼분지계
 
HOONS닷넷 오픈소스 프로젝트 Part1.
HOONS닷넷 오픈소스 프로젝트 Part1.HOONS닷넷 오픈소스 프로젝트 Part1.
HOONS닷넷 오픈소스 프로젝트 Part1.
 

Más de YoungSu Son

Fault Tolerance 패턴
Fault Tolerance 패턴 Fault Tolerance 패턴
Fault Tolerance 패턴 YoungSu Son
 
Clean Code, Software Architecture, Performance Tuning
Clean Code, Software Architecture, Performance TuningClean Code, Software Architecture, Performance Tuning
Clean Code, Software Architecture, Performance TuningYoungSu Son
 
인공지능 식별추적시스템 실증랩 구축및 운영 - 평가모델 고도화
인공지능 식별추적시스템 실증랩 구축및 운영 - 평가모델 고도화인공지능 식별추적시스템 실증랩 구축및 운영 - 평가모델 고도화
인공지능 식별추적시스템 실증랩 구축및 운영 - 평가모델 고도화YoungSu Son
 
Prototype 패턴 (심만섭)
Prototype 패턴 (심만섭) Prototype 패턴 (심만섭)
Prototype 패턴 (심만섭) YoungSu Son
 
Chain of Responsibility (심수연 - 소프트웨어 마에스트로 10기)
Chain of Responsibility (심수연 - 소프트웨어 마에스트로 10기)Chain of Responsibility (심수연 - 소프트웨어 마에스트로 10기)
Chain of Responsibility (심수연 - 소프트웨어 마에스트로 10기)YoungSu Son
 
Singleton 패턴 (김진영 - EVA, 소마에 10기)
Singleton 패턴 (김진영 -  EVA, 소마에 10기) Singleton 패턴 (김진영 -  EVA, 소마에 10기)
Singleton 패턴 (김진영 - EVA, 소마에 10기) YoungSu Son
 
실전 서버 부하테스트 노하우
실전 서버 부하테스트 노하우 실전 서버 부하테스트 노하우
실전 서버 부하테스트 노하우 YoungSu Son
 
생성 패턴 (강태우 - 소마에 10기)
생성 패턴 (강태우 - 소마에 10기) 생성 패턴 (강태우 - 소마에 10기)
생성 패턴 (강태우 - 소마에 10기) YoungSu Son
 
초보 개발자/학생들을 위한 오픈소스 트랜드
초보 개발자/학생들을 위한 오픈소스 트랜드 초보 개발자/학생들을 위한 오픈소스 트랜드
초보 개발자/학생들을 위한 오픈소스 트랜드 YoungSu Son
 
DevOps 오픈소스 트랜드 (클라우드, 모바일 중심)
DevOps 오픈소스 트랜드 (클라우드, 모바일 중심) DevOps 오픈소스 트랜드 (클라우드, 모바일 중심)
DevOps 오픈소스 트랜드 (클라우드, 모바일 중심) YoungSu Son
 
모바일 앱 성능 분석 방법 101 (Mobile Application Performance Analysis Methodology 101)
모바일 앱 성능 분석 방법 101 (Mobile Application Performance Analysis Methodology 101) 모바일 앱 성능 분석 방법 101 (Mobile Application Performance Analysis Methodology 101)
모바일 앱 성능 분석 방법 101 (Mobile Application Performance Analysis Methodology 101) YoungSu Son
 
DevOps 시대가 요구하는 품질확보 방법
DevOps 시대가 요구하는 품질확보 방법 DevOps 시대가 요구하는 품질확보 방법
DevOps 시대가 요구하는 품질확보 방법 YoungSu Son
 
클라우드 환경에서 알아야할 성능 이야기
클라우드 환경에서 알아야할 성능 이야기클라우드 환경에서 알아야할 성능 이야기
클라우드 환경에서 알아야할 성능 이야기YoungSu Son
 
Android 성능 지표와 Oreo 의 개선사항
Android 성능 지표와  Oreo 의 개선사항 Android 성능 지표와  Oreo 의 개선사항
Android 성능 지표와 Oreo 의 개선사항 YoungSu Son
 
안드로이드 Oreo의 변화와 모바일 앱/플랫폼의 적합한 성능 측정 방법
안드로이드 Oreo의 변화와  모바일 앱/플랫폼의 적합한 성능 측정 방법안드로이드 Oreo의 변화와  모바일 앱/플랫폼의 적합한 성능 측정 방법
안드로이드 Oreo의 변화와 모바일 앱/플랫폼의 적합한 성능 측정 방법YoungSu Son
 
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기YoungSu Son
 
SW 아키텍처 분석방법
SW 아키텍처 분석방법 SW 아키텍처 분석방법
SW 아키텍처 분석방법 YoungSu Son
 
[NEXT] Android Profiler 사용법
[NEXT] Android Profiler 사용법 [NEXT] Android Profiler 사용법
[NEXT] Android Profiler 사용법 YoungSu Son
 
Android Studio 개발 셋팅 + Genymotion
Android Studio 개발 셋팅 + GenymotionAndroid Studio 개발 셋팅 + Genymotion
Android Studio 개발 셋팅 + GenymotionYoungSu Son
 
FullStack 개발자 만들기 과정 소개 (Android + MEAN Stack + Redis 다루기)
FullStack 개발자 만들기 과정 소개  (Android + MEAN Stack + Redis 다루기) FullStack 개발자 만들기 과정 소개  (Android + MEAN Stack + Redis 다루기)
FullStack 개발자 만들기 과정 소개 (Android + MEAN Stack + Redis 다루기) YoungSu Son
 

Más de YoungSu Son (20)

Fault Tolerance 패턴
Fault Tolerance 패턴 Fault Tolerance 패턴
Fault Tolerance 패턴
 
Clean Code, Software Architecture, Performance Tuning
Clean Code, Software Architecture, Performance TuningClean Code, Software Architecture, Performance Tuning
Clean Code, Software Architecture, Performance Tuning
 
인공지능 식별추적시스템 실증랩 구축및 운영 - 평가모델 고도화
인공지능 식별추적시스템 실증랩 구축및 운영 - 평가모델 고도화인공지능 식별추적시스템 실증랩 구축및 운영 - 평가모델 고도화
인공지능 식별추적시스템 실증랩 구축및 운영 - 평가모델 고도화
 
Prototype 패턴 (심만섭)
Prototype 패턴 (심만섭) Prototype 패턴 (심만섭)
Prototype 패턴 (심만섭)
 
Chain of Responsibility (심수연 - 소프트웨어 마에스트로 10기)
Chain of Responsibility (심수연 - 소프트웨어 마에스트로 10기)Chain of Responsibility (심수연 - 소프트웨어 마에스트로 10기)
Chain of Responsibility (심수연 - 소프트웨어 마에스트로 10기)
 
Singleton 패턴 (김진영 - EVA, 소마에 10기)
Singleton 패턴 (김진영 -  EVA, 소마에 10기) Singleton 패턴 (김진영 -  EVA, 소마에 10기)
Singleton 패턴 (김진영 - EVA, 소마에 10기)
 
실전 서버 부하테스트 노하우
실전 서버 부하테스트 노하우 실전 서버 부하테스트 노하우
실전 서버 부하테스트 노하우
 
생성 패턴 (강태우 - 소마에 10기)
생성 패턴 (강태우 - 소마에 10기) 생성 패턴 (강태우 - 소마에 10기)
생성 패턴 (강태우 - 소마에 10기)
 
초보 개발자/학생들을 위한 오픈소스 트랜드
초보 개발자/학생들을 위한 오픈소스 트랜드 초보 개발자/학생들을 위한 오픈소스 트랜드
초보 개발자/학생들을 위한 오픈소스 트랜드
 
DevOps 오픈소스 트랜드 (클라우드, 모바일 중심)
DevOps 오픈소스 트랜드 (클라우드, 모바일 중심) DevOps 오픈소스 트랜드 (클라우드, 모바일 중심)
DevOps 오픈소스 트랜드 (클라우드, 모바일 중심)
 
모바일 앱 성능 분석 방법 101 (Mobile Application Performance Analysis Methodology 101)
모바일 앱 성능 분석 방법 101 (Mobile Application Performance Analysis Methodology 101) 모바일 앱 성능 분석 방법 101 (Mobile Application Performance Analysis Methodology 101)
모바일 앱 성능 분석 방법 101 (Mobile Application Performance Analysis Methodology 101)
 
DevOps 시대가 요구하는 품질확보 방법
DevOps 시대가 요구하는 품질확보 방법 DevOps 시대가 요구하는 품질확보 방법
DevOps 시대가 요구하는 품질확보 방법
 
클라우드 환경에서 알아야할 성능 이야기
클라우드 환경에서 알아야할 성능 이야기클라우드 환경에서 알아야할 성능 이야기
클라우드 환경에서 알아야할 성능 이야기
 
Android 성능 지표와 Oreo 의 개선사항
Android 성능 지표와  Oreo 의 개선사항 Android 성능 지표와  Oreo 의 개선사항
Android 성능 지표와 Oreo 의 개선사항
 
안드로이드 Oreo의 변화와 모바일 앱/플랫폼의 적합한 성능 측정 방법
안드로이드 Oreo의 변화와  모바일 앱/플랫폼의 적합한 성능 측정 방법안드로이드 Oreo의 변화와  모바일 앱/플랫폼의 적합한 성능 측정 방법
안드로이드 Oreo의 변화와 모바일 앱/플랫폼의 적합한 성능 측정 방법
 
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
 
SW 아키텍처 분석방법
SW 아키텍처 분석방법 SW 아키텍처 분석방법
SW 아키텍처 분석방법
 
[NEXT] Android Profiler 사용법
[NEXT] Android Profiler 사용법 [NEXT] Android Profiler 사용법
[NEXT] Android Profiler 사용법
 
Android Studio 개발 셋팅 + Genymotion
Android Studio 개발 셋팅 + GenymotionAndroid Studio 개발 셋팅 + Genymotion
Android Studio 개발 셋팅 + Genymotion
 
FullStack 개발자 만들기 과정 소개 (Android + MEAN Stack + Redis 다루기)
FullStack 개발자 만들기 과정 소개  (Android + MEAN Stack + Redis 다루기) FullStack 개발자 만들기 과정 소개  (Android + MEAN Stack + Redis 다루기)
FullStack 개발자 만들기 과정 소개 (Android + MEAN Stack + Redis 다루기)
 

안드로이드 개발자에 필요한 오픈소스이야기

  • 1. 안드로이드 개발자를 위한 오픈 소스 이야기
  • 2. SW 아키텍트 포럼 모바일 분과 fHalo 팀 손영수 Filpboard 팀 ligbuf 팀
  • 5. Google은 왜 MODU의 특허를 50억에 샀을까?
  • 8. 갈수록 증가하는 모바일 Traffic 2010 2011 2012 2013 2014 2015 6253991 3805989 2197563 1162950 546050 236676 Cisco (2012), Cisco Visual Networking Index 단위 TB/월
  • 10.
  • 11. Android는 Google의 서비스를 (개인, 가정이) 소비하게 만드는 Hub
  • 12. Android는 더 이상 Gadget을 위한 OS가 아니다.
  • 13. Embedded System을 포괄할 OS로 봐야 함.
  • 15. 제조사 입장에서 Android는 독이 든 성배..
  • 16. 오픈소스의 개방성 Android Qt Symbian Meego Mozilla Webkit Linux Eclipse 84 68 71 65 58 58 61 23 Openness Vision Mobile Report July, 2011- http://bit.ly/oTmEmF
  • 17. 오픈 소스 이긴 한데.. 구글러가 아니면 할수 있는게 없다…
  • 19. Android의 단점을 극복할 대체제들을 잘써야 한다. UI android-binding android-actionbar actionbar shelock side-navigation android ui patterns Network Simple gson (json) Facebook (fhalo) (REST) Common Android billing microlog (In app purchase) roboguice 4android sensing BaaS User Behavior USERGRID Analytics (BaaS Open Source)
  • 20. Welcome to my Journey!
  • 21. Agenda • 안드로이드 이해 – Binder (Broker 패턴) 그리고 Intent • 오픈 소스 그리고 사례 – Simple Framework (Restful) – microlog4android – 불편하지 않은 화면 갱신 (Publisher-Subscriber) – android-actionbar (+ actionbar sherlock) – Android Binding Framework – fHalo (facebook client famework) • 분석 방법 – Localytics 사용법 – STAN을 이용한 Android App 분석 방법
  • 23. Contents Activity Provider Broadcast Service Reciever
  • 24. 하지만… 우리가 주목해야 할 것은..
  • 25.
  • 27. Android 내의 모든 상황을 감독하는 감시관!
  • 28. 갑자기 뚝 하고 나온 녀석이 아니다. 아주.. 일반적인 아키텍쳐일뿐.
  • 29. Binder Architecture IDL Compiler in args operation() Client Object OBJ REF out args, return IDL SKEL IDL Binder STUBS INTERFACE Object Adapter Binder
  • 30. Binder를 느낄 수 있는 예제 AIDL 샘플 참고 http://bit.ly/85E5SV
  • 31. 1. AIDL 파일 생성 package aexp.aidl; // Adder service interface. interface IAdderService { int add( in int i1, in int i2 ); }
  • 32. 2. AIDL 툴로 Java 파일 생성 수동 코드 생성 sdk/platforms/android- <n>/tools/aidl 에 간다 C:Android-projectApiDemossrccomexampleandroidapisapp>aidl -IC:Android- projectApiDemossrc IRemoteService.aidl Eclipse에서는 aidl만 넣고 빌드하면 자동으로 소스 생성 됨
  • 33. 3. Service Class 구현 …… public class AdderServiceImpl extends Service { @Override public IBinder getBinder() { return mBinder; } @Override public void onCreate() { super.onCreate(); Log.d( "ADDERSERVICEIMPL","onCreate" ); } /** The IAdderService is defined through IDL */ private final IAdderService.Stub mBinder = new IAdderService.Stub() { public int add( int i1, int i2 ) { return i1+i2; } }; @Override protected void onDestroy() { super.onDestroy( Log.d( "ADDERSERVICEIMPL","onDestroy" ); } }
  • 34. 4. Manifest에 서비스 등록 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="aexp.aidl"> <application> <activity class=".AIDLServiceActivity" android:label="AIDLServiceActivity"> <intent-filter> <action android:value="android.intent.action.MAIN" /> <category android:value="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service class=".AdderServiceImpl"/> </application> </manifest>
  • 35. 5. Client에 호출을 위해 Binder로 이름 찾는 로직 class AdderServiceConnection implements ServiceConnection { public void onServiceConnected(ComponentName className, IBinder boundService ) { service = IAdderService.Stub.asInterface((IBinder)boundService); Log.d( "ADDERSERVICECLIENT","onServiceConnected" ); } public void onServiceDisconnected(ComponentName className) { service = null; Log.d( "ADDERSERVICECLIENT","onServiceDisconnected" ); } };
  • 36. 6. 시작, 해제 로직 넣을 것 private void initService() { conn = new AdderServiceConnection(); Intent i = new Intent(); i.setClassName( "aexp.aidl", "aexp.aidl.AdderServiceImpl" ); bindService( i, null, conn, Context.BIND_AUTO_CREATE); } private void releaseService() { unbindService( conn ); conn = null; }
  • 37. 7. 클라이언트에서 서비스 호출하기 private void invokeService( int i1, int i2 ) { TextView t = (TextView)findViewById(R.id.invokeserv_result); if( service == null ) t.setText( "Service not available" ); else { try { int result = service.add( i1,i2 ); t.setText( Integer.toString( result ) ); } catch( DeadObjectException ex ) { t.setText( "Service invocation error" ); } } ….
  • 38. Broker transfer transfer message message Client-side Broker Server-side Proxy Proxy main_event_loop pack_data pack_data update_repository uppack_data uppack_data register_service send_request call_service acknowledgment return send_response find_server Find_client calls Forward_request Forward_response uses API calls uses API calls Client Bridge Server pack_data initialize call_server uppack_data enter_main_loop start_task forward_message run_service use_Broker_API transmit_message use_Broker_API
  • 39. Registration Service, BR, Activity… Broker start Initialize() main_evnet_loop() register_service() update_repository() acknowledgment enter_main_loop()
  • 40. Sending Request Client Client-Side Broker Server-Side Server Proxy Proxy call_server send_request pack_data forward_request find_server call_service unpack_data run_service forward_response pack_data return find_client unpack_data result
  • 41. 사용하기 힘든 Binder.. Intent는 Binder를 쉽게 사용할 수 있는 추상화 도 구.
  • 42. Intent를 잘 알면. Android를 잘~~ 개발 할 수 있다.
  • 43. Intent로 Activity 호출 Intent intent = new Intent(getApplicationContext(), MyOtherActivity.class); startActivityForResult(intent, SHOW_SUBACTIVITY); 그런데, Activity 이름이 바뀌면…
  • 44. 그래서 묵시적 Intent Manifest 파일에 Intent Filter 등록 <activity android:name="DirectoryDialog" android:theme="@android:style/Theme.Translucent"> <intent-filter> <action android:name="filemanager.action.PICKFILES" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> Activity 만 되는 </activity> 호출 Intent filemanager = new Intent("filemanager.action.PICKFILES"); 게 아님 startActivity(filemanager);
  • 46. 여러분이 만든 시스템이 죽었다. 미국에서….
  • 49. 먼저 Log Management 패턴부터…
  • 51. Microlog4android 사용법 • http://code.google.com/p/microlog4android/downloads/에서 microlog4android-1.0.0.jar 다운 • Android 프로젝트에 jar 추가 • AndroidManifest.xml에 android.permission.WRITE_EXTERNAL_STORAG​​E 추가
  • 52. public class LogtestActivity extends Activity { static public Logger logger = LoggerFactory.getLogger(); @Override public void onCreate(Bundle savedInstanceState) { PatternFormatter formatter = new PatternFormatter(); formatter.setPattern( " %d{ISO8601} [%P] %m %T " ); logger.setLevel(Level.INFO); // write to LogCat LogCatAppender logCatAppender = new LogCatAppender(); logCatAppender.setFormatter(formatter); logger.addAppender(logCatAppender); // write to text file of SD-card. FileAppender fileAppender = new FileAppender(); fileAppender.setAppend( true ); fileAppender.setFileName( "microlog4android.log" ); fileAppender.setFormatter(formatter); logger.addAppender(fileAppender);
  • 53. 로그를 Network 서버로 보내는 Appender도 있으나 약간의 코딩이 필요.
  • 54. # 3. REST의 귀찮음. Rest is unrest..
  • 55. Stub Controller DAO Proxy REST DTO GET
  • 56. 같이 뭉쳐 다니는 파라메터는 ParameterObject로 묶어라!
  • 57. XML 파싱 이렇게?? while(true) { <categoryList> int eventType = xpp.nextTag(); <categorys> if(eventType == XmlPullParser.START_TAG) { <category> String tag = xpp.getName(); <id>1</id> if("id".equals(tag)) { <name>AA</name> category.setId(Integer.parseInt(xpp.nextText())); <date>2011-11-01</date> }else if ("name".equals(tag)) { </category> category.setName(xpp.nextText()); <category> }else if ("date".equals(tag)) { <id>2</id> category.setDate(xpp.nextText()); <name>BB</name> }else{ <date>2011-12-10</date> if(XmlPullParser.TEXT == xpp.next()) </category> xpp.nextTag(); </categorys> } </categoryList> } else break; }
  • 58. Simple Framework를 이용하세요. http://simple.sourceforge.net/
  • 59. 이렇게 됩니다. <categoryList> @Root <categorys> public class CategoryList { <category> <id>1</id> @ElementList <name>fruit</name> private ArrayList<Category> categorys; <date>201110051200</date> </category> public void setCategorys(ArrayList<Category> categorys) <category> { <id>2</id> this.categorys = categorys; <name>animal</name> } <date>201110051200</date> </category> public ArrayList<Category> getCategorys() { <category> return categorys; <id>3</id> } <name>food</name> } <date>201110051200</date> </category> </categorys> </categoryList>
  • 60. 이렇게 됩니다. while(true) { int eventType = xpp.nextTag(); if(eventType == XmlPullParser.START_TAG) { String tag = xpp.getName(); if("id".equals(tag)) { category.setId(Integer.parseInt(xpp.nextText())); Serializer serializer =}else if ("name".equals(tag)) { new Persister(); Reader reader = newcategory.setName(xpp.nextText()); StringReader(xmlData); CategoryList categoryList if ("date".equals(tag)) { }else = serializer.read(CategoryList.class, reader, false); category.setDate(xpp.nextText()); }else{ if(XmlPullParser.TEXT == xpp.next()) xpp.nextTag(); } } else break; }
  • 61. # 4. 화면 갱신
  • 66. Sync Notificati Service on 2. Insert Activity 1. Register XXX Adapter 3. Notification Contents Provider 4. GetData..
  • 67. @Override public Uri insert(Uri uri, ContentValues values) { String tableName; Uri contentUri; long id; switch(matcher.match(uri)){ case SITES: tableName = Bookmark.sites._TABLENAME; ContentValues values = new ContentValues(); contentUri = Bookmark.sites.CONTENT_URI; values.put(Bookmark.sites.NAME, stk[i][0]); break; values.put(Bookmark.sites.ADDRESS, stk[i][1]); default: getContentResolver().insert(Bookmark.sites.CONTENT_URI, values); throw new IllegalArgumentException(); getContentResolver().notifyChange(Bookmark.sites.CONTENT_URI, null) ; } id = mDB.insert(tableName, null, values); if(id > 0){ Uri itemUri = ContentUris.withAppendedId(contentUri, id); return itemUri; }else throw new SQLException(); }
  • 68. # 5. UI Patterns 다양한 안드로이드 UI 오픈소스들을 소 http://bit.ly/QyDjMV
  • 69. Android UI Pattern App 다양한 안드로이드 UI 기법을 오픈 소스로 공개 http://bit.ly/QyDjMV
  • 72. 예제 1 - android-actionbar
  • 73. 스크린샷1 스크린샷2 XML 기능 Action Action예제 색변경
  • 74. 스크린샷1 스크린샷2 XML 기능 Action Action예제 색변경
  • 75. 스크린샷1 스크린샷2 XML 기능 Action Action예제 색변경
  • 76. 스크린샷1 스크린샷2 XML 기능 Action Action예제 색변경
  • 77. 스크린샷1 스크린샷2 XML 기능 Action Action예제 색변경
  • 78. 스크린샷1 스크린샷2 XML 기능 Action Action예제 색변경
  • 79. colors.xml 스크린샷1 스크린샷2 XML 기능 Action Action예제 색변경
  • 81. Event에 대한 Binding 다음과 같이 버튼에 대한 이벤트 Method OnClick()
  • 84.
  • 88.
  • 89. # 6. fhalo framework facebook framework Project
  • 90. 세계에서 가장 큰 서비스 (약 8억5천만) 854,750,780
  • 92. 을 개발하려면… 너무 많은 것을 알아야 한다. Social Plugin ? Open Graph ? Social Channels ? Authentication ? Graph API ?
  • 93. 그래서 우리는.. framework facebook framework Project 를 시작했습니다.
  • 94. Facebook 기본 개념 - 소셜 그래프 94
  • 95. About Graph API • Graph API – 소셜 그래프의 Object(친구, 페이지, 사진 등)를 다루는 API • Graph API의 구조 – https://graph.facebook.com/OBJECT_ID/CONNECTION_TYPE • ID는 사용자, 페이지, 이벤트, 사진 등의 Object ID – 약 20개의 Object를 지원 – 모든 Object의 ID는 unique하다 – JSON 형태로 응답을 받는다 95
  • 96. Graph API Example • https://graph.facebook.com/100001066448386/ 신재명 ID • https://graph.facebook.com/40796308305/ 코카콜라 페이지 ID 96
  • 97. Graph API - Connection • Graph API의 구조 – https://graph.facebook.com/OBJECT_ID/CONNECTION_TYPE • Connection이란 ? – Object의 연관(관계) 개념 • User object의 Connection 종류 – Family, friends, album, likes, posts … – User object 경우 약 25개의 Connection 을 제공 – https://developers.facebook.com/docs/reference/api/user/ 참고 97
  • 98. Connection - Example • Graph API 예시 – https://graph.facebook.com/100001066448386/friends 그럼 보안문제는 ??? 98
  • 99. Access Token • 페이스북 API를 사용하기 위해 Access Token(인 증)이 필요하다. • Graph API Explorer를 통하여 쉽게 Access Token 을 받아올 수 있음 99
  • 100. About Graph API • Graph API Explorer – Access Token 받을 수 있다 – 각종 Graph API를 테스트 해볼 수 있다 https://developers.facebook.com/tools/explorer#!/tools/explorer
  • 101. 사용법 Step1 Step2 Step3 Step4 Import fHalo.jar Get access token Create instance Using API 101
  • 102. Access Token • 페이스북 API를 사용하기 위해 Access Token(인 증)이 필요하다. • Graph API Explorer를 통하여 쉽게 Access Token 을 받아올 수 있음 102
  • 103. 친구 리스트 가져오기 (페이스북 API)
  • 104. 친구 리스트 가져오기 – Rest FB • Connection<User> myFriends = facebookClient.fetchConnection("me/friends", User.class); – fHalo • Connection<Friends> friends = user.friends();
  • 106. 피드 올리기 – Rest FB • FacebookType publishMessageResponse = facebookClient.publish("me/feed", FacebookType.class, Parameter.with("message", "RestFB test"), Parameter.with(“caption", “caption test"), Parameter.with(“description", “description test"),); – fHalo • Feed feed = new feed(); feed.setMessage("Message Test"); feed.setCaption("Caption Test"); feed.setDescription("Description Test"); user.publishFeed(me, feed);
  • 107. # 7. 분석은 어떻게?
  • 108. Sleep If you can.
  • 112. 모바일 어플리케이션 분석 플랫폼
  • 119. 사용자가 어떤 화면을 많이 사용하는지 (유료기능)
  • 120. 이외에도.. • New vs Returning • Carrier • Country • OS Version
  • 121. 적용방법 • http://www.localytics.com/에서 • 탭 에서 어플리케이션 등록
  • 122. • http://bit.ly/KnZzpx 에서 소스코드 다운 • Android 프로젝트 src/폴더에 소스코드 추가 • AndroidManifest.xml에 퍼미션 추가 <uses-permission android:name="android.permission.INTERNET“>
  • 123. • Main Activity에 Import import com.localytics.android.*; • 클래스 내부에 session object 추가 private LocalyticsSession localyticsSession; • OnCreate 함수에 아래 소스 추가 public void onCreate(Bundle savedInstanceState) { . . . this.localyticsSession = new LocalyticsSession(this.getApplicationContext(), "APP KEY FROM STEP 2"); this.localyticsSession.open(); // open the session this.localyticsSession.upload(); // upload any data . . . }
  • 124. • onResume 메소드 Override public void onResume() { super.onResume(); this.localyticsSession.open(); } • onPause 메소드 Override public void onPause() { this.localyticsSession.close(); this.localyticsSession.upload(); super.onPause(); }
  • 126. # 8. 1000 피트의 뷰.
  • 129. 자세히 (0 feet) 봐야 할까?
  • 131. 3만 피트 vs 0 피트의 뷰. 3만 피트 • 다이어그램의 Line의 의미는? • 의존성? • 데이터 흐름? • 버스와 같은 공유자원? 0 피트 • 너무 상세한 정보임. • 전체적인 구조를 보지 못함.
  • 133.
  • 134. STAN (Structure Analysis for Java) STAN - http://stan4j.com/eclipse/eclipse-integration.html
  • 135. Robert C. Martin의 그래프
  • 136. Instability •패키지의 움직일 수 있는 여력을 판단하는 지표 •다른 패키지에 영향을 미치지 않고, 해당 패키지를 쉽게 변경 할 수 있는가? •Instability I = Ce / (Ca+Ce) •Ce = Efferent Coupling (Ingoing Dependencies) •Ca = Afferent Coupling (Outgoing Dependencies )
  • 137. Instability Instability I = Ce / (Ca+Ce) 당신의 패키지가 다른 사람이 많이 쓴다면, 즉 Outgoing, Ca가 많다면, 여러분의 패키지는 변경하기 어렵다. 반대로 Outgoing하는 Ca가 적고, Ingoing(다른 패키지만 사용만 하는) Ce, 여러분의 패키지는 쉽게 변경해도 된다. 즉 0.0에서 0.3이면 안정적인 버전, 0.7에서 1.0이면 불안정적인 상태다
  • 138. Abstractness Interface(Abstract) 와 Concrete Class를 비교 A = (#abstract classes / total # of classes) •Abstract class = interface, abstract다 포함 •Total # class = abstract class + concrete class •0 이면 concrete class만 있다. •1 이면 abstract class만 있다.
  • 139. 다시 보는 그래프 다른데서 많이 쓰는 녀석이니 조금 더 abstract를 높여야 돼!
  • 140. 그 외 용어 •Tangled Complexity •순환 참조가 있어 Boundary를 깰 때 •Cyclomatic Complexity •분기 문이 많아 hotspot이 될 가망성이 높은 곳
  • 141. 경고!!! 환자의 외부 증상만 고치는 의사가 되지 말자!! 이러한 정보는 좋은 가이드일뿐!! 숫자에 의존하다가 오히려 아키텍쳐가 무너진다.
  • 142. Q &A

Notas del editor

  1. http://myossdevblog.blogspot.com/2009/03/microlog4android.html