Azure AI 문서 인텔리전스는 컴퓨터 학습 기술을 사용하여 자동화된 데이터 처리 소프트웨어를 빌드할 수 있는 Azure AI 서비스입니다. 문서 인텔리전스를 사용하면 문서에서 텍스트, 키/값 쌍, 선택 표시, 테이블 데이터 등을 식별하고 추출할 수 있습니다. 결과는 원본 파일의 관계를 포함하는 구조화된 데이터로 전달됩니다. 컨테이너는 제공된 데이터만 처리하고 액세스가 허용되는 리소스만 활용합니다. 컨테이너는 다른 지역의 데이터를 처리할 수 없습니다.
이 문서에서는 Document Intelligence 컨테이너를 다운로드, 설치 및 실행하는 방법을 알아볼 수 있습니다. 컨테이너를 사용하면 자체 환경에서 문서 인텔리전스 서비스를 실행할 수 있습니다. 컨테이너는 특정 보안 및 데이터 거버넌스 요구 사항에 적합합니다.
문서 인텔리전스 컨테이너를 사용하려면 다음 사항도 필요합니다.
호스트는 Docker 컨테이너를 실행하는 x64 기반 컴퓨터입니다. 다음과 같이 Azure에서 컴퓨터 온-프레미스 또는 Docker 호스팅 서비스일 수 있습니다.
다음 코드 샘플은 문서 인텔리전스 레이아웃 컨테이너를 실행하기 위한 자체 포함된 docker compose
예입니다. docker compose
에서 YAML 파일을 사용하여 애플리케이션의 서비스를 구성합니다. 그런 다음, docker-compose up
명령을 사용하여 구성에서 모든 서비스를 만들고 시작합니다. 레이아웃 컨테이너 인스턴스에 대한 {FORM_RECOGNIZER_ENDPOINT_URI} 및 {FORM_RECOGNIZER_KEY} 값을 입력합니다.
version: "3.9"
services:
azure-form-recognizer-read:
container_name: azure-form-recognizer-read
image: mcr.microsoft.com/azure-cognitive-services/form-recognizer/read-3.1
environment:
- EULA=accept
- billing={FORM_RECOGNIZER_ENDPOINT_URI}
- apiKey={FORM_RECOGNIZER_KEY}
ports:
- "5000:5000"
networks:
- ocrvnet
networks:
ocrvnet:
driver: bridge
이제 docker compose 명령어로 서비스를 시작할 수 있습니다.
docker-compose up
다음 코드 샘플은 문서 인텔리전스 일반 문서 컨테이너를 실행하기 위한 자체 포함된 docker compose
예입니다. docker compose
에서 YAML 파일을 사용하여 애플리케이션의 서비스를 구성합니다. 그런 다음 docker-compose up
명령을 사용하여 구성에서 모든 서비스를 만들고 시작합니다. 일반 문서 및 레이아웃 컨테이너 인스턴스에 대해 {FORM_RECOGNIZER_ENDPOINT_URI} 및 {FORM_RECOGNIZER_KEY} 값을 입력합니다.
version: "3.9"
services:
azure-cognitive-service-document:
container_name: azure-cognitive-service-document
image: mcr.microsoft.com/azure-cognitive-services/form-recognizer/document-3.0
environment:
- EULA=accept
- billing={FORM_RECOGNIZER_ENDPOINT_URI}
- apiKey={FORM_RECOGNIZER_KEY}
- AzureCognitiveServiceLayoutHost=http://azure-cognitive-service-layout:5000
ports:
- "5000:5050"
azure-cognitive-service-layout:
container_name: azure-cognitive-service-layout
image: mcr.microsoft.com/azure-cognitive-services/form-recognizer/layout-3.0
environment:
- EULA=accept
- billing={FORM_RECOGNIZER_ENDPOINT_URI}
- apiKey={FORM_RECOGNIZER_KEY}
이제 docker compose 명령어로 서비스를 시작할 수 있습니다.
docker-compose up
컴퓨터의 리소스를 고려할 때 일반 문서 컨테이너를 시작하는 데 시간이 걸릴 수 있습니다.
다음 코드 샘플은 문서 인텔리전스 레이아웃 컨테이너를 실행하기 위한 자체 포함된 docker compose
예입니다. docker compose
에서 YAML 파일을 사용하여 애플리케이션의 서비스를 구성합니다. 그런 다음 docker-compose up
명령을 사용하여 구성에서 모든 서비스를 만들고 시작합니다. 레이아웃 컨테이너 인스턴스에 대한 {FORM_RECOGNIZER_ENDPOINT_URI} 및 {FORM_RECOGNIZER_KEY} 값을 입력합니다.
version: "3.9"
services:
azure-form-recognizer-layout:
container_name: azure-form-recognizer-layout
image: mcr.microsoft.com/azure-cognitive-services/form-recognizer/layout-3.1
environment:
- EULA=accept
- billing={FORM_RECOGNIZER_ENDPOINT_URI}
- apiKey={FORM_RECOGNIZER_KEY}
ports:
- "5000:5000"
networks:
- ocrvnet
networks:
ocrvnet:
driver: bridge
이제 docker compose 명령어로 서비스를 시작할 수 있습니다.
docker-compose up
다음 코드 샘플은 문서 인텔리전스 청구서 컨테이너를 실행하기 위한 자체 포함된 docker compose
예입니다. docker compose
에서 YAML 파일을 사용하여 애플리케이션의 서비스를 구성합니다. 그런 다음 docker-compose up
명령을 사용하여 구성에서 모든 서비스를 만들고 시작합니다. 청구서 및 레이아웃 컨테이너 인스턴스에 대해 {FORM_RECOGNIZER_ENDPOINT_URI} 및 {FORM_RECOGNIZER_KEY} 값을 입력합니다.
3.0 GA 및 3.1 GA 청구서 모델 모두에 대해 3.1 GA 레이아웃 이미지를 업스트림으로 사용해야 합니다.
version: "3.9"
services:
azure-cognitive-service-invoice:
container_name: azure-cognitive-service-invoice
image: mcr.microsoft.com/azure-cognitive-services/form-recognizer/invoice-3.1
environment:
- EULA=accept
- billing={FORM_RECOGNIZER_ENDPOINT_URI}
- apiKey={FORM_RECOGNIZER_KEY}
- AzureCognitiveServiceLayoutHost=http://azure-cognitive-service-layout:5000
ports:
- "5000:5050"
azure-cognitive-service-layout:
container_name: azure-cognitive-service-layout
image: mcr.microsoft.com/azure-cognitive-services/form-recognizer/layout-3.1
environment:
- EULA=accept
- billing={FORM_RECOGNIZER_ENDPOINT_URI}
- apiKey={FORM_RECOGNIZER_KEY}
이제 docker compose 명령어로 서비스를 시작할 수 있습니다.
docker-compose up
다음 코드 샘플은 문서 인텔리전스 일반 문서 컨테이너를 실행하기 위한 자체 포함된 docker compose
예입니다. docker compose
에서 YAML 파일을 사용하여 애플리케이션의 서비스를 구성합니다. 그런 다음 docker-compose up
명령을 사용하여 구성에서 모든 서비스를 만들고 시작합니다. 영수증 및 읽기 컨테이너 인스턴스에 대해 {FORM_RECOGNIZER_ENDPOINT_URI} 및 {FORM_RECOGNIZER_KEY} 값을 입력합니다.
읽기 이미지 대신 3.1 GA 레이아웃 이미지를 업스트림으로 사용할 수 있습니다.
version: "3.9"
services:
azure-cognitive-service-receipt:
container_name: azure-cognitive-service-receipt
image: mcr.microsoft.com/azure-cognitive-services/form-recognizer/receipt-3.1
environment:
- EULA=accept
- billing={FORM_RECOGNIZER_ENDPOINT_URI}
- apiKey={FORM_RECOGNIZER_KEY}
- AzureCognitiveServiceReadHost=http://azure-cognitive-service-read:5000
ports:
- "5000:5050"
azure-cognitive-service-read:
container_name: azure-cognitive-service-read
image: mcr.microsoft.com/azure-cognitive-services/form-recognizer/read-3.1
environment:
- EULA=accept
- billing={FORM_RECOGNIZER_ENDPOINT_URI}
- apiKey={FORM_RECOGNIZER_KEY}
이제 docker compose 명령어로 서비스를 시작할 수 있습니다.
docker-compose up
다음 코드 샘플은 문서 인텔리전스 일반 문서 컨테이너를 실행하기 위한 자체 포함된 docker compose
예입니다. docker compose
에서 YAML 파일을 사용하여 애플리케이션의 서비스를 구성합니다. 그런 다음 docker-compose up
명령을 사용하여 구성에서 모든 서비스를 만들고 시작합니다. ID 및 읽기 컨테이너 인스턴스에 대해 {FORM_RECOGNIZER_ENDPOINT_URI} 및 {FORM_RECOGNIZER_KEY} 값을 입력합니다.
읽기 이미지 대신 3.1 GA 레이아웃 이미지를 업스트림으로 사용할 수 있습니다.
version: "3.9"
services:
azure-cognitive-service-id-document:
container_name: azure-cognitive-service-id-document
image: mcr.microsoft.com/azure-cognitive-services/form-recognizer/id-document-3.1
environment:
- EULA=accept
- billing={FORM_RECOGNIZER_ENDPOINT_URI}
- apiKey={FORM_RECOGNIZER_KEY}
- AzureCognitiveServiceReadHost=http://azure-cognitive-service-read:5000
ports:
- "5000:5050"
azure-cognitive-service-read:
container_name: azure-cognitive-service-read
image: mcr.microsoft.com/azure-cognitive-services/form-recognizer/read-3.1
environment:
- EULA=accept
- billing={FORM_RECOGNIZER_ENDPOINT_URI}
- apiKey={FORM_RECOGNIZER_KEY}
이제 docker compose 명령어로 서비스를 시작할 수 있습니다.
docker-compose up
version: "3.9"
services:
azure-cognitive-service-invoice:
container_name: azure-cognitive-service-businesscard
image: mcr.microsoft.com/azure-cognitive-services/form-recognizer/businesscard-3.0
environment:
- EULA=accept
- billing={FORM_RECOGNIZER_ENDPOINT_URI}
- apiKey={FORM_RECOGNIZER_KEY}
- AzureCognitiveServiceLayoutHost=http://azure-cognitive-service-layout:5000
ports:
- "5000:5050"
azure-cognitive-service-layout:
container_name: azure-cognitive-service-layout
image: mcr.microsoft.com/azure-cognitive-services/form-recognizer/layout-3.0
environment:
- EULA=accept
- billing={FORM_RECOGNIZER_ENDPOINT_URI}
- apiKey={FORM_RECOGNIZER_KEY}
필수 조건 외에도 사용자 지정 문서를 처리하려면 다음을 수행해야 합니다.
폴더를 만들고 다음 파일을 저장합니다.
- 이 폴더의 이름을 files로 지정합니다.
- 이 폴더의 파일 경로는 {FILE_MOUNT_PATH}로 참조됩니다.
- 파일 경로를 편리한 위치에 복사하고 이를 .env 파일에 추가해야 합니다. 예를 들어, 폴더가 files이고
docker-compose
파일과 동일한 폴더에 있는 경우 .env 파일 항목은 FILE_MOUNT_PATH="./files"
입니다.
로컬 컴퓨터에서 문서 인텔리전스 서비스로 작성된 로그를 저장할 폴더를 만듭니다.
- 이 폴더의 이름을 output으로 지정합니다.
- 이 폴더의 파일 경로를 {OUTPUT_MOUNT_PATH}로 참조합니다.
- 파일 경로를 편리한 위치에 복사하고 이를 .env 파일에 추가해야 합니다. 예를 들어, 폴더가 output이고
docker-compose
파일과 동일한 폴더에 있는 경우 .env 파일 항목은 OUTPUT_MOUNT_PATH="./output"
입니다.
컨테이너 간 공유되는 내부 처리를 저장하기 위한 폴더 만들기
- 이 폴더의 이름을 shared로 지정합니다.
- 이 폴더의 파일 경로를 {SHARED_MOUNT_PATH}로 참조합니다.
- 파일 경로를 편리한 위치에 복사하고 이를 .env 파일에 추가해야 합니다. 예를 들어, 폴더가 shared이고
docker-compose
파일과 동일한 폴더에 있는 경우 .env 파일 항목은 SHARED_MOUNT_PATH="./shared"
입니다.
- 이 폴더의 이름을 db로 지정합니다.
- 이 폴더의 파일 경로는 {DB_MOUNT_PATH}로 참조됩니다.
- 파일 경로를 편리한 위치에 복사하고 이를 .env 파일에 추가해야 합니다. 예를 들어, 폴더가 db이고
docker-compose
파일과 동일한 폴더에 있는 경우 .env 파일 항목은 DB_MOUNT_PATH="./db"
입니다.
환경 파일 만들기
이 파일의 이름을 .env로 지정합니다.
다음 환경 변수를 선언합니다.
SHARED_MOUNT_PATH="./shared"
OUTPUT_MOUNT_PATH="./output"
FILE_MOUNT_PATH="./files"
DB_MOUNT_PATH="./db"
FORM_RECOGNIZER_ENDPOINT_URI="YourFormRecognizerEndpoint"
FORM_RECOGNIZER_KEY="YourFormRecognizerKey"
NGINX_CONF_FILE="./nginx.conf"
nginx 파일 만들기
이 파일의 이름을 nginx.conf로 지정합니다.
다음 구성을 입력합니다.
worker_processes 1;
events { worker_connections 1024; }
http {
sendfile on;
client_max_body_size 90M;
upstream docker-custom {
server azure-cognitive-service-custom-template:5000;
}
upstream docker-layout {
server azure-cognitive-service-layout:5000;
}
server {
listen 5000;
location = / {
proxy_set_header Host $host:$server_port;
proxy_set_header Referer $scheme://$host:$server_port;
proxy_pass http://docker-custom/;
}
location /status {
proxy_pass http://docker-custom/status;
}
location /test {
return 200 $scheme://$host:$server_port;
}
location /ready {
proxy_pass http://docker-custom/ready;
}
location /swagger {
proxy_pass http://docker-custom/swagger;
}
location /formrecognizer/documentModels/prebuilt-layout {
proxy_set_header Host $host:$server_port;
proxy_set_header Referer $scheme://$host:$server_port;
add_header 'Access-Control-Allow-Origin' '*' always;
add_header 'Access-Control-Allow-Headers' 'cache-control,content-type,ocp-apim-subscription-key,x-ms-useragent' always;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
add_header 'Access-Control-Expose-Headers' '*' always;
if ($request_method = 'OPTIONS') {
return 200;
}
proxy_pass http://docker-layout/formrecognizer/documentModels/prebuilt-layout;
}
location /formrecognizer/documentModels {
proxy_set_header Host $host:$server_port;
proxy_set_header Referer $scheme://$host:$server_port;
add_header 'Access-Control-Allow-Origin' '*' always;
add_header 'Access-Control-Allow-Headers' 'cache-control,content-type,ocp-apim-subscription-key,x-ms-useragent' always;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, DELETE' always;
add_header 'Access-Control-Expose-Headers' '*' always;
if ($request_method = 'OPTIONS') {
return 200;
}
proxy_pass http://docker-custom/formrecognizer/documentModels;
}
location /formrecognizer/operations {
add_header 'Access-Control-Allow-Origin' '*' always;
add_header 'Access-Control-Allow-Headers' 'cache-control,content-type,ocp-apim-subscription-key,x-ms-useragent' always;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE, PATCH' always;
add_header 'Access-Control-Expose-Headers' '*' always;
if ($request_method = OPTIONS ) {
return 200;
}
proxy_pass http://docker-custom/formrecognizer/operations;
}
}
}
docker compose 파일 만들기
이 파일의 이름을 docker-compose.yml로 지정
다음 코드 샘플은 문서 인텔리전스 레이아웃, 스튜디오 및 사용자 지정 템플릿 컨테이너를 함께 실행하는 자체 포함된 docker compose
예입니다. docker compose
에서 YAML 파일을 사용하여 애플리케이션의 서비스를 구성합니다. 그런 다음 docker-compose up
명령을 사용하여 구성에서 모든 서비스를 만들고 시작합니다.
version: '3.3'
services:
nginx:
image: nginx:alpine
container_name: reverseproxy
volumes:
- ${NGINX_CONF_FILE}:/etc/nginx/nginx.conf
ports:
- "5000:5000"
layout:
container_name: azure-cognitive-service-layout
image: mcr.microsoft.com/azure-cognitive-services/form-recognizer/layout-3.0:latest
environment:
eula: accept
apikey: ${FORM_RECOGNIZER_KEY}
billing: ${FORM_RECOGNIZER_ENDPOINT_URI}
Logging:Console:LogLevel:Default: Information
SharedRootFolder: /shared
Mounts:Shared: /shared
Mounts:Output: /logs
volumes:
- type: bind
source: ${SHARED_MOUNT_PATH}
target: /shared
- type: bind
source: ${OUTPUT_MOUNT_PATH}
target: /logs
expose:
- "5000"
custom-template:
container_name: azure-cognitive-service-custom-template
image: mcr.microsoft.com/azure-cognitive-services/form-recognizer/custom-template-3.0:latest
restart: always
depends_on:
- layout
environment:
AzureCognitiveServiceLayoutHost: http://azure-cognitive-service-layout:5000
eula: accept
apikey: ${FORM_RECOGNIZER_KEY}
billing: ${FORM_RECOGNIZER_ENDPOINT_URI}
Logging:Console:LogLevel:Default: Information
SharedRootFolder: /shared
Mounts:Shared: /shared
Mounts:Output: /logs
volumes:
- type: bind
source: ${SHARED_MOUNT_PATH}
target: /shared
- type: bind
source: ${OUTPUT_MOUNT_PATH}
target: /logs
expose:
- "5000"
studio:
container_name: form-recognizer-studio
image: mcr.microsoft.com/azure-cognitive-services/form-recognizer/studio:3.0
environment:
ONPREM_LOCALFILE_BASEPATH: /onprem_folder
STORAGE_DATABASE_CONNECTION_STRING: /onprem_db/Application.db
volumes:
- type: bind
source: ${FILE_MOUNT_PATH} # path to your local folder
target: /onprem_folder
- type: bind
source: ${DB_MOUNT_PATH} # path to your local folder
target: /onprem_db
ports:
- "5001:5001"
user: "1000:1000" # echo $(id -u):$(id -g)
사용자 지정 템플릿 컨테이너 및 레이아웃 컨테이너는 Azure Storage 큐 또는 메모리 큐에서 사용할 수 있습니다. Storage:ObjectStore:AzureBlob:ConnectionString
및 queue:azure:connectionstring
환경 변수는 Azure Storage 큐를 사용하는 경우에만 설정하면 됩니다. 로컬로 실행하는 경우 이러한 변수를 삭제합니다.
서비스가 실행 중인지 확인합니다.
서비스가 가동되어 실행 중인지 확인합니다. Ubuntu 셸에서 이 명령을 실행합니다.
$cd <folder containing the docker-compose file>
$source .env
$docker-compose up
사용자 지정 템플릿 컨테이너에는 몇 가지 다른 구성이 필요하며 다른 선택적 구성을 지원합니다.
설정 |
필수 |
설명 |
EULA |
예 |
라이선스 승인 예: Eula=accept |
결제 |
예 |
FR 리소스의 청구 엔드포인트 URI |
ApiKey |
예 |
FR 리소스의 엔드포인트 키 |
큐:Azure:연결 문자열 |
아니요 |
Azure 큐 연결 문자열 |
Storage:ObjectStore:AzureBlob:ConnectionString |
아니요 |
Azure Blob 연결 문자열 |
HealthCheck:MemoryUpperboundInMB |
아니요 |
비정상 상태를 활성 상태로 보고하기 위한 메모리 임계값입니다. 기본값: 권장 메모리와 동일 |
StorageTimeToLiveInMinutes |
아니요 |
모든 중간 및 최종 파일을 제거하는 TTL 기간입니다. 기본값: 2일, TTL 은 5분에서 7일 사이로 설정할 수 있습니다. |
Task:MaxRunningTimeSpanInMinutes |
아니요 |
요청을 시간 제한으로 처리하는 최대 실행 시간입니다. 기본값: 60분 |
HTTP_PROXY_BYPASS_URLS |
아니요 |
프록시 무시를 위한 URL 지정 예: HTTP_PROXY_BYPASS_URLS = abc.com, xyz.com |
AzureCognitiveServiceReadHost(영수증, IdDocument 컨테이너만 해당) |
예 |
읽기 컨테이너 URI를 지정합니다. 예:AzureCognitiveServiceReadHost=http://onprem-frread:5000 |
AzureCognitiveServiceLayoutHost(문서, 청구서 컨테이너만 해당) |
예 |
레이아웃 컨테이너 URI 지정 예:AzureCognitiveServiceLayoutHost=http://onprem-frlayout:5000 |
문서 인텔리전스 스튜디오를 사용하여 모델 학습
동일한 형식의 양식을 5개 이상 수집합니다. 이 데이터를 사용하여 모델을 학습시키고 양식을 테스트합니다. 샘플 데이터 세트(sample_data.zip 다운로드 및 추출)를 사용할 수 있습니다.
컨테이너가 실행 중인지 확인한 후 브라우저를 열고 컨테이너가 배포된 엔드포인트로 이동합니다. 이 배포가 로컬 컴퓨터인 경우 엔드포인트는 [http://localhost:5001](http://localhost:5001)
입니다.
사용자 지정 추출 모델 타일을 선택합니다.
Create project
옵션을 선택합니다.
프로젝트 이름을 입력하고 선택적으로 설명을 입력합니다.
"리소스 구성" 단계에서 사용자 지정 템플릿 모델에 엔드포인트를 제공합니다. 로컬 컴퓨터에 컨테이너를 배포한 경우 이 URL [http://localhost:5000](http://localhost:5000)
을 사용합니다.
학습 데이터가 파일 폴더 내에 있는 하위 폴더를 제공합니다.
마지막으로 프로젝트를 만듭니다.
이제 프로젝트가 만들어져 레이블을 지정할 준비가 되었습니다. 학습 데이터를 업로드하고 레이블 지정을 시작합니다. 레이블 지정이 처음이라면 사용자 지정 모델 빌드 및 학습을 참조하세요.
API를 사용하여 학습
API를 직접 호출하여 모델을 학습시키려는 경우 사용자 지정 템플릿 모델 학습 API에는 레이블 지정 프로젝트의 콘텐츠인 base64로 인코딩된 Zip 파일이 필요합니다. PDF나 이미지 파일은 생략하고 JSON 파일만 제출해도 됩니다.
데이터 세트에 레이블이 지정되고 *.ocr.json, *.labels.json 및 fields.json 파일이 zip에 추가되면 PowerShell 명령을 사용하여 base64로 인코딩된 문자열을 생성합니다.
$bytes = [System.IO.File]::ReadAllBytes("<your_zip_file>.zip")
$b64String = [System.Convert]::ToBase64String($bytes, [System.Base64FormattingOptions]::None)
빌드 모델 API를 사용하여 요청을 게시합니다.
POST http://localhost:5000/formrecognizer/documentModels:build?api-version=2023-07-31
{
"modelId": "mymodel",
"description": "test model",
"buildMode": "template",
"base64Source": "<Your base64 encoded string>",
"tags": {
"additionalProp1": "string",
"additionalProp2": "string",
"additionalProp3": "string"
}
}
컨테이너가 실행되고 있는지 확인하는 방법에는 여러 가지가 있습니다.
컨테이너를 중지하려면 다음 명령을 사용합니다.
문서 인텔리전스 컨테이너는 Azure 계정의 문서 인텔리전스 리소스를 사용하여 Azure에 청구 정보를 보냅니다.
컨테이너에는 실행할 청구 인수 값이 필요합니다. 이러한 값을 통해 컨테이너는 청구 엔드포인트에 연결할 수 있습니다. 컨테이너는 약 10 ~ 15분마다 사용량을 보고합니다. 컨테이너가 허용되는 시간 내에서 Azure에 연결되지 않으면 컨테이너는 계속 실행되지만 청구 엔드포인트가 복원될 때까지 쿼리를 처리하지 않습니다. 10 ~ 15분 간격으로 동시에 10회 동안 연결이 시도됩니다. 10회 시도 안에 청구 엔드포인트에 연결할 수 없는 경우 컨테이너는 요청 처리를 중지합니다. 청구를 위해 Microsoft로 전송되는 정보의 예는 Azure AI 컨테이너 FAQ를 참조하세요.
이번 내용은 여기까지입니다! 이 문서에서는 문서 인텔리전스 컨테이너 다운로드, 설치 및 실행에 대한 개념과 워크플로를 알아보았습니다. 요약: