SharePoint 개체를 액세스 하기 위해서는 Microsoft.SharePoint.dll 이 있어야 하는데 원격 클라이언트에서는 Microsoft.SharePoint.dll 어셈블리를 접근하기 곤란합니다. SharePoint 2010에서는 Client Object Model을 제공해서 원격 클라이언트에서 손쉽게 SharePoint 데이터를 액세스할 수 있습니다.
아래 그림은 Client Object Model을 설명하면서 언급하는 그림인데 저는 먼저 코드를 나열하고 살펴봅니다.
Client Object Model을 사용할 수 있는 주된 이유는 아래 그림의 SharePoint 서버쪽의 Client.svc 때문입니다. Client.svc가 서버 개체 모델을 액세스해서 JSON 포맷으로 결과를 반환해주게 되며 클라이언트에서는 Proxy를 통해 손쉽게 액세스하게 됩니다.
이전 블로그에서는 javascript로 SharePoint 항목의 데이터를 추가하는 것을 알아보았는데 이번 블로그에서는 공지사항 목록을 생성하는 내용을 알아보겠습니다. 여기까지 Client Object Model을 살펴보시면 SharePoint Server Object Model의 내용을 그대로 원격 클라이언트 위에서도 사용이 가능하다는 것을 알 수 있습니다.
Visual Studio 2010을 이용해서 빈 SharePoint 프로젝트를 생성하여 Application Page를 추가합니다. 추가한 페이지에 아래와 같은 코드를 작성하고 결과를 확인해봅니다.
추가한 Application Page 의 PageHead content 부분에 아래 내용을 추가합니다.
이번 세션에서는 SharePoint 2010 Server Object Model 중에서 새롭게 등장한 LINQ to SharePoint 를 알아보도록 하겠습니다. 서버 개체 모델이므로 웹 파트 등 서버박스 위에서 실행됩니다.
LINQ 에 대한 내용은 잘 알고 계실 것이므로 구체적으로 언급하지 않아도 될 듯 하구요.
SharePoint 에서는 2010 버전에서 SharePoint 개체에 대한 LINQ를 사용할수 있습니다.
LINQ to SharePoint 를 SPLinq 라고도 부릅니다.
LINQ to SharePoint 가 별거 아니라고 볼 수도 있지만 CAML을 가지고 작업하는 것 보다는 생산성이
백만 배 향상되었다고 개인적으로 생각합니다.
CAML은 SPQuery 라는 클래스의 Query 라는 속성에 미리 정의되어 있는 XML 태그를 사용합니다.
간단한 예를 보시면 아래와 같습니다.
query.Query =@ "<Where>
<And>
<Eq><FieldRef Name=Title/><Value Type='Text'>”+
title +
"</Value></Eq>
<And>
</Where>";
위의 구문은 조건식이 하나로 Title이라는 필드의 값이 일치하는 것만 필터링하는 내용입니다. 위 구문 정도야 그냥 쓰면 되지 라고 하실 수 있지만 조건식이 AND, OR 가 여러 개 처리된다거나 다른 목록과 조인을 한다거나 요구사항이 조금만 복잡해지면 만들기 정말 복잡합니다. 에러는 발생하지 않는데 CAML이 틀려 값이 나오지 않으면 원인 해결에도 시간이 상당히 걸립니다.
그래서 SharePoint 2010에서는 SPLinq를 통해서 생산성을 높여주고 있습니다.
SPLinq를 사용하기 위해서는 먼저 SharePoint 개체 모델에 대한 Entity 클래스가 생성되어야 합니다. 그리고 나면 Entity 클래스를 이용해서 LINQ 구문을 작성하면 됩니다.
아래로 이동해서 “SPMETAL.EXE” 를 실행하면 됩니다. /? 로 도움말을 확인하실 수 있습니다.
C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\BIN
SPMETAL 이 Entity 클래스를 생성해주는 유틸리티이며 사이트 컬렉션 주소를 주면 해당 개체에 대한 프록시 클래스 형태를 제공해줍니다.
제가 적용할 시나리오는 아래와 같습니다.
아래처럼 공지사항이 있는데 SharePoint 라는 말이 제목에 있는 항목들만 필터링한 결과를 SPLinq를 통해 액세스해보도록 하겠습니다.
웹 파트를 만들거나 서버 박스 위에서 실행되는 유틸리티를 통해서 접근할 수 있습니다. 먼저 EXE를 통해 액세스 해봅니다.
Visual Studio 2010을 이용하여 WPF 응용 프로그램을 하나 생성합니다. 이름은 WpfSPLinqDemo 라고 하겠습니다.
이제 Entity 클래스를 생성해보도록 하겠습니다.
HJ 라는 클래스를 프로젝트에 추가해서 LINQ를 통해 액세스 하면 됩니다.
HJ 클래스를 살펴보면 SharePoint 목록에 대한 클래스와 속성을 가지고 있는 것을 알 수 있습니다.
위에서 보시는 것처럼 한글 SharePoint 를 액세스하면 클래스와 속성 이름이 한글로 나타나는 측면이 있으며 C# 코드에서도 한글로 클래스를 정의해야 한다는 것이 좀 이상해집니다. 헐~
이제 LINQ to SharePoint 코드를 작성해서 결과를 확인합니다.
WPF의 ListBox 컨트롤에 LINQ 결과를 바인딩해서 표시해줄 수 있습니다.
결과는 아래와 같습니다.
웹파트에 SPLinq를 적용한 결과는 아래와 같습니다.
SPLinq를 알아보았는데 실행시에는 CAML로 변경되어 처리가 됩니다. 개발자들이 직접 CAML을 작성하는 것보다는 SPLinq를 통해 생산성이 향상되는 내용을 알아보았습니다.
이전 버전에서는 SharePoint 관련 개체와 데이터를 액세스하는 것은 서버 측면에서는 SharePoint Server Object Model과 CAML 을 사용하고 원격 클라이언트에서는 SharePoint Web Service를 이용했습니다. SharePoint Web Service 나 CAML 의 사용이 쉽지 않았고 개발하기가 불편했습니다.
SharePoint 2010에서는 아래 그림처럼 클라이언트 측면에서 Client Object Model 을 제공하고 있으며 REST 기반의 액세스가 가능합니다. 서버 측면에서는 CAML 대신 LINQ를 사용할 수 있게 되었습니다.
이전 버전과 비교해서 생산성이나 접근할 수 있는 부분이 다양해서 아주 유용하게 사용할 수 있습니다.
Server Object Model을 알아보면 SharePoint 머신 위에서 구동되는 웹 파트, 이벤트, 관리자 프로그램, 배치 프로그램 등이며 SharePoint 어셈블리를 직접 호출할 수 있다는 것이 Server OM입니다.
LINQ는 목록의 수 많은 항목 중에서 조건에 맞는 항목을 가져오고 원하는 정렬을 시키려고 하면 CAML이라는 XML을 직접 구성하고 SPQuery 라는 클래스를 통해 넘겨주어야 했습니다. 그래서 별도로 SharePoint MVP가 만든 CAML Builder 라는 도구가 유용하게 사용되었습니다. 2010 환경에서도 CAML은 사용이 가능합니다만 LINQ는 알고 있는 것처럼 쿼리 식으로 개체를 데이터처럼 액세스 할 수 있습니다. 웹 파트 등에 사용하면 아주 유용하다는 생각이 팍 드실 겁니다.
Client OM은 서버 머신 위가 아닌 원격 클라이언트에서 동작되는데 SharePoint 개체나 데이터를 원격 클라이언트에서 접근할 수 있다는 것입니다.
생성할 수 있는 유형은 .NET, Silverlight, Javascript 를 통해 접근할 수 있습니다. SharePoint 2010에서는 Silverlight 환경이 기본적으로 구비되어 있으며 Silverlight 웹 파트도 기본적으로 생성되어 있습니다. Client OM을 사용할 수 있는 내용으로 Silverlight 웹 파트를 생성해서 접근할 수 있습니다.
REST 기반 API 는 기존 웹 서비스보다 더 간단하게 사용이 가능하며 개체로 접근을 손쉽게 할 수 있습니다. ADO.NET Data Services 를 이용해서도 SharePoint 개체와 데이터를 액세스 할 수 있습니다.
SharePoint 2010 데이터 기술을 알아보았고 다음 블로그부터 하나씩 구체적으로 알아보도록 하겠씁니다.
댓글을 달아 주세요