CGLIB를 이용한 프록시 객체 사용하기
1. 소스 다운 로드
- cglib-2.1_3.jar - ASM 모듈을 필요로 하는 버전
- cglib-nodep-2.1_3.jar - ASM 모듈이 포함되어 있는 버전
2. CGLIB를 사용하여 프록시를 생성할 때에는 크게 크게 두가지 작업을 필요함
- net.sf.cglib.proxy.Enhancer 클래스를 사용하여 원하는 프록시 객체 들고
- net.sf.cglib.proxy.Callback을 사용하여 프록시 객체 조작 등 두가지 방법으로 프록시 생성함
3. MethodInterceptor를 사용하여 프록시 객체 처리
- CGLIB가 제공하는 Callback 중 가장 많이 사용되는 것은 net.sf.cglib.proxy.MethodInterceptor임
- Enhancer.setCallback()을 통해서 MethodInterceptor를 지정하면, 프록시의 메소드를 호출할 때 마다 MethodInterceptor.intercept() 메소드가 호출되고 MethodInterceptor는 프록시와 원본 객체 사이에 위치하여 메소드 호출을 조작할 수 있도록 해 줌
*. 샘플 소스
*. 실행결과
- public void MyClass.method()
- MyClass.method()
- public void MyClass.method2()
- MyClass.method2()
4. CallbackFilter를 사용하여 알맞은 Callback 실행
여러개의 Callback 중에서 상황에 따라서 원하는 Callback을 사용하고 싶은 경우 net.sf.cglib.proxy.CallbackFilter 인터페이스를 사용함
* 샘플소스
*. 실행 결과
- public void MyClass.method()
- MyClass.method()
- MyClass.method2()
5. Mixin
Proxy & Interceptor
*. 샘플 소스
*. 실행 결과
- MyInterfaceAImpl.methodA()
- MyInterfaceBImpl.methodB()
연말, 사랑을 전하세요.
1. 구세군 자선 남비
- 지하철이나 주요 시내에 빨간 모양의 자선 남비가 있지요.
- 휴대폰, 티머니 교통카드로도 가능
2. 태안 돕기
- 미디어다음 '희망모금', 파란 '태안 살리기-응원 메시지 남기기', G마켓 '클릭으로 만드는 100원의 기적'
- ARS(060-700-1004)
3. 인터넷 기업의 나눔의 장
- 야후! 나누리, 네이버 해피빈, 다음 '희망모금'
4. 그밖에 다양한 불우 이웃 돕기
- 사랑의 재단(www.4rangg.org)은 장애우·소년소녀가장·독거노인 등 다양한 기금 형태가 준비되어 있음
- 아름다운 가게(www.beautifulstore.org)를 통해 안쓰는 재활용 물품들을 기증받음
- 한국해비타트(www.habitat.co.kr)를 통해 사랑의 집짓기 운동
- 사랑나눔회(www.sarangnanum.org)에서는 ‘엄마의 도시락’ 사업
- 100원의 기적(www.100won.org)

Top 10 Eclipse Plugin들
- Sysdeo Eclipse Tomcat Launcher
- Lomboz
- MyEclipse Enterprise Workbench
- XMLBuddy
- SWT/Swing Designer
- UML2
- EclipseVisualEditor
- EclipseHTMLEditor
- SQLExplorer
- Hibernate Synchronizer
Top 7가지의 웹사이트 에러들
아래의 자료는 Pingdom이라는 사이트에서 웹 서버를 모니터한 1억 6천만건의 데이터를 가지고 통계를 만들었다고 합니다.

- 62.14% - Unable to connect to server
웹서버로의 커넥션 시도했을 때 타임아웃 나는 현상을 말합니다.
사유: 네트워크나 방화벽의 문제로, 웹 서버의 임계치 이상의 트래픽 수용으로, 웹 서버의 다운으로 이런 현상이 발생합니다. - 9.71% - DNS lookup problem
DNS를 찾을 수 없을 경우를 말합니다.
사유: 해당 웹 사이트에 대한 DNS 서버의 잘못된 설정, DDoS 공격등으로 DNS서버의 문제 등에 의해 발생할 수 있습니다. - 9.44% - Connection refused by server
웹서버의 응답은 이루어졌으나 연결을 거부 당한 경우입니다.
사유: 웹서버 과부하나 internal server 문제로 발생할 수 있습니다. - 5.83% - Timeout while trying to load the web page
웹서버와의 연결 설정은 이루어졌으나 웹 페이지의 호출 과정에서 타임아웃 나는 현상을 말합니다.
사유: 웹서버, network, internet 연결 과부하에서 나타나는 현상입니다. - 4.40% - HTTP Server Error 503 Service Unavailable
웹서버에서 일시적으로 연결을 할 수 없는 경우에 나타나는 현상입니다.
사유:과부하 및 웹서버의 다운, Apache + Tomcat 연동시에 Apache는 살아 있고 Tomcat이 죽었을 경우 발생하는 경우도 있습니다. - 4.36% - HTTP Server Error 500 Internal Server Error
웹서버의 내부 문제로 발생으로 나타나는 현상을 말합니다.
사유: Internal server error. 주로 컴파일 과정의 오류현상으로 나타납니다. - 1.34% - HTTP Server Error 502 Bad Gateway
웹서버의 gateway나 proxy 기능을 사용할 경우 요청에 응답을 제대로 못할 경우 나타나는 현상을 말합니다.
사유: 웹 서버나 웹서버와 연동하는 S/W의 다운,. 웹 서버와 게이트웨이 서버와의 통신 문제 등에 의해 발생합니다..
- 참고 사이트 : http://royal.pingdom.com/?p=204
Java 5에서 Autoboxing And Unboxing
1. Autoboxing And Unboxing 정의
Java 5에서는 autoboxing은 assignments, method/constructor invocations구에서 primitive types(int, long, float, double, char 등)에서 primitive types의 Object (Integer, Float, Double 등)으로 변환되는 것입니다.
그 반대는 auto-unboxing입니다.
// manual boxing vs autoboxing
Integer ii;
int i;
// O L D W A Y : manual boxing
// convert from int to Integer ii = new Integer(i);
// convert from Integer to int i = ii.intValue();
// N E W W A Y : autoboxing, conversions are automatically applied.
// convert from int to Integer
ii = i; //auto-boxing
// convert from Integer to int
i = ii; //auto-unboxing
2. AutoBoxing의 샘플
HashMap<String, Integer> h = new HashMap<String, Integer>( 149, 0.75f);
h.put( "inch", 1 );
h.put( "foot", 12 );
h.put( "yard", 36 );
h.put( "mile", 3760 * 36 );
int inches = h.get( "foot" );
System.out.println( inches );
for ( String key : h.keySet() )
{
int value = h.get( key );
System.out.println( key + " " + value );
}
for ( Map.Entry<String, Integer> entry : h.entrySet() )
{
String key = entry.getKey();
int value = entry.getValue();
System.out.println( "separately: " + key + " " + value );
Set<String> justKeys = h.keySet();
String[] keys = justKeys.toArray( new String[justKeys.size()] );
Collection<Integer> justValues = h.values();
Integer[] values =
justValues.toArray( new Integer[justValues.size()] );
Set<Map.Entry<String, Integer>> justEntries = h.entrySet();
Map.Entry<String, Integer>[] keyValuePairs =
justEntries.toArray( new Map.Entry[justEntries.size()] );
}
3. Old Style Manual Boxing 샘플
HashMap h = new HashMap( 149, 0.75f);
h.put( "inch", new Integer( 1 ) );
h.put( "foot", new Integer( 12 ) );
h.put( "yard", new Integer( 36 ) );
h.put( "mile", new Integer( 3760 * 36 ) );
int inches = ( (Integer) h.get( "foot" ) ).intValue();
for ( Iterator iter = h.keySet().iterator(); iter.hasNext(); )
{
String key = (String) iter.next();
int value = ( (Integer) h.get( key ) ).intValue();
System.out.println( key + " " + value );
}
for ( Iterator iter = h.values().iterator(); iter.hasNext(); )
{
int value = ( (Integer) iter.next() ).intValue();
System.out.println( value );
}
for ( Iterator iter = h.entrySet().iterator(); iter.hasNext(); )
{
Map.Entry entry = (Map.Entry) iter.next();
System.out.println( "as Entry: " + entry );
String key = (String) entry.getKey();
int value = ( (Integer) entry.getValue() ).intValue();
System.out.println( "separately: " + key + " " + value );
}
창조 중심의 경영혁신 패러다임
< 목 차 >
Ⅰ. 문제제기
Ⅱ. 경영혁신 패러다임의 변화
Ⅲ. 한국기업 경영혁신의 특징과 한계
Ⅳ. 창조적 혁신의 조건
I. 문제제기
근래 기업 경영과 관련된 변화의 속도가 과거와 비교할 수 없을 정도로 빨라지고 있다. 기업이 그만큼 다급해졌다는 의미다. 기업에게 만들면 팔리던 황금시절도 있었지만 대부분의 영역에서 소비자들에게 저울추가 넘어갔다. 그래서 급격하게 바뀌는 소비자들의 요구에 대응하기 위해 기업은 끊임없이 새로운 제품과 서비스를 만들어내고 있다. 민첩하게 바뀌는 기업만이 살아남을 수 있다.
더구나 최근 경영환경이 악화되고 있다. 유가는 사상 최고가를 연일 경신하면서100달러에 육박하고 있으며, 원자재가의 상승도 지속되고 있다. 그 만큼 원가 부담이 높아지고 채산성이 악화될 수밖에 없는 상황이다. 또 달러화 약세로 인해 수출 비중이 높은 한국기업이 어려움을 겪고 있다. 이 같은 고유가, 저달러 현상은 당분간 지속될 것이라고 한다. 한국기업은 IMF를 극복하고 글로벌 시장에서 주목 받기 시작했지만 여유를 가지고 한숨 돌리기는 어렵게 된 것이다. 오히려 우리 경영자들은 사업하기가 더욱 어려워졌다고 말한다.
기업경영 환경이 이처럼 크게 어려워지고 있는 가운데 이제 경영혁신의 패러다임도 과거와는 달라지고 있다. 과거에는 방향이 명확한 상태에서 누가 빨리 실행하느냐에 경영혁신의 초점이 맞추어져 있었지만, 지금은 누가 남과 다르게 생각하고 방향을 설정하느냐가 더 중요해졌다. 경영혁신의 초점이 ‘실행’에서 ‘창조’로 바뀌고 있는 것이다. 기업들의 움직임이 잘 나타나 있는 경영 관련 미디어에서 키워드 검색을 한 결과를 보아도 2004년을 정점으로 실행에 관한 기사의 비율은 줄어들고 있지만 창의성에 관한 기사의 비율은 늘어나고 있다.
실행에서 창조로 경영혁신의 화두가 전환하고 있다는 사실은 미국의 대표 기업인 GE의 경영 기조 변화에서도 읽어낼 수 있다. GE는 이미 2000년 말 CEO를 교체하면서 이러한 변화를 먼저 감지하고 잭 웰치(Jack Welch)의 후임 CEO로 실행보다는 창조의 시대에 걸맞는 인물로 평가받아 온 제프리 이멜트(Jeffrey Immelt)를 선임하였다. 잭 웰치 스스로 실행 중심이었던 자신의 경영 방식을 개혁할 사람을 선택한 것이다.
사실 잭 웰치 방식은 IMF 외환위기 이후 한국기업의 경영혁신에 있어 역할 모델(Role Model)로 작용했다. 한국기업들은 복잡한 사업구조를 잘 꾸려가면서 수익을 동반한 고성장을 구가하고 있는 GE를 벤치마킹하려고 애썼다. 최근 10여 년간 잭 웰치의 방식은 한국기업에게 경영혁신의 모범 답안이었다. 그러나 이제는 이러한 모델의 효용성이 한계에 봉착한 시대로 접어들고 있다. 이 글에서는 ‘잭 웰치식’ 실행 중심의 경영혁신이 어떤 이유로 변하고 있는지 알아보고, 우리 기업들은 이러한 트렌드에 어떻게 대응해야 하는지 살펴보고자 한다.
II. 경영혁신 패러다임의 변화
1997년 이후 경영 잡지 포춘(Fortune)에서는 매년 설문 조사를 통해 ‘세계에서 가장 존경 받는 기업’ 순위를 발표해 오고 있다. 이 순위에서 단골로 1등을 차지하던 기업이 GE였다. 그런데 2003년 GE가 1위 자리를 월마트(Wal-Mart)에 내주고 5위로 내려 앉았다. 이듬해에는 한 계단 상승한 4위를 차지했지만 역시 1위를 월마트에 내주었다. 이처럼 2003년과 2004년 GE가 존경 받는 기업 순위에서 떨어진 것은 당시 GE식 경영방식의 효과성에 대한 의문이 일어났기 때문이다. 물론 2005년 이후 다시 1위를 탈환했지만 이것은 이멜트 회장이 과거 GE의 방식을 바꾸어서 이 순위를 다시 회복시켰다고 봐야 한다. 과거 GE식 경영혁신이 오늘날 어떠한 변화에 직면해 있는지 알아보자.
1. GE 사례를 통해 본 과거 경영혁신의 특징
‘리틀 잭’을 버린 잭(Jack Welch)
GE의 이사회와 전 CEO였던 잭 웰치는 2000년 11월 후임 CEO를 결정할 때 앞으로는 GE의 방식이 바뀌어야 된다는 사실을 알고 있었다. 당시 CEO 후계자는 1997년부터 GE 항공기엔진(Aircraft Engines) 사업본부를 맡고 있던 제임스 맥너니(James McNerney), 1995년부터 GE 발전설비(Power Systems) 사업본부의 책임자였던 봅 나델리(Robert Nardelli), 1997년 이후 GE 의료기기(Medical Systems) 사업본부를 담당하고 있던 제프리 이멜트 등 3명이었다. 이들은 이사회와 CEO인 웰치가 1994년 차기 후임자 선정을 시작할 때 뽑혔던 23명의 후보들이 치열하게 경쟁한 결과 마지막까지 살아남은 사람들이었다. 웰치는 수년에 걸쳐 여러 사업과 직무를 경험하게 함으로써 그들을 테스트했다. 이처럼 다양한 경험과 혹독한 시련을 통과했기에 이들 세 사람의 성과는 남달랐다.
특히 나델리의 경영성과가 좋았다. 웰치는 자서전에서도 그의 경영능력을 높이 평가하고 있다. 사실 그는 ‘작은 잭 웰치(Little Jack)’라고 불렸다. 외모도 비슷했으며, 성격 또한 전 GE 회장이었던 웰치를 쏙 빼 닮았다. 경영 스타일과 능력 역시 잭 웰치와 유사했다. 비록 독선적이기는 했지만, 모든 중요한 이슈에서 스스로 의사결정을 주도했으며 책임지고 일했다. 항상 도전적이며 주어진 목표는 반드시 달성하고, 구성원들의 실행을 이끌어 내는데 천부적이었다. 또 그는 사업과 경영의 세부적인 문제까지 자세히 파악했으며, 위기 상황에서는 참모들의 도움을 받기보다는 스스로 자신의 판단과 직관에 의존하여 용기 있게 어려움을 헤쳐나갔다. 이러한 노력의 결과로 그가 맡았던 GE의 사업본부는 연이어 최고 수익을 냈다. 세 후보를 동일하게 비교하기 위해 1996년부터 2000년까지의 실적을 살펴보면 나델리의 성과가 가장 우수한 것을 알 수 있다. 그는 4년간 76억 달러였던 매출액을 두 배 가량 끌어올렸다. 매출액과 영업이익 성장률이 GE의 사업본부 중에서 가장 높았다. 특히 그가 취임하던 1995년 발전설비 사업본부의 영업이익은 7억 8천만 달러였는데, 5년 후 4배에 가까운 28억 달러가 넘는 성과를 달성했다.
이렇듯 우수한 능력과 놀라운 성과를 보였음에도 불구하고 웰치는 자신을 이을 후임 CEO로 나델리를 선택하지 않았다. 웰치는 왜 자신과 닮은 나델리에게 CEO 자리를 물려주지 않았을까?
웰치가 나델리를 버리고 이멜트를 선택한 이유는 경영혁신의 패러다임이 ‘실행’에서 ‘창조’로 전환되는 시대적 흐름을 읽고 있었기 때문이다. 나델리도 사업모델을 바꾸는 등 새로운 시도를 하였지만, 그의 성과는 주로 6시그마 활동으로 효율성을 개선하거나 제품 판매를 극대화하여 얻은 것이다. 이에 반해 이멜트는 창의적인 생각으로 기존의 사업구조를 바꾸는데 더 뛰어난 역량을 보였다. 성과의 질적인 측면에서 이멜트가 보다 높은 점수를 받은 것이다. 이멜트는 기존 제품의 개발이나 판매를 신장시켜서 성과를 얻은 것이 아니다. 비록 GE가 의료기기 사업에서 시장의 선두를 차지하고 있었지만, 향후 제품이 범용화됨에 따라 경쟁사의 저가격 제품 공략 등 경쟁이 격화될 것으로 예상되자 사업모델을 과감히 바꾸었다. 시장을 리드하고 있었지만 기존 사업모델을 파괴해 장차 경쟁이 심해지는 상황에서도 고객을 빼앗기지 않도록 고객을 GE의 서비스에 고정화(Lock-in)시켰던 것이다.
즉 이멜트는 과거와는 다른 새로운 생각을 할 줄 아는 사람이었으며, 이러한 창조적 경영 방식이 새로운 환경에 가장 적합할 것이라고 판단했기 때문에 웰치는 이멜트를 선택한 것이다. CEO 선임에서 탈락한 나델리가 옮겨간 홈 디포(Home Depot)에서의 경영혁신 결과를 보면 웰치가 옳았음을 알 수 있다.
홈 디포에서 고전한 ‘리틀 잭’ 나델리
GE 이사회가 이멜트를 차기 회장으로 선택했다는 결정을 웰치가 나델리에게 알린 지 10분이 되지 않아서 그는 홈 디포로부터 스카우트 제의를 받았다. 그래서 잭 웰치의 경영혁신을 그대로 실천한 나델리는 2000년 12월 홈 디포의 CEO가 되었다.
그는 유통업체인 홈 디포를 혁신하는 데 있어 GE에서 성공했던 경영혁신 방식을 그대로 적용했으며 GE에서 사람들을 데리고 와서 주요 보직을 담당하게 했다. 때문에 홈 디포의 구성원들은 나델리의 이러한 경영행태를 비꼬면서 홈 디포(Home Depot)가 홈 지포(Home GEpot)가 되었다고 했다. 그가 주로 힘을 들인 곳은 고객에게 새로운 서비스나 가치를 창출하는 분야가 아니라 원가를 절감하고 생산성을 향상시키는 분야였다. 그는 10억 달러를 들여서 고객이 스스로 계산하게 하는 셀프-체크 설비와 재고 관리 시스템 및 각종 데이터 베이스 등을 구축했다. 그리고 수천 명의 정규직을 해고하고 비정규직 근로자로 대체했다.
서비스 업체에서 이러한 경영혁신은 맞지 않다며 반대하는 여론이 많았지만, GE에서 잭 웰치와 자신이 그랬던 것처럼 확신에 찬 자신감으로 밀고 나갔다. 결국 2007년 1월 나델리는 독단적 리더십과 역시 건축자재 유통업을 하는 경쟁사 로우스(Lowe’s Companies) 대비 저조한 성과를 보였다는 이유로 홈 디포 CEO에서 해고된다.
나델리가 취임한 2000년 말 46달러에 달하던 홈 디포의 주가는 해고당하기 전인 2006년 말에는 40달러로 떨어졌다. 이러한 홈 디포의 주가는 유통업 지수나 시장 평균인 S&P 500 지수보다 훨씬 저조한 수준이다. 반면 경쟁사인 로우스의 주가는 같은 기간 11달러에서 31달러로 상승했다. 홈 디포가 내부 효율성 개선 작업을 하는 동안 로우스는 고객 서비스를 향상시키는 노력을 하여 시장에서 좋은 평가를 받았다. 건자재 유통업에서 월마트의 최저상품가격(Everyday Low Prices) 전략을 채택했고, 고객의 입장에서 구매 프로세스를 개선했고, 매장도 고객 입장에서 바꾸었다.
과거에는 실행이 경영혁신의 중심
나델리는 잭 웰치의 경영방식과 스타일을 보고 성장했다. 그가 홈 디포에서 적용했던 경영혁신은 GE에서 그대로 성공한 것이었다. 나델리의 경영혁신, 즉 잭 웰치식 경영혁신을 요약하면 다음과 같다.
첫째, 몸집을 키워 시장의 선두가 되는 전략을 택하기 때문에, 주요 기업을 사들이거나 1등이나 2등이 되지 않는 사업은 구조조정한다. 그런데 이러한 방식은 GE가 성장, 발전해 온 경영환경의 특징과 관련 있다. 웰치는 1981년에 CEO가 된 이후 20여 년 동안 GE를 이끌었다. 이 시기에는 글로벌화가 진전되면서 경쟁의 영역이 점차적으로 늘어났다. 무한경쟁화 되는 환경에서 업계 선두와 그렇지 않은 기업간 차이가 엄청나다는 점을 웰치는 누구보다 분명이 알고 있었다. 경쟁이 치열해질수록 선도자 우위(First Mover Advantage)가 적용되고, 이를 위해서는 대규모 투자가 필요했으며 시장에서 1등이나 2등이 되는 것이 매우 중요했던 것이다. 또 산업간 경계가 명확하여 한번 진입장벽을 쌓아 놓으면 시장에 진입할 수 있는 잠재적 경쟁자가 상당히 줄어들어 많은 이윤을 획득할 수 있었다.
둘째, 거대해져서 관료화된 조직의 계층을 없애고 날렵한 조직으로 바꾸는데 주력한다. 규모의 경제를 구축하기 위해서 대기업 조직을 만들다 보니 기업이 비대해져서 관료주의가 나타났다. 이러한 비효율과 관료주의를 제거하기 위해 조직을 슬림화하는 노력을 한 것이다.
셋째, 제품력을 향상시키고 원가를 절감하기 위해 6시그마와 같은 방법론으로 생산혁신에 매진한다.
1980~90년대 GE가 속해있던 하이테크 산업은 제품의 품질이 소비자의 니즈를 충족시키지 못하던 상황에 있었다. 생활용품 업계와 달리 하이테크 산업은 발달한지 얼마 되지 않았기 때문에 소비자가 원하는 수준의 제품을 만들지 못했다. 그래서 당시에는 제품 품질이 구매의 가장 중요한 기준이었다.
마지막으로, 이와 같은 혁신을 이끌 수 있는 최고 인재를 영입하고 하위 인력은 퇴출시키는 경쟁 시스템을 도입하여 리더를 육성한다. 시장의 선두가 되고 제품력을 경쟁사보다 먼저 확보하며 원가절감에서 경쟁력을 가지는 등 GE의 경영혁신은 모두 빠른 스피드로 실행이 되어야 하는 것들이다. GE처럼 거대한 기업에서 이러한 활동을 성공시키기 위해서는 조직의 의사결정 체계가 명료해야 하고 부서간 정보 전달이 빨라야 한다. 이를 위해서는 일사불란한 명령체계가 필요하다. 그래서 가능하면 똑똑한 사람이 리더가 되어 Top-down 방식에 의해서 조직을 움직이는 것이 효과적이다. 이러한 배경에서 경쟁적 인사관리로 최고의 인재를 등용하여 강력한 리더십을 발휘하게 하는 것이 중요했던 것이다.
요컨대 웰치식 경영혁신, 즉 실행 중심의 경영혁신은 성장산업에서 품질이나 성능을 가능한 한 빠르게 발전시키는 것에 초점이 맞추어진 것임을 알 수 있다.
2. 창조적 경영혁신의 대두
그러나 이제 과거와는 상황이 크게 달라졌다. 대부분의 산업은 수요가 포화되어 성숙기에 있는 경우가 많다. 품질의 발달 속도가 빨라 제품 성능이 소비자가 원하는 수준을 넘어서고 있다. 그래서 많은 산업에서 제품이 범용화되고 있다. 컴퓨터를 예로 들어 보자. 높은 사양의 게임을 즐기는 소수의 사용자를 제외하고는 컴퓨터 속도가 느려서 불만인 사람들은 별로 없다. 저장 용량도 과거에는 상상할 수 없을 정도로 커졌다. 이제는 소비자가 원하는 수준을 넘어선 기능을 제공하는 제품이 아주 많다. 범용화된 환경에서는 후발기업도 선도자만큼 좋은 제품을 만들 수 있기 때문에 선도자 우위가 쉽지 않다. 그래서 이제는 제품의 제조 경쟁력만으로는 승부에서 이기기 어렵다. 마케팅, 디자인, 사업모델 등 소프트한 면이 점점 중요해지고 있는 이유도 이 때문이다. 또 산업간 경계가 허물어지고 있어 어느 곳에서 경쟁자가 출현할지 모르는 상황이다.
GE의 잭 웰치는 비록 자신은 실행 중심 경영혁신의 전도사였지만 시대가 이렇게 바뀌고 있다는 것을 감지하고 있었다. 그래서 자신의 복제품(Copycat)인 나델리보다는 창의력을 중요하게 생각하는 이멜트를 후임자로 뽑은 것이다. 실제로 이멜트가 취임한 후 GE의 경영은 크게 바뀌었다. 과거 GE의 경영활동과 이멜트 취임 후 변화된 핵심가치를 살펴보면 이러한 사실을 알 수 있다. 과거에는 벽 없는 조직, 혁신, 단순성, 리더십 등 명확한 방향을 두고 실행하는 것이 중심이었다. 이멜트가 취임한 이후 상상력과 새로움을 강조하여 실행뿐만 아니라 창의력이 중심이 되는 유연한 조직을 지향하고 있다. 가장 달라진 것은 리더십 스타일이다. 웰치 앞에서는 구성원들이 모두 벌벌 떨면서 보고했는데, 이멜트는 이러한 분위기를 없앴다고 한다. 유연한 사고를 위해서 강력한 리더십이 중심이 되는 조직 문화도 변화시키고 있는 것이다.
대부분의 기업들은 과거의 성공 방법을 버리지 못하기 때문에 변화된 환경에서 위기에 빠진다. 지금 우리가 모범으로 생각하고 있는 경영혁신 모델이 서서히 전환되고 있다. 한국기업은 어떻게 미래를 준비해야 하는지 알아보자.
III. 한국기업 경영혁신의 특징과 한계
우리 나라에서 경영혁신에 대한 논의가 활발해 진 것은 1990년대 이후이다. 세계화가 진전되면서 경영혁신의 필요성을 인식했고 경영혁신에 방법론에 대한 기업들의 관심도 폭발적인 수준이었다. 그러다가 1998년 IMF 외환위기를 계기로 경영혁신은 우리 사회에서 보편화되었다. 외환위기를 극복하고 한국경제가 재도약에 성공한 2000년 이후에는 경영혁신에 대한 논의가 잠잠해 지다가 최근 들어 다시금 관심이 고조되고 있다. 거시적인 경제위기는 극복했지만 기업 입장에서는 지속적인 혁신활동을 수행해야만 생존할 수 있는 상황이 된 때문일 것이다.
경영혁신에 대한 사회적 논의는 1990년대 이후부터 일어났지만, 사실 한국기업은 오래 전부터 혁신활동에 매진해 왔다. 한국기업은 뒤늦게 출발한 자의 조바심으로 항상 ‘빨리빨리’를 외치며 앞만 보고 달려왔다. 선진기업을 따라 잡기 위해 경영혁신에 대한 부단한 노력을 해온 것이다. 이처럼 선진기업을 넘어서기 위한 신생기업의 노력이 한국기업 경영혁신의 특징에 고스란히 담겨있다.
1. 한국적 경영혁신의 특징
1) 문화 중시
한국기업 경영혁신의 첫 번째 특징은 변화관리나 조직문화 혁신이 중심이 된다는 점이다. 선진기업들도 변화관리를 중시하지만 한국기업은 그 정도가 훨씬 심해서 구성원들의 정신 무장이나 변화 분위기 조성 등이 경영혁신의 처음이자 마지막으로 생각한다. 또 조직에 변화 분위기를 불어넣을 수 있는 사람은 CEO가 유일하기 때문에, 경영혁신에서 CEO가 중심이 된다.
장기파업으로 부도 위기를 맞았던 한국전기초자의 경영혁신 사례에서 이러한 특징을 엿볼 수 있다. 한국전기초자는 1997년 말 서두칠 사장이 전문경영인으로 파견되어 대대적인 경영혁신 활동을 시작하게 된다. 서두칠 사장이 가장 먼저 한 일은 위기의식으로 회사를 무장하는 것이었다. 구성원들에게 위기의식을 고취시키기 위해 회사의 상황을 있는 그대로 알려주기 시작했다. 회사의 경영정보를 공개함으로써 구성원들이 경영자가 가지고 있는 고민을 나누게 되었다. 심지어 사원 가족에게까지 경영 실태를 설명했다. 서두칠 사장 스스로도 솔선수범했다. 운전기사를 없애고 골프회원권을 팔았으며 항상 공장에 주재하는 등 모범을 보임으로써, 회사 내에 팽배한 불신풍조를 사라지게 했다. 이러한 과정에서 직원들의 공감대를 형성할 수 있게 되었고 회사는 혁신에 성공한다.
변화관리의 전문가인 코터(John Kotter)는 위기의식을 불어넣는 것이 조직문화를 바꾸는 출발점이라고 말했다. 서두칠 사장도 회사의 위기를 구성원들과 공감하는 활동부터 시작했다. 한국전기초자뿐만 아니라 많은 한국기업들은 경영혁신에 있어 조직문화나 구성원들의 마인드 혁신을 강조한다. 아마도 경영혁신의 구체 방법론이 발달하지 않아서 윗사람은 솔선수범하고 아랫사람은 열심히 하는 것을 혁신으로 생각했던 과거의 관행이 남아있기 때문에 이러한 특징을 보이는 것이 아닐까.
2) 목표 지향
두 번째 특징은 ‘하면 된다’ 식의 실행이 중심이 되는 혁신활동을 많이 하기 때문에 대부분의 한국기업은 달성 가능한 수준보다 훨씬 높은 목표를 세워놓고 일단 뛴다. 한국기업은 전략 목표를 실행하는 과정인 혁신의 방법론보다는 목표 달성을 더 중요하게 생각한다. 심지어 자원이나 역량 수준에 대한 고려 없이 무조건적으로 높은 목표를 설정하고 실행한다. 이것은 후발기업으로서 선진기업을 보다 빨리 따라 잡아야 하는 상황에서 나타난 관행이다.
이러한 관행으로 인해서 요즈음에도 한국기업은 사업계획 수립 시 목표를 과도하게 높게 잡는다. 연말에 차년도 계획을 세울 때 CEO로부터 가장 평가를 잘 받는 사업부장이 바로 목표를 높게 세운 사람이라고 한다.
“이봐, 해봤어?” 현대 그룹의 고 정주영 회장이 항상 했던 말이라고 한다. 어떤 일을 추진하거나 목표를 설정할 때 부하직원이 어렵다고 이야기하면, ‘해보고 나서 그런 소리를 하라’는 뜻에서 이야기했다고 한다. 실제로 정주영 회장은 불가능한 목표라도 일단 도전하고 실행해 보는 것으로 유명하다. 1970년 12월 정주영 회장이 첫 선박을 수주할 때 조선소 도크도 없이 500원짜리 지폐를 보여주며 한국인은 예로부터 배를 잘 만들었다고 그리스 선주를 설득했다. 결국 선주는 26만톤급 유조선 두 척을 현대조선소에 주문했고, 조선소 건설과 유조선 건조를 동시에 착공하여 납기를 지켰다. 이렇듯 지금은 세계 최고 수준인 조선업도 불가능한 목표를 달성하는 과정 속에서 발전한 것이다.
지금은 1등이 된 반도체, LCD 사업도 이러한 과정을 통해서 발전했다. 불가능할 것 같은 목표를 설정하고 실행에 집중해서 어떻게든 목표를 달성하는 방식으로 선진기업을 따라 잡은 것이다. 한국기업이 성장하면서 취했던 이러한 방식은 아직도 우리 기업의 경영에 남아있다. 지금도 경영혁신은 ‘무슨 일이 있어도 목표를 달성하는 것’이라고 생각한다.
3) 개선 중시
셋째, 운영효율성 확보나 원가절감 등 기존의 것을 개선하는 활동이 중심이 된다. 후발기업으로 선진기업의 기술이나 설비를 받아들여 그들의 수준이 될 때까지 노력하는 과정에서 나타난 관습이다. 새로운 것을 창조하기보다는 선진기업의 제품과 생산방식을 모방하여 가능한 한 다르지 않게 실행하는 것이 목표였다. 그래서 새로운 것을 창조하는 것보다 남의 것을 가지고 와서 개선하거나 과거의 것을 조금 발전시키는 활동에 익숙해진 것이다.
위에 예로 든 한국전기초자 역시 구성원들의 마인드 혁신 이외에 운영혁신 활동도 병행했다. 서두칠 사장은 ‘3890’(연간 생산량 3천만 개, 전면유리 수율 80%, 후면유리 수율 90%, 클레임 제로) 운동을 시작했다. 3890은 생산성 혁신의 목표를 하나의 구호로 만든 것이다. 많은 한국기업에서 생산성 목표를 혁신 구로로 만든 문구를 볼 수 있다.
IMF 외환위기 이후 LG전자, 삼성SDI, 포스코 등 많은 대기업들이 6시그마 기법을 도입하여 커다란 성과를 얻었다. 지금도 6시그마 기법은 한국기업에게 확산되고 있다. 그런데 6시그마 기법은 주로 공장의 수율을 올리거나 낭비를 줄이는 등 생산성을 향상시키는 분야에서 상당히 효과적이었다. 한국기업에게 6시그마가 그렇게 빨리 파급되고 널리 확산된 것은 그만큼 우리의 경영혁신이 운영효율성 향상 같은 개선 활동 중심임을 말해준다.
2. 한국적 경영혁신의 한계
이처럼 한국적 경영혁신의 특징은 선진기업을 모방하고 가능한 한 빨리 따라 잡기 위해서 앞만 보고 실행했던 발전 과정의 부산물이다. 그러나 이러한 한국기업의 경영혁신도 앞에서 설명한 경영환경 변화에 대응해야 한다. 글로벌 경쟁 체제에서는 미국기업에게 당면한 이슈가 우리 기업에게도 자연스럽게 적용된다. 한국기업들도 이제는 산업이 성숙기에 진입하는 기업들이 많아지고 있으며, 산업간 경계가 무너져서 경쟁이 격화되고 있다. 제품의 범용화와 공급 과잉 현상은 우리 기업에게도 당장 해결해야 하는 과제다. 그러므로 변화되고 있는 경영혁신 패러다임을 보다 빨리 받아들여야 할지도 모른다.
최근 글로벌 시장에서 경쟁하는 한국의 제조업체들이 어려움을 겪고 있는 것도 이러한 트렌드와 무관하지 않다. 고속 성장을 지속하던 IT 업체들이 잇따라 침체를 겪고 있으며, 수출 비중이 큰 제조업체들의 채산성이 악화되고 있다. 실증적으로 살펴보기 위해 상장 제조업체 459개를 대상으로 2000년 이후 영업이익률을 조사하였다. 제조업체들의 영업이익률이 최근 들어 조금씩 하락하고 있다. 특히 수출 비중이 50%를 넘는 기업들의 영업이익률이 더욱 좋지 않고 하락폭도 큰 것을 볼 수 있다. 물론 이 기간 동안 환율하락으로 인해서 수출기업의 채산성이 악화된 영향도 있다. 그러나 궁극적으로는 글로벌 경쟁을 하고 있는 한국기업이 고객에게 차별화된 가치를 가져다 주지 못하기 때문이다. 더욱이 매출액 1,000억원 미만의 중소규모 제조업체의 경우에는 이러한 특징이 더 심하게 나타난다. 1,000억원 미만 업체 전체의 영업이익률은 대기업들과 다르지 않으나, 수출을 위주로 하는 중소업체의 영업이익률은 평균에 훨씬 미치지 못하고 하락폭도 컸다. 이는 대기업에 비해 새로운 사업모델을 창출하기 힘든 중소업체들이 글로벌 시장에서 더욱 고전하고 있다는 것이다. 앞으로 선진기업과 다른 차별화 전략으로 무장하지 못한 기업들의 채산성은 더욱 악화될 것이다. 한국기업은 과거와는 다른 경영혁신을 통해 이러한 어려움을 극복해야 한다.
다른 사례를 보자. 위에서 한국적 경영혁신으로 기적을 만들어냈던 한국전기초자가 지금 어려움에 빠져 있다. 한국전기초자는 2002년 이후로 하락세를 면치 못하고 있다. 6,400억원을 넘던 매출액이 작년에는 2,400억원 대로 하락, 절반 이상 떨어진 것이다. 또 작년과 올 상반기말 현재 적자가 지속되고 있다. 공장을 매각하고 패널 생산 라인을 계속 중단하고 있으며, 인력 구조조정을 지속하고 있다. 무엇이 문제인가? 한국전기초자는 성숙기 산업을 넘어서 사양 산업에 속해 있다. 아무리 브라운관의 품질이 좋아져도 TV가 디지털화되고 LCD와 같은 평판 디스플레이로 전환되는 상황에서는 수요가 줄어들 수밖에 없다. 아무리 열심히 일을 해도 계속되는 어려움에 빠질 수밖에 없는 상황인 것이다. 제품의 품질개선이나 원가절감보다 더 중요한 것은 시장 변화의 흐름을 미리 읽어 한발 앞서서 고객이 원하는 것을 미리 창조해 내는 것이다.
IV. 창조적 혁신의 조건
그러면 우리 기업들은 어떻게 창조적 경영혁신에 성공할 수 있을까? 먼저 기업에서 창조적 혁신이 발생하도록 하는 조건을 생각해 보자. 기업 조직의 창의성 연구에 전념해온 전문가들에 의하면 창의적 혁신은 두 가지 조건 하에 나타난다고 한다.
첫째, 성과에 대한 요구나 납기 준수에 대한 압박 등 혁신활동에 대한 압력이나 관리(Challenge)의 최적 수준이 존재한다고 한다. 압력이 없이 너무 풀어놓아도 안되고, 너무 많은 압력을 주어도 안된다는 것이다. 그래서 성과에 대한 요구 등 압력을 어느 정도 줄 때까지는 창조적 혁신에 대한 성과가 올라가지만 압력이 어느 수준을 넘어서면 성과가 다시 하락한다는 것이다. 하버드 대학의 경영학 교수였던 고 테오도르 레빗(Theodore Levitt)이 일찍이 말했듯이, 기업에서의 혁신(Business Creativity)은 아이디어에 실행이 결합되어야 완성된다. 세계적 예술가였던 고 백남준씨가 ‘자고로 예술가는 게을러야 한다’고 이야기한 것처럼 아이디어는 그 특성이 압력이 없고 자유로울 때 많이 나타난다. 반면에 실행의 결과는 압력이 있어야 나타나는 특성이 있다. 우리의 뇌는 긴장을 해야 무언가를 만들어내기 때문이다. 혁신은 아이디어와 실행이 동시에 결합되어야 하는데 이처럼 아이디어와 실행은 압력에 대해서 서로 반대 방향으로 작동하기 때문에, 압력이 적절한 수준이 되어야 한다는 것이다. 그래서 창조적 경영혁신에 성공하려는 기업에서는 이 최적 포인트를 찾는 것이 중요하다.
둘째, 창조적 혁신은 서로 다른 영역의 경계에서 발생하는 경우가 많다. 상이한 영역의 논리나 메커니즘이 유추에 의해서 오랫동안 풀지 못한 문제를 해결하거나 막막했던 방향에 대해 길을 제시해 주는 현상이 나타나는 것이다. 현대 경영학과 조직이론에 가장 많은 영향을 준 학파로 노벨경제학상을 받은 사이먼(Herbert A. Simon)과 조직이론의 대가 마취(James G. March) 등이 속한 카네기 학파(Carnegie School)를 들 수 있다. 당시 미국의 카네기 멜론 대학에서는 인간과 조직의 행동을 연구하기 위해서 경제학, 정치학, 인류학, 심리학 등 다양한 영역의 전공자로 리서치 팀을 만들어 연구를 했다. 다양한 영역의 지식들이 모여 현대 경영학에 가장 큰 영향을 준 이론들이 탄생한 것이다. 또 우연에 의해 의도하지 않은 혁신적 제품이 나타나는 사례도 서로 다른 영역의 경계에서 창조적 혁신이 나타난다는 증거다. 파이자(Pfizer)의 비아그라, 3M의 포스트잇, 듀폰(DuPont)의 나일론, 캘로그(Kellogg)의 시리얼, HP의 잉크젯 프린터, 심지어 인류 최대의 발견이라고 하는 페니실린 등이 모두 우연한 발견을 통해 사업으로 성공한 대표적인 예이다. 우연에 의한 혁신은 한 분야의 연구를 다른 분야에 적용했을 때 효과를 본 것이다. 한 영역에서는 실패였지만 다른 영역에서는 성공이 되는 이러한 발견이나 제품은 서로 다른 영역을 넘나들지 않으면 그대로 사장되었을 것이다.
창조를 위한 파괴
이처럼 창조적 혁신이 나타나는 상황을 이해하면 기업에서 어떻게 창조적 경영혁신에 성공할지 생각할 수 있다. 창조성의 특성을 이해하고 기획이나 실행, 지원 등 경영의 모든 분야에서 체계적인 관리를 해야 한다. 가령 기획 단계에서는, 일의 결과는 강하게 요구하되 실행 과정의 계획에 대해서는 자율성을 부여할 필요가 있다. 사람은 목표 달성에 대한 압력이 없이 너무 풀어주어도 일을 제대로 안하고, 너무 강하게 조여도 탈진(Burn-out)하여 생각을 안하게 되기 때문이다. 이행 단계에 있어서도 압력이나 관리의 최적 포인트를 찾는 것이 중요하다. 보다 자세히 설명하면 초기에는 압력을 많이 주지 말고 자율성에 맡기다가, 시간이 지나갈수록 압력의 수준을 높이는 것이 현명하다. 즉 일의 결과를 너무 조급하게 요구하지 말아야 하지만 아이디어가 구체화되기 시작하면 결과에 대한 압박을 주어야 한다. 마찬가지로 초기에는 돈을 아끼지 말고 풍부하게 부여하지만 사업화가 시작되면 예산을 관리하는 것이 좋다. 그리고 어떠한 과제를 수행할 때 서로 다른 분야의 담당자들로 팀을 구성하여 다양한 영역의 논리나 법칙이 결합되어 창조적 혁신이 발현되도록 하는 것이 바람직하다. 동기부여 방식도 ‘실행’ 중심의 활동에는 금전 보상 등 외적 보상이 효과적이지만 ‘창조’ 중심의 활동은 일을 즐기게 만드는 것이 중요하다고 한다.
창의적인 기업 조직을 만들거나 창조적 경영혁신을 하는 방법에 대해서는 추후 심층적인 고찰이 있어야 할 것이다. 하지만 핵심은 창조적 경영혁신을 위해서는 단순히 혁신과 관련된 방법만 바꿔서는 안된다는 것이다. 다른 경영시스템도 이에 맞추어 연계시켜야 한다. 전략을 수립하는 과정, 리더십, 성과 관리, 보상 등 모든 영역이 연계되어야 한다. 창조적 경영혁신이 중요하다고 기존 조직의 시스템과 어긋나는 행동을 촉진하다가는 원래보다도 못한 결과를 얻을 수 있다. 그래서 슘페터가 이야기한 ‘창조적 파괴’라는 말이 이러한 상황을 잘 설명해 주고 있다. 새로운 것을 창조하기 위해서는 기존의 것, 과거의 것을 파괴해야 한다. 한국기업의 경영혁신은 주로 과거를 거부, 파괴하기보다는 기존의 것을 기반으로 개선하는 것이었다. 그러나 이제는 과거를 파괴할 줄 알아야 한다. ‘경쟁사보다 먼저 실행하는 시대’가 지나가고, ‘경쟁사와 다르게 창조하는 시대’가 도래하고 있기 때문이다. 물론 창조를 위해서는 과거의 경영 시스템 전체를 파괴해야 할지도 모른다.
(출처) LG경제연구원
'안티 잭 웰치' 경영 7원칙에 대한 나의 생각
첫째, 웰치가 주장한 '시장에서 1등 또는 2등이 돼야 한다'는 '틈새시장을 찾아 새로운 것을 창조해야 한다'로 대체됐습니다.
Web 2.0, Business 2.0이 트렌드가 뜨면서 Niche Business, LongTail에 신경을 써야할 것입니다. 특히 Red 오션 시장에 있는 기업일수록 타겟을 정해서 역량을 집중하는 것이 중요하지만 모든 상품이 반드시 타겟과 일치할 필요는 없고 잠재고객이나 다른 시장을 무시하는 오류를 범하지 말라는 말로 보입니다.
타겟도 세분화하여 선택과 집중의 논리를 적용해보이는 전략이 필요할 듯 합니다.
둘째, '대형 업체가 시장을 장악한다'는 원칙은 '민첩해야 하며 규모가 커서는 곤란하다'로 바뀌었습니다.
불확실성으로 가득한 시대를 살고 있는 기업들은 기술, 고객, 시장 등 다양한 측면에서의 환경변화 속도, 폭 그리고 그 영향력을 가늠하기 더욱 어려운 것이 현실입니다. 계속 변경되는 규제 요건, 고객 기대치 상승, 끊임없이 출현하는 신기술에 대처하며 시장에서 성공을 거두기 위해서는 민첩성이 필수적입니다.
다양한 형태의 대안을 찾아 활용하는데 경영자들은 자사의 역량을 집중시켜고 선택된 전략을 실행을 통해 성과를 평가하고 회사의 장기적 원칙을 철저히 고수하면서도 위기를 기회로 삼으려는 적극적인 자세를 가진다면 해당 기업은 민첨해지지 않을까요?
셋째, '주주들이 최고'라는 주주가치 경영에 대신에 '고객이 왕'이라는 고객 중심 마인드가 등장했습니다.
고객 만족을 넘어 고객 감동, 고객의 마음을 읽는 기업만이 살아남을 정도로 비즈니스에서 고객은 가장 중요합니다.
넷째, 구조조정을 강조한 '더 가볍고 날렵한 기업'은 '안이 아닌 밖에서 찾아라' 로 대체됐습니다.
구조조정 등 내부가 아닌 외부(신기술 개발, 비즈니스 모델 개발 등)에서 기업의 수익성을 높이는 방법을 찾아야 한다는 뜻입니다. 이젠 구조 조정만이 해답은 아니라고 봅니다. 이에 신기술이나 비즈니스 모델 개발에 장기적인 미래를 보면서 투자를 해야하는 혜안이 필요합니다. 그리고 실천력도 필요하죠.
대부분의 기업은 주주 가치 경영이라는 캐치아래 단기 수익만을 위한 경영을 가동하고 있어 장기적인 비젼 제시와 실현을 위한 이행전략이 많이 부족합니다. 더구나 실적이 안좋은 회사일 수록 더하죠.
그리고 기업의 구조조정만 해도 그렇습니다. 많은 기업들이 이에대한 노력과 연구를 해왔지만 현업에서는 기업의 조직이 슬림화하자고, 변화와 혁신을 하자고, 라는 변화관리 활동이라는 미명하에 자신이 처한 기업의 환경에 맞게 해야하는데, 그저 타사의 사례를 벤치마킹해서 자신의 회사에 맞든, 안맞든 상관하지 않고 완성도보다는 스피드가 우선처럼 여겨 이행하고 감독을 합니다.
하는건 좋은데 자기 기업이 Transformational Activity인지, Transactional인지, Tacit인지 파악한 다음 그에 맞는 이행전략을 수립하여 효율적으로 적용하는 것이 필요할 때입니다.
어느기업이든 눈이 보이지 않는 신기술이나 비즈니스 전략보다는 바로 눈에 보이는 구조조정을 선택하는 경우가 많습니다. 미래의 존재가치가 사라진다해도 당장의, 코앞의 가치만 판단한다면...
예로, 델은 컴팩과 휴렛패커드를 눌렀지만 규모의 경제를 극복할 수 있는 신기술과 비즈니스 모델에 신경쓰지 않았고. 구글이 그 같은 신기술과 비즈니스모델의 좋은 예로 고객들의 사랑을 받는 걸보면...
섯째, '자기사람을 만들고 A급 인재를 중용하라'는 인사정책은 창의성을 강조한 '열정적인 사람을 고용하라'로 바뀌었습니다.
앞서 포스트에서도 이야기도 했지만, 꿈(목표)을 가지고 자기가 해야 할 것을 찾고, 열정을 가지고 꿈을 이행하는 사람이 전 제일이라고 생각합니다. 그 생각에는 아직도 변함이 없습니다.
여섯째로 카리스마 있는 CEO보다는 '용기있는 CEO'를 고용하세요.
제가 CEO가 아니라 특별히 할 말은 없지만, CEO는 지식과 의사결정에서의 용단, 결단을 내렸으면 끝을 내는 완결성을 높이 사고 싶습니다. 그리고 보완적으로 사원들과의 격이 없는 의사소통을 통해 회사 내의 분위기를 파악할 필요가 있어 보입니다.
CEO와 직원의 생각의 차이가 없을려면요. 회사가 가는 방향과 직원들이 바라는 방향의 일치가 중요하니깐요.
그리고 CEO의 독단적 의사결정으로 기업 내 3%의 인원이 나머지 97%를 먹여 살리고 있다는 우리의 잘못된 조직 구조와 운영을 통해 볼 수 있듯이 나머지 조직 구성원은 언제나 소외되고 있는 상황에서 올바른 이해를 할 기회도 없이 또 다른 힘든 업무 부담을 안게 되는 좋지 않은 상황을 연출하게 되는 오류를 줄일 수 있어야 겠다.
일곱째는 자신의 권력을 경배하지 말고 자신의 영혼을 경배하라입니다.
CEO의 인생은 지신과의 싸움이요, 가장 고독한 자리라고들 합니다. 자신을 믿고 사원들을 믿으면 더 나은 회사를 만들지 않을까요? 끊임없는 자신의 투자가 첫번째이고, 사람들을 부리는 일이 두번째가 아닌가 생각됩니다.
주저리 주저리 두서없는 글입니다. 그래도 나중에 CEO가 되고픈 블로거분들에게 일말의 도움이라도 되었으면 합니다.
Java SSH/SFTP Library를 활용한 FTP 기능 구현
1. 관련 라이브러리 다운로드
- JSch - http://www.jcraft.com/jsch/
- SSHTools - http://sourceforge.net/projects/sshtools/( j2ssh)
전 SSHTools를 가지고 샘플 예제를 구현해 보았습니다.
2. 구현 샘플
package com.mimul.sample;3. 실행 결과
import com.sshtools.j2ssh.SftpClient;
import com.sshtools.j2ssh.SshClient;
import com.sshtools.j2ssh.authentication.AuthenticationProtocolState;
import com.sshtools.j2ssh.authentication.PasswordAuthenticationClient;
public class J2sshSftpCient
{
private SshClient client = null;
private PasswordAuthenticationClient auth = null;
private SftpClient sftp = null;
public J2sshSftpCient(String server, String user, String pwd) throws Exception
{
try {
if (server == null || user == null || pwd == null) {
System.out.println("Parameter is null!");
}
client = new SshClient();
client.setSocketTimeout(70000);
client.connect(server);
auth = new PasswordAuthenticationClient();
auth.setUsername(user);
auth.setPassword(pwd);
int result = client.authenticate(auth);
if (result != AuthenticationProtocolState.COMPLETE) {
throw new Exception("Login to " + server + ":22" +
user + "/" + pwd + " failed");
}
sftp = client.openSftpClient();
} catch (Exception e) {
System.out.println(e);
throw e;
}
}
public boolean put(String path) throws Exception
{
boolean rtn = false;
try {
if (sftp != null) {
sftp.put(path);
rtn = true;
}
} catch(Exception e) {
System.out.println(e);
}
return rtn;
}
public boolean get(String srcFile, String destFile) throws Exception
{
boolean rtn = false;
try {
if (sftp != null) {
if (destFile == null)
sftp.get(srcFile);
else
sftp.get(srcFile, destFile);
rtn = true;
}
} catch(Exception e) {
System.out.println(e);
}
return rtn;
}
public boolean lcd(String path) throws Exception
{
boolean rtn = false;
try {
if (sftp != null) {
sftp.lcd(path);
rtn = true;
}
} catch(Exception e) {
System.out.println(e);
}
return rtn;
}
public boolean cd(String path) throws Exception
{
boolean rtn = false;
try {
if (sftp != null) {
sftp.cd(path);
rtn = true;
}
} catch(Exception e) {
System.out.println(e);
}
return rtn;
}
public String pwd() throws Exception
{
String rtnStr = null;
try {
if (sftp != null) {
rtnStr = sftp.pwd();
}
} catch(Exception e) {
System.out.println(e);
}
return rtnStr;
}
public boolean chmod(int permissions, String path) throws Exception
{
boolean rtn = false;
try {
if (sftp != null) {
sftp.chmod(permissions, path);
rtn = true;
}
} catch(Exception e) {
System.out.println(e);
}
return rtn;
}
public boolean isClosed() throws Exception
{
boolean rtn = false;
try {
if (sftp != null)
rtn = sftp.isClosed();
} catch(Exception e) {
System.out.println(e);
}
return rtn;
}
public boolean logout() throws Exception
{
boolean rtn = false;
try {
if (sftp != null)
sftp.quit();
if (client != null)
client.disconnect();
rtn = true;
} catch(Exception e) {
System.out.println(e);
}
return rtn;
}
public static void main(String[] args)
{
try {
J2sshSftpCient jsftp = new J2sshSftpCient("remotehost", "userid",
"password");
boolean test = jsftp.cd("/home/k2/data");
System.out.println(jsftp.pwd());
boolean test1 = jsftp.lcd("C:/");
boolean test2 = jsftp.get("README.TXT", "README.TXT");
boolean isClosed = jsftp.isClosed();
boolean test3 = jsftp.logout();
System.out.println(test + " " + test1 + " " + test2 +
" " + isClosed + " " + test3);
} catch (Exception e) {
System.out.println(e);
}
}
}
Do you want to allow this host key? [Yes|No|Always]: yes 처리후 결과 화면성공적으로 파일이 C:/드라이브에 카피되었습니다. ^^
/home/k2/data
true true true true
Java Tips - List와 Collection의 초기화
List<String> str = new ArrayList<String>();
str.add("1");
str.add("2");
2. 좋은 습관1
List<String> str = new ArrayList<String>() {
{
add("1");
add("2");
}
};
3. 좋은 습관 2
List<String> str = Arrays.asList(new String[]{"1", "2"});
혹은
List<String> str = Arrays.asList("1", "2"); //jdk 5 이상
- 참고 사이트 : http://satukubik.com/2007/12/19/java-tips-initializing-collection/
2007년 Identity 분야 결산 - OpenID

1. Open 2.0 스펙과 라이브러리를 런칭되는 것을 볼수 있을 것이다라고 함
- OpenID 2.0의 주요 핵심 스펙인 OpenID Authentication2.0, OpenID Attribute Exchange 1.0가 2007년 12월 5일 Release되었다.
- 라이브러리도 OpenID Authentication 1.1과2.0, OpenID Attribute Exchange 1.0, OpenID Simple Registration 1.0를 구현한 JanRain PHP, Zend PHP, JanRain Python, Sxip Java, VeriSign Java, JanRain Ruby도 있다.
2. 1억명의 OpenID 사용자가 등장하게 될 것임
- 3번 내용과 맞물리는 경우인데 사이트가 늘어나면 그만큼 사용자가 늘어나게 되죠. 현재 기준으로 본다면 LiveJournal(1,000만), AOL(6,300만), MS의 Windows Vista 수용, France Telcom의 Orange수용(4,000만)의 수용으로 현재 1억명 이상이 가입하여 사용중임
- 향 후 Gmail(5,100만), Yahoo Mail(25,000만), Digg이 OpenID적용이 예상됨
3. 7500 OpenID Enabled Sites
- Identities Provider :VeriSign Personal Identity Provider, Myopenid, ClaimID, myID, Vidoop, Daum 등 50개이상
- Relying Parties : Wordpress, Technorati, Pumfit, IDtail, Revu, Blogger 등 입증된 사이트가 407개 사이트고 비공식 집계는 블로그 사이트와 등록되지 않는 사이트들을 합치면 10,000사이트는 넘어 보임
4. 빅 사이트들의 OpenID 수용
- AOL, Microsoft는 적용 했음.
- Google, Yahoo!, Apple, Digg 등은 진행중이라고 함
5. OpenID Community 공식화
- 공식 사이트 OpenID.net사이트는 활성화 되었고 그외 다양한 프로바이더나 컨슈머 사이트, 위키 등에서 다양한 형태로 이슈에 대한 논의가 진행되고 있음
6. OpenID Services
- OpendID기반의 수익을 주는 비즈니스 모델이 출현이 아직 안된점이 아쉽다. FOAF 등의 기술과 연합하여 People Network 등으로 활성화될 수 있어 보이는데 말이다
전반적으로 2007년 한해를 보면서 양적인 면(2.0스펙의 완료 ,Provider와 Comsumer사이트의 확장이 진행되고 빅 사이트에서도 도입이 예정됨)에서는 많이 OpenID가 활성화되어 있지만 수익 모델에 대한 부분, 보안 이슈에 대해서는 아직 많은 해결 과제들을 안고 있다.
앞으로는 OpenID의 완성도를 높이는 부분에 많은 집중이 되어야 할 것입니다.
Ning(Niche Social Networks) 서비스 소개
- 멤버 : 멤버들을 관리해 줄 수 있음
- 관리 : 자신의 페이지 관리를 할 수 있고 드래그 & 드랍으로 페이지 구성도 조절할 수 있음
- 포럼 : 자신이 토론하고 싶은 주제들을 올려놓고 다양한 토론문화를 형성할 수 있음.
- 블로그 : 블로그 포스팅이 가능하고 RSS를 통해 포스트 배포도 가능
- 포토, 비디오 : 멀티 미디어 포스팅을 통한 다양한 매체 지원
[북 리뷰] 직장인의 처세술 - 가설 사고
직장인들이 업무를 하면서 늘 마주치는 것이 완벽성과 속도의 두가지 딜레마에 빠지게 됩니다. 물론 이 딜레마의 뒤에는 항상 자신의 능력의 한계와 직장 상사의 꾸중을 직면하게 되고 결국 다시 업무를 조정하고 개선하게 됩니다.이런 반복적인 업무들의 연속이 되죠.
누가나 처음부터 직장 상사가 원하는 속도로 완벽에 가까운 지시사항을 수행하기란 천재가 아니고선 어렵습니다. 다들 공감하시겠죠.
이런 과오를 줄이기 위해서 나름대로 능력을 보완할려고 자기 개발을 하게 되고 선임자 즉, 멘토들에게서 노하우를 자기걸로 만들면서 업무를 진행합니다.
그러나, 지시 업무들은 항상 기존에 해 왔던 정보들과 자료, 암묵적인 멘토의 노하우들을 가지고는 해당 업무에 대한 정확성과 적중률을 높이는데는 문제가 많습니다. 더군다나 정보의 과잉으로 의사결정의 순간에 혼란을 겪게 되어 시간을 지연시키기 쉽상입니다.
또한 해당 업무가 기업의 경영 전략이나 사업 계획과 관련되었을 경우 그 파장은 조직 전체에 미치게 되고 파급 효과가 크다는 사실입니다. 그래서 파장의 크기에 따라 속도와 완벽의 두가지 딜레마를 모두 필요로 하는 경우도 있습니다.
이런 고민들을 일부 해결해 주는 방법론 중에 가설 사고라는 방법론입니다.
직감과 경험으로 임의의 해답을 찾아낸 다음 사후적으로 증명하고 분석하는 것을 가설 사고라고 합니다. 가설적 사고의 이점은 시간 낭비를 최소화하여 타이밍을 놓치는 실수를 예방하는 것 뿐만 아니라, 업무의 본질을 파악 못해 정책이 표류하는 오류를 사전에 방지할 수 있습니다.
그래서 우리는 올바른 가설을 만들기 위해 노력을 해야만 합니다. 가설에 대한 영감을 얻기 위해서 기존의 업무의 분석, 자료, 암묵적인 멘토의 노하우들을 해당 과제와의 상호 관련성을 심화하는 노력이 필요하게 되고 해당 가설의 검증을 거치게 되는데 검증 과정에서는 가장 심혈을 기울여야 됩니다. 기업의 내재화된 가치, 고객의 트랜드, 그리고 여러가지 이슈들을 조합하여 실험, 토론, 분석(정량적) 으로 검증을 합니다.
가설에 대한 영감과 검증 방법론들은 스스로 다양한 소스들을 가지고 내재화하는 노력은 또 필요로 할 것입니다.
좋은 방법론을 찾으실려면 아래의 책에서 찾아보세요. ^^ 나름 괜찮은 책으로 보입니다. 다소 컨설팅에 관련된 부분이 많을 순 있지만 자신이 처한 기업의 환경에 맞추는 게 필요하겠죠.
이 책의 저자는 다음과 같은 사람들에게 추천을 합니다.
- 비즈니스 경험이 적고 업무 진행이 느리며 판단력이 떨어지는 사람들
- 비즈니스 경험은 있지만 앞을 내다볼 수 없어 과감한 의사결정을 내리지 못하는 리더들
- 주어진 문제는 잘 해결하지만 스스로 문제를 만들어 내거나 발견하는 능력이 떨어지는 사람들
원대한 시야로 정확한 문제와 목표를 가지고 실험, 토론, 분석(정량적) 등의 검증 수단을 가지고 Change와 Trimming과정을 거쳐 진화하는 단계를 거쳐 바람직한 결론에 도달할 수 있도록 해봐야겠네요.
미흡하더라도 결론을 도출하고, 가지가 아닌 줄기를 그릴 수 있고, 실패의 경험을 공유하고 가까운 동료, 친구, 상사, 가족들의 멘토로 삼아 다양한 경험과 노하우를 채득하는 노력이 필요할 것 같습니다.
소셜 미디어 분석 블로거들
소셜 미디어 분석에 일가견이 있는 불로거들을 나열했습니다. 괜찮은 블로거들이 많군요. 한번 살펴보세요.
참고로 소셜 미디어 분석의 롤에 대한 정의 부분을 요약해 보았습니다. 이런 부류의 롤을 가진게 소셜 미디어 분석분야라고 하네요.
- 소셜 미디어 소스 모니터링
- 소셜 미디어 분석을 통해 주요 이슈 식별
- 차트나 비주얼툴을 통해 도식화
- 트랜드 분석
- 유명 블로거나 커뮤니티의 식별
- 주요 데이터를 키 기반으로한 분석 리포트
- 1000heads, Staff, 1000heads
- Andiamo Word of Mouth Marketing, John Hingley, Andiamo Systems
- Applied Disruption, Jeffrey Stewart, Monitor110
- Attentio, Simon McDermott, Attentio
- Attentionmax, Max Kalehoff, Nielsen BuzzMetrics
- Beyond Dante, Tim Wolters, Collective Intellect
- BlogPulse Newswire, Sue MacDonald, Nielsen BuzzMetrics
- Blogs et IE, Tarik Mousselmal, Scanblog (French)
- Buzzcentric, Severin Wilson, Buzzcentric
- BuzzLogic, Todd Parsons, BuzzLogic
- CGM, Pete Blackshaw, Nielsen BuzzMetrics
- China IWOM Blog, Sam Flemming, CIC
- Collective Intellect, Staff, Collective Intellect
- Customer Listening, Laurent Florès, CRMMetrix
- CustomScoop, Staff, CustomScoop
- Data Mining, Matthew Hurst, Microsoft Live Labs
- Data World, Paul Alexander, Wigborough
- DK the Business Guru, Darren Kelly, Collective Intellect
- DIGtrends, Staff, Digital Influence Group
- Distilled, Will Critchlow and Duncan Morris, Distilled
- dna13, Staff, dna13
- The Dooley Complex, Kevin Dooley, Crawdad Technologies
- ethority, Sten Franke, ethority
- filtrbox, Ari Newman, filtrbox
- GottaQuirk, Staff, Quirk eMarketing
- A Human Voice, Tom O’Brien, MotiveQuest
- Influence 2.0, Staff, Cymfony
- Information Arbitrage, Roger Ehrenberg, Monitor110
- Market Sentinel, Mark Rogers, Market Sentinel
- MarketIQ, Staff, Biz360
- MediaMeter, Staff, BlogMeter
- Mouthpiece, Jonathan Carson, Nielsen BuzzMetrics
- Musical Entrepreneur, Rob Crumpler, BuzzLogic
- New Media Strategies, Staff, New Media Strategies
- Observatoire Présidentielle 2007, Guilhem Fouetillou, RTGI (French)
- On Innovation, Michael Osofsky, Accelovation
- Onalytica, Flemming Madsen, Onalytica
- Ondernemer in Gent, Bart De Waele, MetaTale
- Pardon the Disruption, Chip Griffin, CustomScoop
- The Power of News, Matthias Hoffmann, Dow Jones & Company (German)
- PR Measurement Blog, Katie Paine, KDPaine & Partners
- PR meets the WWW Constantin Basturea, Converseon
- Primelabs (also Swedish blog)
- Read Between the Mines, Glenn Fannick, Dow Jones & Company
- RelevantNoise, Staff, RelevantNoise
- RepuMetrix, Joseph Fiore, RepuMetrix
- Reputation World, Andrew Jordan, Reputica
- RepuTrack, Joseph Fiore, CoreX Technologies
- Scanblog (French)
- Scout Labs, Staff, Scout Labs
- see i see, Staff, CIC (Chinese)
- SentimentMetrics, Staff, SentimentMetrics
- A Surplice of Spin, Melanie Surplice, Dow Jones & Company
- Turning News Into Knowledge, Brett Serjeantson, MediaMiser
- tweetpr, David Alston, Radian6
- Veille2Com, Cyrille Chaudoit, Scanblog (French)
- unstruc..., Daniela Barbosa, Dow Jones & Company
- VisInsights, Staff, Visible Technologies
- Young PR, Paull Young, Converseon
- 참고 사이트 : http://net-savvy.com/executive/social-media-analysis/bloggers-of-social-media-analy.html
사용성 평가의 중요성
예를 들어서 사용성 분석을 통해 어떤 물건을 구매할 경우 사용자의 경험 모델이..
사고자 하는 상품 종류 선정 -> 상품 정보 검색 -> 선 구매자의 경험 검색 -> 구매할 상품 결정 -> 상품의 가격 비교 -> 구매 사이트에서 구매
로 상품 구매 경험 모델이 결정 났을 경우에는 웹 기획 단계에서 서비스의 구성 시나리오는 이런 사용자의 경험 모델을 바탕으로 웹 사이트를 구성하게 하여 사용자의 경험을 매출로 이끌게 됩니다.
그리고 사용자의 경험을 유도할 수도 있습니다.
이 경우의 대부분은 사용자들이 해당 서비스의 개념을 잘 이해하지 못하는 경우로 이를 방치할 경우에는 죽은 서비스로 방치되게 됩니다. 이런 문제점을 분석하기 위해서 물론 사용성 평가를 하게 되고 여기서 문제점을 도출하게 됩니다.
사용자들이 해당 서비스의 개념을 이해하지 못할 경우, 특히 Ajax기능으로 무장된 웹 페이지의 경우에 그런 경우가 많습니다. 그래서 최종 진입 페이지에서 더 이상 진입이 안되고 나가는 경우 원인을 파악하여 대안을 만들어야 합니다.
그 중 하나가 샘플 페이지 형태로 맛보기 서비스를 기획하는 것입니다.
사용자의 진입 장벽(로그인, 개인 정보 제공 등)을 없애고 숨어 있는 다양한 기능들을 안내하는 것에만 그치지 않고 사용자가 직업 꾸밀 수 있는 페이지를 만듬으로써 몸소 체험하여 사용자의 만족도와 숨은 기능들을 알려주는 능동적인 기획을 해야 합니다.
이렇게 함으로써 사용자의 경험을 기획자의 의도대로 유도하여 새로운 사용자 경험 모델을 만들게 되고 이런 사용자 경험 모델을 프로세스스화(다른 서비스에서도 참조할 수 있도록)하여 서비스 기획에 참조를 하게 합니다.
결국 사용성 평가를 통해 사용자와의 의사 소통 기회가 많아지고 객관적인 측정 지표가 마련되면 사용자와 기업 모두에게 유익한 일이 될 것입니다.
그리고 이런 사용자 경험을 모델을 적용하고 난 다음 사용자의 물리적 행동 자취(Physical Trace), 마우스 트랙킹(Mouse Tracking) , Eye Tracking 기술을 통해 추가적으로 분석하여 정말 효과가 있었는지 증명이 필요합니다.
그 외 한번 클릭으로 가는데 발생하는 시간, 클릭으로 가는 사람들의 행동 패턴, 성별, 교육 수준등의 다양한 판단을 내고해야 좀더 객관화 될 것입니다.
Using Mylyn with JIRA - Video
미래 조직의 성공 키워드
< 목 차 >
Ⅰ. 現 조직은 미래 성공을 보장할 수 있는가?
Ⅱ. 경영자가 주목해야 할 ‘미래 조직의 키워드’
Ⅲ. 맺음말
I. 現 조직은 미래 성공을 보장할 수 있는가?
오늘날 기업들은 저마다 고유의 조직 운영 시스템을 만들어 활용하고 있다. 조직 운영 시스템을 일일이 열거한다면 아마 기업의 수만큼이나 많을 것이다. 그도 그럴 것이 기업마다 사업 전략이나 규모, 특성이 다르고, 경쟁하는 시장과 고객의 특성이 다르기 때문이다. 그러나 각 기업들의 조직 운영 시스템을 자세히 들여다 보면, 크게 두 가지의 공통된 특징을 발견할 수 있다.
우선 상하간의 명확한 계층을 기반으로 하는 ‘피라미드형’조직 운영 시스템을 첫 번째 특징으로 들 수 있다. 이는 20세기 초 독일의 막스 베버(Max Weber)에 의해 최초로 체계화된 조직 형태로서 계층별로 명확한 권한과 책임을 갖고 있으며, 위에서 아래로의 지시와 통제를 중심으로 운영되는 조직 형태이다. 의사 결정 시에는 개개인의 판단이나 감정보다 이미 설정된 역할이나 규정이 우선된다. 상하간 계층 구조에 입각한 피라미드형 조직은 구성원들이 자발적으로 움직이지 않고 위에서 명령을 해야만 움직이는 ‘관료주의(Bureaucracy)’라는 병폐를 가져오기도 했다. 그러나, 이러한 조직 형태는 여전히 월마트(WalMart)나 맥도날드(McDonald) 등의 글로벌기업을 지탱하는 조직 운영 시스템의 근간으로 자리잡고 있다.
두 번째로 사업 단위를 중심으로 하는 사업부제 조직 운영 시스템을 꼽을 수 있다. 이는 기업이 성장함에 따라 사업과 제품이 다양화되면서 나타난 것으로서, 각 사업이나 제품 단위의 조직이 개별 기업처럼 운영되는 형태이다. 즉 연구개발, 생산, 영업, 물류 등 주요 기능들을 각 사업부 조직에 포함시키고, 이들 조직이 사업에 대한 권한과 책임을 갖는 독립적 운영 체계이다. 사업부제 조직 운영 방식은 1920년대 GM을 이끌던 알프레드 슬로언(Alfred Sloan)에 의해 체계화되었고 수십 년간 GM 성장의 견인차가 되면서 많은 기업들로 확산되었다. 그 인기의 주된 비결은 사업부제 조직이 갖고 있는 고유의 특징에서 찾아볼 수 있는데, 예컨대 사업부별 성과가 명확히 드러나기 때문에 성과 제고를 위한 사업부간 경쟁을 도모할 수 있다는 점 등을 들 수 있다.
이상의 두 가지 특징은 오늘날 많은 기업에서 조직 운영의 기본 사상으로 자리잡고 있다. 여기서 기업을 경영하는 입장이라면 “피라미드형 조직, 사업부제 조직 운영 시스템으로 미래에도 성공할 수 있는가?”라는 질문을 해볼 수 있다. 상하간 명령이나 명확한 성과 책임에 기반한 자기 완결형 조직이라는 면에서는 분명 장점이 있지만, 이에 못지 않게 뒤따르는 치명적인 한계점도 드러내고 있기 때문이다. 예컨대 피라미드형 조직 체계에 익숙해진 구성원들에게 새로운 환경에 직면할 때마다 창조적이고 자율적 판단 능력을 발휘할 것을 기대하기란 쉽지 않다. 그렇다고 변화된 고객과 시장 환경에 대응하기 위해 구성원의 역할과 책임을 매번 다시 설정하고 교육하기에는 변화의 속도가 너무 빠르다. 다시 말해 피라미드형 조직의 합리적 운영 방식은 경영 환경이 안정적일 때에는 강점이 되지만 변화무쌍한 환경에서는 오히려 기업의 경쟁력을 저하시키는 약점이 될 수도 있는 것이다. 사업부제 조직 역시 예외는 아니다. 가장 큰 문제는 사업부간 경쟁의 심화로 기업 전체 차원에서의 협력과 시너지 창출이 힘들다는 점을 들 수 있다. 사업부들은 각기 자신들의 성과 목표 달성에 급급하기 때문에 타 부문과의 협력을 통해 더 큰 성과를 창출한다거나 외부 변화에 미리미리 대응하는 면에서는 상대적으로 관심이 소홀할 가능성이 크기 때문이다.
기업을 둘러싼 환경변화의 속도와 예측불가성을 고려해 볼 때 새로운 조직운영 시스템에 대한 고민은 기업경영자에게 더이상 미룰 수 없는 숙제가 되고 있다. 현 조직의 한계를 극복하고 미래 성공을 담보할 새로운 체계를 준비하기 위해서는 경영자의 미래 통찰력이 필수적이다. 따라서 미래조직의 트렌드와 효과적인 공략포인트를 살펴볼 필요성이 커지고 있다.
Ⅱ. 경영자가 주목해야 할 ‘미래 조직의 키워드’
성공하는 조직을 위해 경영자가 주목해야 할 미래 조직의 키워드는 변화(Change), 지식(Knowledge), 조화(Combination), 그리고 인간(Human)의 4가지로 요약할 수 있다. 이하에서는 각 키워드에 주목해야 하는 이유와 사례를 중심으로 시사점을 모색해 본다.
1. 변화 (Change)
미래 조직의 첫 번째 성공 키워드는‘변화(Change)에의 대응’이라 할 수 있다. 과거의 성공에 매몰되어 현실에 안주하는 기업은 살아남기 힘든 시대이다. 경영 환경 변화의 속도와 방향을 예의주시 하면서 남보다 먼저 변화에 신속히 대응하는 기업이 경쟁에서 앞서 나가는 시대라는 의미다. 세계적 컨설팅회사 페로 시스템(Perot Systems Corporation)의 회장으로 조직 변화 일원의 권위자인 제임스 챔피(James Champy)는“조직은 끊임없는 여행과도 같다. 성과라는 목적지를 향해 나아가면서, 지속적으로 민첩하고 유연하게 환경에 대응해야 한다”고 말한 바 있다.
변화 대응을 다른 말로 표현하면 시장과 고객 중심의 조직 운영이라 할 수 있다. 고객이 원하는 가치는 날로 다양화되고 있다. 또한 고객 니즈의 변덕스러움과 까다로움도 그 어느 때보다 심해지고 있다. 예컨대 핸드폰 경우‘통신 수단으로만 여기던 과거와 달리‘액세서리’,‘ TV’,‘ 인터넷 검색’등 고객이 가치를 느끼는 방식은 끊임없이 진화하고 있다. 또한 한 조사에 의하면 고객들의 핸드폰 교체 주기는 약 6개월이라 할 정도로 고객의 입맛 변화도 빨라지고 있다. 이러한 점을 고려해 볼 때, 고객과 시장 변화에 민첩하고 유연한 조직 운영 시스템을 갖추는 것이야말로 미래 조직에서 가장 우선시되는 포인트라 하겠다.
변화 징후의 선도적 포착
시장 변화 대응의 선결 요건은 변화 감지 역량이다. 시장과 고객의 변화를 빠르게 감지하기 위해서는 조직의 주파수가 고객에 맞춰져 있어야 한다. 동시에 일선의 모든 직원이 고성능의 안테나 역할을 할 수 있어야 한다. 직접 신제품을 체험해보는 고객들의 모습을 관찰함으로써 그들의 기호나 생각의 생생한 변화를 파악하여 제품 개발에 반영하기 위해 경영진이 일선 현장을 체험하거나 고객 체험관을 운영하는 등의 모습은 어렵지 않게 볼 수 있게 되었다. 중요한 것은 고객지향성이 한 두 사람의 노력으로 이루어져서는 안 된다는 점이다. 고객 접촉이 지속적으로 체질화되도록 조직 운영 시스템의 변화가 뒤따라야 한다.
하버드대 경제학 교수였던 갈브레이스는 기존의 제품 중심(Product-centric)조직에서 고객 중심(Customer-centric)조직으로 바뀌어야 한다고 주장한다. 이와 관련하여 제품과 고객를 두 축으로 하는 하이브리드형 조직을 제시하고 있다. 향후에는 제품 자체보다 제품을 둘러싼 고객의 니즈를 충족시킬 수 있는 통합 솔루션을 제공해야 한다는 점을 강조하는 것이다.
대표적인 사례로 노키아(Nokia)는 고객의 니즈를 재빨리 파악하고 반영하기 위해 전후방 하이브리드형 조직 체계를 운영하고 있다. R&D 분야의 경우에도 고객 또는 시장 관점의 제품 개발과 원천 기술 확보를 동시에 추구하기 위해 전후방 분리조직을 운영할 수 있다. 일례로 도요타(Toyota)는 최종적인 모델을 개발하는 전방의 개발센터와 별도로 후방에 기술센터 및 도요타 중앙연구소(Toyota CRDL)를 운영하고 있다. 또한 2006년 미국 내 전기/전자 업종의1위에 오른 에머슨(Emerson Electric)의 경우에도 4개의 기술센터(Advanced Technology Center)를 후방에 두고 전방 사업 조직과 플랫폼을 공유함으로써 환경의 변화가 기술 연구에 반영되는 조직 체계를 갖추고 있다.
변화 대응력의 체질화
변화를 감지했다면 이에 대응하는 능력이 중요하다. 변화 대응력은 일회성이 아니라 지속적인 능력으로 체질화되어야 한다. 이는 평소 고객 접점에서 적절한 의사결정이 자연스럽게 이루어질 때 가능하다. 그 대표적인 방법이 바로‘팀 조직’활성화를 들 수 있다. 일선 현장 구성원들이 해당 팀의 일을 스스로 선택하고 자율적이고 즉각적인 결정과 결과에 대한 책임을 지도록 평소에 훈련이 될 수 있기 때문이다.
팀 조직을 효과적으로 활용하는 대표적인 기업은 구글(Google)이다. 구글은 중요한 프로젝트를 시작할 때 소규모 자율 조직에서 출발한다. 여러 계층의 대규모 조직 대신 3명 정도의 작고 자율적인 엔지니어링 팀을 만들고 각자 작업 진행에 대해 폭넓은 재량권을 부여하는 것이다. 이들 팀간에는 관리자의 개입 없이 정보교환이 직접적으로 이루어짐으로써 상황과 여건에 최적화된 의사 결정이 빠르게 이루어진다. 일본 기업 교세라(Kyocera) 역시 최근‘아메바’라는 소규모 자율경영 팀조직으로 주목 받은 바 있다. 회장인 이나모리 가즈오 회장은 창업 당시부터 경영 여건이 여의치 않아 한정된 인재와 설비로 시장 동향에 따라 최적의 임기응변을 발휘해야만 했다. 따라서 현장 리더의 판단에 따라 수시로 팀이 이합집산 할 수 있는 체제가 불가피하였다. 그 결과 시장 상황이나 내부 전략 또는 성과 달성 정도에 따라 사업부 등 큰 규모뿐만 아니라, 아메바 단위 조직까지도 통합과 분할이 빈번한 조직이 만들어졌던 것이다. 교세라는 지금도 조직도가 매달 새로 작성되어 배포될 정도로 변화 대응의 유연성을 보여주고 있다.
2. 지식 (Knowledge)
기업의 성공을 위한 핵심 조건 중 하나는 혁신(Innovation)이라는 데에는 이견이 없을 것이다. 새로운 가치를 창출하는 지속적 혁신이 성공하려면 구성원 개개인의 지식과 창의성에 기반한 조직 창의력으로 경쟁사와 차별화를 이루어야 한다. 결국 남들이 아직 하지 않은, 남들이 아직 보지 못한 기발한 아이디어를 내고 이를 제품과 서비스로 상품화 할 수 있는 능력이 기업 생존의 근간이 된다.
조직의 지식 창출 역량을 높이기 위해서는 조직 운영 방식도 남달라야 한다. 즉 지식의 흡수와 축적이 지속적으로 이루어지고 이를 조합하여 새로운 지식을 창출하는‘지식 창출’프로세스가 체계화되어야 한다.
사실 지식은 20세기 후반부터 조직 성공의 핵심적인 요소로 간주되고 있다. 경영학의 권위자 피터 드러커(Peter F. Drucker)는“미래에는 지식이 기업의 가치 창출과 개인 경쟁력의 원천이 되고 지식 근로자가 조직의 핵심이 되는‘지식 사회’가 도래할 것이다”라고 예견한 바 있다. 또한 앤더슨 지식역량센터(Anderson Center for Thought Leadership)의 대표이자 최고경영자에 관한 연구로 유명한 아이언 소머빌(Iain Somerville)은 “향후 최고 경영자의 역할은 지식 자산을 평가하고, 인정하고, 그것에 대가를 지급함으로써 지식을 축적하고 시장을 창조하는 지식 자본가의 역할로 변할 것이다”라며 지식의 중요성을 강조하고 있다.
지식 역량의 효과적 제고
지식이 무엇보다 중요시되는 대표적인 부문으로 R&D 조직을 들 수 있다. 얼마 전까지만 해도 국내 대부분의 R&D 분야는 제품 중심적 조직으로 적절한 타이밍의 제품 출시가 가장 큰 관심사였다. 반면 글로벌 선도 기업들은 대부분 기술 중심적 메트릭스 조직을 운영함으로써 새로운 시장을 창출할 수 있는 고도의 기술 역량을 지속적으로 축적하고 있다. 이처럼 기반 기술 즉, 전문성을 중시하는 미래형 R&D 조직 구조의 대안 중 하나로 기술 중심의 메트릭스 구조를 고려할 수 있다.
이미 세계 최고의 자동차 기업으로 등극한 도요타는 CE(Chief Engineer)라고 불리는 최고 엔지니어를 제품 개발의 총괄 담당으로 운영하는 독특한 메트릭스 조직 구조를 발전시켜 왔다. 제품의 기획부터 출시까지 CE가 총괄하되 각 개발 단계별로 기술 조직으로부터 지원과 협력을 통해 하나의 모델 개발 프로젝트를 완성해나가는 형태이다. 일본 제일의 혁신 기업으로 인정받고 있는 생활용품 업체 가오(Kao) 역시 기술 중심 메트릭스 조직을 통해 핵심 기술 역량을 축적하고 있다. 중앙연구소인 Kao Global R&D는 상품개발 연구소와 기초 기반기술 연구소가 서로 협력하는 전형적인 기술 중심적 메트릭스 형태로 운영되고 있다.
지식 재창출 프로세스의 정착
보다 발전된 형태의 지식 창출 조직은 이른바 지식경영 조직 또는 학습형 조직으로 알려진‘하이퍼텍스트형 조직(Hypertext Organization)’이다. 지식 이론의 전도사로 불리는 일본의 노나카 이쿠치로 교수가 저서 「지식창조기업 (The Knowledge-Creating Company)」에서 소개한 하이퍼텍스트 조직은 사업단위, 프로젝트팀, 지식기반이라는 세 개의 층을 주요 단위로 한다. 각 계층은 상호 연결되어 마치 인터넷에서 입체적으로 구현되는 하이퍼텍스트 문서 형태와 같은 구조를 보여준다. 동일 조직 내에 존재하는 완벽하게 성격이 다른 세 가지 층에서 외부로부터의 지식 습득, 체화, 재창출이 지속적으로 이루어지는 것이다.
대표적인 사례로 일본의 전자 기업 샤프(Sharp)를 들 수있다. 조직의 중심은 일상적인 업무가 이루어지는 사업 단위로 기능 중심의 계층 구조이다. 최상층은 프로젝트팀으로 여러 부서에서 모집된 인원이 프로젝트 조직을 이루어 신제품 개발과 같은 지식 창조 활동에 집중한다. 맨 아래 계층은 지식기반층으로 위의 두 계층에서 생성된 지식을 재분류하고 재구성한다. 지식기반층은 조직적인 실체로 존재하지는 않지만 기업의 비전, 문화, 기술 등에 구현되어 나타나는 계층이라 할 수 있다.
3. 조화(Combination)
이미 많은 경쟁 영역에서 해외 시장과 국내 시장의 구분은 무의미해지고 있다. 미국 미시간 대학교 경영대학원 프라할라드(Coimbatore K. Prahalad) 교수는“미래에는 대규모에서 소규모에 이르는 다양한 크기의 다국적 기업들이 탄생할 것이다. 기업의 성격과 크기를 결정하는 데 세계화의 영향은 더욱 더 커지게 될 것이다”라며 글로벌화의 영향력을 강조한 바 있다.
글로벌화는 필연적으로 사업의 지리적 확장을 가져오기 때문에, 조직 운영 측면에서 여러 지역에 퍼져있는 조직이나 기능들을 유기적으로 연결하면서 시너지를 창출하는‘조화(Combination)’또는‘통합(Integration)’역량이 필수적으로 요구된다. 경영을 글로벌 현지에 너무 위임만 할 경우에 소위 탈중심화의 부작용이 나타날 수 있기 때문이다. 동일한 브랜드의 호텔임에도 지역마다 동일 메뉴에 대한가격과 서비스가 상이하여 고객 불만이 발생하는 경우가 여기에 해당된다. 또 다른 예로 1992년 실적 악화로 파산 위기에 놓였던 IBM에서는 전사적인 목표와 개별 사업부 목표가 일치하지 않아 일어나는 부작용을 경험하였다. 판매사원들이 고객 앞에서 타 사업부의 제품을 비방하는가 하면 동일 고객에게 IBM의 각기 다른 사업부가 경쟁적으로 입찰하는 등 폐해가 나타났던 것이다.
이런 극단적인 폐해를 방지하기 위해서는 널리 퍼져있는 다양한 조직들을 하나로 결집시키고 기업의 전략 달성에 도움이 되는 방향으로 조화롭게 이끌어나가는 방안을 강구해야 한다. 이를 위한 하나의 방안으로‘통합 정보 시스템’을 들 수 있다. GE, 지멘스와 더불어 세계 3대 중전기 업체로 꼽히는 ABB사의 글로벌 네트워크 시스템인‘ABACUS’는 전 세계에 5천여 개의 이익센터를 중심으로 운영되는 분권화 조직을 통합 관리하는 시스템이다. 이 시스템을 통해 ABB는 필리핀의 복합 싸이클 발전소를 건설하는데 4개국의 ABB 자회사들이 컨소시엄을 이루었으며 영국/프랑스 해협의 해저고속철도 환기 시스템 사업에는 30여 개 국의 ABB자회사들이 협력하는 등 글로벌 통합 효과를 높일 수 있었다.
기업 내부의 수평적 통합과 조화
위와 같이 IT를 활용한 정보 시스템에서 한 걸음 더 나아가 조직운영시스템 관점의 근본적인 대안을 고려해 볼 수 있다. 예를 들어 조직의 다양한 기능들이 별개로 움직이지 않고 일련의 업무 프로세스에 따라 유기적으로 협력하여 움직이도록 하는 횡적 통합이 그것이다. 1990년 함머(M. Hammer)는 이런 개념에서 출발한 프로세스 조직을 소개하였는데, 그 핵심 사상은 비즈니스 리엔지니어링(Business Re-engineering) 이론이다. 기업이 획기적인 성과를 얻으려면 조직 구조뿐만 아니라 사람, 직무, 경영관리 시스템, 가치관 등 총체적인 비즈니스 시스템이 프로세스를 중심으로 새롭게 개편되어야 한다는 것이다. 프로세스 조직에서는 전통적인 조직의 기능별 세분화와는 다른 조직 분화가 일어난다. 즉, 임무의 진행 프로세스를 중심으로 기존의 종적 계층 구조가 아닌 횡적인 다기능(Cross-functional) 구조로 구성되는 것이다. 조직 운영의 초점은 상하간의 지시와 통제보다는 수평적인 업무 협조와 조정에 맞춰져 있다. 직무는 세분화, 전문화보다 통합과 시너지 효과가 중시된다. 또한 내부적인 관리보다는 고객의 요구에 더 초점이 맞춰져 있어 시장의 요구에 신속하게 대응할 수 있다. 조직 내 원활한 정보의 흐름도 자연스러워져 조직간 장벽 현상이 최소화될 수 있는 점도 긍정적 요소이다.
프로세스 조직의 대표적인 사례로 포드(Ford)사의 고객서비스 부문(FCSD)를 들 수 있다. 기능별 조직이었던 FCSD는 1990년대 들어 부서간 장벽의 발생으로 부문간 협조가 원활하지 못해 고객 요구에 대응이 느려지는 문제가 발생하였다. 또 서비스가 표준화되지 않아 지역에 따라 고객 만족도의 편차도 커지고 있었다. 신차 구입 1년 후의 고객 만족도는 독일 자동차 회사의 절반도 안되었고 10년 후 만족도는 10분의 1에 불과할 정도였다. 문제를 인식한 회사는 1995년‘Ford 2000’을 선포하면서 고객 가치에 대한 면밀한 분석을 토대로 4개의 핵심 프로세스를 규명하였다. 이에 따라 기능 조직으로 운영되던 고객서비스 부문을 프로세스 조직으로 개편하였다. 그 결과 FCSD의 고객만족도 및 생산성은 크게 증가하였으며 종업원 만족도 역시 다른 기능 부문에 비해 프로세스 조직에서 크게 향상된 것으로 나타났다.
기업 외부와의 연결과 협력
또 다른 형태의 수평적 조직의 형태로‘네트워크 조직’을 들 수 있다. 향후 선택과 집중 전략을 통한 차별화된 핵심 역량의 보유는 성공의 필수 요건이라 할 수 있다. 네트워크 조직은 중요한 부문에 자원을 집중하고 필요한 다른 역량은 아웃소싱 등을 통해 외부 전문 역량을 활용하는 형태로 핵심 역량 확보에 매우 유리하다. 네트워크 조직의 이점을 잘 보여주는 사례로 1995년 미국 3대 자동차 회사와 부품업체 연합체가 구성한 미국 자동차 업계의 인터넷 정보망 ANX(Automotive Network Exchange)를 들 수 있다. ANX를 통해 자동차 회사는 부품 공급의 효율성과 비용 절감 효과를 누리면서 동시에 자사 내 필요한 곳에 역량을 집중할 수가 있었다.
네트워크 형태의 조직 운영 시스템이 가장 활발하게 활용되는 부문 중 하나가 제약 분야이다. 제약 기업의 특성 상 신약 개발을 위해 다른 제약 기업, 바이오벤처기업, 대학, 연구소, 병원 등과 공동 연구 등 다양한 형태의 협력으로 이루어지는 지식 생산 체계가 필수적이기 때문이다. 미국의 대표적인 제약회사인 머크(Merck)는 뉴저지와 펜실베니아 등 미국내 연구소 외에 영국, 프랑스, 이탈리아, 스페인, 일본 등지에 8개 연구소를 두고 있다. 그럼에도 불구하고 제네카(Zeneca)라는 제약회사와 항생제 연구 제휴를 맺는 것을 비롯하여 12개의 바이오 벤처기업 및 2개의 대학교, 1개의 병원 연구소 등과 네트워크 형태의 협력 체계를 구축하고 있다.
1990년대 후반 PC업계의 돌풍을 몰고 왔던 델(Dell) 컴퓨터 역시 네트워크형 조직 구조가 성공의 견인차로 평가되고 있다. 칩 생산자와 부품 생산자, 악세서리 생산자와의 완벽한 정보 네트웍트를 구축하였던 것이다. 고객의 주문이 바로 협력업체로 전달되도록 하고 포장과 운송 등 물류 관리는 아웃소싱함으로써 델컴퓨터는 오직 제품의 품질과 디자인, 마케팅서비스에 역량을 집중할 수 있었던 것이다. 세계 120여 개국의 5천 개 이상의 소매점을 거느릴 의류 회사 베네통(Benetton) 역시 본사와 본사 내 자체 공장, 하청 공장, 판매 대리인과 소매점들이 거미줄처럼 연결된 네트워크 조직의 혜택을 잘 보여주는 사례이다.
4. 사람 (Human)
마지막으로 미래의 기업 환경에서 반드시 짚고 넘어가야 할 요소로 ‘인간 가치(Human Value)’를 들 수 있다. 종업원 개인 가치는 조직 가치에 비해 상대적으로 덜 중요시된 경향이 있었다. 기업의 존재 이유로 이윤 극대화가 강조되었던 탓이라고 볼 수도 있다. 그러나 미래 기업에서는 전통적인 조직의 추구 가치에 대한 변화가 예상된다. MIT 경영대학원 교수인 토마스 말론(Thomas Malone)은 저서 「노동의 미래(The Future of Work)」에서“미래에는 인간적 가치를 비즈니스의 중심에 놓는 기업이 되어야 한다”고 말한다.
향후에는 부의 축적이 비즈니스의 유일한 목표가 아닐 수 있다는 점을 지적하고 있는 것이다. 또한 런던 비즈니스 스쿨의 수만트라 고샬(Sumantra Ghoshal) 교수와 하버드 비즈니스 스쿨의 석좌 교수인 크리스토퍼 바틀렛(Christopher Bartlett)은 공동 저서인 「개인화 기업(The Individualized Corporation)」에서 제도적인 장치보다는 개성과 자유 의지를 가진 인간의 가치를 더 중시하는 조직이 될 것이라고 말한 바 있다.
인본주의적 가치의 중시
실례로 윤리 경영의 모범으로 회자되고 있는 존슨앤존슨(Johnson and Johnson)은 사훈에서 고객, 종업원, 지역사회의 이익을 주주의 이익보다 우선시한다는 입장을 분명하게 밝히고 있다. 존슨앤존슨에는 정직(Honest), 존경(Respect), 공정(Fairness), 신뢰(Trustworthy) 등의 요소를 포함한 크레도(Credo)라 불리는 60년 이상 다듬어진 조직의 가치 체계가 있다. 사실 존슨앤존슨의 모범적인 윤리경영은 크레도가 조직 내에 체화된 결과라고 볼 수 있다.
세계 굴지의 전력 회사로 1981년 설립된 미국의 AES(Applied Energy Services) 역시 기업 경영의 목적을 공정(Fairness), 정직(Integrity), 사회적 의무(Social Resposibility), 재미(Fun)라는 비경제적인 가치로 천명하고 있다. 이런 원칙은 모든 종업원이 작은 CEO가 되어 회사의 중요한 결정에 직접 참여하는 책임을 가져야 한다는 철학을 바탕으로 하고 있다. 특히 정보의 외부 유출 위험보다 제대로 된 의사 결정을 위해 직원 모두가 경영자와 같은 정보를 공유하고 있다. 구성원을 경영자로 신뢰하는 AES는 지난 20년이 넘도록 눈부시게 성장과 발전을 거듭하는 활력 넘치는 회사로 주목 받고 있다.
인간의 가치를 존중하는 측면에서 주목할 만한 미래의 조직 모델로‘민주화 조직’을 들 수 있다. 구성원 개인에게 더 많은 자율권을 보장하는 것을 넘어 조직 내에서 스스로의 가치를 느낄 수 있도록 하는 데 초점이 맞추어진 형태이다. 고어텍스(Gore-tex) 방수천으로 잘 알려진 고어앤드어소시에이츠(W. L. Gore & Associates)에서 볼 수 있는 민주적 의사 결정 시스템이 대표적인 사례이다. 이 회사는 사장과 비서를 제외한 모든 구성원이 공식 직함 없이 서로를 동료(Associate)라고 부른다. 관리자로 승진하기 위해서는 성과를 내기보다 함께 일하고 싶어하는 동료를 많이 만들어야 한다. 또한 관리자라 하더라도 다른 사람들의 동의를 얻지 못한 프로젝트는 진행할 수 없다. 심지어 위원회에서 이루어지는 급여 결정의 주된 고려 사항은 동료들이 쓴 업무 평가서이다. 직원의 됨됨이는 동료들이 가장 잘 안다는 사상이 깔려 있는 것이다. 참여적 의사 결정 시스템은 활기차고 창조적인 일터를 조성하는 근본 동력이 되고 있다. 고어사의 직원 97%가 근무조건에 만족하고 있으며 공식적 R&D 부서가 없는데도 회사는 일반 직원들의 신선한 아이디어 덕분에 매년 혁신적인 신상품을 내놓고 있다.
민주화 조직의 또 다른 형태로 인터넷 경매 회사 이베이(eBay)를 들 수 있다. 온라인 상에서 구매자와 매매자간 활발하게 교류되는 다양한 의견은 회사의 중요한 지식 자산이 된다. 또 회사의 고객인 구매자와 매매자 모두 마치 사이트의 운영자인 것처럼 회사의 운영에 관여하고 있다. 이베이의 웹사이트와 온라이 커뮤니티에는 수십 개의 토론장이 갖추어져 있으며 중요한 결정은 온라인 토론을 통해 사용자들의 동의를 얻어 진행된다. 이런 운영 시스템 덕분에 1995년 피에르 오미디아르(Pierre Omidyar)에 의해 설립된 이베이는 미국에서 가장 빠른 성장가도를 달리고 있다. 그 바탕에는 대규모의 온라인 커뮤니티에 주인의식을 고취시키는 온라인 민주주의라고 하는 새로운 형태의 조직 운영 방식이 있다.
III. 맺음말
피터 드러커는 미래 조직에 관한 비유로 오케스트라형 조직을 자주 인용하였다.“ 훌륭한 오케스트라처럼 미래에는 고도로 숙련된 전문가와 최고경영진이라는 두 개의 계층이 존재하는 조직만이 남을 것이다.”라는 말을 하기도 하였다. 구성원 모두가 일류 전문가인 오케스트라는 지휘자가 연주 하나하나를 지시하지 않는다. 각 연주자는 자신의 악기가 가진 최대의 표현력으로 전체 흐름에 기여한다. 변화와 지식, 조화와 인간이라는 미래 조직 키워드가 모두 녹아 있는 조직 모델의 비유라고 할 수 있다.
조직의 내, 외부적 환경에 적절한 조직 운영 시스템을 설계하는 것은 하나의 조직을 이끌어가는 최고 경영자의 가장 중요한 임무이다. 시간이 지날수록 최고경영자의 조직 설계 역량은 더욱 중요하게 부각되고 있다. 그러나 기업이 안고 있는 문제점을 해결하기 위해 조직 구조 개편에만 지나치게 의존하는 것은 바람직하지 않다. 조직을 검토할 때에는 지나치게 이론적으로 접근하거나 특정한 성공사례를 무분별하게 모방하는 오류를 주의해야 한다. 현재의 문제점에만 집착하는 대증요법적 대처나 임기응변도 피해야 한다. 지나치게 혁신적, 급진적으로 조직을 개편하는 것은 구성원들의 반발을 야기하거나 수용도가 지나치게 낮아 문제 해결은커녕 또 다른 문제를 일으킬 가능성이 높다는 점도 기억할 필요가 있다.
모든 니즈를 충족시켜줄 이상적인 조직 운영 시스템은 현실적으로 존재하기 어렵다. 조직 설계는 지금까지의 성공 요인과 강점을 해치지 않으면서 동시에 당면하고 있는 제약 조건과 약점을 극복할 수 있는 방안에 대한 모색에서 출발해야 한다. 동시에 조직의 역량 수준과 분위기는 어떠한지, 조직이 기대하는 전략적 목표는 무엇인지를 충분히 고려하는 진화론적 접근이 바람직하다.
(출처) LG경제연구원
High Performance Ajax Applications
웹 프로그래밍을 하게되면 성능은 항상 강조해도 지나치지 않는 법이죠. 웹 클라언트 사이드에서 성능을 향상할 수 있는 방법들을 자세하게 일목요연하게 표현했네요.
JIRA 설치기
이슈툴로 많이들 사용하고 있는 상업용 프로그램인 Jira의 설치 방법을 공유합니다. 이슈 추적을 하시려눈 분들에게는 좋은 툴이죠.
아래는 Tomcat 5.5대 기준으로 설치방법을 설명하겠습니다. 그리 어렵지는 않습니다.
1. 다운로드 파일을 받아서 압축을 푼다
주의 사항 : OS에서 기본으로 제공하는 압축툴은 버그가 있어 사용하지 말라고 합니다. 여기를 참고하세요.
JIRA Standalone, JIRA WAR, EAR 설치 두가지 방법이 있습니다. 차이는 Standalone은 자체에 서버(Tomcat 5.5)를 제공하고 WAR, EAR은 기존 서버에 포팅하는 순으로 설치됩니다.
readme.txt 파일을 보고 따라합니다.
2. 설정
- edit-webapp/WEB-INF/classes/entityengine.xml 편집
: mysql DB를 사용할 경우 field-type-name="mysql" 수정해 준다
: transaction-factory부분에 jndi-name부분에 env추가해 준다
- common/lib에 objectweb-datasource-1.4.3.jar, mysql-connector-java-3.1.14-bin.jar 카피
3. Build
- ./build.sh파일을 실행하면 WAR파일이 생성됩니다
- dist-tomcat/tomcat-5.5/jira.xml을 Catalina/localhost/에 카피한다 Tomcat 6.0일 경우 server.xml 에 아래 내용을 추가해 준다
<Context path="/jira" docBase="/home/k2/www/atlassian-jira-enterprise-3.8/- $CATALINA_HOME/conf/server.xml에 useBodyEncodingForURI="true" Connecter에 useBodyEncodingForURI="true" 추가해 준다
dist-tomcat/atlassian-jira-3.8.war" debug="0">
<Resource name="jdbc/JiraDS" auth="Container"
type="javax.sql.DataSource"
username="jirauser" password="jirauser"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/jiradb?autoReconnect=true
&useUnicode=true&characterEncoding=utf-8
&mysqlEncoding=utf8"
maxActicve="20"
maxIdle="3"
removeAbandoned="true"
maxWait="3000" />
<Resource name="UserTransaction" auth="Container"
type="javax.transaction.UserTransaction"
factory="org.objectweb.jotm.UserTransactionFactory" jotm.timeout="60"/>
<Manager className="org.apache.catalina.session.PersistentManager"
saveOnRestart="false"/>
</Context>
4. 메모리 고정
- 메모리 많이 사용하는 관계로 out of Memory현상을 방지하기 위해서 catalina.sh파일에 아래와 같이 설정을 추가해 준다
- export CATALINA_OPTS="$CATALINA_OPTS -Dorg.apache.jasper.runtime.BodyContentImpl.LIMIT_BUFFER=true"
5. mysql에 database 생성
- shell>mysql -u root -p
- mysql> create database jiradb;
- mysql> grant all on jiradb.* to jirauser@localhost identified by 'jirauser';
- FLUSH PRIVILEGES;
6. Setup Wizard 수행
- 이렇게 함으로써 http://localhost/jira를 호출하여 Setup Wizard를 자동 수행하여 성공적인 jira 패키지의 설치가 이루어집니다.
그리고 Mylyn 플러그인을 통해 이클립스에서도 관리할 수 있습니다. 이슈 트래커에서 벌어지는 작업 추적을 로컬로 동기화해서 작업 별로 리소스 사용 내역을 같이 기억해줌으로써, 나중에 특정 이슈에 대해 다시 작업할 때도 예전 작업과 비슷한 상황에서 꼭 필요한 리소스에만 관심을 집중할 수 있게 해줍니다.
Java Tips - Setter/Getter 함수 정의시의 발상의 전환
1. 소스
public class Member {
private String username;
private String password;
private String name;
private Integer age;
private String email;
public Member(String username, String password,
String name, Integer age, String email)
{
this.username = username;
this.password = password;
this.name = name;
this.age = age;
this.email = email;
}
public Member()
{
}
public String getUsername()
{
return username;
}
public Member setUsername(String username)
{
this.username = username;
return this;
}
public String getPassword()
{
return password;
}
public Member setPassword(String password)
{
this.password = password;
return this;
}
public String getName()
{
return name;
}
public Member setName(String name)
{
this.name = name;
return this;
}
public Integer getAge() {
return age;
}
public Member setAge(Integer age) {
this.age = age;
return this;
}
public String getEmail() {
return email;
}
public Member setEmail(String email) {
this.email = email;
return this;
}
public static void main(String[] args){
Member m = new Member();
m.setUsername("mimul").setPassword("1234").setName("미물")
.setEmail("pepsi@paran.com").setAge(30);
System.out.println(m.getUsername());
System.out.println(m.getPassword());
System.out.println(m.getName());
System.out.println(m.getEmail());
System.out.println(m.getAge());
}
}
2. 결과 내용
mimul
1234
미물
pepsi@paran.com
30
iBatis에서 쿼리 로그 가독성 있게 뿌려주기
- http://ibatis.apache.org/javadownloads.cgi
2. 대상 소스 수정
- com.ibatis.common.jdbc.logging.ConnectionLogProxy.java
//log.debug("{conn-" + id + "} Preparing Statement: " +
removeBreakingWhitespace((String) params[0]));
log.debug("{conn-" + id + "} Preparing Statement: " + ((String) params[0]));
...
//log.debug("{conn-" + id + "} Preparing Call: " +
removeBreakingWhitespace((String) params[0]));
log.debug("{conn-" + id + "} Preparing Call: " + ((String) params[0]));
- com.ibatis.common.jdbc.logging.PreparedStatementLogProxy.java
//log.debug("{pstm-" + id + "} Executing Statement: " +
removeBreakingWhitespace(sql));
log.debug("{pstm-" + id + "} Executing Statement: " + (sql));
- com.ibatis.common.jdbc.logging.StatementLogProxy.java
//log.debug("{stmt-" + id + "} Statement: " +
removeBreakingWhitespace((String) params[0]));
log.debug("{stmt-" + id + "} Statement: " + ((String) params[0]));
- com.ibatis.sqlmap.engine.mapping.sql.SqlText.java
//this.text = text.replace('\r', ' ').replace('\n', ' ');
this.text = text;
- com.ibatis.sqlmap.engine.mapping.sql.stat.StaticSql.java
//this.sqlStatement = sqlStatement.replace('\r', ' ').replace('\n', ' ');
this.sqlStatement = sqlStatement;
- Eclipse에서 New>Project>Java Projec를 선택하여 프로젝트를 생성
- C:\iBatis\bin : 컴파일 디렉토리
- C:\iBatis\src 컴파일 소스 디렉토리
- 수정 대상 소스를 C:\iBatis\src 에 카피한다음 C:\iBatis\bin으로 빌드 패스 지정해서 빌드한다.
- C:\iBatis\bin 디렉토리에 다운 받은 ibatis-2.3.0.677.jar파일을 압축푼다.
4. jar 재묶음
- C:\iBatis\bin 디렉토리로 이동하여 jar cvf ibatis-2.3.0.677_mimul.jar ./ 실행하여 jar파일을 재생성함
- ibatis-2.3.0.677_mimul.jar 파일을 ProjectRoot\WEB-INF/lib에 카피함
5. 결과 로그
[2007-12-10 19:33:54,578] DEBUG : Executing Statement:
SELECT mseq, menuid, title, imgurl, vodurl, use, chgdate
FROM mimul
WHERE mseq = ?
[2007-12-10 19:33:54,578] DEBUG : Parameters:[1]
[2007-12-10 19:33:54,578] DEBUG : Types:[java.lang.Integer]
[2007-12-10 19:33:54,593] DEBUG : [MSEQ, MENUID, TITLE, IMGURL, VODURL,
USE, CHGDATE]
[2007-12-10 19:33:54,593] DEBUG : [1, 1,
Oxford Reading Tree, main_btn1_1_on.png,
main_btn1_1_off.png, 2, 200712071310466]
쿼리를 쉽게 한눈에 볼수 있게됩니다. ^^
DBCP와 iBatis를 통한 Connection Pooling 사용기
일단 Tomcat 환경에서 설치 과정을 설명하겠습니다.
1. DBCP 설치
- 실치 과정은 여기에 가시면 설치과정을 설명해 놓았습니다.
2. iBatis 설치
- 여기에 가서 다운로드
- ${ProjectWebRoot}/WEB-INF/lib에 ibatis-2.3.0.677.jar 카피
3. sqlmap.xml 정의
<?xml version="1.0" encoding="UTF-8" ?>4. com/mimul/dwr/app/resource/database.properties 정의
<!DOCTYPE sqlMapConfig
PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"
"http://www.ibatis.com/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<properties resource="com/mimul/dwr/app/resource/database.properties"/>
<settings
cacheModelsEnabled="true"
enhancementEnabled="true"
lazyLoadingEnabled="true"
maxRequests="40"
maxSessions="20"
maxTransactions="5"
useStatementNamespaces="false"
/>
<transactionManager type="JDBC">
<dataSource type="DBCP">
<property name="driverClassName" value="${driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
<!-- OPTIONAL PROPERTIES BELOW -->
<property name="initialSize" value="5"/>
<property name="maxActive" value="30"/>
<property name="maxIdle" value="20"/>
<property name="maxWait" value="60000"/>
<property name="poolPreparedStatements" value="true"/>
<property name="validationQuery" value="select 0 from dual"/>
<property name="testOnBorrow" value="true"/>
<property name="maximumActiveConnections" value="10"/>
<property name="maximumIdleConnections" value="5"/>
<property name="maximumWait" value="60000"/>
<property name="logAbandoned" value="false"/>
<property name="removeAbandoned" value="false"/>
<property name="removeAbandonedTimeout" value="50000"/>
</dataSource>
</transactionManager>
<sqlMap resource="com/mimul/dwr/app/sql/Mimul.xml"/>
</sqlMapConfig>
driver=oracle.jdbc.driver.OracleDriver5. com/mimul/dwr/app/sql/Mimul.xml 정의
jdbc.url=jdbc:oracle:thin:@mimuluserdb:1521:mimuluser
username=mimuluser
password=mimuluser
- DDL2iBatis.exe를 활용하여 자동 생성하게 하는 것이 개발 속도가 올라갑니다.
<?xml version='1.0'?>6. DAO에서 사용하기 위한 SqlConfig 객체 정의(dbcp+ibatis연결 정보 정의)
<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"
"http://www.ibatis.com/dtd/sql-map-2.dtd">
<sqlMap namespace="Mimul">
<cacheModel id="mimul-cache" type="MEMORY">
<flushInterval hours="24"/>
<flushOnExecute statement="insertMimul"/>
<flushOnExecute statement="updateMimul"/>
<flushOnExecute statement="deleteMimul"/>
<property name="reference-type" value="WEAK" />
</cacheModel>
<resultMap class="com.mimul.dwr.model.Mimul" id="mimul-result" >
<result property="lseq" column="lseq" />
<result property="sseq" column="sseq" />
<result property="assetid" column="assetid" />
<result property="title" column="title" />
<result property="imgurl" column="imgurl" />
<result property="vodurl" column="vodurl" />
<result property="use" column="use" />
<result property="chgdate" column="chgdate" />
</resultMap>
<select id="getMimul" resultClass="com.mimul.dwr.model.Mimul"
parameterClass="Integer" >
<![CDATA[
SELECT lseq, sseq, assetid, title, imgurl, vodurl, use, chgdate
FROM mimul
WHERE lseq = #lseq#
]]>
</select>
<update id="updateMimul" parameterClass="com.mimul.dwr.model.Mimul" >
<![CDATA[
UPDATE mimul
SET sseq = #sseq#, assetid = #assetid#, title = #title#,
imgurl = #imgurl#, vodurl = #vodurl#, use = #use#,
chgdate = #chgdate#
WHERE lseq = #lseq#
]]>
</update>
<insert id="insertMimul" parameterClass="com.mimul.dwr.model.Mimul" >
<selectKey resultClass="int" keyProperty="lseq" >
SELECT mimul_lseq_seq.nextval as lseq FROM dual
</selectKey>
INSERT INTO mimul (lseq, sseq, assetid, title, imgurl, vodurl,
use, chgdate)
VALUES (#lseq#, #sseq#, #assetid#, #title#, #imgurl#, #vodurl#,
#use#, #chgdate#)
</insert>
<delete id="deleteMimul" parameterClass="com.mimul.dwr.model.Mimul" >
<![CDATA[
DELETE FROM mimul
WHERE lseq = #lseq#
]]>
</delete>
</sqlMap>
import java.io.File;
import java.io.Reader;
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
import com.jaeminara.common.log.LogPool;
public class SqlConfig {
private static SqlMapClient sqlMap = null;
private static SqlConfig instance_ = null;
private SqlConfig() throws Exception
{
Reader reader = null;
StringBuffer rsc = null;
try {
if (sqlMap == null) {
rsc = new StringBuffer(200);
rsc.append("com").append(File.separator);
rsc.append("jaeminara").append(File.separator);
rsc.append("dwr").append(File.separator);
rsc.append("app").append(File.separator);
rsc.append("sql").append(File.separator).append("sqlmap.xml");
reader = Resources.getResourceAsReader(rsc.toString());
sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
reader.close();
}
} catch (Exception e) {
System.out.println(e);
throw e;
} finally {
if (reader != null)
reader.close();
reader = null;
rsc = null;
}
}
public static SqlConfig instance()
{
try {
if (instance_ == null) {
synchronized (SqlConfig.class) {
if (instance_ == null)
instance_ = new SqlConfig();
}
}
} catch (Exception e) {
System.out.println(e);
}
return instance_;
}
/**
* Return SqlMapClient for SDP schema
*
* @return
*/
public static SqlMapClient getSqlMapInstance()
{
return sqlMap;
}
}
7. DAO 클래스 정의
import java.util.HashMap;크게 어려운 점은 없습니다. 그리고 transaction 무결성을 보장하기 위해서는 executor.startBatch();와 executor.executeBatch(); transaction 처리 로직을 넣으시면 됩니다.
import java.util.List;
import java.util.Map;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.mimul.common.log.LogPool;
import com.mimul.dwr.model.getMimulByLSEQ;
public class MimulDao
{
private SqlMapClient smc =
SqlConfig.instance().getSqlMapInstance();
public void MimulDao() {}
public Mimul getMimulByLSEQ(int lseq) throws Exception
{
Mimul mimul = null;
try {
if (lseq == 0) {
LogPool.instance("DAO").debug("getMimulByLSEQ() : Parameter is null!");
return null;
}
mimul = (Mimul) smc.queryForObject("getMimul", lseq);
} catch (Exception e) {
LogPool.instance("DAO").error(e);
throw e;
}
return mimul;
}
// 기타 필요한 함수 정의
}
나머진 자동으로 iBatis에서 트랜젝션 자원의 할당 및 해지의 라이프사이클을 관리해 줍니다.
E-Commerce DEV DAY 참석 후기
못 가신분들을 위해서 제가 요약한 부분을 공유합니다.
웹표준이냐 속도냐(UI개발자의 고뇌)
- UI개발자? - 개발과 디지안의 중간에서 필터링해주는 가교역할을 하는 직무자
- 속도 향상을 위한 방법
. id, class를 명확히 해 주석을 최소화해라
. 이미지 용량 보다는 개수를 줄여라
. 로딩시 부대적인 자바 스크립트는 뒤로 옮겨라(popup, onclick 등등)
. CSS, JS는 External File로 관리하여 캐싱되게 하라
. 템플릿(CSS)을 만들어서 재활용하라
- 웹 표준의 딜레마
. 개발 속도를 올리냐? 5%의 브라우져를 수용하느냐에 대한 기획과 개발의 합일이 있어야 하고 접근성과 속도의 딜레마는 고려되어야 함 <- 어디를 가나 직면하는 문제인데 개발자 독단적으로 판단하지 말고 기획자와 합의를 해서 대안을 선택하는게 중요할듯 보입니다.
GS이숍만의 RIA 개발활용팁과 노하우
- RIA(Rich Iternet Application) : 있어 보이는(화려한?) 클라이언트 기반의 인터페이스 <- 재밌는 표현이죠?
- GSeshop에서는 플래쉬나 Flex가 Ajax의 기반 도구도 사용을 했군요.
. Flash : 개발 생산성이 높고, 쉽고, 개발시간이 올라가고 파일 사이즈가 작음
. Flex : 개발 시간이 짧고, 기술의 교육이 필요하고 불필요한 콤포넌트가 있어 파일 용량이 큼
- Remote Data의 관리
. XML, JSON, FlashVar의 전송 데이터 포멧중 JSON, FlashVar을 혼용하여 최적화 함
- Ajax debug : outerHTML 사용(document.getElementByTagName("html")[0].outerHTML)
- javascript tips
. package형태로 자바스크립트 구성하여 Common.js의 비대화를 막고 가독성 높여 필요한 코드를 빨리 찾고 재사용성을 높이는게 가능
. Error발생해도 서비스에 영향이 없도록 자바 스크립트 테스트 적용
. OpenSource 기반의 javascript framework를 사용
. 성능을 위해서 Cache 적용(물론 Cache Release 전략도 같이 중요함)
Spring Framework 도입 사례
- 개발 생산성을 올리고 일관된 플랫폼을 통해 개발 품질 향상, 유지보수 비용 절감이라는 노력의 산물이 Spring Framework
- 프레임워크(프레임워크가 유저 코드를 호출하고 관리를 함) : 라이브러리(유저 코드가 라이브러리를 호출하고 관리함)
- GSechop에 적용 프레임워크 : SpringDAO(ORM은 사용안함), SpringMVC, Code Generator(XML생성 등의 개발 편의성을 위함), View Resolver(XML((Xstream)), RSS, Flash, JSON(Xstream)등 다양하게 사용함), 캐싱(Ehcache)라이브러리 사용
- 향후 ORM 등의 프레임워크 추가 예정
유지보수의 최적화를 위한 개발 및 관리 전략
- 기존 프로그램들의 문제점을 확인
. javascript와 JSP가 한몸이고 비즈니스 레이어와 프리젠테이션 레이어가 한몸이 되는 구조가 많음
. 테스트를 할 수 없는 구조(태스트를 할려면 따로 테스팅 코드를 만들어야함 <- 부가적 일이 늘어남 ^^)
. 프로젝트 환경이 언제나 그랬듯이 빠듯한 일정이 대부분임
- 해결 방안
. JSP와 Javascript의 분리(Javascript안에 JSP코드를 넣지 말고 파라미터등의 형태로 진입점에 삽입하도록 함)
. 비즈니스와 프리젠테이션을 기능별로 분리를 함
. 작은 개발 단위로 상세화 필요(변경 최소화, 영향 최소화, 가독성 향상을 위해)
. Lazy Loading기술 필요
웹 표준스펙 살펴보기 (명세서에 살고 명세서에 죽다)
- 우리가 프레임워크를 도입하고 성능을 향상하고 개발 생산성을 높이는 건 브라우져에 기능을 보여주기위한 일련의 과정임 <- 상당히 철학적인 냄새가 ^^
- HTTP1.1, Servlet 2.4, JSP2.0 등의 기본 스펙을 알 필요가 있음 <- 아마 대부분의 개발자는 스펙은 생각하지 않을 것 같네요
- 기본 스펙만 알면 Security요소라든가 APM툴의 기능 개발은 쉽게 응용이 가능함
쇼핑몰 컨설턴트가 바라본 쇼핑몰 트렌트
- 쇼핑 운영자들은 가난하다
- 대기업의 영역과 쇼호스트의 영역의 세분화가 필요함
- 궁극적인 목표는 고객에게 어필하는 가치를 만드는 것임
레거시 코드 관리 전략(남이 짠 코드 빨리 알아보기)
- Copy & Paste를 최소화 하자(이클립스 코드 네비게이션 활용, 상속 활용)
- Refactoring을 하자(중복 코드 삼진아웃제를 통해 중복성 제거 활동 - 깨진 창문 이론 부연 설명)
- 팀워크 기반의 업무환경을 만들자(코드 재사용을 위한 라이브러리화, SVN, CVS 활용, 코드 리뷰, 짝프로그래밍 도입)
웹개발자의 약한고리 SQL 뛰어넘기
- 수만개의 코드의 성능보다 1개의 SQL Query가 잘못되면 그 프로젝트는 실패를 불러온다는 중요한 격언(?)을 통해 중요성 강조
- 인덱스 활용성을 강조(인덱스를 타게하는 쿼리 필요)
- SQL 튜닝 방법 소개(Explan, Trace)
- 10g로 가면서 Cost-Based Optimiazer밖에 없어서 개발자의 쿼리 사용 중요성이 커짐
나름대로 Presentation Layer, Business Layer, Persistance Layer 그리고 백그라운드로 프로젝트 관리 분야까지 골고루 섹션으로 나누어 발표를 한 노력이 보입니다. 하나의 서비스를 만들기 위해서 꼭 필요한 파트들이죠.
좋은 세미나 고맙습니다.
그리고 또 한가지 중요한 사실은 자신의 지식을 가지고 있는 것보다 알려줌으로써 자신 뿐만아니라 제3자에게도 많은 도움이 된다는 것을 GSeshop분들은 아시는 것 같습니다.
GSeshop 홧팅!!!
늙은 부부 이야기 관람기
오늘은 저의 생일입니다. 축하를 해준답시고 아내가 연극 "늙은 부부 이야기"를 보여주었습니다. 오랫만에 땡돌이처럼 6시 땡하고 대학로 소극장 "축제" 로 발길을 옮겼습니다. 소극장이라 그런지 아담하고 사람들의 숨소리도 들리고 배우들의 피부떨림도 보이고 생동감 그 자체였습니다.
연극의 내용을 감상하자면 노 부부의 닭살이 돋을 정도로 알콩 달콩 이야기로 서두를 열면서 서로 살아가는 모습에 깊은 신뢰를 바탕으로 아름다운 삶을 영위하게 되며 마지막에는 아내의 죽음으로 관객의 눈물샘을 자극합습니다.
특히 이 연극에서는 평범한 일상의 묘미를 느끼게 합니다. 일상 생활의 몸짓 하나 하나가 삶의 진실을 짜내는 것 같고 그안에서 또다른 재미를 느끼게 합니다. 평범함 속에 삶의 진실을 잘 표현했다고나 할까요? 스토리가 좋아 보입니다.
예를 들자면 이점순 여사의 박하사탕을 사와서 경대에 넣는 장면, 마늘을 찧고 숫가락으로 마늘찌꺼기를 긁는 장면, 남편을 위해 스웨터를 짜는 장면, 운전 면허 자격증 준비하는 장면, 순간 순간 터지는 생활 코미디 등등......
그리고 부분의 뒤돌아 앉아서 이야기하는 장면에서 쓸쓸한 노년을 보는 것 같지만 다정하면서도 자연스럽게 이야기하는 것 같아 더욱 나의 이야기처럼 와 닿았습니다.
마지막에 두분의 마루에 나란히 앉아 웃는 모습을 뒤로 fade out 되는 부분은 정말 아름다운 장면으로 기억에 남을 것 같습니다. 우리도 저렇게 아름답게 늙어 갔으면 좋겠습니다.
그리고 연극 시작부터 조용하게 내 손을 꼭 잡고 끝까지 사랑을 전해준 아내에게 고마움을 ... ^^
정종준, 이혜경씨의 열연 잘 보았습니다.
Release It: 성공적인 출시를 위한 소프트웨어 설계와 배치 출간
누구나 제품이나 서비스를 출시하게 되면 퀄리티에 대한 부분이 회자됩니다. 어떤 절차을 통해, 어떤 노하우를 접목시켜, 필요하면 프로세스를 타거나 혹은 Agile하게 제품이나 서비스를 준비하고 개봉을 하게 됩니다.
물론 생산과정 뿐만아니라 유지보수에서도 좋은 방법론을 가지고 유지를 하게 되는데 거기에 관련된 노하우들을 일목요연하게 도움을 줄 수 있는 책이 나왔습니다.
타인들의 좋은 노하우를 접할 좋은 기회인 것 같습니다. 돈을 주고도 살 수 없는...
기대가 되네요. 심플한 디자인도 마음에 들죠.
하지만, 백마 탄 왕자를 기다리지 마세요. 그건 자기 스스로가 만들어가는 겁니다. 힌트만 얻으세요. ^^
소프트웨어도 마찬가지가 아닐까요.
JSON(JavaScript Object Notation) 변환 샘플
JSON (JavaScript Object Notation)는 가벼운 데이터 교환 포멧인데, Ajax를 하면서 많이 사용되고 있습니다. 그래서 자바기반의 JSON 컨버전이 가능한 샘플을 소개합니다. 라이브러리는 여기에 가면 있습니다.
1. 사용 샘플
JSONStringer js = null;
JSONArray ja = null;
JSONObject jo = null;
try {
js = new JSONStringer();
js.array();
js.object().key("id").value("pepsi").
key("domain").value("paran.com").endObject();
js.object().key("id").value("cocacola").
key("domain").value("mimul.com").endObject();
js.endArray();
System.out.println(js.toString());
ja = new JSONArray(js.toString());
for (int i = 0; i < ja.length(); i++) {
jo = ja.getJSONObject(i);
System.out.println(jo.getString("id"));
System.out.println(jo.getString("domain"));
}
} catch (Exception e) {
System.out.println(e);
}
2. 결과
[{"id":"pepsi","domain":"paran.com"},
{"id":"cocacola","domain":"mimul.com"}]
pepsi
paran.com
cocacola
mimul.com
효율적인 Javascript 코드[1]
function get(el) {
// document.all 은 비표준임 ^^
return document.getElementById(el);
}
2. Ajax 처리- Better 코드
var asyncRequest = function() {
function handleReadyState(o, callback) {
if (o && o.readyState == 4 && o.status == 200) {
if (callback) {
callback(o);
}
}
}
var getXMLHR = function() {
var http;
try {
http = new XMLHttpRequest;
getXMLHR = function() {
return new XMLHttpRequest;
};
} catch(e) {
var msxml=[‘MSXML2.XMLHTTP.3.0′, ‘MSXML2.XMLHTTP’,‘Microsoft.XMLHTTP’];
for (var i=0, len = msxml.length; i < len; ++i) {
try {
http = new ActiveXObject(msxml[i]);
getXMLHR = function() {
return new ActiveXObject(msxml[i]);
};
break;
} catch(e) {}
}
}
return http;
};
return function(method, uri, callback, postData) {
var http = getXMLHR();
http.open(method, uri, true);
handleReadyState(http, callback);
http.send(postData || null);
return http;
};
}();
- 사용 Sample asyncRequest('GET', 'example.jsp?a=b', callback);
function callback(o) {
alert(o.responseText);
}
2. addEvent 처리
- Better 코드
function addEvent( obj, type, fn )
{
if (obj.addEventListener) {
// standard
obj.addEventListener( type, fn, false );
EventCache.add(obj, type, fn); // bugzilla bug #241518
} else if (obj.attachEvent) {
// IE
obj[’e'+type+fn] = fn;
obj[type+fn] = function() { obj[’e'+type+fn]( window.event ); }
obj.attachEvent( “on”+type, obj[type+fn] );
EventCache.add(obj, type, fn);
} else {
// really old
obj[”on”+type] = obj[”e”+type+fn];
}
}function removeEvent( obj, type, fn )
{
EventCache.remove(obj, type, fn);
}var EventCache = function()
{
var listEvents = [];
return {
listEvents : listEvents,
add : function(node, sEventName, fHandler)
{
listEvents.push(arguments);
},
remove : function(node, sEventName, fHandler)
{
var i, item;
for(i = listEvents.length - 1; i >= 0; i = i - 1) {
if(node == listEvents[i][0] && sEventName == listEvents[i][1]
&& fHandler == listEvents[i][2]) {
item = listEvents[i];
if(item[0].removeEventListener) {
item[0].removeEventListener(item[1], item[2], item[3]);
}
if(item[1].substring(0, 2) != “on”) {
item[1] = “on” + item[1];
}
if(item[0].detachEvent) {
item[0].detachEvent(item[1], item[0][sEventName+fHandler]);}
item[0][item[1]] = null;
}
}
},
flush : function()
{
var i, item, eventtype;
for(i = listEvents.length - 1; i >= 0; i = i - 1) {
item = listEvents[i];
if(item[0].removeEventListener) {
item[0].removeEventListener(item[1], item[2], item[3]);
}
eventtype = item[1];
if(item[1].substring(0, 2) != “on”) {
item[1] = ‘on’ + item[1];
}
if(item[0].detachEvent) {
item[0].detachEvent(item[1], item[2]);
item[0].detachEvent(item[1], item[0][eventtype+item[2]]);
}
item[0][item[1]] = null;
}
}
}
}();
- 사용 Smaple
addEvent(get('example'), 'click', function(e) {
alert('hello world');
});
3. Toggle 처리function toggle() {
for (var i=0, el; el = get(arguments[i]); i++) {
el.style.display = (el.style.display != 'none' ? 'none' : '' );
}
}
addEvent(get('toggler'), 'click', function() {
toggle('example');
// heck, do more!
toggle('foo', 'bar', 'baz', 'thunk');
});
11월 15일 방영되었던 현장르포 동행의 '굿바이, 찜질방' 를 보고
오랫만에 "동행"이라는 프로그램을 보고 눈을 땔 수 없었습니다. 안 그래도 요즘 야근에 심신이지칠때로 지친 상태였지만 ,준성이와 준성이 아버님의 생활을 보고 난 다음에 다시금 마음을 잡게 되었고 눈에는 많은 눈물이 얼굴을 적시더군요.
준성이의 자신감 없는 걸음걸이며 아버님의 하루 하루 살아갈려는 의지들이 오버랩 되면서 가슴을 적셨습니다. 그 중에서도 준성이가 생활하면서 방향성이 없이, 자신감 없이 살아갈 미래를 비추어 생각해보니 걱정이 많이 앞섰습니다.
단지 가진 것이 없다는 이유로 자신의 꿈을 접는 사람들이 많다는 것, 펼칠 기회를 박탈한다는 것, 그런 사회적 환경이 아직까지 존재한다는 것 자체가 저의 가슴을 많이 아프게 하네요.
하지만 "굿바이, 찜질방"을 보고 많은 사람들이 그저 눈물만 흘리는데 그치지 않고, 능동적으로 도움을 주시는 분들이 많아 대한 민국은 조금이나마 살기 좋은 나라인 것 같습니다.
준성이 아버님 힘내세요. 그리고 준성아 홧팅!! 항상 고마운 분들은 보이지 않는 주변에 있습니다.
그리고 프로그램 중간에 준성이 아버님의 호트러지지 않는 모습이 준성이에게 앞으로 커나가는데 아주 큰 도움이 될 것 같습니다.
준성이는 곧은 마음씨를 가지신 아버님을 의지하고 어깨에 힘들 주고 목표를 가지고 열심히 살았으면 좋겠네요. 처진 어깨의 모습은 아버지로 하여금 다시금 자신감을 잃게해 주는 단초를 제공할 수 있으니깐요.
학교 생활도 자신감 있게 열심히 했으면 좋겠네요. 그래야 도움 받은 마음을 나중에 좋은 사람 되어서 받은 은혜 만큼 베푸는 좋은 사람으로 되기 위해서..
준성이와 준성이 아버님에게 도움을 주실 분들은 아래를 참고 하세요.
- 입금 계좌 번호 : 1002-533-407393(우리은행 - 김동철 : 준성 아버님)
- 카페 : http://cafe.naver.com/gogojunsung.cafe
- 동영상 : http://www.kbs.co.kr/1tv/sisa/donghang/index.html
저도 남을 위해 십일조하는 마음을 계속 유지하겠습니다. 제 삶이 다하는 그날까지....
Java 프로그램에서의 Debugging 방법
1. Breakpoints
- Breakpoints설정을 통해 로컬/리모트 방식으로 Eclipse에서 스텝 단계적으로 디버깅을 함
- 리모트의 경우 WAS엔진에 따라 플러그인 설치하거나 서버 설정으로 가능
: Tomcat의 경우 Tomcat구동시에 set JAVA_OPTS=-Xdebug
- Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n 설정한다음 구동하고 이클립스에서 Run>Debug>Remote Java Application 으로 이동한 다음 New 버튼을 클릭하여 새로운 Remote Java Application을 추가하고 Debug 버튼을 클릭하여 Remote Tomcat 서버를 디버깅 가능한 상태로 유지한 다음 어플리케이션을 Breakpoints지정하고 실행하면 됨
: Jeus의 경우는 jeus 구동시에 -classic -Xdebug -Xnoagent
- Xrunjdwp:transport=dt_socket,address=8888,suspend=n,server=y 옵션을 추가하여 구동한 다음 이클립스에서 Run>debug>Remote Java Application에서 신규 등록시 포트 맞게 설정하고 debug누르면 서버와 연동된 상태에서 해당 어플리케이션을 Breakpoints지정한 다음 실행하면 됨
- 장점 : 설치와 사용이 간단하고 method attributes, local variables의 저장된 값들을 확인 가능
- 단점 : Breakpoint까지의 단계 단계 진행기간이 길고 리모트 디버그 진행 시 서버와 연동할 경우 PC의 CPU와 메모리 사용량이 높음
2. Debug messages
- JDK logging, Apache Commons Logging, Log4j를 활용하여 소스내에 로그 코드를 삽입하여 원하는 값이나 로그를 확인하면서 디버깅을 함
- 장점 : 입맛에 맞게 적재 적소에 디버깅이 가능, 빠른 디비깅 가능, Exception Trace 가능
- 단점 : 일일이 소스 코드 수정을 해줘야 디버깅이 가능, 코드가 지저분해지고 런타임 성능이 안좋음
3. Dynamic Proxy
- J2SE 1.3부터 제공하는 Dynamic Proxy기능을 활용하여 Interface를 통해 함수 호출을 가로채는 기능을 통해 디버깅을 함(AOP의 전단계임)
- Dynamic Proxy 참조 사이트
: http://java.sun.com/j2se/1.3/docs/guide/reflection/proxy.html
- 장점 : 소스 코드의 삽입 없이 디버깅이 가능, 성능에 영향없음
- 단점 : public이 아닌 함수에서는 사용이 불가능, 필요할 경우 코드 수정을 해야함
4. Run-time Profiler
- 프로그램의 성능을 향상(Tuning)시키기 위해서 JVM 데이터를 후킹해서 프로그램의 메모리, 응답 속도등의 정보를 제공하는 기능
- Profiler
: TPTP
: Optimizeit Profiler
: Eclipse Profiler
: JProfiler
: sqlprofiler
: Memory Profiler for C
- 장점 : 코드의 수정, 추가가 없음, 소스코드 없이도 Trace가능
- 단점 : 툴을 사용할려면 비용이 있음, 설치하는데 복잡하고 시간이 소요, 함수에 아규먼트 지원이 안됨
5. AOP
- 공통적인 기능(로깅, 보안, 트랜젝션)을 한 곳에서 정의 할수 있으며, 새로운 기능을 적용하려고 하는 클래스를 수정할 필요 없이 그런 기능을 어디에 어떻게 적용할 것인지를 선언적으로 정의 하는것을 말함
- 이클립스 기잔의 AOP 툴
: Aspect Java Development Tools (AJDT)
- 장점 : 설치 쉽고 필요한 기능을 선택적으로 디버깅 가능, 함수에 아규먼트 지원, 원 소스는 수정이 없음, 실서비스에 성능 영향 적음
- 단점 : AOP이해하는 데 시간과 지식이 필요, 패키디 Trace에 문제 있음
6. 기타
- 웹 개발시 필요한 디버깅 툴
: HTTP Debugging Proxy - Fiddler
: Firebug
: HttpWatch
: Yslow
- Web Validators
: HTML/XHTML Validator
: CSS Validator
: RSS/ATOM Feed Validator
5가지의 방법을 적절하게 필요할 때 사용하면 소스의 품질을 향상시킬 수 있고 개발 생산성도 올라갈 수 있으리라고 봅니다. 개발 따로 디버깅을 따로 진행한다면 불필요한 개발 누수가 발생할 가능성이 많아서 개발자들이 놓지게 됩니다.
개발시에도 테스트와 디버깅 기능이 녹아 들수 있게 개발하는 습관도 중요합니다.
테스트와 디버깅을 귀찮은 것으로 치부하지 않게 하기 위해서는.....









