
Nano Banana Pro/2를 API로 호출하기: Gemini의 이미지 생성 제어하기
요약
Google DeepMind의 Nano Banana Pro/2 모델을 Python API로 호출하고 제어하는 방법을 다룹니다. 태스크 복잡도에 따라 비용 효율적인 모델을 선택하는 전략과 참조 이미지를 활용한 피사체 일관성 유지 방법을 설명합니다.
핵심 포인트
- Nano Banana 2는 고속·저비용 모델로 4K 출력과 14장의 참조 이미지를 지원함
- Nano Banana Pro는 고정밀 지시 이행이 필요한 복잡한 시각적 태스크에 적합함
- 태스크 복잡도에 따라 모델을 구분하여 사용하는 것이 비용 관리의 핵심임
- google-genai 라이브러리를 사용하여 이미지 생성 및 제어가 가능함
이전 기사 「Codex CLI를 통해 프로그래밍 방식으로 이미지 생성하기」에서는 gpt-image-2를 다루었지만, 이미지 생성 AI의 선택지는 OpenAI뿐만이 아닙니다. Google DeepMind의 「Nano Banana」 시리즈(Gemini native image generation)는 2026년 2월에 Nano Banana 2, 그리고 그에 앞서 Nano Banana Pro가 공개되었으며, 4K 출력·최대 14장의 참조 이미지(reference image)를 통한 피사체의 일관성 유지·실시간 검색 그라운딩(grounding) 등의 특징을 가지고 있습니다.
본 기사에서는 Nano Banana Pro/2를 Python에서 제어하는 기본 사항을 정리합니다. 다음 회차에서는 gpt-image-2와의 실전 비교를 진행할 예정이므로, 우선 API 사용법과 두 모델의 구분 사용법을 익혀둡시다.
두 가지 모델을 구분하여 사용하기
Nano Banana 계열에는 용도가 다른 두 가지 모델이 있습니다.
Nano Banana 2 (gemini-3.1-flash-image-preview): 고속·저비용이 특징입니다. 4K 출력을 지원하며, 최대 14장의 참조 이미지로 피사체의 일관성을 유지할 수 있습니다. 일상적인 이미지 생성 태스크의 주력 모델입니다.
Nano Banana Pro (gemini-3-pro-image): 복잡한 시각적 태스크를 위한 상위 모델입니다. 최대 5장의 캐릭터 참조 이미지에 대응하며, 보다 고정밀한 지시 이행(instruction following)이 요구되는 상황에서 선택합니다.
요금 기준은 동일 해상도에서 Nano Banana 2가 1,000장당 약 $0.067, Nano Banana Pro가 약 $0.134로 알려져 있습니다. Pro는 약 2배의 비용이 들기 때문에, 태스크의 복잡도에 따라 모델을 구분하여 사용하는 것이 비용 관리의 기본입니다.
def select_model(task_complexity: str) -> str:
"""태스크의 복잡도에 따라 적절한 모델을 선택한다"""
if task_complexity == "simple": # 단순한 이미지 생성·경미한 편집
...
기본적인 이미지 생성
Google 공식 google-genai 라이브러리를 사용합니다.
import PIL.Image
from google import genai
from io import BytesIO
...
generate_content의 응답에는 텍스트와 이미지 모두 포함될 수 있으므로, inline_data가 존재하는 파트만 추출하여 이미지로 저장합니다.
나쁜 예: 모든 태스크에 Nano Banana Pro를 사용하기
# 나쁜 예: 단순한 아이콘 생성과 같은 가벼운 태스크에도 항상 상위 모델을 사용해 버리는 경우
response = client.models.generate_content(
model="gemini-3-pro-image",
...
)
단순한 생성 태스크에 항상 상위 모델을 사용하면 비용이 불필요하게 약 2배가 됩니다. 태스크의 복잡도를 사전에 판단하고, 구분하여 사용하는 로직을 구현하십시오.
좋은 예: 태스크의 복잡도에 따라 자동으로 모델을 전환하기
def generate_image_smart(prompt: str, task_complexity: str = "simple") -> PIL.Image.Image:
"""태스크의 복잡도에 따라 자동으로 모델을 선택하여 이미지를 생성한다"""
model = select_model(task_complexity)
...
여러 참조 이미지로 피사체의 일관성 유지하기
Nano Banana 2의 특징 중 하나는 최대 14장의 참조 이미지를 전달함으로써, 동일한 캐릭터·피사체의 일관성을 유지한 채 여러 가지 변형(variation)을 생성할 수 있다는 점입니다.
def generate_with_reference_images(prompt: str, reference_image_paths: list[str]) -> PIL.Image.Image:
"""참조 이미지를 여러 장 전달하여, 피사체의 일관성을 유지한 채 새로운 이미지를 생성한다"""
if len(reference_image_paths) > 14:
...
Nano Banana Pro에서는 참조 이미지가 최대 5장으로 제한됩니다. 대량의 참조 이미지를 통한 일관성 유지가 필요한 경우에는 Nano Banana 2를, 보다 복잡한 지시 이행 정밀도가 필요한 경우에는 Pro를 선택한다는 판단 기준이 됩니다.
이미지의 일부만 편집하기
기존 이미지를 전달하여 특정 부분만 변경하는 편집도 가능합니다. 지시 사항을 작성하는 데에는 일정한 형식이 있습니다.
def edit_image_selectively(image_path: str, edit_instruction: str) -> PIL.Image.Image:
"""이미지의 일부분만 변경하고 그 외의 부분은 유지한다"""
original_image = PIL.Image.open(image_path)
...
"〇〇만 변경하고 그 외의 부분은 유지해 주세요"와 같이 지시 사항을 템플릿화하는 것이 의도하지 않은 전체적인 변화를 방지하는 요령입니다.
배치 생성 (Batch Generation) 및 에러 핸들링 (Error Handling)
여러 장을 한꺼번에 생성할 경우, API의 속도 제한 (Rate Limit)이나 콘텐츠 정책 위반으로 인한 에러를 고려한 구현이 필요합니다.
import time
def generate_batch_with_retry(prompts: list[str], model: str = "gemini-3.1-flash-image-preview", max_retries: int = 3) -> list[dict]:
"""여러 프롬프트를 배치 생성하며, 실패한 것은 재시도(Retry)하면서 결과를 기록한다"""
...
나쁜 예: 에러 유형을 구분하지 않고 일괄적으로 재시도하는 경우
# 나쁜 예: 콘텐츠 정책 위반도 네트워크 에러도 똑같이 재시도해 버린다
for attempt in range(5):
try:
...
콘텐츠 정책 위반(부적절한 프롬프트로 판정된 경우)은 몇 번을 재시도해도 같은 이유로 계속 실패합니다. 에러 메시지의 내용에 따라 "재시도해야 할 에러"와 "프롬프트 자체를 재검토해야 할 에러"를 구분함으로써, 무의미한 재시도로 인한 시간과 비용의 낭비를 피할 수 있습니다.
gpt-image-2와의 간단한 비교 기준
상세한 실전 비교는 다음 기회로 미루겠지만, API 이용 관점만 먼저 정리해 둡니다.
| 관점 | gpt-image-2 | Nano Banana Pro/2 |
|---|---|---|
| 과금 체계 | 토큰 단위 (이미지 출력 $30/100만 토큰) | 이미지 매수 단위 ($0.067~0.134/1,000매) |
| ... | ... | ... |
무료 티어(Free Tier)의 존재는 프로토타이핑 (Prototyping) 단계에서의 비용을 크게 좌우합니다. "먼저 무료로 테스트할 수 있는 Nano Banana 계열로 방향성을 잡고, 필요에 따라 gpt-image-2와 비교한다"는 방식이 비용을 억제하며 검증하기에 적합합니다.
실시간 검색 그라운딩 (Search Grounding)
Nano Banana 계열의 독특한 특징 중 하나로, 생성 시 실시간 검색 결과를 반영할 수 있는 기능이 있습니다. 최신 사실에 기반한 도해를 만들고 싶을 때 유효합니다.
def generate_with_search_grounding(prompt: str) -> PIL.Image.Image:
"""검색 그라운딩을 활성화하여 최신 사실 정보를 반영한 이미지를 생성한다"""
response = client.models.generate_content(
...
)
예를 들어 "현재 주요 클라우드 GPU의 가격대를 반영한 비교도"와 같이 사실의 신선도가 중요한 도해를 만들 때, 검색 그라운딩을 활성화하면 학습 데이터의 노후화로 인한 부정확한 수치의 혼입을 줄일 수 있습니다. 다만 생성 AI의 출력물인 만큼, 중요한 수치를 포함하는 도해는 반드시 사람이 사실 확인 (Fact Check)을 거친 후 공개해야 합니다.
무료 티어를 활용한 검증
Google AI Studio를 통해서는 하루 최대 500장까지 무료로 생성할 수 있는 한도가 제공됩니다. 본 서비스 도입 전의 검증 및 프롬프트 시행착오 단계에서는 이 무료 한도를 적극적으로 활용하십시오.
def track_daily_free_tier_usage(usage_log_path: str, daily_limit: int = 500) -> bool:
"""하루 무료 한도 사용 현황을 기록하고, 상한선에 가까워지면 경고한다"""
import json
...
무료 티어로 프롬프트 형식을 확립하고, 비용이 발생하는 본 운영 단계에 진입한 후에는 앞서 언급한 모델 구분 로직으로 비용을 최적화하는 2단계 접근 방식이 실무적입니다.
무료 티어에는 "상업적 이용에 대한 데이터 처리 정책이 유료 버전과 다를 수 있다"라는 주의 사항도 있습니다. 검증 단계에서는 무료 티어를 사용하되, 실제 고객 데이터나 기밀성이 있는 이미지를 다루는 본 운영 단계에 진입하기 전에는 이용 약관 및 데이터 처리 정책을 반드시 확인하십시오.
종횡비(Aspect Ratio) 및 해상도 제어
용도에 따라 출력되는 종횡비(Aspect Ratio)와 해상도를 지정할 수 있습니다. 교육용 슬라이드 이미지와 SNS 게시용 이미지는 필요한 종횡비가 다르기 때문에, 생성 시 명시적으로 지정해 두면 후속 공정에서의 트리밍(Trimming) 작업을 줄일 수 있습니다.
def generate_with_aspect_ratio(prompt: str, aspect_ratio: str = "16:9", resolution: str = "2K") -> PIL.Image.Image:
"""지정된 종횡비 및 해상도로 이미지를 생성한다"""
allowed_ratios = {"1:1", "16:9", "9:16", "4:3", "3:4"}
...
나쁜 예: 항상 정사각형으로 생성한 후 후속 공정에서 트리밍하기
# 나쁜 예: 종횡비를 지정하지 않고 정사각형으로 생성하여, 용도마다 매번 다시 트리밍함
response = client.models.generate_content(model="gemini-3.1-flash-image-preview", contents=[prompt])
# 슬라이드용으로 16:9로 트리밍하면 피사체의 중요한 부분이 잘려 나갈 수 있음
생성 후 트리밍을 하면 피사체의 배치에 따라 중요한 부분이 잘려 나갈 위험이 있습니다. 용도를 사전에 알고 있는 경우에는 생성 시점에 종횡비를 지정해 두는 것이 재작업을 줄이는 방법입니다.
비용을 지속적으로 추적하기
여러 모델과 태스크를 구분하여 사용하다 보면 실제로 어느 정도의 비용이 발생하는지 파악하기 어려워집니다. 생성할 때마다 비용을 기록해 두면 예상치 못한 청구를 방지할 수 있습니다.
def track_generation_cost(model: str, image_count: int, cost_log_path: str = "./generation_costs.json") -> None:
"""모델별 생성 비용을 누적 기록한다"""
import json
...
태스크의 복잡도에 따른 모델 선택 로직과 이 비용 기록을 결합하면, "어느샌가 상위 모델만 사용하고 있어서 예상보다 청구 금액이 높게 나왔다"는 상황을 방지할 수 있습니다. 월 단위로 이 로그를 확인하며, 실제 모델 사용 비율이 의도한 설계(단순 태스크는 Nano Banana 2, 복잡한 태스크만 Pro)대로 이루어지고 있는지 검증하는 운영 방식을 권장합니다.
SynthID 전자 워터마크와 공개 의무
Nano Banana 계열에서 생성된 이미지에는 Google DeepMind가 개발한 SynthID라는 전자 워터마크(Electronic Watermark)가 비가시적인 형태로 삽입됩니다. 이 워터마크는 전용 도구로 검증함으로써 "AI 생성 이미지인지 여부"를 나중에 확인할 수 있는 메커니즘입니다.
def verify_synthid_watermark(image_path: str) -> dict:
"""SynthID 검증 API를 사용하여 이미지가 AI 생성인지 확인한다 (개념적인 구현 예시)"""
from google import genai
...
나쁜 예: AI 생성 이미지임을 밝히지 않고 실사처럼 공개하기
# 나쁜 예: Nano Banana 계열로 생성한 제품 이미지를,
# 생성물임을 전혀 명시하지 않고 실사 제품 사진으로 공개해 버림
publish_to_website(generated_image, caption="제품 실사")
많은 국가와 지역에서 AI 생성 콘텐츠의 공개 의무에 관한 규제가 마련되고 있으며, 일본 국내에서도 경품표시법 및 스텔스 마케팅 규제 관점에서 생성 이미지를 실사처럼 취급하는 것에는 리스크가 따릅니다. SynthID와 같은 워터마크 기술은 "나중에 검증할 수 있는" 안전망이기는 하지만, 이에 의존하기보다는 생성 이미지임을 처음부터 적절하게 공개하는 운영 규칙을 사내에 정해 두는 것이 바람직한 대응입니다. 특히 제품 카탈로그나 광고 용도로 사용할 경우에는 법무 부서와의 사전 확인을 권장합니다.
비동기 병렬 생성을 통한 처리량(Throughput) 향상
대량의 이미지를 생성해야 하는 경우(교재의 연습 소재를 수십 장 한꺼번에 만드는 등), 순차적으로 API를 호출하면 시간이 오래 걸립니다. 비동기 처리 (Asynchronous processing)로 병렬화함으로써 전체적인 처리량 (Throughput)을 개선할 수 있습니다.
import asyncio
from google import genai
async_client = genai.Client()
...
나쁜 예: 수십 장의 이미지를 한 건씩 순차적으로 생성하는 경우
# 나쁜 예: for 루프를 통해 한 건씩 차례대로 API를 호출하여, 다른 처리를 대기하게 만듦
results = []
for prompt in prompts: # 50건의 프롬프트가 있다면, 한 건당 수 초로 계산했을 때 수 분이 소요됨
...
순차 실행에서는 한 건당 API 응답 시간 (Response time)이 그대로 전체 처리 시간에 누적됩니다. asyncio.Semaphore를 사용하여 동시 실행 수를 제한하면서 병렬화하면, 속도 제한 (Rate limit)을 고려하면서도 전체적인 처리량 (Throughput)을 크게 개선할 수 있습니다. 동시 실행 수 (max_concurrent)는 API의 속도 제한 (Rate limit)에 따라 조정하십시오. 수치를 너무 크게 설정하면, 이번에는 속도 제한 에러가 빈번하게 발생하게 됩니다.
요약
Nano Banana Pro/2는 gpt-image-2와 어깨를 나란히 하는 유력한 이미지 생성 API 선택지입니다. Nano Banana 2는 고속·저비용이며 최대 14장의 참조 이미지 (Reference image)를 통한 일관성 유지에 강점이 있고, Nano Banana Pro는 더 복잡한 지시 이행 (Instruction following)이 필요한 상황에 적합합니다. 무료 할당량을 활용한 검증, 태스크의 복잡도에 따른 모델 선택, 검색 그라운딩 (Search grounding)을 통한 사실 확인이라는 세 가지 포인트를 숙지해 두면 실무 도입 판단을 내리기 쉬워집니다. 다음 회차에서는 gpt-image-2와 Nano Banana Pro를 동일한 프롬프트로 비교하여 화질, 속도, 비용을 채점하겠습니다.
Discussion

AI 자동 생성 콘텐츠
본 콘텐츠는 Zenn AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기