달력

5

« 2024/5 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
2008. 7. 27. 04:31

하얀말의 미투데이 - 2008년 7월 26일 篇隣2008. 7. 27. 04:31

:
Posted by 하얀 말
2008. 7. 23. 04:31

하얀말의 미투데이 - 2008년 7월 22일 篇隣2008. 7. 23. 04:31

이 글은 하얀말님의 2008년 7월 22일의 미투데이 내용입니다.

:
Posted by 하얀 말
2008. 7. 22. 04:31

하얀말의 미투데이 - 2008년 7월 22일 篇隣2008. 7. 22. 04:31

:
Posted by 하얀 말
2008. 7. 21. 11:06

SAAJ Computing에 관한 독백2008. 7. 21. 11:06


SAAJ는 SOAP with Attachments API for Java의 약자로, 말 그대로 SOAP with Attachment를 Java로 다루기 위한 API 모임입니다. 물론 JAXP나 HTTP로 생짜로 짤 수도 있겠습니만, 아무래도 class library가 있다면 좀 편하겠지요. SOAP with Attachment(이하 SwA)는 Web Service의 표준 protocol인 SOAP이, 첨부 file등을 붙일 수 있도록 확장한 것입니다. 비슷한 것으로는 DIME이 있긴 한데 아무래도 SwA가 더 힘을 받는 것 같습니다. 아울러,


  • SwA가 첨부 파일을 지원하는 mechanism은 e-mail에 file을 첨부하기 위해 고안한 MIME을 이용합니다. 이 사항은 SAAJ coding을 보면서 자세히 살펴보죠.
  • SAAJ가 지원하는 SOAP의 규격은 1.1, 1.2 모두를 지원하며 default는 1.1입니다. 이 글에서 명시적인 SOAP 명세 version이 없으면 1.1입니다.
  • Java SE 5 이하에서 SAAJ를 쓰려면 별도의 jar file이 필요했으나 Java SE 6부터는 기본으로 들어 있습니다. 따라서 본 글은 SAAJ를 Java SE에 포함시킵니다.
  • SOAP 자체에 대한 이해가 필요하시면 SOAP Tutorial을 공부하세요. 간단합니다.

SAAJ에서의 SOAP message 얼개#



SwA Message 얼개는 위 그림과 같습니다. 하나의 SOAP message는 1개의 SOAP part와 0개 이상의 Attachment Part로 나뉘며, SOAP Part는 SOAP Body는 꼭 있어야 하고 SOAP Header는 있어도 되고 없어도 됩니다. Attachment Part는 MIME Header들과 그에 따른 Content(즉 첨부 file)이 있습니다. SAAJ에는 이들 SOAP message, header, body, Attachment에 해당하는 class들이 존재하며 SAAJ를 쓴다는 것은 이들 class의 instance를 얻어 조작하는 것을 뜻합니다.


참고로 Attachment Part가 없는 SwA message는 아래 그림과 같이 SOAP Message 그 자체입니다.


SOAPMessage#


본격적으로 시작하기에 앞서, SAAJ에 관한 class들은 대부분 javax.xml.soap이라는 package 안에 들어있으며, 이 글에서 package에 대한 별도의 명명이 없는 class는 바로 이 javax.xml.soap package에 들어있다고 보시면 됩니다.


먼저 SOAP Message에 해당하는 객체를 획득해 보죠. 이 객체를 얻으려면 먼저 이 객체의 factory class인 MessageFactory 객체를 생성해야 합니다. MessageFactory 객체는 MessageFactory의 static method인 newInstance()라는 method를 호출함으로써 얻습니다. 그리고 우리가 정말로 얻고자 하는 객체인 Message를 표현하는 class는 SOAPMessage라는 class인데 이 class에 대한 객체는 MessageFactory의 createMessage()를 호출하면 얻을 수 있습니다. 이러한 동작을 수행하는 code는 아래와 같습니다.


  1. MessageFactory mf = MessageFactory.newInstance();
  2. SOAPMessage msg = mf.createMessage();

만약 SOAP 1.2 spec을 따르는 SOAP Message를 만들고 싶다면,

  1. MessageFactory mf = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);
    

라고 하면 됩니다.


SOAPPart / SOAPEnvelope#

위에서 언급했듯, SOAP message는 SOAP Part와 Attachment Part로 이루어지고 SOAP Part는 반드시 존재합니다. 이 단락에서는 SOAP Part를 살펴보겠습니다. SOAP Part를 나타내는 class는 SOAPPart입니다. 그리고 SOAPPart 객체는 SOAPMessage 객체의 getSOAPPart() method를 통해 얻습니다. code로는 아래와 같죠.


  1. SOAPPart sp = mf.getSOAPPart();

SOAP spec을 보시면 아시겠지만 SOAP은 SOAP Envelope이라는 구조를 가지고 이 SOAP Envelope이 SOAP Header, SOAP Body를 rkwlrh 있습니다. SAAJ에서는 이 SOAP Envelope을 나타내는 class가 있으며 SOAPEnvelope이라 합니다. 이 SOAPEnvelope 객체는 다음과 같이 얻을 수 있죠.


  1. SOAPEnvelope se = sp.getEnvelope();

SOAP Envelope에 Namespace, Attribute 추가하기#

이 SOAPEnvelope은 SOAP의 <SOAP-ENV:envelope/> element에 대응합니다. <SOAP-ENV:envelope/>이라는 element 이름을 보셔도 알 수 있듯, <SOAP-ENV:envelope/>은 SOAP-ENV라는 XML Namespace prefix가 걸려 있으며, 이 prefix에 대응하는 URI는 "http://schemas.xmlsoap.org/soap/envelope/" 입니다. 그런데 때때로 이 <SOAP-ENV:envelope/>에 또다른 Namespace나 attribute를 추가할 수도 있습니다. 이를 위해 SOAPEnvelope은 Namespace 추가용으로 addNamespaceDeclaration(String prefix, String uri), Attribute 추가용으로 addAttribute(Name attrName, String value), addAttribute(QName attrName, String value)라는 method를 가지고 있습니다. 이들에 대한 code 예시는 아래와 같습니다.


  1. /* schemaLocName은 xsi:schemaLocation 이라는 이름을 나타내는 Name, 또는 QName 객체 */
  2. se.addNamespaceDeclaration("eb", "http://www.oasis-open.org/committees/ebxml-msg/schema/msg-header-2_0.xsd");
  3. se.addAttribute(schemaLocName, "http://schema.xmlsoap.org/soap/envelope http://www.oasis-open.org/committees/ebxml-msg/schema/envelope.xsd");

위 code는 <SOAP-Env:Envelope/>에 eb라는 Namespace와 xsi:schemaLocation이라는 attribute를 추가하는 일을 합니다. 그런데 addAttribute() method의 첫번째 인자로 들어가는 Name, QName은 무엇하는 객체일까요?


Name / QName#

element나 attribute를 만들기 위해서는 당연히 그 element나 attribute에 대한 이름이 필요합니다. 그런데 XML에서 element나 attribute에 대한 이름은 XML Namespace의 적용을 받습니다. 따라서 element나 attribute에 대한 이름은 단순히 이름을 나타내는 String으로는 부족하고 거기에 prefix, uri에 대한 정보를 함께 가지고 있어야 합니다. 이러한 이름 정보를 표현하기 위해 SAAJ에서는 Name이란 class를 제공하며 이 Name에 대한 객체는 아래 SOAPFactory라는 객체에서 얻을 수 있습니다. code로는 아래와 같습니다.


  1. Name schemaLocName = SOAPFactory.newInstance().createName("schemaLocation", "xsi", "http://www.w3.org/2001/XMLSchema-instance");

위 code는 xsi:schemaLocation이라는 이름을 생성합니다.


이러한 이름을 표현하는 방법에는 Name 대신 javax.xml.namespace.QName을 쓰는 방법도 있습니다. 위 code와 동일한 작용을 하는, QName을 쓰는 code는 아래와 같습니다.


  1. QName schemaLocName = new QName("http://www.w3.org/2001/XMLSchema-instance", "schemaLocation", "xsi");


SOAPHeader / SOAPBody#

SOAP message에서 실제 data를 탑재하는 부분은 SOAP Header와 SOAP Body입니다. SAAJ에서는 이들을 SOAPHeader, SOAPBody class로 표현하며 이들에 대한 객체는 아래 코드와 같이 얻을 수 있습니다.


  1. SOAPHeader sh = se.getHeader();
  2. SOAPBody sb = se.getBody();

SOAPHeader나 SOAPBody는 각각 <SOAP-ENV:header/>, <SOAP-ENV:body/>에 대응하며 <SOAP-ENV:envelope/>과 마찬가지로 addNamespaceDeclaration(String prefix, String uri), addAttribute(Name attrName, String value), addAttribute(QName attrName, String value)을 써서 필요로 하는 Namespace나 attribute를 추가할 수 있습니다. 그리고 하위 element도 추가할 수 있죠.


SOAP Header / SOAP Body에 data 싣기#

SOAPHeader나 SOAPBody에는 필요한 XML element 등을 만들어서 필요한 data를 SOAP message에 적재할 수 있습니다.


SOAP Header에 data 싣기#

SOAPHeader 객체의 addChildElement(Name), addChildElement(QName)이라는 method가 SOAP Header에 하위 element를 추가하는 일을 수행하며, 추가된 하위 element를 가리키는 SOAPElement 객체를 반환합니다.


아래 code는 SOAP Header에 하위 element로 <eb:CPAId/>라는 element를 추가하고, 거기에 "banca.03.N01.test"라는 text 값을 추가하는 예시입니다.


  1. SOAPElement messageHeader = sh.addChildElement(new QName("http://www.oasis-open.org/committees/ebxml-msg/schema/msg-header-2_0.xsd", "MessageHeader", "eb"));

위 code에 대응하는 XML 문서는 대략 다음과 같습니다.


  1. <SOAP-ENV:Header xml:eb="http://www.oasis-open.org/committees/ebxml-msg/schema/msg-header-2_0.xsd">
  2.   <eb:MessageHeader/>
  3. </SOAP-ENV:Header>

이 SOAPElement 객체에도 addChildElement(QName name), addChildElement(Name name), addNamespaceDeclaration(String prefix, String uri), addAttribute(Name attrName, String value), addAttribute(QName attrName, String value)이 있으며, 필요한 하위 Element, Namespace나 Attribute를 추가할 수 있습니다. 또한 SOAPHeaderElement에는 setTextContent(String content)라는 method가 있는데 이는 element에 문자열로 된 내용을 추가합니다.


아래는 <eb:MessageHeader/>에 <eb:CPAId>banca.03.N01.test</eb:CPAId>라는 하위 element를 만드는 code입니다.


  1. messageHeader.addChildElement(new QName("http://www.oasis-open.org/committees/ebxml-msg/schema/msg-header-2_0.xsd", "CPAId", "eb")).setTextContent("banca.03.N01.test");

SOAPBody에 data 싣기#

SOAPBody에도 addChildElement(Name), addChildElement(QName)가 있으며 이 method들이 반환하는 SOAPElement 객체에 Attribute나 하위 element, content를 추가할 수 있는 것은 SOAPHeader와 같습니다. 그런데 SOAPBody에는 SOAPHeader에 없는 독특한 기능이 있는데, 바로 addDocument(org.w3c.dom.Document doc), addFault() method들입니다.


addDocument(org.w3c.dom.Document doc)는 XML 문서 자체를 한꺼번에 SOAPBody에 적재하는 method입니다. 편리하겠지요?


그럼 addFault()는 뭐하는 것일까요? SOAP spec을 보시면 아시겠지만 어떤 처리를 하다 error가 발생하면 그 error에 대한 정보를 SOAP message에 실을 수 있습니다. 바로<SOAP-ENV:Body/> element 안에 들어가는 <SOAP-ENV:Fault/> element죠. 바로 addFault()가 이 element를 추가하는 역할을 수행합니다. addFault()는 SOAPFault 객체를 반환하며 SOAPFault는 SOAPElement의 자식 class입니다.


AttachmentPart#

AttachmentPart는 쉽게 말해 첨부 file 부분을 말합니다. SwA를 통해 첨부 file을 붙이는 작업은 보통 다음의 4가지 일로 나눌 수 있습니다.


  1. SOAPMessage 객체에서 AttachmentPart 객체 얻어오기
  2. Content 추가하기
  3. Content-ID 설정하기
  4. 가공한 AttachmentPart를 SOAPMessage에 추가하기

하나의 SOAPMessage에 적재할 수 있는 AttachmentPart는 이론적으로는 제한이 없으므로, 추가하고 싶은 만큼 위 작업을 반복하면 됩니다.


각 단계에 대한 code 예시는 아래와 같습니다.


  1. attachment = msg.createAttachmentPart();
  2. attachment.setRawContent(new FileInputStream(contentFiles[inx]),"application/octet-stream");
    attachment.setContentId("<payload-" + inx + ">");
    msg.addAttachmentPart(attachment);

위 예에서는 content를 추가하는 작업으로 setRawContent() method를 썼습니다만 setContent(Object content, String mimeType)을 쓸 수도 있습니다. 이 두 method의 차이는, 전자의 경우는 Stream 형태 그대로 적재합니다만, 후자는 Java 객체로 적재할 data를 받습니다. 만약 Java 객체가 두번째 인자로 주어진 MIME Type과 맞지 않다면 setContent()는 SOAPException을 발생시킵니다. 위 예에서 setContent()를 쓸 경우, "application/octet-stream"이라는 MIME Type은 대응하는 Java 객체가 없기 때문에 SOAPException이 납니다.


만든 SOAP Message를 주고 받기#

SOAPMessage는 다른 system에 보내라고 만든 것이죠? SwA는 만들어진 SOAPMessage를 보내는 것에 대한 API도 제공하고 있습니다. 바로 예시 code로 들어갑시다.


  1. SOAPConnectionFactory scf =  SOAPConnectionFactory.newInstance();
  2. SOAPConnection conn = scf.createConnection();
  3. SOAPMessage responseMsg = conn.call(msg, new URL("http://127.0.0.1:27120/ebXML/msh));

그럼 받는 쪽은 어떻게 할까요? 이것에 대한 해답도 역시 SOAPConnection 객체에 있습니다. SOAPConnection 객체에는 get(Object to)이라는 method가 있는데, 이 method는 to에서 SOAP Message를 보낼 때까지 기다리다가 to에서 SOAP Message를 보내면 이를 받아내죠. to에 실제로 올 수 있는 type은 String 객체나 java.net.URL 객체이며 request를 보내는 곳의 URL을 표현합니다.


SwA 실례#

실제 SOAP with Attachment message가 어떻게 생긴 것인지 이해를 돕기 위해 아래에 실제 내용을 첨부합니다. 이 예에서는 Attachement Part가 두 개입니다.


  1. ------=_Part_0_8089714.1216110540156
    Content-Type: text/xml; charset=utf-8
    Content-Id: <SOAP_Part>

    <?xml version="1.0" encoding="utf-8" ?><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://schema.xmlsoap.org/soap/envelope http://www.oasis-open.org/committees/ebxml-msg/schema/envelope.xsd"><SOAP-ENV:Header xmlns:eb="http://www.oasis-open.org/committees/ebxml-msg/schema/msg-header-2_0.xsd" xsi:schemaLocation="http://www.oasis-open.org/committees/ebxml-msg/schema/msg-header-2_0.xsd http://www.oasis-open.org/committees/ebxml-msg/schema/msg-header-2_0.xsd"><eb:MessageHeader SOAP-ENV:mustUnderstand="1" eb:id="MessageHeader" eb:version="2.0"><eb:From><eb:PartyId eb:type="BANK_CD">03</eb:PartyId><eb:Role>BANK</eb:Role></eb:From><eb:To><eb:PartyId eb:type="INSR_CD">N01</eb:PartyId><eb:Role>INSR</eb:Role></eb:To><eb:CPAId>banca.03.N01.test</eb:CPAId><eb:ConversationId>20010215-111213-28572</eb:ConversationId><eb:Service>urn:bancassurance</eb:Service><eb:Action>100001_Request</eb:Action><eb:MessageData><eb:MessageId>20010215-111212-287572</eb:MessageId><eb:Timestamp>2008-07-15T17:29:00Z</eb:Timestamp></eb:MessageData></eb:MessageHeader><eb:SyncReply SOAP-ENV:actor="http://schemas.xmlsoap.org/soap/actor/next" SOAP-ENV:mustUnderstand="1" eb:id="10056109" eb:version="2.0"/></SOAP-ENV:Header><SOAP-ENV:Body xmlns:eb="http://www.oasis-open.org/committees/ebxml-msg/schema/msg-header-2_0.xsd" xsi:schemaLocation="http://www.oasis-open.org/committees/ebxml-msg/schema/msg-header-2_0.xsd http://www.oasis-open.org/committees/ebxml-msg/schema/msg-header-2_0.xsd"><eb:Manifest eb:id="Manifest" eb:version="2.0"><eb:Reference xmlns:xlink="http://www.w3.org/1999/xlink" eb:id="Reference-0" xlink:href="cid:payload-0" xlink:type="simple"><eb:Description xml:lang="ko_KR">IBK-0</eb:Description></eb:Reference><eb:Reference xmlns:xlink="http://www.w3.org/1999/xlink" eb:id="Reference-1" xlink:href="cid:payload-1" xlink:type="simple"><eb:Description xml:lang="ko_KR">IBK-1</eb:Description></eb:Reference></eb:Manifest></SOAP-ENV:Body></SOAP-ENV:Envelope>
    ------=_Part_0_8089714.1216110540156
    Content-Type: application/octet-stream
    Content-ID: <payload-0>

                긍정적인 밥

                                   함민복

    시 한편에 삼만원이면
    너무 박하다 싶다가도
    쌀이 두 말인데 생각하면
    금방 마음이 따뜻한 밥이 되네

    시집 한권에 삼천 원이면
    든 공에 비해 헐하다 싶다가도
    국밥이 한 그릇인데
    내 시집이 국밥 한그릇만큼
    사람들 가슴을 따뜻하게 덥혀줄 수 있을까
    생각하면 아직 멀기만 하네

    시집이 한 권 팔리면
    내게 삼백원이 돌아온다
    박리다 싶다가도
    굵은 소금이 한됫박인데 생각하면
    푸른 바다처럼 상할 마음 하나 없네
    ------=_Part_0_8089714.1216110540156
    Content-Type: application/octet-stream
    Content-ID: <payload-1>

                   가을

                                  함민복

    당신 생각을 켜놓은 채 잠이 들었습니다

참고 문헌#

http://java.sun.com/javaee/5/docs/tutorial/doc/bnbhf.html

이 글은 스프링노트에서 작성되었습니다.

:
Posted by 하얀 말

이 글은 하얀말님의 2008년 7월 17일의 미투데이 내용입니다.

:
Posted by 하얀 말
2008. 7. 16. 04:31

하얀말의 미투데이 - 2008년 7월 15일 篇隣2008. 7. 16. 04:31

:
Posted by 하얀 말
1. '어떻게'보다는 '왜'가 먼저

어떻게 그렇게 했는지를 넘어 왜 그렇게 했는지 깨달았다면 완벽하게 이해했다고 말함에 주저함이 없을 자격이 있습니다.

How보다는 Why를 먼저...


2. 하수와 고수, 군자와 소인배

논어(論語)의 '군자는 자기에게서 구하고 소인은 남에게서 구한다(君子求諸己 小人求諸人)'와 일맥상통합니다.

하수와 고수, 그리고...
:
Posted by 하얀 말
2008. 7. 14. 23:49

Flagship Studio. 그리고 Ion Storm PC 게임2008. 7. 14. 23:49

사용자 삽입 이미지

Flagship Studios 직장 폐쇄 기사를 보노라면 생각나는 사람과 생각나는 회사가 있습니다. 바로 John Romero와 그가 세운 Ion Storm이죠.

Bill Roper가 엄청나게 잘 나가던 Blizzard Entertainment를 뛰어나와 세운 회사가 Flagship Studios였고 John Romero가 Wolfenstein 3D, Doom 등을 통해 FPS라는 Jenre를 개척한, 엄청나게 잘 나가던 Id Software를 뛰쳐나와 Ion Storm을 세웠습니다.

Bill Roper는 "진정한 Diablo 2의 후계작을 만들겠다"면서 Hellgate: London을 만들었고 John Romero는 "Doom 연작의 한계를 뛰어넘겠다"면서 "Daikatana"를 만들었습니다.

Bill Roper가 세운 Flagship Studios는 Hellgate: London이 시원찮아 망했고, John Romero가 세운 Ion Storm은  Daikatana가 시원찮아 몰락하기 시작했습니다.

Bill Roper가 뛰어나온 Blizzard Entertainment는 지금도 잘 나가고, John Romero가 뛰어나온 Id Software도 여전히 잘 나갑니다.

차이가 있다면 Flagship Studios는 Hellgate: London 하나 내놓고 망했지만 Ion Storm은 Deus Ex, Thief라는 나름대로 시선을 모은 Game을 더 내놓고 망했다는 점 정도랄까요?

사용자 삽입 이미지

:
Posted by 하얀 말
2008. 7. 14. 04:30

하얀말의 미투데이 - 2008년 7월 13일 篇隣2008. 7. 14. 04:30

  • 1박2일 용정 콘서트 장면에서 느낀 것은 바로 이것. “문화의 힘은 아무도 못 막는다!!!”(1박2일 문화의힘 용정)2008-07-13 22:24:56

이 글은 하얀말님의 2008년 7월 13일의 미투데이 내용입니다.

:
Posted by 하얀 말
사용자 삽입 이미지

V3가 Windows XP SP3의 lsass.exe를 지워 booting이 안되는 사건을 몸소 경험했습니다. 목요일 오후 Windows XP SP3 CD를 넣으라는 대화 상자를 무심코 흘리고 PC 끄고 퇴근했다가 금요일 아침 출근 전 News에서 예의 그 V3 사태를 듣고 '혹시!?' 했더니만, 역시 이런 예감은 안 빗나가는지 그 '혹시'가 '역시'였습니다. 비록 제 PC(제 PC라고는 했지만 실은 제가 다니는 회사가 지급한 Notebook PC입니다. 회사에서 Notebook을 지급 받는 이후로 제 PC를 잘 안 사게 되네요)는 아니고 현재 나가 있는 곳에서 지급한 PC(이곳은 보안 목적으로 외부에서 온 인력에게 자사 자산 PC를 지급합니다)긴 하고, 그 회사의 PC 관리자가 돌아다니면서 조치를 취해서 금방 복구되긴 했지만요. 사실 나름대로 OS patch도 열심히 적용하고 보안에 신경을 쓰는 편이라 Virus나 악성 code 피해는 덜 받고 살았는데 이번 사태를 몸소 겪으며 느낀 점을 좀 적어볼까 합니다.

1. PC의 마비는 개인에게도 타격이 크더군요. 만약 PC 관리자의 조치가 늦었다면 늦는 만큼 난 일을 못했을 것입니다. 만약 중요한 위치의 사람이 쓰는 PC가 먹통이었으면... 회사건 개인이건 이제 computer의 마비는 그대로 업무 마비입니다. 그런데, PC는 보안성이 약하죠. Windows 자체도 보안성이 약한 편이지만 그것을 쓰는 사람의 보안 인식이 형편 없기 때문이기도 합니다. 더군다나 조직에서 중요한 일을 하는 분들은 대부분 또 PC를 잘 모르는 게 더... 크~.

2. Beta Test의 중요성을 절감했습니다. 우리나라에서는 beta test란 말을 online game사들이 open beta라 하며 일종의 marketing 전략으로 쓰고 있지만, 원래 beta test란 어떤 program이 정확하게 동작하는지를 검토하는 기능 test가 아닌, 사용자 computer 환경에서 test해 보는 것을 말합니다. 왜냐햐면 개발자가 개발한 computer에서는 기똥차게 돌지만 그 이외의 computer에서 동작하는 것은 잘 안되는 경우가 수두룩빽빽이거든요. 모르긴 몰라도 지금 안철수연구소, 엄청난 비용을 치르고 있을 것이고, 주가도 많이 떨어졌을 것입니다. 미국 같은 곳이었으면 집단 소송 감이 아닐까요?

3. 약간 성격은 다르지만 이관에 대한 생각도 들었습니다. 저는 회사 전산 system 구축하는 쪽 일을 하고 있고, 따라서 그 회사가 도입한 computer에서만 잘 돌면 되기 때문에 수많은 일반 PC를 상대하는 안철수연구소보다는 사정이 훨씬 낫지만, 그러함에도 개발자들이 개발하는 개발계에서 검수계나 운영계로 이관하는 작업이 한 방에 되는 모습을 한 번도 본 적이 없습니다. 개인적으로 "이관 작업은 사람의 정성을 먹고 된다"고 표현하는데, 문제는 이관을 단순한 file 복사 수준으로만 알다 보니 이관 작업을 껌으로 보는 경우가 허다하다는 것입니다.

4. 대세는 역시 Web Application인가요? Beta test의 중요성 이야기를 했지만, 안철수연구소나 game 제작사들 같은 곳은 그 beta test를 100% 완벽하게 하는 것이 불가능합니다. 이번 안철수연구소 예를 보아도 대충 검사해 봐야 할 Windows의 major version으로만 헤아려 봐도 최소 XP, Vista, 2000 정도는 지원해야 할 것입니다. 그리고 위 세 version별로 32bit, 64bit version이 따로죠? 거기에다 각각의 Service Pack 및 Edition까지 따지면 그 조합은 더 엄청나집니다. 그리고 H/W는 더합니다. 사용자들이 어떤 CPU, 어떤 Graphic Card, main board 등등을 조합해 쓸 지, 그 조합의 총 갯수가 상상이 가십니까? 지금은 단종된 Graphic Card를 쓰는 고물 PC에서만 발생하는 오류라면? Web Application은 최소한 이런 문제는 훨씬 적습니다. 물론 Web Application도 Active X 쓰면 저런 문제 다 겪을 소지가 있는 것이고, Active X를 안 쓴다 해도 Browser 호환성 맞추는 것이 장난이 아니긴 합니다만(특히 아직도 많이 쓰는 IE 6은 Web 표준 안 지키기로 유명하죠. 이 글 보시는 분은 제발 Firefox나 IE 7을 써 주세효~ T.T Web 개발자도 너무 힘듭니다~).

써놓고 보니 안철수연구소가 이해는 간다는 논조가 되었습니다. 그래도 피해자로서 솔직히 짜증나긴 합니다. 금방 복구가 안되고 오전 내내 먹통이었다면 지금 여기에대 욕지기를 해대고 있었을 지도 모릅니다. Service Pack 검사는 해 봐야 하지 않았을까 합니다.

마지막으로 하고 싶은 말,

"Software의 영향력이 이제는 사회를 들썩일 정도로 커졌다"

는 이야기 되겠습니다. 특히 이 이야기는
 
"IT하면 반도체, 휴대폰, LCD나 들먹거리고, 우리나라가 IT 강국이라 하는 헛 IT 전문가들에게 꼭 해주고 싶은 이야기"

입니다.
:
Posted by 하얀 말