imports: [TypeOrmModule.forFeature([엔터티명]) private readonly entityManager: EntityManager,
private readonly dataSource: DataSource,
@InjectRepository(User) private userRepository: Repository<User>,
EntityManager, DataSource : 전체 Entity 대상 (유연성 👍🏻)EntityManager : 여러개의 Entity를 한꺼번에 관리하여 다뤄준다.DataSource : Entity (즉, MySQL)Repository : 특정 Entity 하고만 응집된다. (응집력 👍🏻)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);
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에 업데이트하여 데이터베이스에 반영한다.Repository에서 삭제 : DTO에서 받은 정보를 사용하여 데이터베이스에서 해당하는 엔터티를 찾아서 삭제한다.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);
}
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이상인 레코드를 조회한다.