본문 바로가기
ABAP 문법 & 기법

[SAP ABAP] 내부 특성(ATINN) 변환 — CONVERSION_EXIT_ATINN_INPUT/OUTPUT 사용법

by Song.sh 2026. 5. 18.

SAP 분류 시스템(Classification) 을 다루다 보면 AUSP-ATINN 처럼 NUMC 10자리 숫자로 저장된 내부 특성 번호 와, 사용자가 화면에서 보는 CABN-ATNAM 같은 외부 특성 이름(예: COLOR, WIDTH) 사이를 자주 변환해야 하는 상황이 옵니다.

 

매번 CABN 을 SELECT 해서 양방향 변환하는 코드를 직접 짜는 방법도 있지만, SAP 가 같은 기능을 표준 Function Module 로 제공하고 있습니다. 바로 CONVERSION_EXIT_ATINN_INPUT(이름 → 숫자) 과 CONVERSION_EXIT_ATINN_OUTPUT(숫자 → 이름) 한 쌍입니다.

 

이 글은 두 변환 함수의 사용법과 방향 구분, 직접 SELECT 방식과의 차이, 그리고 실무에서 자주 만나는 함정을 정리한 메모입니다. 분류 시스템 관련 글 "BATCH 자재 특성값 조회 — AUSP·CABN·MCH1 조인" 과 같이 보시면 흐름이 자연스럽게 이어집니다.


핵심 — ATINN(내부 번호) 과 ATNAM(외부 이름)

특성(Characteristic) 은 SAP 내부에서 두 가지 방식으로 표현됩니다. 이 둘 사이의 변환이 ATINN CONVERSION_EXIT 의 역할입니다.

항목 ATINN (내부 번호) ATNAM (외부 이름)
타입 NUMC 10 (예: 0000000123) CHAR 30 (예: COLOR, WIDTH)
저장 위치 AUSP-ATINN, CABN-ATINN (조인 키) CABN-ATNAM (마스터에만)
용도 DB 조인·인덱스용 안정 키 사용자 입력·코드 가독성용
코드에서 보통 가지고 있는 값 AUSP 조회 결과에서 들어옴 개발자가 코드에 하드코딩 또는 사용자 입력으로 받음

변환 함수의 방향을 한 줄로 정리하면:

Function Module 방향
CONVERSION_EXIT_ATINN_INPUT 외부 이름 → 내부 번호 (COLOR0000000123)
CONVERSION_EXIT_ATINN_OUTPUT 내부 번호 → 외부 이름 (0000000123COLOR)

SAP 표준 CONVERSION EXIT 의 명명 규칙(INPUT = 외부→내부, OUTPUT = 내부→외부) 을 그대로 따릅니다. 사용자가 화면에 입력 한 외부 값을 DB 형태로 바꾸는 게 INPUT, DB 의 내부 값을 화면에 출력 하기 위해 사용자 형태로 바꾸는 게 OUTPUT 으로 외운다고 생각하면 헷갈리지 않습니다.


1단계 — ATINN 이 어디에 저장되는지 확인 (CABN)

ATINN 은 분류 시스템 특성 마스터 테이블 CABN 에서 자동으로 채번됩니다. 사용자가 트랜잭션 CT04(Characteristic 생성) 에서 이름(ATNAM) 만 입력하면 시스템이 내부 번호(ATINN) 를 부여합니다.

SE16 → CABN 입력 → 조회
  ATINN      ATNAM      ATFOR    ATAUT  ...
  0000000123 COLOR      CHAR     ...
  0000000456 WIDTH      NUM      ...
  0000000789 DENSITY    NUM      ...

 

다른 테이블(AUSP, CAWN 등) 에는 ATINN 만 들어가고 외부 이름은 들어가지 않습니다. 그래서 "이 특성값이 어느 특성에 속하는지" 알려면 CABN 으로 조인하거나 ATINN CONVERSION EXIT 을 호출해야 합니다.


2단계 — CONVERSION_EXIT_ATINN_INPUT (이름 → 숫자)

코드에 특성 이름이 하드코딩되어 있는데 AUSP 를 조회해야 한다면, 먼저 이름을 ATINN 으로 변환해야 합니다.

DATA: lv_atnam TYPE cabn-atnam VALUE 'COLOR',
      lv_atinn TYPE cabn-atinn.

CALL FUNCTION 'CONVERSION_EXIT_ATINN_INPUT'
  EXPORTING
    input  = lv_atnam
  IMPORTING
    output = lv_atinn.

WRITE: / 'ATINN:', lv_atinn.   " 결과: 0000000123

이후 변환된 lv_atinn 으로 AUSP 를 조회하면 됩니다.

SELECT objek, atwrt
  FROM ausp
  INTO TABLE @DATA(lt_ausp)
  WHERE atinn = @lv_atinn
    AND klart = '023'.     " 배치 분류 (별도 글 "BATCH 자재 특성값 조회" 참고)

 

함수가 내부적으로 CABN 조회를 캐싱하므로 같은 이름을 여러 번 변환해도 한 번만 DB 를 다녀옵니다. 반복 호출에서도 부담이 없습니다.


3단계 — CONVERSION_EXIT_ATINN_OUTPUT (숫자 → 이름)

반대 방향. AUSP 조회 결과의 ATINN 을 사용자 화면에 표시하기 직전에 외부 이름으로 변환합니다.

DATA: lv_atinn TYPE cabn-atinn VALUE '0000000123',
      lv_atnam TYPE cabn-atnam.

CALL FUNCTION 'CONVERSION_EXIT_ATINN_OUTPUT'
  EXPORTING
    input  = lv_atinn
  IMPORTING
    output = lv_atnam.

WRITE: / 'ATNAM:', lv_atnam.   " 결과: COLOR

ALV 출력 등에서 ATINN 이 그대로 노출되면 사용자는 의미를 알 수 없으므로, 출력 직전 일괄 변환해서 보여주는 패턴이 일반적입니다.

LOOP AT lt_ausp ASSIGNING FIELD-SYMBOL(<ls>).
  CALL FUNCTION 'CONVERSION_EXIT_ATINN_OUTPUT'
    EXPORTING input  = <ls>-atinn
    IMPORTING output = <ls>-atnam_display.   " 추가 컬럼에 외부 이름 채움
ENDLOOP.

 


4단계 — 직접 SELECT vs CONVERSION_EXIT 비교

같은 변환을 CABN 직접 조회로도 할 수 있습니다. 두 방식 중 어느 쪽을 쓸지는 상황에 따라 다릅니다.

" 직접 SELECT 로 변환 (단건)
SELECT SINGLE atinn FROM cabn
  INTO @DATA(lv_atinn_direct)
  WHERE atnam = 'COLOR'.

" 동등한 변환을 CONVERSION_EXIT 로 (단건)
CALL FUNCTION 'CONVERSION_EXIT_ATINN_INPUT'
  EXPORTING input  = 'COLOR'
  IMPORTING output = lv_atinn_fm.
기준 CONVERSION_EXIT_ATINN CABN 직접 SELECT
코드 간결성 한 줄로 양방향 처리 WHERE·CASE 분기 직접 작성
반복 호출 성능 내부 캐싱 — 같은 값 반복 시 DB 1회만 개발자가 직접 버퍼·인터널 테이블 구성해야
대량 변환 루프 안에서 호출 (한 줄씩 처리) 한 번의 IN 조회로 일괄 처리 가능 — 대량 시 빠름
ADZHL(카운터) 처리 SAP 표준 로직으로 최신 버전 선택 개발자가 WHERE 절에 명시해야
추천 상황 단발 변환 · 분산된 위치에서 변환 · 코드 가독성 우선 대량(수천~수만) 일괄 변환 · 성능 최우선

대부분의 실무 코드는 CONVERSION_EXIT_ATINN_* 호출이 적합합니다. 다만 한 번에 수만 건의 ATINN 을 변환해야 하는 배치 리포트라면 SELECT FROM cabn FOR ALL ENTRIES IN ... 패턴이 더 빠릅니다.


흔히 빠뜨리는 함정

INPUT 과 OUTPUT 방향 헷갈리기

INPUT 이 어느 방향인지 매번 잊어버리기 쉽습니다. "사용자가 화면에 입력하는 외부 이름" 을 시스템이 받아들이는 변환이 INPUT(외부→내부), 그 반대가 OUTPUT(내부→외부) 으로 외웁니다. ALPHA conversion 도 같은 규칙입니다.

ATNAM 대소문자 차이

CABN-ATNAM 은 대소문자를 구분합니다(colorCOLOR). 표준 특성은 보통 대문자로 등록되므로 TRANSLATE name TO UPPER CASE. 후 변환을 호출하는 패턴이 안전합니다.

존재하지 않는 이름 변환 시 결과

INPUT 함수에 등록되지 않은 이름을 넣으면 OUTPUT 이 비어있거나 0 으로 나옵니다. 예외를 던지지는 않으므로 호출 후 IS INITIAL 체크가 필요합니다.

변환만 하고 KLART 필터 누락

ATINN 으로 AUSP 를 조회할 때 KLART(클래스 유형) 조건이 없으면 자재 분류·배치 분류·장비 분류가 모두 섞여 들어옵니다. 변환 후 AUSP 조회 시에는 항상 KLART 를 함께 지정합니다.

대량 LOOP 안에서 단건 호출

LOOP 안에서 매 행마다 CONVERSION_EXIT_ATINN_* 을 호출해도 캐싱으로 성능 영향이 작지만, 정말 대량(수만 건 이상) 이라면 미리 CABN 을 한 번의 SELECT 로 인터널 테이블에 담아두고 READ TABLE 로 변환하는 패턴이 더 빠릅니다.

Z 특성과 표준 특성 혼동

Z 로 시작하는 자체 특성도 같은 변환 함수로 처리됩니다. 별도 함수는 없습니다. 다만 클라이언트가 다르면 같은 ATNAM 이 다른 ATINN 으로 채번될 수 있으니 클라이언트 간 데이터 이관 시 주의합니다.

NUMC 변수에 그냥 숫자 대입

CABN-ATINN 은 NUMC 10 입니다. 123 을 그대로 비교 변수로 쓰면 0000000123 으로 자동 변환되지만, CHAR 변수에 담을 때는 명시적으로 패딩이 필요합니다.


전체 코드 — 복사용 통합본

특성 이름으로 시작해서 양방향 변환을 수행하고, 변환된 ATINN 으로 AUSP 를 조회해 다시 외부 이름으로 출력하는 전체 흐름입니다. SE38 에 그대로 붙여 실행 가능합니다.

REPORT z_atinn_convert_demo.

PARAMETERS: p_atnam TYPE cabn-atnam DEFAULT 'COLOR'.

DATA: lv_atinn        TYPE cabn-atinn,
      lv_atnam_check  TYPE cabn-atnam,
      lt_ausp         TYPE STANDARD TABLE OF ausp,
      ls_ausp         TYPE ausp.

* ★ 1) 외부 이름 → 내부 번호 (INPUT)
TRANSLATE p_atnam TO UPPER CASE.

CALL FUNCTION 'CONVERSION_EXIT_ATINN_INPUT'
  EXPORTING
    input  = p_atnam
  IMPORTING
    output = lv_atinn.

IF lv_atinn IS INITIAL.
  WRITE: / '존재하지 않는 특성 이름:', p_atnam.
  RETURN.
ENDIF.

WRITE: / '특성 이름      :', p_atnam.
WRITE: / '내부 ATINN     :', lv_atinn.

* ★ 2) 내부 번호 → 외부 이름 (OUTPUT) — 역방향 검증
CALL FUNCTION 'CONVERSION_EXIT_ATINN_OUTPUT'
  EXPORTING
    input  = lv_atinn
  IMPORTING
    output = lv_atnam_check.

WRITE: / '역방향 ATNAM   :', lv_atnam_check, '(원본과 일치 확인)'.

* ★ 3) 변환된 ATINN 으로 AUSP 조회 (배치 분류 예시)
SELECT objek, atwrt, klart
  FROM ausp
  INTO TABLE @lt_ausp
  WHERE atinn = @lv_atinn
    AND klart = '023'           " 배치 분류
    AND lkenz = ' '              " 삭제 제외
  UP TO 20 ROWS.

WRITE: / '=== AUSP 조회 결과 (배치 분류) ==='.
LOOP AT lt_ausp INTO ls_ausp.
  WRITE: / 'OBJEK:', ls_ausp-objek, 'VALUE:', ls_ausp-atwrt.
ENDLOOP.

* ★ 4) 결과 ATINN 을 다시 외부 이름으로 변환해 출력 (대량 변환 패턴)
WRITE: / '=== 출력용 외부 이름 변환 ==='.
LOOP AT lt_ausp INTO ls_ausp.
  CALL FUNCTION 'CONVERSION_EXIT_ATINN_OUTPUT'
    EXPORTING
      input  = ls_ausp-atinn
    IMPORTING
      output = lv_atnam_check.
  WRITE: / 'ATNAM:', lv_atnam_check, 'VALUE:', ls_ausp-atwrt.
ENDLOOP.

요약

단계 작업 핵심
1 ATINN / ATNAM 위치 확인 CABN-ATINN(NUMC 10) · CABN-ATNAM(CHAR 30)
2 이름 → 숫자 CONVERSION_EXIT_ATINN_INPUT
3 숫자 → 이름 CONVERSION_EXIT_ATINN_OUTPUT
4 대안 비교 단발 · 분산 변환은 FM, 수만 건 일괄 변환은 CABN 직접 SELECT
5 방향 외우기 INPUT = 외부→내부 (사용자 입력 변환), OUTPUT = 내부→외부 (화면 출력 변환)

ATINN(내부 번호) 과 ATNAM(외부 이름) 의 양방향 변환은 CONVERSION_EXIT_ATINN_INPUT · CONVERSION_EXIT_ATINN_OUTPUT 한 쌍으로 깔끔하게 처리됩니다. 분류 시스템을 다루는 거의 모든 코드에서 등장하므로 두 함수의 이름과 방향만 기억해 두면 매번 SELECT 를 직접 짤 필요가 없어집니다. AUSP · CABN · MCH1 조인 패턴(별도 글 "BATCH 자재 특성값 조회") 과 함께 묶어 두면 분류 시스템 관련 어떤 요구사항이 와도 즉시 대응할 수 있습니다.


Disclaimer — 이 포스트는 실무 정리 노트를 바탕으로 AI 보조로 정리되었습니다.

CONVERSION_EXIT_ATINN_INPUT · CONVERSION_EXIT_ATINN_OUTPUT 함수 모듈과 CABN · AUSP 테이블은 SAP NetWeaver 표준 분류 시스템 기능으로 시스템 버전 의존 없이 동작합니다. SAP 표준 CONVERSION EXIT 명명 규칙(INPUT = 외부→내부, OUTPUT = 내부→외부) 은 ATINN 외에도 ALPHA · MATN1 등 모든 표준 변환 함수에 동일하게 적용됩니다. ATINN 채번 규칙은 클라이언트 단위로 작동하므로 동일한 ATNAM 이라도 클라이언트가 다르면 다른 내부 번호가 부여될 수 있으니, 클라이언트 간 데이터 이관 시 ATINN 을 그대로 복사하지 말고 ATNAM 기준으로 재변환하는 절차를 권장합니다.