ABAP

I_UnitOfMeasure로 단위 텍스트 조회 30초 이해 #shorts #SAP #ABAP

개요 및 이 글에서 다루는 내용

SAP S/4HANA 환경에서 판매오더, 자재마스터, 생산오더 등 거의 모든 업무 문서에는 수량 단위(Unit of Measure, UoM)가 등장합니다. 그런데 데이터베이스에는 KG, EA, PC, ST 같은 코드 형태로만 저장되어 있어, 사용자 화면이나 리포트에 그대로 보여주면 가독성이 떨어집니다. 이 글에서는 SAP가 표준으로 제공하는 I_UnitOfMeasure CDS View를 활용하여 단위 코드를 사용자 언어 기반 텍스트와 함께 조회하는 방법을 단계별로 다룹니다.

  • I_UnitOfMeasure가 어떤 테이블을 감싸고 있는지 이해하기
  • Association을 사용해 업무 CDS View에 단위 텍스트를 결합하기
  • $session.system_language로 다국어 환경에 대응하기
  • ABAP RAP/SELECT에서 결과를 활용하는 방법
  • 성능과 캐싱 측면에서의 실무 고려사항

사전에 알고 있으면 좋은 내용

이 글을 편하게 따라오려면 ABAP CDS View의 기본 문법(define view entity, association, annotation)과 ADT(ABAP Development Tools in Eclipse) 사용 경험이 있으면 좋습니다. 또한 SAP의 도메인 모델인 T-Table(예: T006, MARA)에 대한 기초 지식과 다국어 텍스트 테이블 패턴(코드 테이블 + 언어별 텍스트 테이블)을 알고 있다면 개념을 더 빠르게 이해할 수 있습니다.

환경 및 준비물

이 글의 예제는 다음 환경을 가정합니다.

  • SAP S/4HANA 2022 또는 2023 (On-Premise) / S/4HANA Cloud Private Edition
  • ABAP Platform 2022 이상 (ABAP 7.57 / ABAP CDS Entity 문법 지원)
  • ABAP Development Tools (ADT) for Eclipse 2024-03 이상 권장
  • SE16/SE16N 또는 Data Preview 권한
  • 최소 두 개 이상의 로그온 언어 사전 설치(예: EN, KO) — 다국어 테스트용

I_UnitOfMeasure는 SAP가 표준으로 배포하는 Released CDS View로, S/4HANA 1909 이후부터 일반적으로 사용 가능합니다. 따라서 별도의 설치나 활성화가 필요하지 않으며, ADT에서 바로 Open 후 Data Preview로 결과를 확인할 수 있습니다. Cloud Edition에서는 Released API(C1)로 분류되어 있어 확장 모델에서도 안전하게 참조할 수 있습니다.

핵심 개념: 단위 코드와 텍스트의 관계

SAP 시스템에서 단위 정보는 전통적으로 두 개의 테이블에 나뉘어 저장됩니다. T006은 단위 코드와 변환 비율, 차원(Dimension), ISO 코드 등 기술 속성을 담는 마스터 테이블이고, T006A는 언어 키(SPRAS)와 단위 코드(MSEHI)를 키로 가지는 텍스트 테이블입니다. 즉, 하나의 단위 코드 KG는 영어로는 "Kilogram", 한국어로는 "킬로그램", 독일어로는 "Kilogramm"으로 표시되어야 하며, 이는 T006A에 언어별로 들어 있습니다.

이 구조는 SAP의 거의 모든 코드/텍스트 분리 패턴과 동일합니다. 마치 도서관에서 책의 ISBN(코드)과 책 제목(텍스트)을 따로 관리하되, 제목은 번역서마다 다르기 때문에 언어별로 별도 카드에 적어두는 것과 비슷합니다. I_UnitOfMeasure는 이 두 테이블을 결합하여, 개발자가 매번 SELECT ... FROM t006 INNER JOIN t006a ... WHERE spras = sy-langu를 작성하지 않도록 추상화한 Virtual Data Model(VDM) 뷰입니다.

도식으로 표현하면 다음과 같습니다.


[T006: 단위 마스터]            [T006A: 언어별 텍스트]
  MSEHI (KG, EA, ...)             SPRAS (E, K, D, ...)
  DIMID, ISOCODE, ...             MSEHI (KG, EA, ...)
        \                         /  MSEHL (긴 텍스트)
         \                       /   MSEH3 (짧은 텍스트)
          v                     v
        [I_UnitOfMeasure (CDS View)]
                  |
                  v
        [업무 CDS View — Association으로 사용]

I_UnitOfMeasure는 @ObjectModel.representativeKey: 'UnitOfMeasure', @VDM.viewType: #BASIC으로 정의된 기본 뷰이며, 텍스트 전용 뷰인 I_UnitOfMeasureText가 별도로 존재하여 Association(_Text)으로 연결됩니다. 또한 차원, ISO 코드, SI 단위 변환 관계까지 포함하므로 단순 텍스트 조회를 넘어 단위 환산 시에도 활용 가능합니다.

실전 예제 1 — 가장 단순한 단위 텍스트 조회

먼저 가장 기본적인 시나리오부터 시작합니다. 자재(Material)별로 기본 수량 단위(Base Unit of Measure)와 그에 해당하는 한국어 텍스트를 조회하는 CDS View를 작성해 봅니다.


@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'Material with UoM Description'
define view entity ZC_MaterialUnitText
  as select from I_Product as Prod
  association [0..1] to I_UnitOfMeasure as _Uom
    on Prod.BaseUnit = _Uom.UnitOfMeasure
{
  key Prod.Product           as ProductCode,
      Prod.BaseUnit          as BaseUnitCode,
      _Uom.UnitOfMeasure_Text as BaseUnitDescription,
      _Uom._Text.LongText    as BaseUnitLongText
}

위 코드에서 주목할 점은 두 가지입니다. 첫째, I_UnitOfMeasure[0..1] Cardinality로 association 정의했습니다. 자재의 BaseUnit이 비어있을 수 있는 경우(거의 없지만 마스터 정합성 이슈 시)를 대비합니다. 둘째, UnitOfMeasure_Text는 I_UnitOfMeasure가 내부적으로 노출하는 짧은 텍스트 필드입니다. 더 긴 설명이 필요하면 _Text 서브 association을 한 번 더 타고 들어가 LongText를 가져올 수 있습니다.

ADT에서 Activate 후 Data Preview를 열면, MARA에 저장된 FERT 자재의 BaseUnit이 EA일 때 BaseUnitDescription에 "each" 또는 "개" 등이 자동으로 표시됩니다.

실전 예제 2 — 판매오더 항목에 단위 텍스트 결합

실무에서 단위 텍스트가 가장 자주 필요한 곳은 트랜잭션 데이터를 표시하는 화면입니다. 판매오더 항목(Sales Order Item)별로 주문 수량과 그 단위의 한국어 텍스트를 함께 보여주는 시나리오를 만들어 봅니다. 동시에 로깅과 에러 안전성을 고려한 패턴을 적용합니다.


@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'Sales Order Item with Unit Text'
@Metadata.allowExtensions: true
define view entity ZC_SalesOrderItemUnitText
  as select from I_SalesOrderItem as Item

  association [0..1] to I_UnitOfMeasure as _OrderQtyUom
    on Item.OrderQuantityUnit = _OrderQtyUom.UnitOfMeasure

  association [0..1] to I_UnitOfMeasure as _BaseQtyUom
    on Item.MaterialBaseUnit = _BaseQtyUom.UnitOfMeasure
{
  key Item.SalesOrder,
  key Item.SalesOrderItem,
      Item.Material,
      Item.RequestedQuantity,
      Item.OrderQuantityUnit,
      _OrderQtyUom.UnitOfMeasure_Text as OrderUnitText,

      Item.MaterialBaseUnit,
      _BaseQtyUom.UnitOfMeasure_Text as BaseUnitText,

      case
        when _OrderQtyUom.UnitOfMeasure_Text is initial
          then Item.OrderQuantityUnit
        else _OrderQtyUom.UnitOfMeasure_Text
      end as DisplayOrderUnit
}

실무에서는 단위 코드가 마스터에 존재하지 않거나 사용자 언어의 텍스트가 누락된 경우가 종종 발생합니다. 그래서 위 예제처럼 CASE 식으로 fallback을 마련하면, 화면이 빈칸으로 나오는 사고를 막을 수 있습니다. 또한 association을 두 번(주문 단위 / 자재 기본 단위) 정의하여, 단위 환산이 필요한 화면(예: "10 BOX = 100 EA")에서도 텍스트를 양쪽 모두 표시할 수 있습니다.

@Metadata.allowExtensions: true 어노테이션은 추후 Fiori Elements에서 사용자별/조직별 UI 확장을 허용하기 위한 권장 설정입니다.

실전 예제 3 — 다국어/세션 언어와 성능을 고려한 프로덕션 뷰

프로덕션에 배포할 뷰는 다국어 지원, 권한 체크, 성능을 모두 고려해야 합니다. I_UnitOfMeasure는 내부적으로 I_UnitOfMeasureText를 통해 $session.system_language로 필터링하지만, 직접 텍스트 뷰를 사용하는 경우에는 명시적으로 언어 필터를 걸어주는 것이 일반적입니다.


@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'Production-Ready Unit Description'
@VDM.viewType: #CONSUMPTION
@OData.publish: true
define view entity ZC_ProductUnitDescription
  as select from I_Product as Prod

  association [0..1] to I_UnitOfMeasureText as _UomText
    on  Prod.BaseUnit = _UomText.UnitOfMeasure
    and _UomText.Language = $session.system_language
{
  key Prod.Product,
      Prod.BaseUnit,
      _UomText.UnitOfMeasureShortName as UnitShortText,
      _UomText.UnitOfMeasureName      as UnitLongText,
      _UomText.Language               as TextLanguage
}

여기서 핵심은 association 조건에 and _UomText.Language = $session.system_language를 추가한 점입니다. 이렇게 하면 사용자가 SAP에 한국어(K)로 로그온하면 한국어 텍스트가, 영어(E)로 로그온하면 영어 텍스트가 자동으로 반환됩니다. 별도의 입력 파라미터를 만들지 않아도 다국어가 동작하므로 Fiori 앱에서 매우 유용합니다.

ABAP 프로그램에서 호출하는 예시는 다음과 같습니다.


SELECT Product,
       BaseUnit,
       UnitShortText,
       UnitLongText
  FROM zc_productunitdescription
  WHERE Product IN @r_product
  ORDER BY Product
  INTO TABLE @DATA(lt_result).

LOOP AT lt_result INTO DATA(ls_row).
  cl_demo_output=>write( |{ ls_row-product } : { ls_row-baseunit } / { ls_row-unitlongtext }| ).
ENDLOOP.

cl_demo_output=>display( ).

성능 측면에서는 다음 사항을 권장합니다. 첫째, HANA의 Result Cache가 자동으로 동작하므로 단위 텍스트 조회는 일반적으로 매우 빠르지만, 대량 데이터를 다룰 때는 I_UnitOfMeasure를 외부 SELECT의 association이 아닌 sub-query에서 호출해 N+1 패턴을 피해야 합니다. 둘째, OData로 노출할 때는 $expand 시 association이 lazy-load되도록 설계하면 페이로드를 줄일 수 있습니다.

자주 만나는 실수와 해결법

Q1. "Data Preview에서는 텍스트가 잘 보이는데, ABAP SELECT로 가져오면 빈칸이 나옵니다."
A. 대부분 $session.system_language가 RFC/Batch 세션에서 비어있거나 기본값으로 잡혀 있어서 발생합니다. 백그라운드 작업에서는 SET LOCALE LANGUAGE로 명시적 언어 설정을 하거나, association 조건에 and _UomText.Language = 'E'처럼 명시적 fallback을 추가해야 합니다.

Q2. "I_UnitOfMeasure를 검색했는데 시스템에 없습니다."
A. S/4HANA 1809 이전이거나 ECC 시스템일 수 있습니다. 그 경우 직접 T006T006A를 join하는 사용자 정의 뷰(예: ZI_UnitOfMeasure)를 만들고, @ObjectModel.dataCategory: #TEXT를 활용해 텍스트 뷰를 분리하는 패턴을 따르는 것이 일반적으로 권장됩니다.

Q3. "단위 텍스트가 영어로만 나오고 한국어로 안 바뀝니다."
A. T006A에 해당 단위의 한국어 행(SPRAS = '3' 또는 'K')이 존재하지 않을 수 있습니다. SE16N으로 T006A를 열어 한국어 행이 있는지 확인하고, 없다면 CUNI 트랜잭션에서 단위 텍스트를 직접 등록해야 합니다. 또한 사용자 마스터(SU01)의 로그온 언어 설정도 함께 점검하세요.

Q4. "OrderQuantityUnit 같은 도메인 필드와 association 조건의 데이터 타입이 안 맞다는 에러가 납니다."
A. 단위 필드는 UNIT 타입(길이 3)으로 정의되어 있는데, 잘못 정의된 사용자 뷰에서는 CHAR3으로 노출되어 호환되지 않을 수 있습니다. CAST로 명시 변환하거나 원본 뷰의 필드 타입을 점검합니다.

이후 살펴보면 좋은 관련 주제

I_UnitOfMeasure를 익혔다면 자연스럽게 통화(Currency) 텍스트를 다루는 I_Currency, 국가 코드 텍스트인 I_Country, 언어 텍스트인 I_Language 같은 코드/텍스트 패턴의 다른 Released VDM 뷰들도 동일한 구조로 사용할 수 있습니다. 또한 RAP(RESTful ABAP Programming Model)에서 @ObjectModel.text.element 어노테이션과 결합해 BO(Business Object) 필드에 자동으로 텍스트를 연결하는 패턴, 그리고 Fiori Elements의 Value Help/F4에 I_UnitOfMeasure를 직접 참조시키는 방법으로 확장해 보세요. 단위 환산이 필요하다면 UNIT_CONVERSION SQL 함수도 함께 학습하는 것을 권장합니다.

더 읽어볼 자료

  • help.sap.com — ABAP CDS View Entity 정의 문법
  • help.sap.com — Virtual Data Model (VDM) 개념과 뷰 분류
  • help.sap.com — CDS Session Variables ($session.system_language)
  • SAP Business Accelerator Hub — Released CDS View 카탈로그
  • SAP Community Blogs — CDS Released Views 활용 사례

댓글 0

아직 댓글이 없습니다.