프로그래밍 언어에서는 대부분 Function 이란 것이 존재하며, 자주 사용되는 로직을 모듈화 하는 방법으로 많이 사용된다. 일반적으로 알고 있는 Fucntion이 ABAP 에서는 어떤 구조로 되어 있는지 이번 포스팅에서 알아보고자 한다. 

( 기본적인 펑션 파라미터 설명 및 RFC(I/F), Update Module 관련 내용은 생략하였다. )

 


ABAP에서도 소스를 모듈화 할 수 있는 다양한 방법들이 존재하며, 그 중 많이 사용되는 방법 중 하나가 Function일 것이다. ABAP에서 Function은 Function Module이라 하며, Function Group이란 상위 항목에 종속되어 있다. 즉, Function Group을 먼저 생성하고 그 하위 레벨에 Function Module을 생성할 수 있으며, 하나의 Function Group 에는 여러 개의 Function Module이 존재 할 수 있는 구조이다. 

 

Function Group에서는 Type-1 프로그램과 동일하게 전역변수, Subroutine, Screen, Text Symbol 등을 생성 및 사용가능 하며, 이렇게 선언된 것들은 동일한 Function Group 밑에 존재하는 모든 Function Module에서 사용(호출)이 가능하다. 

 

< Function Group 내 Include Program 구조 >
< Function Group Main Program >

예제처럼 Function Group( "YYFG_CM01" )을 생성하면 하나의 Main Program과 2개의 Include Program이 기본으로 생성된다.

System-defined Include Program
"SAPL"  +  Function Group명
: Function Group Main Program ( FunctionPool )
"L"  +  Function Group명  +  "TOP"
: 글로벌(전역)으로 사용할 변수(Data Object)를 선언하는 Include Program

"L"  +  Function Group명  +  "UXX" : Function Module 생성시 생성되는 Include Program이 선언되는 Include Program

그 밖에 하단에 주석되어 있는 Subprograms과 PBO/PAI Modules 관련 Include Program은 선택사항이며, 생황에 따라 생성하여 사용할 수 있다.

User-defined Include Program
"L"  +  Function Group명  +  "F"  +  Sequence 2자리
: Subroutine을 정의하는 Include Program

"L"  +  Function Group명  +  "O"  +  Sequence 2자리 : PBO Module을 정의하는 Include Program
"L"  +  Function Group명  +  "I"  +  Sequence 2자리 : PAI Module을 정의하는 Include Program 

 

< Global 변수를 정의할 수 있는 "TOP" Include Program >

"L * TOP" Include Program에 선언한 전역변수는 Function Group에 존재하는 모든 Function Module에서 사용이 가능하다. 또한 Default 구문인 "FUNCTION-POOL"의 Option 값인 "MESSAGE-ID"를 사용하여 Function Module에서 사용할 Message ID도 Default로 설정 가능하다. 

 

< Function Module이 생성된 Function Group 구조 >
< Function Module 생성시 자동으로 생성된 Include Program >

위와 같이 Function Module도 결국 하나의 Include Program이며, "L" + Function Group명 + "U" + 2자리 Sequence 를 가진 이름으로 자동 생성된다. ( 예제와 같이 생성된 순서대로 "U01", "U02"로 생성됨 ) 이렇게 생성된 Include Program은 "L * UXX" Include Program에 자동으로 선언되며, 그 선언된 구문 밑에는 실제 생성된 Function Module명이 주석으로 표기된다. 프로그램 상단에 적혀있는 주석처럼 직접 수정이 불가하며, Function Module 생성시마다 자동으로 Generate 되는 Include Program이다.  

 

이렇듯 Function Module 하나가 독립적인 프로그램이 아니라, Function Group의 하나의 커다란 프로그램 안에 여러 Function Module (Include Program)로 나누어져 있음을 알 수 있다. 

 


이와 같은 Function Group과 Function Module 구조로 인해 실무에서는 다음과 같은 오류사항들이 종종 발생하니 주의하도록 하자. 

 

Case #1. Function Module Syntax 오류

주로 ABAP Dictionary Object (Table, Structure, Field..)변경시 발생되는 문제로, 예를 들어 Table Field의 변경 또는 삭제시, 그 영향으로 해당 필드가 사용된 기존 소스에서 Syntax 에러가 발생할 수 있다. 이 때 Syntax 에러가 Function Module에서 발생했다면, 거기서 끝나는 것이 아니라 그 Function Module이 속해 있는 Function Group에 존재하는 모든 Function Module에 대해서 에러가 나게 된다. 앞서 말한 것과 같이 Function Group이란, 하나의 프로그램 안에 Function Module( Include Program )로 나누어져 있는 구조이기 때문에 Function Module의 에러는 곧 Function Group 의 에러이기도 하다. 만약 Interface 관련 Function Module을 모아둔 Function Group 이였다면 그 안의 모든 Interface가 먹통이 되는 끔찍한 상황이 발생할 수 있다. 

 

Case #2. 전역변수 초기화(Clear) 누락 오류 

동일한 Function Group 내에 Function Module들이 동일한 전역변수를 사용했을 때 발생하는 문제이다. 같은 Function Group의 Function Module "A" 와 "B" 가 동일한 전역변수 "G"를 사용한다고 해보자. 프로그램에서 Function "A"를 먼저 호출 후 Function "B" 를 호출 했다면 "B"에서는 "A"에서 사용했던 전역변수 "G"에 남아있는 값을 그대로 "B"에서 사용하게 된다. 따라서 Function 초반에 전역변수를 초기화 하지 않으면 기존 쓰레기 값 그대로 사용되어 오류를 일으킬 수 있다. 로직적으로 Function Module 끼리 값을 주고 받으며 사용되는 전역변수라면 초기화하지 않는 것이 맞다. 

 

+ Recent posts