Nestjs와 DB 연동

chanykim·2021년 7월 21일
0

1. DB 설치

DB는 MYSQL을 이용한다.
https://dev.mysql.com/downloads/mysql/
이사이트에 들어가 다음과 같이 설치한다.


다운로드하라고 나오는데 그냥 무시하고 No thanks, just start my download.를 클릭해서 다운 받는다.

그 후 다른 거 선택하는거 없이 무난히 설치한다.

2. Nestjs에서의 DB

출처: https://docs.nestjs.kr/techniques/database
https://ukcasso.tistory.com/64

MySQL, TypeORM을 설치해 준다.
MySQL과 MySQL2의 차이점은 바로 promise이다. mysql은 callback기반이기 때문에 promise를 사용하지 못하고 npm에 있는 promise-mysql 모듈을 따로 설치해서 사용해야한다. 하지만 mysql2는 promise를 지원하기 때문에 다른 모듈을 설치하지 않고 사용이 가능하다.

$ npm i --save @nestjs/typeorm typeorm mysql2

BD 연결

mysql이 존재해야 연결에 성공할 수 있다.
처음에 mysql을 설치 안하고 왜 안되지? 하고 있었다...

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'mysql',
      host: 'localhost',
      port: 3306,
      username: 'movies',
      password: '1q2w3e4r',
      database: 'movies',
      entities: [],
      synchronize: true,
    }),
  ],
})
export class AppModule {}

이런 식으로 쓸건데 나중에 mysql에 database를 만들 때 DB명과 database가 맞아야하고 권한설정 할 때도 password가 맞아야한다.
안그러면
이러한 오류가 뜨게 된다.
권한 설정을 못해줬기 때문이다.

권한 설정 방법

  1. CREATE USER movies@localhost identified by '1q2w3e4r';
  2. GRANT ALL PRIVILEGES ON *.* TO 'movies'@'localhost';
  3. flush privileges;

3. csv파일을 DB에 import

먼저 csv파일을 만든다.
내용은 그냥 아무거나 생각나는대로 집어넣었다.

mysql workbench에서 movies schema를 만들고, 오른쪽 클릭을 하여 table data import wizard를 클릭한다.

그러면 import하려는 csv파일이 어디 있는지 찾으라고 하는데 파일경로에 한글이 있으면 안된다.
그리고 csv파일이 맞는지도 확인하고 계속 넘어가면 된다.

확인하기 위해 명령어인 SELECT * FROM movies;를 입력하면 다음과 같이 들어가 있는 것을 확인할 수 있다.

4. DB에 저장된 내용을 웹페이지에 뿌려보기

다른 table을 만들어서 집현전 책들이 저장된 csv를 DB에 넣었다.

그러면 이제 어떻게 해야하나.

내장된 CRUD 컨트롤러를 빠르게 생성하려면 CLI의 CRUD 생성기: nest g resource [name]을 사용하여 books를 만든다.

books.controller에

@Controller('books')
export class BooksController {
  constructor(private readonly booksService: BooksService) { }

  @Get('search')
  search(@Query('title') searchingTitle: string): Promise<Books> {
    return this.booksService.searchOne(searchingTitle);
  }
  ...
  ...

이런식으로 search를 만든다.
그리고 @Controller안에 books이 있는데 안에 들어간 문자는 localhost:3000/books 이렇게 사용할 수 있게 된다.

그리고 실질적으로 작동하는 곳인 books.sersvice에서는

@Injectable()
export class BooksService {
  constructor(
    @InjectRepository(Books)
    private readonly usersRepository: Repository<Books>,
  ) { }
  searchOne(title: string): Promise<Books | undefined> {
    const bookinfo = getRepository(Books)
      .createQueryBuilder("title")
      .where("title = :title", { title: title })
      .getOne();
    return bookinfo;
  }
  ...
  ...

이렇게 만들면 http://localhost:3000/books/search?title=공부논쟁

이런 식으로 DB에 title열에서 찾아서 뿌려줄 수 있다.

profile
오늘보다 더 나은 내일

2개의 댓글

comment-user-thumbnail
2021년 8월 1일

글 잘봤습니다! 글 보고 코드 따라쳐보고싶은데 코드 알려주실수있을까요?
제가 서버연결은 되는거같은데 404에러로 결과가 안나와서요ㅠ
답변 주시면 감사하겠습니다!

1개의 답글