4/08/2021

Spring Native 베타 소개

3/11일에 Spring Native 베타가 릴리즈되었다. GraalVM을 활용하여 Spring Java 및 Kotlin 애플리케이션을 네이티브 이미지로 컴파일하여 JVM에 구동되는 애플리케이션에 비해 시작 시간과 메모리 오버 헤드를 줄인다.

JVM 실행 파일에 비해 네이티브 이미지는 시작 시간이 더 빠르고 (100ms 미만) 메모리 소비가 적다. 하지만 네이티브 이미지를 빌드하려면 JVM을 이용하는 빌드 대비 더 많은 시간이 필요하다.

이 프로젝트는 아직 베타 버전이긴 하지만, Spring Framework, Spring Boot, Spring Security 및 Spring Cloud를 포함한 대부분의 Spring 프로젝트 모듈을 지원한다.

Spring Native는 Java 및 Kotlin 언어를 지원한다. Spring Native가 좋은 선택이 될 수 있는 상황은 아래와 같다.

  • Spring Cloud Function을 사용하는 서버리스 애플리케이션
  • Spring을 이용한 마이크로 서비스
  • Kubernetes 환경에서의 애플리케이션

Spring Native를 사용하면 개발자는 Java Development Kit, Spring의 필수 기능 및 애플리케이션에 필요한 종속성만으로 최소한의 OS 계층과 네이티브 실행 파일로 최적화된 컨테이너 이미지를 생성할 수 있다. Spring 진영에서는 기존 Spring Boot 애플리케이션을 변형하지 않아도 적용될 수 있게 고려중이다.

일반 JVM과 Native Image의 주요 차이점은 다음과 같다.

  • 애플리케이션의 정적 분석이 빌드시 수행된다.
  • 사용하지 않는 것은 빌드시 제거된다.
  • 리플렉션, 리소스 및 동적 프록시에 대한 구성이 필요하다.
  • 클래스 경로는 빌드시 고정된다.
  • 클래스 지연 로딩이 없다. → 제공된 모든것이 시작시 메모리에 로드됨
  • 일부 코드는 빌드시 실행된다.
  • 몇 가지 제한 사항이 존재한다.

사전 작업

현재 사용하고 있는 환경이 맥이라서 OSX 기준으로 설명하려 한다.

SDKMAN를 이용해 GraalVM과 maven을 설치한다.

SDKMAN 설치

아래의 명령어를 이용해 sdkman을 설치한다.

$curl -s "<https://get.sdkman.io>" | bash
$source "$HOME/.sdkman/bin/sdkman-init.sh"
view rawsdkman_install hosted with ❤ by GitHub

GraalVM 설치

$sdk list java | grep GraalVM
GraalVM | >>> | 21.0.0.2.r11 | grl | installed | 21.0.0.2.r11-grl
$sdk install java 21.0.0.2.r11-grl

Maven 설치

$sdk install maven
view rawmaven_install hosted with ❤ by GitHub

Spring Native Boot strap

Spring Initializr에서 프로젝트를 부트 스트랩 할 때 애플리케이션에 Spring Native를 추가 할 수 있다.


생성된 프로젝트에는 Spring Native 프로젝트와 애플리케이션 소스 코드를 네이티브 실행 파일로 컴파일하는데 사용되는 Spring AOT 플러그인에 대한 종속성이 포함되며 호환성과 풋 프린트가 향상된다.

아래는 Maven Script 예시이다.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.4</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<groupId>com.giljae</groupId>
<artifactId>spring-native-example</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-native-example</name>
<description>Demo project for Spring Native</description>
<properties>
<java.version>11</java.version>
<spring-native.version>0.9.1</spring-native.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.experimental</groupId>
<artifactId>spring-native</artifactId>
<version>${spring-native.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<profiles>
<profile>
<id>native</id>
<build>
<plugins>
<plugin>
<groupId>org.graalvm.nativeimage</groupId>
<artifactId>native-image-maven-plugin</artifactId>
<version>20.2.0</version>
<configuration>
<imageName>${project.artifactId}</imageName>
<!-- The native image build needs to know the entry point to your
application -->
<mainClass>com.giljae.springnativeexample.SpringNativeExampleApplication</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>native-image</goal>
</goals>
<phase>package</phase>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<image>
<builder>paketobuildpacks/builder:tiny</builder>
<env>
<BP_NATIVE_IMAGE>true</BP_NATIVE_IMAGE>
</env>
</image>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.experimental</groupId>
<artifactId>spring-aot-maven-plugin</artifactId>
<version>${spring-native.version}</version>
<executions>
<execution>
<id>test-generate</id>
<goals>
<goal>test-generate</goal>
</goals>
</execution>
<execution>
<id>generate</id>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>jar</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<image>
<builder>paketobuildpacks/builder:tiny</builder>
<env>
<BP_NATIVE_IMAGE>true</BP_NATIVE_IMAGE>
</env>
</image>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.experimental</groupId>
<artifactId>spring-aot-maven-plugin</artifactId>
<version>${spring-native.version}</version>
<executions>
<execution>
<id>test-generate</id>
<goals>
<goal>test-generate</goal>
</goals>
</execution>
<execution>
<id>generate</id>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
<build>
</build>
<repositories>
<repository>
<id>spring-releases</id>
<name>Spring Releases</name>
<url>https://repo.spring.io/release</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-releases</id>
<name>Spring Releases</name>
<url>https://repo.spring.io/release</url>
</pluginRepository>
</pluginRepositories>
</project>
view rawpom.xml hosted with ❤ by GitHub

Spring WebFlux로 REST 엔드 포인트 정의

애플리케이션을 테스트할 수 있도록 Spring WebFlux로 REST 엔드 포인트를 정의해보자.

SpringNativeExampleApplication 클래스, RouterFunction을 사용하여 REST 엔드 포인트를 추가 할 수 있다.

package com.giljae.springnativeexample;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.ServerResponse;
import reactor.core.publisher.Mono;
import static org.springframework.web.reactive.function.server.RouterFunctions.route;
import static org.springframework.web.reactive.function.server.ServerResponse.ok;
@SpringBootApplication
public class SpringNativeExampleApplication {
public static void main(String[] args) {
SpringApplication.run(SpringNativeExampleApplication.class, args);
}
@Bean
RouterFunction<ServerResponse> routes() {
return route()
.GET("/", request -> ok().body(Mono.just("Spring Native Example!!!"), String.class))
.build();
}
}

그리고 SpringNativeExampleApplicationTests 클래스에서 REST에 대한 테스트 코드를 작성해보자.

package com.giljae.springnativeexample;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.reactive.AutoConfigureWebTestClient;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.reactive.server.WebTestClient;
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureWebTestClient
class SpringNativeExampleApplicationTests {
@Autowired
private WebTestClient webClient;
@Test
void getRootReturn() {
webClient
.get().uri("/")
.exchange()
.expectStatus().is2xxSuccessful()
.expectBody(String.class).isEqualTo("Spring Native Example!!!");
}
}

애플리케이션을 jar로 실행하기

프로젝트의 Spring Native 종속성은 Spring AOT 플러그인을 통해 JAR로 실행하는 경우에도 시작 시간과 메모리 소비를 최적화 한다.

터미널 창을 열고 프로젝트 디렉토리로 이동 후 아래의 명령을 실행한다.

$mvn clean package
$mvn spring-boot:run
view rawexecute_jar hosted with ❤ by GitHub

정상적으로 구동되었는지 테스트해보자.

$curl <http://localhost:8080>
**Spring Native Example!!!**
view rawexecute_test hosted with ❤ by GitHub

jar로 정상 동작되는것을 확인했으니., 이제 네이티브 이미지로 실행해보도록 한다.

애플리케이션을 Native 이미지로 실행하기

이제 GraalVM과 함께 Spring Native를 활용하여 네이티브 이미지를 빌드하고 실행하자.

네이티브 이미지를 빌드하는 것은 Spring Boot 플러그인을 사용하면 매우 간단하다. 여기서는 Docker를 이용하지 않고, Native Image를 빌드하는 것으로 설명한다.

이미 pom.xml에 네이티브 이미지 생성 plugin을 작성했기에, 프로젝트 디렉토리에서 아래의 명령어를 실행한다.

$mvn -Pnative clean package
view rawnative_execute hosted with ❤ by GitHub

많은 시간이 흐른 후, 빌드가 성공하면 프로젝트내 /target 디렉토리 밑에 spring-native-example이라는 파일이 생성된다.

/target 디렉토리로 이동하여 아래의 명령어를 실행해서 애플리케이션을 구동해보자.

$./spring-native-example
2021-04-08 17:12:18.522 INFO 1751 --- [ main] o.s.nativex.NativeListener : This application is bootstrapped with code generated with Spring AOT
. ____ _ __ _ _
/\\\\ / ___'_ __ _ _(_)_ __ __ _ \\ \\ \\ \\
( ( )\\___ | '_ | '_| | '_ \\/ _` | \\ \\ \\ \\
\\\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.4.4)
2021-04-08 17:12:18.524 INFO 1751 --- [ main] c.g.s.SpringNativeExampleApplication : Starting SpringNativeExampleApplication v0.0.1-SNAPSHOT using Java 11.0.10 on CRE8ISM.local with PID 1751 (/Users/giljae/Projects/sandbox/spring-native-example/target/spring-native-example started by davian in /Users/giljae/Projects/sandbox/spring-native-example/target)
2021-04-08 17:12:18.524 INFO 1751 --- [ main] c.g.s.SpringNativeExampleApplication : No active profile set, falling back to default profiles: default
2021-04-08 17:12:18.570 INFO 1751 --- [ main] o.s.b.web.embedded.netty.NettyWebServer : Netty started on port 8080
2021-04-08 17:12:18.571 INFO 1751 --- [ main] c.g.s.SpringNativeExampleApplication : Started SpringNativeExampleApplication in 0.067 seconds (JVM running for 0.069)
view rawnative_run hosted with ❤ by GitHub

정상적으로 구동되었는지 테스트 해보자.

$curl <http://localhost:8080>
**Spring Native Example!!!**
view rawrunning_test hosted with ❤ by GitHub

결론

본 글에서는 Spring Boot 애플리케이션을 빠르게 부트 스트랩하고 Spring Native 및 GraalVM을 사용하여 네이티브 실행 파일로 컴파일하는 방법을 살펴보았다. 위에서 사용된 코드는 이곳에 올려두었다. Spring Native 프로젝트에 대한 자세한 정보를 보려면 공식 문서를 참조하길 바란다.

3/21/2021

구독 기반 비즈니스 모델

구독 비즈니스 모델은 소프트웨어 산업의 주요 비즈니스 모델 중 하나지만 지난 몇 년간 다른 Industry에서도 활성화가 많이 되고 있다. 구독 비즈니스 모델은 어디에나 존재한다. Netflix, Apple Music, Youtube, Salesforce.com등 구독 비즈니스는 S&P 500 대비 5배 빠른 수익 성장을 달성하고 있다. 


구독 비즈니스 모델은 무엇인가?

구독 기반 비즈니스 모델은 제품이나 서비스를 사용하기 위해 고객에게 반복적인 요금(매월 혹은 매년)을 청구하는 비즈니스 모델이다. 즉, 고객과의 거래에서 장기적인 관계 구축 및 반복적인 수익 창출이 핵심이다.

구독 비즈니스 모델은 새로운 개념이 아니다. 디지털 기술로 인해 구독이 더 쉬워졌고, 결제 프로세스, 고객 관계 관리 시스템등 비즈니스 기능을 근본적으로 변화시켰다.

PayPal, Strip 및 WePay 같은 디지털 결제 플랫폼을 사용하면 대규모 투자없이 반복 결제를 설정하고 처리 할 수 있다. 이 결과 현재 구독 비즈니스 모델을 사용하는 산업과 비즈니스의 수가 급증했다.

구독 비즈니스 모델은 디지털 플랫폼 회사인 Netflix, Hulu 및 Amazon Prime, Apple Music, Spotify, Youtube등이 주도적으로 리드하고 있다. 하지만 현재 모든 산업에서 새로운 구독 모델이 만들어지고 있으며, 경쟁 역학을 근본적으로 변화시키고 있다.

구독 수익 모델

구독 수익 모델은 복합적인 가치를 활용하는데 도움이 된다. 고객이 회사가 제공하는 가치를 지속적으로 확인하는 한 계속 비용을 지불한다는 의미다.

잡지, 신문, 물, 얼음, 미용, 의류, 식료품, 반려 동물 사료, 와인, 맥주등 많은 제품이 현재 구독으로 전환되고 있다.

구독 비즈니스 모델 현황

구독 모델은 계속해서 인기를 얻고 있다. CAC(고객 확보 비용)는 50%이상 증가했으며 소프트웨어에 대한 지불 의지는 지난 5년동안 꾸준히 감소했다고 한다. 구독을 통해 고객 관계를 활용하기에 지금 이 시점이 매우 좋은 시기이다.

그리고 이런 구독 모델은 쉽게 사라지지 않을 것이다. MacKinsey의 설문 조사에 따르면 고객의 46%는 이미 온라인 스트리밍 서비스에 비용을 지불하고 15%는 설문 조사 후 1년 이내에 전자 상거래 서비스에 가입을 했다.

이것이 GoPro 및 Adobe같은 회사가 구독형으로 전환이 이유이기도 하다. 고객에게 지속적으로 가치를 더할 수 있는 가장 신뢰할 수 있는 방법이기도 하기 때문이다. 또한 가격 책정 전략이 장기적인 성공을 위해 어떻게 포지셔닝을 해야하는지 이해하고 있다.

구독 기반 비즈니스 예시

구독형 비즈니스 모델을 잘 이해하기 위해서는 성공적인 회사를 살펴 보는 것 이기에 몇 가지를 언급한다.

스트리밍 서비스

콘텐츠 스트리밍 서비스는 아마도 구독 비즈니스 모델중 가장 많이 알려진 케이스일 것이다.

Netflix, Spotify, Youtube와 같은 회사는 구독의 성장 잠재력을 활용하여 매우 성공적인 비즈니스를 구축했다.

콘텐츠로 수익을 창출하고 제공하는 엔터테인먼트 경험을 통해 가치를 보여줌으로써 비즈니스를 성공적으로 수행하고 있다. 위에서 언급된 서비스들은 가치 기반 가격 책정의 훌륭한 예시이다.

음식 서비스

Blue Apron, HelloFresh, 마켓컬리와 같은 Meal-kit 서비스는 편의 기반 구독 모델을 사용하는 예시이다. 이런 방식은 다양한 유형의 식자재 선택과 같은 가치를 제공한다.

추가 및 상향 판매로 기본 구독 가격을 보완하는 Blue Apron과 HelloFresh는 채식주의자 및 글루텐이 없는 제품에 대해 더 높은 비용을 지불할 의지가 있는 고객에게 선택권을 준다. 이것은 확장 수익을 통해 ARPU를 높이는 방법의 좋은 예이다.

자동차

구매할 자동차를 결정하는 대신 사람들은 렌탈 구독을 사용하고 있다. 구독 모델은 고객이 실제로 구매해야 하는 비용, 책임 및 복잡함 없이 다양한 제품을 소유하고 있다는 느낌을 준다.

자동차는 주차로 수명의 약 80%를 소비한다. 개인 소유 차량에서 공공 또는 기업이 소유하고 운영하는 서비스로의 전환은 성큼성큼 다가오고 있다. 자율 주행 차량, AI 및 스마트 시티는 도시를 통과하는 방식과 사람들이 이러한 서비스에 대해 지불하는 방식을 혁신하는 효율적인 솔루션을 가능하게 한다.


Audi는 구독 비즈닉스 모델로 이동중이다.

Audi의 구독 서비스 웹 사이트의 슬로건은 “All of the Power, None of the responsibility”이다. 구독 비즈니스 모델은 소비자에게 걱정할 일이 하나 줄어든다는 약속을 제공한다.

Nissan

Nissan은 2계층 구독 비즈니스 모델을 시작했다. 첫 번째 계층은 월 699달러이며 Altima, Rogue, Pathfinder 및 Frontier를 선택할 수 있다. 구독료에는 보험, 긴급 출동 지원, 정기 유지 보수, 청소 및 배송이 포함된다.

두번째 계층에는 몇 가지 흥미로운 선택 사항이 존재한다. 그중 하나는 GT-R이다. 월 899달러에 Maxima, Murano, Armada, Titan, 370Z, Leaf Plus 및 GT-R로 교환 할 수 있다.

항공사

COVID-19로 인해 가치가 많이 하락하긴 했지만, 항공사의 구독 모델은 두 가지 가치를 제안한다.

  1. 빈번한 여행자를 위한 저렴한 여행
  2. 공항에서 보내는 시간 단축의 약속

두 가지 유형의 구독 모델이 제공된다.

첫 번째는 항공편을 제공하고 두 번째는 항공편을 제외하지만 프리미엄 서비스와 수당을 제공한다.

예를 들어서, 델타 스카이 마일스 셀렉트는 특전, 음료 바우처, 우선 탑승 및 기내 선반 공간 보장을 년 59달러에 제공한다.

유나이티드, 젯 블루, 사우스 웨스트는 우선 탑승 및 기내 선반 이용과 같은 특전에 대해 구독을 제공한다.

FlyLine


FlyLine은 구독자의 티켓 비용 절감에 중점을 둔다. 년 49.99달러의 기본 구독 또는 년 79.99달러의 프리미엄 구독을 제공한다.

이 회사는 구독한 고객이 국내 예약에서 평균 10~15%, 국제 예약에서 20~60%를 절약한다고 얘기한다.

Surf Air

Surf Air는 캘리포니아의 “개인 항공 여행 멤버십”이라고 스스로를 칭한다. 고객에게 월 1950달러에 개인 비행기로 무제한 비행을 제공하며 일반 비행기보다 더 효율적인 서비스라고 얘기한다.

Fitness


피트니스 분야에서는 Fitbit을 얘기할 수 있다.

Fitbit Premium은 월 79.99달러에 개인화된 목표, 도전, 코칭 및 가이드를 제공한다. 하지만 하드웨어(스마트밴드)와 결합하는 움직임은 보이지 않는다.

더 매력적인 가치 제안은 스마트밴드를 더 높은 가격에 패키지와 함께 묶는 방법이다. 그러나 많은 회사에서는 일반적으로 판매 및 수익을 잠식시키는 것에 대한 두려움이 있다.

하드웨어 소유자에게만 제공되는 서비스를 구축하려는 Apple의 전략과 마찬가지로 Fitbit은 사용자의 충성도를 유지하는 서비스를 구축하고자 한다.

Game

게임은 과거로 부터 현재까지 이미 구독에 대해서 많이 활성화 되어 있었다. 게임은 개별 게임을 구매하는 대신 다양한 게임에 대한 Access를 제공하는 구독 비즈니스 모델로 전환되었다.

게임 산업의 탈 중개화는 음악 산업과 동일한 경로를 따라가고 있다. 비디오 게임을 소유하는 것은 게임을 플레이하는 사람에게 다양성을 제공할 수 없다라는 점에서 현재는 의미가 없어 보인다. 이 점이 구독으로 변화시키는데 핵심 요인이 되었다.

XBox 게임 패스

box Game Pass는 구독자에게 월 10달러에 100개 이상의 게임에 대한 접근을 제공한다. 마이크로소프트는 구독자 수를 공개하지 않았지만, 일부 보고서에서는 월간 6천5백만명의 플레이가 존재한다고 언급되어 있다.

현재 Xbox One, Windows 10, iOS 및 Android를 포함한 모든 Xbox 게임 플랫폼에서 6400만 명의 활성 Xbox Live 사용자가 존재한다. Xbox Game Pass에는 950만명 이상의 구독자가 있는 것으로 보고 되었다.

Playstation Now


PlayStation Now는 월 9.99 또는 년 59.99에 사용할 수 있는 650개의 게임을 제공한다.

Sony는 2019년 10월말에 PlayStation Now의 구독자 수를 100만명으로 설정했고 이는 6개월전 구독자 70만명에서 40% 증가한 수치이다.

주택 유지 관리

시간 절약은 고객에게 제공할 수 있는 강력한 가치 제안중 하나이다. 주택 유지 보수는 주택 수리에 대한 지식과 시간이 없는 사람들에게 매우 매력적이다.

Super


Super는 월별 또는 연간 요금을 부과한다. 주택 유지 보수 및 수리비는 구독료에 포함되어 있다.

엔터테인먼트

엔터테인먼트는 범위가 크지만 일반적으로 영화, 비디오에 대한 온라인 스트리밍 서비스를 포함한다. 구독료 기반 비즈니스에서 가장 경쟁이 치열한 시장이며 Netflix, Amazon, Apple 및 Youtube와 같은 대규모 플레이어가 있다.

10년전만 해도 수천만명의 사람들이 비디오 스트리밍을 사용했지만, 현재는 10억명이 넘게 사용하고 있다. 기존에는 Vod 사업자가 콘텐츠에 요금을 부과하는 형태로 사업을 진행했지만, Netflix를 필두로 월정액 기반으로 모델이 수립되었고 이 후 새로운 경쟁 업체들은 이런 형태로 사업을 진행하고 있다.

투자자들이 구독 비즈니스 모델을 좋아하는 이유

구독 비즈니스 모델은 예측 가능한 수익과 확장 가능한 모델을 제공한다. 이 모델이 실행되면 플라이휠 효과를 생성하기에 추진력을 얻게된다. 그리고 대규모 고객 기반의 네트워크 효과는 엄청난 파급력과 효율성을 제공하게 된다.

회사가 구독자를 확보하면 고객 유지, 고객 가치 및 해지율로 관심을 전환한다.

구독 비즈니스는 수익, 성장을 추적하고 예측하기가 쉽다.

또한 기업은 고객을 훨씬 더 잘 파악하고 전체적으로 더 많은 데이터를 수집할 수 있다. 구독 모델은 더 깊은 고객 통찰력을 제공할 수 있다.

고객과의 상호 작용이 일회성 구매로 제한되면 소비자 행동과 선호도에 대한 미묘한 차이로 인해 성향을 파악하기가 매우 어렵게 된다.

결과적으로 데이터는 고객 확보를 위한 프로파일링 및 타겟팅을 개선하게 된다.

정기 결제를 기반으로 하기 때문에 비즈니스 리더와 주주가 전략적 계획 및 투자 관점에서 신뢰할 수 있는 예측 가능한 수익을 제공할 수 있다.

이러한 통찰력은 제품 변경 및 신제품 그리고 마케팅에 이르기까지 사업 기회에 대해 의사결정시 참고할 수 있게한다.

소비자는 일반적으로 구독 서비스 가입 후 유지하는 경향이 있다.

구독은 이탈 환경이 아니라 유지인 환경을 만들기 때문에 강력한 비즈니스 모델이다.

구독 가격 모델은 비즈니스에 어떤 이점을 제공하는가?

구독 기반 비즈니스 모델은 반복되는 수익에 대해 예측이 가능하고 변동될 수 있는 주문형 구매보다 가치가 훨씬 높기 때문에 매력적이다.

구독 기반의 서비스를 제공하면 정기적으로 사용자와 의사 소통할 이유가 많기 때문에 더 강력한 고객 관계를 구축할 수 있고, 고객은 낮은 임계 장벽으로 인해 혜택을 받게 된다. 예를 들어 구독은 연간 전체 지불보다 비용이 저렴하고 고객이 언제든지 쉽게 서비스를 취소 할 수 있기 때문에 개부분의 경우 위험이 줄어들게 된다.

구독 비즈니스 모델은 어떻게 작동하는가?

기본적인 아이디어는 고정 거래 비용을 받는 것에서 제품 또는 서비스에 대한 반복 청구로 전환하는 것이다. 디지털 제품/서비스의 경우 한계 비용이 낮거나 거의 0에 가깝기 때문에 전환은 쉽다.

구독 비즈니스 모델은 거래 비용에서 반복 수익으로 이동하는 방식으로 작동된다. 처음에는 수익이 적은 금액으로 진행될 것이지만, 리소스와 비용이 재정렬이되면 장기적으로는 상황이 역전된다.

고객이 대규모로 추가 될 수 있고 지속적인 구독을 하는 고객의 가치가 단일 거래 고객보다 높기 때문에 수익이 증가한다. 기본적으로 이는 SaaS형태의 Multi-tenant기반이어야 하며 이렇게 구축이 되어야 비용이 감소하고 저렴하게 확장할 수 있다.

구독 비즈니스 모델로 전환시 처음 수익 감소 후 비용이 증가하는 이유는?

전통적인 파이프라인에서의 수익은 일회성 판매를 통해 모든 것을 인정 받는다. 그러나 구독 비즈니스에서의 수익은 계약 기간 동안 더 작은 단위(e.g 월정액)로 인식된다. 회사가 SaaS 제품에 투자함에 따라 비용이 증가하게 된다.

그러나 장기적으로는 상황이 역전된다. 수익은 향후 고객 기반이 증가하고 비즈니스 모델이 확장되기 시작함에 따라 증가한다. 이런 터닝 포인트가 지나면 비용은 감소하게 된다.

구독 비즈니스 모델 개발에는 현재 비즈니스 모델을 구독 모델로 전환하여 새로운 가치를 창출하는 방법과 정의가 포함된다.

조직의 SPVM(Sourcing, Procurement and Vendor Management)요소가 구독 비즈니스 모델에 어떻게 부합하는지 평가해야 한다. 여기에는 새로운 조달 자원, 활동 및 파트너로의 전환이 포함될 수 있다.

즉 전체 P&L 분석을 수행해야 한다.

왜 구독 비즈니스 모델을 선호하는가?

구독 비즈니스 모델로의 전환은 고객과 함께 시작된다. 고객 동향과 행동을 이해해야 성공에 다가설 수 있다.

  • 사람들은 교통 수단을 원하지만 우버 또는 쏘카를 통해 차량을 이용할 수 있는 준비가 되어 있다면 소유에 신경쓰지 않는다. (공유 경제)
  • 성공적인 구독 비즈니스는 거래가 아닌 고객 경험과 관계를 기반으로 한다. 경험과 관계가 결합되어야 장기적인 가치를 창출할 수 있다.
  • 구독은 반복적인 수익을 창출한다. 고객이 만족하고 이탈하지 않으면 구독 비즈니스는 성공이다.
  • 솔루션/제품 회사는 구독 회사가 될 수 있다. 디지털 제품에서는 더 쉽게 할 수 있다.
  • 반복되는 마진이 클수록 성장에 더 많은 비용을 쓸 수 있다. 수익 성장을 위해서는 그만한 가치가 있다.
  • 고객 경험은 지속 가능한 경쟁 우위를 창출하는데 매우 중요한 방법이다.

구독 비즈니스로 전환하는 방법

구독 비즈니스 모델로의 전환은 4단계를 거쳐야 한다.

첫번째는 이점을 창출할 수 있는 전략을 개발하는 것이다. 즉, 어떤 새로운 가치를 창출 할 수 있는지 탐구하는 것이다.

두번째는 고객 경험을 제공하고 관계를 구축하기 위해 회사내에서 어떤 변화가 필요한지 측정하고 범위를 정하는 것이다.

세번째는 기능, 기술, 자원의 범위를 지정하는 것이다.

네번째는 시장 적합성과 가치를 최적화하기 위해 Agile 하게 실행하는 것이다.

실행 없이 이루어지는 것은 없다.

주의할 점?

구독 기반으로 비즈니스를 하는 회사가 많아져서 소비자들이 피로도를 느끼고 있다. (다수의 구독을 관리하는데 피로도가 크다.)

결국 고객에게 선택권을 주어야 하고 고객이 당신의 제안을 반복적으로 받을 수 있는지에 대해 고민해야 한다. 그렇지 않다면 그들은 다른 곳으로 떠날 것이다.