Nest. DB, Table 생성 및 value CRUD

cm·2024년 1월 18일

Nest

목록 보기
4/7

Nest. Table 생성 및 CRUD

1. DataBase 생성


2. Table 생성

Entity 정의

  • Entity 정의 후 사용할 module에 imports한다.
    imports: [TypeOrmModule.forFeature([엔터티명])

3. value CRUD

Entity 조작방법

  private readonly entityManager: EntityManager,
  private readonly dataSource: DataSource,
  @InjectRepository(User) private userRepository: Repository<User>,
  • EntityManager, DataSource : 전체 Entity 대상 (유연성 👍🏻)
    • EntityManager : 여러개의 Entity를 한꺼번에 관리하여 다뤄준다.
    • DataSource : Entity (즉, MySQL)
  • Repository : 특정 Entity 하고만 응집된다. (응집력 👍🏻)


3-1. Create

  • DTO 정의 : DTO를 정의하여 클라이언트에서 전송된 값을 적절한 형식으로 받는다.
  • Entity에 저장: DTO에서 받은 값을 가지고 데이터베이스에 저장할 Entity에 대응하는 객체를 생성한다.
  • Repository에 추가: 생성된 엔터티를 데이터베이스와 상호작용하는 Repository에 추가하여 데이터베이스에 실제로 저장한다.
// DTO를 미리 정의해놓는다.
// DTO에서 받을 값을 가지고 Entity에 대응하는 객체를 생성한다.
// 객체를 Repo에 추가한다.
const user = new User();
const { name, email, password } = createUserDto;
user.name = name;
user.email = email;
user.password = password;
return this.entityManager.save(user);
return this.userRepository.save(user)
return this.entityManager.save(user);
return this.dataSource.getRepository(User).save(user);
return this.dataSource.createQueryRunner().manager.save(user);

3-2. Read

  • Repository 사용: Repository를 사용하여 데이터베이스에서 원하는 데이터를 조회한다.
  • DTO 반환: 조회한 데이터를 클라이언트에 보낼 때, 필요한 정보만을 포함하는 DTO로 변환하여 반환한다.
// 전체 조회
return this.userRepository.find({where: {id}})
return this.entityManager.find(User)
return this.entityManager.findBy(User, {id}); // return arry
return this.dataSource.getRepository(User).find()

// 특정값 조회
return this.userRepository.findOne({where: {id}});
return this.entityManager.findOne(User, {where:{id}});
return this.entityManager.findOneBy(User, {id}); // return element 

EntityManager의 find vs findBy

    /**
     * Finds entities that match given find options.
     */
    find<Entity extends ObjectLiteral>(entityClass: EntityTarget<Entity>, options?: FindManyOptions<Entity>): Promise<Entity[]>;
    /**
     * Finds entities that match given find options.
     */
    findBy<Entity extends ObjectLiteral>(entityClass: EntityTarget<Entity>, where: FindOptionsWhere<Entity> | FindOptionsWhere<Entity>[]): Promise<Entity[]>;

<br>

### 3-3. Update

- `DTO 정의`: 업데이트할 값을 받기 위한 DTO를 정의합니다.
- `Entity 수정`: DTO에서 받은 값을 사용하여 데이터베이스에 저장된 엔터티를 수정한다.
  - UpdateUserDto: CreateUserDto를 확장하면서, 일부 필드를 선택적으로 받을 수 있도록 정의
  ```javascript
  export class UpdateUserDto extends PartialType(CreateUserDto) {}
  • Repository에 반영: 수정된 엔터티를 Repository에 업데이트하여 데이터베이스에 반영한다.

3-4. Delete (삭제)

  • Repository에서 삭제 : DTO에서 받은 정보를 사용하여 데이터베이스에서 해당하는 엔터티를 찾아서 삭제한다.
  • 2가지 방법
    • remove : Entity 인스턴스를 전달받아 해당 Entity를 삭제. 무조건 존재하는 아이템을 지워야 한다. 그렇지 않으면 404 error 발생 (DB 2번 접근 : 아이템 유무 확인 + 있으면 지우기)
    • delete : 삭제할 조건을 직접 전달받아 해당 조건에 맞는 레코드 삭제. 만약 아이템이 존재하면 지우고 존재하지 않으면 아무런 영향이 없음 (DB 1번 접근 : 있으면 지우기 / 단순 삭제 작업에 빠르고 효율적 )
  async remove(id: number): Promise<void> {
    const result = await this.userRepository.delete(id);
    if (result.affected === 0) {
      throw new NotFoundException(`Can't find Board with id ${id}`);
    }
    console.log('result', result);
  }

4. Repository Where 연산자 옵션

  • TypeORM Repository에서 여러 가지 where 연산자를 사용하여 검색 조건 지정 가능
Not
Equal
MoreThan
MoreThanOrEqual
LessThan
LessThanOrEqual
Between(s,e)
In([])
IsNull()
Like('%xx%')
  • 예시1
repository.findBy({
  col1: Not(MoreThan(10)), 
  col2: Not(In([1,2,3])),
  col3: Not(IsNull())
});

col1이 10보다 크지 않고, col2가 1, 2, 3 중에 없으며 col3이 null이 아닌 레코드를 검색한다.

  • 예시2
repository.find({ 
  order: { age: "DESC", },
  take: 10, 
  skip: 5
});

age를 기준으로 내림차순으로 정렬하고, 최대 10개의 레코드를 가져오며, 처음 5개의 레코드를 건너뛴 후 조회한다.

  • 예시3
return this.userRepository.find({ where: { id: MoreThan(1) } });

id가 1이상인 레코드를 조회한다.

profile
나를 위한 기록

0개의 댓글