폴더 구조

 


결과 화면

 


1. 패키기 설치하기

npm install @nestjs/typeorm typeorm pg

npm install -g ts-node

터미널에서 위의 명령어를 실행해 패키지를 설치한다.

ts-node 패키지가 전역으로 설치되어 있다면 추가로 설치할 필요는 없다.

 

2. typeorm.config.ts

  • src/config/typeorm.config.ts

해당 경로에 typeorm.config.ts 파일을 만든다.

로컬 또는 서버에서 만든 데이터베이스 정보를 입력한다.

import { TypeOrmModuleOptions } from '@nestjs/typeorm';

export const typeOrmConfig: TypeOrmModuleOptions = {
  type: 'postgres',
  host: '_HOST_',
  port: _DATABASE_PORT_,
  username: '_USER_NAME_',
  password: '_DATABASE_PASSWORD_',
  database: 'postgres',
  entities: [__dirname + './../**/*.entity.{js,ts}'],
  logging: true
};

 

2-1. 데이터베이스

참고, 로컬에 아래 사진처럼 PSQL 데이터베이스를 만들었다.

psql 테이블 만드는 법

 

 

3. app.module.ts에 TypeORM import 하기

@Module imports 부분에 TypeOrmModule.forRoot(typeOrmConfig) 모듈을 추가한다.

board.module.ts 파일이 생겼기 때문에 controllers와 providers가 중복이 되어 안에 리스트를 삭제한다.

import { Module } from '@nestjs/common';
import { BoardModule } from './board/board.module';
import { TypeOrmModule } from "@nestjs/typeorm";
import { typeOrmConfig } from "./config/typeorm.config";

@Module({
  imports: [BoardModule, TypeOrmModule.forRoot(typeOrmConfig)],
  controllers: [],
  providers: []
})

export class AppModule {}

 

5. board.entity.ts

  • src/board/entities/board.entity.ts

데이터베이스 엔티티를 작성한다.

데이터베이스 컬럼에 따라 엔티티는 다르다.

import { BaseEntity, Entity, PrimaryGeneratedColumn, Column } from 'typeorm';

@Entity('board_table')
export class BoardEntity extends BaseEntity {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  title: string;

  @Column()
  content: string;

  @Column()
  created_at: Date;

  @Column()
  updated_at: Date;
}

 

5. create-board.dto.ts, update-board.dto

DTO(Data Transfer Object)는 데이터가 네트워크를 통해 전송되는 방법을 정의하는 개체이다.

Typescript 인터페이스나 간단한 클래스를 사용해서 DTO 스키마를 정의할 수 있고, 컴파일 과정에서도 엔티티를 보존하기 위해서 클래스를 선호한다.

 

  • src/board/dto/create-board.dto.ts
export class CreateBoardDto {
  id: number;
  title: string;
  content: string;
  created_at: Date;
  updated_at: Date;
}

 

  • src/board/dto/update-board.dto
import { PartialType } from '@nestjs/mapped-types';
import { CreateBoardDto } from './create-board.dto';

export class UpdateBoardDto extends PartialType(CreateBoardDto) {
  id: number;
  title: string;
  content: string;
  created_at: Date;
  updated_at: Date;
}

 

6. board.repository.ts 파일 만들기

https://typeorm.io/working-with-repository

https://orkhan.gitbook.io/typeorm/docs/custom-repository

TypeORM Custom repositories에 대한 설명의 위의 공식 문서를 참고한다.

 

  • src/board/board.repository.ts

사용자 정의 레포지토리를 만들고, create, findAll, findOne, update, remove에 해당하는 함수를 만든다. (함수명은 상관없다.)

create, save, finde 등 다양한 메소드들을 제공한다.

import { EntityRepository, Repository, DataSource } from 'typeorm';
import { BoardEntity } from './entities/board.entity';

@EntityRepository()
export class BoardRepository extends Repository<BoardEntity> {
  constructor(private readonly datasource: DataSource) {
    super(BoardEntity, datasource.createEntityManager())
  }

  // @Post()
  async createByBoard(createBoardDto): Promise<BoardEntity[]> {
    const newBoard = this.create(createBoardDto)

    return await this.save(newBoard)
  }

  // @Get()
  async findAllByBoard(): Promise<BoardEntity[]> {
    return await this.find()
  }

  // @Get(':id')
  async findOneByBoardId(id: number): Promise<BoardEntity> {
    return await this.findOne({
      where: {
        id
      }
    })
  }

  // @Patch
  async updateByBoard(id, updateBoardDto): Promise<BoardEntity> {
    await this.update(id, updateBoardDto)

    return await this.findOne({
      where: {
        id
      }
    })
  }

  // @Delete
  async removeByBoard(id): Promise<void> {
    await this.delete(id)
  }
}

 

7. board.service.ts

board.repository.ts에서 만든 함수들을 return한다.

import { Injectable } from '@nestjs/common';
import { BoardRepository } from './board.repository';
import { CreateBoardDto } from './dto/create-board.dto';
import { UpdateBoardDto } from './dto/update-board.dto';

@Injectable()
export class BoardService {
  constructor(
      private readonly boardRepository: BoardRepository,
  ) {}

  create(createBoardDto: CreateBoardDto) {
    return this.boardRepository.createByBoard(createBoardDto)
  }

  findAll() {
    return this.boardRepository.findAllByBoard()
  }

  findOne(id: number) {
    return this.boardRepository.findOneByBoardId(id)
  }

  update(id: number, updateBoardDto: UpdateBoardDto) {
    return this.boardRepository.updateByBoard(id, updateBoardDto)
  }

  remove(id: number) {
    return this.boardRepository.removeByBoard(id)
  }
}

 

8. board.controller.ts

Get, Post 등 axios 메서드를 작성한다.

import { Controller, Get, Post, Body, Patch, Param, Delete } from '@nestjs/common';
import { BoardService } from './board.service';
import { CreateBoardDto } from './dto/create-board.dto';
import { UpdateBoardDto } from './dto/update-board.dto';

@Controller('board')
export class BoardController {
  constructor(private readonly boardService: BoardService) {}

  @Post()
  create(@Body() createBoardDto: CreateBoardDto) {
    return this.boardService.create(createBoardDto);
  }

  @Get()
  findAll() {
    return this.boardService.findAll();
  }

  @Get(':id')
  findOne(@Param('id') id: string) {
    return this.boardService.findOne(+id);
  }

  @Patch(':id')
  update(@Param('id') id: string, @Body() updateBoardDto: UpdateBoardDto) {
    return this.boardService.update(+id, updateBoardDto);
  }

  @Delete(':id')
  remove(@Param('id') id: string) {
    return this.boardService.remove(+id);
  }
}

 

9. board.module.ts

  • src/board/board.module.ts

만든 컨트롤러, 서비스, 레포지토리를 연결한다.

import { Module } from '@nestjs/common';
import { BoardService } from './board.service';
import { BoardController } from './board.controller';
import { BoardRepository } from './board.repository';

@Module({
  controllers: [BoardController],
  providers: [BoardService, BoardRepository],
})
export class BoardModule {}

 

10. 불필요한 파일 삭제하기

app.controller.ts, app.service.ts 등 사용하지 않는 파일이 있다면 삭제한다.

※app.module.ts 파일은 삭제하면 안된다. (모듈을 import, export 하기 때문에)※

※윈도우 10 64bit, PostgreSQL Version 15.3, DBeaver 기준으로 작성된 글입니다.※

 

데이터 추가하기

insert into 테이블명 values(column1, column2, ...)

insert into user_table values(1, '이희재');

 

 

데이터 수정하기

update 테이블명 set 컬럼명 = 수정된 값 where 컬럼명 = 수정할 값;

update user_table set name = '희재' where name = '이희재';

 

 

데이터 삭제하기

delete from 테이블명 where 컬럼 = 데이터;

delete from user_table where name = '희재';

 

※윈도우 10 64bit, PostgreSQL Version 15.3, DBeaver 기준으로 작성된 글입니다.※

 

기본키 설정하기

alter table 테이블명 add constraint 기본키 제약조건 이름 primary key(기본키로 설정할 컬럼명);

alter table user_table add constraint pk_user_id primary key(id);

 

 

기본키 삭제하기

alter table 테이블명 drop constraint 기본키 제약조건 이름;

alter table user_table drop constraint pk_user_id;

 

 

외래키 설정하기

외래키를 설정하기 위해서는 참조할 테이블이 있어야 하기 때문에 테이블이 2개 이상이어야 한다.

 

alter table 테이블명 add constraint 외래키 제약조건 이름 foreign key(외래키로 설정할 컬럼명) references 참조할 테이블명(참조 테이블 컬럼명);

alter table user_table add constraint fk_user_id foreign key(id) references board_table(id);

 

 

외래키 삭제하기

alter table 테이블명 drop constraint 외래키 제약조건 이름;

alter table user_table drop constraint fk_user_id;

 

※윈도우 10 64bit, PostgreSQL Version 15.3, DBeaver 기준으로 작성된 글입니다.※

 

컬럼 생성

alter table 테이블명 add 컬럼명 데이터타입;

alter table user_table add id integer;

 


컬럼 수정

alter table 테이블명 rename column 컬럼명 to 새로운 컬럼명;

alter table user_table rename column age to phone_number;

 

 

컬럼 삭제

alter table 테이블명 drop column 컬럼명;

alter table user_table drop column phone_number;

 

※윈도우 10 64bit, PostgreSQL Version 15.3, DBeaver 기준으로 작성된 글입니다.※

 

디비버 상단 메뉴 SQL 편집기 - SQL 편집기 또는 단축키 F3을 누르면 sql을 작성할 수 있는 script 창이 나타난다.

코드 괄호 안에서 ctrl + enter을 누르면 코드가 실행된다.

세미콜론으로 코드가 끝났는지 구분한다.

 

테이블 생성

create table 테이블명 (column1, column2, ...);

create table user_data (
	name varchar(10),
	age integer
);

 

 

테이블 수정

alter table 테이블명 rename to 새로운 테이블명;

alter table user_data rename to user_table;

 

 

테이블 삭제

drop table 테이블명;

drop table user_table;

 

 

※윈도우 10 64bit, PostgreSQL Version 15.3, DBeaver 기준으로 작성된 글입니다.※

 

DBeaver 설치하기 

https://dbeaver.io/

데이터베이스 도구가 없다면 위의 사이트에 접속한 후, Download 페이지에서 운영체제에 맞는 DBeaver를 설치한다.

 

DBeaver에서 PostgreSql 연결하기

1. 상단 메뉴의 플러그를 클릭하고, PostgreSQL을 선택한다.

 

2. Username과 Password(슈퍼유저 비밀번호)를 입력하고, Test Connection을 눌렀을 때 Connected 메시지가 나오면 연결에 성공한 것이다.

 

3. 데이터베이스 연결에 성공하면 초록색 체크박스가 나타나고, 실패하면 빨간색 엑스박스가 나타난다.

PostgreSQL(psql)이란,

PostgreSQL은 확장 가능성 및 표준 준수를 강조하는 오픈 소스 객체-관계형 데이터베이스 관리 시스템(QRDBMS)이다.

PostgreSQL은 1986년 만들어진 이후로 지금까지 활발하게 개발되고 있고, 이로 인해 안정성, 데이터 무결성, 확장성 및 강력한 성능을 가지고 있다.

소규모의 애플리케이션부터 수많은 동시 접속 사용자가 있는 대형의 애플리케이션까지 관리할 수 있고, 데이터베이스 성능은 Oracle, SQL Server와 유사하다.

MacOS 서버의 경우 PostgreSQL은 기본 데이터베이스며, Windows, Linux, BSD, Solaris와 같은 운영체제에서 엑세스할 수 있다.

 


PostgreSQL 설치하기

※윈도우 10 64bit, PostgreSQL Version 15.3 기준으로 작성된 글 입니다.

 

1. 아래 사이트에 접속한 후, Download 페이지에서 운영체제에 맞는 PostgreSQL을 설치한다.

https://www.postgresql.org/

 

2. PostgreSQL 실행 파일 다운로드가 완료되면 설치한다. 

주의: 데이터베이스 슈퍼유저 비밀번호는 PostgreSQL 데이터베이스를 만들 때 필요하기 때문에 잘 기억해야 한다.

 

3. 설치가 완료되면 SQL Shell을 실행시키고, Server, Database, Port, Username, postgres 사용자의 암호(슈퍼유저 비밀번호)를 입력한다.

암호를 제외하고 그냥 앤터만 해도 된다.

psql 버전이 나오면 정상적으로 설치가 완료됐다.

+ Recent posts