1. 설치 : nestjs, typeorm db드라이버(mssql, mysql... 등)

npm install @nestjs/typeorm typeorm mssql mysql...

npm install ts-node -g //옵션

 

2. 

ormconfig.json 파일 생성 : typeorm 설정,

데이터 베이스 연결 정보를 정의 https://github.com/typeorm/typeorm/blob/master/docs/connection-options.md#cordova-connection-options

{
    "type""mssql",    
    "host""localhost"
    "port"1433
    "username""admin"
    "password""admin"
    "database""AdminDB"
    "entities": ["dist/**/*.entity.js"],
    "logging"true,    
    "synchronize"true
}

 

{
"type": "postgres",
"host": _DB_HOST_,
"port": _DB_PORT_,
"username": _DB_USER_,
"password": _DB_PASSWORD_,
"database": _DB_NAME_,
"extra": {
"ssl": {
"rejectUnauthorized": false
}
},
"synchronize": true, // 초기에 자동으로 sql table 생성
"logging": false,
"entities": [
"src/**/*.entity.ts" //중요
],
"migrations": [
"src/migration/**/*.ts"
],
"subscribers": [
"src/subscriber/**/*.ts"
],
"cli": {
"migrationsDir": "src/migration",
"subscribersDir": "src/subscriber"
}
}

 

3. entity를 선언 : nullable한 값은 ?, 필수적인 컬럼은 !, 관계가 있을 경우 설정

@Entity()
export class User extends BaseEntity {
@PrimaryGeneratedColumn()
id!: number;
@Column({ nullable: false })
firstName!: string;
@Column({ nullable: false })
lastName!: string;
@Column()
age?: number;
}

 

4. entity 관련 repository 선언 : repository가 실질적으로, user table에 대한 CRUD 메소드 소유 및 조작 가능 // src/user/user.repository.ts

import { EntityRepository, Repository } from "typeorm";

import { User } from "./user.entity";

@EntityRepository(User)

export class UserRepository extends Repository<User> {

}

 

5. entity 관련 module, service, controller 생성 : service, controller내에서, repository사용가능하도록 module 내에서, import

$ nest generate module user
$ nest generate service user
$ nest generate controller user

... user.module.ts

imports: [
    TypeOrmModule.forFeature([TaskRepository, CommentRepository, UipathProcessRepository, UserRepository])
  ],
controllers: [UserController],
providers: [UserService]
 
... app.module.ts
imports:[UserModule, ... ,TypeOrmModule.forRoot()]
 
6. entity 관련 dto interface 작성 : entity에서 변하는 값 위주로만 작성
//src/user/user.dto.tsexport class UserDto {    firstName!: string;    lastName!: string;    age?: number;

 

}
7. service 내용 CRUD 작성
...import { UserRepository } from "./user.repository";@Injectable()export class UserService {    constructor(        @InjectRepository(User) private readonly userRepository: UserRepository    ) { }    createOneUser(createUserDto: UserDto) {        return this.userRepository.create(createUserDto).save();    }    getUserList() {        return this.userRepository.find({            select: ["id", "firstName", "lastName", "age"],        });    }    getDetailUser(id: number) {        return this.userRepository.findOne(id);    }    updateUser(id: number, updateUserDto: UserDto) {        return this.userRepository.update(id, updateUserDto);    }    removeOneUser(id: number) {        return this.userRepository.delete(id);    }

 

}
8. Controller 내용 Api 작성 : 입력값은 Dto 형태로 받음, 결과값은 User.Entity 형태로 나감...import { UserService } from "./user.service";import { UserDto } from "./user.dto";
@Controller("users")export class UserController {    constructor(private readonly userService: UserService) { }    @Post()    async create(@Body() createUserDto: UserDto) {        const result = await this.userService.createOneUser(createUserDto);        return result;    }    @Get()    async getList() {        const result = await this.userService.getUserList();        return result;    }    @Get(":id")    async getOne(@Param("id") userId: number) {        const result = await this.userService.getDetailUser(userId);        return result;    }    @Put(":id")    async setOne(@Param("id") userId: number, @Body() updateUserDto: UserDto) {        const result = await this.userService.updateUser(userId, updateUserDto);        return result;    }    @Delete(":id")    async removeOne(@Param("id") userId: number) {        const ret = await this.userService.removeOneUser(userId);        return ret;    }

 

}

출처 :

https://medium.com/@feedbotstar/nest-js-typeorm-postgresql-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-153c3a55aba1

 

Typeorm.json : 기본적인 형태, entities 속성 주읭

{

    "type": "mssql",    

    "host": "localhost", 

    "port": 1433, 

    "username": "admin", 

    "password": "admin", 

    "database": "AdminDB", 

    "entities": ["dist/**/*.entity.js"],

    "logging": true,    

    "synchronize": true

}

 

UserEntity.ts : User(1) : Books(N) 일 경우

// 1:n relation with bookEntity 

  @OneToMany( type => BookEntity , book => book.user

//Book table내에서도 user에 대한 관계가 있을 경우 뒷부분 추가

//Book Table 내에서 역으로 User를 알필요가 없을 경우에는, 굳이 book에 user를 추가할 필요가 없다.

  books: BookEntity[];

 

BookEntity.ts : Books(N) : User(1) 일 경우 / Books(N) : Genres(N) 일 경우

// n:1 relation with books

  @ManyToOne(type => UserEntity, user => user.books) //User에 정의된 books와 같은 관계를 의미

  user: UserEntity;

Similarly, to make a many-to-many relationship between BookEntity and GenreEntity, we have to add the following code:

 

// n:n relation with genre

  @ManyToMany(type => GenreEntity) //내부적으로 새로운 테이블 생성이된다. Book_Genre_관계이름, 

  @JoinTable() //Genre는 Type일 뿐이고, Main은 Book에서 사용하므로, JoinTable

  genres: GenreEntity[]; 

 

UserDto : 관계가 있을 경우

export default class CreateUserDto {

  readonly name: string;

  readonly books: number[] ;

}

 

BookDto : 관계가 있을 경우

export default class CreateBookDto {

  readonly name: string;

  readonly userID: number;

  readonly genreIDs: number[];

}

 

GenreDto : 관계가 없이 기본일 경우

export default class CreateGenreDto {

  readonly type: string;

}

 

BookService : 관계가 존재하는 Book에서, User값 넣기(User에 존재하는 값만 넣을 수 있음)

async insert(bookDetails: CreateBookDto): Promise<BookEntity> {

    const { name , userID , genreIDs } = bookDetails;

    const book = new BookEntity();

    book.name = name;

    book.user = await UserEntity.findOne(userID) ;

    book.genres=[];

    for ( let i = 0; i < genreIDs.length ; i++)

    {

             const genre = await GenreEntity.findOne(genreIDs[i]);

             book.genres.push(genre);

    }

    await book.save();

    return book;

 

  }

 

UserController : User내에 있는 타테이블 관련 관계 속성값 불러오기

//'getBooks()' return all the books which are associated with the user 

// provided through 'userID' by the request  

  @Get('books')

  getBooks( @Body('userID', ParseIntPipe) userID: number ) {

    return this.usersServices.getBooksOfUser(userID);

  }

 

UserService : 관계가 존재하는 User의 개별 값 조회해오기

  async insert(userDetails: CreateUserDto): Promise<UserEntity> {

    const userEntity: UserEntity = UserEntity.create();

    const {name } = userDetails;

    userEntity.name = name;

    await UserEntity.save(userEntity);

    return userEntity;

 

  }

async getBooksOfUser(userID: number): Promise<BookEntity[]> {

    console.log(typeof(userID));

    const user: UserEntity = await UserEntity.findOne({where: {id: userID}, relations: ['books']});

    return user.books;

 

  }

 

출처 : 

https://codersera.com/blog/typeorm-with-nest-js-tutorial/

 

Swagger Ui 추가

npm install --save @nestjs/swagger swagger-ui-express

 

import { ApiProperty } from '@nestjs/swagger';

export class CreateTodoDto {

  @ApiProperty()

  readonly id: number;

 

  @ApiProperty()

  readonly text: string;

 

  @ApiProperty()

  readonly complete: boolean;

}

출처 :

https://codebrains.io/nestjs-with-typeorm-building-a-rest-api/

 

# nest.js를 heroku 서비스를 통해 배포할 경우, heroku postgres db와 연동하는 법

https://dev.to/baharajr/deploying-a-nestjs-app-with-typeorm-postgresql-on-heroku-55n1

 

 

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기