블로그 이미지
좋은느낌/원철
이것저것 필요한 것을 모아보렵니다.. 방문해 주셔서 감사합니다..

calendar

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

Notice

    2009. 9. 30. 17:25 개발/Java

    객체

     

    메인이 인스턴스를 생성하기 전에는 
    클래스는 다만 
    코드에 지나지 않았다

     

    메인이 인스턴스를 생성했을 때 
    클래스는 메모리에 올라가서 
    객체가 되었다  

     

    메인이 인스턴스를 생성한 것처럼
    클래스의 이 변수와 메소드에 알맞는 
    누가 인스턴스를 생성해다오 
    메모리에 올라가서 
    객체가 되고 싶다

     

    클래스는 모두 
    객체가 되고 싶다 
    클래스는 컴퓨터에 컴퓨터는 클래스에 
    지워지지 않는 
    하나의 프로그램이 되고 싶다

     

     

    ==========================================

    김춘수 님의 꽃을 패러디해보았습니다..

    한 번 웃어 보아요~~

    posted by 좋은느낌/원철
    2009. 9. 17. 18:01 시사/요즘 세상은
    원문 : http://www.pressian.com/article/article.asp?article_num=60090917083214&section=04

    며칠 전 나는 서울이 발신인 낯선 분으로부터 이메일을 받았다. 나에게 메일을 보낸 분은 "서울에 거주하고 있는 베광옥입니다"라고 자신의 이름을 밝히는 문장으로 내용이 시작됐다.

    8월 25일 여기 프레시안에 칼럼으로 프랑스 파리에서 미술작가이자 이론가, 대학 강의와 전시기획 분야에서 활동을 하고 있는 프랑스 국적의 한국인 '다프네 낭 르 세르장(Daphné Nan Le Sergent - 한국명, 배난희(裵蘭姬))에 대해서 글을 쓴바 있다.(관련 기사 : 정말 가난해서 저를 버렸나요?)

    지난 6월 프랑스 파리에서 내가 그녀를 만났을 때, 그녀는 자신의 부모를 찾아 34년 만에 한국행 비행기를 탈 것이라고 말했다. 그리고 나에게 질문했다 "서울을 가면 저를 낳아준 부모님을 찾을 수 있을까요? 서울에 홀트아동복지회에 영어로 편지를 써서 보내봤지만 아무런 답신이 없었어요."

    나는 어떤 확신도 그녀에게 줄 수 있는 입장이 아니었다. 수많은 해외 입양아들이 성장이후 부모를 찾아 한국을 방문하지만 여러가지 이유로 정작 부모나 일가친족을 만나기란 너무나 어렵다는 얘기를 익히 듣고 있었다.

    그런데 기적이 일어났다. 34년 만에 딸이 생부를 서울에서 곧 만나게 됐다. 그간 있었던 배난희의 이버지 '배광옥'(64) 씨가 그의 딸 배난희를 찾았던 노력들이 이제 드디어 결실을 이루었다고 해야 더 정확하다.

    프랑스 이름 '다프네', 원래 이름은 배난희인 그녀의 아버지 배광옥 씨는 나에게 보낸 이메일 편지에서 말하기를 "딸 난희가 추후 한국을 방문하여 친부모를 찾을 경우에 대비하여 홀트회에 연락처를" 남겼는데, "주소나 전화번호가 바뀌게 되면", "홀트회를 찾아 나의 정보를 변경하곤 하였습니다."

    바로 그랬다. 생부의 예상대로 이 노력이 주효했다.

    그리고 34년 전 그는 비록 딸아이를 해외에 입양 보낼 수밖에 없는 당시 처지였지만, 그는 딸과 헤어져 있는 긴 시간 동안 한시도 딸을 잊어본 적이 없었다고 했다.

    나는 배광옥 씨의 메일에 즉시 답을 하면서 딸과의 만남이전에 하루라도 빨리 아버지와 딸이 소통할 수 있도록 딸의 프랑스 이메일 주소를 먼저 알려주었다.

    ▲ ⓒ김상수
    그리고 나는 "난희 씨의 아버님께서 30년도 그 이전에, 어려운 사정에 처하여 아기를 해외로 입양시킬 수 밖에는 없었겠지만 그나마 주소와 전화번호를 홀트아동복지회에 꾸준히 남겨두신 일은 참으로 훌륭하신 판단이었습니다. 두 분의 만남을 축하드립니다. 그리고 부탁이 있습니다. 수많은 해외 입양아들이 부모를 찾아 한국을 찾지만 허탕을 치고 돌아간답니다. 부모들이 아기를 복지회에 맡긴 이후에, 난희 씨의 아버님처럼 변경된 전화번호나 주소를 복지회에 계속해서 남기면 다행이지만 대개의 경우에는 이런저런 사정상 그렇게 하지 않고 있다고 들었습니다. 이번 두 사람의 만남은 아버님의 성실함에 전적으로 기인합니다. 이는 귀감이 되고 남습니다. 아기를 복지회에 넘겼지만 주소나 연락처가 변경될 때마다 계속 복지회에 연락처와 기록을 남긴다면 오늘 같은 만남의 기적도 이루어질 수도 있다는 사실을, 같은 처지에 놓인 많은 사람들이 알 수 있기를 나는 바란답니다. 아버님이 보내주신 서신이 비록 개인적인 서신이지만 이 서신을 <프레시안>을 통해 공개하여 수많은 비슷한 입장에 처한 사람들에게 소중한 교훈이 될 수 있었으면 합니다."고 메일을 보냈다.

    곧 난희의 아버지로부터 답이 왔다. "지금은 아련하기만 한 지나간 날들이 얼마나 눈물을 흘렸던 시간이었던지 이젠 기억이 나지 않습니다. 80년대 초반 업무 차 김포공항을 찾을 때마다 많은 아이들이 입양 차 떠나는 현장을 목격하며 나는 소리 없이 울었습니다. 그러나 지금부터는 울지 않겠습니다. 나에게는 사랑하는 딸 난희가 훌륭한 모습으로 돌아왔기 때문입니다. 선생님! 그동안 난희에게 쏟아주신 관심 대단히 감사합니다. 나의 두서없는 글이 다른 입양인들에게도 귀감이 된다면 어디에 공개하셔도 괜찮다고 생각합니다. 그리고 가능하시다면 우리의 난희를 계속 보살펴 주시기를 부탁드립니다. 선생님, 대단히 감사합니다. 서울에서 배광옥 올림."

    나는 배광옥 씨의 정중한 개인 서신을 그 분의 허락을 받아 여기에 공개하기로 마음을 정했다. 그래서 해외 입양아들이 부모를 찾아 한국을 다시 찾아왔을 때, 배광옥씨처럼 연락처나 주소가 변경되어도 계속해서 자신의 처지를 아기를 넘긴 복지회 등에 기록으로 남겨, 언젠가는 반드시 귀중한 만남들이 이루어지기를 기원하는 마음에서다.

    "김 상 수 선생님

    나는 서울 성북구에 거주하고 있는 배광옥(64세)입니다

    나는 충청남도 광천에서 태어나 학업과 군복무를 마친 1973년 일자리를 찾아 단신 상경하여 지인의 도움으로 한강변에 위치한 아파트 건설현장경비원으로 취직을 하게 되었고, 이듬해인 1974년에 김순희(金順姬)를 아내로 맞아 달동네인 동대문구 면목동의 단칸방에 행복한 가정을 꾸미게 되었습니다.

    아내와 나는 결혼 4년 전인 1970년에 맞나 그 동안 서로 인생의 반려자로 사귀었고 진정한 사랑을 토대로 맺어진 결혼생활은 비록 도아 주는 사람 하나 없는 낮선 서울이었지만 우리들만의 천국에서 지내왔던 시간들은 지금도 내 인생의 가장 행복했던 순간으로 기억되고 있습니다.

    겨울이면 윗목에 놓아둔 물그릇이 밤사이 얼음으로 변해있었고, 300m가 넘는 산 아래 미끄러운 비탈길까지 내려가 물을 길어오는 일, 언젠가 잠든 밤에 연탄가스가 문틈으로 새어 들어와 고생한 생각, 비만 오면 천장에서 떨어지는 물방울로 인하여 부엌의 그릇이 총동원되기도 하였고, 그릇에 떨어지는 물방울소리가 우리의 사랑을 축복하는 화음소리로 들으며 밤을 새웠던 추억, 여름철 뒷산에서 내려오는 모기떼와의 싸움, 다닥다닥한 방문 앞의 고약한 화장실 냄새 등, 정말 열악하기만 한 생활이었지만, 그래도 우리는 사랑이 있었기에 어떤 불편함도 극복할 수 있었고, 그 보다 더한 어려움도 아무 문제가 되지 않을 것 같았습니다.

    쉬는 날이면 근교 산에 올라 먼 고향 하늘을 바라보며 향수를 달래기도 하였고, 가끔 동네 시장에 들려 아내가 좋아하던 순대, 떡볶이, 오뎅 등을 나누어 먹으며 즐거운 시간을 보내기도 하였습니다. 또 밤이 되면 중랑천 뚝방에 앉아 물에 반사되는 불빛을 바라보며 아내가 좋아하던 노래를 같이 부르기도 하였습니다.

    이렇듯 행복한 결혼 생활의 축복 속에서 아내는 어느덧 아이를 갖게 되었고, 사랑의 결실, 우리의 귀여운 아이가 태어나는 날 만을 고대하며 우리는 아기를 위하여 무었을 어떻게 해줄 것인가 하는 행복한 고민을 이야기하는 것도 우리 일과의 하나를 차지하고 있었습니다.

    1975년 6월 18일, 아침 무렵부터 아내의 출산진통이 시작되었습니다. 고통스러워하는 아내를 데리고 병원을 찾았습니다. 의사는 진찰결과 예상하지도 못했던 임신중독이라는 진단과, 제왕절개 수술을 하지 않으면 산모가 위험해 질 수 있다는 심각한 이야기까지 해 주었습니다. 임신말기 다리가 조금씩 부어오르는 증세는 임산부 대부분에게 발생되는 일반적인 현상이고 의사들은 산모가 출산차 병원을 방문하게 되면 많은 진료비를 받아내기 위하여 관행적으로 제왕절개 수술을 유도한다는 이웃 사람들의 이야기를 들은바 있는지라 의사의 수술권유에 대한 불신이 당시에는 매우 컸습니다.

    그리고 수술비를 마련해야 한다는 금전적인 부담은 어리석은 판단으로 유도하는 결정적인 요인이 되고 말았습니다. 또한 아내도 수술에 대한 공포 때문이었는지 집으로 그냥 돌아가기를 희망하여 설마 아내에게 무슨 일이야 있겠는가? 하는 안이한 생각을 가지고 귀가하게 되었습니다.

    집으로 돌아와 한동안 괜찮던 아내의 얼굴이 또다시 일그러지더니 고통이 점점 심해지는 것입니다. 이번에는 이웃 아주머니의 소개로 근처 조산원을 찾게 되었는데 담당 산파는 오전에 병원에서 상담했던 내용들과 현재 산모의 상태를 살펴본 후 그렇게 심각한 정도는 아닌 것 같으니 자기네 조산원에서 출산할 것을 권유하였습니다. 또 조산원 2층에는 병원(산부인과)이 있어 만약 응급상황이 발생한다 해도 신속히 대처할 수 있겠다는 안도감으로 조산원에서 아이를 출산하기로 결정하였습니다.

    아내는 시간이 지날수록 산고에 따른 신음의 간격도 빨라지고 또 그 소리도 점점 커져가고 있었습니다. 그 고통에 대하여 대신하거나 나눌 수 없는 나는 괴로워하는 아내의 모습을 무기력하게 지켜보는 것이 전부였고 한없이 초라한 존재였습니다. 나는 아내의 손을 꼭 잡고 있는 것으로 현재의 심정이나 하고 싶은 말을 대신 하였습니다. 아내의 진통은 한동안 이어지고 이러기를 세 시간 여, "앙!∼" 하는 아이의 힘찬 울음소리가 들리고 드디어 새 생명이자 나의 유일한 혈육이 이 세상에 태어났습니다(이때 병실의 시계는 밤 10시 50분을 가리키고 있었습니다.)

    땀에 흠뻑 젖어있는 아내의 얼굴을 쓰다듬으며 수고했다는 말과 함께 출산의 고통을 참고 견디면서 아이를 출산한 아내가 무척 대견하고 사랑스럽게 보였고, 아무리 첫 아이라 힘들다고는 하지만 이 정도 심한 고통이라면 첫 번째 아이로 만족하고 말겠다는 마음속의 다짐도 했었습니다.

    그런데 출산직후 계속 이어져야 하는 후산이 진행되지 않고 있는 것입니다. 조산원의 담당산파는 산부인과 의사와 전화로 무엇인지 상의하고 아내는 즉시 2층의 산부인과 병실로 옮겨지게 되었고 몇 병으로 헤아려지는 수혈이 진행되고 후산과 관련된 의사의 조치가 가해지는 순간, 아내는 많은 양의 피를 하혈하게 되면서 얼굴은 차츰 백지장처럼 변하고 있었습니다. 당황한 의사는 자신으로써는 감당할 수 없음을 판단했음인지 산모를 신속히 종합병원으로 옮겨야 한다는 결정을 하고 아내를 도심의 병원으로 이송하기에 이르렀습니다. 당시만 해도 흔치 않았던 앰뷸런스를 불러 환자를 이송한다는 것은 아내의 현재 상태나 시간상으로 도저히 불가능한 상황이었고, 그래서 급한 대로 택시를 이용하기로 하였는데 자정이 넘은 시간(당시만 해도 자정에서 새벽4기까지 통행금지 제도가 있었음)에 택시잡기가 용이하지가 않았습니다.

    마침 일을 마치고 차고로 돌아가는 택시를 세워 정황을 설명하고 간곡히 부탁한 결과, 고마운 운전사는 흔쾌히 자동차 문을 열어주었고, 택시안 내 가슴에 안겨있는 아내는 편안하게 잠든 모습을 하고 있었으며 가느다란 신음소리만 현재의 고통을 표현하는 것 같았습니다.

    "여보! 조금만 참아"

    아내의 손을 꼭 잡고 어서 빨리 병원에 도착하여 무사하기만을 기원하고 있는 나의 심정과 아내의 위급함을 알았는지 운전기사는 나름대로 속력을 높여 질주하고 있는 것 같았지만 자동차의 속도는 한없이 느리게만 느껴져 나도 모르는 사이 발을 동동 구르기도 하였습니다.

    산부인과를 출발하여 도심 병원의 응급실 병상에 도착하기까지 약40여분, 의사는 진단결과 이미 숨을 거둔지 10여분이 경과하였다는 청천병력과 같은 이야기와 의료진 몇 사람이 달려들어 여러 차례 걸친 소생술을 시도하였으나 아내는 영원히 돌아올 수 없는 저 세상 사람이 되고만 것입니다.

    "하느님! 이 세상 많고 많은 사람 중에 어찌하여 저의 아내를"

    하늘이 무너지고 모든 세상이 뒤바뀌는 심정에 아무것도 보이지 않고 그저 지나가는 자동차에 뛰어들고 싶은 나의 충동을 알았는지 동행했던 산부인과 의사는 항상 나의 곁에 있어 주었습니다.

    그렇게 하여 사랑하는 아내는 나의 곁을 떠났고, 아내의 시신은 화장 후 평소에 자주 찾았던 북한산 바위에 올라 하얗게 부서지는 아내를 바람 속으로 날려 보내며 이제는 고통과 시련이 없는 편안한 하늘나라에서 영면하기를 빌었습니다.

    아내의 장례를 마친 후 깜깜한 방안에서 한없이 울고 있는 어린 핏덩어리를 안고 3일간을 곰곰이 생각하여 보았습니다. 나의 무능함과 어리석음으로 인하여 아내를 저 세상으로 보냈구나 하는 죄책감과 아내 없는 막막한 이 세상에서 혼자 살아서 무엇을 하겠는가 하는 생각들이 나도 아내 곁으로 가겠다는 생각도 해 보았지만, 옆에서 우는 아기에게 우유병을 물려주는 순간마다 비겁하기만 한 생각들에 채찍이 되어주곤 하였습니다.

    아기는 나의 유일한 혈육이자 아내가 떠나면서 나에게 남겨준 마지막 선물이다, 그리고 아내가 없는 이 세상에서 아기만이 아내를 대신하는 유일한 나의 가족이다, 나는 무슨 일이 있어도 이 아이의 아버지로써 의무를 다해야 한다, 그러나 무슨 수로 이 아이를 부양해야 하나 하는 현실과 관련된 대책에는 아무런 해답을 찾을 수 없었습니다. 이에 따라 얻은 결론은 해외입양이었습니다.

    한국전쟁을 시작으로 발생된 고아나 미혼모 아이들의 해외입양을 주선하기 위하여 종교단체나 입양기관들의 성실한 노력으로 좋은 결실들을 보이고 있었고 이에 따라 해외입양에 대한 사회 인식도 비교적 좋은 편이었습니다.

    또한 한국 보다 훨씬 잘살고 있는 유럽이나 미국 같은 선진국에 입양을 보낸다면 성장해 가는 아이의 앞날도 훨씬 좋은 환경이 될 것이라는 기대감은 아기를 멀고 먼 해외로 보낸 후 어쩌면 다시는 볼 수 없을 것이라는 걱정들을 떨쳐 버리기에 충분하였습니다.

    그러나 어떻게 저 어린 핏덩어리를 어떻게 지금 보낼 수가 있을까? 하는 생각은 입양의 실행에 있어 또 다른 문제로 나를 혼란스럽게 하였습니다.

    그렇지만 1년이나 2년 이후로 입양을 미룬다면 그때 다시 입양 여부에 대하여 결정하여야 하는 새로운 괴로움이 따를 것이고, 이이를 키우는 동안 맺은 정을 떨쳐 버린다는 것은 더욱 고통스러운 일이 될 수 있기 때문에 어쩌면 입양을 영원히 포기해야 한다는 경우가 올 수 있다는 생각과 무엇보다도 남자 혼자 생업에 종사하며 핏덩어리에 가까운 아이를 키운다는 것도 내가 처한 현실로 보아 불가능한 것이기 때문에 해외입양을 결정한 지금은 하루라도 빨리 보내는 것이 최선책이 될 수 있을 것이라는 최종 판단을 하기에 이르렀습니다.

    그렇게 해서 아이의 해외입양을 신속하게 결정하고 홀트아동복지회의 문을 두드리게 되었습니다.

    ○ 아이의 이름은 배난희(裵蘭姬)-

    난초蘭- 계집姬-

    蘭 : 난초는 온갖 풍상과 역경 속에 피어나는 우리나라 전래의 꽃임과 동시 꽃이 고아하고 향기가 그윽한 절개의 상징으로 조상들로부터 사군자 중에 가장 사랑을 받은 꽃으로 알고 있었습니다

    姬 : 엄마의 이름(金順姬)중 마지막 姬자를 붙여주어 엄마를 기리게 하는 것도 좋을 것 같다는 생각에 뒷 글자로 선택하게 되었습니다.

    ○생년월일은 1975년 8월 18일- (홀트회에서 옮겨 적는 과정에서 6월 19일로 잘못 기재된 것으로 판단됨)

    기타 태어난 장소 등 아기에 대한 나머지 정보들을 홀트회에 제공한 것으로 생각나지만 정확하게 어떤 정보를 어떤 내용으로 제공되었는지는 기억이 나지 않고 있습니다.

    잠시 늙으신 홀어머님이 당신께서 직접 난희를 키우겠다고 하시며 해외 입양을 만류하셨지만 저는 어머님의 뜻을 거역하는 불효를 저지르고 말았습니다.

    그렇게 난희를 떠나보냈고, 이후 난희의 해외 입양과 관련된 정보는 아무것도 확인 할 수 없었습니다. 어쩌다 홀트회에 문의를 하게되면 전혀 확인해 줄 수 없다는 냉랭하고 사무적인 메아리로만 되돌아 올 뿐 이었습니다.

    나는 그런 것들이 난희의 해외입양 생활에서 혹시 있을 수 있는 부정적인 영향들을 사전에 예방하기 위한 업무상 필요한 조치였을 것이라고 나름대로 생각하고 싶었습니다.

    난희를 떠나보낸 후 괴로운 심정으로 한 달 정도를 술로 살았습니다. 날이 새면 아내생각, 그리고 술이 깨면 난희 걱정, 도저히 맨 정신으로는 자책의 괴로움을 이겨낼 수 없었고 술을 마시지 않으면 아내와 아이의 환영으로 잠을 이룰 수 가 없었습니다. 어쩌다가 꿈속에서 아내가 나타나기라도 하면 나는 소리를 지르며 아내를 불러 댔고, 차츰 멀어 가는 아내를 따라가기 위하여 몸부림을 치기도 했습니다.

    이렇게 폐인이 되어 가는 아들을 더 이상 방치할 수 없다는 생각 때문이셨는지 늙으신 어머님께서 상경을 하셨습니다. 그리고 뒤늦게 소식을 들은 친구 몇 명이 우리 집에 찾아와 나와 생활을 함께 하게 되었습니다.

    시간이 지나면서 차츰 이성과 냉정을 되찾게 되었고, 앞길이 구만리 같은 나의 앞날을 위하여 열심히 살아야 한다는 각오는 나를 새로운 인생으로 거듭 태어나게 했습니다.

    다음 해에는 새로운 아내를 맞이하여 재혼도 하였고 새로운 아내와의 사이에서 아들과 딸을 두게 되었습니다.

    재혼 이후 열심히 노력한 20여 년, 어느 정도 생활에 안정을 찾게 되었고, 해외입양을 떠나보낸 난희의 소식이 궁금하고 걱정하는 정신적인 여유도 갖게 되었습니다.

    그런 취지에서 다시 찾은 홀트회는 모습이 많이 변해 있었습니다. 우선 사무실의 규모도 그전에 비해 많이 축소된 것 같았고 담당직원은 종전과는 달리 나의 질문에 대하여 비교적 성실한 것 같았습니다. 확인된 것은 난희가 프랑스로 입양되었지만 나머지 사항들은 자신들로서도 알 수 없다는 답변과 프랑스 입양아 모임인 "한국의 뿌리"라는 단체가 있다는 사실도 이야기 해주었습니다. 그렇지만 입양아의 현실과 난희나 양부모의 프라이버시를 존중하여 아무리 친부모라 해도 먼저 찾는다는 것은 아이에 도움이 되지 않는다는 충고도 해 주었습니다. 오로지 내가 할 수 있는 것은 난희가 추후 한국을 방문하여 친부모를 찾을 경우에 대비하여 홀트회에 연락처를 남기는 것이 전부였습니다.

    이후 입양아들이 대부분 여름철에 고국을 찾는다는 사실을 확인하고 나의 주소나 전화번호가 바뀌게 되면 여름철 씨즌이 오기 전에 홀트회를 찾아 나의 정보를 변경하곤 하였습니다.

    몇 년 전에는 아시는 신부님께서 프랑스에 방문할 일이 있으시다 하여 사정이야기를 드렸습니다. 마침 파리 시청에 아시는 분이 있어 프랑스 방문기간 동안에 한번 알아보겠다 하시어 난희의 인적사항과 입양아 모임인 "한국의 뿌리"회(당시회장, 미쉘 수스만스키)에 대한 알고 있는 정보를 드린 적이 있었습니다. 신부님은 여러 가지 노력을 하셨지만 그러나 딸의 소식은 알 수가 없었습니다.

    이제 어찌해야 난희를 볼 수 있을 것인가?

    ▲ ⓒ김상수
    그러던 2009년 9월 7일, 뜻 밖에도 홀트회의 전화를 받았습니다

    난희가 지금 한국에 와 있다는 것입니다. 나는 내 귀를 의심했습니다. 아니면, 내게 전화를 걸고 있는 사람의 진정한 의도가 궁금하기도 했습니다.

    그러나 난희가 한국에 와있는 것은 사실이었습니다.

    더구나 난희가 나를 찾고 있다는 사실은 내 일생 최대의 신선한 충격으로 자극되어 한없는 눈물이 나오기만 합니다.

    난희와 나는 9월 28일 홀트회의 주선으로 상면하기로 예정되어 있습니다.

    난희는 그 때까지 한국을 여행한다는 것이고 누구의 안내로 어디를 다니고 있는지 그리고 어떻게 지내고 있는 지도 알 수가 없습니다. 난희가 한국에 와 있는 현실에도 지금은 아버지로써 딸을 위해서 해 줄 수 있는 것은 아무것도 없습니다. 홀트회에 문의해 보아도 난희와 관련된 정보 등을 알려 줄 수가 없고 상면 시에 직접 확인하라는 답변뿐입니다. 심지어 프랑스 이름까지도 말입니다.

    컴퓨터를 열심히 뒤졌습니다.

    다행히 선생님께서 써신 프레시안에 칼럼을 찾았습니다. 그리고 훌륭한 모습으로 성장해 있는 난희의 모습을 보았습니다.

    나는 지금 가슴이 벅차 있습니다. 그동안 꿈속에서나 상상했던 사랑하는 나의 딸 난희를 그려보며 직접 만난다는 기대에 부풀어 있습니다. 그러나 한편으로는 두려움이 앞서기도 합니다.

    그 동한 외로운 이국땅에서 부모로부터 버림받았다는 응어리진 것을 가슴에 앉고 있었을 난희의 원망스런 시선 앞에 나서서 용서를 빌기가 한없이 두렵기만 합니다.

    나는 이것을 감수함과 동시 극복해야 합니다, 그리고, 언어 소통의 장벽 속에 난희를 떠나보낼 수뿐이 없었던 절박한 당시의 상황을 꼭 이야기해 주어야 합니다.

    그러나, 설사 난희를 맞나보지 못한다 해도 이제는 괜찮을 것 같습니다

    나는 난희의 훌륭한 모습을 이미 사진으로 보았기 때문입니다. 그리고 내가 난희에게 반드시 들려주어야 했고, 하고 싶었던 여러 가지의 이야기들이 언어의 장벽으로 모두 전달되지 못한다 해도 이제는 괜찮을 것 같습니다. 왜냐하면 우리는 눈빛으로 대화가 가능할 것 같기 때문입니다. 아니면 몇 마디의 이야기로 전해줄 수 없었던 사연들은 진한 핏줄이 모든 것을 덮어줄 것이라 믿고 있습니다.

    선생님의 칼럼에 게재된 난희의 사진을 보았습니다. 눈매는 나를 닮은 것 같지만 입 주변의 모습들은 엄마를 보는 것 같습니다. 엄마가 생시에 좋아했던 진달래색 립스틱을 난희도 좋아했으면 좋겠습니다. 난희의 모습을 선생님이 쓴 칼럼 속에서 다운로드 하여 지금 내 컴퓨터 바탕화면에 올려놓았습니다.

    난희를 떠나보내고 난 겨울 석유난로가 전복되는 주인집 화재사고로 가옥 전체가 소실되고 방안의 가재도구도 모두 불타 버렸습니다. 이때 나의 사진들도 함께 불타 버려 남은 것은 아무것도 없습니다. 그러나 나는 이제는 언제든지 귀여운 난희의 모습을 볼 수 있습니다. 그리고 꿈속에서나 볼 수 있었던 난희 엄마의 생전모습을 직접 본 것 같아 무척 행복합니다.

    이제는 난희를 이렇게 훌륭한 사람으로 키워주시고 보살펴주신 프랑스에 계시는 양부모님을 찾아 정말 감사하다는 인사도 드려야 합니다. 그리고, 사랑스럽고 대견스런 난희의 발전을 위하여 내가 할 수 있는 어떠한 노력도 아끼지 않을 것입니다.

    나는 지금 뭐라 표현할 수 없는 행복한 눈물이 끝없이 흘러내리고 있습니다.

    선생님! 두서없는 글이지만 끝까지 읽어 주시어 대단히 감사합니다.

    2009년 9월 11일

    대한민국 서울에서 배 광 옥 올립니다."

    오는 9월 28일, 34년간 그 기나긴 간난(艱難)의 세월을 지나 드디어 두 사람은 절절(切切)한 만남의 시간을 갖는다. 나는 이분들의 상봉을 진심으로 축하드린다.

    베를린에서

    김상수/ 작가

    (☞바로 가기 :
    필자 홈페이지)

    posted by 좋은느낌/원철
    2009. 8. 28. 11:36 개발/JavaScript
    출처 : http://kwon37xi.egloos.com/2558053

    * A Simpler Ajax Path가 Ajax 입문에 좋은 글.

    Ajax의 개발 순서

    1. XMLHttpRequest 객체 생성
    2. HTTP 요청을 발생시킴(open(), send())
    3. 서버측에서 XMLHttpRequest를 통해 보낸 요청을 받아서 파라미터를 분석하고, 작업을 한 뒤에 결과를 XML이나 문자열로 리턴한다.
    4. XMLHttpRequest로 서버가 리턴한 데이터를 받아서 처리(onreadystatechange, responseText, responseXML)

    XMLHttpRequest에 의한 송수신 상세 예

    JavaScript에서 XMLHttpRequest Object 생성하기

    // XMLHttpRequest 오브젝트 생성 함수
    // @sample oj = createHttpRequest();
    // @return XMLHttpRequest 오브젝트
    function createHttpRequest()
    {
        if (window.ActiveXObject) {
            try {
                // IE6
                return new ActiveXObject("Msxml2.XMLHTTP");
            } catch (e) {
                try {
                    // IE4, IE5
                    return new ActiveXObject("Microsoft.XMLHTTP");
                } catch (e2) {
                    return null;
                }
            }
        } else if (window.XMLHttpRequest) {
            // Mozilla, FireFox, Opera, Safari, Konqueror3
            return new XMLHttpRequest();
        } else {
            return null;
        }
    }


    HTTP 요청 발생

     1. open() 메소드 실행 (POST/GET, 요청URL, 동기/비동기지정)
    var request = createHttpRequest();
    request.open("GET", "/test.xml");
     
    // param 1 : GET/POST
    // param 2 : URL
    // param 3 : 생략가능. 동기/비동기 여부. 기본 비동기.

     2. send() 메소드(데이터 송신)
     request.send(""); // 데이터 없이 전송할때 혹은
     request.send(null); // Konqueror에서는 오류 발생함. Konqueror를 제외하고 데이터 없이 전송할 때 사용가능

    위 a,b가 기본적인 모양새이지만, 실제로 GET과 POST 방식에 따라 차이가 많이난다.

      * GET 방식 : GET 방식은 URL에 파라미터를 직접 붙여 보내지만, 한글 등의 문제로 인코딩이 필요하고, RequestHeader 설정도 필요하다. 일반적으로 다음과 같은 모양이 된다.
    var paramName = encodeURIComponent("파라미터명"); // 파라미터이름을 UTF-8로 인코딩
    var paramValue = encodedURIComponent("파라미터값"); // 파라미터 값을 UTF-8로 인코딩

    // 파라미터 구분에 사용되는 ?와 &는 인코딩 되면 안된다. 그래서 따로 붙인다.
    var fullParameter = '?' + paramName + '=' + paramValue; // URL에 사용할 파라미터 구성

    request.open("GET", "/test.cgi" + data);

    // setRequestHeader()는 open()보다 이후에 나와야만 한다.
    // 아래는 파라미터 값을 UTF-8로 인코딩해서 보내겠다는 의미.
    // GET방식에서는 필요 없고, POST방식에서는 필수이다.
    request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');

    request.send(null);


      * POST 방식 : send() 메소드에 인수를 데이터로 넘긴다.
    request.open("POST", "/test.cgi");
    request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
    // POST 방식에서도 파라미터를 인코딩하여 send()메소드의 인자로 넘겨주면 된다.
    request.send("name=test&data=123");

    A Simpler Ajax Path에 보면 HTML폼에 입력된 값을 자동으로 파라미터 문자열로 변경해주는 메소드 예가 있다.

    착신과 데이터 처리

     * onreadystatechange 이벤트(송수신 상태 변할때 기동) - IE 이외 부라우저에서는 콜백 스타일의 onload 이벤트 사용가능
     * readyState 프라퍼티 (송수신 상태를 나타내는 값. "4"가 송신 완료) - onload의 경우에는 불필요
    onreadystatechange는 요청 처리 상태를 나타내는 readyState 프라퍼티의 값이 바뀔 때 발생한다.
     * 착신을 처리할 함수 지정은 request.open() 함수를 호출하기 전에 선언해야 정상 작동했다. 항상 요청을 보내기 전에 요청을 처리할 함수 지정을 해둔다.
    request.onreadystatechange = callbackFunction; // callbackFunction() 함수가 호출된다.

    function callbackFunction() {
        // readyState == 4는 착신 완료를 의미한다.
        if (request.readyState == 4) {
            // 착신시의 처리
        }
    }

    다른 방법으로, callback 함수를 인라인으로 정의하고, HTTP 상태 코드가 200일때만 작업하도록 할 수도 있다. 두가지를 한꺼번에 보면,
    request.onreadystatechange = funcation() {
        if (request.readyState == 4 &&
                request.status == 200) {
            // 착신시의 처리
        }
    }

    onreadystatechange 대신 onload를 사용할 수 있다. Opera 8은 버그때문에 onload만 사용한다. (IE를 제외한 다른 브라우저에서 다 된다) 
    request.onload = function() {
        // 착신시의 처리
    }

    onload와 onreadystatechange를 동시에 이용하기 위해서 다음과 같이한다.
    if (window.opera) {
        request.onload = function() { callback(request); }
    } else {
        request.onreadystatechange = function() {
            if (request.readyState == 4) {
                callback(request);
            }
        }
    }

    function callback(request) {
        // 실제 착신시의 처리를 구현하는 부분
    }

     * responseText 또는 responseXML (데이터를 텍스트 혹은 DOMDocument로 수신)
       * responseText : 텍스트로 받기
       * responseXml : XML로 받기
       * 여러줄의 CSV 텍스트를 받았을 때의 일반적 처리
    var res = request.responseText;
    var rows = res.split(" "); // 여러 줄을 한 줄씩 배열로 만든다.
    var cols = rows[0].split(","); // 첫번째 줄을 쉼표 단위로 분리하여 배열로 만든다.

       * JSON 처리
    eval("res = " + request.responseText)
    //... 기타 처리

       * XML 처리
    <?xml version="1.0"?>
    <lists>
      <name>Toshiro Takahashi</name>
      <msg>hello</msg>
    </lists>

    var res = request.responseXML;
    var msgs = res.getElementsByTagName("msg"); // DOM 객체 사용

    alert(msg[0].firstChild.nodeValue);


    서버측 스크립트

    XMLHttpRequest.send() 에 의해 요청을 받아 처리하게 되는 서버측 스크립트(JSP, Servlet, ASP, PHP 등)은 요청 파라미터를 분석하여 작업을 처리한 뒤에 결과를 Text나 XML로 리턴하면 된다. 
     * 리턴시 문자 인코딩은 기본적으로 UTF-8로 한다.
     * 텍스트로 리턴할 경우, Opera 8, Konqueror 3, Safari 등은 UTF-8을 인식하지 못한다. 서버는 응답 문자열을 UTF-8기준으로 URI 인코딩을 해서(Java의 경우 java.net.URLEncoder.encode() 메소드 사용) 리턴하고, 받는 측(웹 브라우져)는 다음과 같이 해석하면 정상적인 문자열을 받게 된다.(실제로는 작동하지 않으므로 URLEncoder를 사용하지말고 받는 자바 스크립트 측에서도 아래와 같이 받지 말고 그냥 request.responseText를 받을 것)
    // Mozilla FireFox와 IE에서는 Encode/Decode할 경우
    //공백이 +로 바뀌는 현상이 발생했다. 그래서 안쓴다.
    // JavaScript측에서 decodeURIComponent를 안하면 서버측에서도 URLEncoding을 하면 안된다.
    var res = decodeURIComponent(request.responseText);


    JSP/Servlet 에서 Ajax와 한글 인코딩 문제

    Ajax는 기본적으로 UTF-8 만으로 통신을 한다고 보면된다. 그 이외의 Encoding을 지원하는 인코딩 함수가 없기 때문에 EUC-KR로 데이터를 전송하려는 꿈은 접어야만 한다.
    헌데, 아직 우리나라는 EUC-KR 인코딩으로 된 웹 어플리케이션이 압도적으로 많은 상황이다(어서 빨리 UTF-8로 옮겨가길 바라마지 않는다).
    거기다가 보통 JSP/Servlet 웹 어플리케이션은 Servlet 스펙 2.3이후부터 문자 인코딩 서블릿 필터를 사용해 모든 요청에 대해 일관된 문자 인코딩을 사용하는 것이 보편적인 방법으로 자리잡았다.

    서블릿 필터는 일관성있게 모든 요청을 EUC-KR로 받아들이게 했는데, 몇몇 Ajax관련 요청만 UTF-8로 받아들여야만 하는 것이다.
    필터를 적용할 URL-Pattern을 따로 줘보려 했으나, 너무 복잡해졌다.
    그래서 HTTP 요청의 헤더를 이용해서 해결 했다.

    아.. 한가지 더. 현재 한글 문제는 "XMLHttpRequest 요청 -> JSP/Servlet" 이 상황에서만 발생하는 것이다.
    "JSP/Servlet -> XMLHttpRequest"의 상황(서버에서 클라이언트로 값을 리턴)에서는 이 문제가 발생하지 않는다.
    서버가 리턴하는 문자열은 간단하게 다음처럼 하면 WAS가 자동으로 UTF-8로 값을 변경해서 전달하기 때문이다.
    <%@ page contentType="text/plain; charset=utf-8" pageEncoding="EUC-KR"%>

    contentType에서 text/plain은 텍스트나 JSON으로 값을 리턴할 때이다. XML로 리턴할 때는 text/xml.

    아래는 Ajax 요청을 처리하기 위해서 만들어본 간단한 Encoding Filter 이다.
    package ajax.filter;

    import java.io.IOException;

    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;

    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;

    /**
     * 어플리케이션 전체에 적용되는 필터이다.
     * 
     * <ul>
     * <li>encoding 파라미터 : encoding 파라미터를 설정하면 request 객체에
     * setCharacterEncoding(encoding)을 실행한다.</li>
     * <li>ajaxFlag 파라미터 : Ajax요청임을 나타내는 HTTP 파라미터 이름이다. ajaxFilter로 지정한 HTTP 파라미터의
     * 값이 true 로 설정되면 인코딩을 무조건 UTF-8로 설정한다.</li>
     * </ul>
     * 
     * @author 손권남(kwon37xi@yahoo.co.kr)
     * 
     */
    public class EncodingFilter implements Filter {

        private Log log = LogFactory.getLog(this.getClass());

        /** HTTP 요청 문자 인코딩 */
        private String encoding = null;

        /** Ajax 요청임을 나타내는 플래그 파라미터 이름 */
        private String ajaxFlag = null;

        public void doFilter(ServletRequest request, ServletResponse response,
                FilterChain chain) throws IOException, ServletException {

            if (ajaxFlag != null
                    && "true".equals(((HttpServletRequest) request)
                            .getHeader(ajaxFlag))) {
                // Ajax 처리 요청일 경우 무조건 UTF-8 지정.
                request.setCharacterEncoding("UTF-8");
                if (log.isDebugEnabled()) {
                    log.debug("요청 헤더에 " + ajaxFlag + "가 "
                            + ((HttpServletRequest) request).getHeader(ajaxFlag)
                            + "로 설정되어 있어 문자 인코딩에  UTF-8을 사용합니다.");
                }
            } else if (encoding != null) {
                // Ajax 플래그가 true가 아니면, 기본적인 인코딩을 적용한다.
                request.setCharacterEncoding(encoding);
                if (log.isDebugEnabled()) {
                    log.debug("문자 인코딩에 " + encoding + "을 사용합니다.");
                }
            }

            chain.doFilter(request, response);
        }

        public void init(FilterConfig config) throws ServletException {
            encoding = config.getInitParameter("encoding");

            ajaxFlag = config.getInitParameter("ajaxFlag");

            if (log.isDebugEnabled()) {
                log.info("encoding : " + encoding + ", ajaxFlag : " + ajaxFlag);
            }
        }

        public void destroy() {
        }
    }

    이 필터를 적용하고서, web.xml에 다음 내용을 추가하면 필터가 작동한다.
    <filter>
        <description>이중 인코딩 필터</description>
        <filter-name>EncodingFilter</filter-name>
        <filter-class>ajax.filter.EncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>euc-kr</param-value>
        </init-param>
        <init-param>
            <param-name>ajaxFlag</param-name>
            <param-value>Ajax</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>EncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    여기 내용을 보면, 기본적인 인코딩은 EUC-KR이고, 요청 헤더에 "Ajax" 헤더의 값이 "true"일 경우에는 강제로 UTF-8을 지정하라고 한 것이다. "ajaxFlag"의 값을 변경하면 헤더의 키을 "Ajax"가 아닌 다른 값으로도 지정할 수 있다. 하지만 아무튼 해당 헤더의 값을 "true"로 지정하면 Ajax로 인식하게 되는 것이다.

    이를 위해서는 XMLHttpRequest에도 한가지 처리를 더 보태야 한다.
        request.open("GET", "AjaxProcessor.jsp" + fullParameter);
        request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
        request.setRequestHeader('Ajax', 'true');

    당연히 헤더에 값 Ajax요청임을 명시하는 값을 설정하는 것이다.

    그리고 다음 문제가 또 있는데, Tomcat 버전별로 문자 인코딩 설정이 달라질 수 있다는 것이다.
    위 내용은 Tomcat 4.x에서는 정상 작동하지만, Tomcat 5.x 에서는 제대로 작동하지 않는다.
    Tomcat 5.x에서는 server.xml 에 GET 방식의 요청에 대한 인코딩을 지정하기 때문이다.
    여기서 URIEncoding="euc-kr" 을 사용하지 않고, useBodyEncodingForURI="true"을 사용하면 Tomcat 4.x 처럼 request.setCharacterEncoding()의 값을 따라가게 할 수 있다.
    Tomcat과 한글에 대해서는 Tomcat/JSP와 한글문서를 참조한다.

    또하나 Ajax임을 나타내는 플래그를 HTTP 요청 헤더에 설정하도록 했는데, 그러지 않고 요청 파라미터(request.getParameter()로 값을 얻어올 수 있는 것)으로 설정하면 안된다.
    request.getParameter()가 실행되어 Ajax 플래그의 값을 감지하는 그 순간, 그 이후 호출되는 request.setCharacterEncoding()는 완전히 무시되어 버리기 때문이다.

    예제

    급조한 예제이다.
    * AjaxCaller.jsp - Ajax 호출부(클라이언트) : 수식을 만들어서 서버측에 계산을 요청한다.
    <%@ page language="java" contentType="text/html; charset=EUC-KR"
        pageEncoding="EUC-KR"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
    <title>Insert title here</title>
    <script type="text/javascript">
    // XMLHttpRequest 오브젝트 생성 함수
    // @sample oj = createHttpRequest();
    // @return XMLHttpRequest 오브젝트
    function createHttpRequest()
    {
        if (window.ActiveXObject) {
            try {
                // IE6
                return new ActiveXObject("Msxml2.XMLHTTP");
            } catch (e) {
                try {
                    // IE4, IE5
                    return new ActiveXObject("Microsoft.XMLHTTP");
                } catch (e2) {
                    return null;
                }
            }
        } else if (window.XMLHttpRequest) {
            // Mozilla, FireFox, Opera, Safari, Konqueror3
            return new XMLHttpRequest();
        } else {
            return null;
        }
    }

    // 계산을 수행한다.
    function calc() {
        var request = createHttpRequest();
        var nameParam = encodeURIComponent("name");
        var nameValue = encodeURIComponent(document.getElementById("name").value);
        
        var oper1Param = encodeURIComponent("oper1");
        var oper1Value = encodeURIComponent(document.getElementById("oper1").value);
        
        var oper2Param = encodeURIComponent("oper2");
        var oper2Value = encodeURIComponent(document.getElementById("oper2").value);
        
        var operatorParam = encodeURIComponent("operator");
        var operatorValue = encodeURIComponent(document.getElementById("operator").value);
        
        var fullParameter =
            "?" + nameParam + "=" + nameValue
            + "&" + oper1Param + "=" + oper1Value
            + "&" + oper2Param + "=" + oper2Value
            + "&" + operatorParam + "=" + operatorValue;
        
        request.onreadystatechange = function() {
            if (request.readyState == 4) {
                alert("Response : " + request.responseText);
                eval("var result = " + request.responseText);
                alert(result.name + "님 계산결과는 " + result.value + "입니다.");
            }
        }
        
        request.open("GET", "AjaxProcessor.jsp" + fullParameter);
        request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
        request.setRequestHeader('Ajax', 'true');
        request.send("");

    } // end of calc()
    </script>
    </head>
    <body>
    이름 : <input type="text" id="name" /> <br />
    <input type="text" id="oper1" />
    <select id="operator">
        <option value="+">+</option>
        <option value="-">-</option>
        <option value="*">*</option>
        <option value="/">/</option>
    </select>
    <input type="text" id="oper2" />
    <input type="button" value="계산하기" onclick="calc()" />
    </body>
    </html>

    * AjaxProcessor.jsp - Ajax 처리부(서버) : 수식을 계산한 결과를 JSON 형태로 리턴한다
    <%@ page contentType="text; charset=utf-8" pageEncoding="EUC-KR"%>
    <%
    System.out.println("AjaxProcessor.jsp 시작");

    String result = null;

    String name = request.getParameter("name");
    String oper1 = request.getParameter("oper1");
    String oper2 = request.getParameter("oper2");
    String operator = request.getParameter("operator");

    double oper1Value = Double.parseDouble(oper1);
    double oper2Value = Double.parseDouble(oper2);

    double calcResult = 0;

    if ("+".equals(operator)) {
        calcResult = oper1Value + oper2Value;
    } else if ("-".equals(operator)) {
        calcResult = oper1Value - oper2Value;
    } else if ("*".equals(operator)) {
        calcResult = oper1Value * oper2Value;
    } else {
        calcResult = oper1Value / oper2Value;
    }

    result = "{  " +
        ""name" : "" + name + "", " +
        ""value" : "" + calcResult + "" " +
        "} ";
    System.out.println("Result : " + result);

    %><%= result%><%
    System.out.println("AjaxProcessor.jsp 끝");
    %>

    이름 입력 부분에 한글을 입력하여 문제없이 처리되는지 확인해보기 바란다.

    JSON

    Ajax(JavaScript)는 데이터를 리턴 받는 방법으로 XML/Text/JSON을 지원한다. JSON은 텍스트 형태로 객체를 정의하는 방식이다. 이것은 XML과 1:1 매칭을 할 수도 있다. XML보다 훨씬 만들기 쉽고 사용법도 자바 객체를 사용하는 것과 유사하다. 그래서 이걸 사용해서 프로그램을 작성했다.
    {
      "test1": "hello",
      "test2": "hello2"
    }

    위와 같은 메시지를 서버에서 응답으로 내보냈다고 할 때
    // JSON 형태의 텍스트를 JavaScript 객체화 한다.
    eval("res = " + request.responseText);

    // 객체를 사용한다.
    alert(res.test2); // 이 명령은 "hello2"를 출력한다.

    배열은 다음과 같이 생성한다.
    [
      ["test1", "test2"],
      ["test3", "test4"]
    ]

    아래와 같이 사용한다.
    eval("res = " + request.responseText);

    // test4를 출력한다.
    alert(res[1][1])

     * JSON 홈페이지 : http://www.json.org/
     * Java 객체를 이용해서 JSON 객체를 위한 텍스트 생성하기 : http://www.json.org/java/simple.txt 매우 단순한 방법으로 핵심 기능만 가지고 있다. 이것을 사용하길 권장한다. 라이브러리 다운로드는 http://www.JSON.org/java/json_simple.zip 에서 한다. 
     * XML과 JSON간의 변환
    posted by 좋은느낌/원철
    2009. 7. 16. 16:44 개발/Linux 계열

    일반적으로 웹로그 분석은 Webalizer를 많이 사용하나, 여기서는 보다 괜찮은 인터페이스 및 한글화된 awstats를 설치하는 방법을 알아보도록 한다.





    우선, 필자가 테스트한 배포판은 김정균씨의 안녕리눅스를 devel로 설치하였고, Apache 1.3.29 버전이다. RedHat 7.3 및 9 버전에서도 설치하는데 문제는 없었다.





        관련사이트 : http://awstats.sourceforge.net


        데모사이트 : http://awstats.sourceforge.net/cgi-bin/awstats.pl





    1. 다운로드





      다음 주소에서 awstats 6.2 버전을 다운받아 설치하려는 서버로 옮겨 놓는다.





        http://lec.pe.kr/files/awstats-6.2.tgz








    2. 압축 풀기, 기본 디렉토리 생성





        # tar xvfz awstats-6.2.tgz


        # mv awstats-6.2 /usr/local/awstats


        # chmod 755 /usr/local/awstats/


        # chown -R root.root /usr/local/awstats/


        # mkdir /etc/awstats


        # mkdir /var/lib/awstats








    3. 설치 스크립트 실행





        # cd /usr/local/awstats/tools


        # ./awstats_configure.pl





      설치 중에 3번 정도 물어보는데, 아파치 환경설정파일의 절대경로 위치와, 처음 설치시 설정파일 생성 여부('y'로 답하면 된다), 그리고 임의의 이름을 정하면 된다. 필자는 nfo.pe.kr 사이트에 로그분석기를 설치하므로 세 번째의 이름을 nfo.pe.kr로 적었다.








    4. 설정파일의 수정





      이제 /etc/awstats/ 디렉토리 밑에 awstats.[자신이 정한 이름].conf 파일이 생성된 것을 볼 수 있다. 필자의 경우 파일명은 다음과 같다.





        /etc/awstats/awstats.nfo.conf





      이 파일을 열어서 51번째 라인의 LogFile의 지정 값을 로그 분석하고자 하는 파일명으로 수정한다. 일반적으로 아파치 로그파일은 /var/log/httpd/ 디렉토리에 위치할 것이다. 다음은 필자의 경우 수정한 예제이다.





        # cat /etc/awstats/awstats.nfo.conf | grep ^LogFile


        LogFile="/var/log/httpd/nfo.pe.kr-access_log"








    5. httpd.conf 파일의 수정





      필자의 경우 안녕 배포판에 rpm으로 Apache를 설치하였으므로 Apache 환경설정파일의 위치는 /etc/httpd/conf/httpd.conf 파일이다. 


      위에서 /usr/local/awstats/tools 디렉토리에 있는 awstats_configure.pl 파일을 실행하여 제대로 설치하였다면 httpd.conf 파일의 마지막 부분에 다음과 같은 내용이 추가되어 있을 것이다.





        #


        # Directives to allow use of AWStats as a CGI


        #


        Alias /awstatsclasses "/usr/local/awstats/wwwroot/classes/"


        Alias /awstatscss "/usr/local/awstats/wwwroot/css/"


        Alias /awstatsicons "/usr/local/awstats/wwwroot/icon/"


        ScriptAlias /awstats/ "/usr/local/awstats/wwwroot/cgi-bin/"


        


        #


        # This is to permit URL access to scripts/files in AWStats directory.


        #


        <Directory "/usr/local/awstats/wwwroot">


            Options None


            AllowOverride None


            Order allow,deny


            Allow from all


        </Directory>





      혹시 httpd.conf 파일에 위의 내용이 추가되어 있지 않다면 /usr/local/awstats/tools/httpd_conf 파일의 내용을 그대로 복사하여 httpd.conf 파일에 넣어주면 된다.





      또한 httpd.conf 파일에서 로그 파일의 포맷을 combined 로 변경해 주어야 한다. 일반적으로 로그파일의 포맷은 common으로 되어 있는 경우가 대부분이다. 필자 역시 다음과 같이 common 포맷으로 되어 있었다.





        CustomLog /var/log/httpd/nfo.pe.kr-access_log common env=!img-nosave,!CodeRedNimda





      이것을 다음과 같이 combined로 수정하여 준다.





        CustomLog /var/log/httpd/nfo.pe.kr-access_log combined env=!img-nosave,!CodeRedNimda








    6. 기존 로그파일의 내용 삭제, Apache 재시작





      기존의 로그파일인 /var/log/httpd/nfo.pe.kr-access_log 파일의 포맷이 common에서 combined로 변경되었으므로 로그파일에 쌓인 로그를 모두 지운 후에 Apache를 재실행한다.








    7. 로그분석 실행 밑 웹페이지에서 확인





      여기까지 마친 후, awstats 로그분석기를 실행하려면 다음과 같이 한다( -config 옵션의 값은 [자신이 정한 이름]을 적으면 된다).





        # /usr/local/awstats/wwwroot/cgi-bin/awstats.pl -update -config=nfo.pe.kr





      웹브라우저에서 다음 주소로 확인할 수 있다.





        http://도메인주소/awstats/awstats.pl?config=[자신이 정한 이름]





      필자의 경우, 도메인 주소는 nfo.pe.kr 이고 [자신이 정한 이름]은 nfo.pe.kr 이므로, 다음과 같이 브라우저에서 찾아가면 웹로그분석 사이트가 보일 것이다.





        http://nfo.pe.kr/awstats/awstats.pl?config=nfo.pe.kr








    8. Cron 등록





      awstats 로그분석기를 일정 간격으로 자동 실행하기 위하여 /etc/crontab 파일에 다음을 추가한다.





        30 1-24/12 * * root /usr/local/awstats/wwwroot/cgi-bin/awstats.pl -update -config=nfo.pe.kr





      하루 두 번씩 cron 데몬이 정기적으로 업데이트를 하고 있다. 업데이트 주기는, 사이트의 방문자가 많을 수록 짧게 하면 된다.



    posted by 좋은느낌/원철
    2009. 7. 13. 12:26 시사/요즘 세상은

    posted by 좋은느낌/원철
    2009. 7. 4. 00:57 시사/요즘 세상은

    6월 30일 목동구장에서 만난 홍수아는 좋은 연기자이자 열혈 야구팬 이전에 건전한 시민이었다. 자신의 의사를 명확히 그러나 겸손하게 밝힐 줄 아는 그는 '진짜'였다(사진=박진환 작가)

    2005년 7월 8일 잠실구장에서 벌어진 두산과 삼성의 경기에 한 여성 연예인이 시구를 맡았다. 장내 아나운서는 그를 “홍수아”로 소개했다. 그러나 당시만 해도 19살 신인 여배우의 시구에 집중하는 이는 아무도 없었다. 그의 시구가 어떤 후폭풍을 몰고 올지 꿈에도 생각하지 못했다.

    하지만, 그의 시구 이후로 모든 것이 바뀌었다. 유명인사의 기념식으로 혹은 연예인들의 홍보 무대로 전락했던 시구(始球)가 홍수아의 등장과 함께 야구팬에게 색다른 재미와 화제를 선사하는 뉴스가 되고, 1회 이전의 ‘0’회로 인정받기 시작한 것이다.

    그로부터 4년이 흐른 지금.  ‘시구의 여왕’ 홍수아(23)를 스포츠춘추가 만났다. 단순한 연예인 시구자가 아니라 한국프로야구에 일대 변혁을 불러온 중요 인물이라는 게 홍수아를 바라보는 우리의 관점이다.


    실제로 보니까 TV로 봤던 것보다 훨씬 아름다우세요.

    정말요? (얼굴을 붉히며) 감사합니다. 칭찬해주시니까 기분이 좋은데요(웃음).

    오늘(6월 30일) 목동구장에서 벌어진 두산과 히어로즈의 경기는 동점과 역전이 숨 가쁘게 전개되는 접전이었습니다. 경기 시간이 길어질 수밖에 없었어요. 솔직히 홍수아 씨가 자리를 뜨지 않고 끝까지 경기를 관전해 무척 놀랐어요.

    (이상할 게 없다는 표정으로) 야구팬으로서 당연한 거 아니에요?

    시구를 마치고도 좀체 자리를 뜨지 않는 시구자라고 들었어요. 시구자 대부분이 짧으면 1회 길면 6회까지 관전하다가 자리를 뜨게 마련입니다. 평소에도 경기가 끝날 때까지 관전하나요?

    당연하지요. 시구하는 걸 좋아하지만 그렇다고 야구보다 좋아하는 건 아니에요. 전 그냥 야구장에서 야구 보는 게 즐겁고 행복해요. (활짝 웃으며) 시구도 야구 보는 재미의 일부분일 뿐이에요. 오늘 연장까지 갔어도 전 자리에서 일어나지 않았을 거예요(웃음).

    ‘굴욕포즈’에서 ‘개념 시구’로

    상투적인 질문부터 할게요. 야구는 언제부터 좋아했나요?

    아빠가 야구를 무척 좋아하세요. 덕분에 저도 초등학교 때부터 TV로 야구를 보면서 좋아하게 됐어요. 학교에서 발야구를 하면서 자연스럽게 야구 규칙을 익혔고요. 그러다 시구하고 나서 야구에 ‘푹’ 빠졌지 뭐에요(웃음).

    첫 시구가 2005년 7월 8일 잠실 두산과 삼성전이었지요?

    네. 그즈음 두산에서 “(홍수아 씨) 시구를 부탁한다”는 연락이 소속사로 왔어요. 제 의사를 묻기에 두말하지 않고 “하겠다”고 했어요.

    시구문화에 새로운 바람을 몰고 왔던 2005년 홍수아의 1차 시구 장면. 한국프로야구 시구는 홍수아 이전과 이후로 나뉜다(사진=두산)

    과거 여성 연예인들의 시구를 보면 ‘투구’보단 ‘패션’과 ‘우아한 자세’에 더 신경을 쓴 게 사실이에요. 포수 미트까지 공을 던지면 혹여 “힘이 세다”는 말을 들을까 일부러 천천히 던진 여성 연예인 시구자도 있었다고 해요.

    야구 중계를 볼 때마다 다른 여성 연예인분들 시구하시는 걸 유심히 봤어요. 예쁜 차림으로 하이힐을 신고 시구하시는 분들이 뜻밖에 많더라고요. 하지만, 뭔가 ‘아니다’ 싶은 생각이 들었어요. 그래서 처음 시구할 때 7부 바지에 운동화를 신었어요. 아마도 그것 때문에 야구팬들이 절 좋게 봐주신 것 같아요.

    운동화는 저도 살짝 놀란 부분이에요. 더 정직하게 말하면 홍수아 씨가 야구를 존중하는 것 같아 무척 고마웠습니다.

    (잠시 생각하다가) 하이힐을 신고 마운드를 밟는 건 마운드에 예의가 아니란 생각이 들었어요. 투수에겐 마운드가 성전 같은 곳이잖아요. 사실 그때 스타일리스트분이 하이힐을 준비하셨었어요.

    복장도 복장이지만 그때 화제가 된 건 투구폼과 구속이었어요.

    시구하기 며칠 전부터 연습을 꾸준히 했어요. 매니저분과 캐치볼을 하면서 투구폼을 배우고 사무실 담벼락에 혼자 야구공을 던지면서 폼을 가다듬었어요. 시구 당일에도 구장 한편에서 열심히 공을 던지며 몸을 풀었어요. 덕분에 투구폼도 다른 시구자분들과 다르고 공도 빨리 던질 수 있었어요.

    시구에 특별히 신경 쓴 이유라도 있나요?

    전 한번 스케줄이 잡히면 그냥 대충 넘어가는 법이 없거든요. ‘한번 할 때 좋은 모습을 보여 드리자’ 이게 제 지론이에요(웃음).

    시구를 지켜본 대중의 반응은 놀라움 일색이었습니다. 다들 ‘아, 저런 시구도 있구나’ 했지요. 하지만, 지금 같은 분위기와는 다소 거리가 있었어요.

    맞아요. 당시 대부분 기사의 제목이 ‘홍수아의 굴욕포즈’였어요. (시무룩한 표정으로) 저도 여자인지라, 창피하기도 하고. ‘사진이 왜 이렇게 나왔을까’ 속이 상하기도 했어요. 사진 보시면 아시겠지만, 제 표정이 많이 일그러져 있었거든요. 하지만.

    하지만?

    (표정이 환해지며) 시간이 지날수록 많은 분이 제 진심을 알아주셨어요. ‘얘는 최소한 운동화는 신을 줄 안다.’ ‘적어도 예쁜 척하고 시구하진 않는다.’ ‘홍수아는 뭐든 열심히 하는 것 같다’는 생각들을 하시게 됐나 봐요. 그때부터 절 응원해주시는 분들이 눈에 띄게 늘었어요.

    홍수아는 곰처럼, 베어스처럼 묵묵히 제 갈길을 가는 연기자다(사진=박진환 작가)

    이후 시구에서도 표정은 항상 일그러져 있었어요. 사실 모든 투수가 투구할 땐 표정이 일그러진답니다.

    제 표정이 일그러지면 질수록 더 좋은 시구가 나온다고 생각해요. 그래요. (혼잣말을 하듯) 표정이 일그러지건 그렇지 않건, 어차피 그 얼굴도 제 얼굴이에요. 전 제가 온 힘을 다할 때의 표정이 가장 좋아요.

    얼마나 시간이 흘렀을까. 갑자기 홍수아 씨 시구가 야구계의 최대 화제로 떠올랐어요.

    그즈음 야구팬들이 제 시구 사진으로 패러디를 많이 하셨어요. '깜짝! 사상 최고 광속구 투수 탄생. 홍수아 시속 156km'이라는 패러디를 비롯해 정말 많은 패러디물이 나왔어요. 그때 처음으로 많은 야구팬이 절 ‘홍드로’라고 부르신다는 걸 알았어요.

    홍드로라, 저도 처음엔 뭔가 했어요.

    한번은 기사 댓글을 보는데 어느 분이 ‘홍드로, 홍드로’하고 쓰신 거예요. 속으로 ‘홍드로’가 뭐지 하고 인터넷 검색을 했는데 미 메이저리그 투수 가운데 페드로 마르티네스란 분이 계시더라고요. (손뼉을 치며) 정말 위대한 투수시지 뭐에요. 알고 보니까 제 투구폼이 그분과 비슷하다고 그런 별명을 지어주셨다고 하더라고요.

    홍드로란 별명 어떠세요?

    정말 좋아요. 다른 분들도 ‘홍드로, 홍드로’하고 절 부르면 더 친근하게 느껴지시나 봐요. 간혹 누가 뒤에서 ‘홍드로’하고 불러주시면 울컥할 때도 있어요. 감사해서, 정말 감사해서(웃음).

    두산에게 ‘The End'는 없다

    두 번째 시구는 2007년 한화와 두산의 플레이오프 7차전이었습니다.

    시구 제의가 왔을 때 ‘이번에도 온 힘을 다해 노력하자’라는 생각을 했어요. 그래 두산 프런트 분께 “정말 열심히 하고 싶어서 그런데 글러브와 공을 좀 구할 수 있을까요”하고 부탁드렸어요. 그때부터 시간만 나면 학교 운동장이나 한강 둔치를 찾아 캐치볼을 했어요. 첫 번째 시구 때와는 달리 두산 상의 유니폼을 입기도 했지요.

    저만의 느낌일까요. 첫 번째와 두 번째 시구는 감동의 농도가 달랐어요. 후자가 훨씬 더 감동적이었다고나 할까요. 물론 정확한 이유는 대기 어렵지만.

    첫 번째 시구가 끝난 다음 예능 프로그램에 나가 “굴욕포즈란 놀림 때문에 상처받았다”는 말을 했었어요. 그런 와중에 제가 두 번째 시구에 나섰으니 그 프로그램을 봤던 분들이 ‘어, 상처받았다더니 또 시구하네’하고 놀라지 않으셨겠어요. (다부진 표정으로) 그분들께 보여 드리고 싶었어요. 그때 받은 건 상처가 아니라 기쁨이었다는 걸. ‘쟤는 항상 열심히 한다’는 걸. 그래서 더 열심히 던졌고, 그걸 보고 감동을 하신 것 같아요.

    2007년 플레이오프 7차전에서 한결 성숙한 투구를 선보인 홍수아(사진=두산)

    세 번째 시구는 지난해 한국시리즈 5차전이었어요. 이번엔 유니폼 상·하의를 완벽하게 입고 나왔어요.

    그 경기로 한국시리즈가 끝났으니 제가 한국시리즈 마지막을 장식했다고 봐도 되겠지요(웃음) 두산이 그때 우승했으면 참 좋았을 텐데….

    올 시즌 두산은 어떤가요? 한국시리즈 우승이 가능할 것 같은가요?

    네, 꼭 우승할 거예요. 두산 경기는 정말 9회 말까지 봐야 해요. 팀 대부분이 경기 초반 점수 차가 많이 나면 포기하고 말잖아요. 하지만, 두산은 달라요. 9명의 선수가 만들어내는 환상적인 플레이에 ‘The End'는 없다니까요(웃음).

    두산 선수 가운데 특별히 친한 선수라도 있나요.

    그렇게 친한 선수는 없어요. 임태훈, 김현수 선수 정도. 지금은 롯데에서 뛰시는 홍성흔 선수가 기억에 많이 남아요. 그분이 저와 성도 같고 시구할 때마다 공을 받아주셨거든요.

    그런데 스캔들은 엉뚱하게 고영민과 났어요.

    제2회 월드베이스볼클래식(WBC)에 출전하셨던 국가대표 선수단이 인천공항으로 귀국했을 때에요. 그때 환영 꽃다발을 들고 공항에서 기다리고 있었거든요. 입국장 게이트가 열리고 고영민 선수가 나오시더라고요. 그래서 꽃다발을 드린 것뿐이었는데 알고 보니까 LG 봉중근 선수가 가장 먼저 나오셨다고 해요. 그때 인기도 봉중근 선수가 무척 좋았고요. 주변 분들이 보시기에 봉중근 선수한테 꽃다발을 주지 않고 고영민 선수에게 준 게 이상하셨나 봐요. 그래서 그런 소문이 났던 것 같아요(웃음).

    유독 두산을 좋아하게 된 이유가 있나요.

    시구 전에도 두산에 호감이 있었어요. 시구 뒤에 정말 좋아졌죠. 지금은 비록 명예선수지만, 제 구단이란 생각을 한 번도 잊어본 적이 없어요. 한번은 어떤 방송사에서 제게 인터뷰를 요청하시더라고요. 그래서 제가 뭐라고 말씀 드렸는지 아세요.

    ?

    ‘구단의 허락이 있어야 인터뷰할 수 있습니다’라고 했지 뭐에요(웃음). 그렇다고 제가 두산만 좋아하는 건 아니에요. 8개 구단 모든 팀을 응원하고 좋아해요. 그 가운데 두산을 조금 더 좋아할 뿐이랍니다.

    지난해 한국시리즈 5차전에서 두산 유니폼을 맞춰 입고 시구에 임한 홍수아(사진=두산)

    '진짜 연기자' 홍수아

    주목받는 젊은 연기자이자 야구팬의 사랑을 독차지하는 명예투수예요. 야구와 연기의 공통점이 있지 않을까 싶은데요.

    제겐 연기와 야구가 똑같은 존재에요. 제가 무척 좋아하고, 행복해하는 대상이자 정말 열심히 하고 싶은 분야에요. 좋은 연기자가 되려면 아직 올라가야 할 계단이 많다는 걸 잘 알아요. 연기자로서의 홍수아는 부족한 것투성이에요. 하지만, 급하게 오르지 않으려고 해요. 아무도 주목하지 않는 곳에서 묵묵히 스윙연습을 해 마침내 한국 최고의 타자가 된 김현수 선수처럼 저도 조용히 제 할 일을 하면서 차근차근 계단을 오르려고 해요.

    명예투수 홍수아의 장점은 잘 알고 있어요. 빼어난 투구폼과 입이 쫙 벌어질 만큼의 위력적인 공을 던지는 투수지요. 이번엔 연기자 홍수아의 장점을 듣고 싶은데요.

    글쎄요. (쑥스러워하며) 제 입으로 말하는 게…좀….

    자신의 장점을 제대로 표현하지 못하면서 남의 인생을 표현한다는 건 이치에 맞지 않아요. 한 작가가 그러더군요. “홍수아의 연기는 진짜”라고.

    (한참을 생각하다가) 제 연기의 장점은…진심으로 하는 게 아닐까 싶어요.

    ‘진심으로 한다’는 정확한 뜻을 알고 싶어요.

    가슴으로 연기한다는 거죠. 입으로만 하는 게 아니라. 이게 장점인지 단점인지 모르겠는데요. 지난해 주말드라마 ‘내 사랑 금지옥엽’에 한창 출연하고 있을 때 한국시리즈 5차전에서 시구를 했어요. 그런데 시구를 마치고 무슨 용기가 났는지 관중석을 향해 연방 손 키스를 날렸지 뭐에요. 제 스스로 손 키스를 날리고 나서 깜짝 놀랐다니까요. 그때 ‘내 사랑 금지옥엽’의 배역이 철없고 명랑한 역할의 ‘백재라’였거든요.

    백재라?

    경기가 끝나고 집에서 시구 동영상을 다시 보는데 손 키스를 날리는 행동은 드라마에서 ‘백재라’가 보이던 행동이었어요. 그러니까 손 키스를 날린 건 ‘홍드로’가 아니라 ‘백재라’였던 거예요(웃음). 평소 연기에 몰입하면 그 작품이 끝나고 나서도 한동안 역할에서 헤어나지 못하곤 해요. 예전 ‘하늘만큼 땅만큼’이란 드라마에 출연했을 때 배역이 유년 시절 왕따 당한 경험이 있는, 슬픔이 많은 아이였어요. 그 작품 끝나고 우울증으로 얼마나 고생했는지 몰라요. 다른 연기자보다 제가 더 배역에 몰입하는 경향이 심한 것 같아요.

    여담이에요. 일전 만화 ‘공포의 외인구단’이 드라마로 제작돼 화제가 된 바 있어요. ‘야구’하면 떠오르는 여성 연예인이 홍수아 씨인데요. 이름이 없더군요. 저는 당연히 캐스팅이 될 줄 알았거든요.

    (겸손한 목소리로) 절 모르는 분이 많아서 그런 게 아닐까요.

    천만에요.

    그럼 다행이에요. 요즘 야구영화를 많이 제작하시나 봐요. 영화 관계자분들이 절 보면 꼭 그러세요. “홍수아 씨가 캐스팅 1순위입니다”라고. ‘홍드로’를 예쁘게 봐주셔서 정말 감사할 따름이에요.

    구속과 제구를 동시에 갖춘 '시구의 여왕' 홍드로

    재능있는 연기자 홍수아는 진심을 다한 연기로 정평이 나 있다(사진=KBS)

    ‘홍드로’가 연기자 홍수아에게 미치는 영향이 다양할 듯해요. 한 손이 다른 손을 씻어주듯 ‘윈-윈’효과만 내는 건 아닐 듯싶어요.

    저를 연기자가 아니라 야구로 먼저 아시는 분들이 계시더라고요. 한번은 사인해 드리고 있는데 팬분께서 “홍수아 씨, 공 정말 잘 던지세요. 진짜 홍드로 최고예요”하시는 거예요. 말로 표현할 수 없이 기쁘고 감사한 거 있죠. 그런데 그분이 마지막에 뭐라고 하셨는지 아세요.

    혹시

    (눈치를 챈 듯) 맞아요. “그런데 드라마는 안 하세요?”하시지 뭐에요. 그때 한창 드라마하고 있을 때였거든요.

    실망이 컸겠어요.

    전혀요. 되레 속으로 ‘아, 내가 연기를 더 열심히 해야겠다’는 다짐을 했어요.

    홍드로란 별명이 기쁠 때는 언제에요?

    잠실구장에서 유니폼 뒤에 ‘홍드로’란 이름을 붙이고 다니시는 분을 보고 깜짝 놀란 적이 있어요. 제 등번호인 1번도 적혀 있더라고요. 그땐 정말 눈물이 나는 줄 알았어요. 고맙고 감사해서요.

    등번호가 어째서 1번이에요?

    원래는 이재우 선수 등번호에요. 제가 두산 명예선발 투수 1호라고 구단에서 ‘1’번을 달아주신 것 같아요. 처음엔 ‘내가 명예선발 1호면 나중에 2호, 3호가 생기겠네’ 했거든요. 그런데 구단에서 “2호는 안 뽑는다”고 하시더라고요(웃음).

    요즘도 투구 연습은 꾸준히 한다고 들었어요.

    차에 글러브와 공이 있어요. 보여 드릴까요? 지금도 촬영하기 전 시간만 있으면 캐치볼 해요. ‘내 사랑 금지옥엽’ 촬영할 때는 김성수 오빠랑 캐치볼 하기도 했어요.

    연예인 야구단에서 스카우트 제의가 들어왔을 법도 한데요.

    연예인 야구단 여기저기서 서로 오라고 하시죠. “유니폼 다 만들어놨으니 몸만 오라”고 하시는 곳도 있고요(웃음). 하지만, 제 구단은 오직 하나. 두산뿐이랍니다. 두산에서 이적을 허락하지 않는 이상 다른 팀에서 뛸 생각이 없어요(웃음).

    혹시 구속을 재본 적이 있으세요? 들리는 말에는 웬만한 사회인야구 투수보다 빠르다고 하던데.

    평균구속이 시속 80km 정도에요. 요즘은 조금 더 나올 것 같고요. 하지만, 정말 중요한 건 구속이 아니라 제구랍니다. 예전보다 제구가 많이 좋아졌어요.

    제구라.

    요즘 시구 기사 보면 ‘홍드로의 아성을 깨고 싶다’는 시구자분들의 다짐이 많은데요. 전 그분들 시구가 끝나면 어떻게든 인터넷 검색을 해서 다 보거든요. 보면.

    보면?

    원바운드로 던지면서 제 아성을 깨시겠다니(웃음). 농담이고요. 사실 저 혼자만의 ‘홍드로’가 아니에요. 저를 예쁘게 포장해주시고 다듬어주신 두산 프런트 분들의 힘이 지금의 ‘홍드로’를 만들었다는 생각이에요. 늘 고마운 마음이에요.

    홍수아의 꿈, "1이닝이라도 던지고 싶다."

    23살의 젊은 여성 홍수아는 사랑을 통해 자신의 연기와 인생을 한 단계 성숙시키고자 한다. 인터뷰 내내 몰려드는 팬들의 사인 요구에 싫은 기색없이 환한 미소로 응대한 그는 '시구의 여왕' 이전에 '진정한 프로'이자 '선량한 이'였다. 그것이 우리가 홍수아를 '진짜'라고 부르는 이유다(사진=박진환 작가)

    당신의 꿈을 듣고 싶어요.

    드라마나 영화에서 언젠간 꼭 좋은 역할을 맡고 싶어요.

    좋은 역할은 어떤 역할인가요?

    주연과 조연을 떠나 극의 긴장감을 조성하고 전체적은 극의 흐름을 이끄는 역할이 아닐까요. 악역도 상관없어요. 그리고 정말 꿈은….

    연기대상이나 영화제에서 상을 받고 싶은 건가요?

    아니요. (한참을 망설이다가 이내 자신감이 넘친 말투로) 시구 말고 등판을 하고 싶어요.

    등판?

    실제 경기에 등판해보고 싶어요. ‘딱’ 1이닝만 던졌으면 좋겠어요. (간절한 표정으로) 정말 잘 막을 수 있는데.

    당신이 좋은 투수인 건 알아요. 하지만.

    (말을 막으며) 이래도 저요. 포크볼, 스플리터, 슬라이더, 투심패스트볼 등 못 던지는 공이 없어요. 일본에선 너클볼 던지는 여자선수가 프로야구에 입단했다고 하던데요. 아, 정말 부러운 거 있죠. 참!

    네?

    이것만은 꼭 밝혀둘 게 있어요.

    무슨?

    제가 돈을 벌거나 절 홍보하려고 시구한다고 생각하시는 분들이 있는데요. 시구한다고 돈 받는 건 전혀 없어요. 응원도 마찬가지에요. 제가 좋아하는 야구라, 구장을 찾는 것뿐이에요. 오해의 시선으로 바라보시는 분들께서 제 진심을 알아주셨으면 좋겠어요.

    당신의 진정을 거의 모든 이가 잘 알고 있으리라 믿어요.

    전 아직 어려서 경험해야 할 게 정말 많아요.

    야구나 인생이나 와인과 다를 게 없어요. 시간이 흐르고 경험이 쌓일수록 성숙해지게 마련이거든요. 가장 경험하고 싶은 게 무엇인가요.

    음, 연애에요. 사랑하는 이와 밥을 먹고, 길을 걷고, 대화를 나눠야 그 감정이 연기에서도 자연스럽게 표출되거든요. 하지만, 어린 나이에 연예계에 데뷔해서 그런지 정신없이 달려오기만 했어요. 더욱 성숙한 연기를 위해서, 제 인생의 성장을 위해서 지금이야말로 연애할 시간이 아닌가 싶어요.

    누군가 그러더군요. 솔로는 국가 경제에 도움이 되지 않는다고. 그도 그럴 게 솔로가 많아지면 많아질수록 밸런타인데이 때 초콜릿이나 생일 때 케이크가 팔리지 않거든요. 특히나 생일에 혼자 있다거나 일로 밤을 지새운다면 그것보다 불행한 시간도 없다는 생각이에요.

    저…실은 오늘이 생일이에요.

    네? 정말이세요?

    6월 30일. 오늘이에요.

    아니 그럼 생일에 야구 경기보고 지금 인터뷰하시는 거예요?

    생일엔 원래 자기가 가장 좋아하는 걸 하는 게 아닌가요(웃음). 오늘 두산이 이겼잖아요. 그것보다 큰 선물이 있나요. 그리고 인터뷰 약속이 생일 파티 약속 이전에 잡혔던 거라, 깨고 싶지 않았어요. 야구 좋아하는 이들끼리 이야기를 나눌 수 있다는 거…행복하지 않나요. 안 그래요?


    posted by 좋은느낌/원철
    2009. 7. 2. 09:47 개발/JSP/Servlet

    Tomcat + SSL

    Authenticating Clients (with SSL)

    디지털 커머스의 증가와 중요한 데이터간의 이동이 필요함에 따라서 보안은 모든 어플리케이션에서 중요한 자리를 차자하고 있습니다. 일반적으로 client 와 서버간에 사용자를 확인하기 위한 방법으로 username 과 password 를 체크합니다. 이를 사용하는 보안 처리 기법으로 Secure Sockets Layer (SSL) 과 Java Authentication and Authorization Service (JAAS)를 사용할 수가 있습니다. 먼저 SSL로 보안인증을 거치는 방법을 보고 java 에서 지원하는 다른 사용자 인증서비스인 JAAS을 jsp와 서블릿에서 사용하는 법을 보겠습니다.

    1. 톰켓에서 사용자 인증 처리하기

    톰켓으로 사용자 인증처리를 하기전에 먼저 username, password, role 을 등록해야 합니다. 등록하는 방법은 아주 쉽습니다. 톰켓이 설치된 폴더에서 /conf 에 보면 tomcat-user.xml 파일이 있습니다. 없으면 에디터 창에서 새로 만들어도 됩니다. 

    <?xml version='1.0' encoding='utf-8'?><?xml version='1.0' encoding='utf-8'?> 
    <tomcat-users> 
        <role rolename="dbadmin"/> 
        <role rolename="manager"/> 
        <user username="hans" password="hansworld" roles="dbadmin,manager"/> 
        <user username="jojo" password="33dsk3" roles="manager"/> 
    </tomcat-users> 

    위 소스에서 hans는 dbadmin과 manager의 권한을 갖고 jojo는 manager의 권한을 갖습니다. 

    다음으로 톰켓서버에서 SSL을 셋팅해야 합니다. 이는 username이나 password 가 http상에서 이동할 때 암호화 되어 이동하기 때문에 중간에 악의적인 의도로 가로채거나 훔쳐내는 것을 방지해 줍니다. SSL을 셋팅하기 위해선 2가지 절차를 거쳐야 합니다.

    1. java sdk에서 지원해주는 keytool로 keystore 파일을 만듭니다. 이 파일은 보안 접속을 하는 서버가 디지털 인증을 암호화 해서 사용하는데 쓰여집니다. 
    2. 톰켓의 conf/server.xml 파일에 SSL Connector에 있는 주석을 제거합니다.

    keytool은 java가 설치된 in 에서 찾을 수 있습니다. 

    %JAVA_HOME%inkeytool -genkey -alias tomcat -keyalg RSA 


    위의 명령을 실해하면 keystore 파일이 생성되는데 몇가지 질문을 합니다. 처음으로 패스워드를 물어보는데 톰켓에서 기본적으로 "changeit" 란 패스워드로 셋팅되어 있습니다. 나머지는 원하지 않으면 그냥 엔터키만 치면 됩니다. 

    Enter keystore password: changeit 
    What is your first and last name? 
    [Unknown]: Bruce Perry 
    What is the name of your organizational unit? 
    [Unknown]: 
    What is the name of your organization? 
    [Unknown]: 
    What is the name of your City or Locality? 
    [Unknown]: 
    What is the name of your State or Province? 
    [Unknown]: 
    What is the two-letter country code for this unit? 
    [Unknown]: 
    Is CN=Bruce Perry, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown correct? [no]: yes 
    Enter key password for <tomcat>
    (RETURN if same as keystore password):

    다음에 conf/server.xml 에 있는 SSL Connector 요소에 있는 주석을 제거합니다.

    <!-- Define a SSL Coyote HTTP/1.1 Connector on port 8443 -->
    <connector disableuploadtimeout="true" useurivalidationhack="false" secure="true" scheme="https" debug="0" acceptcount="100" enablelookups="true" maxprocessors="75" minprocessors="5" port="8443" classname="org.apache.coyote.tomcat4.CoyoteConnector">
    <factory classname="org.apache.coyote.tomcat4.CoyoteServerSocketFactory" protocol="TLS" clientauth="false" />
    </connector>

    SSL은 일반 http 가 아닌 https 를 사용합니다. 또한 포트도 웹에서 80, 톰켓에서 8080 처럼 8443의 번호를 사용합니다.

    https://localhost:8443/myhome/default.jsp



    2. BASIC authentication BASIC Authentication


    Basic 인증은 웹자원과 함께 사용되어온 보안 방법이고 거의 모든 브라우져가 이를 지원합니다. 일반적으로 사용자 이름과 비밀번호를 전송할 때 네트워크 상에서 Base64 인코딩 방식을 사용하는데 이는 디코딩하기 아주 쉽기때문에 보안적이라고 할 수 없습니다. 따라서 Basic Authentication 과 SSL 을 사용한 보안 방식을 사용합니다.

    1. 먼저 처음에 설명했지만 username, password, role을 conf/tomcat-users.xml 에서 설정합니다.
    2. security-constraint element 로 인증에 필요한 자원을 web.xml 파일에 기술합니다.
    3. "BASIC"이라고 auth-method요소 사이에 적습니다. 이 auth-method 요소는 login-config요소에 들어갑니다.

    <!-- Beginning of web.xml deployment descriptor -->
    <security-CONSTRAINT>
    <web-RESOURCE-COLLECTION>
    <web-RESOURCE-NAME>JSP database component</web-RESOURCE-NAME> 
    <url-PATTERN>/myhome.jsp</url-PATTERN> 
    <http-METHOD>GET</http-METHOD> 
    <http-METHOD>POST</http-METHOD> 
    </web-RESOURCE-COLLECTION>
    <auth-CONSTRAINT>
    <role-NAME>dbadmin</role-NAME> 
    </auth-CONSTRAINT>
    <user-DATA-CONSTRAINT>
    <transport-GUARANTEE>CONFIDENTIAL</transport-GUARANTEE> 
    </user-DATA-CONSTRAINT>
    </security-CONSTRAINT>
    <login-CONFIG>
    <auth-METHOD>BASIC</auth-METHOD> 
    </login-CONFIG>
    <security-ROLE>
    <role-NAME>dbadmin</role-NAME> 
    </security-ROLE>
    <!-- Rest of web.xml deployment descriptor -->

    web.xml 을 이렇게 편집한 후에 https://localhost:8443/myhome.jsp 로 들어가보면 아이디와 비밀번호를 입력하라는 창이 뜹니다. 여기서 만일 role 이 dbadmin 이 아니라면 아이디와 비밀번호가 맞아도 인증에 실패하게 됩니다. 반드시 해당 사용자가 인증에 필요한 role을 가지고 있어야 합니다.



    3. Form-Based Authentication 의 사용 

    서블릿은 일반 BASIC authentication 말고도 사용자 기반 인증인 Form-Based Authentication 제공합니다. 이는 톰켓에서 보여주는 BASIC authentication 의 단순화를 덜어주며 일반적으로 사용하는 form 방식을 사용하기 때문에 이용하기도 편합니다. 이역시 SSL 과 HTTPS를 사용하여 네트워크상에서 이동하는 데이터들을 보호합니다.

    먼저 web.xml 셋팅을 보겠습니다. 파일의 맨 처음부분에 보안 관련 element를 기술하게 됩니다. security-constraint 부분은 BASIC authentication 과 같습니다. login-config 셋팅부분이 약간 다르긴 하지만 그렇게 크게 다르지는 않습니다.

    <login-CONFIG>
    <auth-METHOD>FORM</auth-METHOD>
    <form-LOGIN-CONFIG>
    <form-LOGIN-PAGE>/login.html</form-LOGIN-PAGE>
    <form-ERROR-PAGE>/loginError.jsp</form-ERROR-PAGE>
    </form-LOGIN-CONFIG>
    </login-CONFIG>

    실제 jsp에서 
    <form>테그를 사용하여 사용자 정보를 전송하는데 이때 주의할 점은 form 태그의 action 요소의 값을 'j_security_ckeck' 로 하고 사용자 이름과 비밀번호의 이름을 'j_username' 과 'j_password'로 해야합니다. 로그아웃 시에는 HttpSession 객체의 invalidate() 메소드를 호출하면 됩니다.</form>
    posted by 좋은느낌/원철
    2009. 6. 30. 10:20 개발/JSP/Servlet

    Apache 와 Tomcat 을 연동시 아파치에서는 정적인파일 (이미지, js, html 등등) 을 처리하게 하고 톰캣에서는 동적인 파일들을 처리하도록 하는것이 가장 중요한 포인트입니다.

    대용량 트래픽을 유발하는 서비스의 경우는 이미지 파일 이나, js 파일 등을 아래와 같이 서브 도메인으로 만들어서 물리적으로 다른서버에 두게 하는경우가 일반적인 적용 가능한 경우입니다.

    예) 이미지, js 파일 등등 -> img.onjava.co.kr  (일반적으로 이미지 서버 또는 파일서버)
         동적인 파일             -> www.onjava.co.kr (웹서버)
         www.onjava.co.kr 내의 html 에서 img 를 호출시 <img src="http://img.onjava.co.kr/xxx/xx.jpg"> 와 같은 형태로
         처리.


    하지만, 비용적인 측면이나 많은 트래픽이 생기지 않는 웹서버의 경우에는 하나의 물리적인 서버에서 아파치와 톰캣의 역할을 적절하게 나눠서 운영한다면 효과적인 서버운영을 할수가 있습니다.


    1. 아파치 WebRoot가 /usr/local/apache/htdocs 이고,
        톰캣 WebRoot 가 /home/web/source/onjava/WebRoot 인 
    경우
        
        - 톰캣에서는 파일 확장자가 jsp인 파일만 처리하도록 

        - 아파치에서는 jsp 파일 외의 파일들 (이미지 파일, html 파일 등등) 을 처리하도록 하기 위해서 아래와 같이 설정해준다.
       
        httpd.conf 파일내에서 
      ---------------------------------------------------------------------------------------------------------------------------------------------------------------     
      DocumentRoot "/usr/local/apache/htdocs"
        
      <Directory "/usr/local/apache/htdocs">
        #
        # Possible values for the Options directive are "None", "All",
        # or any combination of:
        #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
        #
        # Note that "MultiViews" must be named *explicitly* --- "Options All"
        # doesn't give it to you.
        #
        # The Options directive is both complicated and important.  Please see
        # http://httpd.apache.org/docs/2.2/mod/core.html#options
        # for more information.
        #
         Options FollowSymLinks

        #
        # AllowOverride controls what directives may be placed in .htaccess files.
        # It can be "All", "None", or any combination of the keywords:
        #   Options FileInfo AuthConfig Limit
        #
         AllowOverride None

        #
        # Controls who can get stuff from this server.
        #
         Order allow,deny
         Allow from all

    </Directory>

    # 아래와 같이 WebRoot 경로를 하나더 추가해 준다.

    <Directory "/home/web/source/onjava/WebRoot">
        #
        # Possible values for the Options directive are "None", "All",
        # or any combination of:
        #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
        #
        # Note that "MultiViews" must be named *explicitly* --- "Options All"
        # doesn't give it to you.
        #
        # The Options directive is both complicated and important.  Please see
        #
    http://httpd.apache.org/docs/2.2/mod/core.html#options
        # for more information.
        #
         Options FollowSymLinks

        #
        # AllowOverride controls what directives may be placed in .htaccess files.
        # It can be "All", "None", or any combination of the keywords:
        #   Options FileInfo AuthConfig Limit
        #
         AllowOverride None

        #
        # Controls who can get stuff from this server.
        #
         Order allow,deny
         Allow from all

    </Directory>

    # 톰캣과 연동을 위한 추가 소스 부분 (httpd.conf 파일의 맨 마지막 부분에 추가)

    <IfModule mod_jk.c>
      JkWorkersFile "/usr/local/apache/conf/workers.properties"
    </IfModule>

    # mod_jk.so 파일은 아파치사이트에서 다운받으면 된다.
    LoadModule jk_module "/usr/local/apache/modules/mod_jk.so" 

    #Configure mod_jk

    JkWorkersFile conf/workers.properties
    JkLogFile logs/mod_jk.log
    JkLogLevel info

    JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "

    JkRequestLogFormat "%w %V %T"

    #Root context

    JkMount /*.jsp ajp13           -> 톰캣에서는 jsp 만 처리한다. (JkMount 에 추가된 파일만이 톰캣에서 처리하게 된다)
    #JkMount /*.html ajp13           -> 주석처리된 부분들은 모두 아파치에서 처리하게 된다.
    #JkMount /*.js ajp13
    #JkMount /*.jpg ajp13
    #JkMount /*.gif ajp13
    #JkMount /*.jpeg ajp13

    AddDefaultCharset UTF-8

    ----------------------------------------------------------------------------------------------------------------
    workers.properties 파일
        workers.tomcat_home=/usr/local/tomcat
        workers.java_home=/usr/local/java
        ps=\
        worker.list=ajp13
        worker.ajp13.port=8009
        worker.ajp13.host=localhost
     


    2. 위의 설정후에 jsp 파일이외의 이미지, html, js 파일 등은 /usr/local/apache/htdocs 에 위치시켜야 제대로 서비스가 가능하다. 당연히 톰캣에서 처리해야할 jsp 파일들은
    /home/web/source/onjava/WebRoot 에 위치시키면 된다.

    posted by 좋은느낌/원철
    2009. 6. 29. 18:04 시사/요즘 세상은
    역시 대륙의 저력은 대단하다..

    짝퉁이란 짝퉁은 다 만들어내는 것이지..

    마티즈, 애니콜 등등 유수의 제품을 카피하더니 이젠 피겨여왕 연아까지 카피하는구나..

    짝퉁이 생긴다는 것은 인기가 많다는 것이겠지..

    그 인기에 편승해서 뭔가 콩고물이라도 주워먹을려고....

    posted by 좋은느낌/원철
    2009. 6. 29. 17:32 시사/요즘 세상은

    `시내 주행과 비슷한 경제모드(Eco-Mode)로 운전해보니 연비는 23~29㎞/ℓ.`일본 도요타가 야심차게 내놓은 하이브리드카인 `제3세대 프리우스(Prius)`를 직접 시승한 결과다. 배기량(1800㏄)이 비슷한 아반떼ㆍ포르테의 공인 연비(15㎞/ℓ)보다 1.5~2배 높은 수준이다. 프리우스는 세계 최초로 지난 1997년 시판됐고, 지난해 말까지 180만대가 팔린 최다 판매 하이브리드카다.

    이번 시승은 지난 24일 일본 홋카이도에 있는 도카키 주행시험장에서 한국 말레이시아 대만 싱가포르 등 아시아 기자단 30여 명을 대상으로 실시됐다. 관심은 역시 연비에 모아졌다.

    도요타가 발표한 3세대 프리우스의 공식 연비는 일본 기준인 10ㆍ15모드의 경우 38㎞/ℓ이며, 실제 주행을 가미한 또 다른 기준인 JS08로는 32㎞/ℓ이다. 하지만 일본이 발표한 연비 기준은 한국 미국 등 외국보다 높게 나온다는 지적을 받아왔다.

    이날 시승 형태는 △시내 주행과 비슷한 경제모드 △전기모터로만 움직이는 EV모드 △급발진ㆍ급제동을 반복하는 모드 등 3개 방식으로 진행됐다.

    경제모드의 경우 3.4㎞ 트랙을 한 바퀴 돌고 1분간 멈춘 뒤 다시 주행하는 방식으로 모두 3바퀴(10.2㎞)를 돌았다. 3개 팀이 시승한 결과 연비는 23.9㎞/ℓ, 26.9㎞/ℓ, 29.3㎞/ℓ가 나왔다. 평균 운행속도는 시속 30~35㎞.

    반면 같은 구간을 급발진ㆍ급제동을 해가며 다소 과격하게 운전한 결과 연비는 절반 수준인 13~15㎞/ℓ로 크게 떨어졌다. 도요타 관계자는 "도쿄 도심을 출퇴근해보니 평균 연비는 22~23㎞/ℓ로 나왔다"고 설명했다.

    도요타는 3세대 프리우스의 경우 기존 2세대보다 연비가 10% 높아졌으며, 배기량을 1.5ℓ에서 1.8ℓ로 늘리면서 성능은 20% 향상됐다고 밝혔다. 다만 실제 70~80㎞ 구간에서 액셀러레이터을 밟으면 소음이 커졌고, 가속성능이 디젤엔진보다는 다소 떨어진다는 느낌을 받았다.

    차의 겉모습은 헤드램프ㆍ범퍼ㆍ측면 등을 날카롭게 처리해 2세대보다 젊고 다이내믹한 분위기를 가미했다. 반면 차값은 205만~327만엔으로 최저가격 모델의 경우 2세대보다 10% 이상 낮아지면서 일본에서 선풍적인 인기를 끌고 있다. 3세대 프리우스는 일본에서 시판된 지 한 달 만에 18만대가 계약됐다. 예상보다 수요가 폭증하면서 출고까지는 6개월을 기다려야 한다. 도요타는 이번 프리우스를 연간 30만~40만대 생산해 80여 나라에 수출할 계획이다.

    도요타는 오는 10월 3세대 프리우스를 비롯해 베스트셀러카인 중형차 캠리와 캠리 하이브리드, 컴팩트 SUV인 라브4 등 4종을 동시에 내놓을 계획이다. 도요타는 한국에 3세대 모델 중 중간 가격대(250만엔)를 투입하고, 하이브리드용 배터리 등 핵심부품에 대해 종전과 비슷한 5년간 품질보증을 해줄 방침이다.

    ■ 오쓰카 수석엔지니어 "기술 현대차보다 5년 앞서"

    도요타의 하이브리드카 개발을 총괄하는 오쓰카 수석엔지니어는 "하이브리드 분야에서 현대차 등 다른 외국업체와의 기술격차는 5년 정도"라고 말했다. 그는 "도요타는 시판 이후 12년간 축적된 기술을 보유하고 수많은 고객들의 요구사항을 개선하는 과정에서 많은 노하우를 지니고 있다"고 설명했다. 도요타는 이번 3세대 모델의 경우 600~700개에 달하는 하이브리드 기술특허를 신청한 상태다. 이 때문에 `하이브리드 기술개발은 일본 도요타의 특허를 침해하지 않고는 어려운 게 아니냐`는 분석이 나오고 있다. 그는 "미래차의 핵심기술은 하이브리드"라며 "앞으로 특허권을 침해하는 사례에 대해 적극 대응하겠다"고 강조했다.

    도요타는 올 연말께 4세대 프리우스 개발에 착수할 예정이다. 오쓰카 수석엔지니어는 "3세대 하이브리드 기술은 이제 성숙단계에 접어들었다"면서 "4세대 모델은 플러그인 하이브리드가 될 가능성이 높다"고 말했다. 플러그인 하이브리드란 기존 하이브리드카에 비해 기름보다는 배터리에 더 많이 의존하며, 특히 가정용 전기로 배터리를 충전하는 방식을 말한다. 그는 "지금 공급을 늘리지 못하는 것은 배터리 생산에 한계가 있기 때문"이라며 "앞으로도 하이브리드 기술은 배터리 기술 향상에 집중될 것"이라고 설명했다.

    posted by 좋은느낌/원철