20. 조금 큰 API의 이해 - 코르도바
API, 라이브러리, 컴포넌트, 프레임웍, 서비스, whatever.
초급 편에서 모든 것이 API라고 한 이후 다양한 개발 도움용 API를 접하였다. 이번에는 조금 더 거대한 API를 알아보려고 한다. R/W(Reading/Writing) 능력 중 Reading 능력만 가졌으면 한다. 중급 편에서 추구하는 것은 native app 중심이지 web app 중심이 아니기 때문이다. 커피 전문점에서 빵을 팔고 베이커리에서 커피를 파는 퓨전 시대긴 하지만 본분이 무엇인지 잊으면 안 되겠다. 본분이라고 거창하게 표현하지만 실은 그 중심에 "기업은 이윤추구"의 진리가 있다. iOS 중심으로 설명하면 iOS에서 네이티브 API를 이용해서 프로그래밍하도록 애플이 제공한 API를 중심 만들어진 API가 바로 "native API"이다.
모바일 플랫폼
Software, Program, Application, App 모두 모바일 플랫폼 위에서 동작하는 프로그램을 지칭하는 말이다. 10년 넘도록 다양하게 불려지다. 최근에는 "앱"으로 통일되는 추세인 것 같다. 휴대폰 OS의 경우 팜(palm), 심비안, 블랙베리, iOS, Android, 바다, 타이젠, 우분투 등 춘추전국 시대에서 Android와 iOS 두 개의 플랫폼으로 정리가 된 것 같다. HTML5에서 처음 각 회사들이 통일된 마음을 가진 것을 계기로 웹뷰를 중심으로 동일 소스로 통일해 보고자 했던 것이 바로 하이브리드 플랫폼이다. 웹뷰긴 하지만 웹 브라우저의 웹앱 들과는 다르게 네트워크가 끊긴 상태에서도 동작하는 것으로 base는 native app으로 보면 된다. 네이티브 기반이지만, HTML5, CSS, JAVA SCRIPT를 쓸 수 있는 웹뷰가 달려 있고 해당 웹뷰와 네이티브 앱 기능을 연결시켜주는 메커니즘이 구현되어 있다면 하이브리드 플랫폼이라고 보면 되겠다. 이 중 가장 인기 있는 모바일 플랫폼은 코르도바(CORDOVA)이며, 이름을 밝힐 수는 없지만 다양한 플랫폼이 코드도 바 소스 코드를 이용해서 자사의 하이브리드 플랫폼을 만들었다. 실무 경험을 토대로 소스 비교까지 하며 "~를 베꼈네." 혹은, "~를 벤치마킹했네"라고 쉽게 말해 버리기에는 그 플랫폼으로 먹고사는 사람이 많기 때문에 잘해 나가길 빌 뿐이다. 잘해 나가길 바란다는 뜻은 구글이나 애플이 Android, iOS의 API를 업데이트하면 코르도바에서 잘 지원이 되도록 모니터링 혹은 패치를 하고 또 그 패치가 벤치마킹된 플랫폼에 잘 녹아들기를 바란다. 마이크로 서비스가 유행하는 지금은 사실, 네이티브 중심으로 갈 것 같고 내가 구글이나 애플 사장이라고 해도 자사가 유리한 경쟁을 할 것 같다. 물론, 전체적 입장에서 보면 둘의 경쟁이 제품 품질을 더욱 향상할 것 같다. 이 책에서는 애플 플랫폼만 볼 예정인데 그 이유인 즉, 수십 년 간 공룡 회사들의 프로젝트를 지켜봤을 때 하드웨어와 소프트웨어를 동시에 잘 만드는 회사는 애플이 최초기도 하고, 또 지금에도 유일하기 때문이다.
CORDOVA
구글링을 통해 코르도바를 설치하여 다음과 같은 메시지가 뜨도록 만들어 준다.
soralee@soraui-MacBookAir ~ % cordova
Synopsis
cordova command [options]
Global Commands
create ............................. Create a project
help ............................... Get help for a command
telemetry .......................... Turn telemetry collection on or off
config ............................. Set, get, delete, edit, and list global cordova options
Project Commands
info ............................... Generate project information
requirements ....................... Checks and print out all the requirements
for platforms specified
platform ........................... Manage project platforms
plugin ............................. Manage project plugins
prepare ............................ Copy files into platform(s) for building
compile ............................ Build platform(s)
clean .............................. Cleanup project from build artifacts
run ................................ Run project
(including prepare && compile)
serve .............................. Run project with a local webserver
(including prepare)
Learn more about command options using 'cordova help <command>'
Aliases
build -> cordova prepare && cordova compile
emulate -> cordova run --emulator
Options
-v, --version ...................... prints out this utility's version
-d, --verbose ...................... debug mode produces verbose log output for all activity,
--no-update-notifier ............... disables check for CLI updates
--nohooks .......................... suppress executing hooks
(taking RegExp hook patterns as parameters)
Examples
cordova create myApp org.apache.cordova.myApp myApp
cordova plugin add cordova-plugin-camera
cordova platform add android
cordova plugin add cordova-plugin-camera --nosave
cordova platform add android --nosave
cordova requirements android
cordova build android --verbose
cordova run android
cordova build android --release -- --keystore="..\android.keystore" --storePassword=android --alias=mykey
cordova config ls
코르도바 플랫폼을 설정하고 example 프로젝트에서 cordova run 해서 다음과 같은 화면이 뜨면 설치가 완료된 것이다.
.
.
.
Hacking
코드 도바에서 가장 중요한 점은 결국 네이티브 앱이라는 점이다. 이에, 코르도바 플랫폼 설정이 아닌 Xcode 에서 프로젝트를 설정하여 네이티브 앱처럼 실행시킬 수가 있다. 플러그인이라고 불리는 네이티브 코드의 경우 코르도바 명령어로 실행시키면서 폴더 구조를 보면 알겠지만 단순히 네이티브 앱 빌드 트리에 추가시켜 주는 역할이다. 안드로이드에서는 네이티브 코드도 리버스 엔지니어링으로 심벌 정보는 깨진 채 소스를 복구할 수 있다. 하이브리드 앱의 경우 네이티브 코드는 심벌 정보가 a, b, c처럼 단순화되더라도 웹 소스는 그대로 복제가 가능하다. 다음과 같이 해보자.
.
.
.
이렇게 복제된 웹 소스를 쓰는 게 찝찝할 수도 있겠다. 실무 이야기를 해 보면 삼성전자에서 각 나라에 나가는 다국어 번역 행정업무를 잠깐 담당한 적이 있는데 단어 하나당 250만 원씩 들었다. 이유는 중국어의 경우 7개 이상 번역이 가능한 전문가의 가격이 비싼데 아랍어와 같은 중동 쪽 번역의 경우 단가가 워낙 쌨기 때문이다. 이후 스타트업으로 넘어오니 모두 이런 리버싱 방법을 통하여 string을 추출해서 썼고, 자본금이 얼마 없는 스타트업에서는 당연한 기술로 생각하고 있었다. 이 외에도 지능적 탈세라던지, 코어 기술을 허가 없이 쓰며 라이선스를 주장하는 스킬 등 적은 자본으로 부자가 될 수 있는 많은 실무 기법들이 있었다.
지능적 탈세
이 부분은 다양한 정의를 구현했었던 필자가 국세청에 직접 고발을 해도 받아들여지지 않았던 방법으로 우수 납세자상까지 탈 수 있는 방법이다. 물론, 지금 정부에서는 허용치 않을 것 같은데 다른 고발건이 아직 완결되지 않은 상태므로 장담은 못하겠다.
.
.
.
#########################################################################
다음 명령어로 코르도바 위치를 찾는다.
locate cordova | grep -v lib | grep -v ...
이미 초급 편 bash shell 공부할 때 여러 명령어를 보아서 인터넷 검색 공부법으로 잘하리라 생각된다. 자주 하는 말이지만 중급 편에서는 따로 따분한 설명을 하지 않겠다. - 다른 저자의 손을 거치면 보다 친절해지리라 생각된다. -
soralee@soraui-MacBookAir ~ % cd /usr/local/bin
soralee@soraui-MacBookAir bin % file cordova
cordova: a /usr/bin/env node script text executable, ASCII text
#########################################################################
require('loud-rejection/register');
const util = require('util');
const { events, CordovaError } = require('cordova-common');
const cli = require('../src/cli');
cli(process.argv).catch(err => {
if (!(err instanceof Error)) {
throw new CordovaError('Promise rejected with non-error: ' + util.inspect(err));
}
process.exitCode = err.code || 1;
// We cannot emit an error event here, as that would cause another error
console.error(err.message);
events.emit('verbose', err.stack);
});
실로 간단한 node.js 소스이다. 파이썬에서 python.c 메인 코드가 한눈에 들어오게 만든 것과 비슷하다. 메인 도입부를 간단하게 만드는 이유는 바로 indirection 때문이다. 나중에 추가 기능도 편하게 넣기 위해서이다.
노드의 라이브러리(API)는 아래 폴더에 있다.
/usr/local/lib/node_modules/cordova/node_modules/
실무에서 발음은 node.js, 노드제이에스로 읽는다. postgreSQL 포스트그레시꿜 혹은 포스트 그레로 읽는다. 스타트업은 변화에 매우 빠르게 적응하고 실리콘벨리의 관습을 그대로 따라가려고 한다. 그러나 최근 삼성전자에서 사내벤처를 하는 옛 동료들이 노드 닷 제이 에스, 포스트 그레 에스큐엘 등으로 읽기에 초급 편처럼 발음 방식을 적게 되었다. 사실, 뭘로 발음하던 주변 동료들끼리 커뮤니케이션만 되면 된다. 다만 그 커뮤니케이션이 좀 더 확장이 편했으면 하는 바람이다. node.js를 만든 조이 언트(joyent)를 삼성이 인수했기에 시장 판도를 예측하기 어렵게 되었다. 강력한 비디오 스트리밍인 webRTC와 언리얼 엔진의 픽셀 스트리밍 기술, 그리고 삼성과 구글이 공생 관계를 따져보면 애플의 ML 라이브러리도 텐서 플로우 기반이라 시장 예측이 어렵다. 다만, 최신 트렌드는 네이티브 앱 + 마이크로 서비스 + 클라우드 서비스로 가고 있는데 앱도 기업화되는 지금 투입 비용은 전혀 고려 사항이 아니라, 사용자에게 보다 나은 경험을 줄 수 있는 쪽으로 점점 기울 것이라 생각된다. 이 책의 주제가 실무 프로그래밍을 다루는 이상 실무 이야기를 반영할 수밖에 없다.
그럼 실무 코드를 보자.
console.log('hello, world');
를 넣은 a.js 를 만들고
soralee@soraui-MacBookAir test_node % node a.js
Hello World
soralee@soraui-MacBookAir test_node %
혹은,
soralee@soraui-MacBookAir ~ % node
Welcome to Node.js v13.12.0.
Type ".help" for more information.
> console.log('hello, world');
hello, world
> .exit
흡사 python 을 보는 것 같다.
변수 선언은 var로 swift와 동일하다.
var http = require('http');
method를 쓰는 방법은 .(dot)으로 java 와 동일하다. 8080 포트를 열어 보자.
http.createServer(function (request, response) {
response.writeHead(200, {'Content-Type': 'text/plain'});
response.end('Hello World\n');
}).listen(8080);
console.log('Server running at http://localhost:8080/');
localhost는 127.0.0.1를 뜻한다. /etc/hosts에 정의되어 있다.
노드에는 다음과 같은 전역 객체가 있다.
console.log(__filename);
console.log(__dirname);
console.log(module);
console.log(exports);
console.log(process);
console.log(Buffer);
soralee@soraui-MacBookAir temp_node % node a.js
/Users/soralee/temp_node/a.js
/Users/soralee/temp_node
Module {
id: '.',
path: '/Users/soralee/temp_node',
exports: {},
parent: null,
filename: '/Users/soralee/temp_node/a.js',
loaded: false,
children: [],
paths: [
'/Users/soralee/temp_node/node_modules',
'/Users/soralee/node_modules',
'/Users/node_modules',
'/node_modules'
]
}
{}
process {
version: 'v13.12.0',
versions: {
node: '13.12.0',
v8: '7.9.317.25-node.30',
uv: '1.35.0',
zlib: '1.2.11',
...
.
.
.
브런치 사족. 보통 기술 서적은 혼자 쓰면 한 권 분량이 3개월이면, 나온다. 그러나 협업 작가가 늘어나면 그 기간은 기하급수적으로 증가하는데 작가들 간의 문체, 추구하는 방향, 원하는 설명 수준 등도 문제지만... 기술이 금방 바뀌어 버린다. 쓰는 중에 새로운 툴이 나와버리면 해당 툴로 다시 예제를 구성하는 수밖에 없다.
초급 편에서 처럼 부분을 올렸다가 지우는 이유도 사실 조금 포함된다. 실무 프로그래밍에서는 실무자들에게 최대한 도움되는 방향을 두고 집필하려고 한다. 물론, 코르도바 편은 대표저자도 실무 프로젝트를 계속 진행하고 있지만 웹 분야만 판 제자도 이제 시니어가 많아서 그쪽으로 넘겼다. 퇴고를 많이 거친 편은 인터넷에 공개되지 않고 바로 출판될 예정이다.
최근댓글