본문 바로가기메뉴 바로가기


Olive Platform : 카카오에서 제공하는 오픈소스 관리 서비스

카카오에서 제공하는 오픈소스 관리 서비스 Olive Platform을 소개합니다.

오픈소스 사용 비중이 높아지면서, 오픈소스 관리의 중요성도 높아지고 있습니다.
카카오는 수많은 프로젝트에서 사용하는 오픈소스를 관리하기 위해 오픈소스 관리 시스템을 개발하여 사용하고 있는데요, 카카오의 오픈소스 관리 시스템을 누구나 사용할 수 있도록 Olive Platform(이하 Olive)으로 Beta 오픈했습니다. 🎉

Olive는 Github 프로젝트를 분석하여 사용한 오픈소스 데이터를 관리하고, 라이선스 및 의무사항을 확인하여 Report를 제공합니다.

  • Github과 연동하여 실시간으로 Scan(스캔)하고 사용한 오픈소스를 확인할 수 있습니다.
  • 등록된 오픈소스 컴포넌트를 사용하고, 직접 컴포넌트를 등록하여 데이터를 공유합니다.
  • 라이선스 이슈나 체크리스트를 리포트로 확인할 수 있고, 고지문도 생성됩니다.

등록된 데이터는 카카오 오픈소스 관리 부서의 리뷰를 통해 정확한 정보로 업데이트되고 공유됩니다.
Olive를 사용하여 공유 데이터가 증가할수록 더 쉽고, 빠르고, 정확한 오픈소스 검증을 할 수 있습니다.


오픈소스 관리는 왜 필요할까요?

오픈소스 소프트웨어 개발 환경으로의 변화

지난 10년 동안 기업들은 대부분 독점 소프트웨어에서 오픈소스 소프트웨어 개발 환경으로 변화하고 있습니다.

Redhat의 2020년 Enterprise 오픈소스 보고서에 따르면 조사 대상 중 약 95%에서 오픈소스가 “중요” 하다고 보고 있으며, Gartner 조사에서는 주요 IT 조직의 95% 이상이 오픈소스를 사용하고 있다고 합니다. 기업이 이렇게 오픈소스를 사용할 수밖에 없는 이유를 정리해보면 아래와 같습니다.

  • 총 개발 비용 절감
  • 최신 기술 확보
  • 내부 기술 역량 강화
  • 기술 경쟁력 강화
  • 시장의 확대
  • 우수한 개발 인재 확보

오픈소스 생태계는 해를 거듭할수록 급격히 발전하고 있습니다. GitHub에 새로 생성된 공용 저장소의 수만 보더라도 지난 2년 반 동안 폭발적으로 증가하고 있는 것을 확인할 수 있습니다.

이미지 출처 : solutionshub.epam.com Blog

Sonatype의 2020년 Software 공급망 현황 보고서에 따르면 전 세계 javascript 오픈소스 개발자는 약 1,070만 명으로 추산되며, 2020년 javascript 패키지 매니저인 NPM은 1조가 넘는 오픈소스 컴포넌트가 다운로드 되었습니다.(NPM의 경우 매년 100% 성장세를 보입니다.) Java는 오픈소스 개발자가 약 760만 명으로 추산되고, 2020년 연간 오픈소스 컴포넌트 다운로드가 3,760만 건을 상회(전년 대비 55% 증가) 하였습니다.

오픈소스 라이선스 의무사항 준수

오픈소스 사용이 증가하면서 다양한 위험 요소도 증가하게 됩니다. 아마도 많은 분이 위험 요소라고 하면 보안 이슈만 생각할 수 있을 것 같습니다. 오픈소스는 저작권법에 의한 보호를 받습니다. 오픈소스는 소스가 공개되어 누구나 자유롭게 사용, 수정, 배포할 수 있습니다. 오픈소스는 라이선스는 해당 오픈소스를 사용하기 위해 사용자가 지켜야 할 의무 사항을 명시하고 있습니다. 이러한 의무 사항을 제대로 준수하지 않고 사용하면 저작권법 위반이 됩니다.

오픈소스 라이선스 중 GPL 라이선스의 경우에는 오픈소스를 사용하는 조건으로 사용된 애플리케이션의 모든 코드를 공개해야 하는 의무 사항을 가지고 있습니다. 만약 상용 소프트웨어에서 코드 공개를 하지 않고 GPL 라이선스의 오픈소스를 사용하면 저작권법 위반으로 형사처벌을 받을 수도 있습니다. Google·Oracle 자바 소송, VMWare 소송 등 다양한 오픈소스 분쟁 사례가 있습니다.

오픈소스 라이선스는 크게 permissive 라이선스와 copyleft 라이선스로 나눌 수 있습니다.

두 가지 라이선스의 특징은 아래와 같습니다.

permissive 라이선스

  • 고지 의무를 지키면 자유롭게 사용 가능
  • 대표적인 라이선스: MIT, BSD, Apache 등

copyleft 라이선스

  • 고지 의무 + 코드 공개 의무
  • 사용한 오픈소스의 라이선스와 동일한 조건으로 배포 의무
  • 대표적인 라이선스: GPL, LGPL, AGPL, MPL 등

오픈소스 라이선스의 의무 사항은 배포가 이루어질 때 적용됩니다. 여기서 배포란 소스 코드 또는 바이너리의 복사본을 다른 사람에게 제공하는 행위를 의미합니다.
앱스토어 배포, 판매, 3rd party 제공, 공개된 코드 등이 배포에 해당합니다. 개인적으로 사용하거나 외부에 공개하지 않고 사내 툴로 만 사용하는 경우는 배포에 해당하지 않습니다.

Olive 탄생 배경

카카오는 오픈소스를 올바르게 사용하고 관리하기 위해 2014년 11월에 오픈소스 관리를 위한 조직을 신설했습니다. 카카오톡을 시작으로 오픈소스 라이선스 검증이 이뤄졌으며, 현재는 배포되는 모든 서비스와 SDK, 오픈소스를 대상으로 오픈소스 라이선스 검증이 진행되고 있습니다.

카카오는 “새로운 연결, 더 나은 세상”이라는 슬로건에 맞춰 다양한 서비스를 제공하고 있습니다. 다양한 서비스에서 사용한 오픈소스를 확인하고, 관리하기 위해 자동화된 도구가 필요했습니다.

코드 레벨의 분석 솔루션 도입과 함께 오픈소스 관리 도구인 Hermes를 개발하여 Android, iOS 앱 대응부터 검증 자동화를 시작했습니다. 늘어나는 서비스의 다양한 개발 환경과 언어, 다양한 플랫폼에 대응하고, 특히 카카오 미니의 출시 당시엔 OS 레벨까지 오픈소스 검증 범위가 확장되었습니다. 또한, 사내의 오픈소스 정책들을 수립하고 개발자들 대상으로 오픈소스 교육도 병행하여 오픈소스 사용에 대한 인식을 개선해 나갔습니다.

자동화, 효율화를 통해 검증 시간을 줄이고, 품질도 향상되었지만 검증을 오픈소스 관리 조직에서 전담하다 보니 한정된 리소스로 모든 서비스에 대응하기가 어려워졌습니다. 서비스에서는 오픈소스 검증이 완료되어야 이슈를 확인하고 대응할 수 있었습니다. 자동화 이상의 새로운 전략이 필요한 상황이었습니다.

우리는 오픈소스 관리 시스템을 개발자 모두가 주도적으로 참여할 수 있는 서비스로 확장하기로 했습니다.

서비스 개발자는 언제든 오픈소스 검증을 진행하여 사용한 오픈소스와 리포트를 확인하고 대응할 수 있도록 했습니다. 서비스 개발이 완료되면 배포전에 검증을 수행하고 Admin 리뷰를 요청하도록 했습니다. 검증 결과에 대한 최종 확인은 오픈소스 관리 조직에서 진행하는 형태로 개편이 진행되었습니다.

프로토타이핑 단계

Olive 개발은 크게 프로토타이핑, 카카오 사내 시스템 오픈, 그리고 외부 서비스 오픈의 3단계로 진행되었습니다.

프로토타이핑은 기본적인 계정 관리, 단순한 도메인 설계, 그리고 핵심이 되는 검증 기능이 주축이 되었으며, 전반적인 기술 셋의 활용 범위를 검사하는 데 목표를 두었습니다. Backend는 Spring Boot를 기반으로 하며, Front는 Angular로 개발을 진행하였습니다. 개발 환경은 카카오 내부의 인프라 중 Kubernetes 환경을 적용하여 자동화된 CI/CD를 통한 DevOps 환경을 구축하는 데 신경을 썼습니다.

특히, 프로토타이핑 단계에서 중점을 두었던 부분은 유사 서비스의 사례 조사와 시장 동향을 파악하고, 조직 내 인사이트를 확보하는 것이었습니다. 당시 오픈소스 라이선스 검증 서비스는 국외를 중심으로 급격히 발전하고 있었으며, 국내에는 아직 본격적인 서비스가 이뤄지기 전이었습니다. 유사 서비스를 참고하여 기획과 구성이 이뤄졌습니다. 유사 서비스 파악은 초기 1회가 아니라 수시로 검사하여 파악하다 보니 Olive 개발이 진행되는 동안에 이미 공개된 유사 서비스들이 어떤 방향으로 계속 개선되어 가는지 모니터링이 되어 큰 도움이 되었습니다.

기술적으로는 Spring Boot, JPA, QueryDSL, Angular, RxJS, DDD 등 스터디를 진행하며 역량 개발을 하는 시기이기도 했습니다. 그뿐만 아니라 사내 LDAP, Enterprise Github, 외부 솔루션 연동 등 외부와의 연동 모듈도 개발이 진행되었습니다.

카카오 사내 시스템 오픈

프로토타이핑 단계를 성공적으로 마치고, 다양한 피드백을 받아 기획이나 개발 방향을 수정하고, 본격적으로 Olive 사내 오픈을 위한 개발이 진행되었습니다. 프로토타이핑 단계에서는 기존 오픈소스 관리 도구였던 Hermes와 연관성을 최소화하고 개선될 방향성과 신규 기능에 초점이 있었다면, 사내 오픈 단계에서는 기존 시스템과의 연관성을 고려하고, 기존의 데이터도 어떻게 마이그레이션 할 것인가에 대한 추가적인 고민이 이뤄졌습니다. 기존 시스템을 종료했을 때를 고려하여 모든 대체 기능이 올바르게 구현되었는지 확인도 필요했습니다. 그뿐만 아니라 프로토타이핑 단계에서 고려되지 않았던 다양한 사례들을 고려한 로직들이 하나둘 이전되었습니다. 동시에 오픈소스 검출과 라이선스 검증을 위한 분석 모듈도 대대적으로 개선되어 적용되었습니다.

당시 팀원 대부분이 Angular를 처음 접하는 상황이었고, 프로토타이핑을 진행하는 동안 팀 스터디를 지속해서 진행했습니다. 그럼에도 사내 오픈 개발이 진행되는 동안 점점 더 복잡한 화면 구성과 커스터마이징이 필요했고, 이와 관련해서 많은 어려운 점들이 있었습니다. 좀 더 적극적인 기술 공유, 코드 리뷰와 협업 등의 과정을 통해 어려운 문제들을 해결했습니다. 해결된 이슈들은 사내 Wiki에 차곡차곡 정리되어 쌓여 갔고, 다음번 유사한 이슈가 발생하거나 새로운 구성원이 오더라도 참고할 수 있는 유용한 자료가 되었습니다.

사내 시스템 오픈으로, 서비스 개발자들이 직접 Olive를 사용하면서 기대했던 효과도 얻을 수 있었습니다.

  • 본인의 코드를 직접 검증하여 개발자의 오픈소스 라이선스에 대한 이해도가 높아졌습니다.
  • 서비스 개발자가 검증한 정보들을 바탕으로 리뷰가 진행되어 이전보다 신속하고 정확한 검증이 진행되고 있습니다.

개발 문화 개선

코로나가 가져온 원격 개발 환경과 함께 Olive 프로젝트는 저희 팀에도 많은 변화를 가져오게 했습니다. 가장 큰 변화 두 가지는 지라(Jira: 이슈 관리 시스템)를 이용한 이슈 관리와 PR 리뷰(Review)입니다.

사내 지라를 본격적으로 적용하게 되면서 모든 작업은 지라에 등록하여 관리했습니다. 개발한 코드들도 전부 지라 이슈와 연동이 되고 업무 공유가 이전보다 훨씬 더 원활하게 이뤄졌습니다. 발생하는 모든 이슈는 백로그로 등록되어 진행되며, 개발 프로세스 전반에 애자일(Agile)을 적용하여 짧은 스프린트(Sprint: 반복적인 개발 주기)로 업무를 계획하고 수시로 업무 진행 상황을 지라에 반영하였습니다. 매일 오전에 원격으로 미팅을 하고, 보드를 공유하면서 진행 상황이나 이슈를 공유했습니다. 다음 스프린트와 배포에 나가게 될 기능(feature)들을 선정하고, 예상되는 문제(Risk)는 사전에 점검합니다.

또한 모든 팀원이 코드 리뷰의 중요성은 인지하고 있었지만 실천하기가 어려웠는데 Olive 프로젝트에서는 코드 리뷰도 적극적으로 진행하게 되었고, 현재는 최소한 1명의 리뷰가 완료되어야 병합(Merge)이 가능하며, 중요한 이슈는 모두가 리뷰해야 병합이 가능하도록 하고 있습니다. 코드 리뷰는 개선되어야 할 사항의 공유뿐만 아니라 서로 소통하는 것이 중요한데, 구현이 잘 된 부분은 칭찬하고, 앞으로 발생할 수 있는 우려 사항도 언급하여 함께 고민하고 토론을 통해 더 나은 답을 찾고, 그 과정에서 서로 배우고 있습니다.

Olive PlatformBeta 서비스 오픈

Olive 사내 오픈 이후 어느 정도 보완하는 작업을 거친 뒤에 다음 단계인 외부 서비스 오픈을 준비했습니다. 외부 서비스는 기능을 최소화하고 핵심 기능에 중점을 두었으며 오픈 소스 라이선스 등에 다소 생소한 사용자도 접근하여 쉽게 사용할 수 있도록 고민을 했습니다. 이러한 고민을 통해 Github 연동을 통한 오픈소스 검증과 함께 SimpleCheck 기능이 추가되었습니다.

  • 오픈소스 검증 : github 계정의 프로젝트를 추가하여 실시간 Scan 및 관리합니다.
    • (현재는) 본인의 깃헙 계정과 조직에 owner 권한이 있는 public repository 만 대상입니다.
  • Simple Check : 간단하게 Package Management 설정 파일을 업로드하여 사용한 오픈소스를 확인할 수 있습니다.
    • OLIVE에서 관리 중인 오픈소스 외에, 실시간으로 오픈소스 Component 정보를 조회하여 함께 보여줍니다.

외부 서비스 오픈은 비교적 짧은 기간에 개발이 완료되었는데 이는 사내 Olive보다 기능이 축소되고, 일부 기능들이 모듈화되어 재사용된 것도 있지만 오픈소스를 이용했고, 오픈 소스의 도움을 많이 받았고, 팀원 모두가 목표를 향해 주도적으로 노력한 덕분입니다!

아직 부족하지만 Beta 기간 동안 완성도를 높여 정식 오픈하겠습니다. 앞으로, Github 개인(private) 저장소 지원을 시작으로 다중(Multi) 프로젝트 지원, 배포 환경에 따른 정책(Policy) 적용 등이 적용될 예정입니다. 또한, 분석 모듈의 오픈소스 공개도 계획하고 있습니다.

Olive를 사용하면서 오픈소스 대한 이해가 높아지고, 제대로 사용하는 데 도움이 되도록 하겠습니다. 특히, 많은 인디 개발자와 소규모 벤처들의 오픈소스 관리에 도움이 되기를 기대합니다. 문의나 피드백은 서비스 하단의 톡 문의나 의견 남기기를 이용해 주세요. 의견 주시면 검토하여 반영될 수 있도록 노력하겠습니다. 감사합니다.


Reference

  • https://www.redhat.com/en/enterprise-open-source-report/2020
  • https://www.gartner.com/en/documents/3371817/hype-cycle-for-open-source-software-2016
  • https://www.sonatype.com/resources/white-paper-state-of-the-software-supply-chain-2020
  • https://solutionshub.epam.com/blog/post/examining-open-source-license-usage
  • https://zdnet.co.kr/view/?no=20201008104543
  • https://www.oss.kr/news/show/29b5eabd-9939-4609-b4f8-61f0a6dcb374
오픈소스기술파트
오픈소스기술파트 다양한 사람들이 모여 카카오의 오픈소스를 관리하고, Olive를 개발하는 오픈소스기술파트 입니다.
Top Tag
2021
2021-new-krew
Ad Platform
Ad tech
adaptive-hash-index
adt
adtech
agile
agilecoach
ai
algorithm
Algorithm/ML
Algorithm/Ranking
almighty-data-transmitter
Analyzer
android
angular
anycast
App2App
applicative
Architecture
arena
ast
async
aurora
babel
babel7
Backend
BApp
bgp
big-data
binary
ble
blind-recruitment
block
Block Chain
blockchain
bluetooth
brian
business
Cache
cahtbot
canvasapi
Caver
cch
cd
CDR
ceph
certificate
certification
CF
cgroup
chrome
ci
cite
client
clojure
close-wait
cloud
cloudera-manager
clustered-block
cmux
cnn
code-festival
code-review
codereview
coding
coding test
Collaborative Filtering
competition
Compliance
component
conference
consul
container
contents
contest
contribution
cookie
core-js@3
Corporate Digital Responsibility
couchbase
COVID-19
cpp
Data
data-engineering
DB
deep-learning
Dependency
dependency-graph
desktop
dev
dev-session
dev-track
developer
developer relations
developers
devops
digitalization
digitaltransformation
dns
docker
dr
Electron
employeecard
emscripten
eslint
extract-text
Feature List
Featured
Feedback
friendstime
front-end
frontend
functional-programming
funfunday
fzf
garbage-collection
gawibawibo
GC
github
globalpollution
go
graphdb
graphql
Ground X
growth
ha
hadoop
hate speech
hbase
hbase-manager
hbase-region-inspector
hbase-snashot
hbase-table-stat
hbase-tools
hri
ICPC Sinchon
id
if kakao
ifkakao
infrastructure
innodb
internship
ios
item
Java
javascript
javascript web-assembly
JCMM
JIRA
jsconf
jsconfkorea
json
k8s
kafka
kakao
kakao-Career-Boost-Program
kakao-commerce
kakao-games
kakaoarena
kakaobrain
kakaocommerce
kakaocon
kakaoenterprise
kakaok
kakaokey
kakaokrew
kakaomap
kakaopage
kakaotalk
KAS
KCDC
khaiii
Klaytn
Klip
kubernetes
l3dsr
l4
License
links
Linux
load-balancing
MAB
Machine Learning
machine-learning
map
marathon
meetup
melon
mesos
message
Messaging
microservice
Microsoft TypeScript
mm
mobil
mocking
monad
monorepo
ms-office
MSA
mtre
mysql
mysql-realtime-traffic-emulator
nand-flash
network
new
new-krew
nfc
Nickface
nomad
ocp
olive
onboarding
open
open source
opensource
openstack
OpenWork
OSS
page
parallel
PBA
performance
planning poker
Platform
polyfill
programming-contest
project-structure
pycon
python
quagga
react
reactive-programming
reactor
recap
recommendation
recommendation system
recruitment
redis
redis-keys
redis-scan
related-blind
Renderer
rest
Rome
rubics
ruby
rxjs
s2graph
scala
scalaz
seminar
Serve
server
service
service worker
sharding
shopping
Shuffle Partition
socket
spark
spark-streaming
SpringBoot
ssd
Statistics/Analysis
Stomp
storage
storm
style-guide
summer internship
support
System
talk
talkchannel
tcp
tech
Techtalk
test
thread
Thread-Debugging
time-wait
tmux
Topic Modeling
typescript
Untact
update
User Story
vim
vim-github-dashboard
vim-plugin
vue
vue.js
WASM
web-cache
web-worker
webapp
webgl
WebSocket
webworkers
weekly
work
workplatform
개인화 추천
길찾기
라이선스
연관 추천
오픈소스
오픈소스검증
의존성분석
일하는방식
협업
All Tag
2021
2021-new-krew
Ad Platform
Ad tech
adaptive-hash-index
adt
adtech
agile
agilecoach
ai
algorithm
Algorithm/ML
Algorithm/Ranking
almighty-data-transmitter
Analyzer
android
angular
anycast
App2App
applicative
Architecture
arena
ast
async
aurora
babel
babel7
Backend
BApp
bgp
big-data
binary
ble
blind-recruitment
block
Block Chain
blockchain
bluetooth
brian
business
Cache
cahtbot
canvasapi
Caver
cch
cd
CDR
ceph
certificate
certification
CF
cgroup
chrome
ci
cite
client
clojure
close-wait
cloud
cloudera-manager
clustered-block
cmux
cnn
code-festival
code-review
codereview
coding
coding test
Collaborative Filtering
competition
Compliance
component
conference
consul
container
contents
contest
contribution
cookie
core-js@3
Corporate Digital Responsibility
couchbase
COVID-19
cpp
Data
data-engineering
DB
deep-learning
Dependency
dependency-graph
desktop
dev
dev-session
dev-track
developer
developer relations
developers
devops
digitalization
digitaltransformation
dns
docker
dr
Electron
employeecard
emscripten
eslint
extract-text
Feature List
Featured
Feedback
friendstime
front-end
frontend
functional-programming
funfunday
fzf
garbage-collection
gawibawibo
GC
github
globalpollution
go
graphdb
graphql
Ground X
growth
ha
hadoop
hate speech
hbase
hbase-manager
hbase-region-inspector
hbase-snashot
hbase-table-stat
hbase-tools
hri
ICPC Sinchon
id
if kakao
ifkakao
infrastructure
innodb
internship
ios
item
Java
javascript
javascript web-assembly
JCMM
JIRA
jsconf
jsconfkorea
json
k8s
kafka
kakao
kakao-Career-Boost-Program
kakao-commerce
kakao-games
kakaoarena
kakaobrain
kakaocommerce
kakaocon
kakaoenterprise
kakaok
kakaokey
kakaokrew
kakaomap
kakaopage
kakaotalk
KAS
KCDC
khaiii
Klaytn
Klip
kubernetes
l3dsr
l4
License
links
Linux
load-balancing
MAB
Machine Learning
machine-learning
map
marathon
meetup
melon
mesos
message
Messaging
microservice
Microsoft TypeScript
mm
mobil
mocking
monad
monorepo
ms-office
MSA
mtre
mysql
mysql-realtime-traffic-emulator
nand-flash
network
new
new-krew
nfc
Nickface
nomad
ocp
olive
onboarding
open
open source
opensource
openstack
OpenWork
OSS
page
parallel
PBA
performance
planning poker
Platform
polyfill
programming-contest
project-structure
pycon
python
quagga
react
reactive-programming
reactor
recap
recommendation
recommendation system
recruitment
redis
redis-keys
redis-scan
related-blind
Renderer
rest
Rome
rubics
ruby
rxjs
s2graph
scala
scalaz
seminar
Serve
server
service
service worker
sharding
shopping
Shuffle Partition
socket
spark
spark-streaming
SpringBoot
ssd
Statistics/Analysis
Stomp
storage
storm
style-guide
summer internship
support
System
talk
talkchannel
tcp
tech
Techtalk
test
thread
Thread-Debugging
time-wait
tmux
Topic Modeling
typescript
Untact
update
User Story
vim
vim-github-dashboard
vim-plugin
vue
vue.js
WASM
web-cache
web-worker
webapp
webgl
WebSocket
webworkers
weekly
work
workplatform
개인화 추천
길찾기
라이선스
연관 추천
오픈소스
오픈소스검증
의존성분석
일하는방식
협업

위로