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 |
외부 이름 → 내부 번호 (COLOR → 0000000123) |
CONVERSION_EXIT_ATINN_OUTPUT |
내부 번호 → 외부 이름 (0000000123 → COLOR) |
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 은 대소문자를 구분합니다(color ≠ COLOR). 표준 특성은 보통 대문자로 등록되므로 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 기준으로 재변환하는 절차를 권장합니다.