클라우드 개발의 이점 살펴보기

클라우드 개발의 이점 살펴보기

클라우드 개발을 통해 로컬 환경에서 작업한 뒤 클라우드로 업로드하는 것이 아니라 코드를 클라우드 인프라에서 직접 작성하고 디버그하여 실행할 수 있습니다. 이로써 개발 과정이 간소화되어 애플리케이션을 더 빠르게 배포하고 업데이트할 수 있습니다. 이 기사는 클라우드 개발이 무엇인지, 어떤 도구가 유용한지, 그리고 클라우드 개발을 활용하여 고객들의 요구를 충족시키기 위해 애플리케이션을 개발하고 업데이트하는 방법에 대해 설명합니다.

클라우드 개발이란 무엇입니까?

클라우드 개발은 원격 서버에서 실행되는 애플리케이션을 생성하고 관리하는 방식으로, 사용자들이 인터넷을 통해 액세스할 수 있도록 하는 것을 말합니다.

모든 애플리케이션은 백엔드 서비스, 프론트엔드 서비스, 모니터링 서비스와 같은 다양한 종류의 서비스로 구성됩니다. 일반적으로 클라우드 개발 없이는 새로운 서비스를 만들거나 기존 서비스를 업데이트하기 위해 먼저 로컬 환경에서 코드를 작성하고 실행해야 합니다. 서비스가 예상대로 작동하는 것을 확인한 후에 코드를 클라우드 환경으로 푸시하고 거기서 실행합니다. 마지막으로, 서비스를 배포하고 앱과 통합합니다. 이 프로세스는 시간이 많이 소요되며, 로컬 머신에서 서비스를 실행하기 위해 충분히 강력한 컴퓨팅 자원이 필요합니다.

여기에서 클라우드 개발의 가치가 입증됩니다. 클라우드 개발을 통해 코드를 직접 클라우드 인프라에 작성합니다. 코드 작성을 마치면 서비스를 배포하는 것은 단 한 번의 클릭으로 가능합니다.

클라우드 개발로 인해 로컬 머신에서 먼저 코드를 작성하고 테스트할 필요가 없기 때문에 전달 과정이 훨씬 빨라집니다.
전통적인 개발과 클라우드 개발의 단계 차이점을 비교한 다이어그램

유용한 클라우드 개발 도구

프로젝트에 클라우드 개발을 적용하기 위해서는 코드를 효율적으로 구축하고 관리하기 위한 여러 도구가 필요합니다.

  • 코드를 더 효율적으로 작성하는 데 유용한 코드 편집기
  • 코드 변경 사항을 관리하는 버전 관리 도구
  • 코드를 실행하는 컴파일러/인터프리터
  • 애플리케이션을 공개적으로 사용할 수 있는 퍼블리셔

각 도구에 대해서 자세히 알아보겠습니다.

코드 편집기

코드 편집기는 코드 강조, 코드베이스 내에서 쉬운 탐색, 테스트 실행 및 디버깅 기능을 지원하는 소프트웨어 도구입니다. 클라우드 환경에 호스팅된 애플리케이션을 작업할 때, 사용 중인 코드 편집기가 원격 액세스를 지원하는 것이 중요합니다. 왜냐하면 작업 중인 코드는 원격 클라우드 서버에 저장되어 있기 때문입니다.

원격 액세스 지원을 통해 로컬 코드 편집기와 원격 서버 간에 SSH 연결을 구축할 수 있습니다. 그런 다음 로컬 파일처럼 코드 편집기를 사용하여 코드 파일을 생성, 보기 및 수정할 수 있습니다.

Visual Studio Code 및 JetBrains IDE와 같은 인기있는 코드 편집기에는 원격 개발을 지원하는 기능이 있습니다. 예를 들어, Visual Studio Code에서는 Microsoft의 “원격 – SSH” 확장 프로그램을 설치하여 SSH를 통한 원격 코드 액세스를 활성화할 수 있습니다. 확장 프로그램을 설치하면 해당 서버의 IP 주소, 사용자 이름, 암호를 입력하여 원격 서버에 연결하고 로컬 프로젝트와 같이 간편하게 클라우드 기반 프로젝트에서 작업할 수 있습니다.

아래는 Visual Studio Code를 사용하여 원격 기기를 통해 코드에 접근하는 예시입니다.

Visual Studio Code는
Visual Studio Code를 사용하여 원격 기기를 통해 코드에 접근하는 예시

버전 관리

소프트웨어 개발에서 여러 사람이 동일한 코드베이스에서 작업하는 것은 일반적입니다. 버전 관리 도구를 사용하면 특정 코드 라인의 변경을 누가 언제 했는지를 확인하여 문제를 원본으로 추적할 수 있습니다. 버전 관리 도구를 사용하면 새로운 코드가 버그를 발생시킬 때 특정 버전으로 코드를 되돌릴 수 있습니다.

Git, SVN, Mercurial 등 여러 버전 관리 도구가 있으나, 현재 가장 인기 있는 것은 Git입니다. Git는 오픈 소스 버전 관리 시스템으로, 코드의 변경 사항을 관리할 수 있습니다. Git는 분산형 소프트웨어로, 로컬 머신에 Git 저장소의 로컬 복사본을 만들고, 그 후에 로컬로 브랜치를 생성하고 파일을 추가하며, 커밋하고 병합할 수 있습니다. 코드가 배포 준비가 되면, 해당 코드를 서버의 Git 저장소로 푸시합니다.

컴파일러/인터프리터

코드를 작성하고 변경 사항을 추적하는 도구들 다음으로, 클라우드에서 코드를 실행하는 데 필요한 다음으로 중요한 도구는 컴파일러 또는 인터프리터입니다. 사용하는 프로그래밍 언어나 작업하는 런타임에 따라 코드를 기계 코드로 번역하는 데 컴파일러 또는 인터프리터 중 하나가 필요합니다. 컴퓨터가 명령을 이해하고 실행할 수 있도록 합니다. 일반적으로 컴파일러 또는 인터프리터는 코드를 실행 가능한 파일로 빌드하는 데 도움을 줍니다. 차례대로 각각의 차이에 대해서 살펴보겠습니다.

컴파일러

서비스가 실제로 실행되기 전에 컴파일러는 작성한 고수준 코드를 저수준 코드로 번역합니다. 예를 들어, Java 컴파일러는 먼저 소스 코드를 바이트코드로 컴파일하고, 그 다음 Java 가상 머신이 해당 바이트코드를 해석하고 기계 코드 실행 파일로 변환합니다. 결과적으로 컴파일러는 소스 코드를 분석하는 데 시간이 필요합니다. 하지만 실행 중인 서비스에서 디버깅에 많은 시간을 소비하지 않아도 되도록 명백한 구문 오류를 보여줍니다.

코드를 번역하기 위해 컴파일러를 사용하는 프로그래밍 언어에는 Java, C#, Go가 있습니다.

인터프리터

컴파일러와 달리 인터프리터는 서비스가 실행될 때에만 작성된 코드를 기계 코드로 번역합니다. 그 결과, 인터프리터는 코드를 컴파일하는 데 시간이 필요하지 않습니다. 대신, 코드가 즉시 실행됩니다. 하지만, 인터프리터를 사용한 애플리케이션은 코드를 한 줄씩 실행하기 때문에 컴파일러를 사용하는 것보다 느릴 수도 있습니다.

인터프리터를 사용하는 프로그래밍 언어에는 Python, Javascript, Ruby가 있습니다.

퍼블리셔

다른 사용자가 귀하의 서비스에 접근할 수 있도록 하려면 퍼블리셔 도구가 필요합니다. 이는 귀하의 서비스에서 다음과 같은 주요 측면을 관리합니다.

  • 네트워크 구성
  • 도메인 이름 생성
  • 확장성 관리

네트워크 구성

귀하의 서비스에 사용자가 접근할 수 있도록 하려면 네트워크 구성이 중요합니다. 서비스를 온라인으로 제공하는 방법은 귀하의 기술 스택에 따라 달라집니다. 예를 들어, Next.js 프레임워크를 사용하여 웹 애플리케이션을 개발하는 경우, Vercel을 선택하여 애플리케이션 코드를 배포할 수 있습니다.

네트워크 구성을 통해 애플리케이션에서 사용자 정의 동작을 사용할 수 있습니다. 파일을 사용하여 요청을 한 경로에서 다른 경로로 리디렉션하는 방법을 예시로 보여드리겠습니다.

{
  "redirects": [
    { "source": "/book", "destination": "/api/book", "statusCode": 301 }
  ]
}

도메인 설정

모든 서비스는 애플리케이션이 상호작용할 수 있는 URL이 필요합니다. 하지만, URL을 직접 IP 주소로 사용하는 것은 복잡하고 다루기 어려울 수 있으므로, www.servicedomain.com과 같은 도메인 이름을 서비스에 할당하는 것이 좋습니다. GoDaddy나 SquareSpace와 같은 다양한 플랫폼에서는 이러한 목적으로 도메인 등록 서비스를 제공합니다.

확장성

서비스가 사용자로부터 더 많은 요청을 처리할 수 있도록 하려면 서비스에서 확장성 메커니즘을 정의해야 합니다. 이렇게 하면 작업 부하에 따라 서비스의 확장성이 자동으로 조정됩니다. 확장성은 비용도 효율적으로 관리합니다. 최대 사용량을 기준으로 리소스를 할당하는 대신 사용량에 따라 비용을 지불하기 때문에 자원을 낭비하지 않게 됩니다.

Kubernetes HorizontalPodAutoscaler을 사용하여 서비스에 자동 스케일링을 적용하는 예시 정의 파일은 아래와 같습니다.

apiVersion: autoscaling/v1
        kind: HorizontalPodAutoscaler
        metadata:
        name: app
        spec:
        scaleTargetRef:
            apiVersion: apps/v1
            kind: Deployment
            name: appdeploy
        minReplicas: 1
        maxReplicas: 10
        targetCPUUtilizationPercentage: 70

클라우드에서 코드를 실행하는 방법

이제 클라우드 개발에 필요한 도구들에 익숙해졌으니, 클라우드에서 코드를 실행하는 방법에 대해서 알아봅시다. 클라우드에서 코드를 실행하는 두 가지 방법이 있습니다. 가상 머신을 사용하거나 컨테이너를 사용하는 것입니다. 전용 기사에서 차이점에 대해서 더 자세하게 설명하지만, 여기서는 클라우드 개발과 어떤 관련이 있는지 살펴보겠습니다.

가상 머신

가상 머신(VM)은 컴퓨터 안에서 실행되는 컴퓨터와 같은 개념입니다. 자체 가상 하드웨어와 소프트웨어를 갖춘 독립적인 시스템을 모방합니다. VM은 호스트 컴퓨터와 별도로 존재하기 때문에 호스트 시스템에 영향을 미치지 않으면서 필요에 맞는 VM 운영 체제를 선택할 수 있습니다. 또한, 격리된 환경은 추가적인 보안층을 제공합니다. 한 개의 VM이 침해당해도 다른 VM에는 영향을 미치지 않습니다.

VM에는 하이퍼바이저, 호스트 OS, 인프라뿐만 아니라 애플리케이션, 바이너리/라이브러리, 게스트 OS가 포함되어 있습니다.
게스트 OS를 포함하는 VM의 아키텍처

VM은 클라우드 개발에서 OS 선택의 다양성을 제공하지만, VM에서 애플리케이션을 확장하는 것은 컨테이너를 사용하는 것보다 도전적이고 비용이 많이 듭니다. 각 VM이 완전한 운영 체제를 실행하기 때문에 자원 소모가 많아지고 부팅 시간이 더 오래 걸립니다. 한편, 컨테이너는 호스트 운영 체제를 공유하며 애플리케이션 환경만 격리하기 때문에 더 가볍고 빠르게 확장 또는 축소될 수 있습니다.

컨테이너

컨테이터는 소프트웨어 패키지와 다른 종속성을 포함하는 소프트웨어 단위입니다. 컨테이너는 호스트 운영 체제의 커널과 하드웨어를 사용하기 때문에 가상 머신과 달리 별도의 전용 리소스를 갖지 않습니다. 결과적으로, 더 가볍고 시작하는 데 걸리는 시간이 더 짧습니다. 예를 들어, 전자상거래 애플리케이션에는 백엔드와 프론트엔드 서비스를 위한 수천 개의 컨테이너가 포함될 수 있습니다. 이를 통해 애플리케이션은 필요할 때 컨테이너 수를 늘려 확장할 수 있습니다.

컨테이너에는 컨테이너 엔진, 호스트 운영 체제, 인프라뿐만 아니라 애플리케이션과 바이너리/라이브러리가 포함되어 있습니다.
게스트 운영 체제의 부재로 인해 VM 아키텍처보다 더 가벼운 컨테이너 아키텍처

클라우드 코드에 컨테이너를 사용하면 가벼운 성질로 인해 효율적인 자원 최적화와 쉬운 확장성이 가능해집니다. 하지만 대부분의 컨테이너가 Linux 기반인 관계로, 운영 체제를 선택하는 유연성이 제한됩니다.

클라우드 개발 안내

클라우드 개발 도구와 클라우드에서 코드를 실행하는 방법을 다루었습니다. 이 섹션에서는 프로젝트에 클라우드 개발을 활용하는 단계별 가이드를 제공합니다.

컴퓨팅 리소스 확인

무엇보다도, 서비스를 운영하는 데 필요한 적절한 컴퓨팅 리소스가 필요합니다. 여기에는 가상 머신과 컨테이너 중에서 선택하는 것도 포함됩니다. 서비스가 매일 일정한 수의 사용자 요청을 가지거나 Mac 또는 Windows와 같은 특정 운영 체제가 필요한 경우에는 가상 머신을 선택하십시오. 서비스의 사용자 요청이 크게 변동할 것으로 예상되고 운영 비용 최적화를 위해서 서비스를 확장 가능하게 하려면 컨테이너를 선택하십시오.

가상 머신과 컨테이너 중에서 선택한 후에는 사용할 컴퓨팅 리소스를 할당해야 합니다. 고려해야 할 중요한 리소스는 CPU, RAM, 디스크 용량 및 GPU입니다. 이 리소스에 대한 사양은 개발중인 서비스에 따라서 상당히 달라질 수 있습니다. 예를 들어, 1년 데이터 보존 계획을 포함한 모니터링 서비스를 구축하는 경우, 생성된 모든 로그와 메트릭을 저장하기 위해 약 100GB의 디스크 용량을 할당해야 합니다. 대규모 데이터세트에 딥러닝 모델을 적용하는 서비스를 구축 중인 경우, 강력한 CPU와 충분한 RAM, GPU도 필요할 것입니다.

소프트웨어 패키지 및 종속성 설치

컴퓨팅 리소스를 준비한 후에는 필요한 소프트웨어와 종속성을 설치해야 합니다. 설치 프로세스는 가상 머신 또는 컨테이너를 사용하는지에 따라 달라집니다.

최상의 방법으로는 가상 머신 또는 컨테이너 초기화 시 필요한 종속성을 자동으로 설치할 수 있는 메커니즘을 설정하는 것이 좋습니다. 이를 통해 서비스가 배포되자마자 즉시 운영에 필요한 모든 종속성을 갖추게 됩니다. 또한, 필요한 경우 다른 가상 머신이나 컨테이너로의 간편한 재배포를 용이하게 합니다. 예를 들어, Node.js 서비스를 호스팅하기 위한 Ubuntu 가상 머신에 소프트웨어 패키지와 종속성을 설치하려면 배포된 가상 머신을 위해 아래와 같이 cloud-init 스크립트를 구성할 수 있습니다.

#cloud-config
...
apt:
  sources:
    docker.list:
      source: deb [signed-by=$KEY_FILE] https://deb.nodesource.com/node_18.x $RELEASE main
      keyid: 9FD3B784BC1C6FC31A8A0A1C1655A0AB68576280
package_update: true
package_upgrade: true
packages:
  - apt-transport-https
  - ca-certificates
  - gnupg-agent
  - software-properties-common
  - gnupg
  - nodejs
power_state:
  mode: reboot
  timeout: 30
  condition: True

Node.js를 사용하여 컨테이너에서 웹 서비스를 설정하려면 필요한 종속성과 노드를 설치해야 합니다. 아래는 해당 작업을 수행하기 위한 Dockerfile의 예시입니다.

# Pull the Node.js image version 18 as a base image
FROM node:18
# Set the service directory
WORKDIR /usr/src/app
COPY package*.json ./
# Install service dependencies
RUN npm install

작성 코드

필요한 소프트웨어 패키지와 종속성을 설치했으면 재미있는 부분인 코드 작성을 시작할 차례입니다. 클라우드에서 직접 서비스 코드를 작성하기 위해 원격 액세스를 지원하는 코드 편집기를 사용할 수 있습니다. 이러한 편집기에 내장된 디버깅 도구를 사용하면 이 기간 동안 발생하는 문제를 식별하는 데 도움이 될 수 있습니다.

아래는 IntelliJ를 사용하여 재생목록을 관리하는 Go 서비스를 디버깅하는 예시입니다.

IntelliJ의 디버깅 지원으로 코드에 중단점을 설정하여 서비스가 실행되는 동안 작동 방식을 확인할 수 있습니다.
IntelliJ를 사용하여 Go 서비스 디버깅

서비스 테스트

코드 작성을 마치면 서비스를 테스트하는 것이 중요합니다. 최상의 방법으로, 개별 구성 요소가 작동하는지 확인하기 위해 단위 테스트로 시작하고 이어서 서비스가 기존 애플리케이션 서비스와 상호 작용하는 방식을 보기 위해 통합 테스트를 수행한 후, 마지막으로 전체 사용자 경험과 시스템 동작을 평가하기 위한 E2E(엔드투엔드) 테스트를 진행합니다.

아래는 각 테스트 유형의 범위를 구조화하여 제시한 테스트 피라미드입니다. 이는 서비스의 단위 및 통합 테스트에 대한 테스트 노력을 효율적으로 분배하는 데 도움이 될 것입니다.

단위 테스트는 대부분의 테스트 사례를 포함한 다음, 통합 테스트, 마지막으로 엔드투엔드 테스트도 포함해야 합니다.
테스트 피라미드는 각 테스트에 할당되어야 하는 비율을 보여줍니다.

네트워크 설정 구성

사용자에게 서비스를 제공하려면 네트워크 설정을 구성해야 합니다. 이것은 서비스에서 인바운드 데이터와 아웃바운드 데이터에 대한 규칙을 구성하고, 서비스를 위한 도메인 이름을 생성하거나 서비스에 정적 IP 주소를 설정하는 것과 관련될 수 있습니다.

다음은 서비스를 호스팅하는 가상 머신에 정적 IP를 설정하기 위해 cloud-init 구성을 사용하는 예시입니다.

#cloud-config
...
write_files:
  - content: |
        network:
            version: 2
            renderer: networkd
            ethernets:
              enp3s0:
                addresses:
                - 192.170.1.25/24
                - 2020:1::1/64
                nameservers:
                  addresses:
                  - 8.8.8.8
                  - 8.8.4.4
    path: /etc/netplan/00-add-static-ip.yaml
    permissions: 0644
power_state:
  mode: reboot
  timeout: 30
  condition: True

자동 크기 조절 메커니즘 추가

모든 것이 준비되었으니, 이제 자동 크기 조절 메커니즘을 추가해야 합니다. 이는 수요에 따라 리소스를 조정하여 조용한 시간에는 비용을 절약하고 바쁜 시기에는 성능을 향상시킵니다.

서비스의 컨테이터를 관리하기 위해 Kubernetes를 사용한다고 가정하면 아래는 Gcore 관리형 Kubernetes를 사용하여 Kubernetes 클러스터의 자동 크기 조절 메커니즘을 설정하는 예시입니다.

노드 풀의 최소 및 최대 노드를 지정하여 클러스터 자동 크기 조절을 활성화합니다.
Gcore 관리형 Kubernetes 클러스터를 구성하여 클러스터 자동 크기 조절을 활성화합니다.

보안 개선 설정

마지막으로, 서비스가 안전한지 확인합니다. 강력한 인증 방법을 설정하거나 API 게이트웨이와 같은 도구를 활용하여 서비스를 보호하는 등 보안을 강화할 수 있습니다. DDoS 공격과 같은 악의적인 활동으로부터 서비스를 보호하기 위한 메커니즘을 설정할 수도 있습니다.

Gcore 웹 보안을 사용하여 서비스 URL에 대한 리소스를 생성하고 서비스에 대한 보안 보호를 적용하는 예시는 아래와 같습니다.

Gcore 웹 보안을 위해 서비스 도메인 URL과 서비스의 원래 IP 주소를 설정하여 리소스를 생성하면 보안 공격 중에 Gcore의 방어 시스템으로 서비스를 보호할 수 있습니다.
서비스 도메인을 공격으로부터 보호하기 위해 웹 보안 리소스를 생성합니다.

Gcore 클라우드 개발

클라우드 개발을 통해 기능을 빠르게 제공하는 것은 경쟁 우위를 제공할 수 있습니다. 그러나 도구와 환경의 초기 설정은 위험할 수도 있습니다. 이 단계에서 실수는 이점을 약화시킬 수 있습니다.

Gcore에서는 이러한 장애물을 인식하고 해결책으로 Gcore 함수형 서비스(FaaS)를 제공합니다. Gcore FaaS는 설정의 복잡성을 제거하여 코드 편집기, 컴파일러, 디버거 또는 배포 도구를 구성하지 않아도 코딩에 집중할 수 있도록 해줍니다. 기존 애플리케이션과 원활한 통합이 필요한 간단한 서비스에 이상적으로 적합한 Gcore FaaS는 다음과 같은 사용 사례에서 뛰어난 성과를 보입니다.

  • 실시간 스트림 처리
  • 제3자 서비스 통합
  • 모니터링 및 분석 서비스

결론

클라우드 개발을 통해 코드 작성 및 테스트 단계를 마치고 나면 즉시 서비스를 사용자에게 제공할 수 있습니다. 생산 문제를 해결하고 기능을 빠르게 구현하여 고객을 보다 만족시킬 수 있습니다. 그러나, 클라우드 인프라 구축은 시간이 많이 소요되며 이상적으로는 구축 및 유지에 경험이 많은 시스템 관리자 팀이 필요합니다.

Gcore FaaS를 사용하면 스스로 그러한 도전을 하지 않아도 됩니다. 코드 작성에만 집중하면 팟 및 네트워크 구성, 자동 크기 조절 실행 등 남은 작업은 자사에서 모두 처리합니다. 게다가, 고객이 실제로 앱을 사용한 시간에만 요금이 청구되어 비용 효율적인 운영이 가능하게 됩니다.

Gcore FaaS가 어떻게 작동하는지 확인하고 싶습니까? 무료로 시작하십시오.

Subscribe to our newsletter

Stay informed about the latest updates, news, and insights.