TypeScript 학습 회고록_04
요약
본 글은 git diff의 변경 내용을 Gemini API와 결합하여 자동으로 Qiita 원고를 생성하는 스크립트 개발 과정을 회고합니다. .env 파일을 사용해 안전하게 API 키를 관리하고, 공식 SDK 및 외부 템플릿 로딩 방식을 적용했습니다. 또한 비동기 처리(async/await)를 활용하여 안정적인 코드 구조를 구축한 점을 중점적으로 다루었습니다.
핵심 포인트
- `.env`와 에러 핸들링으로 API 키 보안 강화
- 공식 SDK(`@google/genai`) 사용법 익히기
- 프롬프트 템플릿 분리로 가독성 향상
- 비동기 처리(async/await)로 안정적인 API 통신 구현
잠시 바쁘게 지내다 보니 공백이 생겼지만, 복습 삼아 제 페이스대로 다시 시작해 보려고 합니다. 무리하지 않고 꾸준히 이어가는 것이 가장 좋겠죠.
전에 같은 말을 했기 때문에, 아마 앞으로도 계속 이야기하게 될 것 같습니다.
이번에는 git diff에서 자동으로 Qiita 원고를 생성하는 스크립트에 Gemini API를 결합해 보았으니, 그 변경점을 되돌아보겠습니다.
-
dotenv
-
Google_Gen_AI_SDK 초기화
-
외부 템플릿 로드
-
async/await
- 안전하게 API 키를 읽고, 설정되지 않았을 때 처리를 안전하게 중단하는 메커니즘
require('dotenv').config();
const apikey = process.env.GEMINI_API_KEY;
if (!apikey) {
...
실수로 API 키를 그대로 GitHub에 공개하면 큰 사고가 나기 때문에, 제대로 .env에서 가져오도록 했습니다. 이런 종류의 가드절이나 에러 핸들링은 아직 술술 외우지는 못하지만, 안전을 위해 반드시 스탠다드 멤버로 삼고 싶은 정형화된 패턴입니다.
- 공식 SDK를 로드하여 Gemini 클라이언트를 사용할 수 있게 하는 메커니즘
const { GoogleGenAI } = require('@google/genai');
const AI = new GoogleGenAI({ apiKey: apikey });
Google의 새로운 SDK(@google/genai)를 도입해 보았습니다. 평소에 사용하던 라이브러리와 비교하면 아직 '친한 친구' 상태이지만, 인수에 객체로 API 키를 전달하는 아주 간단한 설계라 쉽게 접근할 수 있었습니다.
- 외부 파일에서 지시문을 로드하고, 동적인 diff 데이터와 합치는 메커니즘
const promptTemplate = fs.readFileSync('AI_prompt.txt', 'utf-8');
const fullPrompt = promptTemplate + '
【입력 데이터(git diff)】
' + diff;
긴 프롬프트를 스크립체 내에 붙여넣으면 코드의 가독성이 급격히 떨어지기 때문에, 별도의 파일(AI_prompt.txt)로 분리했습니다. fs.readFileSync의 문자 인코딩 지정(utf-8)을 매번 잊어버릴 것 같은 건 애교입니다.
- 비동기 처리로 API 응답 도착을 기다리고 생성 결과를 꺼내는 메커니즘
const response = await AI.models.generateContent({
model: 'gemini-3.8-flash',
contents: fullPrompt,
...
API 통신처럼 시간이 걸리는 처리는 비동기(asynchronous)가 되므로, 함수 전체를 async로 만들고 await로 기다립니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기