1. 소개
분실된 화물 조사의 마지막 단계에 오신 것을 환영합니다. 런던에서 시드니까지 도난당한 Android 피규어 컨테이너를 추적한 후 더 이상 추적할 수 없게 되었습니다. 컨테이너의 스마트 보안 보관함이 트랜스폰더를 사용 중지하여 자동 긴급 폐쇄를 트리거했습니다.
영원히 잠기기 전에 고가 화물을 회수하려면 컨테이너의 최종 위치를 찾아 수동 재정의 비밀번호를 검색하여 보관함을 물리적으로 잠금 해제해야 합니다.

누락된 컨테이너를 찾아 화물을 확보하기 위해 BigQuery 속성 그래프를 빌드하여 배송 여정을 추적합니다. 그런 다음 대화형 분석을 사용하여 자연어로 이 네트워크를 쿼리하고, Knowledge Catalog를 사용하여 데이터의 메타데이터에 대한 시맨틱 검색을 실행하여 재정의 코드를 찾습니다.
💡 실습 1 또는 실습 2를 놓치셨나요? 걱정하지 마세요. 이 실습은 완전히 독립적입니다. 환경 설정 단계에서는 필요한 모든 항목을 프로비저닝하므로 바로 시작하여 독립적으로 완료할 수 있습니다.
실습할 내용
- 저장소를 클론하고 Google Cloud Shell에서 설정 스크립트를 실행합니다.
- 회사, 선박, 매니페스트 데이터를 연결하는 BigQuery의 속성 그래프를 빌드합니다.
- 대화형 분석 사용을 사용하여 자연어로 그래프를 쿼리하고 화물의 여정을 추적하여 담당 운영자를 식별합니다.
- Knowledge Catalog를 사용하여 최종 재정의 코드를 보유한 테이블을 찾습니다.
- BigQuery 열 수준 액세스 제어 사용을 사용하여 마스크를 해제하고 최종 코드를 표시합니다.
필요한 항목
- 웹브라우저(예: Chrome)
- 결제가 사용 설정된 Google Cloud 프로젝트
- Google Cloud Shell 액세스
이 Codelab은 모든 수준의 데이터 실무자를 대상으로 합니다.
이 Codelab에서 만든 리소스의 비용은 5달러 미만이어야 합니다.
예상 소요 시간: 이 Codelab을 완료하는 데 약 45분이 소요됩니다.
2. 시작하기 전에
Google Cloud 프로젝트 만들기
- Google Cloud 콘솔의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.
- Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.
Cloud Shell 시작
Google Cloud Shell을 사용하여 코드를 다운로드하고, 설정 스크립트를 실행하고, 애플리케이션을 배포합니다.
- 새 브라우저 탭에서 Cloud Shell을 엽니다.

- 연결되면 프로젝트 ID를 설정하고 환경을 확인합니다.
gcloud config set project <<YOUR_PROJECT_ID>>
export PROJECT_ID=$(gcloud config get-value project)
export REGION=us-central1
다음과 비슷한 메시지가 표시됩니다.
Your active configuration is: [cloudshell-####] Updated property [core/project]
필수 API 사용 설정
Cloud Shell에서 다음 명령어를 실행하여 필요한 API를 사용 설정합니다.
gcloud services enable \
bigquery.googleapis.com \
aiplatform.googleapis.com \
datacatalog.googleapis.com \
geminidataanalytics.googleapis.com \
cloudaicompanion.googleapis.com
성공적으로 실행되면 다음과 유사한 메시지가 표시됩니다.
Operation "operations/..." finished successfully.
3. 환경 설정
이 시리즈의 이전 실습에서는 조사를 위한 기반을 마련했습니다.
1. 저장소 복제
코드랩 저장소를 Cloud Shell 환경에 클론합니다.
cd ~/
git clone --filter=blob:none --no-checkout https://github.com/GoogleCloudPlatform/devrel-demos.git
cd ~/devrel-demos
git sparse-checkout init --cone
git sparse-checkout set codelabs/bigquery-graph-analytics
git checkout main
cd codelabs/bigquery-graph-analytics/
2. 기본 테이블 및 정책 태그 설정
설정 스크립트를 실행하여 BigQuery 데이터 세트를 채우고 열 수준 보안 태그를 적용하여 민감한 정보를 제한합니다.
bash setup_lab.sh
터미널의 출력에 초기화가 성공적으로 완료되었다고 표시되는지 확인합니다.
🚀 Provisioning foundational tables and deploying Policy Tag security bindings... 🎯 Active Project: your-project-id ... 🎉 Success! Foundational tables initialized and Column-Level Policy Tags fully mapped out of the box!
환경이 성공적으로 설정되고 물류 데이터가 BigQuery에 채워졌으므로 이제 속성 그래프를 빌드하여 테이블을 연결하고 화물의 여정을 추적할 수 있습니다.
4. BigQuery 그래프를 사용하여 데이터 연결
공급망 데이터를 분석하기 위해 회사, 선박, 매니페스트가 서로 어떻게 관련되는지 정의합니다. 속성 그래프를 빌드하면 이러한 연결을 쉽게 쿼리할 수 있습니다.
1. 속성 그래프가 관계를 모델링하는 방법

BigQuery 속성 그래프는 다음을 사용하여 네트워크를 모델링합니다.
- 노드: 네트워크의 항목입니다. 이 실습에서 노드는 회사 (연락처 세부정보를 직접 저장), 매니페스트, 선박을 나타냅니다.
- 에지: 노드를 연결하는 관계입니다. 예를 들면 다음과 같습니다.
- 에지는 매니페스트를 선박에 연결합니다 (
manifests테이블의 관계를 통해). - 에지는 선박을 회사에 연결합니다 (
vessels테이블의 관계를 통해).
- 에지는 매니페스트를 선박에 연결합니다 (
- 속성: 노드 또는 에지에 저장된 메타데이터입니다. 예를 들어 회사 노드에는
company_name,phone_number와 같은 열이 있고 매니페스트 노드에는seal_integrity_status및 좌표 (last_ping_lat,last_ping_long)가 있습니다. - 라벨: 쿼리 도구가 노드 및 관계 유형을 인식할 수 있도록 노드 (예:
Company,Vessel,Manifest)와 에지 (예:CARRIED_BY,OPERATED_BY)에 할당된 태그 이름입니다.
2. BigQuery에 속성 그래프 배포
setup_graph.sql 파일에는 속성 그래프를 정의하고 생성하는 SQL DDL이 포함되어 있지만 현재는 불완전합니다. 이 스키마 파일을 컴파일하고 배포하기 전에 이 스키마 파일에서 에지 라벨 (관계)을 정의해야 합니다.
- Cloud Shell 편집기 열기

- Cloud Shell 편집기에서
setup_graph.sql파일을 엽니다.

- 에지 라벨의 자리표시자를 찾습니다.
- 22행:
`EDGE_TABLE_PLACEHOLDER`를 매니페스트가 선박과 어떤 관련이 있는지 나타내는 의미 있는 태그로 바꿉니다 (예:CARRIED_BY). - 27번째 줄:
`EDGE_TABLE_PLACEHOLDER`를 선박이 회사와 어떤 관계가 있는지 나타내는 태그로 바꿉니다 (예:OPERATED_BY).
- 22행:
- 파일을 저장합니다.
이제 Cloud Shell 터미널로 돌아가서 완성된 스크립트를 사용하여 업데이트된 속성 그래프를 배포합니다.
bq query --use_legacy_sql=false < setup_graph.sql
작업이 완료되었음을 나타내는 출력이 표시됩니다.
Waiting on bqjob_r... ... (0s) Current status: DONE
BigQuery 콘솔에서 속성 그래프 세부정보를 확인할 수 있습니다.
lost_cargo_dataset을 찾아 그래프를 선택합니다.

속성 그래프가 성공적으로 컴파일되었으므로 BigQuery Studio에서 연결을 쿼리하고 시각화해 보겠습니다.
5. 그래프 쿼리
BigQuery Studio 내에서 기본 Graph Query Language (GQL)을 사용하여 그래프를 시각적으로 쿼리하고 탐색할 수 있습니다.
1. 컨테이너 -> 선박 -> 회사 체인 쿼리
화물을 운반하는 선박을 운영하는 사람을 찾아 GQL 쿼리를 살펴보겠습니다. 운송업체를 찾으려면 Google 물류 네트워크에서 세 개의 개별 엔티티 노드를 탐색해야 합니다.

- 컨테이너
Manifest노드에서 시작합니다. CARRIED_BY관계 가장자리를 따라 운반하는Vessel를 찾습니다.- 해당 선박에서 담당
Company까지OPERATED_BY관계 에지를 따라 이동하여 ID를 가져옵니다.
먼저 전체 네트워크 (필터 없음)를 시각화하는 쿼리를 실행하여 전체 그래프를 확인합니다.
- BigQuery Studio SQL 편집기에서 새 탭을 열고 다음 GQL 쿼리를 붙여넣은 다음 실행을 클릭합니다.
SELECT * FROM GRAPH_TABLE( `lost_cargo_dataset.logistics_network` MATCH p = (m:Manifest)-[:CARRIED_BY]->(v:Vessel)-[:OPERATED_BY]->(comp:Company) RETURN TO_JSON(p) AS path ); - 쿼리가 완료되면 하단의 쿼리 결과 창에서 그래프 탭 (결과 표 탭 옆에 있음)을 클릭합니다.

- BigQuery에서 결과를 대화형 시각 그래프 표현으로 렌더링합니다. 확대하여 연결된 컨테이너, 선박, 운영자의 전체 네트워크를 확인하세요.
GQL 쿼리 심층 분석
방금 실행한 GQL 쿼리를 분석해 보겠습니다.
GRAPH_TABLE: BigQuery가logistics_network그래프에 대해 속성 그래프 쿼리를 실행하도록 지시합니다.MATCH: 멀티 홉 순회 패턴을 선언합니다.Manifest(m)에서 시작하여Vessel(v)을 가리키는 가장자리 관계:CARRIED_BY를 일치시킨 다음Company(comp)을 가리키는 가장자리 관계:OPERATED_BY를 일치시킵니다.- GQL은 복잡한 조인 로직을 직관적이고 사람이 읽을 수 있는 ASCII 아트 관계 화살표
()->[]->()로 대체하여 멀티 홉 쿼리를 매우 간단하게 작성하고 최적화할 수 있습니다. RETURN: 일치하는 요소에서 속성 또는 JSON 경로를 반환합니다.
2. GQL 쿼리 결과 필터링
이제 타겟 손상된 컨테이너 MV-CAPYBARA-003의 경로만 보도록 쿼리를 필터링합니다.
- 다음 쿼리를 SQL 편집기에 붙여넣고 실행을 클릭합니다.
SELECT * FROM GRAPH_TABLE( `lost_cargo_dataset.logistics_network` MATCH p = (m:Manifest {shipment_id: 'MV-CAPYBARA-003'})-[:CARRIED_BY]->(v:Vessel)-[:OPERATED_BY]->(comp:Company) RETURN TO_JSON(p) AS path ); - 결과에서 그래프 탭을 클릭합니다.

- 이제
MV-CAPYBARA-003의 활성 순회 경로만 표시됩니다. 노드와 연결을 보려면 확대합니다.Company노드를 더블클릭하여 속성 패널을 엽니다. 속성 아래에 연산자company_id:103(Davy Jones Shipping)이 표시됩니다. 이 회사 ID를 기록해 두세요. 나중에 보안 레지스트리에서 승인 비밀번호를 검색하는 데 필요합니다.Vessel노드를 더블클릭하여Flying Dutchman인지 확인합니다.
6. 대화형 분석을 사용하여 그래프와 채팅하기
이제 그래프를 수동으로 쿼리하여 회사 ID를 찾았으므로 대화형 분석을 사용하여 그래프와 직접 채팅하고 컨테이너가 향하는 위치를 정확히 파악해 보겠습니다.
1. Conversational Analytics 세션 시작
- Google Cloud 콘솔에서 BigQuery 콘솔로 이동하고 리소스 패널을 펼쳐 데이터 세트 (
lost_cargo_dataset)를 찾습니다. - 속성 그래프 리소스
logistics_network를 클릭합니다. - 상단의 세부정보 패널 툴바에서 채팅 버튼을 클릭합니다. 그러면 그래프의 컨텍스트가 미리 로드된 대화형 분석 세션이 열립니다.

2. 납치된 컨테이너의 가장 가까운 도킹 포트 파악
해양 순찰기가 POINT(-122.48 37.55) 좌표에서 화물선 설명과 일치하는 선박이 트랜스폰더가 비활성화된 상태로 오프그리드 항해하는 것을 발견했습니다. 화물을 차단하려면 섀도우 신디케이트 Davy Jones Shipping가 운영하는 가장 가까운 도킹 포트를 찾아야 합니다.
모든 글로벌 포트를 수동으로 검색하는 대신 그래프 네트워크를 쿼리하여 신디케이트의 활성 함대에 연결된 포트를 가져오고 목격 지점과 물리적으로 가장 가까운 포트를 측정합니다.
- 대화형 분석 채팅 상자에 다음 프롬프트를 입력합니다.
Find all ports associated with Davy Jones Shipping vessels. Which port is closest to coordinate POINT(-122.48 37.55), show the distance in km, and display it on a map.

- 대답을 자세히 살펴봅니다. 에이전트가 그래프를 순회하고 가장 가까운 도킹 시설과 거리를 반환합니다.
- 도킹 포트:
Mountain View Terminal - 거리:
39.42 kilometers
- 도킹 포트:
- 대화형 분석은 기본 지리 공간 (GIS) 통합을 갖춘 Gemini로 구동되므로 지리 좌표점을 해석하고 세계 지식을 활용하여 위치를 확인할 수 있습니다.'선박이 캘리포니아주 마운틴뷰 터미널에서 약 39.42km 떨어져 있으므로 정박을 위해 그곳으로 향하고 있는 것으로 보입니다.'
화물이 마운틴뷰로 바로 향하고 있음을 확인할 수 있습니다.
내부: Graph Query Language (GQL) 및 지리 공간 GIS
백그라운드에서 대화형 분석 에이전트는 그래프 경로 일치와 지리 공간 거리 계산을 결합하는 쿼리를 동적으로 컴파일하고 실행했습니다. 이는 기본 GQL COLUMNS 절을 사용하여 그래프 순회 일치 내에서 측지 거리를 기본적으로 계산하여 달성됩니다.
SELECT port_id, port_name, country, latitude, longitude, distance_km
FROM GRAPH_TABLE(
`lost_cargo_dataset.logistics_network`
MATCH (c:Company)<-[]-(v:Vessel)-[]->(p:Port)
WHERE LOWER(c.company_name) = 'davy jones shipping'
COLUMNS (
p.port_id,
p.port_name,
p.country,
p.latitude,
p.longitude,
ROUND(ST_DISTANCE(ST_GEOGPOINT(p.longitude, p.latitude), ST_GEOGPOINT(-122.48, 37.55)) / 1000, 2) AS distance_km
)
)
ORDER BY distance_km ASC;
기본 지리정보 (GIS) 함수 (ST_DISTANCE, ST_GEOGPOINT)를 GQL 속성 그래프 일치와 결합하면 BigQuery에서 단일 쿼리로 조직의 운영 범위를 동적으로 확인하고 실제 물리적 근접성을 계산할 수 있습니다.
7. Knowledge Catalog로 누락된 데이터 찾기
속성 그래프에는 관계가 표시되지만 실제 재정의 코드가 저장된 테이블은 포함되어 있지 않습니다.
수백 개의 데이터 세트와 테이블이 있는 실제 엔터프라이즈 환경에서는 이 정보를 찾기가 어려울 수 있습니다. Knowledge Catalog를 사용하여 시맨틱 검색을 실행하고 올바른 테이블을 찾습니다.
1. Knowledge Catalog의 시맨틱 검색
- Google Cloud 콘솔에서 Knowledge Catalog ➔ 검색으로 이동합니다.
- 시스템 아래의 검색 필터링 항목에서 BigQuery를 선택하여 결과를 좁힙니다.
- 검색창에 다음 쿼리를 입력합니다.
container override codes

- 검색 결과에 표시되는
maritime_security_registry테이블 리소스를 클릭합니다.
메타데이터 스키마를 검사하면 코디네이터 회사 co_id, 관리자 토큰 cust_tok, 가장 중요한 보안 컨테이너 재정의 비밀번호 열 clc_ovr_cd과 같은 컨테이너 보안 데이터 열이 테이블에 포함되어 있습니다.
테이블과 화물을 복구하는 데 필요한 정확한 보안 열을 모두 찾았습니다.
🔓 실제 거버넌스: 프로덕션 엔터프라이즈 환경에서 보안 및 거버넌스팀은 다음을 활용합니다.
- 관점 및 태그 템플릿: 비즈니스 메타데이터 (예: 데이터 소유자, 보관 기간, PII 분류)를 테이블 스키마에 연결합니다.
- 데이터 계보:
maritime_security_registry와 같은 테이블이 다운스트림 시스템에서 쿼리되고 사용되는 방식을 나타내는 시각적 흐름도를 자동 생성합니다.
2. BigQuery에서 열 보안 검사
- BigQuery 콘솔로 다시 이동합니다.
- 탐색기 탭에서
lost_cargo_dataset를 선택하고maritime_security_registry테이블을 클릭합니다. - 스키마 탭을 클릭합니다.

clc_ovr_cd열이MaskShippingDetails라는 정책 태그로 보호됩니다 (정책 태그 열에 나열됨).- BigQuery에서 새 SQL 편집기 탭을 열고 다음 쿼리를 실행하여 레지스트리 재정의 코드를 확인합니다.
SELECT * FROM `lost_cargo_dataset.maritime_security_registry` WHERE co_id = 103; - 계정에 아직
MaskShippingDetails태그가 지정된 열을 읽을 권한이 없으므로 쿼리가 즉시 실패하고 액세스 거부됨 데이터베이스 보안 오류가 표시됩니다.

8. 열 보안을 크래킹하여 비밀번호 가져오기
최종 재정의 코드를 일반 텍스트로 읽으려면 사용자 계정에 MaskShippingDetails 태그가 지정된 열을 읽을 권한을 부여해야 합니다.
1. 정책 태그 권한 부여
- BigQuery 콘솔의 왼쪽 탐색 창에서 정책 태그로 이동합니다.
LostCargoSecurity_라는 분류를 선택합니다.- 태그 목록에서
MaskShippingDetails를 클릭합니다. - 화면 오른쪽의 정보 패널에서 주 구성원 추가를 클릭합니다. 패널이 숨겨져 있는 경우 오른쪽 상단에서 정보 패널 표시를 클릭합니다.
- 새 주 구성원 필드에 활성 상태인 Google Cloud 사용자 이메일을 입력합니다.
- 역할 선택 드롭다운에서 세부적인 리더를 검색하여 선택한 다음 저장을 클릭합니다.

2. 재정의 코드 쿼리
BigQuery 작업공간 편집기로 돌아갑니다. 이제 세분화된 권한의 리더 액세스 권한이 있으므로 쿼리를 다시 실행하여 마스킹 해제된 데이터를 볼 수 있습니다.
SELECT * FROM `lost_cargo_dataset.maritime_security_registry`
WHERE co_id = 103;
🔓 결과
쿼리는 마스크가 해제된 재정의 코드를 반환합니다.
SHIVER-ME-TIMBERS-888

9. 삭제
요금이 발생하지 않도록 이 실습 중에 만든 샌드박스 리소스를 정리합니다.
Cloud Shell 터미널로 돌아가 물류 테이블이 포함된 BigQuery 데이터 세트를 삭제합니다.
bq rm -r -f -d lost_cargo_dataset
클론된 저장소 파일을 삭제합니다.
cd ..
rm -rf data-cloud-roadshow-26
10. 축하합니다
조사를 완료하고 승인 재정의 코드를 가져왔습니다.
학습한 내용
- BigQuery에서 복잡한 항목과 관계를 나타내는 속성 그래프를 빌드하는 방법
- 데이터 연결을 포착하기 위해 노드, 에지, 속성, 라벨이 구성되는 방식
- BigQuery 대화형 분석을 사용하여 자연어로 속성 그래프를 쿼리하는 방법
- 관계형 경로를 순회하도록 Graph Query Language (GQL) 표현식이 구성되는 방식
- Knowledge Catalog를 사용하여 보안 애셋을 검색하고 정책 태그를 사용하여 열 수준으로 제한된 데이터에 액세스하는 방법