이 글은 이미지 속 텍스트를 추출(OCR)하고 번역 및 의미 분석까지 연결하려는 클라우드 학습자를 위한 실습 기록입니다.
문제는 이미지에 있는 문자를 어떻게 추출하고, 그 결과를 번역하고, 마지막에는 의미 분석까지 이어가는 전체 흐름이 처음에는 잘 보이지 않는다는 점입니다.
이 글을 통해 Cloud Storage에 이미지를 올리고, Vision API로 텍스트를 추출한 뒤, Translation API와 Natural Language API까지 연결하는 전체 과정을 직접 따라할 수 있습니다.
이 글의 핵심 질문
GCP에서 이미지 텍스트를 추출하고 번역 및 분석까지 자동화하려면 어떻게 해야 하는가?
실습 환경
- Cloud: Google Cloud Platform
- 서비스: Cloud Storage, Vision API, Translation API, Natural Language API
- 인증 방식: API Key
- 입력 데이터: 프랑스어 간판 이미지
sign.jpg - 처리 흐름: 이미지 → OCR → 번역 → 엔티티 분석
아키텍처
이번 실습의 핵심 구조는 단순 OCR이 아닙니다. Cloud Storage에 저장된 이미지를 Vision API가 읽어서 텍스트를 추출하고, 그 결과를 Translation API가 영어로 번역한 뒤, Natural Language API가 사람, 장소 같은 엔티티를 식별하는 흐름입니다. 즉, 하나의 이미지가 데이터 파이프라인을 통과하면서 “읽을 수 있는 텍스트”와 “분석 가능한 의미 데이터”로 바뀌는 구조입니다.

Cloud Storage → Vision API OCR → Translation API → Natural Language API → Client / Application
전체 흐름
이번 실습은 크게 5단계로 진행됩니다.
- API Key 생성
- Cloud Storage 버킷 생성 및 이미지 업로드
- Vision API OCR 요청 생성 및 실행
- Translation API로 번역
- Natural Language API로 엔티티 분석
즉, 이 실습은 “API를 하나씩 따로 써보는 것”이 아니라 이미지 데이터를 텍스트와 의미 정보로 바꾸는 연속 처리 구조를 익히는 과정입니다.
■ 강사 설명
실습은 프랑스어가 적힌 간판 사진을 기준으로 진행됩니다. 먼저 Vision API의 TEXT_DETECTION 기능으로 이미지 안의 글자를 OCR로 추출하고, 그 결과를 Translation API로 영어로 번역합니다. 마지막으로 Natural Language API의 analyzeEntities 메서드로 번역된 문장에서 사람, 장소, 기타 엔티티를 추출합니다. :contentReference[oaicite:0]{index=0}
즉, 이번 실습의 핵심은 단순 OCR 정확도 확인이 아니라 OCR 결과를 후속 AI API에 넘겨 더 풍부한 정보로 확장하는 것입니다.
■ 내가 이해한 핵심
이번 실습의 본질은 아래 한 문장으로 정리됩니다.
이미지는 그냥 파일이 아니라, 텍스트와 의미를 꺼낼 수 있는 데이터 원천이다
Vision API는 이미지를 문자로 바꾸고, Translation API는 그 문자를 이해 가능한 언어로 바꾸고, Natural Language API는 그 문장에서 중요한 개체를 추출합니다. 즉, 이미지 하나가 여러 단계를 거치며 점점 더 분석 가능한 데이터로 변환됩니다.
■ 내가 실제로 겪은 문제
실습 초반에 가장 먼저 부딪힌 문제는 인증과 접근 권한이었습니다. Vision API를 curl로 호출하려면 API Key가 필요하고, Cloud Storage에 올린 이미지를 API가 읽을 수 있어야 합니다.
즉, 단순히 이미지를 업로드했다고 끝이 아니라 아래 두 가지가 같이 맞아야 합니다.
- API Key가 생성되어 있어야 함
- 이미지 객체가 읽을 수 있는 상태여야 함
이 경험을 통해 분명해졌습니다. AI API 실습은 모델보다 먼저 인증과 데이터 접근 경로를 정확히 맞추는 것이 핵심이라는 점입니다.
실습 단계
1단계. API Key 생성
목적: Vision API, Translation API, Natural Language API를 curl로 호출하기 위한 인증 키를 만드는 단계입니다.
GCP 콘솔에서 APIs & services > Credentials로 이동한 뒤, Create credentials > API key를 선택합니다. 키가 생성되면 값을 복사해 둡니다. 실습 문서는 이 키를 환경 변수에 저장해 매번 URL에 직접 쓰지 않도록 안내합니다. :contentReference[oaicite:1]{index=1}
export API_KEY=<YOUR_API_KEY>
이 단계가 중요한 이유는 이후 모든 curl 호출이 이 키를 통해 인증되기 때문입니다. 즉, API Key는 단순 문자열이 아니라 “이 요청이 어느 프로젝트의 권한으로 실행되는가”를 결정하는 출발점입니다.
2단계. Cloud Storage 버킷 생성
목적: OCR 대상 이미지를 저장할 클라우드 저장소를 만드는 단계입니다.
실습에서는 Vision API에 이미지를 보내는 두 가지 방법을 설명합니다. 하나는 base64 인코딩 문자열을 직접 보내는 방식이고, 다른 하나는 Cloud Storage에 저장된 파일의 URL을 넘기는 방식입니다. 이번 실습은 후자를 사용하므로 먼저 버킷을 생성합니다. GCP 콘솔에서 Cloud Storage > Browser로 이동한 뒤 Create bucket을 클릭합니다. :contentReference[oaicite:2]{index=2}
버킷 이름은 전역에서 유일해야 하므로 보통 프로젝트 ID 기반으로 지정합니다. 생성 과정에서는 Enforce public access prevention on this bucket 옵션을 해제하고, 이후 Permissions 탭에서 Access control을 Fine-grained로 바꾸라고 실습 문서가 안내합니다. :contentReference[oaicite:3]{index=3}
이 설정이 중요한 이유는 버킷 전체는 비공개로 유지하면서도, 특정 파일만 공개 Reader 권한을 줄 수 있게 하기 위해서입니다. 즉, “버킷은 보호하되 객체만 제한적으로 공개”하는 구조를 실습에서 의도적으로 경험하게 합니다.
3단계. sign.jpg 업로드 및 객체 공개 설정
목적: OCR 대상 이미지를 실제로 저장하고 Vision API가 접근할 수 있는 상태로 만드는 단계입니다.
실습 문서는 프랑스어 간판 사진을 sign.jpg라는 이름으로 저장한 뒤, 방금 만든 버킷의 Objects 탭에서 Upload files로 업로드하라고 안내합니다. 업로드가 끝나면 해당 파일 오른쪽 점 3개 메뉴에서 Edit Access를 선택합니다. 그 후 아래처럼 새 권한을 추가합니다.
- Entity: Public
- Name: allUsers
- Access: Reader
저장하면 sign.jpg 파일은 공개 읽기 가능 상태가 됩니다. 실습 문서도 “버킷은 비공개로 유지하면서 파일만 공개”라고 설명합니다. :contentReference[oaicite:4]{index=4}
이 단계에서 중요한 점은 OCR 대상 이미지가 “존재”하는 것만으로는 충분하지 않다는 점입니다. API가 읽을 수 있는 경로와 권한이 함께 맞아야 합니다. 이 구조를 이해하지 못하면 이후 요청 JSON이 맞아도 API 호출이 실패할 수 있습니다.
4단계. Vision API OCR 요청 JSON 생성
목적: 어떤 이미지를 어떤 기능으로 분석할지 Vision API에 알려주는 단계입니다.
Cloud Shell에서 ocr-request.json 파일을 만들고, 아래 구조를 입력합니다. 이때 gcsImageUri에는 방금 올린 sign.jpg의 버킷 경로를 넣어야 합니다.
{
"requests": [
{
"image": {
"source": {
"gcsImageUri": "gs://my-bucket-name/sign.jpg"
}
},
"features": [
{
"type": "TEXT_DETECTION",
"maxResults": 10
}
]
}
]
}
여기서 핵심은 type: TEXT_DETECTION입니다. 이것이 OCR 기능을 의미합니다. 실습 문서는 이 요청이 이미지에서 문자 블록과 단어들을 추출하는 optical character recognition을 수행한다고 설명합니다. :contentReference[oaicite:5]{index=5}
즉, 이 단계는 단순 JSON 작성이 아니라 “어떤 입력을 어떤 기능으로 처리할 것인가”를 API 스펙에 맞춰 정의하는 작업입니다.
5단계. Vision API 호출로 OCR 수행
목적: 실제 이미지를 읽어 텍스트를 추출하는 단계입니다.
Cloud Shell에서 아래 curl 명령을 실행합니다.
curl -s -X POST -H "Content-Type: application/json" --data-binary @ocr-request.json \
https://vision.googleapis.com/v1/images:annotate?key=${API_KEY}
응답에는 textAnnotations 배열이 포함되며, 첫 번째 객체에는 전체 텍스트 블록이 들어 있습니다. 실습 문서 예시에서는 아래와 비슷한 형태로 반환됩니다.
"locale": "fr",
"description": "LE BIEN PUBLIC
les dépeches
Pour Obama,
la moutarde
est
de Dijon"
즉, API는 단순히 문자만 읽는 것이 아니라 언어 코드(fr)와 함께 전체 문장 블록, 그리고 각 단어별 bounding box까지 제공합니다. 실습 문서도 첫 번째 textAnnotations 항목은 전체 텍스트 블록이며, 이후 항목들은 개별 단어와 위치 정보를 담는다고 설명합니다. :contentReference[oaicite:6]{index=6}
이제 OCR 결과를 다음 단계에서 다시 활용할 수 있도록 파일로 저장합니다.
curl -s -X POST -H "Content-Type: application/json" --data-binary @ocr-request.json \
https://vision.googleapis.com/v1/images:annotate?key=${API_KEY} -o ocr-response.json
이 단계의 핵심은 분명합니다. 이미지가 이제 텍스트 데이터로 바뀌었다는 점입니다.
6단계. Translation API 요청 생성 및 OCR 결과 번역
목적: 추출한 프랑스어 텍스트를 영어로 번역해 후속 분석이 가능하도록 만드는 단계입니다.
먼저 translation-request.json 파일을 아래처럼 만듭니다.
{
"q": "your_text_here",
"target": "en"
}
이제 OCR 결과 파일 ocr-response.json에서 텍스트 블록을 꺼내 이 파일에 넣어야 합니다. 실습 문서는 jq와 sed를 결합한 Bash 명령으로 이를 자동화합니다.
STR=$(jq .responses[0].textAnnotations[0].description ocr-response.json) && STR="${STR//\"}" && sed -i "s|your_text_here|$STR|g" translation-request.json
그 다음 Translation API를 호출합니다.
curl -s -X POST -H "Content-Type: application/json" --data-binary @translation-request.json \
https://translation.googleapis.com/language/translate/v2?key=${API_KEY} \
-o translation-response.json
응답 파일을 보면 아래와 같은 결과가 들어 있습니다.
{
"data": {
"translations": [
{
"translatedText": "THE PUBLIC GOOD the despatches For Obama, the mustard is from Dijon",
"detectedSourceLanguage": "fr"
}
]
}
}
즉, OCR로 추출한 프랑스어가 영어로 변환되었고, 원본 언어가 fr이라는 것도 자동으로 감지됩니다. 실습 문서도 translatedText와 detectedSourceLanguage를 핵심 필드로 설명합니다. :contentReference[oaicite:7]{index=7}
이 단계는 다국어 데이터를 처리하는 데 매우 중요합니다. OCR만으로는 아직 사람이 모두 이해하기 어려울 수 있지만, 번역 이후에는 후속 NLP 분석이나 검색, 분류, 보고서 작성까지 훨씬 쉬워집니다.
7단계. Natural Language API로 엔티티 분석
목적: 번역된 텍스트에서 사람, 장소, 기타 핵심 개체를 추출하는 단계입니다.
먼저 nl-request.json 파일을 아래처럼 만듭니다.
{
"document":{
"type":"PLAIN_TEXT",
"content":"your_text_here"
},
"encodingType":"UTF8"
}
이제 번역 결과에서 영어 문장을 추출해 content에 넣습니다. 실습 문서는 아래 Bash 명령을 사용합니다.
STR=$(jq .data.translations[0].translatedText translation-response.json) && STR="${STR//\"}" && sed -i "s|your_text_here|$STR|g" nl-request.json
그 다음 Natural Language API의 analyzeEntities 엔드포인트를 호출합니다.
curl "https://language.googleapis.com/v1/documents:analyzeEntities?key=${API_KEY}" \
-s -X POST -H "Content-Type: application/json" --data-binary @nl-request.json
응답에는 엔티티 목록이 들어 있으며, 예시로 아래와 같은 값이 보입니다.
- Obama → PERSON
- Dijon → LOCATION
- mustard → OTHER
실습 문서는 엔티티별 salience(문맥상 중요도), mentions(텍스트 내 출현 위치), 위키피디아 URL과 같은 메타데이터도 함께 반환된다고 설명합니다. :contentReference[oaicite:8]{index=8}
이 단계의 의미는 아주 큽니다. 단순 OCR은 텍스트를 “읽는 것”에서 끝나지만, NLP 분석은 그 텍스트가 “무엇에 관한 것인지”를 구조화된 데이터로 바꿉니다. 즉, 이미지 한 장에서 사람명, 지명, 핵심 키워드를 추출해 검색, 분류, 요약, 추천 같은 후속 기능으로 확장할 수 있습니다.
실습 증거
1. Vision API OCR 응답
실습 문서의 OCR 응답 예시는 locale: "fr"와 함께 전체 텍스트 블록 LE BIEN PUBLIC ... de Dijon이 추출되는 모습을 보여줍니다. 이는 이미지가 텍스트 데이터로 성공적으로 변환되었음을 보여주는 핵심 증거입니다. :contentReference[oaicite:9]{index=9}
2. Translation API 응답
번역 응답 예시는 translatedText에 영어 문장이 들어 있고, detectedSourceLanguage가 fr로 반환됩니다. 이는 OCR 결과가 다국어 번역 파이프라인으로 정상 연결되었음을 보여줍니다. :contentReference[oaicite:10]{index=10}
3. Natural Language API 엔티티 분석
응답 예시에는 Obama가 PERSON, Dijon이 LOCATION으로 표시되고, 각 엔티티의 salience와 mentions 정보가 함께 포함됩니다. 이는 번역된 텍스트가 단순 문자열이 아니라 분석 가능한 의미 데이터로 바뀌었음을 보여주는 직접 증거입니다. :contentReference[oaicite:11]{index=11}
트러블슈팅
문제 증상:
Vision API 호출이 정상 동작하지 않거나 권한 관련 문제가 발생한다.
원인 분석:
API Key가 생성되지 않았거나, 환경 변수에 저장되지 않았거나, 요청 URL에 키가 빠졌을 수 있다.
확인 방법:
Credentials에서 API Key 생성 여부를 확인하고, Cloud Shell에서 echo $API_KEY로 환경 변수 값이 있는지 점검한다.
해결 방법:
API Key를 다시 생성한 뒤 export API_KEY=...로 저장하고, curl URL에 정확히 포함시킨다.
재발 방지 방법:
API 기반 실습에서는 본문 작업 전에 인증 변수부터 먼저 세팅하는 습관을 들인다.
문제 증상:
이미지는 업로드했는데 Vision API가 기대대로 읽지 못하거나 후속 호출이 실패한다.
원인 분석:
이미지 객체 권한이 공개 읽기 상태가 아니거나, gcsImageUri 경로가 잘못되었을 수 있다.
확인 방법:
Cloud Storage 객체의 Edit Access 설정에서 allUsers / Reader가 들어 있는지, JSON 요청의 버킷명이 실제와 일치하는지 확인한다.
해결 방법:
객체 수준에서 Public / allUsers / Reader 권한을 추가하고, gs://버킷명/sign.jpg 경로를 다시 확인한다.
재발 방지 방법:
버킷명, 객체명, 권한 설정을 OCR 요청 전에 먼저 점검하는 체크리스트를 만든다.
실무 핵심 포인트
이번 실습의 가장 중요한 교훈은 아래 한 문장으로 정리할 수 있습니다.
OCR은 끝이 아니라 시작이며, 번역과 NLP를 붙이면 이미지가 곧 분석 가능한 데이터 소스로 변한다
즉, 간판 사진, 영수증, 계약서, 제품 라벨, 메뉴판, 공문서 이미지처럼 사람이 눈으로만 읽던 정보도 API 체인 하나로 텍스트와 의미 데이터로 전환할 수 있습니다. 이 구조를 이해하면 대량 이미지 데이터 처리, 자동 분류, 검색 최적화, 글로벌 다국어 서비스까지 자연스럽게 확장할 수 있습니다.
결론
핵심 원칙
GCP에서 이미지 텍스트를 처리할 때는 Vision API만 보는 것이 아니라, Translation API와 Natural Language API까지 연결해 하나의 데이터 파이프라인으로 이해해야 한다.
실무 적용 시 주의점
- API Key와 요청 URL을 먼저 정확히 설정할 것
- Cloud Storage 객체 접근 권한을 점검할 것
- OCR 결과를 바로 후속 API 입력으로 재사용하는 흐름을 익힐 것
- 번역 이후 NLP 분석을 붙이면 데이터 가치가 크게 높아짐
- 이미지 파일은 단순 파일이 아니라 추출 가능한 비정형 데이터 자산으로 볼 것
다음 학습 단계 제안
다음에는 영수증, 계약서, 메뉴판, 라벨 이미지 같은 실제 업무 데이터를 대상으로 OCR 자동화 파이프라인을 만들고, 그 결과를 BigQuery나 Looker Studio와 연결해보면 좋습니다.
'서버 구축·실습' 카테고리의 다른 글
| BigQuery에서 JOIN 오류가 발생하는 이유와 해결 방법 (데이터 조인 실습 완전 가이드) (0) | 2026.03.26 |
|---|---|
| BigQuery에서 JSON·ARRAY·STRUCT를 다루는 방법: 중첩 데이터 완전 이해 실습 (0) | 2026.03.26 |
| GCP AutoML로 이미지 분류 모델 만드는 방법 (Cloud Vision API 실습 기반 완전 가이드) (0) | 2026.03.25 |
| GCP BigQuery에서 CSV·GCS·Google Sheets 데이터를 적재하는 방법 (실습 기반 완전 가이드) (0) | 2026.03.24 |
| GCP Looker Studio로 BigQuery 데이터를 시각화하는 방법: 보고서 생성 실습 완전 가이드 (0) | 2026.03.24 |