앱의 새 버전 개발하기

이 항목에서는 앱을 새 버전 또는 패치로 업데이트할 때 필요한 정보와 모범 사례를 제공합니다.

새 버전 또는 패치 개발 시 모범 사례

공급자는 앱의 새 버전이나 패치를 개발할 때 다음 모범 사례를 고려해야 합니다.

자동 보안 검사를 시작하기 전에 앱을 완전히 테스트하기

다음 작업으로 자동 보안 검사를 시작할 수 있습니다.

  • 앱 버전이 있는 경우 애플리케이션 패키지의 DISTRIBUTION 속성을 EXTERNAL 로 설정

  • DISTRIBUTION 속성이 EXTERNAL로 설정된 애플리케이션 패키지에 새 버전 또는 패치 추가

보안 검사를 시작하기 전에 앱의 새 버전 또는 패치를 로컬에서 완전히 테스트하여 실패 시 검사 지연 및 여러 번의 반복을 방지하는 것이 좋습니다.

버전 간 호환성 보장하기

공급자는 새 버전이 이전 버전의 앱과 호환되는지 확인해야 합니다. 예를 들어 앱에 v1 버전과 v2 버전이 있는 경우 v2는 v1과 호환되어야 합니다. 버전 v3이 추가되면 버전 v2와 호환되어야 합니다. 그러나 앱은 한 번에 두 가지 버전만 존재할 수 있으므로 버전 v3이 버전 v1과 호환될 필요는 없습니다.

이전 버전에서 실행 중인 코드는 새 버전에서 도입된 상태 변경 사항을 처리해야 합니다. 상태 비저장 오브젝트를 처리하기 위해 공급자는 버전 스키마를 사용하여 업그레이드가 올바르게 처리되도록 해야 합니다. 자세한 내용은 버전 스키마를 사용하여 여러 버전에 걸쳐 앱 오브젝트 관리하기 섹션을 참조하십시오.

패치의 상태 변경 최소화하기

공급자는 새 패치가 동일한 버전의 이전 패치와 다른 상태 변경을 가져오지 않도록 해야 합니다. 공급자는 패치를 개발할 때 테이블이나 열을 추가하거나 변경하는 등의 상태 변경을 최소화해야 합니다. 테이블과 열은 모든 버전과 패치에서 호환성을 유지해야 합니다. 패치는 상태 수정을 수반하지 않는 버그 수정이나 사소한 기능 추가에 초점을 맞춰야 합니다.

상태 변경은 앱 버전을 업데이트할 때만 수행해야 합니다.

설정 스크립트에서 오브젝트를 만들 때 안전 수칙 사용하기

설정 스크립트에서 오브젝트를 만들 때는 다음 모범 사례를 고려하십시오.

  • CREATE IF NOT EXISTS 사용:

    테이블, 뷰, 함수 또는 프로시저와 같은 데이터베이스 오브젝트를 만들 때는 항상 CREATE OR REPLACE, CREATE IF NOT EXISTS 또는 CREATE OR ALTER 중 해당되는 것을 사용해야 합니다. 이렇게 하면 업그레이드 중에 이미 존재하는 오브젝트를 만들려고 할 때 발생하는 오류를 방지할 수 있습니다.

    Snowflake는 함수나 프로시저와 같은 상태 비저장 오브젝트에만 CREATE OR REPLACE 를 사용할 것을 권장하며, 테이블과 같은 상태 저장 오브젝트에는 사용하지 않는 것이 좋습니다.

  • 각 앱의 설정 스크립트가 독립적인지 확인하기

    앱의 각 버전은 완전하고 독립적이어야 합니다. 예를 들어 버전 2.0에서 CREATE TABLE IF NOT EXISTS a(int c)를 사용하여 테이블을 만들었고 버전 3.0에 ALTER TABLE A(…)가 포함된 경우 버전 3.0에 CREATE TABLE 및 ALTER TABLE 문이 모두 있는지 확인합니다. 이렇게 하면 이후 버전에서 앱을 설치하는 사용자가 필요한 모든 스키마와 오브젝트를 확보할 수 있습니다.

  • 설정 스크립트에서 idempotent 변경 사항만 사용하기

    오류나 의도하지 않은 부작용 없이 여러 번 실행될 수 있도록 CREATE 및 ALTER 문이 idempotent가 되도록 구조화하십시오. 설치 중에 설정 스크립트가 실패하면 Snowflake는 설정 스크립트를 처음부터 다시 실행합니다. 이 버전에 대해 이미 버전 스키마가 생성된 경우에는 다시 생성되거나 삭제되지 않습니다. 따라서 공급자는 CREATE 명령의 CREATE IF NOT EXISTS 버전을 사용해야 합니다.

    예:

    • ALTER TABLE ADD COLUMN IF NOT EXISTS 를 사용하여 열이 아직 존재하지 않는 경우에만 열이 추가되도록 합니다.

    • 행을 삽입할 때 의도하지 않은 경우 업그레이드가 여러 번 다시 시도될 수 있으므로 행이 중복되지 않도록 안전 장치를 구현하십시오.

애플리케이션 역할 생성 또는 삭제 시 주의

버전 또는 패치에서 애플리케이션 역할을 만들거나 삭제할 때는 주의하십시오. 애플리케이션 역할은 버전이 지정되지 않습니다. 한 버전에서 다른 버전으로 애플리케이션 역할을 삭제하거나 오브젝트에 대한 권한을 취소하면 앱이 작동을 멈추거나 컨슈머가 앱에 액세스하지 못할 수 있습니다.

CREATE OR REPLACE APPLICATION ROLE 을 사용하지 마십시오. CREATE APPLICATION ROLE IF NOT EXISTS 를 대신 사용하십시오. OR REPLACE 절은 역할을 삭제하고 다시 생성하므로 이전 버전에서 애플리케이션 역할에 부여된 계정 수준 역할을 다시 부여해야 하므로 권한 문제가 발생할 수 있습니다.

컨테이너를 사용하여 앱의 새 패치 또는 버전을 개발할 때의 모범 사례

공급자는 컨테이너가 포함된 앱의 새 버전이나 패치를 개발할 때 다음 모범 사례를 고려해야 합니다.

  • SYSTEM$WAIT_FOR_SERVICES 시스템 함수의 시간 제한 값을 설정할 때는 주의하십시오.

    이 값을 너무 긴 값으로 설정하면 앱의 다른 부분에서 서비스 가용성을 기대하는 경우 실패할 수 있습니다. 자세한 내용은 설치 스크립트 실행 일시 중지 섹션을 참조하십시오.

  • Snowflake는 버전이 지정된 스키마 내에서 버전 이니셜라이저 저장 프로시저를 만들 것을 권장합니다. 버전 이니셜라이저가 버전 스키마 내에서 만들어지지 않은 경우 버전 이니셜라이저가 버전 간에 존재하지 않을 수 있습니다.

  • 앱에서 버전 이니셜라이저를 지정하는 경우 Snowflake는 앱이 설정 스크립트 대신 버전 이니셜라이저 내에서 서비스를 시작하거나 업그레이드하도록 권장합니다. 이렇게 하면 업그레이드 시도가 실패할 경우 올바른 버전의 서비스가 실행되고 있는지 확인할 수 있습니다.

  • 버전 이니셜라이저는 애플리케이션 역할에 부여할 필요가 없습니다.

컨테이너를 사용하여 앱을 업데이트하는 방법에 대한 자세한 내용은 컨테이너로 앱 업데이트하기 섹션을 참조하십시오.

컨테이너로 앱 업데이트하기

컨테이너가 포함된 앱을 새 버전으로 업데이트하면 업그레이드 시 고려해야 할 사항이 추가됩니다. 컨테이너로 앱을 업그레이드하는 프로세스는 크게 두 가지 스테이지로 나뉩니다.

  • 앱이 관리하는 컨테이너에서 서비스를 업그레이드합니다.

    다른 Snowpark Container Services와 마찬가지로 컨테이너 앱은 ALTER SERVICE 명령을 사용하여 새 버전에 대한 서비스 사양 파일을 기반으로 서비스를 수정합니다. 이 명령은 비동기적으로 실행됩니다.

  • 앱의 다른 오브젝트를 업그레이드합니다.

    서비스가 성공적으로 업그레이드되면 앱 내의 다른 오브젝트도 업그레이드됩니다. 이는 일반적인 Snowflake Native App 업그레이드 프로세스와 유사합니다. 자세한 내용은 앱 업그레이드 정보 섹션을 참조하십시오.

Snowflake Native App Framework 를 통해 사용자는 주요 버전 업그레이드 중에도 앱을 계속 사용할 수 있으므로 정상적인 앱의 다운타임이 발생하지 않습니다. 그러나 컨테이너를 사용하는 앱의 경우 CREATE SERVICEALTER SERVICE 모두 비동기식입니다. 즉, 업그레이드가 완료된 후에도 새 버전의 서비스를 즉시 사용할 수 없는 경우가 있습니다.

컨테이너를 사용하여 앱을 업그레이드할 때 발생할 수 있는 문제는 ALTER SERVICE 명령이 비동기적으로 실행된다는 점입니다. 이 명령으로 설정 스크립트에 ALTER SERVICE 를 직접 추가하는 경우 서비스 업그레이드가 진행되는 동안에도 설정 스크립트가 계속 실행됩니다.

공급자는 서비스 업그레이드가 아직 완료되지 않은 경우를 가정하여 설정 스크립트를 작성하거나 SYSTEM$WAIT_FOR_SERVICES버전 이니셜라이저를 사용하여 서비스 업그레이드 관리하기 섹션을 사용하여 올바른 버전의 서비스를 사용할 준비가 되었는지 확인해야 합니다.

서비스 업그레이드를 올바르게 처리하기 위해 Snowflake Native App Framework 는 앱에서 이를 허용하는 기능을 제공합니다.

  • 서비스가 성공적으로 업그레이드되거나 실패할 때까지 설치 스크립트 실행을 일시 중지합니다. 공급자는 설정 스크립트가 가능한 상황을 처리할 수 있는지 확인해야 합니다. 자세한 내용은 설치 스크립트 실행 일시 중지 섹션을 참조하십시오.

  • 업그레이드에 실패한 경우 버전 이니셜라이저 함수를 사용하여 서비스 업그레이드를 이전 버전으로 롤백할 수 있습니다. 자세한 내용은 서비스 업그레이드 시 고려 사항 섹션을 참조하십시오.

설치 스크립트 실행 일시 중지

다운타임을 최소화하고 서비스가 준비되도록 하려면 서비스를 만들거나 변경한 후 설정 스크립트에서 SYSTEM$WAIT_FOR_SERVICES 시스템 함수를 사용하십시오.

SELECT SYSTEM$WAIT_FOR_SERVICES(600, 'services.web_ui', 'services.worker', 'services.aggregation');
Copy

이 명령을 사용하면 다음 중 하나가 발생할 때까지 설치 스크립트가 일시 중지됩니다.

  • 시스템 함수에 전달된 모든 명명된 서비스는 READY 상태를 갖습니다.

  • 명명된 서비스는 FAILED 상태입니다.

  • 600초가 경과했습니다.

이 시스템 함수는 서비스 가용성 또는 장애가 발생할 때까지 앱 설치 또는 업그레이드를 대기하여 서비스 상태가 버전 업그레이드와 동기화되도록 보장합니다.

서비스 업그레이드 시 고려 사항

Snowflake Native App Framework 는 공급자가 업그레이드 서비스를 나머지 업그레이드 프로시저와 동기화할 수 있도록 하는 버전 이니셜라이저 콜백 함수를 제공합니다.

기본 앱을 업그레이드하는 동안 설정 스크립트는 버전이 지정된 스키마 내의 오브젝트를 수정하여 앱의 새 버전으로 업그레이드합니다. 업그레이드 중에 오류가 발생하면 버전 관리된 스키마 내의 오브젝트가 앱의 이전 버전으로 돌아갑니다.

컨테이너가 있는 앱의 경우 설정 스크립트에서 CREATE SERVICE 또는 ALTER SERVICE 명령을 실행하여 생성하거나 수정하는 서비스는 새 버전에 대한 서비스 사양 파일을 사용합니다.

서비스는 버전이 지정된 스키마 내에서 생성되지 않으므로 CREATE SERVICE 또는 ALTER SERVICE 명령이 성공적으로 실행되는 즉시 서비스가 업그레이드됩니다. 예를 들어, 설정 스크립트에서 나중에 오류가 발생하면 버전 관리된 스키마의 오브젝트는 이전 버전으로 되돌아가지만 수정된 서비스는 새 버전의 서비스입니다.

버전 이니셜라이저를 사용하여 서비스 업그레이드 관리하기

Snowflake Native App Framework 는 서비스 또는 기타 관련 프로세스(예: 작업)를 시작하거나 업그레이드하는 데 사용되는 버전 이니셜라이저를 제공합니다. 버전 이니셜라이저는 매니페스트 파일에 지정된 콜백 저장 프로시저입니다.

버전 이니셜라이저는 다음과 같은 상황에서 호출됩니다.

  • 설치하는 동안 앱의 설치 스크립트가 오류 없이 완료되면 버전 이니셜라이저가 호출됩니다.

  • 업그레이드하는 동안 버전 이니셜라이저가 호출되는 두 가지 시나리오가 있습니다.

    • 새 버전의 설정 스크립트가 성공하면 새 버전의 앱의 버전 이니셜라이저가 호출됩니다.

    • 새 버전의 설치 스크립트나 버전 이니셜라이저가 실패하면 이전 버전 앱의 버전 이니셜라이저가 호출됩니다. 이렇게 하면 이전 버전의 버전 이니셜라이저가 ALTER SERVICE 를 사용하여 서비스를 이전 버전으로 되돌릴 수 있습니다.

앱에 버전 이니셜라이저 추가하기

버전 이니셜라이저로 사용되는 저장 프로시저를 지정하려면 manifest.yml 파일에 다음을 추가합니다.

lifecycle_callback:
  version_initializer: callback.version_init
Copy

이 예제에서 version_initializer 속성은 이름이 callback 스키마 내의 이름이 version_init 인 저장 프로시저로 설정되어 있습니다.

설치 스크립트 내에서 공급자는 다음 예에서 표시된 것처럼 버전이 지정된 스키마 내에서 이 프로시저를 정의할 수 있습니다.

CREATE OR ALTER VERSIONED SCHEMA callback;

CREATE OR REPLACE PROCEDURE callback.version_init()
  ...
  -- body of the version_init() procedure
  ...
Copy