본문으로 바로가기


누구나 할 수 있는 ABAP - Exercise 15: Working with Internal Tables




Internal Table(인터널 테이블)을 사용하는 이유

SAP라는 것은 일단 비즈니스용 프로그램이기 때문에 주로 비즈니스 데이터를 읽고 쓰고 하는 일을 매우 많이 할 수 밖에 없다. 프로그램의 대부분이 DB를 액세스 하는 일이 대부분이고 DB액세스는 시 분 초 단위로 매우 많이 발생한다.


같은 말을 세번이나 하면서 'DB 액세스'를 매우 강조하고 있다.


'DB 액세스'가 많이 발생하면 서버에 부하를 줄 뿐만 아니라 프로그램 수행 속도가 느려질 수 있다 가 아니고 느려진다. 그리고 SAP는 한두사람이 쓰는 시스템이 아니라 대부분 대기업에서 사용하기 때문에 미니멈 300에서 3000명, 30,000명까지도 사용하는 시스템이다.


데이터베이스에 30,000명이 10만건의 데이터를 10초에 걸쳐 요청을 한다면 db는 10초 동안 3,000,000,000 30억건의 데이터를 보내주어야 한다.


이론상 초당 3억건의 데이터 조회가 발생할 수도 있다.


이러한 상황이 오면 서버의 전체적인 속도가 느려질 수 있고 유저도 답답할 수 있다. 그렇기 때문에 필요한 만큼 데이터를 가지고 와서 DB액세스를 줄이는 방법을 이용해 DB에 부하도 줄이고 속도를 좀 더 빠르게 할 수 있는 기능이 Internal Table이라고 할 수 있다.





목표

· ABAP Dictionary에서 적절한 Table Type을 찾아보자

· 글로벌 테이블 타입(Global Table Type)을 가지고 인터널 테이블을 만들어 보자

· 인터널 테이블을 어레이 패치를 이용해 채워 보자

· 루프문을 이용해 인터널 테이블의 내용을 조회 해보자





비즈니스 예제

SPFLI 데이터 베이스에 저장된 항공 데이터를 출력하기 위해 인터널 테이블을 사용하려고 한다.



인터널 테이블(Internal Table)이란?

DB에서 데이터를 직접 액세스 하면 속도가 느리니까 일단 필요한 부분만 가지고 와서 이런저런 연산을 수행한 후에 출력하기 위한 임시 저장소라고 할 수 있다. 아밥의 대부분의 데이터는 이놈에 인터널 테이블을 이용해 처리한다고 보면 된다.


ABAP하고 Java하고 가장 큰 차이가 인터널 테이블의 존재 유무라고 볼 수 있다. 이놈에 '인터널 테이블' 개념이 있는지 없는지가 아밥하고 자바의 차이인 것 같다. 나머지는 딱히 어려운건 없는데 이놈에 데이터 베이스쪽이 살짝 다르다. 뭐 없으니까 쫄지말고 따라와보자.





할 일 첫번째:

인터널 테이블을 선언하시오.

1.'TOP include'빼고 'Executable program' 'ZBC400_01_ITAB_LOOP'을 만드시오.

2.데이터베이스 테이블 SPFLI에 있는 데이터를 인터널 테이블로 가지고 오시오. 인터널 테이블을 만드셔야 할껀데 타입은 SPFLI 테이블의 라인타입으로 만드는 것이 좋을 것입니다.


아밥 딕셔너리를 뒤져서, 위 2번 조건과 맞는 테이블을 찾으십시오.


힌트:아밥 딕셔너리에 있는 SPFLI테이블을 참고하기 바란다. SPFLI의 where-used list를 조회해보자.(조회 조건이 잘 선택 되어 있는지 다시한번 확인하자)


3.찾은 글로벌 테이블 타입으로 인터널 테이블을 선언하자.(이름은 it_spfli)를 추천한다.


4.인터널 테이블에 대한 적절한 work area를 선언하자.(이름은 wa_spfli)를 추천한다.





할 일 두번째:

인터널 테이블을 채우고 출력해라.


1.데이터베이스 테이블 SPFLI에 있는 데이터를 조회하는 프로그램을 만들어라.

SELECT * FROM spfli INTO TABLE it_spfli.


2.루프문을 사용해서 인터널 테이블에 임시 저장된 목록의 데이터를 출력해라.





할 일 첫번째의 1번부터 해결해보자


인터널 테이블을 선언하시오.

1.'TOP include'빼고 'Executable program' 'ZBC400_01_ITAB_LOOP'을 만드시오.

2.데이터베이스 테이블 SPFLI에 있는 데이터를 인터널 테이블로 가지고 오시오. 인터널 테이블을 만드셔야 할껀데 타입은 SPFLI 테이블의 라인타입으로 만드는 것이 좋을 것입니다.


아밥 딕셔너리를 뒤져서, 위 2번 조건과 맞는 테이블을 찾으십시오.


힌트:아밥 딕셔너리에 있는 SPFLI테이블을 참고하기 바란다. SPFLI의 where-used list를 조회해보자.(조회 조건이 잘 선택 되어 있는지 다시한번 확인하자)



주저리 주저리 써놨는데 뭐 없다.



SE11로 들어가자.






여기에서 일단 맨 위에 Database table에다가 SPFLI라고 친다.



그리고 상단에 네모난 버튼이 여러개 있다. 이 중에 왼쪽에서 세번째꺼, 마우스 올려놓으면 'Where-used list'라고 나오는 것 있다. 네모 박스에서 화살표가 세방향으로 나가는 아이콘이다. 그걸 누른다.




누르면 아래와 같이 조건 조회하는 화면이 나온다.


맨 위에 DB table에는 방금 입력한 'SPFLI'라고 입력 되어 있는 것을 확인하자.

그리고 체크할게 많은데 위에 그림처럼 'Table Type'하나만 체크하면 된다.


실행.







그러면 아래와 같은 화면이 나온다.

현재 아밥 딕셔너리에 존재하는 'SPFLI'를 사용하는 테이블 타입들이다. 다 같은 것들인데 이름만 다르다고 보면 된다.





한번 아무거나 더블클릭 해보자. 나는 'NET200_TT_SPFLI'를 더블클릭 해봤다.

LINE TYPE이 'SPFLI'로 되어있다.








다른것도 같은건지 확인해보자. 'SBC400_T_SPFLI'를 선택 해봤다.

역시 라인 타입이 SPFLI로 같다.







이 중에서 아무거나 하나 카피한다.

나는 교재에 나오는 'SBC400_T_SPFLI'로 인터널 테이블을 선언하고자한다.








다시 SE80으로 와서 아까 만들라고 했던 프로그램을 만들자.









제목은 교재에 나온 대로 하면 되고 Type만 Executable program으로 선언 되어있는지 확인해주면 된다.









뭐 나오면 확인.




또 확인.







그리고 이제 한번 인터널 테이블을 선언해보자.

여기 써있는대로 하면 된다.


그러면 선언 된거임.


간단 하네..~~



소스코드는 아래와 같다.


DATA it_spfli TYPE sbc400_t_spfli.
DATA wa_spfli LIKE LINE OF it_spfli.

SELECT FROM spfli INTO TABLE it_spfli.

if sy-subrc 0.

  loop at it_spfli into wa_spfli.
    writewa_spfli-carrid,
          wa_spfli-connid,
          wa_spfli-countryfr,
          wa_spfli-cityfrom.
  ENDLOOP.

ENDIF.





끝.











댓글을 달아 주세요