2018년 10월 26일 금요일

Sitecore Symposium 2018 in Orlando FL, USA - 사이트코어 9.1 Overview

조금 늦었지만, 이번 달에 있었던 Sitecore Symposium에 대하여 이야기하도록 하겠다.
이번 Symposium은 작년에 출시된 Sitecore 9.0의 섭버전으로써, 9.1에서는 Performace 업그레이드를 중점을 두었다.

아래는 9.1에서 새로 공개된 기능들이다.
  • JSS - JavaScript Service로써, Headless CMS이다. 이는 굳이 Presentation Layer를 걸치지 않고, 자바스크립트 라이브러리를 이용하여 사이트코어 어플리케이션을 개발 및 Sitecore CMS로 퍼블리쉬할수가 있다. 참고로, JSS를 사이트코어에서 사용하기 위해서는 사이트코어 Subscription 버전의 라이센스를 사용하여야지 이용 및 개발이 가능하다. 이번에 업그레이드 되어진 버전은 xEditor 및 Personalization and Tracking 기능과 통합되었다.

  • XM Performance - 아래의 테이블처럼 컨텐츠 로딩 시간이 현저히 줄어들었고, 컨텐츠 서치 기능을 향상시켰다.

  • Forms - Forms기능은 9.0에서 새로 소개되었으며, 이번 버전에는 Form Condition기능을 추가하여 유저의 선택사항에 따라 다른 필드 옵션을 제공한다.

  • Update Center - 컨트롤 패널 또는 어드민 페이지에서 Sitecore를 업그레이드한것과 달리 Speak3 어플리케이션을 사용하여 새로운 UI에서 시스템을 업그레이드한다. 또한, 외부 소스를 쉽게 불러들일 수 있다. 업그레이드가 진행중일때는 사이트코어의 모듈 및 Enviornment 레이어가 Disable되고 사이트코어 업그레이 모드로 전환이된다.

  • Sitecore Identity - 9.0에서 소개된 Federated Authentication되었는데, 이번에는 추가적으로 SSO (Single Sign On)을 제공한다. 만약, 멀티플 사이트코어를 관리해야한다면, 굳이 추가적인 로그인없이 XM, XP, xCommerce 등 쉽게 접속할수가 있다.

  • Universal Tracker - Web/REST API를 기반으로 트래킹하는 프레임워크로 Collection(수집), Storing(저장), Process(진행)순으로 Stage가 진행된다. Website뿐만 아니라 App, AR/VR 등 다양한 플랫폼으로부터 정보받아 Sitecore xDB와 연결을한다.

  • Horizon - 이는 작년에 이미 소개되었지만, 사이트코어 CMS의 새로운 UI/UX이다. Horizon의 새로운 시뮬레이션 기능과 유저 프로파일가능들은 충분히 발전된 기능이라고 할수있다. 아직 오피셜하게 공개되어지지 않은 관계로 Performance에 대하여 말하기는 어려운것같다.

  • Sitecore Host - Sitecore .Net Core로써, 이미 Sitecore Commerce에 도입하였지만, 이번에는 Sitecore Identity, Horizon, Universal Tracker에 사용되어진다. .Net Core을 도입함으로써 다른 OS Platform과 쉽게(?) 호환이 가능하다.



  • Cortex - 머신러닝(ML)로 다양한 디바이스 및 컨텐츠를 통합, 분석 및 테스트를 하며, 결과물을 유저에 맞춤형 서비스를 제공하고 데이타를 Personalization한다.

  • Cortex Tagging - Open Calais의 솔루션을 이용하여 SEO 및 컨텐츠를 서비하는데에 도움(?)을 주며, 마케팅 오토메이션과 유용하게 사용되어질수있다.


아래는 Sitecore 9.1 Overview에 사용되어진 슬라이드이다.





2018년 9월 14일 금요일

사이트코어 9 - Solr SSL 설치하기

사이트코어 개발자들은 환경에 따라 Sitecore를 자신의 컴퓨터에 설치해야하는 경우가 있다. 로컬 사이트코어 Instance를 설치함으로써 나만의 Playground가 형성되고, VM이나 서버환경에 접속하여 디버그 하는것보다 부담감(?)을 덜어낼수가 있다.
이번에는 그 중에서도 Solr 설치 및 xConnect와 호환하기 위하여 어떻게 SSL을 적용시키는지 알아보도록하자.

사이트코어 9+ 버전부터는 사이트코어 Instance내의 Lucence보다는 Solr 자체 서비엔진을 설치하고 xConnect 프레임워크를 통하여 데이터를 다른 어플리케이션 및 디바이스와 연동 할수가 있다.
Solr 설치 및 SSL 바운드가 제되로 되지않는다면 xConnect와 연동이 되지 않을뿐더러, Sitecore 플랫폼의 키 요소인 Experience Analytics 및 마케팅 기능들을 사용할수가 없다.

  1. Solr을 설치하기전 Java JDK (현재 필자의 경우 버전 1.8.0)를 설치하고, Command Prompt를 통하여 자바가 잘 작동되는지 그리고 "keytool" 커맨드가 이용가능한지 확인한다.
  2. Solr 다운로드 링크로 이동하여 6.2.2 버전을 원하는 경우에 설치한다. (예, C:\solr-6.2.2)
  3. Command Prompt에서 압축을 푼 경로의 "C:\solr-6.2.2\server\etc\"로 이동하여 아래의 커맨드를 실행한다.

    keytool -genkeypair -alias solr-ssl -keyalg RSA -keysize 2048 -keypass secret -storepass secret -validity 9999 -keystore solr-ssl.keystore.jks -ext SAN=DNS:localhost,IP:127.0.0.1 -dname "CN=localhost, OU=Organizational Unit, O=Organization, L=Location, ST=State, C=Country"
    

  4. 다시 아래의 커맨드를 입력하고 비밀번호를 설정한다. (비밀번호 예, secret)

    keytool -importkeystore -srckeystore solr-ssl.keystore.jks -destkeystore solr-ssl.keystore.p12 -srcstoretype jks -deststoretype pkcs12
    

  5. SSL 설치는 준비가 되었으며, 이젠 JKS keystore로 만들어진 PKCS12 (.p12) 파일을 더블 클릭하여, 로컬 컴퓨터에 Self Certification을 생성한다.
  6. Store Location을 Local Machine로 적용하고 "다음" 버턴을 누른다.

  7. "server\etc\" 폴더에 있는 .p12 파일의 경로를 확인하고, "다음" 버턴을 누른다.

  8. 이전에 설정하였던 비밀번호 "secret"을 입력하고, "다음" 버턴을 누른다.

  9. Certification 저장 경로는 "Trusted Root Certification Authorities"로 설정하고, 모든 세팅을 마친다.

  10. Solr 설치 경로의 "bin/" 폴더의 "solr.in.cmd" (Window 경우)를 오픈하여, 컨맨트 되어진 설정 (REM)들은 삭제하고 아래처럼 SSL설정을 Enable 한다.

    REM Uncomment to set SSL-related system properties
    REM Be sure to update the paths to the correct keystore for your environment
    set SOLR_SSL_KEY_STORE=etc/solr-ssl.keystore.jks
    set SOLR_SSL_KEY_STORE_PASSWORD=secret
    set SOLR_SSL_KEY_STORE_TYPE=JKS
    set SOLR_SSL_TRUST_STORE=etc/solr-ssl.keystore.jks
    set SOLR_SSL_TRUST_STORE_PASSWORD=secret
    set SOLR_SSL_TRUST_STORE_TYPE=JKS
    set SOLR_SSL_NEED_CLIENT_AUTH=false
    set SOLR_SSL_WANT_CLIENT_AUTH=false
    
  11. 머신에 Solr 서비스가 설치가 되어있지 않으므로, Command Prompt에서 Solr의 "bin/" 폴더로 이동하여 "solr start" 커맨드를 통하여 Solr를 실행한다.
  12. 브라우저에서 디폴트 포트 번호인 "8983"과 함께 "https://localhost:8983" 페이지를 오픈한여 Solr를 확인한다.





2018년 8월 21일 화요일

Sitecore Migration - Data Migration Assistant 사용하기

이전에 포스트 하였던 Sitecore Migration의 두번째로 필자가 경험하였던 문제에 대하여 이야기를 하고자한다.

Sitecore Migration은 사이트코어의 새로운 버전이 나올때마다, 개발자 또는 설계자들은 "어떻게 하면 가장 쉽고 안정적인 방식으로 데이타의 손실없이 Migration을 할수가 있을까?"가 첫번째의 과제이다. 그 다음으로는 기존에 사용하였던 방식 또는 설정들이 얼마나 새로운 버전에서 잘 호환되고 작동되는지를 눈여겨 봐야한다.

이번 포스트는 필자가 생각하는 데이터의 손실없이 가장 손 쉬운 방법으로 Migration하는것에 대하여 알아보도록 하겠다.

먼저, 이전에 사용해보았던, Sitecore Azure ToolKit은 Sitecore Azure Deployment의 목정으로써, Sitecore On-Prem Instance를 Azure Cloud로 Deploy를 할수가 있다. 패키지를 Powershell Script을 통하여 만드는데, 작업 시스템의 환경에 땨라 제한이 있을수 있다. (필자의 경우, 시스템에서 2GB의 패키지 제한이 있어, 기존 데이타를 포함 약 6GB에 해당되는 Sitecore Instance를 패키지하기에는 한계가 있었다.) 이로, 새로운 방법으로 Sitecore에서 추천한 SSMS (SQL Server Management Studio)을 사용하는것이다. SSMS에서 Azure SQL를 컨넥하고, 백업된 DB를 Import하는 방식인데, 이 역시 기존 Master DB의 테이블들을 백업하는데 무리가 있었다.

그래서 결론은 Data Migration Assistant (DMA).

DMA는 Microsoft에서 오피셜로 제공하며, 이는 기존 DB (Source)를 다른 DB (Target)으로 분석 및 검증과 함께 데이타베이스를 Migration할수가 있다. 아래는 필자가 DMA를 사용하여 Sitecore Migration을 한 진행과정을 나열하였다.
  1. 로컬머신에 Azure에 존재하는 같은 버전의 Sitecore Instance를 설치한다.
  2. SSMS에서 Azure SQL의 Master DB를 컨넥하고, 아래의 Statement를 적용하여 해당 테이블의 데이터를 모두 삭제한다. (반드시, 기존의 데이터는 백업을 미리해둔다.)

    truncate table AccessControl;
    truncate table Archive;
    truncate table ArchivedFields;
    truncate table ArchivedVersions;
    truncate table ArchivedItems;
    truncate table Blobs;
    truncate table ClientData;
    truncate table Descendants;
    truncate table EventQueue;
    truncate table History;
    truncate table IDTable;
    truncate table Links;
    truncate table Notifications;
    truncate table Properties;
    truncate table PublishQueue;
    truncate table SharedFields;
    truncate table Tasks;
    truncate table UnversionedFields;
    truncate table VersionedFields;
    truncate table WorkflowHistory;
    truncate table Items;
    
  3. DBA에서 소스/타켓 데이타베이스를 정하고, Migration을 시작한다.





  4. FTP를 통하여 Azure App Service에 연결하고, Custom 어플리케이션 또는 Config 파일들을 매뉴얼로 복사한다. (CMS / CDS if needs)
  5. Azure에서 App Service를 Restart한다.
  6. Sitecore CMS에 로그인하여 잘 작동(?)되는지 확인한다.
  7. Master DB만 Migration을 한 관계로, 혹 Core DB에서 Custom 업데이트가 있다면 사이트코어 CMS에서 패키지를 만들어 인스톨한다.
  8. 사이트코어 컨트롤 패널에서 "Clean up Databases"를 실행한다.
  9. 사이트코어 컨트롤 패널에서 "Rebuild Link DB"를 실행한다.
  10. 사이트코어 컨트롤 패널에서 "Rebuild Indexes"를 실행한다.
  11. 사이트코어 컨트롤 패널에서 "Deploy Marketing Definitions"을 실행한다.
  12. 사이트코어 컨트롤 패널에서 "Rebuild Link DB"를 실행한다.
  13. "Publish the site"를 통하여 Web DB로 컨텐츠를 Publish 한다.

DBA를 통하여 사이트코어 Migration을 하는데 아무런 문제없이 잘 진행될수있었다.



2018년 7월 17일 화요일

사이트코어 Copy vs Duplicate vs Clone

사이트코어를 사용하다보면 기본의 아이템 (item)과 그의 섭아이템 (subitem)을 복제하여야 하는경우가 많이 있다.
이번에는 사이트코어의 기본 기능중에 복사, 복제, 클론에 대하여 알아보도록 하자.

Copy (복사)

  • 선택되어진 아이템 (Source "/sitecore/homepage/source-item-page")과 그의 섭아이템을 다른 경로 (Destination "/sitecore/anotherpage/copied-item-page")로 복사를 한다.
  • Source경로에서 복사되어질 아이템의 프리젠테이션 레이아웃 디테일을 복사하고, 복사되어진 새로운 경로의 Datasource 경로는 업데이트 하지 않는다.
Source 경로: /sitecore/homepage/source-item-page/resource folder/body content
Destination 경로: /sitecore/anotherpage/copied-item-page/resource folder/body content

Duplicate (복제)

  • 선택되어진 아이템(Source, "/sitecore/homepage/source-item-page")과 그의 섭아이템을 같은 경로(Destination, "/sitecore/homepage/duplicated-item-page")로 복제를 한다.
  • Source경로에서 복사되어질 아이템의 프리젠테이션 레이아웃 디테일을 복사하고, 파이널 레이아웃의 Datasource 경로만 업데이트를 한다. Shared Layout의 컨트롤의 Datasource 경로는 변경하지 않는다.
  • 복제되어진 아이템을 다른 경로로 이동을 하면 Final Layout의 Datasource 경로도 새로운 경로와 함께 업데이트 된다.
Source 경로: /sitecore/homepage/source-item-page/resource folder/body content
Destination 경로: /sitecore/homepage/duplicated-item-page/resource folder/body content

Clone (클론)

  • 선택되어진 아이템(Source, "/sitecore/homepage/source-item-page")과 그의 섭아이템을 다른 경로(Destination, "/sitecore/anotherpage/cloned-item-page")로 복제를 한다.
  • Final Layout의 정보를 Reset 한다.
Source 경로: /sitecore/homepage/source-item-page/resource folder/body content
Destination 경로: /sitecore/anotherpage/cloned-item-page/resource folder/body content


2018년 7월 16일 월요일

사이트코어 심포지엄 - Sitecore Symposium 2018, 올랜도 플리리다

지난 해의 Sitecore Symposium 처럼 이번해에도 Sitecore는 플로리다 올랜도에서 Sitecore Symposium을 개최한다. 이번에도 역시 새로 적용된 기술을 소개할것이고, 조금 더 집중적으로 Cortext/ML/AI 및 Horizon & Zenith (UI/UX)에 관련하여 설명할것으로 예상된다.

현재까지 사이트코어 최신버전 9.0 Update 2이지만, 이번 Symposium 이후, 버전 9.1을 릴리즈 할것으로 예상되며, 새로운 기술뿐만 아니라 Keynote 및 Customer Event를 통하여 참석자들에게 다양한 경험을 제공할것이다. 참고로, 이번에 게스트 스피커로써 헐리우드 배우 윌 스미스 (Will Smith)가 참석한다.


Sitecore Symposium: 2018년 10월 8일 ~ 11일
Location: Walt Disney World Swan & Dolphin Resort, 올랜도 플로리다






2018년 6월 18일 월요일

사이트코어 내의 URL 마스크 (Alias) 설정하기

사이트코어 CMS에는 많은 기능이 포함되어있다. 그 중의 하나가 바로 Alias. 이 기능은 흔희 말하는 URL Mask 또는 cloaked URL이라고 불리며, 원래의 URL 링크주소를 Mask하여 다른 이름으로 바꿔주는 것이다.

보통 이 기능은 웹서버  (Rewrite Module) 또는 프로그래밍 상에서 Redirect Method (C#)를 사용하여 URL을 변경하지만, 사이트코어의 Aliases 기능을 통하여 쉽게 변경할수가 있다.

"http(s)://yoursite/blog/2018/11/25/My-Blog"를 "http(s)://mysite/blog/My-Blog"으로 변경하는것을 예로 들어 순서대로 세팅을 해보겠다.

  1. 해당 URL은 사이트 홈 (시작페이지) 아래의 "Blog" 아이템에서 URL이 시작하므로, "Blog" 아이템을 선택한다.
  2. Content Editor의 Presentation 탭 또는 Experience Editor의 Advance 탬에서 "Aliases"를 클릭한다.
  3. Name 필드에 "/blog" 입력하고, "Add" 버턴을 눌러 Aliases를 추가한다.

  4. 이젠, "My-Blog" 아이템을 눌러주고 같은 방법으로 Name 필드에 "/blog/My-Blog"를 추가한다.

  5. 위 두개의 아이템의 Aliases를 세팅함으로써 "/sitecore/system/Aliases/"에 "blog/My-Blog" 라는 아이템이 Linked 아이템과 함께 생성되었다.

  6. 원래 생성한 아이템 페이지로 가서 Related Item과 함께 아이템을 Publish하면, Alias가 적용된 URL로 페이지를 렌더링 할 수가 있다.
    http(s)://mysite/blog/My-Blog


* 참고로, 사이트코어의 Alias 기능은 Temporary Redirection 으로써 보통 Major Search Engine의 검색 결과에서는 기존의 URL (http(s)://mysite/blog/2018/11/25/My-Blog)로 결과물이 나타난다.

* 이번 예제는 Multi-Site가 아닌, 사이코어내의 기본 사이트 세팅에만 적용되는것이며, 한 Instance에 Multiple 사이트가 존재한다면, 아래의 링크를 통하여 Pipeline을 업데이트하길 바란다.
How to configure site-specific aliases (https://kb.sitecore.net/articles/565325)







2018년 5월 4일 금요일

Rich Text Editor (RTE)에 YouTube 버튼 추가하기

사이트코어는 Telerik 에디터를 기본 Rich Text Editor (RTE)로 사용하며, Core DB에서 HTML Profile 세팅을 통하여 CMS Author들에게 툴 사용 제한을 둘수가 있다.

최근 회사에서 블로그 페이지 및 툴을 새롭게 만들었으며, 블로그 Author로부터 YouTube 링크를 RTE 디자인 모드에서 추가하고 싶어한다. 이번에는 어떻게 새로운 버턴을 만들고 커맨드를 형성 시키는지 알아보도록하자.
  1. Core DB로 이동 후, 새로운 버턴을 추가하고 싶어하는 Tool에서 "__Html Editor Button"의 템플릿으로 새로운 아이템을 추가한다.



  2. 새로운 아이템의의 속성을 아래와 같이 변경해주며, 아이템 아이콘, 디스플레이 이름도 변경한다.



  3.  "/WebSite/sitecore/shell/Controls/Rich Text Editor/RichText Commands.js" 파일로 이동 후, 새로운 "RadEditorCommandList"를 추가하고, "Regular Expression"을 통하여, 유튜브 비디오 아이디만을 가져온다.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    RadEditorCommandList["InsertYouTube"] = function (commandName, editor, args) {
        var d = Telerik.Web.UI.Editor.CommandList._getLinkArgument(editor);
        Telerik.Web.UI.Editor.CommandList._getDialogArguments(d, "A", editor, "DocumentManager");
    
        // Highlight 되어진 텍스트만 가져온다.
        var html = editor.getSelectionHtml();
        if (getId(html)) {
            var videoId = getId(html);
            scEditor = editor;
            scEditor.pasteHtml('<div class="blog-rte-youtube"><iframe width="560" height="315" src="//www.youtube.com/embed/' + videoId + '" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe></div>');
        } else {
            // Highlight 되어진 텍스트가 YouTube 아이디와 매치가 되지 않을 경우, 메세지를 보낸다.
            alert("Please highlight YouTube link URL.");
        }
    };
    
    //Get YouTube video ID
    function getId(url) {
        var regExp = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/;
        var match = url.match(regExp);
    
        if (match && match[2].length == 11) {
            return match[2];
        } else {
            return false;
        }
    }
    


  4. Master DB로 이동 후, RichText Editor를 사용하고 페이지에서 Editor Popup을 실행한다.



YouTube 링크 버턴