2020년 개발 연대기: 비대면 일상이 소프트웨어의 한계를 시험하다
코로나19와 원격 개발, Deno 1.0, .NET 5, Apple M1, Kubernetes 1.19, GPT-3, 국내 공적 마스크 API와 전자출입명부로 2020년의 개발 흐름을 살펴봅니다.
2020년에는 소프트웨어가 사회 활동을 보조하는 도구를 넘어, 멈출 수 없는 기반 시설이 됐다. 코로나19의 세계적 유행으로 사무실·학교·상점·병원의 대면 활동이 제한되자 화상회의, 협업 도구, online commerce, delivery와 cloud service의 사용량이 급증했다. 개발 조직도 갑자기 분산된 환경에서 code review, test, deployment와 장애 대응을 이어가야 했다.
기술 생태계의 변화도 멈추지 않았다. Deno 1.0은 JavaScript와 TypeScript server runtime의 안전한 기본값을 다시 질문했고, .NET 5는 .NET Core 이후 platform 통합의 새 이름을 제시했다. Apple은 M1을 탑재한 첫 Mac을 내놓아 desktop 개발 환경의 CPU architecture 전환을 시작했다. Kubernetes 1.19는 오래 사용된 Ingress API를 안정화하고 release 지원 기간을 늘렸다.
국내에서는 공적 마스크 판매 data를 API로 개방해 민간 개발자가 재고 조회 서비스를 만들었고, QR code 기반 전자출입명부가 역학조사의 접점을 digital system으로 바꿨다. 짧은 시간에 수많은 이용자를 받아야 하는 확장성과 공익을 위한 data 활용, 개인정보 최소 수집과 폐기를 동시에 고려해야 했다.
2020년을 보여주는 장면
| 분야 | 주요 변화 | 개발자에게 생긴 의미 |
|---|---|---|
| 개발 문화 | 원격 근무와 비대면 서비스 급증 | 문서화·비동기 협업·자동화와 service resilience가 필수 조건이 됨 |
| JavaScript | Deno 1.0 | TypeScript 내장, URL module, 명시적 권한을 갖춘 새 runtime 등장 |
| .NET | .NET 5 출시 | .NET Core의 후속 이름 아래 cross-platform 개발 방향을 통합 |
| 개발 장비 | Apple M1 Mac 출시 | x86-64 중심 Mac 생태계가 Arm64 binary와 universal app으로 전환 |
| container | Kubernetes 1.19 | Ingress v1 안정화와 minor release 지원 기간 연장 |
| 인공지능 | GPT-3 논문·API beta | 큰 language model을 prompt와 API로 활용하는 방식이 부상 |
| 국내 공공 data | 공적 마스크 API 개방 | 정부 data와 민간 개발·cloud·map service의 빠른 협업을 입증 |
| 국내 방역 | 전자출입명부 도입 | QR 발급자·시설·방역기관을 연결하면서 분리 보관과 폐기 조건을 구현 |
원격 근무, 자동화와 운영 복원력이 일상이 되다
2020년 초 각국에서 이동과 대면 활동이 제한되자 이미 존재하던 원격 협업 도구가 짧은 기간에 핵심 업무 환경이 됐다. source repository와 issue tracker, chat, video conference, cloud document가 사무실의 대체재가 됐다. 구두로 전달하던 배포 절차와 특정 개인의 local machine에만 있던 설정은 분산된 조직에서 곧 병목이 됐다.
개발팀은 pull request와 automated test, CI/CD를 통해 서로 다른 시간과 장소에서도 변경을 검증해야 했다. infrastructure as code와 reproducible development environment의 가치도 커졌다. 장애 대응에는 공유 dashboard, log, trace와 on-call communication이 필요했다.
서비스 운영자는 예측 범위를 벗어난 traffic과 사용 패턴을 만났다. video·education·commerce 서비스는 capacity를 빠르게 늘려야 했고, 의료·행정 서비스는 장애가 국민 생활에 직접 영향을 줬다. autoscaling과 CDN만으로 모든 문제가 해결되지는 않았다. database connection, third-party API quota, queue 적체와 인증 system처럼 가장 느린 dependency가 전체 확장성을 결정했다.
이 변화가 모든 직무와 조직을 완전 원격으로 바꾼 것은 아니다. 제조·의료·현장 업무에는 물리적 공간이 필요했고 가정의 network와 돌봄 환경도 달랐다. 다만 개발 과정에서 ‘같은 사무실에 있다’는 가정을 걷어내고 기록과 자동화로 협업하는 흐름은 크게 앞당겨졌다.
Deno 1.0, JavaScript runtime의 기본값을 다시 묻다
Node.js를 처음 만든 Ryan Dahl이 이끈 Deno project는 5월 13일 1.0을 출시했다. Deno는 V8 위에서 JavaScript와 TypeScript를 실행하지만 Node.js의 호환 후속판은 아니었다. Rust로 작성된 runtime과 Tokio event loop를 사용하고 browser에 가까운 web API를 제공하는 별도 platform이었다.
TypeScript compiler가 내장돼 별도의 설정 없이 .ts file을 실행할 수 있었고 module은 package manager의 중앙 registry 이름 대신 URL로 import했다. 표준 library도 version이 표시된 URL에서 불러왔다.
import { serve } from "https://deno.land/std@0.50.0/http/server.ts";
const server = serve({ port: 8000 });
for await (const request of server) {
request.respond({ body: "Hello from Deno 1.0\n" });
}
위 코드는 Deno 1.0 당시 API를 보여주는 예제로, 이후 standard library와 HTTP API가 바뀌었으므로 현재 Deno의 권장 code와는 다르다.
Deno process는 기본 상태에서 file system, network와 environment variable에 접근할 수 없었다. 실행할 때 --allow-net, --allow-read처럼 필요한 권한을 명시해야 했다. dependency가 설치 과정에서 임의의 script를 실행하는 관행 대신 runtime permission을 기본 경계로 둔 것이다.
그러나 1.0의 안정성 약속은 Deno core API에 관한 것이었고 생태계 전체가 Node.js만큼 성숙했다는 뜻은 아니었다. npm package 호환성과 framework, 배포 도구는 제한적이었다. Deno가 즉시 Node.js를 대체하지는 않았지만 TypeScript 지원, web standard API와 secure-by-default라는 문제의식을 server-side JavaScript 논의의 중심에 놓았다.
.NET 5, Core를 떼고 하나의 .NET을 향하다
Microsoft는 11월 10일 .NET 5를 출시했다. 이름에서 Core를 떼고 version 4를 건너뛴 것은 .NET Framework 4.x와의 혼동을 피하면서 .NET Core 계열이 앞으로의 주 platform임을 나타내려는 선택이었다. Windows, Linux와 macOS에서 같은 SDK-style project와 command-line tool을 사용하는 방향이 이어졌다.
.NET 5와 함께 C# 9, F# 5, ASP.NET Core 5와 Entity Framework Core 5가 출시됐다. C# 9의 record는 값 중심 data model을 간결하게 표현했고 top-level statement는 작은 program의 진입 code를 줄였다.
public record Post(int Year, string Title);
var post = new Post(2020, "하나의 .NET을 향한 전환");
Console.WriteLine($"{post.Year}: {post.Title}");
성능 개선과 Arm64 지원, single-file application 같은 배포 기능도 강화됐다. container image 이름은 dotnet/core 계열에서 dotnet 계열로 옮겨 platform 명칭의 변화가 build pipeline에도 반영됐다.
하지만 당초 구상한 모든 통합이 .NET 5에서 완료된 것은 아니었다. Xamarin과 Mono를 하나의 toolchain으로 합치는 작업은 감염병 상황의 일정 조정 속에서 .NET 6으로 이어졌다. .NET 5는 LTS가 아닌 current release였으며 장기지원이 필요한 조직에는 .NET Core 3.1이 여전히 기준이었다. 이 해는 통합의 완결보다 매년 11월 major version을 내는 새 cadence와 이름을 확립한 시점이었다.
Apple M1, Mac 개발 환경이 Arm64로 이동하다
Apple은 6월 WWDC에서 Intel processor에서 자체 Apple silicon으로 Mac을 전환하겠다고 발표하고, 11월 10일 M1을 탑재한 MacBook Air, 13형 MacBook Pro와 Mac mini를 공개했다. M1은 Mac용으로 설계된 첫 Apple system on a chip으로 CPU, GPU, Neural Engine과 unified memory architecture를 하나의 package에 통합했다.
개발자는 application과 native dependency를 arm64로 compile해야 했다. Xcode는 Intel용 x86_64와 Apple silicon용 arm64 code를 함께 담는 Universal 2 binary를 만들 수 있게 했고, Rosetta 2는 전환 기간에 기존 Intel application을 번역 실행했다.
일반 application은 빠르게 적응할 수 있었지만 compiler, virtualization, container와 low-level extension은 architecture 차이를 직접 마주했다. x86 Linux image가 M1 Mac에서 그대로 native 실행되는 것이 아니었고, package가 포함한 prebuilt binary도 Arm64 지원 여부를 확인해야 했다. build가 성공해도 production이 x86-64라면 여러 architecture에서 test해야 했다.
Apple은 전환에 약 2년을 제시했다. 따라서 2020년은 Intel Mac이 즉시 사라진 해가 아니라 두 architecture가 공존하기 시작한 해였다. mobile device에서 축적한 Arm 기반 chip 설계가 desktop 개발 장비로 들어오면서 개발 환경도 multi-architecture를 기본 조건으로 받아들이게 됐다.
Kubernetes 1.19, 빠른 성장 뒤의 안정성과 지원 기간
Kubernetes 1.19는 8월 26일 출시됐다. 코로나19와 국제 사회의 사건을 고려해 release team이 일정을 늘리면서 20주에 걸친 당시 가장 긴 release cycle이 됐다. open source project도 contributor의 삶과 지속 가능한 작업 속도를 고려해야 한다는 점이 release 기록에 명시됐다.
오랫동안 beta로 널리 쓰이던 Ingress가 networking.k8s.io/v1 안정 API가 됐다. host와 path에 따라 외부 HTTP·HTTPS traffic을 cluster service로 전달하는 선언이 안정성 보장을 받은 것이다. pathType과 IngressClass 같은 항목이 명확해졌으며 controller 구현은 여전히 별도로 설치해야 했다.
또한 1.19부터 minor release의 patch 지원 기간이 약 9개월에서 1년으로 늘었다. 세 달마다 새 minor version이 나오던 속도를 실제 기업의 검증·upgrade 일정이 따라가기 어렵다는 조사 결과가 반영됐다. deprecated API 요청에 server warning을 돌려주는 기능도 추가돼 upgrade 전에 사용 현황을 찾기 쉬워졌다.
지원 기간 연장은 upgrade가 필요 없다는 뜻이 아니었다. 안정 API로의 migration, node와 add-on 호환성, security patch 적용은 계속 필요했다. Kubernetes가 기능 경쟁만이 아니라 API lifecycle과 운영자의 변화 관리에 더 큰 비중을 두기 시작한 해였다.
GPT-3, model 사용법이 학습에서 prompt와 API로 넓어지다
OpenAI 연구진은 5월 1750억 parameter의 GPT-3를 다룬 논문 ‘Language Models are Few-Shot Learners’를 공개했다. model parameter를 별도 fine-tuning하지 않고 instruction과 몇 개의 example을 text prompt에 넣어 translation, question answering, text completion 같은 여러 task를 수행하는 성능을 평가했다.
6월에는 제한된 이용자를 대상으로 OpenAI API beta가 시작됐다. 모든 팀이 거대한 model을 직접 학습하고 serving infrastructure를 운영하지 않아도 network API를 통해 language capability를 application에 결합할 수 있다는 접근이었다. prompt가 program의 입력과 행동을 함께 표현하는 새로운 interface로 떠올랐다.
논문은 few-shot 결과가 모든 task에서 specialist system을 능가한다고 주장하지 않았다. 일부 문제에서는 여전히 큰 격차가 있었고 training data의 bias, 잘못된 문장 생성, 막대한 계산 비용과 misuse 위험도 논의했다. 2020년의 의미는 완전한 인공지능의 도착이 아니라 규모를 키운 범용 model과 API가 software product의 새로운 구성요소로 모습을 드러낸 데 있었다.
국내: 공적 마스크 data와 민간 개발자의 닷새
마스크 수요가 폭증하자 정부는 3월 10일 오후 공적 마스크 판매 data를 개방했다. 건강보험심사평가원이 판매처와 재고 정보를 제공하고 당시 한국정보화진흥원이 주소·좌표와 결합해 open API로 가공했다. cloud 사업자와 map provider가 infrastructure를 지원하고 민간 개발자들이 주변 판매처와 재고 구간을 보여주는 web·mobile service를 만들었다.
공개된 재고는 정확한 낱개 수량이 아니라 100개 이상, 3099개, 229개, 0~1개 같은 구간이었다. 약국의 입력과 data 전달 사이에 지연이 생길 수 있어 화면에는 갱신 시각과 실제 재고가 다를 수 있다는 안내가 필요했다. 위치 검색, cache, API rate와 장애 fallback도 짧은 시간에 해결해야 했다.
NIA의 2020년 성과 자료는 정부의 data 개방과 민간 협업으로 닷새 만에 서비스를 제공했다고 정리했다. 3월 11일부터 29일까지 API 호출은 6억 7천만 회에 이르렀다. 공공기관이 모든 화면을 직접 개발하기보다 신뢰할 수 있는 원천 data와 specification을 열고, 민간이 다양한 사용자 경험을 빠르게 만드는 방식의 가능성을 보여줬다.
동시에 이는 정확성과 책임의 경계를 드러냈다. 약국 현장 data가 늦으면 기술적으로 정상인 API도 이용자에게는 틀린 정보가 된다. 공공 data service에는 schema와 uptime뿐 아니라 생성 과정, 지연, 문의와 오류 수정 channel까지 포함한 운영 설계가 필요했다.
국내: 전자출입명부, 역학조사와 개인정보의 긴장
정부는 6월 10일부터 고위험 시설에 전자출입명부 KI-Pass를 의무 도입했다. 이용자가 platform에서 일회용 QR code를 발급받아 시설의 application으로 scan하면, 확진자 발생 시 방역 당국이 방문 기록을 역학조사에 사용할 수 있었다.
구조의 핵심은 정보를 나눠 보관하는 것이었다. QR 발급 platform은 이용자 식별 정보를, 사회보장정보원은 시설 방문 정보를 각각 암호화해 보관하고 평상시에는 한쪽 data만으로 방문자를 알기 어렵게 설계했다. 역학조사가 필요한 경우에 결합하며 수집 정보는 원칙적으로 4주 뒤 자동 파기하도록 했다.
이 system은 수기 명부의 부정확한 연락처와 공개 노출 위험을 줄였지만 digital exclusion을 없애지는 못했다. 스마트폰을 쓰기 어려운 이용자를 위한 수기 방식이 병행됐고, 사업장은 scanner device와 network를 준비해야 했다. 대규모 이용자의 QR 발급·검증이 특정 platform에 의존하는 문제와 방역 목적 data가 다른 용도로 확대되지 않도록 하는 governance도 중요했다.
전자출입명부는 공익을 위한 추적 가능성과 개인정보 보호를 동시에 code와 운영 정책으로 구현해야 했던 사례다. 보유 기간, 접근 주체와 결합 조건이 문서에만 머물지 않고 database 분리, encryption, access log와 deletion job으로 이어져야 했다.
2020년의 의미
2020년에는 기존에 점진적으로 진행되던 digital transformation이 갑자기 생존 조건이 됐다. 원격 협업과 online service는 source control, CI/CD, cloud와 observability가 유행어가 아니라 일상 업무를 지속하는 기반임을 보여줬다. 급증한 수요는 확장성뿐 아니라 장애 격리와 인간이 대응할 수 있는 운영 체계를 시험했다.
Deno는 secure default를, .NET 5는 platform 통합과 연간 release를, M1은 multi-architecture 개발을 문제로 던졌다. Kubernetes는 기능 추가 뒤에 필요한 안정 API와 support lifecycle을 다듬었다. GPT-3는 미리 학습된 대형 model을 prompt와 API로 사용하는 흐름을 열었다.
국내의 공적 마스크 API는 공공 data와 시민 개발자가 빠르게 현실 문제를 해결한 사례였고, 전자출입명부는 개인정보 보호가 architecture와 retention policy로 구현돼야 함을 보여줬다. 2021년에는 이 비대면 기반이 임시 대응을 넘어 제품과 조직의 상시 구조로 굳어지고, cloud native와 software supply chain security에 대한 관심도 더 커진다.
참고 자료
- World Health Organization, WHO Director-General's opening remarks at the media briefing on COVID-19, 11 March 2020
- Deno, Deno 1.0
- Microsoft .NET Blog, Announcing .NET 5.0
- Microsoft .NET Blog, Announcing .NET 5 Preview 4 and our journey to one .NET
- Apple, Introducing the next generation of Mac
- Apple Developer, Porting Your macOS Apps to Apple Silicon
- Kubernetes, Kubernetes 1.19: Accentuate the Paw-sitive
- Kubernetes, Warning: Helpful Warnings Ahead
- OpenAI, Language Models are Few-Shot Learners
- OpenAI, OpenAI API
- 한국지능정보사회진흥원, 2020 마스크앱 백서
- 대한민국 정책브리핑, 역학조사에 전자출입명부 활용해 접촉자 256명 찾아내