COBOL 파일 처리에서의 VSAM 및 QSAM 비효율성

COBOL 파일 처리 최적화: VSAM 및 QSAM 비효율성에 대한 정적 분석

COBOL 프로그램에서 비즈니스 레코드와의 상호 작용은 파일을 열고, 읽고, 쓰는 방식에 따라 달라지는 경우가 많습니다. VSAM이나 QSAM과 같은 액세스 방식을 사용할 때, 파일을 읽고, 쓰고, 구조화하는 방식은 시스템의 동작과 응답성에 영향을 미칠 수 있습니다. 정적 분석 방법을 제공합니다 COBOL 소스 코드를 조사하고 패턴을 감지합니다. 이로 인해 파일 작업이 느리거나 중복될 수 있습니다.

이 글에서는 정적 분석을 사용하여 COBOL 프로그램의 비효율적인 파일 처리 로직을 검토하는 방법을 살펴봅니다. VSAM 및 QSAM 사용 시 발생하는 일반적인 문제를 파악하고, 발생 원인을 설명하며, 도구를 사용하여 이러한 문제를 어떻게 탐지할 수 있는지 설명합니다.

COBOL 파일 처리 최적화

SMART TS XL COBOL 프로그램이 실제로 파일을 처리하는 방식을 분석하려면

자세히 보기

차례

기업 시스템에서 COBOL에 대한 배경 지식

COBOL은 구조화된 비즈니스 데이터를 처리하는 엔터프라이즈 시스템에서 여전히 널리 사용되고 있습니다. 많은 조직에서 이러한 프로그램은 일상 업무, 회계 프로세스 또는 고객 상호작용과 관련된 대량의 입출력을 처리합니다. 시간이 지남에 따라 이러한 프로그램은 규모와 복잡성이 커질 수 있으며, 특히 여러 세대의 기술을 사용하는 여러 팀이 관리하는 경우 더욱 그렇습니다.

VSAM 및 QSAM과 같은 파일 액세스 방식은 이러한 환경에서 일반적으로 사용됩니다. 이러한 방식은 순차적 데이터 액세스와 인덱스 데이터 액세스를 모두 지원하여 개발자가 의도한 사용 사례에 맞게 레코드를 효율적으로 읽고 업데이트할 수 있도록 합니다. 그러나 이러한 방식이 적용되는 방식은 코드베이스마다 크게 다를 수 있습니다. 일관된 패턴이나 검토가 없으면 일부 구현에서는 중복 읽기, 반복적인 파일 열기 또는 I/O 루프 내부의 불필요한 논리.

COBOL 프로그램은 수천 줄에 걸쳐 있고 여러 개의 중첩된 루틴을 포함할 수 있기 때문에 이러한 패턴을 직접 파악하는 것은 종종 비현실적입니다. 정적 분석은 소스 코드 구조, 사용 경로 및 액세스 순서를 검사하여 이러한 동작을 파악하는 데 도움이 됩니다. 이러한 접근 방식을 통해 단순화 또는 조정이 필요한 영역을 찾을 수 있습니다.

파일 처리 효율성이 여전히 중요한 이유

많은 COBOL 프로그램은 대용량 데이터 세트를 처리하는 데 사용되며, 주로 야간 일괄 처리 작업이나 예약된 작업의 일부로 사용됩니다. 프로그램이 파일을 반복적으로 열거나, 과도한 읽기 작업을 수행하거나, 관련 데이터 양에 적합하지 않은 액세스 패턴을 사용하는 경우 실행 시간이 증가할 수 있습니다. 이로 인해 적시 출력에 의존하는 다운스트림 시스템에서 처리 시간이 길어지거나 지연이 발생할 수 있습니다.

예를 들어, 간단한 루프를 사용하여 VSAM 파일에서 고객 레코드를 처리하는 COBOL 프로그램을 생각해 보세요.

READ CUSTOMER-FILE INTO WS-CUSTOMER
AT END
SET EOF-FLAG TO TRUE
END-READ.

PERFORM UNTIL EOF-FLAG
IF WS-CUSTOMER-STATUS = 'ACTIVE'
PERFORM PROCESS-CUSTOMER
END-IF

READ CUSTOMER-FILE INTO WS-CUSTOMER
AT END
SET EOF-FLAG TO TRUE
END-READ
END-PERFORM.

이 패턴은 단독으로는 무해해 보입니다. 하지만 다른 루프 안에 배치되거나 여러 파일 세그먼트에 걸쳐 반복되는 OPEN 및 CLOSE 문을 사용하는 경우 속도 저하를 초래할 수 있습니다. 파일 처리에 수만 또는 수십만 개의 레코드가 포함될 경우 이러한 작은 비효율성이 더욱 두드러집니다.

파일 접근성을 개선하는 것은 전체 런타임을 줄이고 시스템 지원을 더욱 용이하게 하는 한 가지 방법입니다. 파일 사용 방식을 검토하면 코드 일관성을 유지하고 향후 개선이나 감사를 위해 프로그램을 준비하는 데에도 도움이 될 수 있습니다.

정적 분석이 파일 액세스 개선을 지원하는 방식

정적 분석은 소스 코드를 실행하지 않고도 검사할 수 있는 방법을 제공합니다. 특히 프로그램이 크거나, 레거시이거나, 테스트 환경에서 실행하기에는 너무 민감한 경우에 유용합니다. 정적 분석은 코드의 구조, 제어 흐름 및 데이터 사용을 분석하여 수동으로 찾기 어려운 패턴을 찾아낼 수 있습니다.

파일 처리의 경우, 정적 분석을 통해 중첩된 파일 루프, 동일 데이터에 대한 반복적인 접근, 또는 불필요한 파일 간 전환과 같은 문제를 감지할 수 있습니다. 또한 정적 분석은 팀이 여러 프로그램에서 파일이 어떻게 사용되는지 매핑하는 데 도움이 되므로, 작업 간에 데이터 세트를 공유하는 시스템을 사용할 때 유용합니다.

이러한 검사는 코드베이스를 더 쉽게 이해하도록 하여 장기적인 유지 관리를 지원합니다. 개발자는 애플리케이션 내 데이터 흐름, 운영 간소화 방안, 그리고 코드의 어떤 부분을 리팩토링해야 하는지에 대한 가시성을 확보할 수 있습니다. 이는 결과적으로 시스템 정리, 문서화 또는 점진적 업데이트와 같은 더 큰 규모의 작업에 도움이 됩니다.

정적 분석을 일관되게 적용하면 파일 I/O와 관련된 성능 문제 발생 가능성을 줄이는 데 도움이 됩니다. 또한 팀이 기존 시스템을 교체하지 않고도 개선 계획을 세울 수 있는 기반을 마련해 줍니다.

COBOL 파일 액세스 방법 이해

COBOL에서 파일 접근은 언어의 구조와 사용하는 데이터셋에 따라 결정됩니다. 비효율성이 발생하는 부분을 파악하려면 COBOL이 VSAM 및 QSAM 파일을 처리하는 방식, 이러한 방식이 실제 애플리케이션에서 어떻게 사용되는지, 그리고 어떤 코딩 패턴이 성능에 영향을 미치는지 살펴보는 것이 좋습니다.

이 섹션에서는 두 가지 주요 액세스 방법을 소개하고 제어 흐름이 파일 I/O 논리와 어떻게 상호 작용하는지 살펴봅니다.

VSAM 및 QSAM 개요

VSAM(Virtual Storage Access Method)과 QSAM(Queued Sequential Access Method)은 COBOL 파일 처리에서 서로 다른 역할을 합니다. 두 방식 모두 널리 사용되지만, 구조와 동작 방식이 서로 다르기 때문에 프로그램이 데이터를 읽고 쓰는 효율에 영향을 미칩니다.

VSAM은 인덱스 및 키 기반 파일을 관리하는 데 사용됩니다. 직접 레코드 액세스를 지원하여 프로그램이 키를 기반으로 특정 데이터 위치로 이동할 수 있도록 합니다. 따라서 VSAM은 고객 조회 또는 ID별 레코드 업데이트와 같은 작업에 적합합니다. KSDS(키 순차 데이터 집합) 및 ESDS(엔트리 순차 데이터 집합)와 같은 파일 구성과 호환됩니다.

QSAM은 더 간단합니다. 파일을 순차적으로 읽고 씁니다. 키, 인덱싱, 내장된 임의 접근 기능이 없습니다. 레코드 간 이동이 필요 없는 보고서, 로그 데이터 또는 일괄 입력 파일에 적합합니다. 선형적인 특성 때문에 QSAM은 루프와 I/O 블록이 작성되는 방식에 더 민감합니다.

다음은 COBOL에서 QSAM을 사용하는 기본적인 예입니다.

코볼복사편집OPEN INPUT EMPLOYEE-FILE.
PERFORM UNTIL EOF-FLAG
    READ EMPLOYEE-FILE INTO WS-EMPLOYEE
        AT END
            SET EOF-FLAG TO TRUE
    END-READ
    PERFORM PROCESS-EMPLOYEE
END-PERFORM.
CLOSE EMPLOYEE-FILE.

QSAM은 간단하기 때문에 신뢰할 수 있지만, 오용되기 쉽습니다. 예를 들어, 데이터를 작업 저장소에 버퍼링하는 대신 동일한 파일을 여러 번 별도의 패스로 읽으면 실행 시간이 크게 증가할 수 있습니다.

VSAM은 더 유연하지만 자체적인 복잡성을 야기합니다. 랜덤 액세스 읽기, 부적절한 사용 START 동사 또는 반복 REWRITE 중첩 루프 내부의 작업은 적절하게 계획하지 않으면 처리량이 감소할 수 있습니다.

각 방법의 특성을 이해하면 정적 분석을 통해 코드 동작을 검토하는 데 도움이 됩니다.

레거시 시스템의 일반적인 사용 사례

COBOL 파일 작업은 지원하는 비즈니스 워크플로와 긴밀하게 연계됩니다. 레거시 시스템에서는 VSAM 데이터세트에서 수백만 개의 레코드를 읽고, 비즈니스 로직을 적용하고, 결과를 QSAM 출력 파일에 쓰는 일일 배치 작업이 흔히 발생합니다. 이러한 워크플로에는 중간 파일, 오류 로깅 또는 일반 순차 형식으로 작성된 감사 추적이 포함될 수도 있습니다.

예를 들어 보험 시스템에서 COBOL 프로그램은 VSAM 정책 파일을 열고 특정 기간 내에 만료되는 모든 레코드를 검색하여 갱신 서신 출력 파일을 생성할 수 있습니다. 은행에서는 거래 레코드를 검색하여 이자를 계산하거나 수수료를 적용할 수 있습니다. 이러한 경우 파일 처리는 고립된 논리가 아닙니다. 루프, 조건 및 비즈니스 규칙 내에 깊이 내장되어 있습니다.

이러한 작업은 속도가 아닌 신뢰성을 고려하여 설계된 경우가 많습니다. 그 결과, 다음과 같은 문제가 흔히 발생합니다.

  • 동일한 입력 파일을 통한 여러 패스
  • 읽기 전에 외부에서 레코드 정렬
  • 그룹화 또는 변환에 사용되는 임시 파일
  • 루프 반복마다 반복되는 파일 열기 및 닫기

이러한 구조는 시간이 지남에 따라 여러 팀에서 계층을 추가하면서 진화했기 때문에, 원래 의도가 논리에서 사라지거나 중복될 수 있습니다. 정적 분석은 프로그램 구조를 따라가기 어려운 경우에도 이러한 패턴을 표면화하는 데 도움이 됩니다.

일반적인 사용 사례를 이해하면 분석가가 어떤 유형의 액세스 패턴이 속도 저하를 일으킬 가능성이 있는지 우선순위를 정하는 데 도움이 됩니다.

제어 구조 및 액세스 패턴

COBOL의 제어 흐름은 다음을 사용하여 구성됩니다. PERFORM, IF예산 및 EVALUATE 파일 처리 루틴을 감싸는 블록이 많습니다. 이러한 제어 구조는 일반적으로 간단하지만, 파일 접근 로직이 중첩되거나 재사용되거나 조건부로 트리거되는 경우 복잡해질 수 있습니다.

다음은 타당해 보이지만 성능에 위험이 따르는 예입니다.

PERFORM READ-AND-PROCESS-FILE
VARYING REGION-ID FROM 1 BY 1
UNTIL REGION-ID > 10.

READ-AND-PROCESS-FILE.
OPEN INPUT CUSTOMER-FILE.

PERFORM UNTIL EOF-FLAG
READ CUSTOMER-FILE INTO WS-CUSTOMER
AT END
SET EOF-FLAG TO TRUE
END-READ

IF WS-CUSTOMER-REGION = REGION-ID
PERFORM PROCESS-CUSTOMER
END-IF
END-PERFORM.

CLOSE CUSTOMER-FILE.

이 코드는 동일한 파일을 영역당 한 번씩 열 번 열고 읽습니다. 기능적으로는 문제없지만, 중복 I/O와 더 긴 런타임을 초래합니다. 경우에 따라 개발자는 파일을 한 번만 읽고 데이터를 메모리에 그룹화하는 방식으로 이 로직을 재구성합니다. 하지만 이러한 절충안은 프로그램 구조를 전체적으로 파악해야만 명확해집니다.

정적 분석 도구는 이러한 제어 구조와 관련 파일 작업을 표면화하는 데 도움이 됩니다. 또한 개발자는 파일을 열거나 읽는 빈도와 이러한 작업이 불필요한 외부 루프에 의존하는지 여부를 추적할 수 있습니다. 파일 처리 패턴과 함께 제어 흐름 분석을 수행하면 I/O 루틴이 예상 로직을 따르거나 런타임에 영향을 미치는 방식으로 벗어나는 부분을 파악할 수 있습니다.

COBOL에서 비효율적인 파일 처리 패턴

일부 COBOL 프로그램은 수년간 잘 작동하지만, 점차 실행 속도 저하, 긴 배치 윈도우, 또는 설명할 수 없는 I/O 피크 등의 징후를 보입니다. 이러한 문제는 파일 접근 및 처리 방식의 사소한 비효율성에서 비롯되는 경우가 많습니다. 이러한 패턴의 대부분은 잘못된 코딩이 아니라 점진적인 발전, 복제된 로직, 또는 재검토되지 않은 초기 설계 결정에서 비롯됩니다.

이 섹션에서는 파일 처리 성능에 영향을 미치는 반복적인 관행을 살펴보고, 정적 분석을 통해 더 큰 문제가 되기 전에 감지할 수 있는 패턴에 초점을 맞춥니다.

과도한 순차적 읽기 및 랜덤 액세스 루프

COBOL 프로그램에서 흔히 발생하는 비효율성은 불필요한 순차적 스캔이나 최적화되지 않은 임의 접근 사용입니다. 특히 인덱싱이나 사전 필터링으로 충족할 수 있는 조건을 충족하기 위해 파일을 반복적으로 읽을 때 이러한 현상이 두드러집니다.

프로그램이 특정 키가 있는 레코드를 찾기 위해 모든 레코드를 읽는 시나리오를 생각해 보세요.

PERFORM UNTIL EOF-FLAG
READ CUSTOMER-FILE INTO WS-CUSTOMER
AT END
SET EOF-FLAG TO TRUE
END-READ

IF WS-CUSTOMER-ID = TARGET-ID
PERFORM PROCESS-MATCH
END-IF
END-PERFORM.

If CUSTOMER-FILE 인덱싱됩니다 START 그 뒤에 단일 READ 이 루프 전체를 대체할 수 있습니다. 순차적 스캔은 모든 데이터를 처리할 때는 적합하지만, 단일 일치 항목을 검색할 때는 적합하지 않습니다. 더 큰 데이터 세트에서는 이로 인해 눈에 띄는 지연이 발생합니다.

마찬가지로 중첩된 랜덤 액세스를 사용하여 START 다음 READ 최적화되지 않은 키가 있는 루프에서는 데이터세트 전체에서 포인터가 반복적으로 이동하기 때문에 CPU 사용량이 높아질 수 있습니다. 정적 분석 도구는 이러한 시퀀스를 추적하고 루프가 개선 가능한 패턴에 의존하는 경우 플래그를 지정할 수 있습니다.

이런 유형의 패턴을 처리하면 일반적으로 속도가 향상될 뿐만 아니라, 수정된 코드가 실제 의도를 더욱 명확하게 반영하므로 비즈니스 로직의 명확성도 향상됩니다.

중복된 열기 및 닫기 문

파일 열기 및 닫기는 일반적으로 작업 단계당 또는 논리적 작업 세그먼트당 한 번씩 실행되어야 합니다. 그러나 일부 COBOL 프로그램에서는 이러한 작업이 여러 번 호출되는 루프나 프로시저 내에 내장되어 있습니다. 이로 인해 반복적인 열기-닫기 사이클이 발생하여 불필요한 I/O 부하가 발생합니다.

비효율적인 구조의 예:

PERFORM PROCESS-REGION
VARYING REGION-ID FROM 1 BY 1
UNTIL REGION-ID > 5.

PROCESS-REGION.
OPEN INPUT CUSTOMER-FILE

PERFORM READ-CUSTOMERS

CLOSE CUSTOMER-FILE.

여기서 파일은 각 영역별로 한 번씩 총 다섯 번 열리고 닫힙니다. 파일이 영역별로 물리적으로 분할되어 있지 않으면 이러한 방식은 불필요한 오버헤드를 발생시킵니다. 실제로는 파일을 한 번 열고 모든 레코드를 읽은 후 메모리 내 또는 로직을 통해 필터링을 적용하는 것이 더 좋습니다.

때로는 이 패턴이 명확하지 않은 경우가 있습니다. 특히 OPEN CLOSE 문장은 여러 프로그램에서 사용되는 공유 문단 안에 묻혀 있습니다. 정적 분석을 통해 이러한 문장이 예상보다 자주 발생하거나 긴밀한 루프 안에 나타나는 경우를 파악할 수 있습니다.

중복된 파일 제어 논리를 수정하면 런타임과 파일 경합 또는 잠금 문제가 발생할 가능성이 줄어드는 경향이 있으며, 특히 공유 데이터 세트가 있는 환경에서는 그 효과가 큽니다.

구조가 제대로 구성되지 않은 읽기 및 쓰기 블록

읽기 또는 쓰기 작업이 제어 로직과 명확하게 분리되지 않으면 프로그램 유지 관리가 어려워지고 비효율성이 발생할 가능성이 커집니다. 이는 여러 읽기 또는 쓰기 작업이 명확한 경계 없이 루프에 분산되어 있거나 쓰기 조건이 너무 느슨하게 정의되어 있을 때 흔히 발생합니다.

조각화된 쓰기 논리의 예:

PERFORM UNTIL EOF-FLAG
READ TRANSACTION-FILE INTO WS-TRANSACTION
AT END
SET EOF-FLAG TO TRUE
END-READ

IF WS-TRANSACTION-TYPE = 'A'
WRITE REPORT-LINE-A FROM WS-REPORT-A
END-IF

IF WS-TRANSACTION-TYPE = 'B'
PERFORM GENERATE-DETAIL
WRITE REPORT-LINE-B FROM WS-REPORT-B
END-IF
END-PERFORM.

여기서 쓰기 로직은 여러 조건으로 나뉘는데, 그중 일부는 실행되지 않을 수도 있습니다. 나중에 로직을 추가하면 구조를 파악하기가 더 어려워질 수 있습니다. 정적 분석을 통해 WRITE 문이 얼마나 많이 사용되는지, 어디에 나타나는지, 그리고 일관된 구조를 따르는지 매핑할 수 있습니다.

대규모 프로그램에서는 이를 통해 쓰기 작업을 통합하거나 재구성하여 흐름을 개선하고 결과를 더 예측 가능하게 만들 수 있는 지점을 식별하는 데 도움이 됩니다.

조건부로 건너뛰거나 불필요하게 중복되는 읽기 작업에도 동일한 논리가 적용됩니다. 이러한 패턴을 조기에 감지하면 성능 문제를 방지하고 향후 수정 작업을 간소화하는 데 도움이 됩니다.

시작 및 다시 쓰기 작업이 누락되었거나 잘못 사용되었습니다.

코볼의 START REWRITE 동사는 강력하지만, 잘못 사용하면 예상치 못한 동작이나 파일 액세스 저하로 이어질 수 있습니다. 특히 VSAM KSDS 데이터세트를 사용할 때 더욱 그렇습니다.

START 파일 포인터를 주어진 키 값에 위치시키는 데 사용됩니다. 종종 뒤에 다음이 붙습니다. READ,과 같이 :

START CUSTOMER-FILE KEY >= TARGET-ID
INVALID KEY
DISPLAY "Record not found"
END-START

READ CUSTOMER-FILE INTO WS-CUSTOMER.

잘 구성된 프로그램에서는 이러한 페어링이 의도한 대로 작동합니다. 하지만 START 루프 내부에 배치되거나 고유하지 않은 키와 함께 사용되는 경우 파일 포인터가 비효율적인 방식으로 반복적으로 재설정될 수 있습니다. 또한, READ 건너뛰거나 조건부로 처리되는 경우 START 아무런 효과가 없어 혼란스러운 결과가 발생할 수 있습니다.

마찬가지로, REWRITE 동사는 현재 위치의 레코드를 대체하지만 성공적인 레코드가 생성된 후에만 사용해야 합니다. READ검증 없이 사용하면 오류나 파일 무결성 문제가 발생할 수 있습니다.

정적 분석은 이러한 동사가 위험한 맥락에서 사용되는 경우를 감지하는 데 도움이 됩니다. 예를 들어, 보고서는 다음과 같은 내용을 보여줄 수 있습니다. REWRITE 일치하는 문장이 앞에 나오지 않는 경우 READSTART 후속 조치 없이 발생하는 진술. 이러한 검토를 통해 모든 제어 경로에서 파일 동작이 안정적이고 예측 가능하게 유지됩니다.

중첩된 perform 구조에서의 암시적 파일 I/O

COBOL 프로그램이 확장됨에 따라 개발자는 파일 접근 로직을 재사용 가능한 문단으로 옮기는 경우가 많습니다. 이러한 문단은 여러 지점에서 호출되며, 때로는 여러 계층으로 중첩되기도 합니다. 이는 재사용성을 높이는 반면, 파일에 언제 어떻게 접근하는지 추적하는 데 어려움을 야기합니다.

예:

PERFORM PROCESS-BATCH.

PROCESS-BATCH.
PERFORM LOAD-INPUT
PERFORM APPLY-RULES
PERFORM SAVE-RESULTS.

LOAD-INPUT.
READ TRANSACTION-FILE INTO WS-TRANSACTION.

이 경우 READ 문장은 메인 루프에 없고 묻혀있습니다. LOAD-INPUT, 에 의해 호출됩니다 PROCESS-BATCH. 이 패턴이 여러 파일에 걸쳐 사용되는 경우 모든 읽기를 추적하는 것이 어려워집니다. 특히 READ 데이터 값에 따라 일어날 수도 있고 일어나지 않을 수도 있습니다.

정적 분석 도구는 호출 트리를 구축하고 간접적인 접근일지라도 파일 접근이 발생하는 위치를 보여줄 수 있습니다. 이는 성능 문제를 조사하거나 모든 I/O 작업이 의도된 로직을 따르는지 검증할 때 유용합니다.

중첩된 I/O 경로를 이해하고 문서화하면 팀에서 중복을 줄이고, 부작용을 피하고, 파일 처리의 일관성을 유지하는 데 도움이 됩니다.

이러한 모든 패턴에는 공통적인 특징이 있습니다. 점진적으로 나타나며, 즉각적인 결과 없이 나타나는 경우가 많습니다. 하지만 시간이 지남에 따라 런타임, 유지 관리 용이성, 그리고 명확성에 영향을 미칠 수 있습니다. 정적 분석을 통해 이러한 패턴을 파악하면 팀은 증상이 아닌 구조에 기반하여 조정할 수 있습니다.

비효율성의 위험과 비용

일부 성능 문제는 지표와 지연을 통해 드러나는 반면, 다른 문제는 배치 일정, 인프라 사용 또는 사용자 경험 전반에 걸쳐 그 영향이 드러나기 전까지는 드러나지 않습니다. COBOL에서 비효율적인 파일 처리가 항상 완전한 실패를 초래하는 것은 아니지만, 처리 속도 저하, 운영 비용 증가, 그리고 유지 관리의 어려움을 야기하는 경우가 많습니다.

이 섹션에서는 비효율적인 파일 I/O로 인해 발생하는 결과의 종류와 이러한 문제가 기술적, 조직적 맥락에서 어떻게 나타나는지 간략하게 설명합니다.

규모에 따른 성능 페널티

COBOL 프로그램의 작은 비효율성은 데이터 세트가 제한적이거나 코드가 간헐적으로 실행되는 경우 눈에 띄지 않을 수 있습니다. 동일한 로직을 수백만 개의 레코드가 있는 파일에 적용하거나 일괄 작업이 밤새도록 연속적으로 실행되는 경우 그 영향이 더욱 두드러집니다.

예를 들어, 별도의 루프를 사용하여 VSAM 파일을 여러 번 읽는 프로그램은 개발 단계에서는 실행하는 데 몇 초밖에 걸리지 않을 수 있습니다. 그러나 실제 데이터 양이 많은 운영 환경에서는 이 시간이 몇 분 이상 걸릴 수 있습니다. 여기에 수십 개의 작업이 순차적으로 실행된다는 점을 곱하면, 이전에는 6시간 안에 완료되었던 일괄 처리 시간이 갑자기 초과될 수 있습니다.

소스 코드를 분석하지 않으면 이러한 성능 저하를 진단하기 어렵습니다. 프로파일링은 CPU 사용량이나 디스크 접근을 나타낼 수 있지만, 근본 원인은 종종 구조적인 문제입니다. 불필요한 읽기, 비효율적인 파일 위치 지정, 또는 반복적인 열기-닫기 작업 등이 그 원인입니다.

정적 분석은 이러한 패턴이 더 큰 타이밍 또는 처리량 문제로 확대되기 전에 파악하는 데 도움이 됩니다. 이러한 패턴을 조기에 파악함으로써 팀은 인프라 확장 없이도 배치 작업을 예상 범위 내로 유지할 수 있습니다.

유지 관리성 및 개발자 오버헤드

비효율적인 파일 처리가 포함된 COBOL 프로그램은 유지 관리에 더 많은 노력이 필요한 경우가 많습니다. 파일 작업이 분산되거나, 반복되거나, 재사용된 문단에 묻혀 있으면 개발자는 코드의 동작 방식과 그 이유를 이해하기가 더 어려워집니다.

개발자가 보고서 형식을 조정하거나 기존 처리 단계에 필터를 추가해야 한다고 가정해 보겠습니다. 읽기 로직이 한 곳에, 쓰기 로직이 다른 곳에 있으며, 파일이 여러 중간 프로시저를 호출하는 루프에서 열리고 닫힌다면, 아무리 작은 변경이라도 관련 없는 여러 섹션을 추적해야 합니다.

이로 인해 코드 검토, 테스트 및 검증에 소요되는 시간이 늘어납니다. 또한, 특히 파일 동작이 읽기 순서나 키 사용에 민감한 경우 회귀가 발생할 가능성도 높아집니다.

정적 분석을 사용하여 중복된 파일 작업이나 비표준 액세스 구조를 식별함으로써 개발팀은 프로그램 흐름을 간소화하고 장기적인 노력을 줄일 수 있습니다. 깔끔한 I/O 구조는 성능을 향상시킬 뿐만 아니라 신규 개발자가 더 쉽게 시스템에 적응하고 자신감 있게 작업할 수 있도록 도와줍니다.

운영 및 배치 런타임 영향

메인프레임 환경에서 배치 작업은 일반적으로 고정된 시간 슬롯을 가진 체인으로 예약됩니다. 각 작업은 다음 작업이 시작될 수 있도록 해당 시간 내에 완료되어야 합니다. 한 프로그램이 예상보다 오래 실행되면 이후 모든 작업이 지연됩니다. 경우에 따라 하위 작업이 건너뛰어지거나, 경고가 발생하거나, SLA가 누락되는 경우가 발생합니다.

원인이 비효율적인 파일 접근인 경우, 지연은 일관적일 수 있지만 원인을 파악하기 어려울 수 있습니다. 프로그램이 매일 필요한 것보다 10분 더 걸릴 수 있으며, 이는 매주 몇 시간씩 낭비되는 처리 시간을 의미합니다.

이는 리소스 사용량에도 영향을 미칩니다. 비효율적인 파일 루프는 I/O 증가로 이어져 시스템이 임계값에 근접할 수 있습니다. 코드가 작동하더라도 필요 이상으로 디스크 활동과 CPU 사이클을 소모합니다. 클라우드 또는 하이브리드 환경에서는 이는 인프라 비용 증가로 이어집니다.

정적 분석을 통해 작업 계획자와 지원팀은 비효율적인 I/O를 보이는 COBOL 프로그램을 파악하고 검토 우선순위를 정할 수 있습니다. 많은 경우, 작은 변경만으로도 귀중한 시간을 확보하고 일정을 다시 정상화할 수 있습니다.

감사 가능성 및 규정 준수 고려 사항

많은 COBOL 애플리케이션은 재무 보고, 데이터 정확성, 규정 준수 등 감사 대상입니다. 이러한 경우 데이터가 어떻게 읽고, 처리되고, 기록되는지 이해하는 것이 중요합니다. 비효율적인 파일 처리는 특히 레코드 업데이트나 쓰기가 복잡한 제어 경로에 숨겨진 조건 논리에 의존하는 경우 이러한 감사를 어렵게 만들 수 있습니다.

예를 들어, REWRITE 작업이 특정 플래그 하에서만 수행되고 파일 포인터를 재설정하는 로직이 선행되는 경우, 감사자는 모든 레코드가 일관되게 처리되었는지 질문할 수 있습니다. 명확한 문서화나 추적성이 없으면 이러한 질문에 답하는 데 시간이 걸립니다.

임시 파일, 분할 처리 또는 병렬 분기를 포함하는 프로그램도 완전성을 검토해야 합니다. 기록이 누락되거나 두 번 이상 기록되는 경우, 의도치 않게라도 보고 불일치가 발생할 수 있습니다.

정적 분석은 파일 접근을 가시화하여 감사 준비를 지원합니다. 도구를 통해 읽기, 쓰기, 업데이트가 발생한 위치와 조건을 정확하게 파악할 수 있습니다. 이를 통해 규정 준수 팀은 프로그램 전반의 데이터 흐름을 추적하고 처리 규칙이 일관되게 구현되었는지 검증할 수 있습니다.

구조적으로 깔끔하고 효율적인 프로그램은 설명하기 쉽고, 문서화하기 쉬우며, 검토 중에 질문이 제기될 가능성이 적습니다.

이러한 위험을 고려하면 파일 I/O 비효율성은 단순히 성능 문제만이 아니라는 점이 분명해집니다. 이는 시스템 지원 방식, 개발자의 작업 방식, 그리고 조직의 데이터 신뢰도 유지 방식에 영향을 미칩니다. 정적 분석을 통해 이러한 패턴을 파악하면 이러한 문제를 표면화하여 직접 해결할 수 있습니다.

정적 분석이 이러한 패턴을 식별하는 방법

COBOL 소스 코드를 한 줄씩 읽어 보면 표면적인 로직은 드러나지만, 프로그램 전체에서 파일에 어떻게 접근하는지 전체적인 흐름을 파악하기는 어렵습니다. 정적 분석은 코드를 텍스트로 읽는 방식에서 구조화된 동작으로 이해하는 방식으로 관점을 전환합니다. 적절한 접근 방식을 사용하면 개발 및 현대화 팀은 수천 줄에 걸쳐, 심지어 대규모 상속된 코드베이스에서도 비효율적인 부분을 찾아낼 수 있습니다.

이 섹션에서는 정적 분석 도구가 코드에서 의미를 추출하여 중복되거나 일관되지 않은 파일 I/O 사용을 표면화하는 방법에 중점을 두고 이를 가능하게 하는 핵심 기술을 살펴봅니다.

데이터 흐름 및 제어 흐름 그래프 생성

정적 분석의 핵심은 절차적 코드를 제어 흐름 그래프(CFG) 및 데이터 흐름 그래프(DFG)와 같은 추상적인 표현으로 변환하는 것입니다. 이러한 구조를 통해 도구는 프로그램이 데이터를 어떻게 이동하고 실행 경로가 어떻게 구성되는지 이해할 수 있습니다.

제어 흐름 그래프는 한 명령문이나 블록에서 다른 명령문이나 블록으로의 실행 흐름을 매핑합니다. 이는 코드 실행 빈도와 순서에 영향을 미치는 분기, 루프, 조건 경로를 식별합니다. 이는 특히 중첩된 파일 액세스 패턴을 감지하거나 의도치 않게 반복 읽기를 유발할 수 있는 경로를 식별하는 데 중요합니다.

데이터 흐름 그래프는 값이 할당, 전달 및 사용되는 방식을 보여줍니다. COBOL에서 이는 레코드 키, 플래그 등을 포함하는 변수를 추적하는 데 특히 유용합니다. AT END 조건 또는 작업 저장 필드 사용 READ WRITE 작업.

정적 분석 도구는 이러한 그래프를 생성함으로써 프로그램을 실행하지 않고도 프로그램의 동작을 시뮬레이션할 수 있습니다. 이는 동일한 실행 분기에서 파일을 여러 번 읽었는지, 또는 변수가 여러 코드 섹션에서 일관되지 않은 방식으로 재사용되는지 파악하는 데 유용합니다.

고도로 모듈화된 코드베이스에서도 이러한 그래프는 파일 사용 및 제어 논리에 대한 완전한 그림을 형성하는 데 도움이 되므로 고수준 패턴 감지의 기반이 됩니다.

반복되는 I/O 작업 감지

프로그램 구조가 매핑되면 다음 단계는 비효율적이거나 반복적인 파일 작업을 나타내는 패턴을 감지하는 것입니다. 여기에는 단일 파일이 유사한 논리 분기에서 여러 번 열리거나, 읽히거나, 다시 작성되는 경우가 포함됩니다.

예를 들어, 파일이 루프 외부가 아닌 루프 내부에서 열린 경우 정적 분석은 반복되는 파일을 플래그로 표시할 수 있습니다. OPEN 효율성 문제로 진술합니다. 마찬가지로, READ 중첩된 조건 블록에서 연산이 여러 번 실행되는데, 버퍼링된 논리로 대체할 수 있으며, 패턴을 강조 표시하여 검토할 수 있습니다.

반복적인 읽기는 공통된 카피북을 공유하거나 동일한 하위 프로그램을 호출하는 프로그램 간에도 발생할 수 있습니다. 정적 분석은 이러한 참조를 프로그램 경계를 넘어 연결함으로써 수동 검토만으로는 얻기 어려운 프로그램 간 통찰력을 제공합니다.

일부 도구는 다음과 같은 측정항목도 추적합니다.

  • 총 수 READ, WRITE, REWRITE, OPEN예산 및 CLOSE 파일당 작업
  • 각 파일에 영향을 미치는 고유한 제어 경로의 수
  • 액세스 패턴이 순차적, 인덱싱 또는 혼합인지 여부

이러한 정량적 지표를 통해 팀은 특히 대규모 포트폴리오를 다룰 때 어떤 프로그램이나 모듈을 먼저 검토해야 할지 우선순위를 정할 수 있습니다.

목표는 반복되는 파일 접근을 모두 없애는 것이 아니라, 어디에서 가치를 더하고 어디에서 불필요한 부하를 유발하는지 파악하는 것입니다.

안티패턴에 대한 패턴 매칭

비효율적인 파일 처리 관행 중 상당수는 눈에 띄는 범주에 속합니다. 시간이 지남에 따라 정적 분석 도구는 이러한 안티패턴과 일치하는 패턴 라이브러리를 개발하고 검사 중에 자동으로 표시합니다.

이러한 패턴의 예는 다음과 같습니다.

  • 한 번의 프로그램 실행에서 동일한 파일을 여러 번 열고 닫기
  • 사용 START 다음 READ 키가 변경되지 않는 루프 내에서
  • 수행하는 문단 호출 READ 필요한 컨텍스트를 전달하지 않고 작업
  • 여러 개의 순차적 수행 READ동일한 데이터에 대해 프로그램의 다른 섹션에 있는 s

이러한 패턴은 구문만으로 플래그가 지정되는 것이 아니라, 앞서 설명한 제어 및 데이터 흐름 계층 전체에서 일치합니다. 이를 통해 특히 프로그램 로직이 여러 계층, 포함 파일 또는 공유 구성 요소에 분산되어 있는 경우 탐지 성능이 더욱 강력해집니다.

최신 도구에서 이러한 형태의 패턴 매칭에는 종종 상황 인식 검사가 포함됩니다. 예를 들어, REWRITE 작업은 이전 작업이 위험한 것으로 간주될 수 있습니다. READ 조건부이거나 동일한 레코드가 루프에서 두 번 이상 기록되는 경우입니다. 이러한 수준의 분석은 노이즈를 줄이고 성능이나 동작에 영향을 미칠 가능성이 있는 사례에 집중하는 데 도움이 됩니다.

안티패턴을 문서화하는 것은 향후 개발 방향을 제시하는 데에도 도움이 됩니다. 팀이 피해야 할 사항의 예시를 확인할 수 있을 때, 일관되고 효율적인 관행을 채택할 가능성이 높아집니다.

비효율적인 파일 액세스 시퀀스 시각화

코드만으로는 전체 상황을 파악하기 어려울 수 있습니다. 특히 로직이 여러 모듈에 분산된 대규모 COBOL 애플리케이션의 경우 더욱 그렇습니다. 시각화는 개발자, 분석가, 기획자가 빠르게 해석할 수 있는 방식으로 파일 사용 패턴을 제시하여 이러한 간극을 메우는 데 도움이 됩니다.

정적 분석 도구의 시각화는 다음과 같은 형태를 취할 수 있습니다.

  • 제어 구조 내에서 파일 작업이 어떻게 배열되는지 보여주는 흐름도
  • 여러 프로그램이 하나의 데이터 세트를 다룰 때 유용한 파일-프로그램 관계 다이어그램
  • 특정 파일에 대한 작업의 빈도나 강도를 나타내는 히트맵
  • 파일 읽기 및 쓰기가 발생하는 위치와 실행 빈도를 보여주는 줄 주석

예를 들어, 어떤 도구는 특정 QSAM 파일이 여섯 개의 다른 프로그램에서 열리고 순차 분기와 조건 분기 모두에서 읽히는 것을 보여주는 다이어그램을 생성할 수 있습니다. 이는 해당 로직을 표준화하거나 리팩토링할 기회를 나타낼 수 있습니다.

또 다른 시각화는 경로를 추적할 수 있습니다. READ 중첩된 체인에 걸친 작업 PERFORM 블록을 통해 얼마나 깊이 내장되어 있고 얼마나 자주 호출되는지 명확하게 알 수 있습니다.

이러한 뷰는 이해관계자가 COBOL 구문을 읽지 않더라도 기술 환경을 더 쉽게 해석할 수 있도록 해줍니다. 또한, 계획, 현대화 또는 성능 튜닝 작업 중에 팀이 결과를 공유하는 데에도 도움이 됩니다.

이러한 탐지 방법을 통합하면 COBOL 프로그램이 파일을 관리하는 방식을 더욱 완벽하게 파악할 수 있습니다. 명확한 그래프, 인식 가능한 패턴, 시각적 요약을 통해 정적 분석은 단순한 코드 스캐닝을 넘어 레거시 애플리케이션의 구조를 이해하고 개선하는 도구가 됩니다.

적용 SMART TS XL COBOL 파일 처리를 최적화하려면

비효율성을 파악하는 것도 중요하지만, 그 지식을 실행으로 옮기는 것이 개선으로 이어집니다. SMART TS XL COBOL 애플리케이션에 타겟팅된 정적 분석을 적용하여 팀이 가시성에서 해결로 나아갈 수 있도록 지원합니다. 특히 파일 I/O 구조, 실행 논리, 데이터 이동에 중점을 둡니다.

이 섹션에서는 방법에 대해 설명합니다. SMART TS XL 비효율적인 파일 처리를 감지하고, 일반적인 워크플로우가 어떤 모습인지, 그리고 이를 통해 얻은 통찰력을 리팩토링, 문서화 또는 보다 광범위한 현대화 노력을 지원하는 데 어떻게 사용할 수 있는지 알아봅니다.

방법 SMART TS XL 파일 I/O 비효율성을 감지합니다

SMART TS XL 소스 코드를 분석하고 프로그램 구조, 데이터 종속성 및 제어 흐름에 대한 포괄적인 내부 모델을 생성하여 COBOL 프로그램을 분석합니다. 여기에는 다음 사항이 포함됩니다.

  • 다음과 같은 파일 동사의 모든 발생 READ, WRITE, REWRITE, OPEN, CLOSE예산 및 START
  • 이러한 작업이 실행되는 순서 및 조건
  • 작업이 중첩, 반복 또는 조건부인지 여부를 포함하여 파일이 액세스되는 컨텍스트

파일 처리를 분석할 때, SMART TS XL 다음과 같은 영역을 강조합니다.

  • 여러 제어 경로에 걸쳐 동일한 파일에서 반복 읽기
  • 동일한 실행 컨텍스트에서 두 번 이상 열리거나 닫힌 파일
  • 기술 부채를 나타낼 수 있는 사용되지 않는 파일 정의
  • 부적절한 사용 REWRITE 매칭 없이 READ

각 결과는 코드 수준의 맥락과 시각적 다이어그램으로 뒷받침되어 해당 동작이 발생하는 위치와 프로그램의 나머지 부분과의 연관성을 더 쉽게 이해할 수 있도록 합니다. 이를 통해 개발자와 분석가 모두 검증, 공유 및 변경의 기반으로 활용할 수 있는 실행 가능한 정보를 얻을 수 있습니다.

예제 분석 워크플로 SMART TS XL

일반적인 워크플로는 대량의 데이터를 처리하거나 배치 성능이 느린 것으로 알려진 프로그램 집합을 스캔하는 것으로 시작할 수 있습니다. 일단 로드되면 SMART TS XL시스템은 파일 상호작용을 포함하여 애플리케이션의 전체 구조 맵을 구축합니다.

거기에서 팀은 다음과 같은 특정 파일을 탐색할 수 있습니다. TRANSACTION-FILE. 다음 내용을 볼 수 있습니다.

  • 파일에 액세스하는 모든 프로그램
  • 각 프로그램에 대해 사용된 I/O 작업의 수와 유형
  • 각 작업이 제어 흐름에서 발생하는 위치
  • 파일 처리 논리가 일관성이 있는지 아니면 프로그램마다 다른지

분석가는 다음과 같은 문제가 있는 블록으로 빠르게 이동할 수 있습니다. PERFORM 파일을 열고, 완전히 읽은 후, 매 반복마다 닫는 루프입니다. 이 동작은 실행 경로에서 즉시 확인할 수 있으며, 해당 코드에 대한 클릭 가능한 참조를 통해 지원됩니다.

이를 통해 모듈 간의 빠른 식별 및 비교가 가능해져, 공유 패턴을 인식하고 대규모 리팩토링 작업의 일환으로 해결할 수 있습니다.

생성된 통찰력 SMART TS XL

SMART TS XL 기술 및 관리 수준 검토를 모두 지원하는 다양한 통찰력을 제공합니다. 일부는 파일 사용과 직접적으로 연결되고, 다른 일부는 파일 I/O 수행 방식에 영향을 미치는 제어 구조와 관련됩니다.

일반적인 출력은 다음과 같습니다.

  • 높은 작업 밀도를 가진 파일 목록(예: 실행 경로당 수백 개의 읽기)
  • 일관성 없는 사용으로 많은 프로그램에서 액세스되는 파일
  • 유사하지만 정렬되지 않은 방식으로 동일한 데이터 세트를 처리하는 프로그램 간에 중복된 논리
  • 깊이 중첩된 조건이나 구조화되지 않은 분기 내에서 파일 I/O가 발생하는 코드 세그먼트

이러한 요약 외에도, SMART TS XL 관계 및 종속성을 탐색하기 위한 그래픽 인터페이스를 제공하므로 개발자가 아닌 사용자(예: 프로젝트 관리자, 아키텍트, 감사자)도 결과의 의미를 더 쉽게 파악할 수 있습니다.

이 도구를 사용하면 이러한 통찰력을 필터링하고 문서나 프로젝트 아티팩트로 내보내어 보다 광범위한 변환 이니셔티브를 지원할 수도 있습니다.

탐지부터 리팩토링 권장 사항까지

SMART TS XL 문제 식별에만 그치지 않습니다. 체계적인 문서화, 변경 추적, 리팩토링 지침을 제공하여 문제 해결 프로세스를 지원합니다.

문제가 있는 패턴이 식별되면 이 도구를 사용하여 사용자는 다음을 수행할 수 있습니다.

  • 수정을 위해 코드 세그먼트에 태그를 지정합니다.
  • 문제를 설명하는 주석이나 의견을 추가하세요.
  • 이동과 같은 후보 개선 사항 목록을 만듭니다. OPEN 루프 외부 또는 통합 READ
  • 시간 경과에 따른 변화를 추적하여 정리 작업이 성공적인지 확인합니다.

일부 워크플로에서는 이러한 주석이 변경 관리 도구로 내보내지거나 현대화 스프린트의 일부로 개발자와 직접 공유됩니다.

때문에 SMART TS XL 분리된 코드 줄이 아닌 전체 프로그램 모델에서 작동하며, 상류 및 하류 영향을 모두 고려하여 변경 사항을 제안합니다. 이를 통해 회귀를 방지하고 레거시 로직을 더욱 안전하게 최적화할 수 있습니다.

파일 처리 비효율성을 가시화하고, 이해하고, 조치 가능하게 만들어서 SMART TS XL 팀이 COBOL 애플리케이션을 분석할 수 있을 뿐만 아니라 자신감을 가지고 이를 발전시킬 수 있도록 도와줍니다.

COBOL 파일 액세스 루프 닫기

COBOL 파일 처리 개선이 항상 시스템을 재작성하거나 새로운 기술을 도입하는 것만은 아닙니다. 성능과 명확성 향상은 이미 구축된 시스템을 파악하고, 그 작동 방식을 이해하며, 무엇을 변경해야 할지 결정하는 데서 비롯되는 경우가 많습니다. 정적 분석은 특히 시스템이 대규모이거나 공유되거나 제대로 문서화되지 않은 환경에서 이러한 가시성을 확보하는 실용적인 방법을 제공합니다.

이 마지막 섹션에서는 주요 관찰 내용을 모아 팀이 분석 결과를 가져와 실제 현대화, 문서화 및 개발 컨텍스트에 적용할 수 있는 방법에 대한 아이디어를 제공합니다.

COBOL I/O에 대한 정적 분석의 주요 내용

COBOL 파일 접근의 비효율성은 반복적인 읽기, 일관되지 않은 제어 흐름, 깊이 중첩된 I/O 로직, 불필요한 파일 열기와 같은 익숙한 패턴에서 비롯되는 경우가 많습니다. 이러한 관행은 단일 설계 결정보다는 시간이 지남에 따라 나타나는 경우가 많습니다.

정적 분석은 이러한 패턴을 조기에 체계적으로 표면화하는 방법입니다. 프로그램 구조와 데이터 흐름 모델을 생성하면 애플리케이션 전반에서 파일이 어떻게 사용되는지, 단순히 줄 단위뿐 아니라 전체 실행 경로에서 어떻게 사용되는지 파악할 수 있습니다.

이러한 가시성을 통해 팀은 가장 중요한 부분에 집중할 수 있습니다. 루프 간소화, 액세스 중복 감소, 장기적인 정리 계획 등 어떤 방식으로든 데이터는 신중하고 집중적인 개선을 지원합니다.

레거시 시스템에서의 사전 분석의 이점

많은 COBOL 시스템은 안정적이고 신뢰할 수 있습니다. 하지만 안정성이 있다고 해서 모든 코드 줄이 효율적이거나 지원이 쉽다는 것을 의미하지는 않습니다. 시간이 지남에 따라 비즈니스 변화, 직원 이직, 그리고 문서화되지 않은 업데이트가 결합되어 간소화할 수 있는 로직이 남게 됩니다.

운영에 문제가 나타나기 전에 정적 분석을 적용하면 조직은 다음과 같은 여러 가지 이점을 얻을 수 있습니다.

  • 배치 작업은 보다 일관되게 시간 창 내에 유지됩니다.
  • 개발자는 각 모듈의 기능을 더 명확하게 이해하여 업데이트를 수행할 수 있습니다.
  • 파일 액세스 문제는 반응적으로가 아닌 구조화된 프로세스의 일부로 해결됩니다.

전면적인 현대화를 계획하지 않은 팀의 경우에도 작은 최적화를 통해 런타임이 향상되고 감사가 쉬워지며 새로운 팀원의 온보딩이 간소화되는 경우가 많습니다.

지속적인 최적화를 향해 나아가다

일회성 분석만으로도 가치를 얻을 수 있지만, 진정한 발전은 이러한 통찰력을 정기적인 워크플로에 통합할 때 가능합니다. 지속적인 검토, 테스트 또는 코드 수명 주기 관리의 일환으로 정적 분석을 도입하는 팀은 예상치 못한 문제를 줄이고 애플리케이션 환경 전반에 걸쳐 더욱 일관된 구조를 구축하는 이점을 누릴 수 있습니다.

같은 도구로 SMART TS XL정적 분석은 팀이 COBOL을 이해하고 사용하는 방식의 일부가 됩니다. 성능 튜닝뿐만 아니라 문서화, 규정 준수 및 기술 계획도 지원합니다.

레거시 시스템의 개선이 항상 혁신을 통해 이루어지는 것은 아닙니다. 때로는 관찰에서 시작하여 작은 발전 단계로 이어지기도 합니다. 그리고 올바른 통찰력을 바탕으로 각 단계는 더욱 신중하고 효율적이며 설명하기 쉬워집니다.