Upload
youngsu-son
View
2.058
Download
0
Embed Size (px)
Citation preview
Open Source Engineering fHalo
신재명 , 오유환 , 강미경 , 김영호
fHalo 팀
손영수
오픈소스 란 .
3 명의 거장 .
Richard Stall-man
Linus Torvalds Eric S. Ray-mond
처음 시작과 달리 현재의 오픈 소스는 ...
인류애의 사랑 그리고 기업들의 총성 없는 전쟁이 공존하는 곳
애플이 바라보는 Open Source
소프트웨어 자산 나쁜 마켓 쉐어링 Half-Open/Half-Close
구글이 바라보는 Open Source
소프트웨어 자산 Free Outsourcing(EcoSystem 구축 )
표준화 및 비 표준화
재미난 Web 브라우저 시장
Google 이 잘될수 밖에 없는 이유 ..
• CanvasGL – a GPU-accelerated We-bkit
1. 라이선스 조사
Open Source License
주요 License 비교GPL LGPL MIT BSD Apach
e
저작권 보호 기능 O O O O O
상용 SW 사용 가능 O O O O O
기능 확장 공개 의무 O O X X X
특허권 행사 가능 X X X X O
독점 프로그램에서 사용 가능 여부 X O O O O
라이선스 전파 여부 O O X X X
Open Source License
출처 http://bit.ly/JqfTFz , 2008 년
Open Source License 통계는 ?
GPL LGPL
BSD MIT
기타
GPL (60%)
LGPL (7%)BSD (6%)MIT (2%)
Open Source License
MPL (4%)BSD (64%)GPL (32%)
GPL BSD
MPL 기타
그리고 , 현재는 ?SourceForge, Code Complex, Google Code, Savannah, RubyForge, GitHub.
출처 , http://bit.ly/K8dZtU , 2011 년
주요 License 특허권 행사GPL LGPL MIT BSD Apach
e
저작권 보호 기능 O O O O O
상용 SW 사용 가능 O O O O O
기능 확장 공개 의무 O O X X X
특허권 행사 가능 X X X X O
독점 프로그램에서 사용 가능 여부 X O O O O
라이선스 전파 여부 O O X X X
주요 오픈소스 SW 사례
오픈 소스 라이선스 위반
오픈 소스 라이선스 분쟁
오픈 소스 라이선스 위반 사례
2. Committer & Reviewer Policy
OSP 의 방향을 좌우 하는자 Committer & Reviewer..
• 정부 주도형 – Webinos (EU 에서 주관 )
• 기업 컨소시엄 주도형– Webkit ( Apple + Google)
• 폐쇄형– jQuery ( 개인마음대로 -> Boarding 맴버 선정 )
3. 공개 이전에 사용부터 .Android 의 문제를 오픈소스로 ..
3.1 REST 의 귀찮음 .
Stub
Proxy
DAOCon-troller
REST
GETDTO
AfterRefactoringCustomer
+AmountInvoicedIn(Period: DateRange)+AmountRecievedIn(Period: DateRange)+AmountOverDueIn(Period: DateRange)
BeforeReactoringCustomer
+AmountInvoicedIn(start: Date, end: Date)+AmountRecievedIn(start: Date, end: Date)+AmountOverDueIn(start: Date, end: Date)
같이 뭉쳐 다니는 파라메터는 ParameterObject 로 묶어라 !
XML 파싱 이렇게 ??
Simple Framework 를 이용하세요 .
http://simple.source-forge.net/
이렇게 됩니다 .
3.2 아직도 Logcat?
여러분이 만든 시스템이 죽었다 .
미국에서… .
Logcat 보러 출장 ?
새로운 log..
4
먼저 Log Management 패턴부터…
log4xxx
Microlog4android 사용법• http://code.google.com/p/microlog4android/down-
loads/ 에서 microlog4android-1.0.0.jar 다운• Android 프로젝트에 jar 추가• AndroidManifest.xml 에
android.permission.WRITE_EXTERNAL_STORAG E 추가
로그를 Network 서버로 보내는
Appender 도 있으나약간의 코딩이 필요 .
4. Open Source Engineer-ing
4.1 Facebook 의 가치 그리고 문제점 ..
세계에서 가장 큰 서비스?
854,750,780( 약 8 억 5 천만 )
가장 오랜시간 이용하는 서비스?
Social Plugin ?Open Graph ?Social Channels ?Authentication ?Graph API ?
을 개발하려면… 너무 많은 것을 알아야 한다 .
batchFB
facebook SDK for AndroidzendFBlibfacebook-AWD
facebook SDK for .net
을 개발하려면… 쓸만한 녀석이 없다 ..
확장성 편의성 사용성 안정성
Framework 의 문제점 ..
?기존
framework
facebook framework Project
그래서 우리는 ..
를 시작했습니다 .
4.2 Facebook 기본 개념
47
소셜 그래프
48
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 형태로 응답을 받는다
49
Graph API Example• https://graph.facebook.com/100001066448386/
• https://graph.facebook.com/40796308305/
신재명 ID
코카콜라 페이지 ID
50
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/ 참고
51
Connection - Example• Graph API 예시
– https://graph.facebook.com/100001066448386/friends
그럼 보안문제는 ???
52
Access Token• 페이스북 API 를 사용하기 위해 Access Token(인증 ) 이 필요하다 .
• Graph API Explorer 를 통하여 쉽게 Access To-ken 을 받아올 수 있음
53
About Graph API• Graph API Explorer
– Access Token 받을 수 있다– 각종 Graph API 를 테스트 해볼 수 있다
https://developers.facebook.com/tools/explorer#!/tools/explorer
4.3 Facebook 개발 도구에 대한 문제인식
Graph API 를 이용하여 친구리스트를 가져오는 소스자신의 친구리스트를 가져오는 그래프 API 를 호출한 다음반환 값인 JSON 데이터를 일일이 파싱하는 과정을 거침
try{URL url = new URL("https://graph.facebook.com/friends?access_token=ACCESS_TOKEN");connection = (HttpsURLConnection) url.openConnection();connection.setRequestMethod("GET");connection.setRequestProperty("Content-Type" , "application/x-www-form-urlencoded");connection.connect();InputStreamReader reader = new InputStreamReader(connection.getInputStream());bufferedReader = new BufferedReader(reader);String temp = null;StringBuffer buffer = new StringBuffer();while ((temp = bufferedReader.readLine()) != null) {
buffer.append(temp);}JsonObject json = new JsonObject(buffer.toString());JsonArray jsonArray = json.getJsonArray(“data”);For(int i=0;i<jsonArray.length();i++){
JsonObject jsonObject = jsonArray.getJsonObject(i);System.out.println(“My friends : " + json.get("name"));
}}connection.disconnect();
간단한 것 하나 하려고 해도코드를 길게… ..
그리고 너무 복잡하다 .
타 framework 의 문제점
안정적이지 못한 구조 , Circular dependency 발생facebook SDK for Android
높은 오염도 내포 , 다양한 문제요소
Tangled
Pollution : 4.19 Pollution : 2.18
facebook SDK for Android
타 framework 의 문제점
4.4 Facebook 프레임워크 개발하기
먼저 프로젝트 목표 ( 품질 ) 설정• Framework 의 80 대 20 법칙• 높은 사용성 확보 . ( 쉬운 개발 )• 튼튼한 아키텍처 확보• 오픈 소스를 통한 공유와 확장
4.4.1 팀원의 크기에 맞게 운용
Small Team Large Team
Framework 를 구축하는 팀원이 작으면 ..
Small Team
Simple Design
Consistency Design
Focus on 80/20 Rules
Large Team
Framework 를 구축하는 팀원이 매우 많다면 ..
Powerful Design
Lack Consistency
Remove Requirements
Framework 핵심 기능 찾기내가 만들 FB App 에 필요한 기능들 추출 ..
분류화 시키기 Framework 핵심 기능 찾기
20/80 Rule 에 의거한 기능 추출Framework 핵심 기능 찾기
우리가 만든 오픈소스 (프레임워크 )를 과연 다른 개발자가 쓸까?
사막을 달리고 있지 않나요 ?
4.4.2 높은 사용성 확보
You need Feedback.
DO design APIs by first writing code samples for the main scenarios and then defining the object model to support the code sam-
ples.
Code Samples
Read Filestatic void Main(string[] args) { StreamReader sr =
File.OpenText("MyFile.txt"); string s = sr.ReadLine();
while (s != null) { s = sr.ReadLine(); Console.WriteLine(s); } }
static void Main(string[] args){ foreach (string s in
File.ReadAllLines("MyFiles.text")) { Console.WriteLine(s); }}
Feedback (Read File)
Object Model Listing
framework 사용자 시나리오 산출
framework 사용자 시나리오 산출
framework 사용자 시나리오 산출
framework 사용자 시나리오 산출
친구 리스트 가져오기 ( 페이스북 API)
친구 리스트 가져오기– Rest FB
• Connection<User> myFriends = facebookClien-t.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"), Parame-ter.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);
4.4.3 튼튼한 아키텍쳐
튼튼한 아키텍쳐의 중요성 ..그리고 어떻게 파악하지 ?
왜 오픈소스에서 아키텍쳐가 중요한가 ?
높이 (30000 feet) 봐야 할까 ?
높이 봐야 할까 ?
자세히 (0 feet) 봐야 할까 ?
자세히 봐야 할까 ?
3 만 피트 vs 0 피트의 뷰 .3 만 피트• 다이어그램의 Line 의 의미는 ?
• 의존성 ?• 데이터 흐름 ?• 버스와 같은 공유자원 ?
0 피트• 너무 상세한 정보임 .• 전체적인 구조를 보지 못함 .
해결책은 ..적절한 1000 피트의 뷰
또 하나의 도구 – Code Metrics
Demo
STAN (Structure Analysis for Java)
STAN - http://stan4j.com/eclipse/eclipse-integration.html
Demo
Robert C. Martin 의 그래프
Instability•패키지의 안정성을 측정•다른 패키지에 영향을 미치지 않고 , 해당 패키지를 쉽게 변경 수 있는가 ?
•Instability I = Ce / (Ca+Ce)
•Ce = Efferent Coupling (Outgoing Dependencies)•Ca = Afferent Coupling (Ingoing Dependencies )
Instability
Instability I = Ce / (Ca+Ce)당신의 패키지가 다른 사람이 많이 쓴다면, 즉 Outgoing, Ce가 많다면, 여러분의 패키지는 변경하기 어렵다.
반대로 Outgoing하는 Ce가 적다면, 여러분의 패키지는 쉽게 변경해도 된다.즉 0.0에서 0.3이면 안정적인 버전, 0.7에서 1.0이면 불안정적인 상태다
당신의 패키지를 누군가 많이 쓰고 있다면
바꾸기 쉽지 않다 .
AbstractnessInterface(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 만 있다 .
다시 보는 그래프
조금 더 ab-stract 를 높여야 돼 !
그 외 용어•Tangled Complexity
• 순환 참조가 있어 Boundary 를 깰 때•Cyclomatic Complexity
• 분기 문이 많아 hotspot 이 될 가망성이 높은 곳
경고 !!!환자의 외부 증상만 고치는 의사가 되지 말자 !!
이러한 정보는 좋은 가이드일뿐 !! 숫자에 의존하다가 오히려 아키텍쳐가 무너진다 .
4.4.4 fHalo 아키텍쳐 리팩토링
아키텍쳐 구조도 및 오염도 1. facebook SDK for Android
아키텍쳐 구조도 및 오염도 2. restFB
Tangled
RestFB Refactoring• STEP 1. 구조 분석하기
RestFB Refactoring 전• STEP 2. 문제 원인 분석하기
fHalo Refactoring 결과• STEP 2. 문제 원인 분석하기
fHalo Refactoring 결과• STEP 3. 패키지 분리
Wrapper Facade
RestFB Refactoring 전• STEP 4. 가독성있는 네이밍 정의
어떻게 써야하지 ?
fHalo Refactoring 결과• STEP 4. 가독성있는 네이밍 정의
아키텍쳐 구조 – fHalo Framework
아키텍쳐 오염도
fHalo Framework
Pollution : 0.97
- Gof 디자인 패턴의 저자 / 프레임워크의 대가 Ralph Johnson
“ 안정화된 framework 을 얻기 위해 최소 3 번의 target application 을 기반으로 만들어진 framework 여야 된다 .”
- Gof 디자인 패턴의 저자 / 프레임워크의 창시자 Ralph Johnson
1. 자체적인 Target Application 개발2. 페이스북을 활용하는 ‘ Yellow Ribbon’ 팀과의 협력3. 페이스북 헤카톤으로 또 한번의 검증
4.4.5 3 Example 로 품질 확보하기
Target Application - enjoybazaar
Target Application – Yellow Ribbon
Target Application – Promise Mind
4.4.6 외부로 오픈하기
Project Page Open! – jQuery Page
Project Page Open!
github Repository Open Page Open!
Step by Step Tutorial
Step1Import fHalo.jar
Step2Get access token
Step3Create instance
Step4Using API
Video Tutorial
Video Tutorial 동영상 통계자료
Video Tutorial – Feedback 1
- jQuery, Spring 과 같이 성공한 OpenSource 로 발전
- 타임라인 / 크레딧 등 페이스북에서 제공되는 신규 기능들을 꾸준히반영하여 All in One SDK 로 발전
- 페이스북의 Meta Data 를 활용할 수 있는 DA(Data Analysis) 와
DV(Data Visualization) 를 제공하는 SDK 발전 , 페이스북 개발자 생태계에 좋은 영향을 제공
- 현재 진행한 프로젝트는 다양한 세미나 주제 발표와 월간 ‘마이크로 소프트웨어’에 3~4 개월여에 걸쳐 기고 하여 , 널리 알리고 공유할 예정 .
fHalo 향후 발전방향
- 오픈소스 SW 의 탄생부터 현재까지의 역사를 한눈에 보여주는 박물관
- 오픈소스 SW 의 개발과 진화과정을 추적하고 공개하는 사이트
- 품질을 평가할 수 있는 다양한 지표들을 제공
Ohloh.net
5. Git & GitHub
127
버전 관리 시스템• 프로젝트 파일의 변경사항을 추적하는 시스템• 버전 컨트롤 자동화 , 간편한 소스 변경이력 관리• 손쉬운 협업 , roll back, 병렬작업
128
중앙 집중식 버전관리• CVS(Concurrent Version System),
SVN(Subversion)• 소스변경 이력을 보려면 중앙 저장소에 접근 .
129
분산 버전관리• Git 자신만의 로컬저장소를 가진다• Linux Kernel, Android, Ruby on Rails – Git 이용 예
130
Git 주요 용어
Com-mit
Push
Pull
Client
Server Server Repository
Local Reposi-tory
131
Git 주요 용어• Branch
– 작업 트리중 하나의 가지
– 후에 master branch 와 합치거나 실험해 본 후 삭제• Merge
– Branch 를 합침
132
Git 사용법• Repository
– Github– 네이버개발자센터– Bitbucket
• Github 사용– http://github.com
• Git download– http://help.github.com/win-set-up-git/
133
Git Bash
135
SSH Key 등록
136
Git 기본 환경설정• 기본 환경설정 (Git bash)
– Command 창 에서 이름과 메일을 입력Git config --global user.name “Jaemyung Shin”Git config --global user.mail “[email protected]”
137
Git 설정• Git init 을 통해 로컬 저장소 생성
• Git add < 파일명 > 을 통해 파일 추가
1.Git 설정 2.Commit 3.Push 4.Pull
138
Commit• 변경 사항들을 로컬저장소에 저장• Git commit –m “commit log”
1.Git 설정 2.Commit 3.Push 4.Pull
139
Push• 로컬저장소의 파일을 원격저장소에 저장 • Git push < 원격저장소 URL>
1.Git 설정 2.Commit 3.Push 4.Pull
141
Push 후 GitHub Repository
142
Pull• 원격저장소의 파일을 로컬저장소로 가져옴• Git pull < 원격지 URL>
1.Git 설정 2.Commit 3.Push 4.Pull
143
Egit(Eclipse Git)• Eclipse plug-in 으로 간편히 제공• Help Install New Software Add(http://www.jgit.org/up-
dates)
144
원격 프로젝트 생성• Import Git
– Local : 로컬에있는 Git 프로젝트로 생성– URI : 원격지에 있는 Git 프로젝트 다운 (Pull)
145
원격 프로젝트 생성• URI, Authentication 채우기
– URI : 저장소 주소– Authentication : github ID, PW
146
Egit 사용법• Git project 생성 후
147
Egit 을 이용한 Commit
148
Egit 을 이용한 Commit 이력 보기• Show history
– Commit 이력보기
149
Egit 을 통한 Push• 로컬저장소의 내용을 원격저장소로 전송
150
Egit 을 이용한 Pull• 충돌없을경우 Pull 성공• 충돌할경우 충돌로그
소스구분선
151
Egit 을 통한 roll back• 예전 코드로 복원하기
– Revert commit
6. 마무리 및 참고자료
요약 오픈 소스는 인류애적인 사랑과 밴더들의 전쟁이 공존하는 곳 . 오픈 소스는 소프트웨어 개발에 중요한 Asset 이다 . 사용하든 , 배포하든 라이선스를 주의해라 . 배포시 Committer & Reviewer Policy 를 주의해라 . 외부의 도움 ( 아웃 소싱 ) 을 받기 위해선 구조적 설계가 중요 . 엔지니어링 기법 소개
Git & GitHub 사용법
fHalo Project
참고 자료• License 분류 참고 자료
– http://bit.ly/KkPDBP
• Open Source License 통계– http://bit.ly/JqfTFz – http://bit.ly/K8dZtU
• Github Wiki page – https://github.com/fHalo/fHalo/wiki
참고 자료
Q&A