티스토리 뷰

반응형

지난번에도 이와 관련한 포스트를 올렸는데..Visual Studio 2013이 나온 후 이전과는 완전 다른 방법으로 만들도록 되어 있어서, 다시 포스팅을 한다. 이제는 다시 뒤집지 않았으면 하는 바램이..쿨럭;;

 

참고 포스트

Creating an OData Endpoint in ASP.NET Web API

http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/creating-an-odata-endpoint

 

* 이 포스트는 참고 포스트를 거의 그대로 따라하는 내용임

 

요구사항

Visual Studio 2013과 ASP.NET and Web Tools 2012.2 Update 가 설치 되어 있어야지만 사용 가능

 

프로젝트 만들기

File -> New -> Project -> New Project 창에서 Web을 선택하고 ASP.NET Web Application을 선택

 

기타 프로젝트 이름은 그대로 동일하게 사용했고 위치는 본인 컴퓨터에 위치를  

 

 

 

Empty템플릿을 선택하고 Web API에 체크를 한 후 OK를 눌러서 프로젝트를 생성한다.

 

 

모델 추가

솔루션 탐색기에서 Models폴더를 선택 한 후 마우스 오른쪽 클릭 -> Add -> Class 선택

클래스명에 Product를 입력 후 Add 클릭

 

기본 Product.cs 모델이 추가되는데

public class Product
{
   
public int ID { get; set; }
   
public string Name { get; set; }
   
public decimal Price { get; set; }
   
public string Category { get; set; }
}

위의 내용을 복사해서 붙여 넣는다.

 

Code-First에서 ID, Id의 이름을 가지는 프로퍼티는 테이블로 만들어 질때 키 값으로 사용된다.

복사해서 붙여 넣은 후 꼭 F6을 눌러서 빌드를 해준 후 다음으로 넘어간다.(빌드를 하지 않을 경우 스카폴딩이 않되서 오류가 발생한다.)

 

OData 컨트롤러 추가

솔루션 탐색기에서 Controller 폴더를 선택 한 후 마우스 오른쪽 클릭 -> Add -> Controller 선택

 

상당히 마음에 드는 화면인데, 이전에 비해서 많은 발전을 한 것 같은 느낌이 든다. Web API 2 OData Controller with actions, using Entity Framework를 선택 한다.

 

컨트롤러 이름은 위와 같이 수정하고, Use Async controller actions에 체크를 해서 비동기 형태로 만들어 지게 한다. 모델은 드롭다운 박스에서 하나를 선택하면 되고, Data context는 New data context 버튼을 눌러 만들면 된다.

 

스카폴딩이 완료되면, ProductsController.cs, ProductServiceContext.cs파일이 추가된 것을 확인 할 수 있다.

 

EDM과 Route 추가

솔루션 탐색기에서 App_Start 폴더를 확장하면 WebApiConfig.cs파일이 있는데 이 부분을 수정해서 WebAPI에서 모델을 사용할 수 있도록 한다.

 

using ProductService.Models;
using System.Web.Http;
using System.Web.Http.OData.Builder;

namespace ProductService
{
   
public static class WebApiConfig
   
{
       
public static void Register(HttpConfiguration config)
       
{

               //복사해서 붙여 넣으면된다.
           
ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
            builder
.EntitySet<Product>("Products");
            config
.Routes.MapODataRoute("odata", "odata", builder.GetEdmModel());
       
}
   
}
}

 

각 코드의 내용이 궁금하면 원본 포스트에 설명이 있으니 참고하면 된다. 다음으로 넘어가기 전에 F6을 눌러 빌드를 한번씩 해주는 것이 좋다.

 

데이터베이스 시드(초기값)

이번에 새로운 방법으로 만들면서 좋게 변했다고 생각하는 부분이 이제 시작되는데, 데이터베이스를 만들고 초기값을 넣어야 하는 경우에 일일이 코딩으로 만들어서 처리를 했는데, 이제 이 부분까지 어느정도 자동으로 처리가 가능하다.

 

솔루션 탐색기 -> 프로젝트 선택 -> Tool -> Library Package Manager -> Package Manager Console을 선택하면 Console창이 하나 나타 난다. 일반적으로는 이곳에 Nuget package를 설치하는 명령어를 입력하게 되었었는데

 

Enable-Migrations

이란 단어를 입력하고 엔터를 치면, 솔루션 탐색기에 Migrations이라는 폴더가 생성이 되고, Configurations.cs파일이 추가 되어있는 것을 확인 할 수 있다.

 

Configuration.Seed 메소드를 아래와 같이 수정한다. 물론 네임스페이스는 추가해 주어야한다.

 

protected override void Seed(ProductService.Models.ProductServiceContext context)
{
   
// New code
    context
.Products.AddOrUpdate(new Product[] {
       
new Product() { ID = 1, Name = "Hat", Price = 15, Category = "Apparel" },
       
new Product() { ID = 2, Name = "Socks", Price = 5, Category = "Apparel" },
       
new Product() { ID = 3, Name = "Scarf", Price = 12, Category = "Apparel" },
       
new Product() { ID = 4, Name = "Yo-yo", Price = 4.95M, Category = "Toys" },
       
new Product() { ID = 5, Name = "Puzzle", Price = 8, Category = "Toys" },
   
});
}

 

그리고, Console창에 아래 두가지 명령을 더 입력한다.

 

Add-Migration Initial
Update-Database

 

마이그레이션 폴더에 초기화 클래스가 추가되고, Database 연결 문자열도 Web.config에 추가된다.

 

여기까지 작업 후 F5를 눌러 실행한다.

 

뭔가 잘못된 것은 아니다, 단지 이 서비스는 웹 페이지가 없기 때문에 위와 같이 나오는 것 뿐이니 넘어가자

 

http://localhost:52742/odata

주소 창에 위와 같이 입력하면 아래와 같은 결과가 반환된다.

 

<?xml version="1.0" encoding="utf-8"?>
<service xml:base="http://localhost:52742/odata" xmlns="http://www.w3.org/2007/app" xmlns:atom="http://www.w3.org/2005/Atom">
  <workspace>
    <atom:title type="text">Default</atom:title>
    <collection href="Products">
      <atom:title type="text">Products</atom:title>
    </collection>
  </workspace>
</service>

 

http://localhost:52742/odata/Products

주소 창에 위와 같이 입력하면 아래와 같은 결과가 반환된다.

{
  "odata.metadata":"http://localhost:52742/odata/$metadata#Products","value":[
    {
      "ID":1,"Name":"Hat","Price":"15.00","Category":"Apparel"
    },{
      "ID":2,"Name":"Socks","Price":"5.00","Category":"Apparel"
    },{
      "ID":3,"Name":"Scarf","Price":"12.00","Category":"Apparel"
    },{
      "ID":4,"Name":"Yo-yo","Price":"4.95","Category":"Toys"
    },{
      "ID":5,"Name":"Puzzle","Price":"8.00","Category":"Toys"
    }
  ]
}

 

여기까지 하면 기본적인 서비스 생성이 완료된 것이다. 이전 버전에 비해 좀더 고급스러워 졌다는 느낌이 든다.

 

반응형
댓글