본문 바로가기

ABAP 프로그래밍 개념/ABAP 기초 개념

Memory Organization

SAP 시스템에 로그온하면 응용 서버(Application Server)에서 세션이 열리고 메모리를 사용합니다. 사용자는 최대 16개의 세션을 열 수 있으며(기술적 제약에 따라 제한될 수 있음), 각 세션은 응용 서버(Application Server)에서 자체적인 메모리 공간을 차지하며 SAP GUI의 개별 창과 연결됩니다. ABAP 프로그램은 세션(창) 내에서 실행되며 각 세션은 다른 세션과 독립적입니다.

Executable Program이나 트랜잭션(즉, 트랜잭션 코드와 연결된 프로그램)을 실행할 때 시스템은 주 세션 내에 내부 세션을 생성합니다. 이는 아래 그림에서 보여지듯이 이루어집니다.

내부 세션에서 여러 프로그램을 호출할 수 있으며, 이들은 프로그램 그룹으로 구성됩니다. 내부 세션에서 호출되는 첫 번째 프로그램은 주 프로그램 그룹을 생성합니다. 이 프로그램은 주 프로그램 그룹의 주 프로그램이 됩니다. 주 프로그램에서 함수 모듈이나 전역 클래스를 호출하면 추가적인 프로그램 그룹이 생성됩니다. 추가 그룹의 주 프로그램은 추가 그룹을 생성한 첫 번째 프로그램이 됩니다.

프로그램 그룹에 추가되지 않는다면 함수 그룹이나 클래스 풀이 아닌 프로그램(예: 외부 서브루틴 호출)이 호출됩니다. 대신, 해당 프로그램은 사용자의 프로그램 그룹에 로드됩니다. 프로그램의 할당은 프로그램의 종류가 아닌 introductory statement에 따라 결정됩니다. 예를 들어, 서브루틴 풀 프로그램은 PROGRAM이라는  introductory statement을 사용합니다. 그러나 프로그램 속성에서 프로그램 종류를 변경하지 않고 introductory statement을 FUNCTION-POOL로 변경하면 추가 프로그램 그룹이 생성됩니다.

CALL TRANSACTION 또는 SUBMIT AND RETURN 문을 사용하여 새 프로그램을 호출하면 새로운 내부 세션이 생성됩니다. 이 새로운 내부 세션은 새로운 프로그램 그룹을 생성하며, 호출된 프로그램이 프로그램 그룹의 주 프로그램이 됩니다. 이 새 세션에서 함수 모듈이나 전역 클래스를 호출하면 추가적인 프로그램 그룹이 생성됩니다.

새로운 세션에서 CALL TRANSACTION이나 SUBMIT AND RETURN 문을 사용하여 새로운 프로그램을 호출하면 다시 새 내부 세션이 생성됩니다. 각 내부 세션은 자체적인 프로그램 그룹을 갖습니다. 하나의 메인 세션에 최대 아홉 개의 내부 세션을 가질 수 있습니다. 호출 순서가 아홉 개의 내부 세션을 초과하면 모든 내부 세션을 종료하고 런타임 오류가 발생합니다.

Function Module이 호출되면 시스템은 해당 Function Module이 속한 함수 그룹(Function Group)이 추가 프로그램 그룹에 이미 존재하는지 확인합니다. 그룹이 이미 존재한다면 함수 그룹을 다시 로드하지 않고, Function Module은 추가 프로그램 그룹에서 직접 호출되며, 이를 통해 함수 그룹(Function Group)의 전역 데이터에 접근할 수 있습니다. 그러나 함수 그룹이 추가 프로그램 그룹에 존재하지 않는 경우, 함수 그룹이 모든 함수 모듈과 함께 로드되고 함수 그룹의 전역 데이터가 초기화됩니다.

만약 동일한 Function Module이 새로운 내부 세션에서 호출된다면 (새 세션에서 아직 생성되지 않았을 경우) 추가 프로그램 그룹을 생성하며, 함수 그룹(Function Group)이 추가 프로그램 그룹에 존재하지 않는 경우에는 해당 함수 그룹(Function Group)의 모든 전역 데이터를 초기화합니다. 새로운 내부 세션에서 Function Module이 접근하는 데이터는 이전 내부 세션에서 Function Module이 접근하는 데이터와 다를 수 있습니다.

예를 들어, 프로그램 A와 B가 Function Module FM1과 FM2를 호출하는데, 이 Function Module 들은 함수 그룹(Function Group) FG1에 속해 있다고 가정해봅시다. 프로그램 A가 실행되면 메인 세션 내부에서 내부 세션 1이 생성되며, 메인 프로그램 그룹이 생성됩니다. 프로그램 A가 Function Module FM1을 호출할 때, 함수 그룹(Function Group) FG1이 내부 세션 1에 로드되어 추가 프로그램 그룹이 생성됩니다. 이제 FM1에서 함수 그룹(Function Group) FG1에 일부 전역 데이터를 설정한다고 가정해봅시다. 만약 프로그램 A가 그 다음에 Function Module FM2를 호출한다면, 함수 그룹(Function Group) FG1은 이미 추가 프로그램 그룹에 존재하기 때문에 다시 로드되지 않으며, FM2는 FM1에 의해 설정된 전역 데이터를 사용할 수 있게 됩니다.

이 시점에서, 프로그램 A가 SUBMIT AND RETURN 문을 사용하여 두 번째 프로그램인 B를 호출하면, 새로운 내부 세션 2가 생성되며 메인 프로그램 그룹이 형성됩니다. 이 메인 프로그램 그룹의 메인 프로그램은 프로그램 B가 됩니다. 프로그램 B가 Function Module FM2를 호출한다면, 함수 그룹(Function Group) FG1은 내부 세션 2에 로드되어 추가 프로그램 그룹이 생성됩니다. 이는 함수 그룹(Function Group)이 내부 세션 1의 추가 프로그램 그룹에 존재하지만 내부 세션 2에는 존재하지 않기 때문입니다. 내부 세션 2에서 함수 그룹(Function Group) FG1이 로드될 때, 해당 함수 그룹의 전역 데이터는 초기화되므로 프로그램 B에서 호출된 Function Module FM2는 세션 2에 로드된 함수 그룹(Function Group) FG1의 전역 데이터와 함께 작업하게 됩니다. 따라서 내부 세션 1에서 FM2가 접근하는 데이터와 내부 세션 2에서 FM2가 접근하는 데이터는 서로 다를 수 있습니다.

주 세션의 모든 내부 세션은 주 세션의 ABAP 메모리에 액세스할 수 있습니다. 호출 시퀀스의 프로그램은 IMPORT 및 EXPORT 문을 사용하여 ABAP 메모리를 통해 데이터를 교환할 수 있습니다. 예를 들어, 호출하는 프로그램은 새로운 프로그램을 호출하기 전에 EXPORT 문을 사용하여 데이터를 ABAP 메모리에 내보낼 수 있습니다. 새로운 프로그램이 내부 세션에 로드된 후에는 IMPORT 문을 사용하여 ABAP 메모리에서 데이터를 가져올 수 있습니다. 아래는 예시 코드입니다.

"Code in calling program"
DATA v_matnr TYPE matnr VALUE 'ABCD'.
EXPORT v_matnr TO MEMORY ID 'MAT'.

CALL TRANSACTION ZXXX.

"Code in called program"
DATA v_matnr TYPE matnr.
IMPORT v_matnr FROM MEMORY ID 'MAT'.

ABAP 메모리는 같은 주 세션에서 실행되는 프로그램 간에 데이터를 교환하는 데 사용될 수 있습니다. 각 주 세션은 자체 ABAP 메모리를 가지며, 외부 세션에서는 접근할 수 없습니다. 사용자 세션의 다른 주 세션에서 실행되는 프로그램 간에 데이터를 교환하려면 SAP 메모리를 사용합니다.

모든 주 세션은 사용자 세션의 SAP 메모리에 연결되어 있습니다. 내부 세션에서 실행되는 프로그램은 사용자 세션의 SAP 메모리에 접근할 수 있습니다. 이를 통해 SAP GUI의 서로 다른 창 (다른 주 세션)에서 실행되는 프로그램 간에 데이터를 교환할 수 있습니다. 예를 들어, 주 세션 1에서 실행되는 프로그램은 SAP 메모리에 데이터를 저장하고, 주 세션 2에서 실행되는 다른 프로그램은 주 세션 1에서 저장한 데이터를 읽을 수 있습니다. 데이터는 SET PARAMETER ID 문을 사용하여 SAP 메모리에 저장하고, GET PARAMETER ID 문을 사용하여 접근할 수 있습니다. 화면의 입력 필드는 SAP 메모리와 연결하여 기본값을 설정할 수도 있습니다.

아래 예시를 보면, ZPROGRAM1이라는 프로그램을 만들어서 SET PARAMETER ID 구문을 통해 SAP MEMORY에 v_matnr 필드에 값을 MAT라는 MEMORY ID를 통해 할당합니다. SAP 메모리에 이 값이 저장되고 난 후에, 유저의 세션에서 실행되는 어떠한 프로그램에서도 MAT라는 MEMORY ID를 통해 값에 저장할 수 있습니다.

REPORT ZPROGRAM1.
DATA v_matnr TYPE matnr VALUE '100'.
START-OF-SELECTION.
SET PARAMETER ID 'MAT' FIELD v_matnr.

 

아래 예시에서는 ZPROGRAM2라는 프로그램을 만들어서 GET PARAMETER ID 구문을 통해 SAP 메모리에서 같은 MEMORY ID를 사용하여 값을 읽는 것을 볼 수 있습니다.

REPORT ZPROGRAM2.
DATA v_matnr TYPE matnr.
START-OF-SELECTION.
GET PARAMETER ID 'MAT' FIELD v_matnr.

GET PARAMETER ID 문이 실행되면 "MAT" 메모리 ID에 저장된 값은 ZPROGRAM1이 실행 중인 세션과 상관없이 ZPROGRAM2가 같은 세션이든 다른 세션이든지 상관없이 v_matnr 필드로 전달됩니다. 이는 SAP 메모리가 사용자 세션 내의 모든 주 세션에서 공유되기 때문에 프로그램들이 메모리를 통해 데이터를 교환할 수 있기 때문입니다.

반응형