참고 문서
EntityManager란?
-
TypeORM에서 모든 엔티티에 대해 삽입(insert), 조회(find), 수정(update), 삭제(delete) 등의 작업을 하나의 객체로 처리할 수 있게 해주는 중앙 관리자 같은 역할을 한다.
-
Repository들을 일일이 가져오지 않고도, EntityManager만으로 대부분의 DB 조작이 가능하다.
예시 코드
import { DataSource } from "typeorm"
import { User } from "./entity/User"
const myDataSource = new DataSource()
const user = await myDataSource.manager.findOneBy(User, {
id: 1,
})
user.name = "Umed"
await myDataSource.manager.save(user)
EntityManager와 Repository의 차이점
- Repository가 한 엔티티에 특화된 도구라면, EntityManager는 전체 엔티티에 대해 범용적으로 사용할 수 있는 관리자다.
| 항목 | EntityManager | Repository |
|---|
| 대상 | 모든 엔티티 | 단일 엔티티 |
| 사용 방식 | manager.save(User) | userRepo.save() |
| 유연성 | 더 범용적, 트랜잭션 조작 편함 | 명확하고 타입 안전함 |
| 트랜잭션 사용 | 가능 (transaction) | 내부 트랜잭션만 일부 가능 |
사용 방법
Entity 생성 및 병합
| 메서드 | 설명 |
|---|
create() | 새 인스턴스 생성 (생성자 역할) |
merge() | 여러 객체의 값을 병합하여 하나의 entity로 |
preload() | 기존 entity를 불러오고, 변경값만 덮어쓰기 |
데이터 조작 메서드
| 메서드 | 설명 |
|---|
save() | 새 엔티티는 insert, 기존 엔티티는 update |
insert() | 무조건 새 레코드 추가 (중복 시 오류) |
update() | 조건에 맞는 레코드 일부 속성만 업데이트 |
upsert() | 중복되면 update, 없으면 insert (충돌 키 지정) |
remove() | 엔티티 삭제 |
delete() | 조건 또는 id로 삭제 |
increment() / decrement() | 숫자 필드를 증감 |
조회 관련 메서드
| 메서드 | 설명 |
|---|
find() | 조건으로 여러 개 조회 (FindOptions 사용) |
findBy() | FindOptionsWhere 사용한 조건 조회 |
findAndCount() | 결과 + 전체 개수 반환 |
findOne() | 첫 번째 일치하는 엔티티 조회 |
findOneBy() | FindOptionsWhere 기반 단일 조회 |
findOneOrFail() | 못 찾으면 예외 발생 |
exists() / existsBy() | 존재 여부 확인 |
count() / countBy() | 조건에 맞는 레코드 수 반환 |
기타
| 메서드 | 설명 |
|---|
clear() | 테이블 비우기 (TRUNCATE) |
release() | 직접 관리한 QueryRunner 해제 |
getTreeRepository() | 트리 구조 엔티티 전용 Repository 가져오기 |
getMongoRepository() | MongoDB용 Repository |
withRepository() | 트랜잭션 내에서 커스텀 Repository 사용 시 |
사용 예시 요약
const user = await manager.findOne(User, { where: { id: 1 } })
const user = manager.create(User, { name: 'Timber' })
await manager.save(user)
await manager.transaction(async (m) => {
await m.update(User, 1, { name: 'Updated' })
})