체인의정석

Nest.js & Cassandra 로 백엔드 세팅해보기 본문

개발/database

Nest.js & Cassandra 로 백엔드 세팅해보기

체인의정석 2023. 11. 14. 10:08
728x90
반응형

1. Nest.js 설치코드

1. Nest 설치

npm install -g @nestjs/cli

2. 설치확인

nest --version

3. netst new "프로젝트이름"

해당 명령어를 쓰게 되면 express generator 처럼 알아서 기본 틀이 만들어지게 된다.

nest new cassandra-server
⚡  We will scaffold your app in a few seconds..

? Which package manager would you ❤️  to use? (Use arrow keys)
❯ npm 
  yarn 
  pnpm

생성된 파일구조는 다음과 같음을 확인할 수 있었다.

  • src/: 소스 코드가 위치하는 주 디렉토리.
    • app.controller.ts: 애플리케이션의 컨트롤러. 요청을 처리하고 응답을 반환합니다.
    • app.controller.spec.ts: 컨트롤러의 단위 테스트 파일.
    • app.module.ts: 애플리케이션의 루트 모듈. NestJS는 모듈 기반 구조를 가지고 있습니다.
    • app.service.ts: 애플리케이션의 서비스 레이어. 비즈니스 로직을 처리합니다.
    • main.ts: 애플리케이션의 엔트리 포인트. NestJS 애플리케이션을 부트스트랩합니다.
  • test/: 테스트 파일들이 위치하는 디렉토리.
  • nest-cli.json: Nest CLI 구성 파일.
  • package.json 및 package-lock.json: npm 의존성과 스크립트를 정의하는 파일들.
  • tsconfig.json: TypeScript 컴파일러 설정 파일.
  • tsconfig.build.json: 빌드용 TypeScript 설정 파일.

해당 구조에서 챗 지피티를 통해 카산드라 DB가 포함된 구조로 다시 설계시켜 보았다.

Cassandra DB를 포함한 구조 설계하기

your-project-name/
│
├── src/
│   ├── cassandra/
│   │   ├── cassandra.module.ts      # Cassandra 모듈
│   │   └── cassandra.service.ts     # Cassandra 서비스
│   │
│   ├── message/
│   │   ├── dto/                      # 데이터 전송 객체 (Data Transfer Objects)
│   │   │   └── create-message.dto.ts # 메시지 생성 DTO
│   │   ├── message.controller.ts     # 메시지 관련 컨트롤러
│   │   ├── message.module.ts         # 메시지 모듈
│   │   └── message.service.ts        # 메시지 관련 서비스
│   │
│   ├── app.controller.ts             # 앱 기본 컨트롤러
│   ├── app.service.ts                # 앱 기본 서비스
│   └── app.module.ts                 # 앱 루트 모듈
│
├── test/                              # 테스트 파일
│
├── nest-cli.json                      # Nest CLI 구성 파일
├── package.json                       # npm 의존성 및 스크립트
├── tsconfig.json                      # TypeScript 컴파일러 설정
└── tsconfig.build.json                # 빌드용 TypeScript 설정
  • cassandra.module.ts: Cassandra와 관련된 서비스를 모아놓은 모듈입니다. 필요한 의존성을 주입하는 데 사용됩니다.
  • cassandra.service.ts: Cassandra 데이터베이스와의 상호작용을 관리하는 서비스입니다. 데이터베이스 연결 및 쿼리 실행 등을 담당합니다.
  • message.module.ts: 메시지 관련 기능을 모아놓은 모듈입니다. 메시지 관련 컨트롤러와 서비스를 포함합니다.
  • message.controller.ts: 메시지 관련 HTTP 요청을 처리하는 컨트롤러입니다. POST 요청을 받아 메시지를 저장하는 기능을 포함합니다.
  • message.service.ts: 메시지 관련 비즈니스 로직을 처리하는 서비스입니다. 이 서비스는 Cassandra 서비스를 사용하여 데이터를 저장합니다.
  • create-message.dto.ts: 클라이언트로부터 받는 메시지 데이터의 구조를 정의하는 DTO입니다.

모듈 구조의 중요성

NestJS는 모듈 기반 구조를 채택하고 있으므로, 각 기능별로 모듈을 분리하여 관리하는 것이 좋습니다. 이렇게 하면 각 기능의 관심사를 분리하고, 의존성을 관리하기 쉬워집니다.

  • Cassandra 모듈: 데이터베이스 관련 로직을 캡슐화합니다.
  • Message 모듈: 메시지 관련 기능을 캡슐화하고, Cassandra 모듈과의 상호작용을 관리합니다.

이러한 구조는 프로젝트의 확장성과 유지보수성을 향상시키는 데 도움이 됩니다.

카산드라와 Nest를 접목한 코드

cassandra.module.ts

// src/cassandra/cassandra.module.ts

import { Module } from '@nestjs/common';
import { CassandraService } from './cassandra.service';

@Module({
  providers: [CassandraService],
  exports: [CassandraService], // 다른 모듈에서도 사용할 수 있도록 서비스를 export 합니다.
})
export class CassandraModule {}

Cassandra 모듈은 Cassandra와의 상호작용을 관리합니다. 이 모듈은 Cassandra 서비스를 제공합니다.

cassandra.service.ts

// src/cassandra/cassandra.service.ts

import { Injectable } from '@nestjs/common';
import { Client } from 'cassandra-driver';

@Injectable()
export class CassandraService {
  private client: Client;

  constructor() {
    this.client = new Client({
      contactPoints: ['127.0.0.1'],
      localDataCenter: 'datacenter1',
      keyspace: 'your_keyspace',
    });
  }

  // 예시 함수: Cassandra 데이터베이스에 데이터를 저장합니다.
  async save(data: any): Promise<void> {
    const query = 'INSERT INTO your_table (id, data) VALUES (uuid(), ?)';
    await this.client.execute(query, [data], { prepare: true });
  }

  // 기타 필요한 Cassandra 상호작용 메서드를 추가합니다.
}

Cassandra 서비스는 Cassandra 데이터베이스와의 실제 상호작용을 처리합니다.

 

2. Message 모듈

message.module.ts

// src/message/message.module.ts

import { Module } from '@nestjs/common';
import { MessageService } from './message.service';
import { MessageController } from './message.controller';
import { CassandraModule } from '../cassandra/cassandra.module';

@Module({
  imports: [CassandraModule], // Cassandra 모듈을 import합니다.
  controllers: [MessageController],
  providers: [MessageService],
})
export class MessageModule {}

Message 모듈은 메시지와 관련된 기능을 관리합니다. 이 모듈은 메시지 관련 서비스와 컨트롤러를 포함합니다.

 

Message 서비스는 메시지와 관련된 비즈니스 로직을 처리합니다.

message.service.ts

Message 서비스는 메시지와 관련된 비즈니스 로직을 처리합니다.

// src/message/message.service.ts

import { Injectable } from '@nestjs/common';
import { CassandraService } from '../cassandra/cassandra.service';

@Injectable()
export class MessageService {
  constructor(private cassandraService: CassandraService) {}

  async saveMessage(message: string): Promise<void> {
    // Cassandra 서비스를 사용하여 메시지를 저장합니다.
    await this.cassandraService.save(message);
  }
}
 

message.controller.ts

// src/message/message.service.ts

import { Injectable } from '@nestjs/common';
import { CassandraService } from '../cassandra/cassandra.service';

@Injectable()
export class MessageService {
  constructor(private cassandraService: CassandraService) {}

  async saveMessage(message: string): Promise<void> {
    // Cassandra 서비스를 사용하여 메시지를 저장합니다.
    await this.cassandraService.save(message);
  }
}

Message 컨트롤러는 클라이언트로부터 메시지와 관련된 요청을 받고, 응답을 반환합니다.

 

*출처 : 챗지피티

 
728x90
반응형
Comments