태그 미디어로그 위치로그
'개발자 세상'에 해당되는 글 25건
11월 알티베이스 정기교육 안내
개발자 세상

10월 진행되는 알티베이스 정기 교육 프로그램을 안내합니다.

11월 교육 신청 바로가기

◆ 운영자 과정 (2009. 11. 16(월) ~ 17(화)오전10시 ~ 오후6시)

  • ALTIBASE Hybrid DBMS의 기본 개념 교육
  • ALTIBASE Hybrid DBMS 설치 및 구동, 종료 방법
  • 각종 Utility(iSQL, iLoader, aexport 등.) 사용법
  • ALTIBASE Hybrid DBMS 사용시 Backup 및 Recover 교육
  • ALTIBASE Hybrid DBMS 이중화의 기본 개념 교육
  • ALTIBASE Hybrid DBMS 이중화 구축 및 사용 방법교육

◆ 개발자 과정 (2009. 11. 18(수) ~ 19(목), 오전10시 ~ 오후6시)

  • 기본 응용 프로그램 작성 교육
  • SQLCLI와 Embedded SQL 사용 방법 및 프로그램 작성 교육
  • 기본 표준 SQL 문장과 프로그램 작성 교육
  • PSM 사용법과 프로그램 작성 교육

◆ Performance Tuning 과정 (2009. 11. 20(금), 오전10시 ~ 오후6시)

  • Tuning 개요
  • 진단 방법(Diagnostic Methods)
  • Performance View
  • Explain Plan
  • Query Tuning

11월 교육신청 바로가기

알티베이스의 친절한 DESC 기능
개발자 세상

오늘은 알티베이스 iSQL의 친절한 DESC기능에 대해 간단히 소개하고자 합니다.

http://ukja.tistory.com/258에서 ukja님은 DESC 기능을 튜닝 툴의 범주에 넣는다는 개인적인 견해와 더불어 부족한 DESC기능을 보완하기 위해 작성한 스크립트를 공개했습니다. (덧붙여 소개하자면 ukja님은 세계적인 오라클 전문가입니다. 특히나 블로그를 통해 새로운 이슈를 지속적으로 생산하고, 영문 블로그를 운영하며 영문권 엔지니어와 소통하는 제가 아는 유일한 블로거입니다.)

문득 위의 글을 읽다가 저 글에서 필요로 하는 기능의 일부는 알티베이스에서 이미 제공하고 있는데… 라는 생각이 스쳐 글을 남깁니다.

DESC 명령은 데이블의 정의를 보고자 할 때 주로 사용합니다. 일반적으로 테이블의 정의 자체(칼럼 이름. 타입, 널 여부)만을 제공하는 경우가 많습니다. (타DBMS를 추가로 두 개 정도 확인해보았는데, 큰 차이는 없었습니다.)

하지만 사용자는 테이블에 대한 정보를 알고자 할 때, 테이블 칼럼에 대한 정보와 더불어 인덱스에 대한 정보까지 확인하고자 하는게 일반적이라 생각합니다.

알티베이스는 iSQL의 DESC명령은 칼럼의 이름, 타입, 널 여부와 더불어 테이블이 속한 테이블스페이스 정보와 인덱스 정보 등을 제공합니다.

예를 들어 아래와 같이 T1테이블을 만들고 DESC명령을 이용하여 조회해 보겠습니다.

  1. iSQL> CREATE TABLE T1 (A NUMBER PRIMARY KEY, B CHAR(100), C DATE NOT NULL);  
  2. Create success.  
  3. iSQL> CREATE INDEX T1_IDX_B ON T1(B);  
  4. Create success.  
  5. iSQL> DESC T1;  
  6. [ TABLESPACE : SYS_TBS_MEM_DATA ]  
  7. [ ATTRIBUTE ]  
  8. ------------------------------------------------------------------------------  
  9. NAME                                     TYPE                        IS NULL  
  10. ------------------------------------------------------------------------------  
  11. A                                        FLOAT           FIXED       NOT NULL  
  12. B                                        CHAR(100)       FIXED  
  13. C                                        DATE            FIXED       NOT NULL  
  14. INDEX ]  
  15. ------------------------------------------------------------------------------  
  16. NAME                                     TYPE     IS UNIQUE     COLUMN  
  17. ------------------------------------------------------------------------------  
  18. __SYS_IDX_ID_106                         BTREE    UNIQUE        A ASC  
  19. T1_IDX_B                                 BTREE                  B ASC  
  20. PRIMARY KEY ]  
  21. ------------------------------------------------------------------------------  
  22. A  

제일 상단을 보시면, 테이블스페이스로 SYS_TBS_MEM_DATA라는 메모리 테이블 스페이스를 사용한다는 것을 표시해주고 있습니다. 알티베이스는 메모리 테이블과 디스크 테이블 기능을 동시에 제공하는 하이브리드 DBMS이므로 DESC명령으로 테이블이 속한 테이블스페이스를 표시해주는 기능은 매우 유용합니다.

계속 보시면, 기본적으로 T1 테이블에 NOT NULL 속성인 A 칼럼과 C 칼럼의 정보가 표시되고, 더불어 PRIMARY KEY가 A칼럼에 걸려있음이 표시됩니다. 또한 인덱스 정보에 생성한 T1_IDX_B라는 인덱스와 더불어 PRIMARY KEY를 위해 자동 생성된 __SYS_IDX_ID_106이라는 인덱스 역시 표시됨을 확인 할 수 있습니다.

위에서 보시는 바와 같이 알티베이스의 DESC 명령은 단순히 타 DBMS가 테이블의 칼럼 이름과 타입 등을 표시하는 것에 비해 인덱스 정보를 비롯한 추가의 정보를 편리하게 제공하고 있답니다. ^^

iSQL에서 로우를 세로로 출력 (SET VERTICAL ON)
개발자 세상

딕셔너리 테이블 조회나 퍼포먼스 뷰와 같이 칼럼은 많은데, 막상 확인할 레코드의 수는 적은 경우, 라인 사이즈 제약으로 줄바꿈이 일어나 보기 어려워지는 상황이 발생합니다.
(SET LINESIZE ???;) 구문으로 어느정도 해소할 수는 있지만 칼럼이 정말 많으면
이것도 해결책이 될 수 없습니다.

이를 효과적으로 해결해주는 iSQL구문이 있어 소개합니다.
제 뒤에 뒤에 계신 손연구원님께서 버그로 추가하신 기능이지만 그 편리함은 매우 큽니다.
몇달 전에 이 기능을 처음 알고, 너무 편리하고 좋다고 설레발을 쳤는데,
막상 손연구원님은 시크하게 반응하셨지만, 다시 생각해도 이 기능을 참으로 유용합니다.

제가 알기로 O사에서는 이러한 출력을 위해 사용자 정의 procedure등을 정의하는데,
막상 사용해보면 그리 편리하지 않습니다. ( http://asktom.oracle.com/tkyte/print_table/ 참고 )

반면 알티베이스 iSQL의 방식은 훨씬 간단하고 편리합니다.
참고로 이 기능은 5.3.1 릴리즈에 포함되어 있는 기능입니다.

간단한 예제를 보여드리겠습니다.
아래와 같이 V$DATATYPE에 INTEGER의 정보를 조회합니다.
예상하시겠지만 마구 줄바꿈이 일어나서 볼 수 없는 지경입니다.

  1. iSQL> SET VERTICAL OFF;  
  2. iSQL> SELECT *  
  3.     2   FROM V$DATATYPE  
  4.     3  WHERE TYPE_NAME = 'INTEGER';  
  5. TYPE_NAME                                 DATA_TYPE   ODBC_DATA_TYPE  
  6. -------------------------------------------------------------------------  
  7. COLUMN_SIZE LITERAL_PREFIX  LITERAL_SUFFIX  CREATE_PARAM  
  8. -----------------------------------------------------------------------  
  9. NULLABLE    CASE_SENSITIVE SEARCHABLE  UNSIGNED_ATTRIBUTE FIXED_PREC_SCALE  
  10. ---------------------------------------------------------------------------------  
  11. AUTO_UNIQUE_VALUE LOCAL_TYPE_NAME                           MINIMUM_SCALE  
  12. ------------------------------------------------------------------------------  
  13. MAXIMUM_SCALE SQL_DATA_TYPE SQL_DATETIME_SUB NUM_PREC_RADIX INTERVAL_PRECISION  
  14. -------------------------------------------------------------------------------------  
  15. INTEGER                                   4           4  
  16. 10  
  17. 1           0           2           0           0  
  18.             INTEGER  
  19.             4                       10  
  20. 1 row selected.  

정말 난감하죠?
하지만 아래와 같이 SET VERTICAL ON;을 구문을 활용하면 훨씬 편하게 볼 수 있습니다.

  1. iSQL> SET VERTICAL ON;  
  2. iSQL> SELECT *  
  3.     2   FROM V$DATATYPE  
  4.     3  WHERE TYPE_NAME = 'INTEGER';  
  5. TYPE_NAME          : INTEGER  
  6. DATA_TYPE          : 4  
  7. ODBC_DATA_TYPE     : 4  
  8. COLUMN_SIZE        : 10  
  9. LITERAL_PREFIX     :  
  10. LITERAL_SUFFIX     :  
  11. CREATE_PARAM       :  
  12. NULLABLE           : 1  
  13. CASE_SENSITIVE     : 0  
  14. SEARCHABLE         : 2  
  15. UNSIGNED_ATTRIBUTE : 0  
  16. FIXED_PREC_SCALE   : 0  
  17. AUTO_UNIQUE_VALUE  :  
  18. LOCAL_TYPE_NAME    : INTEGER  
  19. MINIMUM_SCALE      :  
  20. MAXIMUM_SCALE      :  
  21. SQL_DATA_TYPE      : 4  
  22. SQL_DATETIME_SUB   :  
  23. NUM_PREC_RADIX     : 10  
  24. INTERVAL_PRECISION :               
  25.   
  26. 1 row selected.  

자 어떤가요? ^^;
이 기능을 모르고 계셨다면, 앞으로 유용하게 사용하시기 바랍니다.

알티베이스 8월 정기교육 안내입니다
개발자 세상

8월 진행되는 정기 교육 프로그램을 안내합니다.

<ALTIBASE Hybrid DBMS의 기본 개념 교육 등>

  • 교육일자 : 2009. 08. 17(월) ~ 18일(화)
  • 교육시간 : 오전10시 ~ 오후6시
  • 교육강사 : 송기보 전임
  • 교육과정 : ▲ ALTIBASE Hybrid DBMS의 기본 개념 교육 ▲ALTIBASE Hybrid DBMS 설치 및 구동, 종료 방법 ▲각종 Utility(iSQL, iLoader, aexport 등.) 사용법 ▲ ALTIBASE Hybrid DBMS 사용시 Backup 및 Recover 교육 ▲ ALTIBASE Hybrid DBMS 이중화의 기본 개념 교육 ▲ ALTIBASE Hybrid DBMS 이중화 구축 및 사용 방법교육

<기본 응용 프로그램 작성 교육등>

  • 교육일자 : 2009. 08. 19(수) ~ 20(목)
  • 교육시간 : 오전10시 ~ 오후6시
  • 교육강사 : 박호진 책임
  • 교육과정 : ▲ 기본 응용 프로그램 작성 교육 ▲ SQLCLI와 Embedded SQL 사용 방법 및 프로그램 작성 교육 ▲ 기본 표준 SQL 문장과 프로그램 작성 교육 ▲ PSM 사용법과 프로그램 작성 교육

<Tuning 개요등>

  • 교육일자 : 2009. 08. 21(금)
  • 교육시간 : 오전10시 ~ 오후6시
  • 교육강사 : 심상범 책임
  • 교육과정 : ▲ Tuning 개요 ▲ 진단 방법(Diagnostic Methods) ▲ Performance View ▲ Explain Plan ▲ Query Tuning

[안내]

  • 교육신청 : 온라인 신청
  • 교육문의 : 02-2082-1152, education@altibase.com
  • 교육장소 : 알티베이스 교육센터
  • 교육시간 : 오전 10시 ~ 오후 6시
  • 본 알티베이스 교육은 무료이며, 점심식사 및 교육 교재를 제공해 드리고 있습니다.


알티베이스 7월 정기교육 안내
개발자 세상

7월 진행되는 정기 교육 프로그램을 안내합니다.

  • 교육일자 : 2009.07.21(화)~ 2009.07.22(수)
  • 교육시간 : 오전10시 ~ 오후6시
  • 교육강사 : 미정
  • 교육과정 : ▲ Altibase 4 Architecture ▲백업 및 복구 ▲ Altibase 이중화 구축 / 특징 / 사용방법
  • 교육일자 : 2009.07.23(목) ~ 2009.07.24(금)
  • 교육시간 : 오전10시 ~ 오후6시
  • 교육강사 : 미정
  • 교육과정 : ▲ Altibase SQL(Structured Query Language) ▲Altibase PSM(Persistent Stored Module) ▲Altibase Programming

[안내]

  • 교육신청 : 온라인 신청
  • 교육문의 : 02-2082-1152, education@altibase.com
  • 교육장소 : 알티베이스 교육센터
  • 교육시간 : 오전 10시 ~ 오후 6시
  • 본 알티베이스 교육은 무료이며, 점심식사 및 교육 교재를 제공해 드리고 있습니다.


알티베이스 6월 정기교육 안내합니다
개발자 세상

6월에 진행되는 알티베이스 교육 일정입니다. 참고하세요.

♦ 강좌 : 실습으로 배우는 Unix /Hybrid DBMS의 이해와 활용/DTV를 위한 IPTV의 기술과 활용/홈네트웍크실무/Router & Switch 이론 및 실습

  • 교육 일자 : 2009. 6. 08 ~2009. 6. 13(6월 정기강좌) / 2009. 6. 22 ~2009. 6. 27(6월 특별강좌)
  • 교육 시간 : 오전 9시 ~ 오후 5시50분
  • 교육 대상 : 중소기업 고용보험 가입 재직근로자(교육비/교재비 전액 무료, 중식 제공)
  • 교육인원 : 강좌별 20명
  • 교육 장소 : 신흥대학 실습관 1층(지하철 1호선 망월사-신흥대학역 3번출구)
  • 문의 : 알티베이스(02-2082-1152), 신흥대학(031-870-3192~4)

♦ 강좌 : ALTIBASE 4 Architecture / 백업 및 복구 / ALTIBASE 이중화 구축, 특징, 사용방법

  • 교육일자 : 2009.6.16(화) ~ 2009.6.17(수)
  • 교육시간 : 오전 10시 ~ 오후 6시
  • 교육 강사 : 송기보 전임 컨설턴트

♦ 강좌 : ALTIBASE SQL(Structured Query Language) / ALTIBASE PSM(Persistent Stored Module) / ALTIBASE Programming

  • 교육일자 : 2009.6.18(목) ~ 2009.6.19(금)
  • 교육시간 : 오전 10시 ~ 오후 6시
  • 교육강사 : 박효진 책임 컨설턴트

알티베이스 교육은 온라인으로 신청하실 수 있습니다 => 온라인 신청하기
기타 문의는 : 02-2082-1152, education@altibase.com

Subversion 커밋 로그 변경하기 (svn hook)
개발자 세상

안녕하세요? phlow입니다.

소프트웨어 버전 관리 도구로 subversion을 많이 사용하시죠?혹시 커밋 후에 아차하고 커밋 로그를 수정하고 싶은 생각이 드셨던 적은 없나요?

이미 커밋 해버렸는데… 작장불입?

아닙니다. 방법이 있습니다!

서실 저는 subversion의 다양한 기능을 활용할 일이 별로 없는데,

윈도우즈에서 작업하는 경우에는 svn 클라이언트로 TortoiseSVN을 사용합니다. (한번 사용해보시길 강력 추천합니다.)

덕분에 최근에 커밋 로그를 수정할 수 있는 방법을 알게 되어 공유하려 합니다.

http://svnbook.red-bean.com/en/1.0/ch05s02.html 에 모든 내용이 있습니다.

커밋 로그 뿐 아니라 다른 정보도 수정 가능합니다.

일단 커밋 로그를 수정할 수 있도록 하는 간단한 예제만 적어보겠습니다.

Repository 설정

일단 repository에서 커밋 로그를 수정할 수 있도록 hook파일을 설정해야 합니다.

Repository의 ‘hooks’ 디렉토리로 갑니다.

커밋 로그 수정과 관련된 파일은 ‘pre-revprop-change’ 이라는 파일인데,

이미 존재할 수도 있고 ‘pre-revprop-change.tmpl’이라는 예제(템플릿?)가 있을 수 있습니다). 없으면 생성해야 합니다.

훅을 위한 언어가 정해져 있는 것은 아닙니다. 아래에 있던 예제는 쉘스크립트로 작성되어 있습니다.

훅 파일은 아래와 같이 설정합니다.

디렉토리에 파일이 잘 설정되었다 하더라도 실행권한이 없으면 훅이 동작하지 않습니다.

따라서 ‘pre-revprop-change’ 파일에 실행권한을 줍니다.

  1. #!/bin/sh  
  2. # PRE-REVPROP-CHANGE HOOK  
  3.   
  4. REPOS="$1"  
  5. REV="$2"  
  6. USER="$3"  
  7. PROPNAME="$4"  
  8. ACTION="$5"  
  9.   
  10. if [ "$ACTION" = "M" -a "$PROPNAME" = "svn:log" ]; then exit 0; fi  
  11.   
  12. echo "Changing revision properties other than svn:log is prohibited" > &2  
  13. exit 1  

위의 파일을 보시면 알겠지만,

위의 훅은 기본적인 것이고, 사용자 별로 커밋 로그 수정을 제한하거나 이외의 다른 작업도 스크립트를 적절히 작성하면, 충분히 설정이 가능합니다.

http://svn.collab.net/repos/svn/trunk/tools/hook-scripts/
http://svn.collab.net/repos/svn/trunk/contrib/hook-scripts/

위의 주소에 더 많은 훅 예제가 있다고 하는군요. 관심있으신분 참고하세요.

클라이언트에서 커밋 로그 수정

위의 설정이 잘되어 있다면 아래의 명령어로 간단하게 커밋 로그를 수정할 수 있습니다.
svn propset --revprop -r [리비전번호] svn:log “수정할 메세지”

뒤숭숭한 뉴스가 많군요. 그래도 평온하고 차분한 한주 보내시길 바랍니다.

[파트너 소식]Orange for ALTIBASE 2009 Official Release
개발자 세상

a삐롱사립니다..

방명록에 다음과 같은 글이 작성돼 있더라구요..
알티베이스 사용자라면 인지하고 있음 좋을 뉴스일 것 같아.. 제가 다시 포스팅합니다..
단, 저희가 작성해서 올린 글은 아니구요.. 궁금하신 사항에 문의해 주셔도 직접적인 답변 곤란하다는 건 감안해 주셔요~~~

벌써 퇴근시간이네요..
즐퇴하셔요..

Orange for Altibase 2009 Official Release
(Stadard Edtion / DBA Edition)

1,200개 기업 Oracle 사용자에게 익숙한 Orange for Oracle을 개발공급한 WareValley사에서 Altibase를 위한 DB 개발 및 관리 툴인 Orange for Altibase 2009를 출시하였습니다.

Orange for Altibase 2009에는 다음과 같은 Sub Tool Set을 포함한 다양한 기능이 탑재되어 있습니다.

Schema Browser / SQL Tool / SQL Monitor / Transaction Monitor / Session Monitor / Lock Monitor / Wait Event Monitor / Performance Monitor / Security Manager / Space Manager / Export Tool / Import Tool / Table Editor

트라이얼 은 최초 설치 후 3개월 사용가능합니다.
트라이얼 다운로드 위치:

bkim@warevalley.com
Kenny B. Kim
http://www.warevalley.com

개발의 기수: R0의 하루…
개발자 세상

이번 글이 개발의 기수 몇 탄 째더라…흠…

막상 글을 쓰려하니 예전에 만들어 놓은 멋진 ‘개발의 기수’ 카테고리는 어디가고

개발 스토리라는 딱딱해보이는 게시판이 떵그렁 있다.

예전 글은 하나도 없고…

나름 열심히 쓴 글인데…

궁시렁…궁시렁…

지난 3월.

본인은 개발 본부내 임시 조직인 R0팀 업무를 한달동안 했었다.

지금은 프로젝트를 새롭게 시작해서 이렇게 글 쓸 여력도 되지만,

그때 당시엔 하루하루가 정신없고 피곤하고 알티베이스 일은 죄다 혼자 다하는 것 처럼 설쳐댔었다.

R0 팀이란, 고객을 지원하는 지원 본부를 지원하는 개발 본부내 임시 조직 쯤 된다.

한마디로 ‘실시간’ 유지보수 팀이라 할 수 있다.

디비가 실시간 디비라 그런지 유지보수도 실시간인가보다-_-

한국 사람들은 참 빠른걸 좋아한다.

오늘은 R0하면서 있었던 몇가지 에피소드를 소개해보련다.

R0 팀 업무 수행하는 느낌을 살리기 위해 여러 case들이 순서 없이 context-switching할 것이다.

읽는데 좀 정신이 없겠지만, 실제 업무에 비하면 이건 맛보기에 불과하다는 사실!!

자, 레츠고~~

case-1
알티베이스에서는 CREATE TABLE TB (A NUMBER)라고 한 후, DESC TB했을 때

A 컬럼의 타입이 FLOAT라고 표시되는데

어떤 고객이 자기네들이 만든 자동화 툴이 DESC를 조회해서 스키마를 구분하는데

이것 때문에 프로그램이 동작하지 않는단다.

NUMBER로 만들었으니 표시도 NUMBER로 해야하는게 아닌가??

뭐 따지고 보면 그렇긴하지…

case-2
“프로시저 디버깅하기 너무 힘들어요~~”

우리 고객지원본부팀원께서 이런 불평과 함께 프로시저가 너무 길면

에러 라인이 표시 안된다는 버그를 리포팅하셨다.

가령
create or replace procedure proc1(msg in char(100))
as
k number;
begin
if k > 0 then
k = msg;
end if;
end;
/

line 6: parse error
K = msg;

^
처럼 에러 라인이 표시되는데

create or replace procedure proc1(msg in char(100))
as
k number;
begin
system_.println(’aa’);
system_.println(’aa’);
system_.println(’aa’);
system_.println(’aa’);
…(수십 라인 반복)
if k > 0 then
k = msg;
end if;
end;
/

[ERR-31001 : SQL syntax error ]

처럼 프로시저가 길면 에러 라인이 표시가 안된다는 거다.

실제로 고객사에서는 수천라인이 넘는 프로시저도 만들더라-_-

왠만한 큰 프로그램도 분석하는데 별로 부담이 없는 나이지만…

프로시저 수천 라인은….GG이시다.

case-3
4.3.9에서 잘 쓰던 애플리케이션이 5.1.5로 업그레이드하니 안되요!!

5.1.1에서도 잘 됐었는데…왜 안되죠?

SQLProcedureColumns()라는 ODBC 함수의 동작에 대한 문제였다.

결과로 리턴되는 row들의 순서가 예전과 달라서 고객 애플리케이션이 제대로 동작이 안된다는 것이다.

고객도 나름 불만이었지만 우리 고객 지원 부서에서 더 큰 불만인 듯 했다.

case-1
우린 NUMBER라는 타입이 없다.

생성시 NUMBER타입의 컬럼들은 모두 FLOAT이거나 NUMERIC으로 변경되서 메타에 저장된다.

그러니 DESC를 하면 FLOAT 또는 NUMERIC(10) 등으로 표시된다.

고객님: 왜 그러냐? NUMBER로 생성했으니 NUMBER로 나와야 하지 않느냐???
O사도 그렇다! 바꿔라…

어쩌지…

NUMBER라는 타입의 실체를 만들어야하나?

이거 작업 큰데…

case-3

버그 리포트와 스펙 자료들을 찾아보니,

과거엔 결과 row들을 column_name, column_position 순으로 정렬했지만,

최신 버전엔 column_name, column_type 순으로 정렬하고 있었다.

최신 버전의 정렬은 스펙에 근거한 것이었다.

“아~ 그거 찾아보니 5.1.5에서 표준 스펙에 맞게 바꾼거에요~ 5.1.5가 표준에 맞아요.”

지원본부: “표준은 고객에게 안통합니다. O제품이나 S제품은 우리 예전 버전이랑 똑같아요~
이렇게 함부로 바꾸면 어떡합니까??”

어떡하지? 다시 예전으로 복구하느냐 스펙을 고수하느냐…

패치 레벨 업그레이드시엔 인터페이스는 바꾸지 말았어야 하는건데…

case-4
어느날, 새벽에 한 증권 고객사에서 메시징 시스템 실장비에 대대적인 버전업 패치가 있었다.

무려 30대에 15식에 대해 4.3.7에서 4.3.9로 버전업 작업이 진행되었었는데

아침에 실서비스를 해야하기 때문에 새벽내로 패치가 완료되야 하는 긴박한 상황이었다.

드디어 데이터 마이그레이션을 무사히 마치고 애플리케이션을 새 버전에 맞게 다시 빌드하고

애플리케이션을 구동하는 순간…

죄다 insert 구문들이 실패한다는 거다.

실장비이니만큼 최우선 처리를 요구했다.

나는 아침부터 오자마자 다른 케이스들을 제쳐두고 요걸 분석해야 했다.

분석하자~~

case-2
에러 메시지를 자세히 보라.
K = msg;

^

^는 에러가 난 위치를 나타낸다.

그렇다면 ^위의 공백들은 뭐지?

탐정 영화에서 빈 종이는 분명 그냥 빈종이가 아니듯이

이 공백도 빈 공백이 아니었던 것이다!

마우스로 긁어보라!! (실제 웹에선 공백이 안모임ㅠ:저자주;;)

신비하게 어떤 글자가 나타…….나진 않지만;;

분명 공백들의 길이는 큰 힌트를 주었다!

모양이 프로시저 텍스트 모양과 일치하지 않는가!

요거…공백이 뭔 비밀을 가지고 있는듯….

case-4

작업 환경을 세팅하기 위해 고객사와 동일 버전을 내려받고 디버깅 모드로 컴파일 시킨다.

‘공간 부족 에러…’

에효…이노무 장비는 또 disk full이다.

메일 공지를 날려 disk 공간을 확보했더니 이젠 java_home 문제로 컴파일 에러가 난다.

OS 재설치로 뭔가 환경이 달라져서인가보다.

바쁠 때 이런 예외 상황이 발생하면 짜증 지수가 오르기 시작한다ㅠ

분석…분석…

시간은 째깍째깍…

long타입 변수를 numeric(10)에 바인딩했는데…

왜 overflow 에러가 날까…왜왜왜~~(디버깅하다보면 모니터와 가장 많이 하는 대화가  ‘왜’이지 싶다-_-)

거기다 실제 long 변수에는 100이 할당되어 있다.

겨우 100이자나…왜 이게 오바냐고…안들어가는 니가 더 오바야!!

좀 들어가주면…안되겠니??ㅠㅠ

case-5

이번달은 바빠서 부르지 마라했거늘…친구들이 한잔 하자고 결국 불러냈다.

모듬전에 소주가 나와 한잔 기울이려는데….전화가 온다.

“WAS에서 자꾸 JDBC에러가 나요. 왜죠?왜죠?왜죠?”

‘저…R0하면서 오늘 처음 7시에 퇴근했는데…이제막 모듬전이 나왔는데…ㅠㅠ’

case-3
어라..찾아보니 O 제품은 전혀 딴 판의 방식인데요?

M사와 I사만이 함수 스펙을 명시하고 있고 다른 제품들은 아예 함수 스펙 자체도 없어요.

표준 ODBC 스펙을 따랐을 리가 만무하죠!

우리가 맞다고 우깁시다!!

내 주장은 이랬다.

“고객이 애플리케이션을 바꿔보겠답니다.”

오예~

case-5
술잔과 모듬전을 마다하고 달려갔다.

WAS, 제우스 모두 에러난댄다.

얘네들은 뭔 쿼리를 날리길래 자꾸 에러나나…

살펴보니 디비가 죽었나 살았나 확인하기 위해 “SELECT * FROM DUAL”을 주기적으로 날린댄다.

헉..이런 간단한 쿼리가 왜 에러나지??

case-2
분석분석…

푸하하하~~~

와…이거 진짜 대박 버그다.

문제의 원인을 발견하고 난 진짜 크게 웃어버렸다.

아~~주 사소한 변수 하나를 잘못써서 ^를 찍기전까지 프로시저 길이만큼 공백을 찍고 있었던 것이다.

더 대박이었던 건…

무려 이 버그가 6년넘게 살아있었다는 사실…

내가 입사이후로 아마 최장수 버그가 아니었나 생각된다.

아무도 저 공백을 눈여겨보지도 않았고 더우기 버그라는 생각은 전혀 못했다는 상황이 너무 우스웠다.

하나 깔끔하게 해결…

이 버그의 압권은 지원본부 임옥섭님께서 마우스로 긁어서 큰 힌트를 주셨다는 것.

case-3
“고객이 로직을 하나 바꿔보니 온통 에러가 난답니다. 바꿀 분량도 너무 많아

도저히 못바꾸겠대요~”

에효…어쩌나…

다시 빠꾸해야하나…

논의 끝에 SQLProcedureColumns2() 따위의 함수를 제공해주자는 의견이 나왔다.

column_name, column_position으로 정렬하도록 하는 비표준 함수인 것이다.

뭐 그런거라면..얼마든지…

이렇게 해서 SQLProcedureColumnsOrderByPos()라는 길고 긴 이름의 함수가 탄생되었다….

이 함수는 이 고객덕에 앞으로 평생을 함께 해야할 운명이 되어버렸다.

case-1
그러는중 지원 본부 이창훈님이 카운터 펀치 한방을 고객에게 날리셨다!

O사는 모조리 NUMBER 타입으로 나오는데요???

그렇다.

O사는 FLOAT로 만들던 NUMERIC으로 만들던 DESC해보면 죄다 NUMBER로 표시되는 것이었다.

뭐야 이게…

우리보다 더 심하잖아!!

그랬더니 고객님 왈…

“O사처럼 해주세요…”

그래도 O사처럼 해달란다.

허허…

case-5
저 간단한 select 구문이 PreparedStatement.execute()라는 메소드로 실행된게 문제였다.

우리의 JDBC는 execute()를 실행하면 execute protocol만 수행하고 fetch protocol은 수행하지 않는다.

효율을 위해…

따라서 execute하고 ResultSet을 얻지 않고 다시 execute()를 수행하면 에러가 발생하는 것이다.

그래..죽었나 살았나 알아보는데 굳이 결과는 필요없지…

근데 왜 executeQuery()를 놔두고 execute()를 수행하느냐 말이다. ㅠ

WAS를 고칠 수는 없댄다.

어떻게 해서든 우리 제품을 수정할 수 밖에…

쳇…

우리 플랫폼 개발자 맞아요?

우기면 될 일이지만 우린…..힘이 없다 ㅠ

어쨌든 간단한 수정으로 해결…

다시 술자리로 고고~

case-4

점심이 지났다.

지원본부에선 자꾸 재촉의 전화가 온다.

지원본부 팀장님까지 불려가시고 고객의 불만이 하늘을 찌른대나…

근데 이노무 디버거 또 죽네..급해죽겠는데

독일놈들 싸잡아 때려주고 싶다.

이렇게 버그 많고 잘죽는데…그 치밀하다는 독일애들도 어쩔 수 없나보다.

뭐 공짜니 군말없이 써야지…ㅠ

내 시간나면 꼭 이클립스 깔아서 써야지..이노무 DDD… 품질도 D감이다.

오늘 난 투덜이 스머프가 됐다 ㅠ

분석분석…
어라!!

클라이언트가 32비트 컴파일 환경이라 long이 4바이트일텐데…왜 8바이트로 바인딩 되었지?

결정적인 힌트를 찾았다.

8바이트의 단서를 가지고 범인을 추적했다.

덜컹…

sesc가 범인이었다.

sesc는 우리 클라이언트 패키지에 포함된 전처리 컴파일러인데

32비트 클라이언트 환경에 sesc가 64비트로 빌드되었던 것이다.

이..이거…누가 설치를 잘못했나본대요?

64비트 서버 패키지와 32비트 클라이언트 패키지를 섞어서 설치한 것 같습니다.

두둥…다행히 제품의 문제는 아니었고, 설치 지원시 실수가 있었던 것이었다.

사건 종료…

case-1
같은 IT 업종인 친구가 얘기했다.

자기도 언젠가는 플랫폼 개발해보고 싶다고…

(여기서 언젠가는 이란말은 돈이 넉넉하게 벌렸을 때를 말한다.

고로 플랫폼 개발이 돈이 될 거라는 가정은 아예 배제하고 있다…요놈…-_-)

플랫폼 개발…

많은 프로그래머들이 개발할 수 있는 환경을 만들고,

기반이 되는 시스템이자 표준을 구현하는 멋진 작업이다.

그런줄 알았다.

근데 오늘도 고객의 엉뚱한 요구는 면접시험때 나온 문제를 또 한번 떠올리게 했다.

“Custom” is always true.

속으로 그랬다.

‘실장님…면접 시험 이제 바꿀 때도 되지 않았나요?’

플랫폼 개발은 표준을 정하는것이 어려운게 결코 아니다.

후발주자로서 선발주자의 악덕 인터페이스까지 자존심을 구기며 제공해야 하는 그런 지저분한 일이 힘든 것이다.

버뜨…이번 경우엔 못해주겠다고 못박았다.

우린 o사와 숫자 타입 체계가 전혀 다르기 때문에 이런것까지 따라할 수는 없는 노릇이었다.

하루에도 동시에 수많은 case들이 올라오고 정신없이 작업 전환을 하면서 처리하느라면

내가 그동안 참 편한 프로젝트 개발을 하고 있었구나 생각되었다.

이렇게 앞에서 막아주던 과거의 R0팀들 너무 고생이 많았구나…

더우기 우리가 개발을 편하게 할 수 있기까지 지원본부에서 밤샘 고생을 정말 너무 많이들 하고 계시는구나…

등등 느낀게 많았다.

밤 9시가 넘어서면 비로소 사무실은 조용해지고 해결하기 힘들어 묵혀두었던 case들을 끄집어 내서 분석해본다.

해결하고 싶은 마음이야 굴뚝같지만…

집중력은 이내 바닥나서 지친 몸을 이끌고 퇴근해야만 했다.

그러기를 30일…

case들을 미쳐 다 처리하지 못하고 다음 R0팀에게 넘기게 되어 미안할 따름었다.

유지보수 일을 두루 해보게 되면 우리 제품의 전체적인 품질 수준을 느껴보게 된다.

그 느낌은 프로젝트 수행 때 고스란히 긍정적인 역할을 하게 된다.

프로젝트 개발과 유지보수 일은 그래서 번갈아가며 해볼 만 하다.

문제는 그 주기를 얼마에 두느냐인데

개발본부 내에서 그에 대해 많은 고민을 하고 있다.

어쨌든…

꽃피는 4월이 어느덧 왔는데

오늘도 수고하시는 r0팀원들에게 화이팅을 불어넣어 주고 싶다.

쓰고보니 참 주절주절 말이 많았다.

이런 긴글을 누가 읽을까…ㅠ

사실 오늘 쓰고 싶었던 글은

‘일반화’에 대한 코딩 철학을 쓰고 싶었는데…

큐에 미리 들어가 있었던 r0 글을 이렇게 먼저 올린다.

다음엔 일반화에 대해 끄적여 볼랜다.

공공정보화 사업 대기업 참여제한제 실시
개발자 세상

4월1일부터 매출 8천억원 이상의 대기업은 프로젝트 규모가 40억원 이상되는 공공정보화 사업에는 참여가 제한됩니다. 매출 8천억원 이상이면 삼성SDS, LGCNS, SKC&C가 해당됩니다.

능력있는 중견, 중소기업에게 더 기회를 주겠다는 정책이죠. 공공정보화 사업에 SW는 분리해서 발주하는 SW분리발주 정책과 함께 소프트웨어 산업 살리기의 일환이라는 군요.

늘 그렇지만 제도 자체보다는 그 제도를 엄격히 적용하려는 실행의지가 더 중요하겠죠. 벌써부터 제도의 실효성에 대한 의문을 제기하는 목소리도 있습니다.


또 컨설팅 사업으로 분류된 정보화전략계획(ISP)은 제한이 없고 ISP 사업자가 본 사업을 수주할 수 없도록 하는 방안도 확정되지 않아 실제 제도의 파급력은 크지 않을 것이란 분석이다. 또 시범사업도 예외 규정을 적용받아 주요 시범사업의 경우 대기업이 주사업자로 참여하고 전문 중소기업들이 컨소시엄이나 하도급으로 참여하는 형태가 유지될 전망이다.

한 중소기업 관계자는 “대기업 참여 하한제는 중견ㆍ중소기업들이 기존에 강점을 가진 시장에서 좀 더 기회를 포착할 수 있는 전환점이 될 수 있지만 이를 새로운 `기회’로 해석하는 것은 무리”라며 “중소기업보다 중견 IT서비스 기업들의 숨통을 터주는 제도가 되지 않겠느냐”고 전망했다. <디지털타임스>

아무튼 중소규모의 기업이 대부분인 소프트웨어 업계에 기회가 됐으면 하는 바람입니다.

참고 : SW진흥원, 달라진 SW제도 빠르게 안착시킨다