본문 바로가기
카테고리 없음

RAP 07 - MANAGED REPORT : Metadata Extensions

by SAPortal 2026. 7. 4.
반응형

 

 

 

목차

    1.Metadata Extensions (MDE)

    Metadata Extensions(MDE)에 대하여 한번 알아보겠습니다. Metadata Extensions는 무엇이고 왜 써야 하는가?

    Metadata Extensions는 한마디로 UI설정을 별도의 파일로 분리하여 관리하는 기능입니다. RAP 개발을 하다보면 CDS View안에 데이터 모델 정의와 UI 어노테이션이 함께 섞이게 됩니다. 필드가 많아질수록 코드는 점점 복잡해지고 유지보수도 어려워집니다.

    이 문제를 해결하기 위해 등장한 것이 바로 Metadata Extensions 입니다. 쉽게말해 지금까지 실습하면서 CDS View에 직접 UI관련 어노테이션을 적용했다면 앞으로는 Metadata Extensions를 생성하여 어노테이션을 적용하면 좋다는 이야기 입니다.

    자 그러면 Metadata Extensions를 생성하여 어노테이션을 적용해 보겠습니다.

     

     

    Metadata Extensions는 Projection View를 참조하여 생성합니다. 그러기 위해서는 Projection View Metadata Extensions를 허용하겠다는 어노테이션을 추가해 줘야 합니다. 아래와 같이 @Metadata.allowExtensions: true를 추가해 줍니다.

     

     

    Projection View에 마우스 오른쪽 클릭 후 New Metadata Extension 을 선택합니다.

     

     

    Metadata Extension Name과 Description을 입력하고 Next 버튼을 클릭합니다.

     

     

    annotateEntity를 선택하고 Finish 버튼을 클릭합니다.

     

     

    layer는 #CUSTOMER를 입력해 줍니다. 그리고 Projection View에서 지정했던 @UI.lineItem 어노테이션을 아래와 같이 Metadata Extension에 지정해 줍니다. 그리고 Projection View에서는 삭제를 해줍니다. 그리고 APP을 다시 실행해 보겠습니다.

     

    이전과 동일하게 출력됩니다. 그러면 Projection View와 Metadata Extension 동시에 어노테이션을 적용하면 어떻게 될까요?

    Metadata Extension > Projection View > Interface View 순으로 Metadata Extension이 우선순위가 가장 높습니다.

     

    Note.
    Metadata Layer(메타데이터 레이어)란?

    만약 APP개발중에 표준 패키지, 솔루션 파트너, 고객사(현업)가 각각 서로 다른 UI를 요구하게 된다면 어떻게 될까요?
    이때 동일한 필드에 여러 어노테이션이 중복 정의되어 있을때 어떤 설정을 최우선으로 반영할 것인가를 결정하는 계층구조가 바로 Metadata layer입니다. 우선순위가 낮은 layer 부터 높은 layer를 나열하면 아래와 같습니다.
    (낮음) #CORE -> #LOCALIZATION -> #INDUSTRY -> #PARTNER -> #CUSTOMER (높음)
    높은 우선순위의 어노테이션은 낮은 우선순위의 어노테이션을 완벽하게 무시하고 덮어씁니다.
    프로젝트 시에는 보통 #CUSTOMER를 사용하는것이 SAP표준 가이드라인에 부합하는 가장 정석적인 방법입니다.

     

     

    2.COMPOSITION

    이번 Managed 시나리오에서도 Object Page에 Booking정보를 보여주려고 합니다. 하지만 이번에는 Travel정보와 마찬가지로 Booking정보도 CUD기능을 구현해야 하기 때문에 두 VIEW간의 연결을 Association이 아닌 부모자식 관계로 연결을 해야 합니다.

    Association대신 Composition으로 연결을 시켜 보겠습니다. 먼저 Booking에 대한 Interface View를 아래와 같이 생성합니다.

     

     

    ZEVER_M_TRAVEL_I View에 Booking 정보를 연결합니다. 두개의 View를 동시에 수정해야 하기 때문에 수정후에 동시에 활성화를 해줘야 합니다. 

     

     

    아래 버튼을 클릭하면 활성화 대상이 Popup으로 뜨는데 활성화 대상을 선택한 후 Active해줍니다.

     

     

    Booking정보에 대한 Projection View도 아래와 같이 생성해 줍니다.

     

     

    Projection View도 부모 자식관계로 연결을 해줘야 합니다. 부모View와 자식View 모두 해줘야 하며 아래와 같이 redirected를 사용하여 연결해 줍니다.

     

     

    자 여기까지 두개의 View에 대해서 부모 자식관계로 연결하는 작업은 끝났습니다. 이제 Booking정보를 보여주는 Object Page를 퀵하게 만들어 보겠습니다. Travel의 Metadata Extension에 아래와 같이 어노테이션을 추가해 줍니다.

     

     

     

    그다음으로 Object Page에서 Booking정보를 보여주려면 @UI.lineItem어노테이션을 추가해줘야 하는데 Booking에 대한 Metadata Extension 이 없습니다. Booking도 Metadata Extension 을 만들어 보겠습니다. Booking View에 대하여 Metadata Extension을 만들기 위해서는 뭐를 먼저 해줘야 할까요? Booking Projection View에 Metadata Extension을 허용하는 어노테이션을 추가해야 합니다. 아래와 같이 추가해 줍니다.

     

     

    이제 Metadata Extension을 만들어 보겠습니다.

    BOOKING Projection View에 마우스 오른쪽 클릭 후 New Metadata Extension을 선택합니다.

     

     

    Name과 Description을 입력하고 Next 버튼을 클릭합니다.

     

     

    annotateEntity를 선택하고 Finish 버튼을 클릭합니다.

     

     

    Metadata Extension layer를 #CUSTOMER로 설정하고 Object Page에 보여줄 필드들에 어노테이션을 추가해 줍니다.

     

     

    자 이제 생성한 Booking Projection View를 Service에 등록하고 App을 다시 실행해 보겠습니다.

     

     

    아래와 같이 조회됩니다. 여기까지 CUD기능을 위한 모델링 작업이 끝났습니다.

    다음시간에는 Behavior를 생성해서 CUD기능을 하나씩 추가해 보도록 하겠습니다.

    Main View

     

    Object View

    반응형