본 번역문서는 ASP.NET Web API 기술을 널리 알리고자 하는 개인적인 취지로 번역되어 제공되는 문서로, 원문을 비롯한 모든 저작권은 마이크로소프트사에 있습니다. 마이크로소프트사의 요청이 있을 경우, 언제라도 게시가 중단될 수 있습니다. 본 번역문서에는 오역이 포함되어 있을 수 있으며 주석도 번역자 개인의 견해일뿐입니다. 마이크로소프트사는 본 문서의 번역된 내용에 대해 일체의 보장을 하지 않습니다. 번역이 완료된 뒤에도 제품이 업그레이드 되거나 기능이 변경됨에 따라 원문도 변경되거나 보완되었을 수 있으므로 참고하시기 바랍니다.

Web API 개발 시, 다른 개발자들이 API의 사용법을 이해할 수 있도록 도움말 페이지를 함께 제공해주면 좋을 것입니다. 그리고, 이 도움말 페이지를 수작업으로 작성할 수도 있겠지만, 기왕이면 자동으로 생성하는 것이 더 편리할 것입니다.

ASP.NET Web API는 이런 작업들을 보다 손쉽게 처리할 수 있도록, 도움말 페이지를 런타임에 자동으로 생성할 수 있는 라이브러리를 제공해줍니다.



API 도움말 페이지 작성하기

먼저 ASP.NET and Web Tools 2012.2 Update 부터 설치해야 합니다. 이 업데이트는 Web API 프로젝트 템플릿에 도움말 페이지를 통합시켜 줍니다.

그런 다음, Web API 프로젝트 템플릿을 선택해서 새로운 ASP.NET MVC 4 프로젝트를 생성해보면, 프로젝트 템플릿에 의해서ValuesController라는 이름의 예제 API 컨트롤러가 생성될 것입니다. 이때, API 도움말 페이지도 함께 생성되는데, 참고로 도움말 페이지와 관련된 모든 코드 파일들은 프로젝트의 Areas 폴더에 위치합니다.

응용 프로그램을 실행시켜 보면, 홈 페이지에 API 도움말 페이지로 이동하는 링크가 추가되어 있는 것을 확인할 수 있습니다.

이 링크를 클릭하면 API 요약 페이지로 이동하게 됩니다.


이 도움말 페이지의 MVC 뷰는 Areas/HelpPage/Views/Help/Index.cshtml에 정의되어 있습니다. 따라서, 이 뷰 페이지를 수정하면 레이아웃이나 소개글, 제목, 형태 등을 원하는 대로 자유롭게 변경할 수 있습니다.

이 페이지의 핵심 부분은 API들의 표로, 컨트롤러를 기준으로 분류되어 있습니다. 그리고, 표의 각 항목들은 IApiExplorer 인터페이스를 통해서 동적으로 생성됩니다. (잠시 뒤에 이 인터페이스에 관해서 다시 살펴볼 것입니다.) 그래서, 새로운 API 컨트롤러가 추가되면 실시간으로 표가 갱신됩니다.

이 표의 "API" 컬럼에는 HTTP 메서드와 관련 URI들의 조합이 나타납니다. 그리고, "Description" 컬럼에는 각 API에 대한 설명이 제공되는데, 처음에는 아주 기초적인 내용들만 나타납니다. 다음 절에서는 XML 주석을 이용해서 이 설명을 편집하는 방법을 살펴볼 것입니다.

각 API 컬럼에는 요청 예제나 응답 본문 등을 비롯한 보다 자세한 정보들을 제공해주는 페이지로 이동할 수 있는 링크가 걸려 있습니다.

노트: NuGet 패키지 관리자를 이용해서 도움말 페이지를 추가할 수도 있습니다. 이 방법은 "Web API" 템플릿 대신 다른 프로젝트 템플릿을 통해서 프로젝트를 시작한 경우에 유용합니다. 도움말 페이지 패키지를 설치하려면, 패키지 관리자 콘솔에서 다음 명령을 실행합니다:
Install-Package Microsoft.AspNet.WebApi.HelpPage

API 문서 추가하기

기본적으로 도움말 페이지는 아주 기초적인 설명만을 제공해줍니다. 그러나, XML 문서 주석을 활용해서 이 설명을 편집할 수도 있습니다. 이 기능을 활성화하려면 Areas/HelpPage/HelpPageAreaRegistration.cs 파일을 열고 다음 줄의 주석을 제거하십시요:

config.SetDocumentationProvider(new XmlDocumentationProvider(
    HttpContext.Current.Server.MapPath("~/App_Data/XmlDocument.xml")));

그런 다음, 이번에는 XML 문서를 활성화시켜야 합니다. Visual Studio의 솔루션 탐색기에서 마우스 오른쪽 버튼으로 프로젝트를 클릭한 다음, 속성 (Properties)을 선택하고, 빌드 (Build) 페이지를 선택합니다.

계속해서 출력 (Output) 영역 하위의 XML 문서 파일 (XML documentation file) 항목을 체크한 다음, 그 우측의 입력 박스에 "App_Data/XmlDocument.xml"이라고 입력합니다.

그런 다음, /Controllers/ValuesControler.cs 파일에 정의되어 있는 ValuesController API 컨트롤러의 코드를 열고, 컨트롤러 메서드에 약간의 설명 주석을 추가합니다. 다음은 그 사례입니다:

/// <summary>
/// Gets some very important data from the server.
/// </summary>
public IEnumerable<string> Get()
{
    return new string[] { "value1", "value2" };
}
    
/// <summary>
/// Looks up some data by ID.
/// </summary>
/// <param name="id">The ID of the data.</param>
public string Get(int id)
{
    return "value";
}
: 캐럿을 메서드의 바로 위쪽 줄에 위치시킨 다음, 슬래시 문자를 세 개 입력하면 Visual Studio가 자동으로 XML 요소들을 삽입해줍니다. 그러면, 이 XML 요소들의 빈 칸을 채우기만 하면 됩니다.

이제 응용 프로그램을 다시 빌드하고 실행한 다음, 도움말 페이지로 이동해봅니다. 그러면, API 표에 주석에 입력한 내용들이 나타나는 것을 확인할 수 있습니다.

참고로 도움말 페이지는 런타임에 XML 파일로부터 문자열을 읽어들입니다. (따라서 응용 프로그램을 배포할 때, 이 XML 파일도 함께 배포해야만 합니다.)

내부 동작 방법

도움말 페이지는 Web API 프레임워크의 일부인 ApiExplorer 클래스를 기반으로 동작합니다. 이 ApiExplorer 클래스는 도움말 페이지를 생성하기 위한 기본적인 내용들을 제공해줍니다. ApiExplorer 클래스는 각 API들을 기술하는 ApiDescription 클래스들 갖고 있는데, 여기에서 말하는 "API"는 HTTP 메서드와 관련 URI의 조합으로 정의됩니다. 예를 들어서, 다음은 몇 가지 개별적인 API들의 목록입니다:

  • GET /api/Products
  • GET /api/Products/{id}
  • POST /api/Products

컨트롤러 액션이 복수의 HTTP 메서드들을 지원하는 경우, ApiExplorer 클래스는 각각의 HTTP 메서드들을 모두 별개의 API로 취급합니다.

그리고, 특정 API를 ApiExplorer 클래스로부터 감추려면 다음과 같이 ApiExplorerSettings 어트리뷰트를 액션에 추가하고 IgnoreApi 속성을 true로 설정하면 됩니다.

[ApiExplorerSettings(IgnoreApi=true)]
public HttpResponseMessage Get(int id) {  }

이 어트리뷰트는 컨트롤러에도 추가할 수 있으며, 그럴 경우 컨트롤러 전체가 숨겨집니다.

이 ApiExplorer 클래스는 IDocumentationProvider 인터페이스를 통해서 설명 문자열을 가져옵니다. 앞에서 살펴본 것처럼, 도움말 페이지 라이브러리는 XML 설명 문자열에서 설명을 가져오는 IDocumentationProvider 인터페이스를 제공해주며, 해당 코드는 /Areas/HelpPage/XmlDocumentationProvider.cs 파일에 존재합니다. 직접 IDocumentationProvider 인터페이스를 구현해서 다른 소스에서 설명을 가져올 수도 있는데, 이를 설정하려면 HelpPageConfigurationExtensions 클래스에 정의되어 있는SetDocumentationProvider 확장 메서드를 호출하면 됩니다.

ApiExplorer 클래스는 각 API들에 대한 설명 문자열을 얻기 위해서 자동으로 IDocumentationProvider 인터페이스를 호출합니다. 그리고, 이를 ApiDescription 개체와 ApiParameterDescription 개체의 Documentation 속성에 저장합니다.

다음 단계

본 자습서에서 살펴본 도움말 페이지 관련 내용에만 얽매일 필요는 없습니다. 애초에, ApiExplorer 클래스 자체가 도움말 페이지 생성 용도로만 사용하기 위한 것도 아닙니다. 이를테면, Yao Huang Lin은 사고의 틀을 깰 수 있게 해주는 몇 가지 멋진 블로그 포스트를 공개했습니다:


- 출처 : http://www.egocube.pe.kr/Translation/Content/asp-net-web-api/201308140001


'Programming > C#, ASP' 카테고리의 다른 글

Mono project  (0) 2015.04.22
Deployment Dependency Problems  (0) 2015.02.06
C# XML/XmlReader  (0) 2015.01.20
Troubleshooting Common Problems with the XmlSerializer  (0) 2015.01.20
프로젝트에 포함된 파일 access  (0) 2015.01.07

요즘 Restful API를 개발하면서 APICpntroller를 사용하여 개발하는 빈도가 높아졌다.

그래서 UI가 없는 단순 string 위주의 response가 많아지면서 내가 개발한 API를 사용하여 application를 개발하는 counter part의 개발자들에게 정해진 형식(json, xml)의 형태로 선개발을 진행 할 수 있도록 dummt data를 주는 프로그램을 만들면서 프로젝트에 포함된 파일을 access 하는 방법이 필요하게 되었다.


json으로 반환하는 data중에 xml row data를 반환하게 되어 있는데 하나의 xml이 굉장히 길었기 때문에 파일 io로 구현하기로 했는데 여러 방법을 시도해본 결과 다음과 같은 방법을 선택하였다.


먼저 환경은 asp.net MVC4이고 파일 경로는 프로젝트내 App_Data폴더에 추가 하였다.


public ReturnModel GetList()

        {

            item.Provider = 1;

            item.ResultList = new List<CommonResultModel>();


            string text = System.IO.File.ReadAllText(AppDomain.CurrentDomain.GetData("DataDirectory").ToString() + @"/1.xml", Encoding.Default);



            for (int i = 0; i < 20; i++)

            {

                CommonResultModel model = new CommonResultModel();

                model.GenreList = new List<string>();

                model.GenreList.Add("Politik & Weltgeschehen");

                model.GenreList.Add("Politik & Zeitgeschehen");

                model.ContentUrl = "http://83.125.32.32/hbbtv-ard/";

                model.Title = i + ". Franziskus' Kampf um Reformen geht in die heikle Phase";

                model.ThumbnailUrl = "http://83.125.32.35/hbbtv-ard/";

                model.Description = "Im Ringen um Reformen in der katholischen Kirche haben sich Tonfall und Gangart im Vatikan verschärft. In der Kurie und bei brennenden Fragen zu Ehe, Familie und Sexualmoral fehlen dem Papst eindeutige Mehrheiten. Gegner wittern Morgenluft. (Autor: Mike Lingenfelser)";

                model.Id = i;

                model.CreatedDate = String.Format("{0:yyyy-MM-dd}", new DateTime(2014, 12, 02));

                model.UpdatedDate = String.Format("{0:yyyy-MM-dd}", new DateTime(2014, 12, 02));

                model.Extends = text;


                item.ResultList.Add(model);

            }

            return item;

        }


중간에 AppDomain.CurrentDomain.GetData("DataDirectory").ToString() + @"/1.xml" 이 부분인데 "DataDirectory"라고 해도 App_Data폴더 주소가 나오는게 신기(?)했다.


-출처 : http://stackoverflow.com/questions/1268738/asp-net-mvc-find-absolute-path-to-the-app-data-folder-from-controller

'Programming > C#, ASP' 카테고리의 다른 글

Mono project  (0) 2015.04.22
Deployment Dependency Problems  (0) 2015.02.06
C# XML/XmlReader  (0) 2015.01.20
Troubleshooting Common Problems with the XmlSerializer  (0) 2015.01.20
ASP.NET Web API 도움말 페이지 작성하기  (0) 2015.01.15
모든 검색 엔진이 그렇지만 검색 창에 단순히 찾고자 하는 단어 하나나 무의미하게 단어를 나열해서는 원하는 정보를 제대로 찾기가 쉬운 일이 아니다. 초창기에는 검색 결과가 너무 적어서 문제였지만 요즘에는 너무 많아서 문제다. 아무튼 자신이 주로 사용하는 검색 엔진이 있다면 사용 방법을 꼭 숙지하는 것이 우선이다.

여기에 설명하는 구글(Google) 검색 팁은 매일 수시로 사용하는 기본적인 것이다. 그동안 그냥 아무 생각없이 검색 창에 단어를 입력하고 결과 목록을 뒤졌다면 챙겨두면 유용할 것이다.

1. 큰따옴표 사용으로 특정 단어 또는 어구만 검색하기
아래 그림은 검색 창에 [전자 상거래]라고 입력한 결과이다. 약 9,970,000개의 결과가 나왔다.



아래 그림은 ["전자 상거래"]라고 입력한 결과로 약 9,950,000개의 결과물이 나왔다. "전자"나 "상거래"가 정확히 한 어구로 붙어 있지 않은 경우는 제외가 된 것이다. 확실히 결과 목록이 다르게 나타난다.



아래 그림은 각각 [South Korea]와 ["South Korea"]일 때의 결과이다.





사실 영문의 경우 단수(korea)와 복수(koreas)의 결과도 다르게 나타난다.

참고 글: [Google] 구글은 복수와 단수를 구별한다(2005. 8. 21.)

2. 필요없는 단어 빼기
특정 단어를 포함한 결과물은 제외하고 싶다면 해당 단어 앞에 "-"(하이픈. 따옴표 제외)을 넣으면 된다. 아래 그림은 [박철우]라는 검색어를 넣은 것이다.



지금도 활동하는지는 모르겠지만 REF라는 음악 그룹에도 같은 이름이 있다. 그래서 다음은 이를 제외한 것이다.



유명한 배구 선수도 있다. 그래서 또 뺐다.



3. 특정 사이트에서만 검색하기
검색 범위를 특정 사이트로만 한정하려면 아래 그림과 같이 "site:"라는 예약어를 사용한다. 아래 그림은 "전자 상거래"라는 검색어를 "서울대학교(snu.ac.kr)"에서만 찾는 것이다.



다음은 검색 범위를 학교 기관까지 넓혀 "site:ac.kr"이라고 넣은 것이다.



다음은 해당 검색어를 우리나라 정부 기관 사이트(site:go.kr)에서만 찾은 결과이다.



다음은 해당 검색어를 우리나라 연구 기관 사이트(site:re.kr)에서만 찾은 결과이다. 이런 용도로는 사용할 일이 많을 것이다.



4. 동의어 등 비슷한 단어들도 한 번에 다 검색하기
한글로 [음식]을 입력하고 검색을 하면 아래 그림과 같이 "요리"라는 단어도 함께 찾아준다. 이런 식으로 한글(Korean)을 입력한 경우에는 비슷한말, 기본형, 철자가 틀린 말 등도 같이 찾아준다. 예를 들어, "프레젠테이션"을 검색하면 "프리젠테이션"도 같이 찾는다.



검색어가 영어인 경우에는 아래 그림과 같이 입력한 그 단어만 찾게된다.



이를 유사한 단어까지 확장하려면 단어 앞에 "~"(물결표)를 해주면 된다. 검색어 "food"인 경우에는 "recipe", "cooking", "nutrition" 등의 단어도 같이 찾는다.



5. 특정 형식의 파일만 찾기
Word(워드)나 Excel(엑셀) 등 특정 형식의 파일만 찾을 때에는 "filetype:"라는 예약어를 사용한다. 다음 그림은 PowerPoint(파워포인트) 파일만 찾기 위래 "filetype:ppt"를 사용한 것이다. 결과물 링크 앞에 [PPT]라고 표시되어 나온다.



아래 그림은 PDF 파일만 찾는 것이다.



아래 그림은 한/글(아래아한글)만 찾는 것이다. 확장자인 HWP가 정식으로 인식되지 않기 때문에 링크 앞에 [HWP]라는 표식은 없지만 해당 형식의 파일만 찾아주기는 한다.



6. 두 개 이상의 검색어 중 하나만이라도 있으면 다 찾아오기
기본적으로 검색 창에 두 개 이상의 단어를 입력하면 이 단어가 모두 들어 있는 페이지를 찾아오게 된다. 하지만, "OR" 연산자를 사용하게 되면 이 중 하나만 들어 있어도 해당 페이지를 불러온다. "OR"(따옴표 제외)는 항상 대문자로 써야 한다.






7. 숫자 범위로 검색하기
2000~2007년 사이의 모든 숫자(2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007)를 모두 검색어로 넣어야 하는 경우 ".."(마침표 두 개)를 사용하면 된다.



8. 검색 창을 계산기로 사용하기
정말 유용하게 사용할 수 있다. 참고로 이런 용도로 검색 창을 사용할 때에는 [검색] 단추를 누르거나 [Enter] 키를 치기 전에 검색어 맨 뒤에 "="(등호)를 넣어주는 것이 좋다.






참고 글: [Excel/Google] Excel과 Google을 간단한 계산기로 활용하기(2007. 8. 1.)

9. 단어의 정의 찾기
특정 단어의 정의(설명)를 찾고 싶다면 "define:"이라는 예약어를 사용한다. 한글 단어는 아직 결과물이 없지만 사전식으로 용어를 찾을 때 유용하다.



10. 웹 페이지 주소(URL)에 있는 단어로 검색하기
인터넷에 있는 모든 파일(객체)에는 고유한 주소가 있다. URL이 그것인데 우리가 흔히 인터넷 주소라고 하는 것이다. "http://www.cantips.com/abc"나 "http://www.cantips.com/sample.pdf"와 같이 생겼다. 이 주소에 있는 단어만 찾으려면 "inurl:"이라는 예약어를 쓰면 된다. 아래 그림은 URL에 "report"라는 단어가 들어간 곳만 찾는 것이다.



아래 그림과 같이 사용하면 우리나라 정부 기관의 웹 페이지 중 report라는 이름이 들어간 곳을 찾을 수 있다.



URL에는 파일 이름도 포함이 되므로 아래와 같이 사용하면 우리나라 연구 기관의 홈 페이지에서 "보고서"라는 글자가 들어가 있는 파일들만 불러오게 된다. 보통 파일 이름에는 한글을 쓰게 되지만 파일 이름이 아닌 폴더 이름에는 한글을 잘 쓰지 않는다.



출처 : http://cantips.com/686 


'Useful Tips' 카테고리의 다른 글

기술 아티클  (0) 2020.06.23
E-mail 맺음말 (Sign off)  (0) 2020.04.24
DSM 6.2.3의 새로운 기능  (0) 2020.04.19
FineDrive 업데이트시 압축해제 오류  (2) 2019.05.31

+ Recent posts