Repository 는 저장소 라는 용어로 데이터베이스에 직접적으로 접근하는 것이 아닌 이것을 하나의 저장소 개체로 보고 이곳에 질의 하는 패턴입니다.
이전 ADO 1.0 이나 그 이하의 세대에서 DB를 다룰 때 가장 큰 문제점은 DB데이터 형식의 매핑 문제였을것입니다. 사이즈나 , 형태가 다르기 때문에 파생하는 문제는 가장 모호한 에러인데다 , 프로그램 자체를 망가뜨리는 가장 핵심적인 원인이기도 했죠. 이러한 이유로 DB의 데이터를 직접 가공해 쓰는 형태보다는 가공하는 매개체를 두고 , 비즈니스 레이어에서 이를 가공해 쓰는 형태의 데이터 매퍼가 유행하게 됩니다. 리파지터리 패턴은 이 즈음에 나온 개념으로써 마틴파울러가 그의 책 PoEAA에서 처음 제시한 개념입니다. Repository 패턴에 대해서도 심도있게 다뤄보고 싶지만 , 본인의 내공이 미천하고 MVC에 대한 집중적인 내용이 아니기 때문에 밑의 링크로 대신합니다.
http://vandbt.tistory.com/27
http://msdn.microsoft.com/en-us/library/ff649690.aspx(한글이 없네요 ㅠㅠ)
[Repository 패턴에 대해]
이러한 Repository 개념은 MVC의 nertdinner 와 music store 등에서 폭넓게 사용되게 됩니다.
이번 장 에서는 간단하게 Repository 패턴을 구현하여 보도록 하겠습니다.
먼저 MVC어플리케이션에 Repository 폴더를 만들고 그 안에 HelloRepository.cs파일을 만듭니다.
public class HelloRepository
{
privateTestEntities db = new TestEntities();
publicList<HelloworldApp3.Models.HelloModel> GetList()
{
List<HelloworldApp3.Models.HelloModel> retList = new List<Models.HelloModel>();
foreach(var t in db.TestTable)
{
retList.Add(new Models.HelloModel{
HelloMsg = t.SomeData,
TodayDate = t.RegDate.ToString()
});
}
return retList;
}
public HelloworldApp3.Models.HelloModel GetDetail(Int32 idx)
{
TestTable testtable = db.TestTable.Single(t => t.Idx == idx);
HelloworldApp3.Models.HelloModel retModel = new HelloModel();
if (testtable != null)
{
retModel.HelloMsg = testtable.SomeData;
retModel.TodayDate = testtable.RegDate.ToString();
}
return retModel;
}
publicInt32 Delete(Int32 idx)
{
TestTable testtable = db.TestTable.Single(t => t.Idx == idx);
db.TestTable.DeleteObject(testtable);
return db.SaveChanges();
}
publicInt32 Update(HelloworldApp3.Models.HelloModel model)
{
TestTable tb = newTestTable
{
Idx = 1,
RegDate = DateTime.Parse(model.TodayDate),
SomeData = model.HelloMsg
};
db.TestTable.Attach(tb);
db.ObjectStateManager.ChangeObjectState(tb, EntityState.Modified);
return db.SaveChanges();
}
publicInt32 Insert(HelloworldApp3.Models.HelloModel model)
{
db.TestTable.AddObject(new TestTable
{
Idx = 1,
RegDate = DateTime.Parse(model.TodayDate),
SomeData = model.HelloMsg
});
return db.SaveChanges();
}
}
[코드 : Repository 패턴을 이용한 EF 코드 작성]
다음의 코드는 다음과 같은 도식도를 가진다
[그림 Repository 도식도]
* 해당 코드 자체가 일종의 DataMapping이 되어 있는 상태이기 때문에 약간은 불필요한 코드가 되긴 했지만 , 이렇게 C# 객체화 하는 것이 Repository 의 기본적인 구도라는 것을 명심하기 바란다.
Summary
요즈음에 있어서 Repository 패턴이 강조되는 이유는 이것이 IoC와 결합이 되었을 때 많은 다른 종류의 데이터 저장소를 지원하기 때문이다. 실제로 필자는 이전에 DataBase 에서 직접적으로 호출하는 코드를 웹 서비스에서 호출하는 코드로 직접 변환한적이 있다. (그때 처음으로 IT의 생산성에 대해 고민을 하기 시작했다. OTL 단순 작업코드로 3일을 고생했었다는…) 그때 만약 IoC와 Repository 를 알고 있었다면 3일이나 되는 긴 시간이 소요되진 않았을 것이다. 또한 데이터 형태가 변하더라도 Repository 의 객체를 변경하게 되면 컴파일 타임에 그 오류를 잡는 것이 모두 가능해진다.
다음장에서는 IoC를 이용해서 실질적으로 이 Repository를 활용하는 예제를 살펴보도록 하겠다. 이 모든기능은 MVC에 포함되어 있는 확장 기능이다. Enjoy!
ASP.NET MVC3 시리즈 강좌 리스트
[ASP.NET MVC3강좌] 1. MVC(Model- View – Controller) 란 무엇인가.
[ASP.NET MVC3강좌] 2. MVC 환경 세팅
[ASP.NET MVC3강좌] 3. HelloWorld MVC
[ASP.NET MVC3강좌] 4. Layout , Partial Page
[ASP.NET MVC3강좌] 5. Model 을 View에서 표현하기
[ASP.NET MVC3강좌] 6. MVC의 매력적인 기능 스캐폴딩!(With EF)
[ASP.NET MVC3강좌] 7. 유효성 검사
[ASP.NET MVC3강좌] 8. ModelBinder
[ASP.NET MVC3강좌] 9. MVC ActionResult 종류 살펴보기
[ASP.NET MVC3강좌] 10. MVC 처리 프로세스 & ActionFilter
[ASP.NET MVC3강좌] 11. Global.asax
[ASP.NET MVC3강좌] 12. (번외편) Repository Pattern
[ASP.NET MVC3강좌] 13. MEF(Managed Extensibility Framework) in MVC
[ASP.NET MVC3강좌] 14. Javascript in MVC
[ASP.NET MVC3강좌] 15. Javascript Intellicense in Visual Studio
[ASP.NET MVC3강좌] 16. JSON in MVC - 1
[ASP.NET MVC3강좌] 17. JSON in MVC - 2
[ASP.NET MVC3강좌] 18. HTML5 in MVC
[ASP.NET MVC3강좌] 19. MVC Tips 1 - HandleUnknownAction
[ASP.NET MVC3강좌] 20. MVC Tips 2 - Cache ActionFilter