ReportViewer를 통해 웹 앱에 Wyn Enterprise 임베드

2025년 9월 28일

소개

Wyn Enterprise는 협업형 셀프 서비스 리포팅과 분석, 데이터 시각화, 데이터 조정(Moderation), 대시보드를 제공하는 BI 소프트웨어입니다. 사용자는 자신의 데이터로 대시보드와 리포트를 자유롭게 설계할 수 있고, 개발팀은 임베디드 BI 로 이 기능을 기존 애플리케이션 내부에 통합할 수 있습니다.

이전 글에서는 iFrame으로 Wyn을 웹 앱에 호스팅 하는 방법을 다뤘습니다. 이번 글에서는 Wyn이 제공하는 ReportViewer 로 임베드하는 방법을 살펴봅니다. ReportViewer에는 탐색, 매개변수 패널, 내보내기, 인쇄 등 필수 기능이 포함되어 있어 별도 구현이 필요 없습니다.

인증 프로세스

모든 비즈니스 애플리케이션은 보안이 중요합니다. Wyn은 자체 인증 방식을 제공하여 데이터를 안전하게 보호합니다. /connect/token 엔드포인트에 필요한 파라미터를 보내 액세스 토큰 을 발급받습니다.

엔드포인트에는 grant_type , username , password , client_id , client_secret 이 필요합니다. 사용자명/비밀번호는 Wyn 포털 로그인 정보와 동일합니다.

예시: 토큰 요청 (JavaScript)

  
 async function getReferenceToken(url, user, password) {
  const endpoint = concatUrl(url, 'connect/token');
  const resolveResponse = async (response) => {
    const jsonResponse = await response.json();
    if (jsonResponse.error) return null;
    return jsonResponse.access_token;
  };
  return await fetch(endpoint, {
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded',
      'Accept': '*/*',
    },
    method: 'post',
    body:
      `grant_type=password&username=${user}` +
      `&password=${password}` +
      `&client_id=integration` +
      `&client_secret=eunGKas3Pqd6FMwx9eUpdS7xmz`
  })
  .then(async response => await resolveResponse(response))
  .catch(error => { alert(error); return null; });
} 

응답 예시

  
 {
  "access_token": "ywkpbtr9aafehf39uaiuic4292ncashf9hf4nwqpzx29aqoduxn",
  "expires_in": 315360000,
  "token_type": "Bearer"
} 

리포트 목록 가져오기 (GraphQL)

인증이 완료되면 Wyn 서버에 저장된 리포트 목록을 사용자에게 보여줄 수 있습니다. 이때 첫 단계에서 받은 액세스 토큰을 함께 전송하여 GraphQL 로 목록을 가져옵니다.

GraphQL 쿼리

  
 query {
  documenttypes(key: "rdl") {
    documents {
      id
      title
      type
    }
  }
} 

리포트의 경우 keyrdl 입니다. 필요 시 created , created_by , modified , modified_by , effective_ops 등의 필드를 추가할 수 있습니다. 참고: Wyn과 GraphQL 사용

예시: 리포트 목록 API 호출 (JavaScript)

  
 async function getReportList(portalUrl, referenceToken) {
  const url = concatUrl(portalUrl, 'api/graphql');
  const init = {
    headers: {
      'Cache-Control': 'no-cache, no-store, must-revalidate',
      'Accept': 'application/json',
      'content-type': 'application/json',
      'pragma': 'no-cache',
      'Reference-Token': referenceToken
    },
    method: 'post',
    body: JSON.stringify({
      query: 'query { documenttypes(key:"rdl") { documents{ id, filename, title, type } } }'
    })
  };
  const res = await fetch(url, init);
  if (!res.ok) return null;
  const response = await res.json();
  const documents = response.data.documenttypes[0].documents;
  const list = documents.map(x => ({ name: x.title, id: x.id }));
  list.sort((x, y) => x.name < y.name ? -1 : 1);
  return list;
} 

응답 예시

  
 {
  "data": {
    "documenttypes": [
      {
        "documents": [
          {
            "id": "4b7e3f22-41e1-409e-bd22-c36d4a734e54",
            "filename": "TestPageReport.rdlx",
            "title": "TestPageReport",
            "type": "rdl"
          },
          {
            "id": "6b8d4j22-41e1-409e-bd22-cadjsf48afj4",
            "filename": "TestReport2.rdlx",
            "title": "TestReport2",
            "type": "rdl"
          }
        ]
      }
    ]
  },
  "errors": null
} 

ReportViewer 초기화

Wyn Enterprise는 ActiveReports JS Viewer를 기반으로 하는 네이티브 Report Viewer 를 제공합니다. Viewer를 초기화하려면 호스트 역할을 하는 <div> 요소가 필요하며, reportService 속성에 Wyn 서버 URL과 인증 토큰을 지정합니다.

  
 // 예시: ReportViewer 생성
const wynViewer = GrapeCity.ActiveReports.JSViewer.create({
  element: '#wyn-viewer-root',
  reportID: '',
  reportService: {
    url: portalUrl,
    securityToken: referenceToken
  }
}); 

보고서 보기

Viewer가 초기화되면 openReport(reportId) 메서드로 보고서를 로드할 수 있습니다. 아래는 목록에서 아이템을 클릭하면 해당 리포트를 여는 예시입니다.

  
 const reports = await getReportList(portalUrl, referenceToken);
reportsList.innerHTML = null;
reports.forEach(report => {
  const item = document.createElement('li');
  item.value = report.id;
  const text = document.createElement('span');
  text.innerHTML = report.name;
  item.appendChild(text);
  item.className = 'wyn-report-list-item';
  reportsList.appendChild(item);
  item.addEventListener('click', () => {
    const items = reportsList.children;
    for (let i = 0; i < items.length; i++) {
      items[i].classList.remove('active');
    }
    item.classList.add('active');
    wynViewer.openReport(report.id);
  });
}); 
ReportViewer에서 리포트 표시 예시
리포트 항목을 클릭하면 Viewer에 표시됩니다.

위 구현이 포함된 전체 샘플 앱은 여기에서 다운로드 할 수 있습니다.

샘플 애플리케이션 실행

  1. Wyn 서버에 CORS 설정 추가
    • Wyn Enterprise 포털 열기
    • Admin Portal로 이동
    • 좌측 메뉴에서 System Configurations 선택
    • Allowed CORS Origins 에 애플리케이션 URL 추가 (예: 개발 모드라면 http://localhost:3000 )
    • Exposed Headerslocation , content-Disposition 를 각각 한 줄에 추가
    Wyn은 애플리케이션이 Wyn에 API 호출을 하고 적절한 응답을 받을 수 있도록 위 설정을 요구합니다.
    Wyn CORS 설정 화면 예시
  2. 개발 서버 실행
      
     yarn
    yarn dev 
    

    개발 서버가 시작되면 브라우저에서 http://localhost:3000 으로 접속해 동작을 확인합니다.

참고 · 위 명령을 실행하기 전에 시스템에 yarn 이 설치되어 있어야 합니다.

최신 블로그 포스트

AI 환각 검증을 위한 데이터 시각화 분석
작성자: Wyn APAC 2025년 10월 29일
AI 데이터 분석 트렌드, 홀루시네이션 문제, 교차 검증의 중요성, 기존 BI 도구 한계와 Wyn Enterprise의 대안성을 심층적으로 다룬 기술 블로그입니다.
CFO-대시보드-BI
작성자: Wyn APAC 2025년 9월 29일
CFO 대시보드의 핵심 KPI(매출총이익, 영업이익, 순이익)와 MRR/ROE/ROA 등 지표를 시각화해 손익을 추적하고, 재무 건전성을 평가하는 방법을 소개합니다.
BI-경영대시보드
작성자: Wyn APAC 2025년 9월 29일
BI 대시보드 개요부터 CEO 대시보드 핵심 KPI, 부서별 인사이트, 도입 이점, FAQ까지 한 번에 정리했습니다. Wyn Enterprise 예시와 함께 살펴보세요.