Snowflake 클래스
Snowflake 클래스 (Snowflake Classes)
SNOWFLAKE 데이터베이스에는 Snowflake가 제공하는 클래스(Class)도 포함돼 있어요. 클래스는 확장 가능한 객체 유형으로, 객체 데이터와 코드를 캡슐화하는 역할을 하죠.
본문
개념 (Concepts)
클래스(Class) 는 객체 지향 프로그래밍의 클래스와 비슷하게, 인스턴스를 만들기 위한 청사진 역할을 해요. 인스턴스(Instance) 는 클래스에서 생성된 객체입니다. 클래스와 인스턴스는 Snowflake의 스키마 수준 객체예요. 클래스는 확장 가능한 Snowflake 객체 유형, 인스턴스는 Snowflake 객체라고 생각하면 됩니다.
클래스는 저장 프로시저와 함수를 통해 공개 API를 제공하며, 이들을 통틀어 클래스 메서드(class methods) 라고 불러요. 또한 클래스는 클래스 메서드에 대해 세밀한 권한을 가능하게 하는 클래스 역할(class roles)도 제공합니다. 공개 API 외에도 클래스는 객체 지향 프로그래밍의 private 속성·메서드처럼 비공개 상태와 비공개 프로시저·함수를 포함해요.
클래스의 구현은 새 클래스 버전을 통해 시간이 지나며 진화할 수 있고, 인스턴스는 Snowflake가 자동으로 최신 클래스 버전으로 업그레이드해요.
예를 들어 Snowflake는 SNOWFLAKE.ML 스키마에 ANOMALY_DETECTION 클래스를 제공해요. 특정 객체 유형의 객체를 만들듯이 CREATE 명령으로 클래스의 인스턴스를 만들 수 있습니다.
검색 경로에 SNOWFLAKE.ML을 포함하도록 갱신:
ALTER SESSION SET SEARCH_PATH = '$current, $public, snowflake.ml';
ANOMALY_DETECTION 클래스의 인스턴스 생성:
CREATE ANOMALY_DETECTION mydatabase.myschema.my_anomaly_detector(...);
인스턴스를 만든 뒤에는 인스턴스 메서드를 호출할 수 있어요.
mydatabase.myschema.my_anomaly_detector!DETECT_ANOMALIES(...);
참고: 현재 클래스는 Snowflake가 제공하는 것만 있으며, 사용자가 직접 생성할 수는 없어요.
사용 가능한 클래스 나열하기
SHOW 명령으로 사용 가능한 클래스를 찾고 각 클래스에 대해 더 배울 수 있어요. 이 명령들로 SNOWFLAKE 데이터베이스의 모든 클래스를 찾고, 클래스 메서드를 나열하고, 클래스 역할을 나열할 수 있습니다.
SHOW CLASSES 명령으로 모든 클래스를 나열해요:
SHOW CLASSES IN DATABASE SNOWFLAKE;
이 문의 결과에는 각 클래스의 데이터베이스와 스키마 이름이 포함돼요.
검색 경로 갱신
클래스는 SNOWFLAKE 데이터베이스의 스키마에 있는 객체이므로, 이 문서의 SQL 명령을 실행하려면 정규화된 클래스 이름(예: SNOWFLAKE.ML.ANOMALY_DETECTION)을 사용해야 해요. 또는 검색 경로(search path)에 클래스의 데이터베이스와 스키마를 포함시켜 비정규화된 이름(예: ANOMALY_DETECTION)으로 참조할 수도 있습니다.
참고: 특정 클래스에 대해 검색 경로를 갱신하면, 같은 이름이지만 다른 클래스에 속한 함수는 더 이상 접근할 수 없게 돼요. 예를 들어
SNOWFLAKE.CORTEX를 검색 경로에 추가하면,SNOWFLAKE.CORTEX.TRANSLATE함수가 존재하므로 문자열 함수TRANSLATE에 접근할 수 없게 됩니다.
검색 경로는 ALTER SESSION, ALTER USER, ALTER ACCOUNT으로 수정할 수 있어요.
ALTER SESSION— 현재 세션에 대해서만 검색 경로를 수정. 세션 수준 변경은 계정 수준·사용자 수준 설정을 덮어써요.ALTER USER— 현재 또는 지정된 사용자에 대해 지속적으로 검색 경로를 수정. 사용자 수준 변경은 계정 수준·세션 수준 설정을 덮어써요.ALTER ACCOUNT— 계정의 모든 사용자에 대해 지속적으로 검색 경로를 수정. 계정 수준 변경은 관리자가 해야 해요.
현재 검색 경로를 확인하려면 다음을 실행해요:
SHOW PARAMETERS LIKE 'search_path';
예를 들어 현재 세션의 검색 경로에 SNOWFLAKE.ML을 추가하려면:
ALTER SESSION SET SEARCH_PATH = '$current, $public, SNOWFLAKE.ML';
사용자 수준에서 자신의 검색 경로에 추가하려면:
ALTER USER SET SEARCH_PATH = '$current, $public, SNOWFLAKE.ML';
ACCOUNTADMIN 역할의 사용자는 계정에 대해 검색 경로를 갱신할 수 있어요:
ALTER ACCOUNT SET SEARCH_PATH = '$current, $public, SNOWFLAKE.ML';
Snowflake가 이름을 해석하는 방법에 대한 자세한 내용은 객체 이름 해석 문서를 참고하세요.
클래스 메서드 (Class methods)
클래스는 저장 프로시저와 함수를 통해 공개 API를 제공하며, 통틀어 클래스 메서드라고 불러요. 클래스의 모든 메서드를 (각 메서드에 필요한 인수 포함) 나열하려면 SHOW FUNCTIONS IN CLASS와 SHOW PROCEDURES IN CLASS 명령을 실행하면 됩니다. 클래스는 같은 이름이지만 서로 다른 시그니처(인수 개수나 인수 데이터 타입이 다른 경우)의 메서드를 여러 개 포함할 수 있어요.
예를 들어 SNOWFLAKE.ML.ANOMALY_DETECTION 클래스의 모든 함수를 나열하려면:
SHOW FUNCTIONS IN CLASS ANOMALY_DETECTION;
클래스의 모든 저장 프로시저를 나열하려면:
SHOW PROCEDURES IN CLASS ANOMALY_DETECTION;
클래스 역할 (Class roles)
클래스에는 일부 또는 모든 클래스 메서드에 대해 USAGE 권한이 부여된 역할이 하나 이상 있을 수 있어요. SHOW ROLES IN CLASS 명령으로 클래스에서 사용 가능한 역할을 나열할 수 있습니다.
SHOW ROLES IN CLASS ANOMALY_DETECTION;
인스턴스 역할 (Instance roles)
역할은 클래스에 정의되고 인스턴스에서는 인스턴스 역할(instance role)로 인스턴스화돼요. 인스턴스 역할은 계정의 역할에 부여해 인스턴스 메서드에 대한 접근을 활성화할 수 있습니다.
인스턴스 역할을 계정의 역할 my_role에 부여하려면:
GRANT SNOWFLAKE.ML.ANOMALY_DETECTION ROLE my_db.my_schema.my_anomaly_detector!USER
TO ROLE my_role;
이 문장은 역할 my_role이 ANOMALY_DETECTOR 인스턴스 my_anomaly_detector의 메서드를 실행할 수 있게 해요. 참고로 역할 my_role은 데이터베이스 my_db와 스키마 my_schema에 대한 USAGE 권한도 가져야 하고, 인스턴스 메서드에 전달되는 객체에 대한 적절한 권한도 가져야 합니다.
클래스 인스턴스 생성 권한 부여
클래스의 인스턴스를 만들려면 역할에 CREATE <class_name> 권한이 부여되어야 해요. 예를 들어 ml_admin 역할이 mydb.myschema 스키마에서 SNOWFLAKE.ML.ANOMALY_DETECTION 인스턴스를 만들 수 있게 하려면:
GRANT CREATE ANOMALY_DETECTION ON SCHEMA mydb.myschema TO ROLE ml_admin;
인스턴스 생성
CREATE <object> 명령과 클래스 생성자(constructor) 메서드로 클래스의 인스턴스를 만들 수 있어요.
참고: 스키마 안의 인스턴스 이름은 어떤 클래스에서 만들어졌는지와 무관하게 고유해야 해요. 예를 들어
SNOWFLAKE.CORE의BUDGET클래스 인스턴스 이름이foo라면, 같은 스키마에서는SNOWFLAKE.ML의ANOMALY_DETECTION클래스로 이름foo의 인스턴스를 만들 수 없습니다.
예를 들어 이상 탐지기 my_anomaly_detector 인스턴스를 만들려면:
CREATE ANOMALY_DETECTION my_anomaly_detector(
INPUT_DATA => SYSTEM$REFERENCE('VIEW', 'my_view'),
TIMESTAMP_COLUMN => 'my_timestamp_column'
TARGET_COLNAME => 'my_target_column',
LABEL_COLNAME => ''
);
인스턴스 사용
클래스 인스턴스를 만든 뒤에는 클래스가 제공하는 인스턴스 메서드를 호출할 수 있어요. 메서드를 호출하려면 느낌표(!) 문자가 필요하며, 이 문자로 인스턴스를 역참조(dereference)합니다.
예를 들어 이상 탐지기 my_anomaly_detector의 DETECT_ANOMALIES 메서드를 호출하려면:
CALL my_anomaly_detector!DETECT_ANOMALIES(
INPUT_DATA => SYSTEM$REFERENCE('VIEW', 'my_view'),
TIMESTAMP_COLNAME =>'my_timestamp_column',
TARGET_COLNAME => 'my_target_column'
);
테이블 형식 데이터를 반환하는 클래스 인스턴스 메서드에서 컬럼 선택
일부 메서드(예: ANOMALY_DETECTION과 FORECAST 클래스의 메서드)는 테이블 형식 데이터를 반환해요. 이 테이블 형식 데이터를 선택·조작하려면 SELECT 문의 FROM 절에서 이 메서드를 호출하면 됩니다. 호출 시 CALL 명령은 생략하고, 호출을 괄호로 묶고 앞에 TABLE 키워드를 붙여요.
SELECT ... FROM TABLE( <method_name>( <arg> [ , ... <arg> ] ) );
예를 들어 이상 탐지기 my_anomaly_detector의 DETECT_ANOMALIES 메서드가 반환한 테이블 형식 데이터에서 ts, forecast, is_anomaly 컬럼을 선택하려면:
SELECT ts, forecast, is_anomaly FROM TABLE(
my_anomaly_detector!DETECT_ANOMALIES(
INPUT_DATA => TABLE('my_view'),
TIMESTAMP_COLNAME =>'my_timestamp_column',
TARGET_COLNAME => 'my_target_column'
)
);
쿼리에 대한 참조를 전달하는 경우, 그 쿼리는 참조 외부에 정의된 공통 테이블 표현식(CTE)을 참조할 수 없어요. 이런 제한을 우회하려면 WITH 절을 쿼리 참조 안으로 옮기면 됩니다.
제한 사항
복제(Replication)는 CUSTOM_CLASSIFIER 클래스의 인스턴스에 대해서만 지원돼요.