개발 이야기/ORM2012. 4. 15. 12:33

Entity Framework – ASP.NET MVC(3)

ASP.NET MVC 세번째 이야기앞에서 목록만 출력하는것을 살펴보았습니다어떤가요굉장히 뭔가 간단하고 재미있지않나요이렇게 엔티티가 바로 바인딩되는 것을 보고 Enterprise 환경에서는 어떨지몰라도 개인적으로 사이트를 만들때 많은 작업들이 간소화되면서 빨리 그리고 가볍게 사이트를 구성할 수 있을듯한 느낌을 받았습니다앞 세션에 이어 이번에는 비지니스 로직 영역과 프로세스를 구체적으로 살펴보겠습니다.

 

List 화면

Shippers 데이터가 목록에 바인딩된 것을 확인 할 수 있습니다코드를 한번 살펴보죠~

11_01.JPG

[그림 11-1] 리스트 화면

 

“NorthwindEntities” 컨텍스트의 Shippers 엔티티를 View에 반환하는 것을 확인 할 수 있습니다화면에서는 뷰 객체를 받아서 처리하여 목록을 출력하고 있습니다구문이 많이 익숙하지 않나요앞에서 저희가 엔티티 작업에 대해서 다뤘던 구문과 거의 비슷합니다.

 

        private NorthwindEntities db = new NorthwindEntities();

 

        public ViewResult Index()

        {

            return View(db.Shippers.ToList());

        }

   

 

 

상세 화면

리스트에서 항목을 클릭하면 상세 화면이 다음과 같이 구성됩니다.

11_02.JPG

[그림 11-2] 상세 화면

 

코드를 보면 인자로 id값을 받고 있습니다유니크한 ShipperID의 값인데요컨트롤러에서는 id값에 해당하는 데이터를 뷰에 반환하고 있습니다뷰에서는 반환된 데이터를 위 화면처럼 뿌려주고 있습니다.

 

        public ViewResult Details(int id)

        {

            Shippers shippers = db.Shippers.Single(s => s.ShipperID == id);

            return View(shippers);

        }

 

 

 

수정 화면

다음은 수정 화면입니다실제로 데이터 변경이 발생하게 되는데요잊지않으셨죠?????

11_03.JPG

[그림 11-3] 수정 화면

데이터가 변경되거나 삭제 등 비지니스 로직이 추가 될 경우에는 SaveChanges 메서드를 꼭 호출해야 데이터베이스에 반영된다는 사실을~~~~ 수정하는 코드도 많이 익숙하군요^^

 

        [HttpPost]

        public ActionResult Edit(Shippers shippers)

        {

            if (ModelState.IsValid)

            {

                db.Shippers.Attach(shippers);

                db.ObjectStateManager.ChangeObjectState(shippers,EntityState.Modified);

                db.SaveChanges();

                return RedirectToAction("Index");

            }

            return View(shippers);

        }

 

 

 

신규생성 화면

다음은 데이터를 생성하는 화면입니다. ShipperID는 자동생성이기에 입력이 안되고 CompanyName Phone값만 입력을 하면됩니다.

11_04.JPG

[그림 11-4] 신규생성 화면

 

코드를 보면 좀 다른것을 확인 할 수 있습니다항목들을 인자로 받는게 아니라 Shippers 객체 자체를 인자로 받고 있습니다그게 가능한 이유는 뷰의 코드를 확인하면 궁금증이 풀립니다.

 

        [HttpPost]

        public ActionResult Create(Shippers shippers)

        {

            if (ModelState.IsValid)

            {

                db.Shippers.AddObject(shippers);

                db.SaveChanges();

                return RedirectToAction("Index"); 

            }

 

            return View(shippers);

        }

       

 

뷰를 구성할때 모델의 객체를 설정해줬습니다하여 바로 뷰에서 Shippers 객체를 인자로 넘겨 줄 수 있었던 것입니다만약 뷰에 모델을 할당하지않는다면 항목을들 하나하나 넘겨서 컨트롤러에서 다시 Shippers 객체에 할당해주는 코드를 작성해야겠지요하지만 그렇게 작업할 이유가 없겠죠??!!! 바로 모델 객체를 뷰와 컨트롤러 사이의 매개변수로 사용이 가능하니깐요!!!

 

        <div class="editor-label">

            @Html.LabelFor(model => model.CompanyName)

        </div>

        <div class="editor-field">

            @Html.EditorFor(model => model.CompanyName)

            @Html.ValidationMessageFor(model => model.CompanyName)

        </div>

 

        <div class="editor-label">

            @Html.LabelFor(model => model.Phone)

        </div>

        <div class="editor-field">

            @Html.EditorFor(model => model.Phone)

            @Html.ValidationMessageFor(model => model.Phone)

        </div>

       

 

 

삭제 화면

마지막으로 삭제화면입니다리스트에서 삭제 링크를 클릭하면 확인을 한번 더 진행합니다이는 프로세스를 어떻게 구성하느냐에 따라 달라집니다우선 스캐폴링 옵션을 이용한 CRUD 화면을 구성하면 기본으로 구성되는 프로세스입니다.

11_05.JPG

[그림 11-5] 삭제 확인 화면

 코드는 다음과 같습니다이또한 SaveChanges를 최종적으로 호출하고 있습니다.

 

        [HttpPostActionName("Delete")]

        public ActionResult DeleteConfirmed(int id)

        {           

            Shippers shippers = db.Shippers.Single(s => s.ShipperID == id);

            db.Shippers.DeleteObject(shippers);

            db.SaveChanges();

            return RedirectToAction("Index");

        }

 

 

어떤가요웹에서 필요한 기본적인 작업을 확인해보았습니다쉽죠?! MVC JQuery를 활용한다면 더 세련되고 화려한 웹페이지 구성을 할 수 있습니다. ASP.NET MVC JQuery는 각자 파트에서 더 상세히 공부하실 수 있습니다이렇게 해서 대작~ Entity Framework – ASP.NET MVC 세션 막을 내립니다감사합니다.



sqler에 아티클 작성 했던것을 공유합니다.

출처 : http://www.sqler.com/401149

Posted by 사나에
개발 이야기/ORM2012. 4. 15. 12:32

Entity Framework – ASP.NET MVC(2)

ASP.NET MVC 두번째 이야기저희가 가져온 엔티티를 화면에 구성하는 작업을 진행하겠습니다. MVC를 다뤄보신 분도 계시겠지만 처음 접하는 분을 위해 최대한 쉽게 설명드리겠습니다.

 

ASP.NET MVC Razor

첫 화면을 기억하시나요?

10_01.JPG

[그림 10-1] Razor 기본 구성 화면

 

첫화면 설정은 Global.asax 페이지에서 설정하게 됩니다.

controller명과 action명을 지정하면 “http://localhost:49999/Home/Index”처럼 URL이 구성됩니다.

 

        public static void RegisterRoutes(RouteCollection routes)

        {

            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

 

            routes.MapRoute(

                "Default"// 경로 이름

                "{controller}/{action}/{id}"// 매개 변수가 있는 URL

                new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 매개 변수 기본값

            );

        }

   

 

Controllers 폴더에서 컨트롤러를 추가해보겠습니다다음 화면처럼 메뉴를 클릭해주세요.

10_02.JPG

[그림 10-2] 컨트롤러 추가 메뉴

 

컨트롤러명을 작성하고 스캐폴링 옵션에 다음과 같이 설정해주세요모델 클래스는 저희가 추가한 “Shippers”를 지정하면 됩니다.데이터 컨텍스트 클래스는 역시 저희가 생성한 “NorthwindEntitys”를 지정합니다.

10_03.JPG

[그림 10-3] 컨트롤러 추가

 

고급 옵션에서 레이아웃을 설정해주시면 메인화면 레이아웃을 그대로 구성된 페이지를 만날 수 있습니다^^

10_04.JPG

[그림 10-4] 고급 옵션 설정

 

생성하면 ShipperController 클래스에 많은 메서드들이 자동으로 생성된것을 보실 수 있습니다또한 스캐폴링 옵션으로/Views/Shipper 폴더에 View 페이지가 자동으로 생성된것을 확인 할 수 있습니다.

10_05.JPG

[그림 10-5] 뷰 구성

 

참고로!!! 자동생성하지 않고 뷰를 추가하고 싶다면 컨트롤러에서 생성하려는 메서드에 마우스를 클릭해서 View(화면)을 생성해주면 됩니다.

10_06.JPG

[그림 10-6] 뷰 추가 메뉴

 

여기까지 잘 따라오셨죠공통 레이아웃에서 “Shipper”의 뷰로 가는 링크를 추가해보겠습니다.

10_07.JPG

[그림 10-7] 레이아웃 페이지

 

메뉴 영역에 샘플 링크를 다음과 같이 추가해주세요.

 

            <div id="menucontainer">

                <ul id="menu">

                    <li>@Html.ActionLink("""Index""Home")</li>

                    <li>@Html.ActionLink("정보""About""Home")</li>

                    <li>@Html.ActionLink("샘플""Index""Shipper")</li>

                </ul>

            </div>

            

 

F5를 클릭해서 실행해보겠습니다저희가 추가한 샘플 링크를 클릭하면 다음과 같이 “Shippers” 데이터가 목록을 출력되는 것을 확인 할 수 있습니다완전 간단하고 신기하네요^^

10_08.JPG

[그림 10-8] 샘플 리스트 화면

 

작성하다보니 내용은 그렇게 많지않는데 그림때문에 내용이 길어지네요이번 세션에서는 모델-컨트롤러-뷰에 대해서 생성하여 실행하는 것을 간단히 확인해보았습니다그렇다면 비지니스 로직(데이터 처리)들은 어떻게 작업을 하게 되는지 다음 세션에서 확인 해보겠습니다감사합니다.^^



sqler에 아티클 작성 했던것을 공유합니다.
출처 : http://www.sqler.com/401125


Posted by 사나에
개발 이야기/ORM2012. 4. 15. 12:31

Entity Framework – ASP.NET MVC(1)

아키텍처 레이어를 나눠보면 Entity Framework Data Access Logic Business Logic 영역에서 역할을 해주고 있는데요소프트웨어 개발 시 어떻게 기준을 잡는가에 따라서 달라질 수 있을듯합니다오늘 알아 볼 내용은 ASP.NET MVC3를 이용해서 User Presentation영역과 Entity Framework 상호 관계에 대해서 알아보려 합니다

 

09_01.jpg

[그림 9-1] 레이어 구성

 

ASP.NET MVC3

올해 초 ASP.NET MVC3가 정식으로 릴리즈되었습니다. MVC는 익히 아시다시피 Model-View-Controller 패턴으로 각각의 영역이 나눠서 독립적으로 작업이 수행되며 서로간의 관계를 통해서 상호보완적으로 구성되는 설계 방법론이라고 볼 수 있습니다. MVC에 대해서는 ASP.NET 파트에서 상세히 설명이 되고 있기에 간략히 언급만 하겠습니다. ^^

09_02.jpg

[그림 9-2] MVC 패턴

 

ASP.NET MVC 3 RTM 다운로드 URL

http://www.microsoft.com/download/en/details.aspx?id=4211

ASP.NET MVC 3 RTM Tools Update

http://www.microsoft.com/downloads/ko-kr/details.aspx?familyid=82cbd599-d29a-43e3-b78b-0f863d22811a&displaylang=ko

 

 

프로젝트 생성 및 구성

ASP.NET MVC With Razor로 웹 프로젝트를 생성합니다새 프로젝트에서 다음 항목을 선택해주세요.

09_03.jpg

[그림 9-3] ASP.NET MVC 웹 프로젝트 추가

 

MVC3 Razor 엔진을 제공하고 있습니다. Razor로 작업을 할 경우 보다 빠른 생산성을 보여줍니다개인적인 생각으론 웹페이지가 가벼워지는 느낌도 있습니다ㅋㅋ

09_04.jpg

[그림 9-4] Razor 선택

 

웹 프로젝트를 생성하였다면 F5를 눌러서 실행을 해보겠습니다기본적으로 구성된 레이아웃에 필수 기능들을 탑제(?)된 화면을 보실 수 있습니다저희가 여기에 추가 기능을 구현하게 됩니다요~

09_05.jpg

[그림 9-5] MVC 기본 레이아웃 화면

 

첫번째 작업은 Entity를 추가해줘야겠죠?! 여기는 Entity Framework에 대한 세션이니깐요~

09_06.jpg

[그림 9-6] ADO.NET 엔티티 데이터 모델 항목 추가

 

계속적으로 반복되는 “Northwind” 데이터베이스를 연결해주세요참고로 Northsind pubs 기본 데이터베이스는 다음URL에서 다운 가능합니다.

http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=23654

09_07.jpg

[그림 9-7] DBMS 연결

 

개체는 “Shippers”테이블만 선택해주세요.

09_08.jpg

[그림 9-8] 엔티티 선택

 

추가를 다하셨다면 프로젝트는 다음과 같이 구성이 될거예요맞게 나오셨나요??

09_09.jpg

[그림 9-9] 프로젝트 구성

 

이제 프로젝트 구성이 완료되었습니다환경이 셋팅이 안되신 분들은 설정하느라 시간을 좀 투자하셨을듯 합니다이번 세션은 환경설정 및 프로젝트 구성하는것으로 마무리하겠습니다이어서 다음 세션으로 고고고~

sqler에 아티클 작성 했던것을 공유합니다.

출처 : http://www.sqler.com/401110



Posted by 사나에
개발 이야기/ORM2012. 4. 15. 12:31

Entity Framework - Entity Stored Procedure 활용(2)

Entity Framework에서 Stored Procedure를 다루는 방법에 대해서 앞 세션에서 다뤘는데 또 다른 방법이 있어 추가로 소개하고자 합니다. Visual Studio의 막강한 기능으로 대부분이 자동생성됩니다이번 시간도 아주 간단한 작업만으로 Entity Stored Procedure 다룰 수 있습니다떠나보자구용~~

 

Stored Procedure

앞 세션에서 사용한 프로시져를 그대로 사용하겠습니다.

08_01.jpg

[그림 8-1] 프로시져 목록

 

Stored Procedure Entity 업데이트

EDM 프로시져를 가져오겠습니다. “update Model from Database…”메뉴를 클릭해주세요.

08_02.jpg

[그림 8-2] 모델 업데이트

 

추가할 해당 프로시져를 선택해주세요.

08_03.jpg

[그림 8-3] Stored Procedure 추가

 

기본적으로 엔티티 매핑 개체 추가 후 모델 브라우저를 보면 다음과 같이 트리가 구성됩니다.

08_04.jpg

[그림 8-4] 모델 브라우저 트리

 

가지고 온 프로시져를 엔티티의 함수로 가져오는 작업을 추가 해줘야합니다프로시져에서 다음과 같이 “Add Function Import…”메뉴를 선택합니다.

08_05.jpg

[그림 8-5] 모델 브라우저 트리 메뉴

 

함수 가져오는것은 스로시져에 함수명만 지정해주면 해당 함수명으로 자동으로 매핑이 됩니다..

08_06.jpg

[그림 8-6] 함수 가져오기 설정

 

3개 모두 함수 가져오기하면 엔티티의 함수 목록에 다음과 같이 출력됩니다이제 프로시져 가져오는 작업이 완료되었습니다.

08_07.jpg

[그림 8-7] 모델 브라우저 트리 – 함수 가져오기

 

Entity 생성(Insert)

추가했던 함수명이 컨텍스트에서 메서드로 제공된다제공된 메서드에 맞춰 파라메터를 넣어주면 됩니다.

 

        private void btnInsert_Click(object sender, EventArgs e)

        {

            using (var context = new NorthwindEntities())

            {

                context.Shippers_INSERT("SM Company""(031)123-1234");

                MessageBox.Show("record inserted");

            }

        }

 

 

SQL Profiler에서 확인하면 Shippers_INSERT” 프로시져가 호출되어 데이터가 추가된 것을 확인 할 수 있습니다.

08_08.jpg

[그림 8-8] SQL Profiler 데이터 추가


Entity 수정(Update)

수정하는 “Shippers_UPDATE” 메서드를 호출하여 엔티티 수정을 합니다.

 

        private void btnUpdate_Click(object sender, EventArgs e)

        {

            using (var context = new NorthwindEntities())

            {

                context.Shippers_UPDATE(2, "United Package_Modify""(503) 555-3190");

                MessageBox.Show("record updated");

            }

        }

 

 

SQL Profiler에서 확인하면 Shippers_UPDATE” 프로시져가 호출되고 있는것을 확인 할 수 있습니다.

08_09.jpg

[그림 8-9] SQL Profiler 데이터 수정

 

Entity 삭제(Delete)

“Shippers_DELETE” 메서드를 호출하여 데이터 삭제를 합니다.

 

        private void btnDelete_Click(object sender, EventArgs e)

        {

            using (var context = new NorthwindEntities())

            {

                context.Shippers_DELETE(10);

                MessageBox.Show("record deleted");

            }

        }

 

 

10으로 파라메터를 할당한 Shippers_DELETE” 프로시져가 호출되고 있습니다.

08_10.jpg

[그림 8-10] SQL Profiler 데이터 삭제

 

프로시져를 함수로 가져와서 메서드형태로 사용하는 것을 확인해보았습니다앞 세션에서 다룬것은 테이블 기준으로 프로시져를 활용하는 것이 었습니다테이블 기준이 아닌 프로시져를 사용할 경우는 이렇게 함수로 가져와서 작업을 하는게 편할 수도 있을것 같네요감사합니다.

소스 코드 : EF4.08.zip


sqler에 아티클 작성 했던것을 공유합니다.

출처 : http://www.sqler.com/400566


Posted by 사나에
개발 이야기/ORM2012. 4. 15. 12:30

Entity Framework - Entity Stored Procedure 활용(1)

앞 세션에서 Entity Framework의 Entity CRUD 작업에 대해서 알아보았습니다앞 세션에서 엔티티 작업은 실제로 Ad-Hoc Query를 사용합니다이번에는 Stored Procedure를 사용하여 데이터 작업하는 것을 확인해보겠습니다.

 

기본 Stored Procedure 생성

이번 내용을 확인해보기 위해 필요한 프로시져 스크립트입니다Northwind 데이터베이스에 생성해주세요~

USE Northwind

 

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

-- =============================================

-- Description:     신규생성

-- =============================================

CREATE PROCEDURE Shippers_INSERT

       @CompanyName nvarchar(40),

       @Phone nvarchar(24)

AS

BEGIN

       SET NOCOUNT ON;

      

       INSERT INTO [Northwind].[dbo].[Shippers]

           ([CompanyName],[Phone])

     VALUES

           (@CompanyName, @Phone)

 

END

GO

 

 

-- =============================================

-- Description:     수정

-- =============================================

CREATE PROCEDURE Shippers_UPDATE

       @ShipperID INT,

       @CompanyName nvarchar(40),

       @Phone nvarchar(24)

AS

BEGIN

       SET NOCOUNT ON;

      

       UPDATE [Northwind].[dbo].[Shippers]

       SET [CompanyName] = @CompanyName, [Phone] = @Phone

       WHERE ShipperID = @ShipperID

      

END

GO

 

 

-- =============================================

-- Description:     삭제

-- =============================================

CREATE PROCEDURE Shippers_DELETE

       @ShipperID INT

AS

BEGIN

       SET NOCOUNT ON;

      

       DELETE FROM [Northwind].[dbo].[Shippers]

       WHERE ShipperID = @ShipperID

      

END

GO

 

 

 

Stored Procedure Entity 업데이트

EDM 프로시져를 가져오겠습니다. “update Model from Database…”메뉴를 클릭해주세요.

07_01.jpg

[그림 7-1] 모델 업데이트

 

앞에서 생성한 프로시져를 선택해주세요.

07_02.jpg

[그림 7-2] Stored Procedure 추가

 

프로시져를 가져왔다면 엔티티 매핑 작업을 진행해주세요. EDM에서 매핑 상세에서 “Shippers” 엔티티의 프로시져 항목을 클릭하면 다음과 같은 화면이 나옵니다. Insert, Update, Delete에 맞는 프로시져를 맞춰서 설정해주면 자동으로 매핑이 됩니다.

 07_03.jpg

[그림 7-3] 엔티티 매핑

 

믿기지않겠지만,,, 다 끝났습니다.^^

 

Entity 생성(Insert)

소스 코드를 보면 아시겠지만 앞 세션에서 다룬 엔티티 생성 코드와 동일합니다.

 

        private void btnInsert_Click(object sender, EventArgs e)

        {

            using (var context = new NorthwindEntities())

            {

                Shippers shipper = new Shippers();

                shipper.CompanyName = "test 11";

                shipper.Phone = "(02)123-1234";

                context.Shippers.AddObject(shipper);

                context.SaveChanges();

                MessageBox.Show("record inserted");

            }

        }

   

 

SQL Profiler에서 확인하면 Shippers_INSERT” 프로시져가 호출되어 데이터가 추가된 것을 확인 할 수 있습니다.

07_04.jpg

[그림 7-4] SQL Profiler 데이터 추가


Entity 수정(Update)

엔티티 데이터 수정도 마찬가지입니다특정 항목에 대해서 데이터를 수정하고 SaveChange메서드를 호출하여 최종적으로 데이터베이스에 반영하는 액션을 취합니다.

 

        private void btnUpdate_Click(object sender, EventArgs e)

        {

            using (var context = new NorthwindEntities())

            { 

                var per = context.Shippers.Where(p => p.ShipperID == 7).First();

                per.CompanyName = "JYP Company 77";

                per.Phone = "(02)123-1234";

                context.SaveChanges();

                MessageBox.Show("record updated");

            }

        }

   

 

SQL Profiler에서 확인해보죠. “Shippers_UPDATE” 프로시져가 호출되고 있네요.

07_05.jpg

[그림 7-5] SQL Profiler 데이터 수정

 

Entity 삭제(Delete)

데이터 삭제하는 부분도 확인해보겠습니다.

 

        private void btnDelete_Click(object sender, EventArgs e)

        {

            using (var context = new NorthwindEntities())

            {

                var shipper = context.Shippers.Where(p => p.ShipperID == 9).First();

                context.DeleteObject(shipper);

                context.SaveChanges();

 

                MessageBox.Show("record deleted");

            }

        }

   

 

역시 Shippers_DELETE” 프로시져가 호출되고 있습니다.^^

07_06.jpg

[그림 7-6] SQL Profiler 데이터 삭제

 

이번에 알아본것은 간단히 요약하자만 특정 엔티티 기준에서 데이터 작업을 할 경우 Stored Procedure를 사용하는 것을 확인해봤습니다현업에서는 Stored Procedure를 활용을 많이 하기때문에 알아두시면 유용하게 사용될거라 생각됩니다 ㅋㅋ 이번 세션은 여기까지읽어주셔서 감사합니다. (_._)꾸벅

소스 코드 : EF4.07.zip

 

sqler에 아티클 작성 했던것을 공유합니다.

출처 : http://www.sqler.com/400553


Posted by 사나에