본문 바로가기

Dev.../플밍 관련 자료

[펌] [EJB 기반 프로젝트 수행 가이드] ③

비즈니스 프로세스 구현 최적화하기
김주현 (ERP 개발자)
2004/04/09
① 세션빈에서의 DB 접근전략 및 엔터티빈 사용시 주의사항
② 세션빈에서의 트랜잭션 관리
③ 비즈니스 프로세스 구현 최적화하기
④ 능률 높여주는 유틸리티를 사용하자

이번 강좌에서는 지난번에 언급한대로 Procedure에 대해 이야기해보겠다.

개발자가 SQL문에 대한 지식이 어느정도 있고 그 외 프로그래밍 언어에 대한 경력이 있다고 해서 언제나 강력한 프로그램을 개발하는 것은 아니며, 그 프로그램이 유지보수 및 재활용성이 뛰어난 프로그램이 될지 장담하지도 못한다. 또 EJB 스펙에 대한 지식이 EJB사용 프로젝트의 성패를 좌우하는 것도 아니다.

개발자의 역량과 함께 정확한 업무분석 및 요구사항 분석에 근거해 효율적으로 계산된 설계가 중요한 변수인 것은 굳이 강조하지 않아도 모두 알 것이다.

‘Stored Procedure’의 사용을 개발자 역량이라는 관점에서 이야기해 보자.

타 시스템에서 사용하기도 하는 공통된 기능, 비즈니스 프로세스의 변화 가능성이 작은 기능, 다수개의 테이블에 정보를 등록 및 변경하게 되는 배치 작업 등은 세션빈 메소드 안에서 쿼리 실행을 통해 구현하는 것을 지양하고 Procedure로 처리할 것을 권한다.

Procedure 사용시 얻을 수 있는 장점 중 첫째로 꼽을 수 있는 것은 성능 향상이다. 보통 조회성 프로그램은 1개의 SELECT문을 실행시키는 것으로 제 역할을 다 하겠지만 실제 업무 시스템에는 조회성 프로그램만 존재하는 것이 아니다.

구매처리 및 회계전표발행, 보험금 수납 등 실제 비즈니스 프로세스에서 내부 쿼리를 이용해 조회해와서 VALIDATION 체크를 하기도 하고, INSERT 또는 UPDATE를 여러 개의 테이블에 할 수도 있다.

단일 비즈니스 프로세스, 즉 하나의 트랜잭션에서 처리해야 하는 세분화된 작업이 다수개일 경우, EXECUTE 되는 쿼리도 여러개 일 수 밖에 없다. 이 메소드를 콜하는 REQUEST가 여러 개이면 그만큼 쿼리 실행도 늘어난다.

이에 비해 한번의 실행으로 세분화된 작업을 진행시키는 Procedure를 이용하면 상당한 성능향상 효과를 보게 될 것이다.

Procedure 사용의 두번째 장점은 유지보수가 손쉽다는 것이다.

비즈니스 프로세스 상의 변화나 오류 등으로 인해 Procedure를 고쳐야 할 일이 발생할 때, 해당 Procedure를 고치고 REPLACE 명령으로 DB에 다시 저장시키는 것 만으로 수정이 완료된다.

Procedure가 사용하는 인자의 갯수가 변경되지 않은 경우라면 이를 호출하는 자바클래스 내부 내용은 손 볼 것이 없다. 만약 Procedure로 처리하지 않고 세션빈 메소드 안에서 처리했다면 어떤 일이 뒤따를까.

자바 소스를 변경시키고, 다시 컴파일해 클래스파일을 서버에 업로드 해야한다. 세션빈 메소드 내에서 변경이 있었다면 세션빈클래스를 컴파일한 다음 JAR 파일을 다시 묶어준 후 업로드한다.

하지만 WAS서버의 클래스로더에 이미 적재되어있는 변경 전 클래스를 변경 후의 클래스로 참조하게 하려면 WAS 서버를 재기동시키는 수 밖에 없다. 그런데 시스템 WAS서버를 개발자 마음대로 재기동시킬 수 있을까? 현재 접속한 사용자들이 있으므로 여의치 않은 일이다. 재기동 가능 시점까지 기다릴 수 밖에 없다.

이렇게 자바소스를 변경하는 것과 비교해 보면 Procedure 유지보수가 얼마나 간편한지 알 수 있을 것이다.

세번째 장점은 보안성과 관련된 것이다. 다른 개발자나 유지보수 인력은 해당 비즈니스 프로세스가 Procedure를 콜하는 형태의 세션빈 메소드만 봐서는 메소드내에서 어떤 비즈니스 프로세스가 처리되는지 알 수 없다. DB에 접속해 Procedure 내용을 확인하고 나서야 알 수 있는 것이다. 비즈니스 프로세스가 DB쪽 TIER에 숨겨져 있는 모듈이 보안성이 더 높다고 말할 수 있다.

이제 직접 Procedure를 만들어 사용하도록 하자. 만약 Procedure에 전혀 개발 경험이 없는 사용자라면 이미 자바코딩으로 구현되어있는 모듈을 Procedure로 바꾸어 보는 작업을 해보는 것도 좋을 것이다.

Procedure도 명명규칙이 있다. 각종 펑션이나 Procedure 등 프로젝트의 담당 DBA가 정하는 명명규칙이 있으니, 그것을 참고해서 이름을 정한다.

필자의 경우에는 자바구문으로 데이터를 핸들링 해놓은 메소드를 Procedure로 모두 고치는 작업을 하기도 하고(이러한 경우는 FULL TEST를 반드시 거친후 자바클래스 실행시 결과물과 Procedure의 결과물이 같은지 확인한다), 개발하는 시점부터 Procedure를 도입하여 개발하기도 한다.

아래와 같은 간단한 샘플 Procedure를 보도록 하자.

소스보기

위 Procedure는 자신이 받은 4가지 인자를 갖고 TEST_TABLE_01 테이블의 ROW를 검색 후, UPDATE를 치고 TEST_TABLE_02에 INSERT나 UPDATE를 한다.

보다시피 if then/else 구문을 활용할 수 있다는 것 뿐 아니라, 위의 예시에는 없지만 for 루프 구문도 사용할 수 있는 등 쿼리와 절차적 프로그래밍을 동시에 할 수 있다는 강점이 있다.

다음은 몇가지 유의할 점.

자바 코딩을 하다가 Procedure 코딩을 하게 되면 가끔 주석을 "//"로 표기하는 실수도 하게 되는데(아니라고 알고는 있지만 습관 때문에 손은 그렇게 타이핑을 하고 있다) Procedure 작성시 "//"라는 주석처리는 존재하지 않으며, "/* * /"로 처리해야 한다.

또한, 변수 명 앞에 "v_" 를 붙이는 명명규칙을 가지고 가는 것이 좋다. 자칫 오라클 예약어를 실수로 변수명으로 사용할 경우, 컴파일 및 실행시에 에러가 떨어지지는 않지만 실행결과가 개발자의 의도대로 산출되지 않게 되므로 변수명 앞에 이와 같은 문자를 달아주는 습관을 갖는게 좋다.

이제 위의 샘플 Procedure를 호출하게 되는 흐름이 어디서부터 시작되는지 세션빈 메소드부터 살펴보기로 하자.

소스보기

2회 강좌를 본 사람을 알겠지만, 세션빈 메소드는 UsePcDB라는 이름의 DB래퍼 클래스의 메소드를 호출하는 것으로 임무를 마치고 있다. 그렇다면 UsePcDB 클래스의 usePcMethod 메소드는 어떤 내용일까? 아래 소스를 보자.

소스보기

CallableStatement는 PreparedStatement를 상속받은 인터페이스로써, Procedure를 실행시킬때 사용된다. usePcMethod 메소드의 역할은 PC_TEST라는 이름의 Procedure를 콜하고 실행시키는 것으로 끝난다.

세션빈은 UsePcDB라는 클래스에게 일을 시키고, UsePcDB라는 클래스는 PC_TEST라는 Procedure에게 일을 시킨 셈이다. 실질적인 처리는 모두 PC_TEST Procedure가 하게 되는 것이다.

Procedure를 세션빈에서 사용하게 되는 패턴은 이것으로 대략 소개를 마친다. 한가지 덧붙일 말은 Procedure를 위와 같이 절차적 프로그래밍을 대신하기 위해서만 사용하는 것은 매우 제한적인 활용이라는 점이다. 성능, 보안, 유지보수의 간편함이라는 장점이 있지만, 자바코딩을 대신하는 듯한 절차적 활용에만 머물지 말고 대량의 데이터를 한번에 처리하는 작업에도 활용하는 것이 좋다.

DBMS는 데이터 I/O 시 블럭단위로 처리하고 있으므로, ROW 하나당 작업을 처리하는 Procedure를 1만번 콜하는 식으로 작업을 하는 것은 블럭단위 처리라는 효율적 도구가 있음에도 내버려두고 있는 셈인 것이다. 1만개의 ROW든 100만개의 ROW든 일괄 처리하게 하는 Procedure를 만들어서 활용하는 게 가장 최적화된 처리일 것이다.

감가상각계산등과 같은 비즈니스 프로세스를 예로 들어보자. 각 기업마다 취득중인 모든 자산 물품에 대해 연결산시 감가상각계산을 하게 되는데, 대부분 프로그램에서는 개별 자산번호마다 계산을 끝낸 후 감가상각계산 테이블에 INSERT 하도록 처리를 해놓고 있다.

그러나 감가상각계산이라는 비즈니스 프로세스가 자산번호마다 계산방법이 다른 것이 아니고 정률법 정액법 등 어떠한 계산방법을 취할 것인지, 해당자산이 그 해에 폐기됐는지와 같은 계산할 조건이 다른 것일 뿐, 모든 자산에 대해서 감가상각 계산방법은 동일하다.

각 기업마다 보유하고 있는 물품의 수가 적게는 1000개에서 많게는 만 단위가 넘어가는데, 1건 계산할때 0.5초가 걸린다 해도 자산이 1만건이면 5000초가 소요되는 것이다. 이런 경우에서는 계산의 주체가 세션빈인지, Procedure인지가 문제되는 것이 아니라, for loop 문을 이용하여 건별로 계산시킨다는 것이 문제다. Procedure를 하나 만들어서 감가상각계산할 범위만 인자로 던져준 후, 일괄 처리하도록 해야 한다.

이처럼 DB의 블럭단위 I/O를 일괄처리기법에 활용하는 것이 값비싼 DBMS를 쓰는 진정한 이유라 할 수 있다.

다음 강좌에서는 엔터티빈 없이 진행되는 EJB 프로젝트에서 유용하게 쓰이는 유틸을 소개하도록 하겠다. @