

# PL/Rust를 사용하여 Rust 언어로 PostgreSQL 함수 작성
<a name="PostgreSQL.Concepts.General.Using.PL_Rust"></a>

PL/Rust는 PostgreSQL에 대한 신뢰할 수 있는 Rust 언어 확장입니다. 저장 프로시저, 함수 및 SQL에서 호출할 수 있는 기타 절차 코드에 사용할 수 있습니다. PL/Rust 언어 확장은 다음 버전에서 사용할 수 있습니다.
+ RDS for PostgreSQL 17.1 이상의 17 버전
+ RDS for PostgreSQL 16.1 이상의 16 버전
+ RDS for PostgreSQL 15.2-R2 이상의 15 버전
+ RDS for PostgreSQL 14.9 이상의 14 버전
+ RDS for PostgreSQL 13.12 이상의 13 버전

자세한 내용은 GitHub의 [PL/Rust](https://github.com/tcdi/plrust#readme)를 참조하세요.

**Topics**
+ [PL/Rust 설정](#PL_Rust-setting-up)
+ [PL/Rust를 사용하여 함수 생성](#PL_Rust-create-function)
+ [PL/Rust가 있는 상자 사용](#PL_Rust-crates)
+ [PL/Rust 제한 사항](#PL_Rust-limitations)

## PL/Rust 설정
<a name="PL_Rust-setting-up"></a>

DB 인스턴스에 plrust 확장을 설치하려면 DB 인스턴스와 연결된 DB 파라미터 그룹의 `shared_preload_libraries` 파라미터에 plrust를 추가합니다. plrust 확장이 설치되어 있으면 함수를 만들 수 있습니다.

`shared_preload_libraries` 파라미터를 수정하려면 DB 인스턴스가 사용자 지정 파라미터 그룹과 연결되어 있어야 합니다. 사용자 지정 DB 파라미터 그룹 생성에 대한 자세한 내용은 [Amazon RDS의 파라미터 그룹](USER_WorkingWithParamGroups.md) 단원을 참조하세요.

AWS Management Console 또는 AWS CLI를 사용하여 plrust 확장을 설치할 수 있습니다.

다음 단계에서는 DB 인스턴스가 사용자 지정 DB 파라미터 그룹에 연결되어 있다고 가정합니다.

### 콘솔
<a name="PL_Rust-setting-up.CON"></a>

**`shared_preload_libraries` 파라미터에 plrust 확장 설치**

`rds_superuser` 그룹(역할)의 멤버인 계정을 사용하여 다음 단계를 완료합니다.

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)에서 Amazon RDS 콘솔을 엽니다.

1. 탐색 창에서 **Databases**(데이터베이스)를 선택합니다.

1. DB 인스턴스의 이름을 선택하여 세부 정보를 표시합니다.

1. DB 인스턴스의 **구성** 탭을 열고 DB 인스턴스 파라미터 그룹 링크를 찾습니다.

1. 링크를 선택하여 DB 인스턴스와 연결된 사용자 지정 파라미터를 엽니다.

1. **파라미터** 검색 필드에 `shared_pre`를 입력하여 **`shared_preload_libraries`** 파라미터를 찾습니다.

1. **파라미터 편집**을 선택하여 속성 값에 액세스합니다.

1. **값** 필드의 목록에 plrust를 추가합니다. 쉼표를 사용하여 값 목록에서 항목을 구분합니다.

1. `shared_preload_libraries` 파라미터 변경 사항을 적용하려면 DB 인스턴스를 재부팅합니다. 초기 재부팅을 완료하려면 추가 시간이 필요할 수 있습니다.

1. 인스턴스를 사용할 수 있게 되면 plrust가 초기화되었는지 확인합니다. `psql`을 사용하여 DB 인스턴스에 연결하고 다음 명령을 실행합니다.

   ```
   SHOW shared_preload_libraries;
   ```

   출력은 다음과 비슷한 형태가 됩니다.

   ```
   shared_preload_libraries 
   --------------------------
   rdsutils,plrust
   (1 row)
   ```

### AWS CLI
<a name="PL_Rust-setting-up-CLI"></a>

**shared\$1preload\$1libraries 파라미터에 plrust 확장 설치**

`rds_superuser` 그룹(역할)의 멤버인 계정을 사용하여 다음 단계를 완료합니다.

1. [modify-db-parameter-group](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-parameter-group.html) AWS CLI 명령을 사용하여 plrust를 `shared_preload_libraries` 파라미터에 추가합니다.

   ```
   aws rds modify-db-parameter-group \
      --db-parameter-group-name custom-param-group-name \
      --parameters "ParameterName=shared_preload_libraries,ParameterValue=plrust,ApplyMethod=pending-reboot" \
      --region aws-region
   ```

1. [reboot-db-instance](https://docs.aws.amazon.com/cli/latest/reference/rds/reboot-db-instance) AWS CLI 명령을 사용하여 DB 인스턴스를 재부팅하고 plrust 라이브러리를 초기화합니다. 초기 재부팅을 완료하려면 추가 시간이 필요할 수 있습니다.

   ```
   aws rds reboot-db-instance \
       --db-instance-identifier your-instance \
       --region aws-region
   ```

1. 인스턴스를 사용할 수 있게 되면 plrust가 초기화되었는지 확인합니다. `psql`을 사용하여 DB 인스턴스에 연결하고 다음 명령을 실행합니다.

   ```
   SHOW shared_preload_libraries;
   ```

   출력은 다음과 비슷한 형태가 됩니다.

   ```
   shared_preload_libraries
   --------------------------
   rdsutils,plrust
   (1 row)
   ```

## PL/Rust를 사용하여 함수 생성
<a name="PL_Rust-create-function"></a>

PL/Rust는 함수를 동적 라이브러리로 컴파일하고 로드한 다음 실행합니다.

다음 Rust 함수는 배열에서 배수를 필터링합니다.

```
postgres=> CREATE LANGUAGE plrust;
CREATE EXTENSION
```

```
CREATE OR REPLACE FUNCTION filter_multiples(a BIGINT[], multiple BIGINT) RETURNS BIGINT[]
    IMMUTABLE STRICT
    LANGUAGE PLRUST AS
$$
    Ok(Some(a.into_iter().filter(|x| x.unwrap() % multiple != 0).collect()))
$$;
        
WITH gen_values AS (
SELECT ARRAY(SELECT * FROM generate_series(1,100)) as arr)
SELECT filter_multiples(arr, 3)
from gen_values;
```

## PL/Rust가 있는 상자 사용
<a name="PL_Rust-crates"></a>

RDS for PostgreSQL 16.3-R2 이상 버전, 15.7-R2 이상 15 버전, 14.12-R2 이상 14 버전, 13.15-R2 이상 13 버전에서, PL/Rust는 추가 상자를 지원합니다.
+ `url` 
+ `regex` 
+ `serde` 
+ `serde_json` 

RDS for PostgreSQL 15.5-R2 이상 버전, 14.10-R2 이상 14 버전, 13.13-R2 이상 13 버전에서 RDS for PostgreSQL은 PL/Rust에서 두 개의 추가 크레이트를 지원합니다.
+ `croaring-rs` 
+ `num-bigint` 

Amazon RDS for PostgreSQL 버전 15.4, 14.9, 13.12부터 PL/Rust는 다음 상자를 지원합니다.
+ `aes` 
+ `ctr` 
+ `rand` 

이 상자에서는 기본 기능만 지원됩니다. 새 RDS for PostgreSQL 버전에는 업데이트된 버전의 상자가 포함될 수 있으며 기존 버전의 상자는 더 이상 지원되지 않을 수 있습니다.

PL/Rust 함수가 새 메이저 버전과 호환되는지 테스트하려면 메이저 버전 업그레이드 수행에 대한 모범 사례를 따르세요. 자세한 내용은 블로그 [Amazon RDS를 PostgreSQL의 메이저 및 마이너 버전으로 업그레이드하기 위한 모범 사례](https://aws.amazon.com/blogs/database/best-practices-for-upgrading-amazon-rds-to-major-and-minor-versions-of-postgresql/) 및 Amazon RDS 사용 설명서에 나온 [Amazon RDS용 PostgreSQL DB 엔진 업그레이드](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_UpgradeDBInstance.PostgreSQL.html)를 참조하세요.

PL/Rust 함수를 생성할 때 종속성을 사용하는 예제는 [종속성 사용](https://tcdi.github.io/plrust/use-plrust.html#use-dependencies)에서 확인하세요.

## PL/Rust 제한 사항
<a name="PL_Rust-limitations"></a>

기본적으로 데이터베이스 사용자는 PL/Rust를 사용할 수 없습니다. PL/Rust에 대한 액세스를 제공하려면 rds\$1superuser 권한이 있는 사용자로 연결하고 다음 명령을 실행합니다.

```
postgres=> GRANT USAGE ON LANGUAGE PLRUST TO user;
```