타입스크립트로 AWS Lambda 함수 작성하기 🚀

안녕, 친구들! 오늘은 정말 흥미진진한 주제로 찾아왔어. 바로 타입스크립트를 사용해서 AWS Lambda 함수를 작성하는 방법에 대해 알아볼 거야. 😎 이 글을 통해 너희는 타입스크립트의 강력함과 AWS Lambda의 편리함을 동시에 경험할 수 있을 거야. 그럼 우리 함께 이 멋진 여정을 시작해볼까?
🔑 핵심 포인트: 타입스크립트 + AWS Lambda = 강력한 서버리스 애플리케이션
우리가 이 글에서 다룰 내용들을 간단히 소개할게:
- 타입스크립트와 AWS Lambda의 기본 개념
- 개발 환경 설정하기
- 첫 번째 Lambda 함수 작성하기
- 타입스크립트의 장점 활용하기
- Lambda 함수 테스트와 배포
- 실제 프로젝트에 적용하기
- 성능 최적화 팁
자, 이제 본격적으로 시작해볼까? 🏁
1. 타입스크립트와 AWS Lambda: 환상의 짝꿍 💑
먼저, 타입스크립트와 AWS Lambda에 대해 간단히 알아보자. 이 두 기술이 왜 환상의 짝꿍인지 이해하면, 앞으로의 여정이 더욱 흥미진진해질 거야!
1.1 타입스크립트란? 🤔
타입스크립트는 자바스크립트의 슈퍼셋 언어야. 쉽게 말해, 자바스크립트에 타입을 추가한 언어라고 생각하면 돼. 근데 왜 타입이 중요할까?
💡 타입스크립트의 장점:
- 코드의 안정성 향상
- 개발 시 오류 조기 발견
- 더 나은 코드 자동완성과 문서화
- 객체 지향 프로그래밍 지원
예를 들어, 자바스크립트에서는 이런 실수를 하기 쉬워:
function add(a, b) {
return a + b;
}
console.log(add("5", 10)); // 출력: "510"
하지만 타입스크립트를 사용하면 이런 실수를 미리 방지할 수 있지:
function add(a: number, b: number): number {
return a + b;
}
console.log(add("5", 10)); // 컴파일 에러!
console.log(add(5, 10)); // 정상 작동, 출력: 15
타입스크립트는 이렇게 코드의 안정성을 높여주고, 개발자가 실수할 확률을 줄여줘. 특히 큰 프로젝트에서 여러 명이 협업할 때 그 진가를 발휘한다고 할 수 있지.
1.2 AWS Lambda는 뭐야? 🌩️
AWS Lambda는 아마존 웹 서비스(AWS)에서 제공하는 서버리스 컴퓨팅 서비스야. '서버리스'라고 해서 서버가 없는 게 아니라, 서버 관리를 AWS가 대신 해준다는 뜻이야.
🌟 AWS Lambda의 특징:
- 서버 관리 불필요
- 사용한 만큼만 비용 지불
- 자동 확장
- 다양한 프로그래밍 언어 지원
Lambda를 사용하면 작은 기능 단위의 함수를 쉽게 배포하고 실행할 수 있어. 예를 들어, 이미지 리사이징, 데이터 처리, API 요청 처리 등 다양한 작업을 Lambda 함수로 구현할 수 있지.
1.3 타입스크립트 + AWS Lambda = 완벽한 조합 💖
이 두 기술을 함께 사용하면 어떤 장점이 있을까?
- 코드 품질 향상: 타입스크립트의 정적 타입 검사로 Lambda 함수의 안정성이 높아져.
- 개발 생산성 증가: 자동완성, 리팩토링 도구 등을 통해 개발 속도가 빨라져.
- 유지보수 용이성: 타입 정보가 있어 코드 이해와 디버깅이 쉬워져.
- 확장성: 복잡한 비즈니스 로직도 타입스크립트로 쉽게 구현 가능해.
재능넷같은 재능 공유 플랫폼에서도 이런 기술 조합을 활용하면 정말 좋을 거야. 예를 들어, 사용자 프로필 업데이트, 결제 처리, 알림 발송 등의 기능을 Lambda 함수로 구현하고, 타입스크립트로 작성하면 안정적이고 확장 가능한 시스템을 만들 수 있지.
이제 우리가 왜 타입스크립트와 AWS Lambda를 함께 사용하는지 이해했지? 그럼 이제 실제로 어떻게 개발 환경을 설정하고 Lambda 함수를 작성하는지 알아보자!
2. 개발 환경 설정하기 🛠️
자, 이제 본격적으로 타입스크립트로 AWS Lambda 함수를 작성하기 위한 개발 환경을 설정해볼 거야. 걱정 마! 생각보다 어렵지 않아. 하나씩 차근차근 따라와 봐.
2.1 Node.js 설치하기 📦
먼저, Node.js를 설치해야 해. Node.js는 자바스크립트를 서버 사이드에서 실행할 수 있게 해주는 런타임 환경이야.
- Node.js 공식 웹사이트(https://nodejs.org)에 접속해.
- LTS(Long Term Support) 버전을 다운로드하고 설치해.
- 설치가 완료되면 터미널(맥) 또는 명령 프롬프트(윈도우)를 열고 다음 명령어로 설치가 제대로 됐는지 확인해봐:
node --version npm --version
🚨 주의: Node.js 버전은 AWS Lambda에서 지원하는 버전과 호환되는지 확인해야 해. 현재(2023년 기준) Lambda는 Node.js 14.x, 16.x, 18.x 버전을 지원해.
2.2 타입스크립트 설치하기 🔧
Node.js를 설치했다면, 이제 타입스크립트를 설치할 차례야.
- 터미널이나 명령 프롬프트를 열고 다음 명령어를 입력해:
npm install -g typescript
- 설치가 완료되면 다음 명령어로 타입스크립트 버전을 확인해봐:
tsc --version
축하해! 🎉 이제 타입스크립트를 사용할 준비가 됐어.
2.3 프로젝트 초기화하기 🚀
이제 우리의 Lambda 함수를 위한 프로젝트를 만들어보자.
- 새로운 디렉토리를 만들고 그 안으로 이동해:
mkdir ts-lambda-project cd ts-lambda-project
- npm으로 프로젝트를 초기화해:
npm init -y
- 타입스크립트 설정 파일(tsconfig.json)을 생성해:
tsc --init
tsconfig.json 파일이 생성됐을 거야. 이 파일을 열어서 다음과 같이 수정해줘:
{
"compilerOptions": {
"target": "es2018",
"module": "commonjs",
"strict": true,
"esModuleInterop": true,
"outDir": "./dist",
"rootDir": "./src"
},
"include": [
"src/**/*"
],
"exclude": [
"node_modules"
]
}
이 설정은 타입스크립트 컴파일러에게 우리 프로젝트의 구조와 컴파일 옵션을 알려주는 거야.
2.4 필요한 패키지 설치하기 📚
Lambda 함수 개발에 필요한 패키지들을 설치해보자.
npm install @types/aws-lambda aws-sdk
npm install --save-dev @types/node typescript
여기서 설치한 패키지들의 역할을 간단히 설명해줄게:
- @types/aws-lambda: AWS Lambda 관련 타입 정의
- aws-sdk: AWS 서비스를 사용하기 위한 SDK
- @types/node: Node.js 관련 타입 정의
- typescript: 타입스크립트 컴파일러
2.5 프로젝트 구조 만들기 🏗️
이제 우리 프로젝트의 기본 구조를 만들어볼 거야.
mkdir src
touch src/index.ts
src 폴더 안에 index.ts 파일을 만들었어. 이 파일이 우리의 Lambda 함수의 진입점이 될 거야.
2.6 package.json 스크립트 추가하기 📝
package.json 파일을 열어서 "scripts" 부분을 다음과 같이 수정해줘:
"scripts": {
"build": "tsc",
"start": "node dist/index.js"
}
이렇게 하면 npm run build
명령어로 타입스크립트를 컴파일하고, npm start
로 컴파일된 자바스크립트를 실행할 수 있어.
🎈 팁: 재능넷같은 플랫폼을 개발할 때도 이런 식으로 프로젝트 구조를 잡으면 좋아. 체계적인 구조는 프로젝트의 확장성과 유지보수성을 높여줘.
와! 🎉 드디어 개발 환경 설정이 끝났어. 이제 우리는 타입스크립트로 AWS Lambda 함수를 작성할 준비가 됐어. 다음 섹션에서는 실제로 첫 번째 Lambda 함수를 작성해볼 거야. 기대되지 않아?
3. 첫 번째 Lambda 함수 작성하기 🖋️
자, 이제 우리의 첫 번째 AWS Lambda 함수를 타입스크립트로 작성해볼 거야. 너무 어렵게 생각하지 마! 우리는 함께 차근차근 해나갈 거니까. 😊
3.1 기본 Lambda 함수 구조 이해하기 🧠
AWS Lambda 함수는 기본적으로 다음과 같은 구조를 가져:
import { APIGatewayProxyHandler } from 'aws-lambda';
export const handler: APIGatewayProxyHandler = async (event, context) => {
// 함수 로직
return {
statusCode: 200,
body: JSON.stringify({ message: 'Hello from Lambda!' }),
};
};
여기서 각 부분이 무슨 의미인지 알아볼까?
- import 문: AWS Lambda 관련 타입을 가져와.
- export const handler: Lambda 함수의 진입점이야. AWS가 이 함수를 호출할 거야.
- APIGatewayProxyHandler: API Gateway를 통해 트리거되는 Lambda 함수의 타입이야.
- async (event, context) => { ... }: 실제 함수 로직이 들어갈 부분이야.
- return { ... }: 함수의 응답을 정의해. statusCode와 body를 포함해야 해.
3.2 간단한 "Hello, World!" Lambda 함수 만들기 👋
자, 이제 우리의 src/index.ts 파일에 첫 번째 Lambda 함수를 작성해보자!
import { APIGatewayProxyHandler } from 'aws-lambda';
export const handler: APIGatewayProxyHandler = async (event, context) => {
try {
// 요청에서 이름 파라미터 가져오기
const name = event.queryStringParameters?.name || 'World';
// 응답 생성
const response = {
message: `Hello, ${name}!`,
timestamp: new Date().toISOString(),
};
return {
statusCode: 200,
body: JSON.stringify(response),
};
} catch (error) {
console.error('Error:', error);
return {
statusCode: 500,
body: JSON.stringify({ message: 'Internal server error' }),
};
}
};
이 함수가 하는 일을 자세히 설명해줄게:
- 먼저, API Gateway에서 전달받은 이벤트 객체에서 쿼리 스트링 파라미터를 확인해. 'name' 파라미터가 있으면 그 값을 사용하고, 없으면 'World'를 기본값으로 사용해.
- 그 다음, 응답 객체를 생성해. 이 객체는 환영 메시지와 현재 타임스탬프를 포함해.
- 마지막으로, 상태 코드 200(성공)과 함께 JSON 형식으로 변환된 응답을 반환해.
- 만약 어떤 에러가 발생하면, catch 블록에서 처리하고 500 에러를 반환해.
💡 알아두면 좋은 점: 타입스크립트를 사용하면 event와 context 객체의 타입을 정확히 알 수 있어서, 어떤 속성과 메서드를 사용할 수 있는지 IDE에서 자동완성 기능을 통해 쉽게 확인할 수 있어. 이건 개발 생산성을 크게 높여주는 타입스크립트의 장점 중 하나야!
3.3 함수 테스트하기 🧪
로컬에서 Lambda 함수를 테스트하려면 약간의 설정이 더 필요해. 우선 간단한 테스트 스크립트를 만들어보자.
src 폴더에 test.ts 파일을 만들고 다음 코드를 작성해:
import { handler } from './index';
async function test() {
const event = {
queryStringParameters: { name: 'TypeScript' },
} as any;
const result = await handler(event, {} as any, () => {});
console.log('Result:', result);
}
test();
이제 package.json에 테스트 스크립트를 추가해:
"scripts": {
"build": "tsc",
"start": "node dist/index.js",
"test": "ts-node src/test.ts"
}
ts-node를 설치하지 않았다면 다음 명령어로 설치해줘:
npm install --save-dev ts-node
이제 다음 명령어로 함수를 테스트할 수 있어:
npm run test
결과가 다음과 비슷하게 나올 거야:
Result: {
statusCode: 200,
body: '{"message":"Hello, TypeScript!","timestamp":"2023-06-10T12:34:56.789Z"}'
}
3.4 함수 최적화하기 🚀
우리의 첫 번째 Lambda 함수가 잘 작동하는 걸 확인했어! 하지만 실제 프로덕션 환경에서는 몇 가지 최적화를 더 해주면 좋아. 예를 들어:
- 에러 처리 개선: 더 자세한 에러 메시지와 로깅을 추가해.
- 입력 유효성 검사: 받은 파라미터의 유효성을 검사해.
- 응답 헤더 추가: CORS 설정 등 필요한 헤더를 추가해.
이러한 최적화를 적용한 버전을 한번 볼까?
import { APIGatewayProxyHandler } from 'aws-lambda';
export const handler: APIGatewayProxyHandler = async (event, context) => {
console.log('Event:', JSON.stringify(event, null, 2));
console.log('Context:', JSON.stringify(context, null, 2));
try {
// 입력 유효성 검사
const name = event.queryStringParameters?.name;
if (name && typeof name !== 'string') {
throw new Error('Invalid name parameter');
}
// 응답 생성
const response = {
message: `Hello, ${name || 'World'}!`,
timestamp: new Date().toISOString(),
};
return {
statusCode: 200,
headers: {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*', // CORS 설정
},
body: JSON.stringify(response),
};
} catch (error) {
console.error('Error:', error);
return {
statusCode: error.message === 'Invalid name parameter' ? 400 : 500,
headers: {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*', // CORS 설정
},
body: JSON.stringify({
message: error.message === 'Invalid name parameter' ? 'Bad Request' : 'Internal Server Error',
errorDetails: process.env.NODE_ENV === 'development' ? error.stack : undefined,
}),
};
}
};
이 최적화된 버전에서는:
- 이벤트와 컨텍스트 객체를 로깅해서 디버깅을 쉽게 만들었어.
- name 파라미터의 유효성을 검사해. 잘못된 타입이 들어오면 에러를 던져.
- 응답 헤더에 CORS 설정을 추가했어. 이렇게 하면 다른 도메인에서도 이 API를 호출할 수 있어.
- 에러 처리를 개선했어. 클라이언트 에러(400)와 서버 에러(500)를 구분하고, 개발 환경에서는 스택 트레이스를 포함시켜.
🌟 Pro Tip: 실제 프로덕션 환경에서는 민감한 정보가 로그에 남지 않도록 주의해야 해. 또한, 에러 메시지나 스택 트레이스를 클라이언트에게 직접 노출하는 것은 보안상 좋지 않을 수 있어. 프로덕션 환경에서는 일반적인 에러 메시지만 반환하고, 상세한 에러 정보는 서버 로그에만 남기는 것이 좋아.
3.5 재능넷에 적용해보기 🌟
좋아, 이제 우리가 만든 Lambda 함수를 재능넷과 같은 실제 프로젝트에 어떻게 적용할 수 있을지 생각해보자. 재능넷은 사용자들이 자신의 재능을 공유하고 거래하는 플랫폼이지? 이런 플랫폼에서 Lambda 함수를 어떻게 활용할 수 있을까?
3.5.1 사용자 프로필 조회 함수 📊
사용자 프로필을 조회하는 Lambda 함수를 만들어보자:
import { APIGatewayProxyHandler } from 'aws-lambda';
import { DynamoDB } from 'aws-sdk';
const dynamodb = new DynamoDB.DocumentClient();
export const handler: APIGatewayProxyHandler = async (event) => {
try {
const userId = event.pathParameters?.userId;
if (!userId) {
throw new Error('User ID is required');
}
const params = {
TableName: 'Users',
Key: { userId },
};
const result = await dynamodb.get(params).promise();
if (!result.Item) {
return {
statusCode: 404,
body: JSON.stringify({ message: 'User not found' }),
};
}
// 민감한 정보 제거
const { password, ...userProfile } = result.Item;
return {
statusCode: 200,
body: JSON.stringify(userProfile),
};
} catch (error) {
console.error('Error:', error);
return {
statusCode: 500,
body: JSON.stringify({ message: 'Internal server error' }),
};
}
};
이 함수는 DynamoDB에서 사용자 정보를 조회하고, 비밀번호와 같은 민감한 정보를 제외한 프로필 정보를 반환해.
3.5.2 재능 검색 함수 🔍
사용자가 특정 키워드로 재능을 검색할 수 있는 함수를 만들어보자:
import { APIGatewayProxyHandler } from 'aws-lambda';
import { DynamoDB } from 'aws-sdk';
const dynamodb = new DynamoDB.DocumentClient();
export const handler: APIGatewayProxyHandler = async (event) => {
try {
const keyword = event.queryStringParameters?.keyword;
if (!keyword) {
throw new Error('Search keyword is required');
}
const params = {
TableName: 'Talents',
FilterExpression: 'contains(#title, :keyword) or contains(#description, :keyword)',
ExpressionAttributeNames: {
'#title': 'title',
'#description': 'description',
},
ExpressionAttributeValues: {
':keyword': keyword.toLowerCase(),
},
};
const result = await dynamodb.scan(params).promise();
return {
statusCode: 200,
body: JSON.stringify(result.Items),
};
} catch (error) {
console.error('Error:', error);
return {
statusCode: 500,
body: JSON.stringify({ message: 'Internal server error' }),
};
}
};
이 함수는 사용자가 입력한 키워드로 재능 데이터베이스를 검색하고 결과를 반환해.
3.5.3 거래 생성 함수 💼
사용자가 재능을 구매할 때 거래를 생성하는 함수를 만들어보자:
import { APIGatewayProxyHandler } from 'aws-lambda';
import { DynamoDB, SQS } from 'aws-sdk';
import { v4 as uuidv4 } from 'uuid';
const dynamodb = new DynamoDB.DocumentClient();
const sqs = new SQS();
export const handler: APIGatewayProxyHandler = async (event) => {
try {
const { buyerId, sellerId, talentId, amount } = JSON.parse(event.body || '{}');
if (!buyerId || !sellerId || !talentId || !amount) {
throw new Error('Missing required fields');
}
const transactionId = uuidv4();
const timestamp = new Date().toISOString();
const transaction = {
transactionId,
buyerId,
sellerId,
talentId,
amount,
status: 'PENDING',
createdAt: timestamp,
};
// DynamoDB에 거래 정보 저장
await dynamodb.put({
TableName: 'Transactions',
Item: transaction,
}).promise();
// 결제 처리를 위해 SQS에 메시지 전송
await sqs.sendMessage({
QueueUrl: process.env.PAYMENT_QUEUE_URL,
MessageBody: JSON.stringify(transaction),
}).promise();
return {
statusCode: 201,
body: JSON.stringify({ message: 'Transaction created', transactionId }),
};
} catch (error) {
console.error('Error:', error);
return {
statusCode: 500,
body: JSON.stringify({ message: 'Internal server error' }),
};
}
};
이 함수는 거래 정보를 생성하고 DynamoDB에 저장한 후, 결제 처리를 위해 SQS 큐에 메시지를 보내.
💡 실제 적용 팁:
- 각 Lambda 함수는 단일 책임 원칙을 따라 하나의 명확한 기능만 수행하도록 설계해.
- 여러 Lambda 함수들을 API Gateway와 연결해서 RESTful API를 구성할 수 있어.
- 보안을 위해 API Gateway에 인증 계층을 추가하는 것을 고려해봐.
- CloudWatch를 사용해 Lambda 함수의 로그와 성능을 모니터링해.
3.6 배포 준비하기 🚀
이제 우리가 만든 Lambda 함수들을 AWS에 배포할 준비를 해보자. 배포 과정은 다음과 같아:
- 코드를 빌드해 (타입스크립트를 자바스크립트로 컴파일)
- 필요한 의존성과 함께 코드를 zip 파일로 압축해
- AWS Lambda 콘솔이나 AWS CLI를 사용해 zip 파일을 업로드해
이 과정을 자동화하기 위해 package.json에 다음과 같은 스크립트를 추가할 수 있어:
"scripts": {
"build": "tsc",
"package": "zip -r function.zip dist node_modules",
"deploy": "aws lambda update-function-code --function-name MyFunction --zip-file fileb://function.zip"
}
이제 npm run build && npm run package && npm run deploy
명령어로 한 번에 빌드, 패키징, 배포를 할 수 있어.
3.7 마무리 🎉
우리는 지금까지 타입스크립트로 AWS Lambda 함수를 작성하는 방법을 배웠어. 기본적인 "Hello, World!" 함수부터 시작해서, 실제 재능넷과 같은 플랫폼에서 사용할 수 있는 실용적인 함수들까지 만들어봤지.
타입스크립트를 사용함으로써 우리는:
- 코드의 안정성을 높였어 (타입 체크로 인한 오류 감소)
- 개발 생산성을 향상시켰어 (자동완성, 리팩토링 도구 등)
- 코드의 가독성과 유지보수성을 개선했어
Lambda와 같은 서버리스 아키텍처를 사용함으로써:
- 인프라 관리에 대한 부담을 줄였어
- 확장성 있는 시스템을 구축할 수 있게 됐어
- 비용 효율적인 운영이 가능해졌어
이제 너희는 타입스크립트와 AWS Lambda를 이용해 강력하고 확장 가능한 백엔드 서비스를 구축할 수 있어. 계속해서 연습하고 실험해보면서 더 복잡한 시스템도 만들어볼 수 있을 거야. 화이팅! 🚀
- 지식인의 숲 - 지적 재산권 보호 고지
지적 재산권 보호 고지
- 저작권 및 소유권: 본 컨텐츠는 재능넷의 독점 AI 기술로 생성되었으며, 대한민국 저작권법 및 국제 저작권 협약에 의해 보호됩니다.
- AI 생성 컨텐츠의 법적 지위: 본 AI 생성 컨텐츠는 재능넷의 지적 창작물로 인정되며, 관련 법규에 따라 저작권 보호를 받습니다.
- 사용 제한: 재능넷의 명시적 서면 동의 없이 본 컨텐츠를 복제, 수정, 배포, 또는 상업적으로 활용하는 행위는 엄격히 금지됩니다.
- 데이터 수집 금지: 본 컨텐츠에 대한 무단 스크래핑, 크롤링, 및 자동화된 데이터 수집은 법적 제재의 대상이 됩니다.
- AI 학습 제한: 재능넷의 AI 생성 컨텐츠를 타 AI 모델 학습에 무단 사용하는 행위는 금지되며, 이는 지적 재산권 침해로 간주됩니다.
재능넷은 최신 AI 기술과 법률에 기반하여 자사의 지적 재산권을 적극적으로 보호하며,
무단 사용 및 침해 행위에 대해 법적 대응을 할 권리를 보유합니다.
© 2025 재능넷 | All rights reserved.
댓글 0개