Dynamo DB + NestJS 한글 버젼이 없어서 남김
(앗싸 조회수🔺)
Dynamo DB는 AWS의 대표적인 NoSQL 기반 데이터베이스이다.
NoSQL은 정형화된 데이터를 저장하는 RDB와는 다르게 비정형 데이터를 처리한다.
dynamoose 패키지를 설치한다.
https://www.npmjs.com/package/nestjs-dynamoose
npm install --save nestjs-dynamoose dynamoose
// app.module.ts
import { DynamooseModule } from 'nestjs-dynamoose';
import { DynamooseConfigService } from './dynamoose-config.service';
@Module({
imports: [
DynamooseModule.forRootAsync({ useClass: DynamooseConfigService }),
....
],
})
export class AppModule {}
// dynamoose-config.service.ts
import {
DynamooseOptionsFactory,
DynamooseModuleOptions,
} from 'nestjs-dynamoose';
export class DynamooseConfigService implements DynamooseOptionsFactory {
createDynamooseOptions(): DynamooseModuleOptions {
return {
aws: {
// .env에 선언해야 보안상 좋음
accessKeyId: AWS 액세스 키,
secretAccessKey: AWS 시크릿 액세스 키, // 처음 액세스 키 만들 때 말고는 aws-cli로 쳐서 따로 봐야 하니 기록해둘 것
region: 리젼,
},
};
}
}
// user-info.interface.ts
export interface UserInfoKey {
user_id: string; // hashKey(파티션 키)
user_idx: number; // rangeKey(정렬 키)
}
export interface User extends UserInfoKey {
user_email?: string;
}
// user-info.schema.ts
import { Schema } from 'dynamoose';
export const UserInfoSchema = new Schema(
{
user_id: {
type: String,
hashKey: true,
required: true,
},
user_idx: {
type: Number,
rangeKey: true,
},
user_email: {
type: String,
},
},
{
timestamps: true, // createdAt, updateAt 컬럼
/* 이렇게 쓸 수도 있음
timestamps: {
* "createdAt": "createDate",
* "updatedAt": null // updatedAt will not be stored as part of the timestamp
* }
*/
},
);
module에 사용할 table, schema를 추가한다.
// user.module.ts.
import { DynamooseModule } from 'nestjs-dynamoose';
import { UserInfoSchema } from './schema/user-info.schema';
...
@Module({
imports: [
DynamooseModule.forFeature([
{ name: 'UserInfo', schema: UserInfoSchema },
]),
...
],
controllers: [UserController],
providers: [
UserService,
...
],
});
export class UserModule {}
controller, service를 작성한다.
// user.controller.ts
@Post('/user/:user_id')
saveUserInfo(
@Param('user_id') user_id: string,
@Body('user_idx') user_idx: number,
@Body('user_email') user_email: string,
) {
return this.userService.saveUserInfo(
user_id,
user_idx,
user_email,
);
}
// user.service.ts
import { InjectModel, Model } from 'nestjs-dynamoose';
import {
UserInfo,
UserInfoKey,
} from './interfaces/user-info.interface';
export class UserService {
constructor(
@InjectModel('UserInfo')
private userInfoModel: Model<UserInfo, UserInfoKey>,
) {}
async saveUserInfo(
user_id: string,
user_idx: number,
user_email: string,
) {
const userData = {
user_id,
user_idx,
user_email,
};
return this.userInfoModel.create(userData);
}
}
@InjectModel('UserInfo')
private userInfoModel: Model<UserInfo, UserInfoKey>,
const userData = {
user_id,// 파티션 키
user_idx,// 정렬 키
user_email, // 데이터
};
this.userInfoModel.create(userData);
// 파티션 키, 정렬 키(있다면) 둘다 써줘야함
this.userInfoModel.get({ user_id, user_idx });
this.userInfoModel.update(userData);
this.userInfoModel.delete({ user_id, user_idx });
빠른 정리 끝!
다이나모 DB에서 테이블은 생성하고 데이터를 집어넣어야 하나봅니다.
스키마를 코드로 미리 작성하고 테이블이 없는 상태에서 데이터를 넣을 시는 에러가 발생하네용ㅋㅋ