C#과 같은 OOP 언어에서 DB를 쉽게 사용하기 위한 ORM (객체관계형매핑) 도구로서, OOP의 객체와 관계형DB테이블을 매핑하여 쉽게 데이터를 액세스할 수 있게 한다.
마소가 직접 구현한 ORM 기술은 Entity Framework(EF)와 LINQ TO SQL이 있고 나머지는 일단 블라블라..
EF는 데이터베이스를 엑세스하는 기술이므로, ASP.NET에서만 사용하는 건 아니지만, ASP.NET MVC에서 데이터를 엑세스하는 기본 프레임워크로 EF를 사용하기 때문에 MVC를 사용하면 자연스럽게 EF를 사용하게 된다.
이번에는 1번만 다루어보자.
Code First는 먼저 C# 클래스로 테이블의 구조를 정의한다.
클래스의 속성을 테이블의 컬럼에 매핑한다.
Code First라는 말에서 이 접근 방식은 DB를 미리 설계하지 않고, C# 클래스들로 Domain Object들ㅇ르 정의하고 프로그램 실행시 DB가 없으면 자동으로 DB를 생성하는 방식을 취한다.
(참고) 기업환경에서는 DB팀이 별도로 있거나 정교한 DB설계를 미리하는 경우가 많다. 이런 경우에 기존 DB구조와 매핑하는 C# 클래스들을 정의하고 DB생성 없이 사용한다.
코드를 보자
using System;
using System.Data.Entity;
using System.ComponentModel.DataAnnotations.Schema;
namespace GuestBook.Models
{
public class GuestDbContext : DbContext
{
public GuestDbContext() : base()
{
}
public DbSet<Guest> Guests { get; set; }
}
[Table("Guest")]
public class Guest
{
public int Id { get; set; }
public string Name { get; set; }
public DateTime CreateDate { get; set; }
public string Message { get; set; }
}
}
위에서는 방명록을 위한 Guest라는 클래스를 정의하고 있는데, 클래스의 각 속성들은 Guest라는 테이블에 1대1로 매핑된다.
이렇게 간단한 속성들로 정의되어서 외부 프레임워크에 의존하지 않는 단순한 Entity 클래스를 POCO( Plain Old CLR Object ) 클래스라고 부르는데, 기본적으로 단순히 데이터를 저장했다가 전달하는 역할을 한다.
GuestDbContext
클래스는 EF(System.Data.Entity)의 DbContext 클래스로부터 파생된 (상속한) 클래스로 DbContext 클래스의 여러 기능들을 상속 받는다.
GuestDbContext 생성자는 Base 클래스의 생성자를 호출하고 있는데 이를 통해서 처음 GuestDbContext 객체가 생성되면 ( Web.config의 정의에 따라서 ) 기존 DB가 없는 경우에 자동으로 DB를 생성하게 된다.
별도의 설정이 없이 디폴트로는 App_Data 폴더에 해당 클래스명 (GuestDbContext)를 따서 Local Db 파일(*.mdf)를 생성한다.
마지막으로 위의 Guest 클래스 정의 위에 [Table(테이블명)]
Attribute는 DB에서 생성될 테이블 명을 명시적으로 지정한 것이다.
이렇게 명시하지 않으면 디폴트로 클래스 명을 테이블 명으로 사용하는데, 일반적으로 클래스명의 복수형(예. Guests)을 테이블 명으로 하기 때문에, 이를 피하기 위해서는 명시적으로 테이블 명을 지정한다.
이렇게 GuestDbContext와 Guest 클래스가 정의되면 C#의 LINQ
를 사용하여 SELECT, INSERT, UPDATE, DELETE 등을 쉽게 할 수 있다.
아래 코드를 보자
// Controller의 Action 메서드들
// Guest 추가
public ActionResult AddGuest()
{
string name = Request["name"];
string msg = Request["msg"];
var db = new GuestDbContext();
Guest g = new Guest();
g.Name = name;
g.CreateDate = DateTime.Now;
g.Message = msg;
db.Guests.Add(g);
db.SaveChanges();
return RedirectToAction("ShowGuests");
}
// Guest 리스트
public ActionResult ShowGuests()
{
var db = new GuestDbContext();
// select top 10 * from guest order by id desc
List<Guest> guests = db.Guests.OrderByDescending(p => p.Id).Take(10).ToList();
return View(guests);
위 ShowGuest()의 마지막 부분에서 List<Guest>
타입인 guest 변수를 View(Guest)와 같이 View 메서드의 파라미터로 전달하고 있는데, 이는 모델 객체를 MVC의 View로 넘기는 방법 중의 하나이다.
이 다음은 프론트와 연결하는 방법인데 이는 나중에