1. 현대 제품
현대의 제품을 더 이상 단순히 프로그램이라고 부르지 않습니다. 현대 제품은 수십 개의 프로그램, 수백 개의 인터넷 서비스, 그리고 그것이 배포된 클라우드 데이터 센터(데이터 센터라고도 부릅니다)가 제공하는 수많은 API를 포함할 수 있습니다.
많은 현대 제품(어쩌면 대부분)은 패러다임 클라이언트-서버 방식으로 동작합니다. 이는 여러분의 기기(전화, 노트북, 컴퓨터)에 사용자의 상호작용을 담당하는 프로그램이 있고, 핵심 기능은 모든 중요한 일이 일어나는 원격 서버에 위치하는 경우를 말합니다 ➡️🖥️
때로는 여러분의 클라이언트가 여러 독립적인 서버와 통신할 수도 있고, 한 제품의 서버가 다른 제품의 서버와 통신할 수도 있습니다. 결과적으로 클라이언트와 서버로 이루어진 일종의 글로벌 네트워크가 형성되고, 이들은 서로 함께 동작합니다.
따라서 현대 애플리케이션 모델은 패러다임 클라이언트-인터넷-서버로 설명하는 편이 더 나을지도 모릅니다. 그만큼 다양한 복잡한 통신이 많아졌기 때문이죠. 누구에게 언제 요청을 보낼지 스스로 판단하는 이른바 “스마트 통신 채널”도 등장했습니다 🛰️📡
2. 클라이언트
클라이언트 프로그램은 대략 4가지 범주로 나눌 수 있습니다:
- 🖥️ 데스크톱 클라이언트 — 컴퓨터에서 동작하는 프로그램.
- 📲 모바일 클라이언트 — iOS 또는 Android용 애플리케이션.
- 🌐 웹 클라이언트 — 브라우저에서 동작하는 사이트/웹 애플리케이션.
- 🌍 서버 클라이언트 — 다른 서버에서 실행되는 애플리케이션.
각 범주도 다시 세분할 수 있습니다. 예를 들어, 웹 클라이언트는 사이트 또는 웹 애플리케이션이며, 이는 브라우저와 사이트로 구성됩니다. 브라우저도 모두 동일하지 않아 동작 방식이 서로 다를 수 있습니다.
가장 널리 쓰이는 브라우저를 사용하더라도 그 안에 로드되는 사이트는 별개입니다. 사이트는 보통 세 가지로 구성됩니다:
- 📄 HTML
- 🎨 CSS
- ⚡ JavaScript
“이보다 쉬울 게 있나요?”라고 하실지 모르겠습니다. 하지만 요즘은 단순히 HTML과 JavaScript만으로 사이트를 만들지 않습니다. 사이트 개발에는 이제 React, Angular, Vue 같은 본격적인 프레임워크를 사용합니다 ⚛️. 이제 그것들은 단순한 사이트가 아니라 자체 빌드, 테스트, 패러다임을 갖춘 완전한 웹 애플리케이션입니다.
순수한 CSS만 사용하는 경우도 이제 드뭅니다. CSS를 생성하는 데 도움을 주는 CSS 전처리기와 다양한 CSS 프레임워크가 존재합니다. 심지어 이메일용으로도 특별한 CSS 프레임워크가 있어, 브라우저는 물론 대부분의 메일 클라이언트에서도 메일이 예쁘게 보이도록 해 줍니다 💌.
순수한 JavaScript만으로 코드를 작성하는 경우도 거의 없습니다 — 대부분의 대형 웹 애플리케이션은 TypeScript로 개발되고, 이후 JavaScript로 컴파일됩니다. 네, 감이 오시죠...
3. 인터넷과 인프라
클라이언트와 서버의 통신 — 이보다 쉬울 게 있을까요? 하지만 이 관계에서도 이미 많은 것이 바뀌었습니다.
여러분의 제품은 아마도 최신 데이터 센터 중 하나에 배치될 것입니다. 전 세계의 많은 회사들이 자사 서버는 물론 여러분의 자체 물리 서버에서도 제품을 호스팅할 수 있는 다양한 서비스를 제공합니다. 돈만 내면 뭐든 가능합니다.
물리 서버는 더 이상 ‘물리적’이지 않습니다. 오늘날의 데이터 센터는 모두 가상 서버 임대를 제공합니다. 가상 서버는 일종의 가상 컴퓨터로, 하나의 물리 서버 위에 수십 대가 올라갈 수 있습니다. 대신 서버 업그레이드 측면에서는 매우 편리합니다. 더 많은 메모리가 필요하다면, 몇 분 만에 가상 서버에 추가할 수 있습니다 ⏱️.
그러나 이런 접근도 점점 구식이 되어 가고 있으며, 요즘의 트렌드는 클라우드로의 이전입니다 — 제품을 단순히 데이터 센터의 가상 서버에 배포하는 것이 아니라, 그 데이터 센터가 제공하는 다양한 인프라와 서비스를 적극적으로 활용하는 것입니다.
백업을 저장할 서버가 필요하신가요 — 이를 위한 편리한 인프라가 클라우드에 이미 준비되어 있습니다. 신뢰성 99.9999999%의 데이터베이스가 필요하신가요? 그것도 있습니다. Kafka, RabbitMQ, NoSQL? 모두 이미 제공되며 설정도 쉽습니다. 돈만 지불하면 됩니다.
그리고 이러한 데이터 센터와 클라우드는 점차 여러분 제품의 일부가 되고 있습니다. 예를 들어 Amazon은 전 세계에 수많은 데이터 센터를 보유하고 있어, CDN 서비스를 제공합니다: 공개 콘텐츠가 Amazon의 모든 데이터 센터에 캐시되고, 전 세계의 사용자가 더 빠르게 받아볼 수 있습니다 🛰️.
또는 애플리케이션의 API 호출을 서비스 Amazon Gateway API를 통해 통과시키면, 여러분의 서비스와의 연동을 매우 유연하게 구성할 수 있습니다. 다양한 서비스로 부하를 분산하고, DDoS 공격을 방어하며, 파일 업로드를 자동화하고, 스마트 캐싱을 설정하는 등 정말 많은 기능을 사용할 수 있습니다 🛡️.
이처럼 클라이언트 애플리케이션과 여러분의 서비스 사이에는 설정할 수 있고 또 설정해야 하는 수많은 “스마트 커뮤니케이션”이 생겨납니다. 설사 직접 다루지 않더라도, 이러한 것들이 존재하며 여러분 프로그램의 동작에 크게 영향을 미칠 수 있다는 사실은 알고 있어야 합니다.
이밖에도 라우터, 5G 기지국, 위성, 해저 인터넷 케이블 같은 주제는 아직 건드리지도 않았습니다. 여러분은 서버에서 클라이언트로 비디오 스트림을 보내지만, 클라이언트 측 통신 상태가 나빠 연결이 계속 끊긴다면 장애가 발생합니다. 그 문제를 누가 해결해야 할까요? 바로 여러분입니다 😅
4. 서버
“서버”라는 단어 뒤에는 서로 전혀 다른 개념들이 숨어 있을 수 있습니다. 그중에서도 가장 흔한 것들을 알아 두면 도움이 됩니다.
- 🖥️ 물리 서버
물리 서버는 프로세서, 메모리, 스토리지 등의 자원을 갖춘 독립형 컴퓨터 형태의 장비로, 데이터 처리와 다양한 소프트웨어 애플리케이션의 동작을 지원하는 데 사용됩니다. 이러한 서버는 데이터 센터에 설치되어 웹사이트, 애플리케이션, 데이터베이스 및 기타 서비스의 호스팅을 위한 컴퓨팅 파워를 제공합니다. - 🪐 가상 서버
가상 서버는 물리 서버 환경에서 동작하는 소프트웨어적으로 에뮬레이션된 서버입니다. 가상화 기술을 통해 하나의 물리 서버를 여러 개의 격리된 가상 서버로 분할할 수 있으며, 각 가상 서버는 자체 운영체제를 가지고 독립적으로 재부팅 및 설정이 가능합니다. - 🕹️ 서버 프로그램(예: Nginx)
Nginx와 같은 서버 프로그램은 웹 리소스에 대한 요청을 처리하는 서버용 소프트웨어를 의미합니다. Nginx는 웹 서버로 널리 알려져 있으며, 마이크로서비스 아키텍처에서 메일 프록시 서버와 리버스 프록시 서버, 그리고 로드 밸런서 역할도 수행할 수 있습니다. - 💾 데이터베이스 서버
데이터베이스 서버는 데이터베이스 관리 및 이에 대한 요청 처리를 위해 사용되는 특화된 서버입니다. 이는 데이터를 중앙에서 저장하고 처리하며, 네트워크를 통해 데이터 접근을 제공합니다. 데이터베이스 서버는 트랜잭션 처리, 데이터 검색과 변경을 지원하면서 정보 저장의 신뢰성과 보안을 보장합니다. 데이터베이스 서버의 예로는 MySQL, PostgreSQL, Oracle Database 및 Microsoft SQL Server가 있습니다.
그리고 어딘가 데이터 센터의 가상 서버 중 하나에서 C#과 ASP.NET Core로 만든 여러분의 프로젝트가 돌아가게 될 것입니다. 이는 데이터베이스와 상호작용하고, Nginx 또는 Azure Application Gateway를 통해 요청을 수신하며, 수행한 작업의 로그를 Azure Monitor나 Splunk 같은 모니터링 시스템으로 전송할 것입니다 📈.
하지만 바로 여러분의 코드 덕분에 수많은 사용자가 제품에 만족하게 됩니다. 그들은 서비스를 이용하고 비용을 지불하며, 결국 제품의 소유자도 만족하게 되겠죠. 회사의 주가는 오르고, 여러분은 스톡 보너스를 받게 될 것이며 — 행복해질 것입니다 💸. 업계의 진정한 행복 순환고리죠 :)
GO TO FULL VERSION