Repository는 특정 엔티티 전용의 EntityManager다.
import { User } from "./entity/User"
const userRepository = dataSource.getRepository(User)
const user = await userRepository.findOneBy({
id: 1,
})
user.name = "Umed"
await userRepository.save(user)
selectuserRepository.find({
select: {
firstName: true,
lastName: true,
},
})
// → SELECT "firstName", "lastName" FROM "user"
relationsuserRepository.find({
relations: {
profile: true,
photos: true,
},
})
relations: {
videos: {
videoAttributes: true,
},
}
wherewhere: {
firstName: "Timber",
lastName: "Saw",
}
where: {
project: {
name: "TypeORM",
initials: "TORM",
},
}
where: [
{ firstName: "Timber", lastName: "Saw" },
{ firstName: "Stan", lastName: "Lee" },
]
orderorder: {
name: "ASC",
id: "DESC",
}
skip + takeskip: 5, // OFFSET
take: 10, // LIMIT
MSSQL에서는
order없으면 오류 발생하므로 함께 사용해야 함
withDeletedwithDeleted: true
cachecache: true
locklock: { mode: "optimistic", version: 1 }
findBy() 또는 where에서 사용할 수 있는 조건자들
| 연산자 | 의미 | 예시 코드 |
|---|---|---|
Not(...) | 값이 아닌 경우 | Not(Equal("About #2")) |
LessThan(n) | n보다 작은 값 | LessThan(10) |
MoreThanOrEqual(n) | n 이상 | MoreThanOrEqual(5) |
Like('%text%') | SQL LIKE | Like("%out%") |
ILike('%text%') | 대소문자 구분 없는 LIKE (Postgres) | ILike("%out%") |
Between(a, b) | 두 값 사이 | Between(1, 10) |
In([a, b]) | 여러 값 중 하나 | In(["About #2", "About #3"]) |
IsNull() | null인 경우 | IsNull() |
Raw(...) | 커스텀 SQL 삽입 | Raw(alias => \${alias} > NOW()`)` |
And(...), Or(...) | 복합 조건 | And(Not(Equal("About #2")), ILike("%About%")) |
| 기능 | 설명 |
|---|---|
create() | 엔티티 인스턴스 생성 |
save() | 엔티티 저장 (insert or update 자동 감지) |
remove() / delete() | 엔티티 삭제 |
find() / findOne() / findBy() | 데이터 조회 |
update() / upsert() | 조건부 수정 또는 없으면 삽입 |
preload() / merge() | 기존 데이터 덮어쓰기 또는 병합 |
increment() / decrement() | 수치형 필드 증감 |
exists() / count() | 존재 여부 / 개수 확인 |
softDelete() / restore() | soft-delete 기능 사용 |
query() / clear() | raw SQL 실행 / 테이블 비우기 |
createQueryBuilder() | 복잡한 SQL 생성기 사용 가능 |
const user = repository.create({ firstName: "Timber" })
await repository.save(user)
await repository.find({ where: { firstName: "Timber" } })
await repository.findBy({ firstName: "Timber" }) // 더 단순
await repository.update(1, { age: 30 })
await repository.upsert([{ externalId: "abc123", name: "Timber" }], ["externalId"])
await repository.delete(1)
await repository.softDelete({ name: "Timber" })
await repository.restore(1)
await repository.countBy({ firstName: "Timber" })
await repository.sum("age", { active: true })
await repository.maximum("score", {})
await repository.query("SELECT * FROM user WHERE name = ?", ["John"])
preload() vs merge() 차이| 메서드 | 사용 상황 |
|---|---|
merge() | 메모리 상에서 단순 병합 |
preload() | DB에서 엔티티 불러오고 병합하여 반환 (비동기) |
await repository.save(users, {
chunk: 1000, // 매우 큰 데이터 분할 저장
transaction: false, // 트랜잭션 사용 안함
listeners: false // subscriber 이벤트 발생 안함
})
await repository.remove(users, {
chunk: 1000,
transaction: false,
})