트랙
/
C#
C#
/
연습 문제
/
객체 관계 매핑
객체 관계 매핑

객체 관계 매핑

학습 연습 문제

소개

리소스 정리

클래스가 IDisposable 인터페이스를 구현한다면, 인스턴스가 더 이상 필요하지 않을 때마다 Dispose() 메서드를 호출해야 해요. 보통은 catch나 finally 절에서 호출하거나, 이 메서드를 호출하는 쪽의 Dispose() 루틴에서 호출해요. Dispose()는 운영 체제 개체처럼 .NET 런타임이 관리하지 않는 비관리 리소스를 해제하고, 관리되는 리소스의 내부 상태를 초기 상태로 되돌릴 수 있는 기회를 제공해요.

지침

다른 팀에서 제공한 데이터베이스 위에 ORM(객체 관계 매핑) 시스템을 구현해요.

이 데이터베이스는 한 번에 하나의 트랜잭션만 처리할 수 있어요.

이 단계에서는 로깅이나 다른 오류 처리는 필요하지 않아요.

내부적으로 데이터베이스는 Closed, TransactionStarted, DataWritten, Invalid, Closed 등 여러 상태를 거친다는 점을 기억해 두세요. 각 연습 문제가 시작될 때 데이터베이스가 Closed 상태라는 사실은 믿어도 돼요.

데이터베이스에는 다음과 같은 인스턴스 메서드가 있어요:

  • Database.BeginTransaction()은 데이터베이스에서 트랜잭션을 시작해요. 데이터베이스가 Closed 상태가 아닐 때 이 메서드를 호출하면 예외가 발생해요. 성공하면 데이터베이스의 내부 상태가 TransactionStarted로 바뀌어요.
  • Database.Write(string data)는 트랜잭션 안에서 데이터베이스에 데이터를 써요. 잘못된 데이터를 받으면 예외가 발생해요. BeginTransaction()을 호출하지 않은 상태에서 이 메서드를 호출하려 하면 예외가 발생해요. 성공하면 데이터베이스의 내부 상태가 DataWritten으로 바뀌어요.
  • Database.EndTransaction()은 트랜잭션을 데이터베이스에 커밋해요. 트랜잭션을 닫을 수 없거나 Database.BeginTransaction()이 호출되지 않았을 때 예외를 던질 수 있어요.
  • Database.Dispose()를 호출하면 트랜잭션 중에 예외가 발생했을 때 데이터베이스를 정리해요. 그러면 데이터베이스의 상태가 Closed로 바뀌어요.

데이터베이스의 상태는 database.DbState로 접근할 수 있어요.

데이터베이스의 상태는 다음 중 하나로 설정할 수 있어요:

  • TransactionStarted
  • DataWritten
  • Invalid
  • Closed

1. 트랜잭션 시작하기

Orm.Begin()을 구현해서 데이터베이스에서 트랜잭션을 시작해요. 데이터베이스의 내부 상태가 State.Closed로 시작하지 않으면 InvalidOperationException을 던져요.

var orm = new Orm(new Database());
orm.Begin();
// => database has an internal state of State.TransactionStarted

2. 데이터베이스에 데이터 쓰기

Orm.Write()를 구현해서 데이터베이스에 데이터를 써요. 데이터베이스의 내부 상태가 State.TransactionStarted로 시작하지 않거나 잘못된 데이터를 쓰면 InvalidOperationException이 발생해요. 쓰기에 실패하면 Orm이 데이터베이스를 정리해야 해요.

var orm = new Orm(new Database());
orm.Begin();
orm.Write("some data");
// => database has an internal state of State.DataWritten
orm.Write("bad write");
// => database has an internal state of State.Closed

3. 이전에 쓴 데이터를 데이터베이스에 커밋하기

Orm.Commit()을 구현해서 데이터를 커밋해요. 커밋에 실패하면 데이터베이스를 정리해요. 데이터베이스의 내부 상태가 State.DataWritten으로 시작하지 않으면 InvalidOperationException이 발생해요.

var orm = new Orm(new Database());
orm.Begin();
orm.Write("some data");
orm.Commit();
// => database has an internal state of State.Closed
orm.Begin();
orm.Write("bad commit");
orm.Commit();
// => database has an internal state of State.Closed

4. ORM이 트랜잭션 도중에 닫혀야 할 때 데이터베이스가 올바르게 정리되는지 확인하기

Orm 클래스에 IDisposable 인터페이스를 구현해요. 이 호출은 반드시 성공해요.

var db = new Database();
var orm = new Orm(db);
orm.Begin();
orm.Write("some data");
orm.Dispose();
// => database has an internal state of State.Closed
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
C# Exercism

객체 관계 매핑 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 C# 트랙을 개념 62개연습 문제 178개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.