DbContext 수명
DbContext의 수명은 인스턴스가 만들어질 때 시작되고 인스턴스가 삭제될 때 종료된다. DbContext 인스턴스는 단일 작업 단위에 사용되도록 설계되었다. 따라서 DbContext 인스턴스의 수명은 매우 짧다.
EF core에서의 작업단위패턴 (Unit of Work)은 관련된 여러 데이터베이스 작업들을 하나의 작업으로 묶어서 일관성을 유지하고, 트랜잭션 관리를 단순화하는 [패턴]을 말한다. 이것은 데이터베이스와의 상호작용을 관리하며, 여러 변경사항들을 하나의 트랜잭션 내에서 실행하여 모든 변경사항이 성공적으로 반영되거나, 실패시 롤백을 통해 원상태로 복구할 수 있게 한다. EF core에서는 DbContext 클래스가 작업단위 패턴을 구현하고 있고, 이를 통해서 CRUD 작업을 트랜잭션 단위로 관리할 수 있다.
DbContext와 작업 단위
DbContext는 EF core에서 데이터베이스와의 상호작용을 위한 주요 클래스이다. 이것은 내부적으로 여러 DbSet를 관리하며, 각 DbSet은 특정 엔티티 유형의 컬렉션을 나타낸다. DbContext를 사용하여 엔티티를 추가/수정/삭제하고 SaveChanges() 메서드를 호출하여 이러한 변경사항들을 데이터베이스에 반영한다. SaveChanges() 메서드 호출 시, 모든 변경 사항이 데이터베이스에 반영되기 전에 유효성 검사, 변경 추적 등의 작업이 수행되며, 이 모든 과정이 하나의 트랜잭션 내에서 이루어진다. 따라서 작업단위패턴을 통해 데이터의 일관성과 무결성을 보장할 수 있다.
다음은 DbContext를 사용하여 여러 엔티티의 변경사항을 하나의 작업 단위로 관리하는 방법을 보여준다.
using ( var context = new SampleDbContext() ){
// 새로운 엔티티 추가
var newEntity = new SampleEntity() { Name = “새로운 엔티티” };
context.SampleEntities.Add(newEntity);
// 기존 엔티티 수정
var existingEntity = context.SampleEntities.FirstOrDefault ( e=> e.Id == SomeId );
if ( existingEntity != null )
existingEntity.Name = “수정된 엔티티”;
// 변경사항 저장 – 작업단위 패턴 적용
context.SaveChanges();
}
이 코드에서는 using문을 사용하여 SampleDbContext의 인스턴스를 생성하고 있는데 이것은 DbContext 인스턴스의 생명주기를 관리하며, 올바른 자원 해제를 보장한다. Add 메서드를 사용하여 새 엔티티를 추가하고, LINQ 를 사용하여 기존 엔티티를 찾아서 수정한다. 마지막으로 SaveChanges() 메서드를 호출하여 모든 변경 사항을 데이터베이스에 반영한다. 이 과정에서 모든 변경 사항이 하나의 트랜잭션으로 묶여서 처리되므로, 중간에 오류가 발생하면 전체 작업이 롤백되어 데이터의 일관성이 보장된다. EF core의 작업단위 패턴은 데이터베이스 작업의 복잡성을 줄이고, 개발자가 데이터 무결성 및 일관성에 더 집중할 수 있게 도와준다.
EF 사용시의 일반적인 작업 단위