(번역) 서버리스 아키텍처

이 글은 마틴 파울러의 웹사이트에 올라온 Serverless Architectures을 번역한 글입니다. 원문이 계속 업데이트 되기 때문에 번역본과 원문을 함께 보시면 더욱 도움이 될 겁니다.


2016년 6월 17일

마이크 로버츠 Mike Roberts
마이크는 뉴욕에 사는 엔지니어링 리더이다. 요즘엔 팀 매니지먼트가 주요 업무이긴 하지만 여전히 클로주어 Clojure 쪽에서 코딩도 하고 소프트웨어 아키텍처 쪽에서도 활발한 의견 개진을 하고 있다. 그는 지금 사람들이 서버리스 아키텍처에 대해 주목하는 현상에 대해 꽤 긍정적이다.
 
아래 태그들을 통해 비슷한 문서들을 찾을 수 있다:
application architecture


서버리스는 요즘 소프트웨어 아키텍처 세상에서는 아주 핫한 토픽입니다. 책들도 나왔고, 오픈소스 프레임워크도 있고, 수많은 벤더들이 프레임워크를 내놨죠. 게다가 아예 서버리스만을 주제로 하는 컨퍼런스까지 생겼습니다. 그런데, 도대체 서버리스가 뭘까요? 그리고 어째서 이 서버리스를 고려해야 (혹은 고려하지 말아야) 할까요? 이 계속 업데이트 되는 문서를 통해 저는 당신이 이러한 질문들에 대한 답을 구할 수 있는 빛을 찾기를 바랍니다.

서버리스란 무엇인가?

소프트웨어 업계에서 늘상 그렇듯이, 서버리스에 대한 명확한 관점은 없습니다. 그리고 아래 두 가지의 다르지만 겹치는 부분이 있는 이러한 견해들 역시도요:

  1. 서버리스는 서버단 로직이나 상태 등을 관리하기 위한 써드파티 애플리케이션 혹은 클라우드 서비스에 현저히 또는 온전히 의존하는 애플리케이션들을 설명하기 위해 쓰였습니다. 주로 리치 클라이언트 애플리케이션(예를 들자면 단일 페이지 웹 애플리케이션이나 모바일 앱 같은 것들)을 가리키는데, 클라우드에서 접근 가능한 ParseFirebase 같은 데이터베이스라든가, Auth0, AWS Cognito 같은 인증 서비스들 같은 거대한 생태계를 사용하는 것들입니다. 예전에는 이러한 서비스들을 (Mobile) Backend as a Service라고 불렀으니, 여기에서는 이들을 그냥 BaaS라고 부르도록 하죠.

  2. 또한 서버리스는 개발자들이 서버단 로직을 개발자들이 짜긴 하지만, 전통적인 아키텍처와는 달리 상태를 저장하지 않는 Stateless 컴퓨팅 컨테이너에 넣고 돌리는 애플리케이션을 의미하기도 합니다. 이러한 애플리케이션은 보통 이벤트 기반으로 작동하고, 한 번 쓰고 버리고, 써드파티에 의해 관리되죠(ThoughWorks는 최근 자사 포스트에서 이렇게 정의했습니다). 이런 방식으로 생각해 볼 수 있는 한가지 방법은 Functions as a Service(또는 FaaS)입니다. AWS 람다는 현재 이 FaaS계의 가장 인기있는 구현체지요. 하지만 다른 것들도 더 있습니다. 여기서는 바로 이 FaaS서버리스의 의미로 사용하도록 하겠습니다.

저는 주로 두 번째 얘기를 할텐데요, 조금 더 새롭기도 하고 우리가 흔히 기술적인 아키텍처에 대해 생각하는 것과 현격한 차이가 있기도 합니다. 게다가 요즘 서버리스라는 것에 대한 수많은 얘기들이 오고가기 때문이기도 하구요.

하지만, 이러한 개념들이 사실은 모두 관련이 있고 하나로 모여들고 있습니다. Auth0가 하나의 좋은 예가 될 수 있겠네요. 처음에 BaaS 형태인 Authentication as a Service로 시작했다가 지금은 Auth0 Webtask를 통해 FaaS 영역으로 들어왔습니다.

게다가 BaaS 형태의 애플리케이션을 개발하는 많은 경우, 특히 모바일 앱과 반대로 리치 웹 앱을 개발하는 경우, 어느 정도 서버단의 커스텀 기능들이 여전히 필요합니다. 특히 당신이 사용하고 있는 BaaS 서비스와 어느 정도 통합을 한다면 FaaS 가 이런 경우 좋은 솔루션이 될 수 있습니다. 이러한 기능들의 좋은 예로는 데이터 유효성 검사(악성 클라이언트로부터 보호하기 위한)라든가 많은 계산 용량을 필요로 하는 작업들(이미지나 비디오 프로세싱 같은 것들)이 있겠지요.

몇 가지 예제

UI 주도 애플리케이션

서버단에 로직이 있는 전통적인 쓰리티어 클라이언트 시스템을 봅시다. 전자상거래 시스템들 같은 것이 좋은 예가 되겠네요. 예를 들자면 온라인 애완동물 용품 사이트 같은 것.

전통적으로 이런 아키텍처는 이런 식으로 생겼습니다. 서버단에 자바로 구현했고, 클라이언트단에는 HTML과 자바스크립트로 구현하죠.

이런 아키텍처에서 클라이언트는 상대적으로 그닥 똑똑하지 않습니다. 대부분의 로직들 – 인증, 페이지 네비게이션, 검색, 트랜잭션 등은 서버단에서 구현을 해놨으니까요.

서버리스 아키텍처에서는 이렇게 보일 겁니다:

엄청나게 간단하게 그린 모델인데요, 그럼에도 불구하고 여전히 수많은 변화들이 일어난 것을 볼 수 있습니다. 여기서 잠깐! 이건 단순히 서버리스 개념을 보여주기 위한 도구로서 만든 그림이지 이게 이런 식으로 아키텍처를 이전해야 한다고 추천하는 건 아니라는 것을 기억해 두세요!

  1. 최초 애플리케이션에서 인증 로직 부분을 빼고 써드파티 BaaS 서비스로 교체했습니다.

  2. 또다른 BaaS의 예로, 상품 리스트 출력을 위해서 클라이언트단이 직접 데이터베이스를 접속하게 했습니다. 이 데이터베이스는 AWS의 Dynamo DB 같이 전적으로 써드파티 데이터베이스가 됩니다. 클라이언트단에서 데이터베이스에 접속할 수 있는 다른 보안 프로파일을 적용하는 방식으로 다른 서버 리소스에서도 데이터베이스에 접근할 수 있게도 할 수 있습니다.

  3. 앞서 언급한 두 가지 포인트는 굉장히 중요한 이 세번째 포인트를 암시합니다 – 쇼핑몰 서버단에 있던 로직들이 이제는 클라이언트단으로 옮겨갔다는 거죠. 예를 들자면 사용자 세션 추적이라든가, 페이지 네비게이션 같은 애플리케이션의 UX 구조를 이해하는 로직이라든가 데이터베이스에서 읽어들인 자료를 사용자 뷰에 맞는 형식으로 변환하는 것들이라든가 하는 것들 말입니다. 이렇게 되면 사실 클라이언트단은 이제 단일 페이지 애플리케이션이 되는 셈입니다.

  4. UX관련 기능들중 어떤 것들은 서버단에 계속 두고 싶을 거예요. 예를 들자면 많은 계산 용량을 필요로 한다든가 대용량 데이터에 접근을 해야 한다든가 하는 것들이죠. 검색 기능을 예로 들 수 있을텐데요, 검색 기능을 위해서 항상 서버를 돌리기 보다는 API 게이트웨이(나중에 다시 설명합니다)를 이용한 FaaS 펑션을 구현해서 HTTP 리퀘스트에 응답하게끔 하면 됩니다. 그렇게 함으로써 우리는 클라이언트단과 서버단에 기능을 두고 상품 데이터가 있는 같은 데이터베이스에서 읽어들이게 할 수 있습니다.

    원래 서버단 기능들을 자바로 구현했고, 이 포스트에서 선택한 FaaS 제공자로서 AWS 람다 서비스를 자바를 지원하기 때문에, 온라인 쇼핑몰의 검색 기능 관련 코드를 서버단에서 람다로 코드를 다시 쓰지 않고도 쉽게 옮길 수 있습니다.

  5. 마지막으로 상품구매 기능을 다른 FaaS 펑션으로 대체할 수 있습니다. 보안상의 이유로 클라이언트단으로 옮기기 보다는 서버단에 이 기능들을 놓는 것이 낫기 때문입니다. 물론 API 게이트웨이를 그 앞에 놓았습니다.

메시지 주도 애플리케이션

다른 예를 하나 더 들자면 백엔드에서 돌아가는 데이터 프로세싱 서비스가 될 겁니다. 지금 당신이 사용자 중심의 애플리케이션을 하나 개발하고 있다고 치죠. 이 애플리케이션은 UI 리퀘스트에 재빨리 반응을 해야 합니다. 하지만 동시에 현재 일어나는 모든 종류의 액티비티들을 로그로 저장하고 싶어합니다. 온라인 광고 시스템을 한 번 생각해 봅시다 – 사용자가 광고를 클릭할 때 사용자를 재빨리 해당 광고의 타겟으로 보내고 싶습니다. 동시에 사용자 클릭이 발생했다는 것을 잡아내서 광고주에게 과금할 수 있어야 합니다.

전통적으로 이런 아키텍처는 보통 광고 서버가 동기적으로 사용자에게 반응(여기서는 그 반응이 어떤 것인지에 대해서는 상관하지 않습니다)하는 동시에 채널을 통해 메시지를 보내서 비동기적으로 클릭 프로세서를 실행시켜 데이터베이스를 업데이트합니다. 데이터베이스 업데이트에는 광고주 예산에서 광고만큼 금액을 집행하는 것들이 있을 수 있겠죠.

그런데, 서버리스 세상에서는 위의 모델이 아래와 같이 바뀝니다.

앞서 예를 든 것과는 차이가 그렇게 많이 나는 것처럼 보이지는 않네요. 우리는 여기서 계속 돌아가는 서버단의 프로세스를 이벤트 주도 형태의 콘텍스트 안에서 돌아가는 FaaS로 바꿨습니다. FaaS 서비스 제공자는 우리에게 서로 연결되어 있는 메시지 브로커(Message Broker)와 FaaS 환경을 제공합니다.

또한 이 FaaS 환경은 동시에 일어나는 클릭들도 펑션 코드를 클릭 이벤트 숫자에 맞게 감지해서 처리합니다. 기존 애플리케이션의 프로세스에 이런 병렬코드 진행 부분이 없었다면 이 새로운 개념을 적용시켜야 할 수도 있습니다.

Function as a Service 뒤집어보기

우리는 이미 FaaS에 대해 여러번 언급을 해 왔습니다. 이제부터는 도대체 그게 뭔지 좀 더 파고 들어갈 때가 됐습니다. 우선 아마존의 람다 서비스에 대한 설명을 좀 보도록 하죠. 번호를 군데군데 매겨놨는데요, 잠시 후에 설명하도록 하겠습니다.

AWS 람다는 서버를 만든다거나 관리할 필요 없이 당신의 코드를 실행시킬 수 있다. (1) … 람다와 함께라면 당신은 어떤 형태의 애플리케이션이나 백엔드 서비스에서도 코드를 돌릴 수 있다. (2) – 관리 비용은 전혀 필요가 없다. 그저 당신의 코드를 업로드하면 람다가 실행에 필요한 모든 것들을 알아서 관리해 주고 (3), 필요하면 스케일링도 해주면서 (4) 계속 높은 가용성을 유지시켜 준다. 당신은 다른 AWS 서비스로부터 자동으로 트리거링을 받게끔 코드를 작성할 수도 있고 (5) 어떤 웹이나 모바일 앱등에서도 이를 직접 호출하여 실행시킬 수 있다. (6)

  1. 기본적으로 FaaS는 당신이 서버 시스템들 없이 또는 서버 애플리케이션 없이 백엔드 코드를 실행시키는 것입니다. 서버 애플리케이션이라는 구절이 바로 핵심적인 차이인데, 이것은 다른 현대적인 아키텍처의 흐름, 컨테이너라든가 PaaS(Platform as a Service) 등을 의미합니다.

    만약 다시 위의 클릭 처리 예제로 돌아간다면, FaaS는 클릭 처리를 담당하는 서버(물리적 머신일 수도 있지만 어쨌거나 실제 그 용도로 쓰이는 애플리케이션)를 서버 프로비저닝이 필요하거나 항상 돌아가야 하는 애플리케이션이 아닌 다른 무언가로 바꾸는 것입니다.

  2. FaaS는 굳이 특정 프레임워크나 라이브러리에 의존해서 코딩하는 것을 필요로 하지 않습니다. FaaS 펑션은 아무 언어 혹은 환경에서도 작동하는 하나의 애플리케이션입니다. 예를 들어, AWS 람다 펑션은 자바스크립트라든가, 파이쎤 혹은 자바, 클로저, 스칼라 등의 아무 JVM 언어들로 구현할 수 있습니다. 또한 당신의 람다 펑션은 설치 아티팩트와 함께 묶여있기만 한다면 다른 프로세스를 통해서 아무 언어나 실행시킬 수 있습니다. 유닉스 혹은 리눅스 환경에서 컴파일이 가능하다면 말이죠(나중에 Apex를 다뤄보겠습니다). FaaS 펑션은 상태라든가 굉장히 제한적인 아키텍처를 갖고 있습니다. 상태라든가 실행 시간 같은 것들을 고려해야 한다면 말이지요. 이건 잠시 후에 다시 설명하기로 하죠.

    다시 앞서의 클릭 프로세스로 돌아가 봅시다. FaaS로 옮겨갈 때 코드를 변경해야 하는 유일한 부분은 바로 main 메소드 혹은 startup 코드 부분입니다. 이 부분은 필요가 없고, 대신 최상위 계층의 (메시지 리스너 인터페이스를 구현한) 메시지 핸들러로 변경하면 됩니다. 이 부분이 유일한 코드 변경점이죠. 코드의 나머지 부분은 (예를 들어 데이터베이스에 접근한다든가 하는 부분) FaaS 세상에서도 변함없이 똑같습니다.

  3. 이제 우리는 실행시킬 서버 애플리케이션이 없습니다. 그래서 설치 과정 역시도 전통적인 애플리케이션과 굉장히 달라지게 됩니다. 그저 코드를 FaaS 제공자로 업로드하면 나머지는 그쪽에서 다 알아서 하게 되죠. 지금 현재로서는 이것은 새로 수정한 코드 혹은 새로 만든 코드를 .zip 파일 혹은 JAR 파일로 묶어서 올리는 것을 의미하구요, 개별 FaaS 서비스 제공자의 내부 API를 통해 이 수정 사항을 실행시키게끔 호출하는 것으로 보면 됩니다.

  4. 수평적 스케일링은 이제 완전히 자동화가 됐구요, 서비스 제공자가 다 알아서 합니다. 만약에 당신의 시스템이 100개의 리퀘스트를 동시에 처리해야 한다면, 내 쪽에서 별도의 설정 같은 것을 하지 않아도 서비스 제공자가 알아서 다 합니다. 이렇게 당신의 펑션을 실행하는 컴퓨팅 컨테이너는 일시적으로 FaaS 제공자가 관리하고 파기하는 형태여서 순전히 런타임에서만 잠깐 필요한 정도가 됩니다.

    다시 우리의 클릭 프로세서 예제로 돌아가보죠. 사용자가 평소보다 한 열 배 정도는 광고 클릭을 더 많이 한다고 가정해 봅시다. 기존의 클릭 프로세싱 애플리케이션은 이걸 처리할 수 있을까요? 다시 말해서 당신의 코드는 한 번에 여러 개의 메시지를 처리할 수 있을까요? 심지어 우리가 할 수 있다고 해도 애플리케이션의 실행 인스턴스가 하나만 있다면 이걸 감당할 만큼 충분할까요? 만약 다중 프로세스를 돌릴 수 있다면 우리는 이걸 자동으로 오토 스케일링 설정을 해 놓아야 할까요 아니면 수동으로 그때그때 설정해야 할까요? FaaS라면 당신은 그저 펑션을 작성할 때 병렬 프로그래밍을 가정하고 작성하면 됩니다. 그러면 FaaS 제공자는 스케일링이 필요할 경우 알아서 다 해주죠.

  5. FaaS에 있는 펑션들은 서비스 제공자가 정의한 이벤트 타입에 의해 실행될 수 있습니다. 아마존 AWS의 경우에는 S3 파일 업로드 이번트, 스케줄링 작업에 따른 시간, Kinesis와 같은 메시지 버스에 메시지가 추가되는 이벤트 같은 것들이 있습니다. 이럴 경우 당신의 펑션은 보통 연결되어 있는 특정 이벤트에 대응하는 파라미터 값들을 제공해야 합니다. 예시로 든 클릭 프로세서의 경우에는 이미 FaaS에 대응하는 메시지 브로커를 사용하고 있다고 가정합니다. 만약 그렇지 않다면 바꿔야 하구요, 이 경우에는 메시지 생성하는 로직을 수정할 필요가 있습니다.

  6. 대부분의 서비스 제공자들은 펑션들이 HTTP 리퀘스트에 응답을 보내게끔 구현되어 있습니다. 예를 들자면 API 게이트웨이 같은 형식으로 말이지요. 이런 것들에는 AWS API 게이트웨이, Webtask 등이 있습니다. 우리는 앞서 예시로 든 애완동물 온라인 쇼핑몰에서 검색 기능과 구매 기능에 이용하고 있죠.

상태

FaaS 펑션을 내 로컬 머신 혹은 로컬 인스턴스에서 돌릴 때는 굉장히 제한적입니다. 즉, 어떤 펑션을 실행시킬 때 당신이 생성한 어떤 프로세스 혹은 호스트 상태가 다음에 이어지는 펑션으로 어떤 식으로든* 전달되지 않는다고 가정해야 합니다. 이것은 RAM 안에 저장된 상태도 포함하구요, 로컬 디스크에 뭔가를 저장하는 어떤 형태의 상태 역시도 포함합니다. 다시 말해서 설치 유닛 관점에서 *FaaS 펑션은 상태를 저장하지 않습니다(Stateless).

이것은 애플리케이션 아키텍처에 지대한 영향을 줍니다. FaaS가 유일한 건 아니지만요 – 12요소 앱 개념은 정확하게 똑같은 제한점을 갖고 있습니다.

그렇다면 이러한 제한요소를 인정한다고 할 때, 어떤 대안이 있을까요? 보통 FaaS 펑션은 원래 상태 저장기능이 없어서(Stateless) 단순히 입력값을 다른 출력값으로 변경시킨다거나 또는 데이터베이스, Redis 같은 크로스플랫폼 캐시, 혹은 S3 같은 네트워크 파일 스토리지 같은 것들을 통해 리퀘스트 전반에 걸쳐 상태를 저장시키고 그걸 이용해서 좀 더 사용자 요청을 처리합니다.

실행 기간

FaaS 펑션은 개별 실행에 있어 보통 제한시간이 있습니다. 현재 AWS 람다의 경우에는 5분 이상 걸리는 펑션은 실행에 실패하게끔 되어 있구요, 만약 5분 이상 걸릴 경우 자동으로 폐기됩니다.

이것은 오랜 시간을 필요로 하는 작업이라면 새롭게 아키텍처를 변경하지 않는 이상 FaaS 펑션에는 적합하지 않다는 것을 의미합니다. 다시 말해서 전통적으로는 하나의 큰 펑션으로 만들어서 그 안에서 모든 것을 다 처리하는 펑션으로 만들었다면 이제 FaaS에서는 이것을 잘게 쪼개서 각각 별도로 처리하는 형태로 구조를 변경해야 한다는 것이죠.

초기 실행 지연

현재 FaaS 펑션이 리퀘스트에 응답하는데 걸리는 시간은 여러 가지 요소들에 의해 결정되긴 하지만 대략 10ms 에서 2분 정도 사이가 될 겁니다. 딱히 좋은 얘기는 아닌 것 같기는 한데, 조금 더 구체적으로 들어가 보도로 하죠. AWS 람다의 예를 들어 봅시다.

만약에 자바스크립트나 파이썬으로 펑션을 구현했고 그 펑션의 크기가 대략 1천 줄 미만의 코드량으로 그다지 크지 않다면, 실행에 필요한 시간은 아무리 많아야 10ms 에서 100ms를 넘지 않을 겁니다. 펑션의 크기가 커진다면 아무래도 종종 시간이 오래 걸리겠죠.

만약 람다 펑션을 JVM 위에서 구현했다면 종종 10초 이상 걸리는 응답시간을 보일 겁니다. 아무래도 JVM이 구동되기 위해 필요한 시간이겠죠. 하지만, 이것은 아래와 같은 상황에서만 일어나는 상황입니다.

  • 펑션을 자주 실행시키지 않는 경우 – 각 실행 주기가 10분을 넘는 경우
  • 갑자기 트래픽이 늘어나는 경우 – 초당 10개의 리퀘스트를 처리하다가 갑자기 초당 100개의 리퀘스트를 처리하는 식으로 짧은 시간 안에 급격하게 트래픽이 증가하는 경우

전자 같은 경우에는 매 5분 정도마다 핑 리퀘스트를 날려서 계속 서버가 살아있게 하는 식의 핵으로 해결할 수 있습니다.

그렇다면 후자의 경우에 이런 것들이 문제가 될 수 있을까요? 애플리케이션이 트래픽을 처리하는 스타일에 따라 달라질 겁니다. 예전 팀에서는 자바로 비동기 방식의 메시지 처리 람다 애플리케이션을 만들어서 하루에도 수백만개의 메시지를 처리했습니다. 초기 실행 지연 같은 것에는 아무런 걱정이 없었지요. 그건 지연시간이 낮은 트레이딩 애플리케이션을 개발한다면 딱히 이 상황에서는 FaaS를 고려할 이유가 없습니다. 무슨 언어로 개발하든지간에요.

이런 문제가 당신이 개발한 애플리케이션에서 생길지 아닐지는 모르겠지만, 실제 운영 환경에서와 같은 트래픽으로 테스트를 해 볼 필요는 있어요. 그래야 실제 퍼포먼스를 측정할 수 있죠. 만약 당신의 유즈 케이스가 지금 잘 동작하지 않는다면 한 두어달 쯤 후에 다시 시도해 볼 수 있습니다. FaaS 서비스 공급자가 개발해야 할 영역이거든요.

API 게이트웨이

FaaS가 갖는 특징들 중 하나는 앞서 살짝 언급한 API 게이트웨이입니다. API 게이트웨이는 HTTP 서버로서 설정을 통해 라우팅 정보와 엔드포인트를 정의하고 각각의 라우트는 FaaS 펑션에 연결 시킵니다. API 게이트웨이가 리퀘스트를 받았을 때, 리퀘스트와 일치하는 라우팅 정보를 찾아서 그에 맞는 FaaS 펑션을 실행시킵니다. 보통 API 게이트웨이는 HTTP 리퀘스트 파라미터로부터 FaaS 펑션에 필요한 입력 인자를 매핑합니다. 그렇게 함으로써 API 게이트웨이는 FaaS 펑션의 결과값을 HTTP 응답객체에 실어서 최초 요청자에게 반환합니다.

AWS는 API 게이트웨이 서비스를 갖고 있구요, 다른 제공자 역시도 비슷한 기능을 보유하고 있습니다.

API 게이트웨이는 단순히 리퀘스트를 라우팅하는 기능 이외에도 인증 절차를 수행하고, 입력값에 대한 유효성 검사를 수행하며 응답 객체와 매핑을 시키는 등의 역할을 하기도 합니다. 당신의 거미줄 같은 감각은 어쩌면 이게 실제로 좋은 생각인지 아닌지 궁금해 할 수도 있습니다. 잠시 후에 다시 얘기해 보도록 하죠.

API 게이트웨이와 FaaS 조합의 한가지 유즈 케이스는 HTTP를 앞세운 마이크로서비스 형태가 될 겁니다. 서버리스는 여기서 스케일링과 관리 그리고 FaaS 펑션이 가져다 주는 여러가지 잇점을 담당하죠.

현 시점에서 API 게이트웨이 도구는 아직 처절할 정도로 성숙하지 않았습니다. 그렇긴 해도 API 게이트웨이와 함께 애플리케이션을 개발하는 것이 그다지 어렵거나 한 것은 아닙니다.

도구들

API 게이트웨이 도구들이 아직 성숙하지 않았다는 것은 이미 언급했구요, 이것은 전반적으로 서버리스 FaaS 시장에 있어서 공통적인 현상입니다. 하지만 예외는 있죠. 그 예가 바로 Auth0의 Webtask인데요 개발자 UX에서 엄청난 강점을 갖고 있습니다. Tomasz Janczuk은 최근에 있었던 서버리스 컨퍼런스에서 굉장히 좋은 데모를 보여준 적이 있습니다.

디버깅과 모니터링 역시 이 서버리스 애플리케이션에서는 해결해야 할 숙제들입니다. 이 포스트의 뒷부분에서 다뤄보도록 하죠.

오픈 소스

서버리스 FaaS 애플리케이션의 주요 잇점들 중 하나는 바로 투명한 실행 환경 공급에 있습니다. 아직 오픈 소스들은 현재 여기에 그다지 관련이 있지는 않습니다. 도커와 같은 컨테이너들 말이죠. 조만간 우리는 유명한 FaaS / API 게이트웨이 플랫폼이 회사내 on-premise에서 돌아간다거나 개발자의 컴퓨터에서 돌아간다거나 하는 것들을 볼 수 있을 겁니다. IBM의 OpenWhisk는 좋은 예가 될 수 있는데요, 이것이 어떤 대안이 될지 아닐지 지켜보는 것도 꽤 흥미로울 겁니다.

실행 환경 구성과는 별개로 FaaS 펑션을 정의하고, 설치하고 실행시키는데 도와주는 도구들과 프레임워크들은 이미 오픈 소스로 많이 나와 있습니다. 예를 들어 서버리스 프레임워크는 실제로 동작하는 API 게이트웨이와 람다를 AWS에서 제공하는 형태보다 훨씬 더 쉽게 사용할 수 있게 해줍니다. 자바스크립트를 좀 지나치게 쓰긴 했는데, 만약 자바스크립트와 API 게이트웨이 조합으로 애플리케이션을 개발한다면 꼭 한 번 봐 둘만 합니다.

또다른 예로는 Apex가 있습니다. 이 프로젝트는 AWS 람다 펑션들을 손쉽게 만들고, 설치하고, 관리하자라는 슬로건을 갖고 있습니다. Apex가 갖는 재미있는 요소들 중 하나는 아마존에서 직접 지원하지 않는 언어들을 람다 펑션 차원에서 지원하게끔 해준다는 겁니다. 예를 들자면 Go 언어 같은 것들이죠.

서버리스가 아닌 것은?

직금까지 이 글에서 저는 서버리스Backend as a Service (BaaS)Functions as a Service (FaaS)의 합집합이라고 정의했습니다. 또한 주로 FaaS 쪽을 중점으로 해서 이야기를 풀어나갔지요.

이제 가장 중요한, 무엇이 이득이고 무엇이 손해인지에 대해 얘기하기 전에 이 서버리스의 정의에 대해 조금만 더 살펴보고자 합니다. 적어도 무엇이 서버리스아닌지에 대해 얘기해 보죠. (최근의 저를 포함해서) 몇몇 사람들이 이러한 것들에 대해 혼동했던 것을 봐 왔고, 좀 더 명확하게 하는 것도 좋은 생각 같습니다.

PaaS와 비교

앞서 잠깐 서버리스 FaaS 펑션은 12요소 애플리케이션과 비슷하다고 했는데요, 그렇다면 Heroku와 같은 또다른 PaaS라고 할 수도 있을까요? 간단하게 대답하기 위해 Adrian Cockcroft의 트윗을 인용하겠습니다.

만약 당신의 PaaS가 20ms 이내에 인스턴스를 실행시켜서 0.5초 동안 원하는 기능을 실행시킬 수 있다면 그땐 그걸 서버리스라고 부르세요.

다른 말로, 대부분의 PaaS 애플리케이션들은 매 리퀘스트마다 애플리케이션 전체를 올렸다 내렸다할 수 있게끔 설계되지 않았습니다. 반면에 FaaS 플랫폼은 정확하게 그렇게 하죠.

좋습니다. 만약 제가 훌륭한 12요소 애플리케이션의 개발자라면 딱히 코딩을 하는데 있어서 별 차이점은 없을 거예요. 사실입니다. 하지만 가장 큰 차이는 어떻게 당신의 애플리케이션을 운영하는가에 있습니다. 우린 모두 데브옵스 관점에 충실한 엔지니어들이고 개발에 대해 생각하는 것 만큼 운영에 대해서도 생각하고 있습니다, 그렇죠?

운영 측면에서 FaaS와 PaaS의 핵심적인 차이는 바로 스케일링입니다. 대부분의 PaaS에서 당신은 여전히 스케일링을 고민해야 하죠. 헤로쿠의 예를 들자면 다이노스 Dynos 몇개를 돌리고 싶은가를 고민해봐야 합니다. FaaS 애플리케이션에서 이부분은 완전히 투명합니다. 심지어 당신이 PaaS 애플리케이션을 스케일링 완전 자동화로 설정한다 하더라도 개별 리퀘스트 수준에서 이런 스케일링을 하진 앟아요(물론 당신이 굉장히 특별하게 트래픽 프로필을 설정해 놓았다면 얘긴 달라집니다). 따라서 FaaS 애플리케이션은 이렇게 비용이 연계가 될 때 굉장히 효율적입니다.

이런 잇점들이 있다면 왜 계속 PaaS를 쓰려고 하죠? PaaS를 쓸 이유들이 여러가지 있겠지만 아마도 도구들 그리고 API 게이트웨이의 성숙도가 가장 큰 이유들이 될 겁니다. 더군다나 PaaS에 구현한 12요소 애플리케이션들은 최적화를 위해 앱 내 읽기전용 캐시를 사용하겠죠. 이것은 FaaS 펑션에서는 사용할 수 없는 기능입니다.

#NoOps

서버리스NoOps를 의미하는 것은 아닙니다. 서버리스 토끼구멍을 얼마나 깊이 파고 들어가는가에 따라 아마도 내부 시스템 관리자가 없다는 것을 의미할 거예요. 여기서 우리는 두가지 중요한 것을 고려해야 합니다.

먼저 Ops는 서버 관리 이상의 그 무언가를 의미합니다. 적어도 모니터링, 설치, 보안, 네트워킹 등을 의미하기도 하죠. 그리고 종종 시스템 스케일링과 어느 정도의 운영 시스템 디버깅까지를 포함하기도 합니다. 이런 문제들은 서버리스 애플리케이션으로 간다고 해도 여전히 존재하고 이를 해결할 전략이 필요하죠. 어떤 면에서는 Ops서버리스 환경에서 좀 더 어려운 일이 될 수도 있습니다. 왜냐하면 모든 것들이 전부 새롭기 때문이죠.

다음으로 시스템 관리자가 여전히 필요하다면 서버리스를 위해서는 아웃소싱을 하면 그만입니다. 딱히 나쁘진 않아요 실제로 우린 여러번 아웃소싱을 해 왔으니까요. 하지만 구체적으로 당신이 무엇을 하려고 하는가에 따라 이건 좋을 수도 있고 나쁠 수도 있습니다. 어느 시점에서 당신은 시스템 관리자가 당신의 애플리케이션을 지원할 필요가 있다는 것을 알아야 할 지 모릅니다.

Charity Majors는 이와 관련해서 최근 있었던 서버리스 컨퍼런스에서 좋은 발표를 해 줬습니다. 저는 온라인에 이 발표가 올라오면 꼭 확인해 보기를 권장합니다. 그 전까지는 이 글이 글을 읽어보면 좋겠네요.

Stored Procedures as a Service

또다른 흥미로운 주제는 서버리스 FaaS가 Stored Procedures as a Service라는 겁니다. (이 글에서 사용한 것들을 포함해서) FaaS 펑션의 많은 예제들이 주로 데이터베이스에 접근하기 위한 코드들이기 때문이 아닐까 생각합니다. 만약에 겨우 이정도가 우리가 FaaS를 사용하는 이유라고 한다면 이 네이밍은 적당할 지도 모르겠군요. 하지만 이건 FaaS의 서브셋에 불과할 뿐더러 만약 이런 용도로만 사용한다면 뭐랄까 조금은 맞지 않습니다.

이것은 어찌 보면 Stored Procedure가 갖는 동일한 문제를 FaaS 역시도 가질 수 있다는 것을 고려해 볼 필요가 있습니다. Camille이 트윗에서 언급한 것과 같은 기술적 부채들도 포함해서 말이지요.

만약에 서버리스 서비스가 마치 Stored Procedure 처럼 변한다면 이건 곧바로 엄청난 기술적 부채가 될 거라는 걸 생각해 보자구.

Stored Procedure를 사용하는 것에서 오는 수많은 교훈들이 있습니다. 그것들은 FaaS에서 반드시 되돌아보고 적용이 가능할지 아닐지를 결정해야 할 것들이지요. Stored Procedure들은:

  1. 종종 벤더 종속적인 언어를 요구하거나, 적어도 벤더 종속적인 프레임워크 혹은 언어로 확장할 필요가 있습니다.
  2. 데이터베이스 콘텍스트 안에서 실행시켜야 하기 때문에 테스트가 어렵습니다.
  3. 일급 애플리케이션으로서 다루기 까다롭고 버전 관리도 힘듭니다.

이러한 제약사항들이 모두 Stored Procedure를 구현하는데 있어서 적용되는 것은 아닐 겁니다. 하지만 지금까지 제 경험상 수많은 문제들을 읽으켰던 것은 사실이예요. 그렇다면 이것을 FaaS에 어떻게 적용을 시킬 수 있는지 살펴봅시다.

1번 항목은 FaaS 구현에 있어서 큰 걸림돌은 아닙니다. 그냥 그런 부분들을 걷어내면 그만이죠.

2번 항목에서 우리는 코드만 쓰기 때문에, 단위 테스트는 다른 코드들과 마찬가지로 쉽습니다. 통합 테스트는 다른 (그리고 정당한) 문제예요. 이건 나중에 얘기해 봅시다.

3번 항목에서 다시금 FaaS 펑션은 코드일 뿐이기 때문에 버전 관리도 괜찮습니다. 하지만 애플리케이션 패키징 측면에서 봤을 때 아직 어떤 성숙한 패턴이 나오지는 않았어요. 앞서 언급했던 서버리스 프레임워크는 자체적으로 이런 패키징 형태를 제공합니다. AWS는 2016년 5월에 열렸던 서버리스 컨퍼런스에서 패키징 관련해서 Flourish라는 이름으로 작업중이라고 발표했습니다. 하지만 이건 뭐 나와 봐야 아는 거겠죠.

이 문서는 지속적으로 진화합니다. 저는 수시로 이 문서를 업데이트할 예정입니다. 그렇게 해서 좀 더 많은 서버리스 아키텍처와 관련한 장단점들을 포함한 주제들을 이 문서에 담길 희망합니다. 아마도 향후 일이년 이내에 좀 더 서버리스 관련 주제들이 발전하지 않을까 싶네요.

이 주제와 관련해서 우리가 어떻게 업데이트 하는지를 알고 싶다면 우리 사이트의 RSS 피드, 제 트위터 피드 또는 마틴 파울러의 트위터 피드를 주목해 주세요.


알림

이 글을 쓰는데 도움을 주신 분들께 감사 드립니다: Obie Fernandez, Martin Fowler, Paul Hammant, Badri Janakiraman, Kief Morris, Nat Pryce, Ben Rady.

이 새 기술에 적당히 반론도 해 주시고 격려도 해주신 Internet Media의 제 전 팀원들께 감사 드립니다: John Chapin, Pete Gieser, Sebastián Rojas and Philippe René.

마지막으로 이 주제와 관련해 여러 생각들을 피력해 주신 모든 분들, 특히 제가 언급한 분들께 감사 드립니다.

리비전

2016년 6월 17일: 서버리스가 아닌 것은? 섹션 추가
2016년 6월 16일: Functions as a Service 뒤집어 보기 섹션 추가
2016년 6월 15일: 첫번째 버전 발행 – 몇가지 예제들


출처 : http://www.zdnet.co.kr/column/column_view.asp?artice_id=20160614172904


칼럼

서버리스(Serverless)가 온다!

  • 윤석찬 AWS 테크 에반젤리스트
  • 입력 : 2016.06.14.17:40
  • 수정 : 2016.06.14.17:40
  • 228

지난 칼럼 '클라우드 기술에 대한 세가지 패러다임 변화'에서 ‘서버 없는 클라우드 함수의 등장’이라는 변화를 소개했다. 이러한 새로운 패러다임은 개발자들에게 큰 수고와 비용 없이도 좀 더 빠르고 민첩하게 다양한 애플리케이션을 만들고, 서비스 운용을 위한 확장성 및 가용성에 대한 수고와 비용을 없애는 방향으로 바뀌고 있다.

이러한 변화를 가장 극적으로 보여준 것이 바로 지난 5월말 뉴욕에서 있었던 서버리스컨퍼런스(Serverless Conference)다. 일반적으로, 회자되는 기술의 유행 방식은 선두 주자가 혁신적인 서비스를 내면, 경쟁적으로 유사한 서비스가 만들어지고, 오픈 소스로 된 관련 도구가 증가하면서 개발자들이 여기에 동조하고, 콘퍼런스에서 다 같이 만나는 패턴인데,이는과거에도 종종 있었다.

2014년 AWS람다(Lambda)가 이러한 개념을 처음 선 보인 이후로, 많은 클라우드 업체들이 이를 벤치마킹한 서비스를 줄줄이 내놓고 있다. 많은 개발자들은 관련된 코드 예제들을 오픈 소스로 공개하고, 급기야는 Serverless FRAMEwork, CloudiaJS 같은 서버리스 오픈 소스 개발 프레임워크가 계속 나오고 있다. AWS에서 Lambda와 API Gateway 서비스 개발을 총괄하고 있는 팀 와그너(Tim Wagner)는 서버리스 콘퍼런스키노트 발표에 앞서 물리 서버를 부숴버리는 상징적인 퍼포먼스를 보여 주기도 했다.

물리적 서버를 부수는 퍼포먼스를 하고 있는 팀 와그너? 출처: @samkroon

물리적 서버를 부수는 퍼포먼스를 하고 있는 팀 와그너? 출처: @samkroon

■ Serverless != No Server

물론 서버리스(Serverless)라는 말 자체가 서버가 필요 없다는 뜻은 아니다. 클라우드에서도 서버는 존재하고 있고, 다만 고객이 스스로 관리해야 하는 서버 혹은 콘테이너가제로(0)에 수렴한다는 의미다. 따라서, 서버리스란 오로지 이벤트에 따라 동작하는 클라우드 기반의 나노 수준 (최근 회자되는 마이크로서비스가 가진 크기를 생각해서) 서비스 단위의프로그램 코드만을 개발하고 배포에 집중한다는 의미이다. 기존의 PaaS(Platform as a Service)는 복잡한 모놀리식(Monolithic) 애플리케이션을 지원했다는 점에서, 무상태(Stateless)는 서버리스의특징과 대비된다.

이유는 간단하다. 더 빠르게 움직이기 위해서다. 이러한 특징은 인프라 설치, 운용, 확장성 고려, 복잡한 배포 및 모니터링 등 많은 관리 업무를 줄이고, 민첩하게 만들고 배포하려는 회사 혹은 팀에게 적합하다.

예를 들어, AWS Lambda는 가장 선두에 있는 서비스로서 Node.js, Java, Python 코드를 올리기만 하면, 코드가 실행될 때 마다 5분 안에 실행하면서 100ms 단위로 과금한다. 다른 AWS 서비스의 이벤트를 처리(예를 들면, Amazon S3에 이미지가 올라오면 썸네일을 만드는 기능을 동작)하거나, Amazon API Gateway로 들어오는 HTTP 요청에 대해서도 실행할 수 있다. 올려진 코드에 대한 버전 기능, 배치 작업을 위한 Cron 기능등을 제공하고, 매월 100만 밀리세컨드에 대해 무료로 제공하기에 테스트 개발에도 적합하다.

모바일 앱을 위한 서버없는백엔드 아키텍처 사례(출처: AWS 한국 공식 블로그)

모바일 앱을 위한 서버없는백엔드 아키텍처 사례(출처: AWS 한국 공식 블로그)

따라서, Amazon API Gateway와 AWS Lambda를 조합하고, 여기에 Amazon 기존 서비스를 연계해서 새로운 아키텍처를 구성할 수 있는데, 이것을 소위 ‘서버리스 아키텍처’라고 부르고 있다. (마치 다양한 요리를 할 때 필요한 재료가 필요한 것처럼, AWS는 최소 단위(primitives)라고 부르는 다양한 서비스로 만들고, 개발자들이 이를 자유롭게 조합하여, 새로운 아키텍처를 설계 구성하도록 하는 서비스 철학을 가지고 있다)

■ 진화하는 서버리스 개발 생태계

서버리스 아키텍처나 프레임워크는아직 초기 단계다. 해결해야 할 사항도 적지 않다. 예를 들어, 기존 서버 기반 SW 플랫폼 개발 프레임워크만큼, 통합 개발 환경(IDE)나 테스팅, 디버깅이 편리하지 않다. 개별 클라우드 함수의 크기나 성능에 따른 메모리 사이징(그에 따른 CPU 및 네트워크 사용량) 및 함수 기능을 어디까지 세분화 할 것인가에 대한 기준도 명확하지 않다.

이런 부분은 서버리스 아키텍처에 대한 다양한 논의가 진행되고, 개발자 생태계가 커지면서 각종 지원 개발 도구가 나온다면 자연스럽게 해결될문제라고 생각한다.

하지만, 가장우선적으로서버리스에 대한 개념과 목적을 명확하게 하는 것이 중요하다. 못을 박기 위한 도구인 망치를 가지고, 음식을 만들려는 우를 범하지 않기 위해서다. 팀 와그너는서버리스 콘퍼런스키노트 중 아래와 같이서버리스선언문(Serverless Manifesto)을 소개하였다.

  • 함수(Function)가 서비스의 기본 배포 및 확장 단위이다.
  • 프로그래밍 모델에서 물리 서버, 가상 서버 및 콘테이너에 대한 의존성을 제거하라
  • 데이터 스토리지는 어딘가 무제한으로 있다고(사용한다고) 가정하라
  • 사용자가 아닌 오로지 요청(Request)에 대해서만 확장하라
  • 요청이 없는데 돈을 낼 필요가 없다(가상 서버나 콘테이너도 여전히 비효율적이다).
  • 함수의 실행은 어디서나 가능하므로, 장애 복원력을 가지도록 만들어라
  • BYOC(Bring your own code) ?나만의 서비스를 책임지고 만들 수 있다!
  • 통계 수집 및 로그 취득은 보편적인 필수 사항이다.

이와 함께 Flourish라는 오프 소스 서버리스 프레임워크를 곧 공개할 것이라고 밝혔다. 이 프레임워크는 마이크로 서비스의 형식을 정의하고, 기존 IDE와 통합하여 빌드 및 ZIP 파일 기반 배포를 할 뿐만 아니라 하나의 대시보드에서 모니터링 및 요금 집계가 가능한 현실적인 서비스 기능을 통합 할 예정이다. 또한 프로그램 코드와 버전 설정을 조합에 의한 일관된 롤백 기능도 제공한다. 벤더 중립적인 API 서비스 참조 역할도 하면서, 코드 작성 및 배포에만 집중되어 있는 기존 프레임워크의 대안이 될 수 있을 것이다.

Flourish가 중립적인 프레임워크로 자리잡더라도 다른 클라우드 업체들도 비슷한 수준의 서버리스 프레임워크를 내놓을 가능성이 높다. 기존의 개발자 커뮤니티에서 만들어지는 프레임워크 역시 생태계 확대에 이바지할 것으로 예상된다.

■ 서버리스의 대중화의 필수 조건은?

서버리스 개발 생태계 확대를 위해서는 기존 벤더 기반 서버리스 컴퓨팅 환경과 스토리지 서비스에서 개발자 생태계 기반 프레임워크와 개발 도구의 제공이 확대되는 단계도 중요하다.하지만 궁극적으로 서버리스 킬러 응용 프로그램(Killer Application)이 나와야 한다.

최근에 Slack을 기반으로 하는 채팅봇애플리케이션이나 Amazon Echo와 Alexa 그리고 AWS Lambda를이용한음성인식서버리스 애플리케이션이 늘어나는 것은 고무적인 현상이다. 테크크런치기사에서 언급한, Amazon Echo의 음성 인식 API인 Alexa Skills과 AWS Lambda를 이용한 앱(Skills)이 연초 135여개에서 1,000여개로 늘어났다는 것이 바로 그러한 예이다.

AWS Lambda의 이용 사례도 극적으로 늘고 있다. 여성 패션 사이트인 Bustie는 수백만의 사용자가 방문하는 웹 사이트를 Amazon S3 기반으로 만들고 필요시 동적 데이터를 Lambda로 처리한다. 광고 리타게팅 플랫폼인 AdRoll 역시 매달 300TB의 압축 데이터를 S3에 저장하는데, 호출 데이터 저장 시 Lambda를 사용한다. 실시간 동영상 인코딩 업체로 유명해진 스타트업인 Periscope는 포르노 같은 유해 영상인지 여부를 3초 단위로 파악해서 차단하는 기능에 Lambda를 이용한다.

AWS Lambda의 실제 활용 사례? 출처: AWS Summit Seoul키노트 중

AWS Lambda의 실제 활용 사례? 출처: AWS Summit Seoul키노트 중

특히, 데이터 분석 영역에서 Lambda 사용도 두드러진다. FireEye는 Lambda를 이용하여 침입 탐지 시스템을 만들었는데, 기존에 맵리듀스(MapReduce) 기능을 Lambda 함수로 바꾸고, S3에 저장하는 새로운 아이디어를 내기도 했다.국내에서도 비트패킹컴퍼니가 음악 재생 시 광고 노출 데이터를 실시간으로 처리하기 위해 Lambda를 통해 Amazon Kinesis로 보내고, 이를 S3에 저장하거나Amazon Elasticsearch Service와 Kibana를 통해 분석 대시 보드를 만드는 서버가전혀없는원스톱분석서비스를 만들어 발표하기도 했다.

향후서버리스 아키텍처를 위한 생태계에서 필요한 것은 매우 많다. 클라우드 함수에 대한 지속적인 통합 및 배포(CI/CD) 지원, IDE 플러그인, 테스트 프레임워크는 가장 필수적이다. React 같은 현대적 웹 앱 프레임워크와의 연동 및 원활한 동영상 및 파일 처리, 사물 인터넷과의 연동, 이를 엔터프라이즈급 업무에서도 활용할 수 있는 다양한 사례를 발굴하는 것 역시 중요한 과제다.

마지막으로 무엇 보다 중요한 것은 개발자들의호기심이다. 항상 성공하는 기술은 낮은 진입 장벽에서, 호기심을 가진 기술 관심자들의참여로 이루어진다. 과거 모바일앱생태계 초기를 돌아보면, 개발자가 부업으로 만든 앱들이 대박을 친 경우가 많았다. 서버리스 아키텍처도 과거 수많은 고민을 해야했던 많은 장벽을 없애 줌으로써새로운아이디어를 시작해 볼 수 있고, 성공도 예측해 볼 수 있다. 누가 아는가? 내가 만든 작은 API가 유료로도 서비스할 수 있는 대박 서비스가 될지…

기업에서도 복잡한 문제 해결에 대한 가장 단순한 해법을 찾고, 기존 레거시를 혁신하기 위해 이를 직접 만들어 보는 개발자와 기업에게 미래가 있다. 만약 이를적용 하면 회사의 기존 사업이 망할 것 같고, 나의 일이 없어지는 내부적인 파괴(Disruption)를 일으킬 것 같은 기술처럼 보이는가? 서버리스 아키텍처를 바라보는 IT개발자의 우려와 벤더의 시각도 이와 다르지 않다.그렇다면 지금 당장 시도해야 한다.“미래는 이미 가까이에 와 있다. 다만 널리 퍼지지 않았을 뿐(The future is already here ? it's just not very evenly distributed. ?윌리암 깁슨)”이라는 말을 다시 새겨볼 때다.

*본 칼럼 내용은 본지 편집방향과 다를 수 있습니다.

칼럼니스트 : 윤석찬

약력

윤석찬 아마존웹서비스테크에반젤리스트| 1996년 웹 개발자로 인터넷 업계에 투신해 나인포유 CTO, 모질라(Mozilla) 오픈소스 커뮤니티 리더, IT 분야 블로거 등 다양한 역할을 수행해 왔다. 최근까지 다음카카오에서 연구개발 부서 리더 및 오픈 API 플랫폼 에반젤리스트로서 내부 API 플랫폼 구축과 외부 개발자 지원을 담당한 바 있다. 


Microservice Trade-Offs

Many development teams have found the microservices architectural style to be a superior approach to a monolithic architecture. But other teams have found them to be a productivity-sapping burden. Like any architectural style, microservices bring costs and benefits. To make a sensible choice you have to understand these and apply them to your specific context.

Translations: Japanese · Korean
Photo of Martin Fowler

01 July 2015

    Microservices provide benefits…

  • Strong Module BoundariesMicroservices reinforce modular structure, which is particularly important for larger teams.
  • Independent DeploymentSimple services are easier to deploy, and since they are autonomous, are less likely to cause system failures when they go wrong.
  • Technology DiversityWith microservices you can mix multiple languages, development frameworks and data-storage technologies.

    …but come with costs

  • DistributionDistributed systems are harder to program, since remote calls are slow and are always at risk of failure.
  • Eventual ConsistencyMaintaining strong consistency is extremely difficult for a distributed system, which means everyone has to manage eventual consistency.
  • Operational ComplexityYou need a mature operations team to manage lots of services, which are being redeployed regularly.


자바가 아닌 다른 언어를 배워야 하는 이유


들어가는 말


최근 오랜만에 오키에서 신세 한탄이나 돈 문제가 아닌 기술 이야기로 활발한 논쟁이 불붙는 것을 보고 한 편으로는 반가운 마음도 들었지만, 내용에 대해서는 아쉬움이 훨씬 크게 남는 토론이었다고 생각합니다.

스칼라(Scala)를 홍보하는 분의 다소 편협한 태도와 빈약한 근거로 인해 오히려 스칼라에 대한 반감만 늘어난 것 같고, 이를 반박하는 분들의 주장을 보아도 스칼라의 장점들에 대한 오해에서 비롯된 내용이 자주 보여서 상당히 안타까웠습니다.

하지만 이 문제에 대해 본격적으로 글을 쓰기에는 바쁜 일정 탓에 많은 시간을 할애할 수 없었습니다. 그리고 무엇보다 제 자신이 아직 스칼라를 배워가는 단계라고 생각하기 때문에 스칼라나 함수형 패러다임에 대해 다른 분들에게 도움이 될만한 글을 쓸 자격이 있는지도 의문입니다.

또한, 이번 토론의 내용을 보더라도 아마 많은 자바 개발자 분들이 굳이 스칼라와 같은 생소한 언어를 새로 배워야 한다는 데 큰 공감을 하지 못하고 있다는 느낌을 받았습니다.

그래서 처음부터 진지하게 스칼라 언어의 기술적 장점들에 대한 강좌를 쓰는 것보다는 우선 시간을 내서 자바 개발자로서 자바가 아닌 다른 대안 언어를 배워야 하는 이유를 먼저 되짚어 보는 것도 의미가 있을 것 같다는 생각이 들어 글을 쓰게 되었습니다. 그런 만큼 내용에 두서가 없거나 다소 깊이가 부족하더라도 미리 양해 부탁드리겠습니다.


자바가 주류 언어가 되기까지 - 오픈소스 진영과의 불편한 동거


90년대 중반 처음 등장한 이래 많은 곡절이 있었지만, 자바 언어는 최근까지 특히 엔터프라이즈 응용프로그램 분야에서 독보적인 위치를 유지하고 있습니다. 그렇기 때문에 특히 자바의 입지가 절대적인 우리나라의 자바 개발자의 입장에서 다른 언어를 본격적으로 배워야할 필요성을 절감하기 어려운 것이 사실입니다.

하지만 우리나라의 개발 환경은 항상 세계적인 흐름을 시차를 두고 따라가는 형태로 변화해왔다는 점을 감안한다면, 최근 세계적으로 자바의 위상이 급격하게 위협 받고 있는 추세를 무시해선 안된다고 봅니다.

세계적인 웹 기술의 추세는 구글이나 페이스북 같은 몇몇 기술력 있는 기업과 오픈소스 진영을 중심으로 생겨나고 발전해 나가고 있습니다. 자바의 경우도 메이븐에 존재하는 수 많은 오픈소스 프로젝트 라이브러리가 증명하는 것처럼 오픈소스 진영의 영향력은 절대적이라고 할 수 있습니다.

하지만 자바를 중심으로 하는 오픈소스 진영은 시작부터 기존 리눅스를 중심으로 하는 오픈소스 진영과 다소 껄끄러운 관계를 유지하고 있었습니다. 여기에는 여러 이유가 있는데, 썬(Sun Microsystems) 사가 자바의 오픈소스화에 대한 약속을 몇 차례 번복했던 일도 있고, 무엇보다 근본적으로 자바가 지향하는 식의 운영체제와 무관하게 모든 것을 자바로만 거대하고 복잡하게 쌓아 올리는 접근이 일반적인 리눅스/유닉스 철학과 호환되지 않는다는 점도 크게 작용했습니다.

여기에 더해 기존 C/C++ 개발자들이 자바 언어에 대해 가지는 우월감이나 반감, 혹은 '해커'들이 이른바 '기업형 프로그래머'에 대해 느끼는 비슷한 감정 등이 더해져서 같은 오픈소스라고는 하지만 오픈소스 자바 진영과 기존 리눅스 중심의 오픈소스 진영 사이에는 묘한 감정적 괴리가 항상 존재했던 것이 사실입니다.

물론 시간이 지나면서 자바와 리눅스의 결합이 시장에서 힘을 얻고, 자바 자체도 오픈소스화 되면서 이런 반감이 어느 정도 완화되긴 했습니다. 하지만 이런 갈등이 전면적으로 부각되지 않았던 가장 큰 이유는 오픈소스 진영에 있어서 썬보다는 마이크로소프트가 보다 진정한 '악의 축'에 가까웠고, 무엇보다 엔터프라이즈 환경에서 유닉스/리눅스와 자바의 조합에 대한 마땅한 대체제가 없었기 때문입니다.

하지만 이 모든 상황은 최근 몇 년 동안 급격하게 변화하기 시작합니다.


오라클 시대의 자바, 그리고 자바 스크립트의 반격


2010년, 자바 진영을 이끌던 썬 사가 오라클에 인수 합병되면서 자바의 미래에도 어둠의 그림자가 드리우기 시작합니다. 한편, 거의 비슷한 시기에 node.jsangular.js와 같은 본격적인 자바스크립트 프레임워크 프레임워크들이 등장함으로 인해, 루비 온 레일즈(Ruby on Rails: RoR)에서 가능성을 보였던 엔터프라이즈 시장에서 자바를 밀어낼 대안이 다시 한 번 빠른 속도로 구체화 되기 시작합니다.

오라클은 자바를 인수하자마자 구글을 상대로 자바 API의 특허권을 공격적으로 사용함으로써, 가뜩이나 오라클이 관리하는 자바의 미래에 의구심을 품고 있던 기존 오픈소스 진영 개발자들의 마음을 결정적으로 자바에서 돌아서게 만듭니다.

한 편, 마이크로소프트는 닷넷(.NET)을 오픈소스로 공개하고, 역시 오픈소스로 타입 스크립트(TypeScript) 언어를 발표하면서 오픈소스 진영의 호감도를 높이는 동시에 이제 막 시작된 자바 스크립트의 추세에도 발빠르게 올라타는 대조적인 행보를 보입니다.

그 와중에 터진 브라우저 자바 플러그인의 보안 취약성으로 인한 일련의 사고 및 이에 대한 오라클의 뒤늦은 대응은, 개발자 뿐 아니라 기업의 IT 인프라의 아키텍쳐를 결정하는 데 영향을 줄 수 있는 경영자를 포함한 일반인들에게 까지 자바에 대한 부정적인 인식을 퍼뜨리는 치명적인 결과를 가져오게 됩니다.

하지만 무엇보다 자바의 입지를 크게 위협하는 것은 자바 스크립트의 급부상으로, npm으로 관리되는 자바 스크립트 패키지 수가 고작 2년만에 메이븐의 자바 라이브러리 수를 추월해버릴 정도로(참조: modulecounts.com ) 가히 폭발적인 기세로 빠르게 자바와 같은 기존 언어들의 영역을 잠식해나가기 시작합니다.

이처럼 자바가 서버 시장에서 강력한 도전에 직면한 와중에 안드로이드 덕에 모바일 시장에서는 건재한 모습을 보이고 있지만, 안드로이드를 이끄는 구글이 오라클과 자바에 대한 특허 분쟁을 경험한 당사자이며 누구보다 강력하게 자바 스크립트나 고(Go)와 같은 대안 언어에 힘을 보태고 있는 상황을 감안하면 종합적인 면에서 자바 언어의 전망은 과거 어느 때보다 어둡다고 할 수 있습니다.


자바의 미래, 그리고 대안 모색의 시기


이렇듯 자바의 입지가 급격하게 위협 받게 된 것은 최근의 일이지만, 자바 언어에 대한 대안을 찾는 시도는 훨씬 이전부터 꾸준하게 진행되어 왔습니다.

여기에는 여러 이유가 있겠지만, 무엇보다도 자바 언어는 다수 대기업이 참여하는 JCP(Java Community Process)를 통해 관리되는 통에 상대적으로 C# 등과 같은 언어에 비해 발전 속도가 너무 느리다는 것이 결정적이라고 할 수 있습니다.

예컨대, 람다식(lambda expression)을 지원하는 스칼라 언어가 처음 등장한 것은 2003년이지만 JSR(Java Specification Request)의 형태로 자바 언어에 처음 비슷한 개념이 등장한 것은 2010년이고, 이 것이 실제로 완성되어 발표된 것은 작년의 일입니다.

LINQ(Language INtegrated Query)는 2007년에 닷넷 환경에 포함되었지만, 유사한 기능이 포함된 자바의 EL 3.0은 2013년이 되서야 발표되었습니다.

스칼라나 JVM의 또 다른 대안 언어인 실론(Ceylon) 등에서 제공하는 옵셔널 타입(optional type) 또한 작년 자바 8에 포함되어 발표되었지만, 아직도 실무 환경에서 자바 6나 심지어 자바 5를 흔하게 사용하는 것을 감안하면 일반적인 자바 개발자들이 이러한 기능을 널리 사용하기 위해서는 아직도 몇 년의 시간이 더 필요할 것으로 보입니다.

무엇보다, 메이븐에 있는 수 많은 라이브러리의 API가 대부분 람다와 옵셔널 타입을 통해 개선되기까지는 이보다도 많은 시간이 필요할 것이고, 어쩌면 자바의 핵심 API 같은 경우 영원히 바뀌지 않을 가능성이 높습니다. (제가 기억하는 한 자바는 1.0 시절 이래 한 번도 핵심 API에서 deprecation을 제거한 적이 없습니다.)

한 편, 지난 십여 년간 빅데이터의 등장 및 클라우드 서비스의 일반화로 인해 어느 때보다 동시성의 문제가 중요한 화두로 대두되었고, 이러한 문제를 해결하기 위해서는 불변(immutable)의 데이터 형의 활용을 핵심으로 하는 접근이 대세로 떠오르게 되었습니다.

이러한 맥락에서 함수형 패러다임의 접근 방법이나 메시징 기반 아키텍쳐가 빠르게 입지를 넓혀 나가기 시작했고 스칼라나 아카(Akka)와 같은 대안 언어나 기술들이 각광 받게 되는 배경으로 작용하게 되었습니다.

하지만 20년 가까이 발전하면서 수 많은 라이브러리와 프레임워크로 생태계를 구축한 자바를 하루 아침에 대체하는 것은 결코 쉬운 일이 아닙니다. 따라서 JVM 플랫폼 자체와 그 위에서 돌아가는 여러 라이브러리는 그대로 두고, 컴파일을 통해 클래스 파일을 생성하는 원본 언어만을 대체하는 접근이 널리 쓰이고 있으며, 스칼라, 실론, 코틀린(Kotlin), 그루비(Groovy) 등 수 많은 자바의 대안 언어들이 이와 같은 방식을 채택하고 있습니다.


대안 언어를 배워야 하는 이유?


앞서 언급한 대로, 자바 언어의 입지가 빠르게 위협 받고 있고, 이에 대한 대안 또한 활발하게 연구되고 있지만 상대적으로 우리나라, 특히 SI 환경의 개발자들이 이러한 변화를 체감하기까지는 아직도 상당한 시간이 필요할 것으로 보입니다.

그런 환경에서 "당장 필요한 것도 아닌데 굳이 다른 언어까지 배워야 하는가?"하는 의문이 드는 건 어찌보면 자연스러운 현상입니다.

하지만 우리나라의 IT 환경은 안타깝지만 항상 세계적 흐름에 대해 종속적으로만 움직여왔습니다. 개인적으로 처음 스트러츠(Struts)를 도입했을 때도 많은 반발을 경험했고, 이후 스프링(Spring Framework)으로 이행했을 때도 비슷하게 그 필요성에 의문을 제기하는 목소리는 항상 있어왔지만, 결국 몇 년의 시차를 두고 해외의 추세를 고스란히 따라가는 결과가 되었을 뿐입니다.

이미 SI에서 오랜 경력을 쌓고 안정된 일자리를 기술적 호기심보다 중시하는 분들이라면 아마도 새로운 언어를 배우기 보다는 자바를 계속 하는 것이 올바른 선택이 될 것입니다. 설사 우리나라에서도 자바가 몰락하고 대안언어나 자바스크립트가 대세가 되더라도 아마도 그런 개발자들이 은퇴하기 이전에 자바 일거리가 끊기진 않을 가능성이 높습니다.

반면 아직 자바 경력이 오래지 않았거나, 언제라도 스타트업이나 기술 중심 기업, 혹은 해외 취업등으로 일자리를 옮길 의향이 있는 분들, 혹은 SI를 하더라도 아키텍트 수준까지 오르는 것을 목표로 하는 개발자라면 기술 추세의 변화에 보다 민감하게 반응할 필요가 있고, 지금 시점에서 자바 아닌 다른 언어를 배우는 것은 선택이기 보단 거의 필수에 가까운 상황이 되었음을 인식할 필요가 있다고 봅니다.

사실 한 가지 언어만 사용하면 서 다른 언어의 장점을 이해하기는 무척 어렵습니다. 예컨대 자바 언어의 이넘(enum)이나 예외(Exception) 같은 장치들도, 아마 그런 개념이 없는 언어에 익숙한 개발자에게 소개하면 "그냥 문자열 비교하는 게 더 편한데 왜?", "실패하면 그냥 -1을 반환하면 되잖아?"와 같은 반응을 경험하기 십상일 것입니다.

하지만 그런 개념들이 그 언어 고유의 디자인 철학을 만들고 이를 통해 해당 언어를 사용하는 개발자들이 공유하는 원칙(best practice, principles)으로 자리 잡는 것을 감안하면, 자바보다 이후에 등장한 언어들이 새로 도입한 개념들의 중요성을 간과하는 것은 어리석은 일입니다.

더구나 스칼라나 해스켈 등의 함수형 언어적 특성은 이러한 단순한 기능이 아닌 객체지향과 같은 패러다임의 변화이고, 그 만큼 간단히 이해하기 어렵지만 더욱 큰 함의를 지닌 여러 새로운 개념들을 소개하기도 합니다.

자바가 반드시 나쁜 언어는 아니지만, 이러한 새로운 언어들을 공부하면 어렵지 않게 자바만의 '단순 문자열 비교'나 '-1을 반환'하는 시대에 뒤떨어진 여러 관습들을 깨닫게 될 것입니다.


어떤 대안 언어를 선택할 것인가?


사실 냉정하게 이야기하자면 현 시점에서 자바 언어에 대한 대안을 찾는다면 스칼라 같은 JVM 기반 언어 보다는 자바스크립트를 고르는 것이 가장 합리적인 선택이라고 할 수 있습니다. 어떤 언어를 사용하건 클라이언트 환경은 브라우저를 주요 플랫폼으로 고려할 수 밖에 없고, 자바스크립트는 이미 '웹 시대의 어셈블리'라고 불리울 정도로 브라우저 환경에서 유비쿼터스한 존재감을 확보하고 있습니다.

따라서, 단순히 화면에 효과를 주고 Ajax로 내용을 갱신하는 수준을 넘어 클라이언트 환경에서도 자바 스크립트를 활용하는데 있어서 점점 수준 높은 기술을 요구한다면 그런 기술력을 갖춘 개발자나 회사들은 중복 투자없이 동일한 기술을 서버측에도 적용하기를 희망하는 것은 자연스러운 현상입니다.

반면에, 이렇듯 점점 개발 규모가 커지고 복잡할수록 동적 언어로서 자바스크립트의 단점이 장점보다 더 부각되는 것을 감안하면, 아마도 웹 기술의 미래는 컴파일을 통해 자바스크립트를 생성할 수 있고 (transpiler) 서버에서도 편리하게 사용할 수 있는 생태계를 갖춘 정적인 언어가 대세가 되지 않을까 생각합니다.

그런 면에서 node.js 위에서 구동되는 타입 스크립트나 고와 같은 언어가 앞으로 대세가 될 수 있는 후보군이라고 조심스래 예상해 볼 수도 있을 것입니다.

하지만 이를 위해서 이러한 자바스크립트 기반 기술들은 JVM 기반 기술과 치열하게 경쟁해야할 것으로 보입니다. 앞서 흐름에서 뒤쳐진 자바 언어를 비판했지만, 상대적으로 언어가 아닌 플랫폼 자체, 즉 JVM과 그 위에서 구축된 수 많은 라이브러리와 프레임워크의 생태계는 여전히 꽤나 강력한 경쟁력을 유지하고 있습니다.

플랫폼 독립성은 변화된 환경에서도 여전히 중요한 개념이며, 20년 가까이 썬의 기술력이 집약된 결과 성능 면에서도 아직까지는 기타 대안들에 비해 무시 못할 우위를 유지하고 있기도 합니다.

따라서, JVM 환경을 버리지 않으면서 최근 기술 동향을 보다 적극적으로 반영하는 대안 언어를 찾는 것은 여전히 유효한 접근이며, 그런 관점에서 스칼라나 실론 등 JVM에서 구동되며 기존 자바 라이브러리를 그대로 활용할 수 있는 언어들에 주목할 필요가 있습니다.

사실 JVM에서 구동되는 언어는 자바와 스칼라 이외에도 매우 다양하게 찾아볼 수 있습니다(위키 백과 참조 ). 하지만 이들 중 스칼라(Scala.js ), 실론, 코틀린 등 소수만이 자바스크립트로 컴파일해서 브라우저에서 구동할 수 있으며, 또한 자바스크립트에 비해 정적인 언어의 장점을 극대화하기를 원한다면 그루비와 같은 동적인 언어는 좋은 선택이 되지 않을 것입니다.

이러한 점을 종합했을 때 남은 언어들 중 상대적으로 스칼라가 실론 등에 비해서는 훨씬 넓은 저변을 확보하고 있으며 최근 기술적 추세가 된 이벤트 중심 아키텍처나 함수형 접근 등에 보다 최적화된 특성을 보이는 점을 감안하면, 자바의 대안 언어를 찾는 개발자가 스칼라 언어를 우선적으로 고려하는 것은 합리적인 선택이될 수 있다고 봅니다.


글을 마치며


마음 같아서는 논란이 되었던 글에서 언급된 근거들 보다는 좀 더 설득력 있는 내용으로 스칼라의 기술적 장점에 대해 논해보고 싶다는 생각이 듭니다. 하지만 제가 그런 글을 쓸 수 있을 만한 시간적 여유나 기술적 식견을 갖추고 있는 지는 스스로 상당히 의문이 드는 상황이기 때문에 지금 시점에서는 확실한 말씀을 드리긴 어려울 것 같습니다.

하지만 이런 식으로 기술 외적인 측면에서 자바 이외의 언어를 배워야 하는 이유에 대한 생각을 공유해서 이전처럼 무의미한 언어 간의 자존심 대결 대신 좀 더 차분하고 유익한 논의를 이끌어 낼 수 있다면 그 자체로 어느 정도 의미는 있는 시도가 되었으면 하는 바램이 있습니다.

긴 글 읽어 주셔서 감사드리며, 혹시 앞으로 스칼라에 대해 기술적인 이야기를 할 기회가 있다면 계속 관심을 가지고 지켜봐 주시기를 부탁 드리겠습니다.


최근, 미국의 오픈소스 (Open Source) 기업이 업계 최초로 매출 20 달러 ( 2 3000 억원) 매출을 달성했다는 뉴스가 나왔다. 또한, 기업들의 수요 증가로 매년 자릿수 이상 성장을 하고 있다. 세계적인 불경기의 영향으로 올해 소프트웨어(SW) 시장이 크게 위축된 가운데, 오픈소스 경비 절감과 연관된 분야는 성장세를 이어가고 있다는 소식이 연일 보도되고 있다.

하지만 이러한 흐름이 장점만을 지니고 있는 것은 아니다. 지속적으로 저작권 관한 혼란이 발생하고 있는 것이다. 지난해 초반, 오픈소스 프로젝트를 운영하는 비영리단체 소프트웨어자유관리단 (SFC) 세계적인 가상화 전문업체 VM 웨어를 저작권 침해를 이유로 독일 법원에 제소한 사건도 있었다. 이렇듯, 전세계적으로 오픈소스가 확산되는 추세에 맞춰 계약·저작권 위반 관련 분쟁이 늘고 있으며 우리나라 SW 업체들도 이와 관련된 법적분쟁에 잠재적으로 노출돼 있는 상황이다. 특히, 국내 SW 업체들 중에는 오픈소스 라이선스 규약을 지키지 않고, 무료라고 생각하는 업체들도 있다. 스마트폰과 태블릿용 애플리케이션 경우 오픈소스만으로 제작이 가능한 것도 상당수 있는데다, SW 업계에서는 안드로이드 앱의 90%, iOS 앱의 절반 가량이 오픈소스를 활용하는 것으로 추정하고 있다.

 

양날의 검과 같은 오픈소스’, 특징과 우리가 가지고 있는 오해들, 그리고 활용상 주의점에 대해 락플레이스의 윤종민 수석을 통해 알아보자.

 

 

< 락플레이스 윤종민 수석연구원 >

 

Q: 오픈소스 (Open Source) 언제부터, 어떻게 생겨난 것인가요?

 

1960 년대는 IBM360 으로 대표되는 메인프레임이 지배하던 시대였습니다. 당시에는 소프트웨어와 하드웨어가 밀접하게 결합 (bundling) 되어 있었기 때문에 특정 기종을 위해 만들어진 소프트웨어는 다른 기종에서 작동하지 않았죠. 이때 IBM 소프트웨어 소스코드를 하드웨어와 함께 제공했고, 운영체제 소프트웨어의 소스코드를 폐쇄하지 않았습니다. 그러나 IBM 반독점법 패소에 대한 대응방안의 하나로 소프트웨어를 하드웨어와 분리(unbundling) 하면서 소프트웨어 자체가 중요한 산업이 되었고, 기업들간의 경쟁이 심화되면서부터 소프트웨어의 소스코드는 기업의 비밀이 되었습니다. 그리고 모든 기업들에게 소스코드는 경쟁우위를 보장해주는 기술자원으로 변하였죠.


이러한 흐름의 다른 한쪽에서는 소스코드를 공개하는 새로운 흐름이 형성되고 있었습니다. 1969 AT&T 벨연구소에서 근무하고 있던 톰슨 (Ken Thompson) 개인적인 연구를 수행하기 위해 유닉스 (Unix) 라는 운영체제를 만들었는데요. 운영체제는 C 라는 새로운 고급 언어로 작성되었는데, 이는 하드웨어에 종속되지 않는 특징을 지니고 있었습니다. 이로 인해 연구소가 아닌 곳에서도 유닉스를 사용할 있게 되었고, 이렇게 개발된 유닉스의 소스코드는 주로 연구기관을 중심으로 배포되었습니다.


1980 년대 들어 유닉스는 전세계의 대학이나 연구기관으로 퍼져 나갔으며, 이러한 경향으로 인해 기업들은 유닉스가 시장성이 있음을 인지하고, 유닉스 기종을 만들기 시작했습니다. 이로 인해 유닉스는 상업화의 길을 걷기 시작했죠. 1984 독점금지법 관련해서 AT&T 분할이 이루어지면서 AT&T 컴퓨터업계에 진출할 있게 되었는데요. 과정을 통해 AT&T 과거 거의 무료로 소스코드를 공개하던 방식에서 유닉스의 상품화로 입장을 바꾸어, 가격도 오르고 소스 코드 역시 엄격하게 관리되어 이상 개방되지 않게 되었습니다.


이렇게 유닉스 분야에 상업화 바람이 불면서 유닉스 초기에 존재하던 활발한 소스코드 공개 문화는 사라져 버리게 되어, 결국 제각각이 되어버린 유닉스들은 점차 폐쇄적으로 바뀌어 호환성을 갖지 못하게 되는 상태까지 이르게 됩니다.


유닉스의 상업화 경향이 강화되면서 이에 대한 반발의 움직임으로 자유소프트웨어 운동이 추진되기 시작했는데요. 폐쇄적으로 진행되어 가는 상업용 유닉스의 흐름과는 별개로 자유소프트웨어 (Free Software) 개발되기 시작한 것입니다.


1983 경에 시작된 GNU 프로젝트는 리차드 스톨만 (Richard Stallman) 주도하였는데요. 프로젝트의 목표는 기술적으로 완벽한 유닉스 호환 소프트웨어 체계를 개발하는 이었습니다. 그러나 GNU 기술적으로 유닉스와 같지만, 사용자들에 자유를 준다는 점에서 유닉스와는 본질적으로 달랐습니다 . 결국 사회적 측면에서 , GNU 프로젝트는 기술적으로는 동등하지만 사회적으로는 완전히 다른 소프트웨어를 개발하는 것이었죠. 스톨만이 추구한 것은 사적 독점 소프트웨어 사회체계 맞서 소프트웨어를 공유하고 협력하는 공동체를 만들고, 궁극적으로는 사적 독점 소프트웨어 완전히 극복하는 것이었습니다. 그래서 스톨만은 프로젝트를 수행하기 위해 1985 자유 소프트웨어 재단(Free Software Foundation)’ 설립하였습니다.


< 그림 1> 자유 소프트웨어 재단 (Free Software Foundation) 로고

 

자료 : www.gnu.org

 

자료 : www.fsf.org

 

여기서 자유 다음 가지의 의미를 지닙니다.

첫째, 어떤 목적으로도 프로그램을 가동시킬 있는 자유

둘째, 필요에 맞게 소프트웨어를 수정할 자유

셋째, 무료 또는 유로로 복사본을 재배포할 있는 자유

넷째, 전체 공동체가 혜택을 있도록 프로그램의 수정본을 배포할 있는 자유


한편, 이와 같은 공공의 영역에 위치하고 있는 자유 소프트웨어의 약점은 누군가 그것을 사유 소프트웨어로 사용할 가능성이 있다는 점일텐데요. 문제를 해결하기 위해 스톨만은 저작권에는 반대하지만, 그것을 이용하여 저작권에 대응하는 GPL(General Public Licence) 개발하였습니다. GPL 해당 프로그램을 마음대로 복사, 배포, 수정할 있으나, 수정된 프로그램의 소스는 반드시 공개되어야 한다는 라이센스죠.


GNU 프로젝트는 여러 가지 기술을 개발했으나, 1990 년대 초까지 운영체제의 핵심기능을 담당하는 커널 개발이 지지부진한 상태로 진행되고 있었습니다. GNU 독립된 운영체제로 완성되기 위해서 커널은 반드시 필요한 것이었는데요. 문제는 리눅스 (Linux) 라는 프로그램이 개발되어 GNU 프로젝트에 합류함으로써 해결되었습니다. 리누스 토발즈 (Linus Benedict Tovalds) 유닉스를 개조하던 끝에 새로운 커널을 개발한 것이죠. 1992 년에 새로운 커널이 불완전했던 GNU 체계와 결합하면서 완전한 자유운영체제인 GNU/Linux 완성되었습니다.

 

< 그림 2> GNU/Linux 로고

 

자료 : http://www.howopensource.com/2012/12/linux-and-gnulinux/

 

리눅스가 발전하면서 자유소프트웨어 운동도 발전하였는데, 과정에서 자유소프트웨어 운동 내부에서도 분화가 이루어지기 시작했습니다. 이상주의적이고 도덕적인 스톨만의 입장에 대해서 실용주의적 관점에서의 비판이 이루어지기 시작한 것입니다.


자유소프트웨어 운동을 주도해왔던 스톨만은 공유와 협동의 문화에 입각해서 소프트웨어를 개발해야 하며, 사적 이익과 독점을 추구하는 산업체 주도의 문화에 반대해야 한다고 역설했습니다. 도덕적인 측면에서 자유소프트웨어의 개발을 주장했던 것이죠. 그러나 자유 소프트웨어의 정신은 존중하지만, 스톨만의 도덕적이고 이상주의적 운동방식에 대해 비판적인 입장을 취하는 집단들이 형성되기 시작했습니다.


새로운 접근의 논리적 근거는 에릭 레이몬드 (Eric Raymond) 성당과 시장 (Cathedral and Bazaar)’ 이라는 논문이 발표되면서 이루어졌는데요. 글은 리눅스를 개발하는 방식이 성공적인 결과로 귀결되었는지를 분석하고, 분석결과를 자신이 참여한 오픈소스 프로젝트를 통해 검증한 글입니다. 리눅스 오픈소스 소프트웨어 기술 개발에 대해 인류학적 접근 시도한 글이라고 있죠


레이몬드는 GNU 프로젝트에서 리눅스가 수행한 기능과 역할보다도, 리눅스가 개발되고 개선되는 방식에 주목했습니다. 리눅스의 개발 방식은 스톨만이 주도한 GNU 프로젝트의 개발 방식과는 매우 다른 것이었죠. 레이몬드에 따르면, 스톨만이 주장하는 방식은 탁월한 능력을 가진 전문가들이 복잡한 프로그램을 개발하기 위해 위대한 고립 속에서 주의 깊게 작업하는 것과 유사했습니다. 이것은 중세의 성당 (Cathedral)’ 건축하는 것과 유사한 접근 방식이었는데요. 그러나 리눅스 개발되는 과정은 마치 시장 (Bazaar)’ 에서 여러 사람들이 모여 어지럽게 뒤섞여 제품을 개발하는 방식을 취했다고 주장하며, 바로 이러한 방식이 리눅스의 성공을 가져온 것이라고 의견을 펼쳤습니다.


그는 충분히 많은 베타테스터(β tester) 공동 개발자가 있으면, 거의 모든 문제들은 빨리 파악될 것이고, 중에는 쉽게 고치는 사람이 있게 마련이다 라는 사실을 지적하면서, 불완전한 소프트웨어를 자주 빠르게 발표하여 수많은 사람들이 버그를 수정하는 방식에 주목하였습니다. , 그는 리누즈 토발즈가 리눅스를 만들었다는 사실보다, ‘리눅스의 개발 모델 만든 것에 의미를 부여하였습니다.


레이몬드의 발표는 프로그래머와 업계에 커다란 반향을 일으켰는데요. 특히 1998 1 넷스케이프 사가 레이몬드의 논리를 수용하여 넷스케이프 커뮤티케이터 소스코드를 공개한다고 발표하였습니다. 넷스케이프사의 결정은 스톨만이 주장하는 자유소프트웨어 운동 과는 입장을 달리하는 운동을 형성하는 직접적인 계기가 되었죠. 레이몬드와 그의 입장에 동의하는 사람들은 이러한 오픈소스운동 관리하기 위해 ‘Open Source Initiative’ 라는 조직을 결성하였습니다. 자유소프트웨어의 이념적 측면보다는 그것이 개발되는 방식에 초점을 맞추는 실용적 접근을 취하는 이들은 산업체와의 관계에서도 스톨만과는 다른 입장을 취하는데요. 이들은 자유소프트웨어는 산업계는 물론이고, 개발자에도 경제적인 보상을 제공할 있어야 한다 주장하고 있습니다. 스톨만은 산업계와의 협력을 거부하면서 폐쇄적인 전략을 취하고 있으며, 소프트웨어의 개발자에게도 도덕적인 대의에 협력할 것을 요구한다고 파악하는 것이죠. 이데올로기적 관점이 아니라, 굳건한 실용적 기반위에 자유소프트웨어가 있어야 한다는 것이 이들의 주장입니다.


운동의 흐름을 종합해 보면 다음 < 1> 같이 정리할 있으며, 결국 자유소프트웨어는 원칙에 입각한 소스코드의 자유로운 사용이라는 측면을 오픈소스 소프트웨어는 사회적 실용성에 중심을 두고 소스코드의 공개라는 측면을 강조한다고 있다.

 

< 1> 자유 소프트웨어 운동의 분화


 

Q: 오픈 소스의 범위와 이에 대한 정의에도 많은 혼란이 있는 것으로 알고 있는데요,

    정확히 오픈소스란 무엇인가요?

 

오픈소스 소프트웨어 소스코드를 공개한 상태로 소스코드를 누구나 자유롭게 개작 개작된 소프트웨어를 재배포할 있도록 허용된 소프트웨어를 말합니다.


하지만, 소스코드가 공개 되어 있다고 하여서 이를 오픈소스 소프트웨어라 하지는 않는다는 것이 중요합니다.


오픈소스 소프트웨어는 누구라도 소스코드를 읽을 있고 사용자가 능력이 있다면, 각종 버그의 수정은 물론이고 그것을 개조하여 기능을 추가할 있으며, 누구나 소프트웨어의 개발에 참여할 있죠. 따라서 오픈소스 소프트웨어는 프로그램을 복제하여 배포할 있는 권리’, 소프트웨어의 소스코드에 접근할 있는 권리’, 프로그램을 개선할 있는 권리 개발자에게 보장한다는 특징이 있습니다.

 

< 그림 3> 오픈소스와 관련된 개념들


자료 : 구글 이미지

 

그렇기 때문에 오픈소스란, 단지 소스 코드에만 국한되는 용어가 아닙니다. 오픈소스 소프트웨어의 배포 조건은 OSI(Open Source Inititive) 에서 오픈소스 정의 (OSD, Open Source Definition) 규정하고 있으며, 이는 다음과 같습니다. (아래 10 가지)

1. 자유 배포 (Free Redistribution)

특정한 소프트웨어의 라이센스에는 해당 소프트웨어의 일부나 전부가 다수의 프로그램으로 구성되는 배포판의 일부로 포함되어 재배포되지 못하도록 배포나 판매상의 제한을 설정할 없다. 또한 이러한 종류의 배포판에 대한 판매나 양도에 있어서 별도의 라이센스 비용을 징수할 없다.

2. 소스코드 공개 (Source Code Open)

프로그램 저작물에는 반드시 소스 코드가 포함되어야 하며, 컴파일 형태 뿐만 아니라 소스코드의 배포 또한 허용되어야 한다. 만약 소스코드를 제외한 상태로 배포하고자 한다면 일반적으로 통용되는 매체를 이용해서 제작 실비에 준하는 비용으로 소스 코드를 제공해야만 한다. 경우 가장 바람직한 방법은 인터넷을 통해서 소스 코드를 무료로 다운로드 받을 있도록 하는 것이다. 소스코드는 프로그래머들이 개작하기에 용이한 형태로 제공되어야 하며, 고의로 복잡하고 혼란스럽게 만들어진 형태와 선행 처리기나 번역기에 의해서 생성된 중간 형태의 코드는 허용되지 않는다.

3. 2차적 저작물 (Derived Works)

라이센스에는 프로그램 원저작물의 개작이나 이를 이용한 2 프로그램의 창작이 허용되어야 하며, 이러한 파생적 프로그램들은 최초의 프로그램이 갖고 있던 라이센스의 규정과 동일한 조건하에서 재배포될 있어야 한다.

4. 소스코드 수정 제한 (Integrity of The Author's Source Code)

빌드 과정을 통해서 프로그램을 개작할 목적으로 소스 코드와 패치 파일을 함께 배포할 경우에는, 정상적인 빌드를 보장하기 위해서 라이센스 안에 소스코드의 수정을 제한하는 항목을 추가할 있다. 그러나 이러한 경우에도 수정된 소스 코드를 이용해서 만들어진 소프트웨어에 대한 자유로운 배포를 허용해야 하며, 수정된 소스코드를 통해서 만들어진 2 차적 프로그램을 원래의 프로그램과 구별하기 위해서 별도의 이름과 버전을 사용할 것을 요구하는 항목을 추가할 있다.

5. 개인이나 단체에 대한 차별 금지 (No Discrimination Against Persons or Groups)

라이센스는 모든 개인과 단체에 대해서 동일한 기준으로 적용 되어야 한다.

6. 사용 분야에 대한 제한 금지 (No Discimination Against Fields of Endeavor)

라이센스 안에 특정한 분야에 종사하는 사람에 대한 프로그램 사용상의 제한을 설정할 없다. 예를 들면, 유전연구나 상용 사업체에서는 해당 프로그램을 사용할 없다는 등과 같이 특정한 분야에 대한 사용을 금지하는 제한을 설정해서는 안된다.

7. 라이센스의 배포 (Distribution of License)

프로그램에 대한 권리는 반복되는 배포에 따른 별도의 라이센스 승인이나 양도 과정 없이도 프로그램을 배포 받은 모든 사람에게 동일하게 적용된다.

8. 라이센스 적용상의 동일성 유지 (License must no be specific to a product)

프로그램에 대한 권리는 반복되는 배포 과정에서 특정한 배포판에 포함되어 있는 상태로만 유효하지 않고, 모든 배포 단계에서 동일한 효력을 갖는다. 만약, 특정한 배포판에 포함되어 있던 프로그램을 독립적으로 사용하거나 재배포한다면 해당 프로그램을 배포 받는 사람은 프로그램이 포함되어 있던 최초의 배포판 상태에서 발생된 권리와 동일한 권리를 갖는다.

9. 다른 라이센스의 포괄적 수용 (License must not contaminate other software)

라이센스에 오픈 소스 소프트웨어와 함께 배포되는 소프트웨어에 대한 제한을 설정해서는 안된다. 예를 들면, 동일한 매체를 통해서 배포되는 소프트웨어는 모두 오픈소스 소프트웨어여야 한다는 제한으로 인해서 다른 라이센스 기준을 따르는 소프트웨어가 함께 배포될 있는 형태를 금지해서는 안된다.

10. 이용허락의 기술 중립의무  (License Must Be Technology-Neutral)

이용허락 규정이 어떠한 개별 기술이나 인터페이스 형태를 단정해서는 안된다.

이는 이용허락자와 피이용허락자 사이의 계약 성립을 위해 명시적인 동의 표시를 요구하는 것을 막기 위한 것이다. 소위 '클릭랩 (click-wrap)' 이라 불리우는 강제 조항은 FTP 다운로드나 CD-ROM 수집물, 미러링 같은 중요한 소프트웨어 배포 방식과 상충하며, 이런 강제 조항은 코드 재사용을 가로막는다. 오픈소스 정의를 따르는 이용허락은, ( ) 클릭랩 다운로드를 지원하지 않는 웹이 아닌 접근 수단을 통한 소프트웨어 재배포와, ( ) 팝업 대화 창을 지원할 없는 그래픽 사용자 인터페이스 (GUI: Graphical User Interface) 아닌 환경에서 이용허락을 적용할 코드가 ( 또는 이러한 코드의 재사용 부분이 ) 실행될 가능성을 허용해야만 한다.

이와같이, 위에서 언급한 10 가지의 조건을 충족해야만이 오픈 소스 소프트웨어라 있습니다.

 

Q: 오픈소스와 항상 함께 따라다니는 용어가 바로 저작권 혹은 특허 한데요,

     이와 관련한 주의사항이 있다면?

 

먼저 알고 계셔야 하는 개념이 있는데요, 바로 저작권 특허 차이점입니다.  


저작권 정신적인 분야의 창작을 의미하는 저작물 보호하는 권리입니다. 정당하게 얻어진 저작물에 의해 허용되는 보호는 저작물의 표현만으로 범위가 정해지는데요. 보호 범위는 저작물에 의해 표현된 아이디어, 개념, 또는 원리까지 미치지는 않습니다.


반면 , ‘특허 발명 창작에 대한 권리 이며, 특허법은 권리를 보호하여, 법에 규정된 특정 기간 동안 그들을 사용할 독점권을 특허권자에게 부여한다는 특징을 가집니다. , 다른 사람은 특허권 소유자의 허락 없이 특허를 실시’(, 특허된 발명을 이용) 없는 것이죠.


저작권과 특허권은 서로 상이한 방식으로 획득되는데요.   저작권자는 저작물이 완성된 시점부터 자동적으로 보호 받을 있지만, 특허의 독점적 이용에 관한 권리를 획득하기 위해서는 출원 하여야 하고 성공적인 후속 심사 등록 절차 거쳐야 합니다.

보호기간 역시 상이한데요. 저작권의 보호기간은 원칙적으로, 저작자의 수명에 50 년을 더한 것으로서, 연장이 불가능한 반면, 발명 특허는 20 년의 특허 보호기간이 부여됩니다.


글에서 이야기한 오픈소스 라이선스, 소스 이용 허락 지금 이야기고 있는 저작권 형태로, 소프트웨어가 만들어져 배포되는 순간 자연 발생하여 적용이 된다 점을 분명히 숙지하고 있어야 함을 다시 한번 강조하고 싶습니다

프로그래밍 입문자가 가장 원하는 직업은?

이제 막 프로그래밍을 공부한 입문자들은 어떤 식으로 공부하고 어떤 직장을 원할까요? 이에 대한 흥미로운 설문조사 결과가 공개됐습니다. 설문조사는 미국 프로그래밍 교육 비영리기관 프리코드캠프와 프로그래밍 입문자들의 커뮤니티 코드뉴비에서 진행했다고 합니다.

설문조사에는 1만5655명의 프로그래머가 응답했는데요. 응답자 중 21%가 여성 프로그래머고, 평균 나이는 27살이었습니다. 응답자들은 평균적으로 11개월 전에 프로그래밍 공부를 시작했으며, 28%는 현재 직업을 구하는 데 성공했다고 하네요.

프로그래머 입문자가 공부를 하는 이유는 무엇일까요? 응답자 중 1만1196명의 답을 살펴보면 29%가 “중소 규모 기업에서 일하기 위해서”라고 답했네요. 또한 “창업하기 위해서”나 “프리랜서 개발자로 일하기 위해서” 공부한다는 답변도 각각 20%를 차지했습니다. 글로벌 회사에서 일하고 싶다는 답변은 12%에 그쳤네요.

codenewbie_01

▲사진 : 프리코드캠프 미디엄

프로그래머가 가장 많이 도전하는 분야는 ‘웹 개발자’였습니다. 프론트엔드 혹은 백엔드 개발이 아닌 두 분야를 전부 다룰 수 있는 풀스택 웹 개발자에 도전하는 응답자가 가장 많았습니다. 또한 데이터과학의 인기로 데이터과학자 혹은 데이터엔지니어에 도전하는 프로그래머도 꽤 많았네요.

codenewbie_02

▲사진 : 프리코드캠프 미디엄

응답자들은 프로그래밍을 학습할 때 최소한 3개 정도의 자료를 함께 보면서 공부한다고 하네요. 학습 장소로는 프리코드캠프, 코드카데미, 코세라, 유데미, 칸아카데미 등이 있었습니다. 외부 행사에는 아직 적극적으로 참여하지는 않는 걸로 보입니다. 컨퍼런스나 해커톤에 참여하려는 개발자는 종종 있는 걸로 보입니다.

codenewbie_03

▲사진 : 프리코드캠프 미디엄

codenewbie_04

▲사진 : 프리코드캠프 미디엄

이번 설문조사에 참여한 응답자 중 절반정도가 영어권 국가 개발자이며, 나머지는 스페인어, 러시아어, 힌디어, 포르투갈어 출신 국가가 다양했습니다. 한국인 응답자는 거의 없는 것으로 보이네요.

codenewbie_05

▲사진 : 프리코드캠프 미디엄

좀 더 자세한 설문조사 결과는 미디엄 블로그에서 볼 수 있습니다. 설문조사 데이터는 ‘오픈 데이터 커먼스 라이선스’를 따르며, 누구나 사용할 수 있게 깃허브에 공개됐습니다.

 

+ Recent posts