▷ 비즈니스 인텔리전스 [ BI, business intelligence ] - 네이버 용어사전
기업들이 신속하고 정확한 비즈니스 의사 결정을 위해 사용하는 데이터의 접근, 수집, 보관, 분석 등의 애플리케이션과 기술의 집합. 비즈니스 인텔리전스(BI) 애플리케이션은 의사 결정 지원 시스템, 조회 및 응답, 올랩(OLAP), 통계 분석, 예측 및 데이터 마이닝 등이 기본이 되나, 필연적으로 기업의 데이터베이스와 데이터 웨어하우스(DW), 기업 자원 관리(ERP) 등과도 관련이 있으므로 넓은 의미로는 이 모든 분야를 포함하기도 한다.
참고사이트 : http://terms.naver.com/item.nhn?dirId=202&docId=25079
▷ 비즈니스 인텔리 전스 무엇입니까?
비즈니스 인텔리 전스 연구의 광범위한 분야입니다. 비즈니스 인텔리 전스 이론의 가장 큰 추진력이 특정 요인에 고품질의 의사 결정을 내릴 것으로 보인다. 이러한 요인을 고객, 경쟁 업체, 비즈니스 파트너, 경제 환경 및 내부 작업이 포함됩니다. 여기에서는 이러한 요인이 기업의 품질 결정을 내리는데 도움을 좀 더 정보입니다.
고객 :없이 고객의 비즈니스 살아남을 수 없다. 기업들은 제품과 서비스를 판매해야합니다. 비즈니스 인텔리 전스 사업을보다 효과적으로 그들의 환경에서 찾고, 기업들은 고객의 수요에 적응할 수 있도록 고객의 이해를 도와줍니다. 비즈니스 인텔리 전스 시장 이내에 고객의 데이터를 수집하는 데 사용됩니다. 이미 귀하의 고객 데이터를 수집하는 방법에는 여러 가지가있다; 그것으로 매각으로 POS 시스템 (지점)을 쉽게 할 수있는 고객과 그들에 관심이 없다 무엇을 구매하는 제품에 대한 데이터를 수집함으로써 고객의 습관과 환경에 대한 데이터를 수집 설문 조사 또는 여론 조사에서 그들을 요구했다. 심지어 거기 시장 전문가하는 시장에서 고객의 행동을 감시하고 그들에 어떻게 기업들이 고객의 매장, 인사 및 제품과 서비스를 판매하는 비즈니스 통찰력을주는 답변을 다시보고합니다.
이 데이터가 수집되면, 그것은 조직이 데이터를 적절하게 사용하도록한다. 비즈니스 인텔리 전스는 방대한 양의 데이터를 볼 수 있으며 그 수완이 될 수있는 관리자 및 비즈니스 소유자의 중요한 정보를 제공 엄밀히 조사하는 과정입니다.
경쟁사 :뿐만 아니라, 기업 고객들은 제품 구매에 만족 지키려고 또 담배 기업들은 고객의 끓는 물에 반숙으로해서 그들 자신을 찾고있는 경쟁 업체들과 경쟁을해야했습니다. 오늘날 기업들은 끊임없이 경쟁의 효과를 평가해야하며 현명한 전략만이 궁지에 자신의 경쟁자를 선택 못 버틸 것뿐만 아니라, 자신의 비즈니스 시장 점유율이 성장했다. 비즈니스 인텔리 전스 비즈니스 전략 귀하의 경쟁자 떨어져 고객을 훔칠뿐만 아니라 다른 사람들로부터 차별화로 자신의 비즈니스에 도움이, 효과적으로 더 많은 이익을 더 큰 성장을 사용하는 고객 기반을 확인할 수있습니다.
비즈니스 파트너 : 비즈니스 파트너들은 어떤 사업이든 그것을 공급, 지불 처리가 필수적인 기업, 고객 지원 기업이나 납품 업체는 자사의 사이클을 통해 귀하의 비즈니스에 도움이, 그 모든 비즈니스 파트너는 귀하의 비즈니스와 관련된에 있는지 확인하는 것이 중요합니다 당신과 균형. 귀하의 요구하거나 특정 지원 문제와 함께 당신을 도울 수없는 고객 서비스를 유지할 수없는 계약자가 함께 공급 데 실패에 귀하의 비즈니스를 일으킬 수있습니다. 원활하고 효과적으로 작동하는 경우에 귀하의 비즈니스 원하는 모든 비즈니스 파트너를 서로 라인에 있어야합니다. 예를 들어, 오늘날 많은 기업들이 공급되기 때문에 현재와 미래를 공유하여 주요 데이터들은 공급 업체와 재고 수준에 부응할 수 있도록 귀하의 비즈니스에 도움이 조정은 불가피했다. 정보 공유 및 정보를 수집하고 적절한 정보를 공유할 수있는 열쇠는 어디에 비즈니스 인텔리 전스 중요하다.
경제 환경 : 또 다른 방법은 그 조직을 도울 수있는 비즈니스 인텔리 전스 소비 지출, 인플레이션, 실업률, upturns과 경제 침체 등 비즈니스 인텔리 전스 등 주요 경제 지표가 없으면, 귀하의 조직을 효과적으로 정보를 처리할 수없습니다 고려 취함으로써이다 하기 위해서는 현재의 경제에 맞는 전략을 수정합니다.
내부 운영 : 내부 작업은 대개 하루로 사업 또는 조직의 활동가는 하루에 정의되어있습니다. 만약 귀사가 원하는 것, 당신이 필요 귀하의 비즈니스의 강점과 약점을 매일 볼 수 있기를 성공할 수있다. 당신은 어떤 순간에, 얼마나 이익을 귀사의 비즈니스와 부채 만들기를 볼 필요가있다. 끝내주는 예지력이 없으면, 당신 같은 새로운 지출을 저지 또는 귀하의 비즈니스에 그 자금을 할당할 수있을 때 빚을 갚는으로 성급한 결정을 내릴 수있는 몇 가지 다른 곳에있다. 비즈니스 인텔리 전스 극도로 사업의 현재 상태를 평가할뿐 아니라 자금을 필요가 어디 있는지 함께 사업의 전체를 구성하는 모든 부품, 비즈니스의 어느 부분이 나약하고 귀하의 비즈니스의 어떤 부분이 강한 것이 중요하다.
일단 기업에서 그들이 무엇을 분석하고 필요한 정보를주고, 그것이 데이터를 수집하는 것이 중요합니다 그리고보고 데이터를 통해 일상을 구별하는 일반적인 비즈니스 문제에 대한 해결책을 제공하는 방법론을 사용하여 비즈니스 인텔리 전스 알아요. 이러한 과제를 달성하기 위해 한 가지의 주요 성과 지표이다. 뮤직, 분석할 수있는 방법은 비즈니스 인텔리 전스와 비즈니스의 현재 상태를 평가하고 다음 전략을 선택하기 위해이 정보를 사용하여 다음이 전략을 실행할 수있습니다.
일부 기업은 매년 또는 분기 주요 성과 지표를 추적, 일부 매월 또는 주 단위와 수단을 가지고 있으면, 많은 기업들이 일상에서 특정 데이터를 세밀하게 조율하기 위해 그들의 전략이나 팅겨보고 추적하려고합니다.
컴퓨터, 데이터베이스 및 분석의 그룹을 일반적으로 비즈니스 인텔리 전스의 방법론에서 작업할 수있습니다. 일반적으로 각 회사들은 자신들의 특정 요구에 맞는 비즈니스 인텔리 전스 방법론이다. 일부 주요 성과 지표를 만드는 방법의 목표 정렬 더 인기 검색어, 기준선 통계를 통해 검색어와 관련된 검색어가없습니다.
목표는 귀하의 비즈니스 목표를 비즈니스 인텔리 전스를 사용하여 정렬 검색어 무엇인지 확인하는 방법이있다. 귀하의 비즈니스 목표, 물품 당 더 많은 이윤을 획득, 새로운 수익원을 시작하기 위해, 더 많은 시장 점유율이 성장의 새로운 제조 업체 또는 공급 업체 등을 찾아 가요
기준 검색어와 데이터를 수집하여 현재의 접근 방식을 이해하는 데 도움이 접근할지 여부를 어디에 자사의 약점과 강점이 무엇인지 만족입니다. 예를 들어, 고객의 행동을 좀 더 면밀히 모니터링하고 싶습니다, 어떻게 현재의 도구 장소에서 관리 (POS 시스템, 설문 조사, 시장 조사 등)이 현재의 도구를 할 방법은, 약한하는 것들을 조정하고 필요를 수행하고있다 어떤 도구를 추가할 수있습니다.
만약 당신이 그것을 측정하는 방법을 함께 올 수 있기 때문에 회사에 도움이 될 수있는 통계 데이터에는 관련 검색어 비즈니스 인텔리 전스 과정에서 매우 중요하다. 관련 검색어 통계 데이터를 쳐다본다과 솔루션 비즈니스 요구를 충족하는 데이터를 정확하게 측정할에게 다가와서. 일단 데이터를 측정할 수있다, 당신은 쉽게 분석할 수 있으며 어떤 일을하고 무엇을하지 있는지 확인합니다.
만약 당신이 그것을 극도로 비즈니스 인텔리 전스의 요인을 이해하는 것이 중요합니다 귀하의 비즈니스가 성공하고 싶습니다 방법을 분석하고 데이터를 사용하여 만든이 방법론 연구 내용은 비즈니스 인텔리 전스의 매우 광범위한 주제에 따름입니다.
참고사이트 : http://www.tech-faq.com/lang/ko/business-intelligence.shtml
2008년 10월 10일 금요일
2008년 10월 8일 수요일
대시보드란?
대시보드는 사이트의 로그 통계를 한눈에 확인할 수 있는 그런 서비스입니다.
대시보드를 통하여 내 블로그가 검색엔진에 어떻게 수집이 되고 어떤 형태로 나타나는지를 알 수가 있고 검색엔진 최적화 작업에 참고 할 수도 있습니다.
(저도 대시보드를 통하여 제가 검색엔진에 대한 기존 포스팅이 아주 크게 잘못되었다는 것을 알게되었습니다. 조만간 관련 포스팅을 할 것입니다.)
참고사이트 : http://ccoma.tistory.com/394
- 대시보드 [dashboard]
웹에서, 한 화면에서 다양한 정보를 중앙 집중적으로 관리하고 찾을 수 있도록 하는 사용자 인터페이스(UI) 기능. 여러 종류의 웹 기반 콘텐츠를 재사용할 수 있도록 구성하고, 문서, 웹 페이지, 메시징, 미디어 파일 등 다양한 콘텐츠를 한 화면에서 관리한다. 특징으로는 의사 결정과 작업 분석에 적절한 정보 제공과 사용자 및 그룹 관리가 용이하고, 무선 응용 통신 규약(WAP) 전화, 휴대형 PC 등 이동 장비 지원이 가능하다.
참고사이트 : http://enc.daum.net/dic100/contents.do?query1=15XXXX3552
대시보드를 통하여 내 블로그가 검색엔진에 어떻게 수집이 되고 어떤 형태로 나타나는지를 알 수가 있고 검색엔진 최적화 작업에 참고 할 수도 있습니다.
(저도 대시보드를 통하여 제가 검색엔진에 대한 기존 포스팅이 아주 크게 잘못되었다는 것을 알게되었습니다. 조만간 관련 포스팅을 할 것입니다.)
참고사이트 : http://ccoma.tistory.com/394
- 대시보드 [dashboard]
웹에서, 한 화면에서 다양한 정보를 중앙 집중적으로 관리하고 찾을 수 있도록 하는 사용자 인터페이스(UI) 기능. 여러 종류의 웹 기반 콘텐츠를 재사용할 수 있도록 구성하고, 문서, 웹 페이지, 메시징, 미디어 파일 등 다양한 콘텐츠를 한 화면에서 관리한다. 특징으로는 의사 결정과 작업 분석에 적절한 정보 제공과 사용자 및 그룹 관리가 용이하고, 무선 응용 통신 규약(WAP) 전화, 휴대형 PC 등 이동 장비 지원이 가능하다.
참고사이트 : http://enc.daum.net/dic100/contents.do?query1=15XXXX3552
데이타통합(DI), EAI, ETL 개념 이 어떻게 다른건가요?
데이타통합(DI), EAI, ETL 개념 이 어떻게 다른건가요?
DI
-Data Integrator의 약자로서 기업내 이기종 DBMS 데이터를 통합, 마이그레이션하는 작업을 말하다.
EAI
-기업 내 상호 연관된 모든 애플리케이션을 유기적으로 연동하여 필요한 정보를 중앙 집중적으로 통합, 관리, 사용할 수 있는 환경을 구현하는 것으로 e-비지니스를 위한 기본 인프라를 말한다.
ETL
-시스템에서 시스템으로 데이터를 이동시키는 기능의 3가지 형태. 보통 운영 체계의 데이터는 추출ㆍ변환ㆍ올려놓기(ETL) 기능을 말한다.
기본적으로 DI는 ETL작업의 확장된 방향을 말하며, 이러한 DI를 위한 대표적인 제품으로는 빅슨 비티엘에서 제공하는 DI3.0이 있으며, 각종 정보와 자료를 제공하고 있으니, 가셔서 참고해보세요.
http://www.btlglobal.com
참고사이트 : http://kin.naver.com/detail/detail.php?d1id=1&dir_id=101&eid=odw4gINBqLgirHDIn9nwFm+/AHIiCNED&qb=ZXRs&pid=fM27Ssoi5Tossb37cWRsss--421967&sid=SO2LVPJ07UgAAG3LEoQ
DI
-Data Integrator의 약자로서 기업내 이기종 DBMS 데이터를 통합, 마이그레이션하는 작업을 말하다.
EAI
-기업 내 상호 연관된 모든 애플리케이션을 유기적으로 연동하여 필요한 정보를 중앙 집중적으로 통합, 관리, 사용할 수 있는 환경을 구현하는 것으로 e-비지니스를 위한 기본 인프라를 말한다.
ETL
-시스템에서 시스템으로 데이터를 이동시키는 기능의 3가지 형태. 보통 운영 체계의 데이터는 추출ㆍ변환ㆍ올려놓기(ETL) 기능을 말한다.
기본적으로 DI는 ETL작업의 확장된 방향을 말하며, 이러한 DI를 위한 대표적인 제품으로는 빅슨 비티엘에서 제공하는 DI3.0이 있으며, 각종 정보와 자료를 제공하고 있으니, 가셔서 참고해보세요.
http://www.btlglobal.com
참고사이트 : http://kin.naver.com/detail/detail.php?d1id=1&dir_id=101&eid=odw4gINBqLgirHDIn9nwFm+/AHIiCNED&qb=ZXRs&pid=fM27Ssoi5Tossb37cWRsss--421967&sid=SO2LVPJ07UgAAG3LEoQ
2008년 9월 23일 화요일
자동차 긴급상황 발생시, 대처법 23가지
1. 주행중 브레이크가 미끌릴때
브레이크에서 이상음이 들리지 않는 경우는 브레이크액의 누설, 브레이크 페달을 밟을 때 [끼]하는 이상음이 발생하는 경우는 브레이크 라이닝의 마모나 헐거움을 생각할 수 있다.
① 주행중에 브레이크의 제동력이 떨어졌음을 느꼈으면, 엔진회전에 맞추면서, 기어단수를 서서히 감속한다.
② 충분히 감속이 되었으면, 핸드 브레이크를 천천히 당겨 더욱 감속하여 정지시킨다.이 때 급격히 핸드브레이크를 당기면 균형을 잃어 스핀하거나, 브레이크의 와이어가 끊어질 우려가 있으므로 주의하여야 한다. 또한, 당황하여 엔진 스위치를 끄면 핸들이 무거워 방향성을 잃게 되므로 도리어 위험하다.
③ 차를 정지시켰으면 본넷을 열고, 브레이크액의 양을 점검한다. 줄어 있다면, 브레이크 파이프등에 액 누설은 없는지 점검한다. 경상일 경우에는 브레이크액을 보충하면 다소 주행할 수 있으나, 탱크가 비었거나 하는 경우는 전문가에게 연락하여야 한다.
④ 브레이크에서 이상음이 발생할 경우 전문가의 점검을 받을 것.
※ 타이어가 수몰되어 휠이 잠기는 물웅덩이를 지나간 후에는 브레이크의 제동력이 약해지는 수가있다. 드럼과 슈에 물이 묻어 마찰력이 떨어지기 때문이다. 물웅덩이를 빠져나온 경우에는, 브레이크 페달을 2~3회 가볍게 밟아주면, 마찰열에 의해 수분이 증발하여 브레이크는 원상태로 회복된다.
2. 주행중 타이어가 펑크 났을때
최근의 자동차는 일반적으로 튜브리스 스틸 래디얼 타이어를 사용하고 있어서, [뻥]하고 요란스럽게 펑크나는 일은 없어졌다. 주행중에 자동차의 주행이 부자연스러워 타이어를 조사해 보니 펑크가 나 있더라는 경우가 많다. 그러나 펑크가 난 것을 인식하지 못하고 그대로 주행을 계속하면, 브레크 페달을 밟거나핸들을 꺾거나 했을 때 차가 한쪽편으로 쏠려 대단히 위험하다. 차의 이상한 흔들림이나 타이어의 이상음에 주의하여, 일찍 펑크를 발견하도록 유념하여야 한다.
① 타이어가 펑크난 것을 인지하였으면, 급브레이크를 밟는 것은 금물이다. 펑크난 타이어 쪽으로 미끄러질 수가 있다. 브레이크 페달을 여러번 나누어 천천히 밟고, 차를 길가에 바짝대어 정지시킨다. 이것을 펌핑 브레이크(단속 브레이크)라고 한다. 펌핑 브레이크를 이용하면, 스피드 컨트롤이 가능해 짐과 동시에, 순조로운 스피드 다운에 의해, 주의의 상황을 파악할 여유가 생긴다. 또한, 제동등이 점멸하므로, 후속차에게 이상발생을 알려 주의를 환기시킬 수있다.
② 고속 주행중에 펑크가 나서 타이어의 공기가 급격히 빠지거나 파열이 일어나면, 파열된 쪽으로 차체가 기울어져 급격히 핸들을 빼앗긴다. 이 때는 핸들을 단단히 잡고 직진방향으로 누르듯이 하고, 엔진브레이크로 서서히 속도를 떨어뜨려 길가에 댄다. 브레이크를 밟아서는안된다. 급브레이크를 밟으면 콘트롤을 잃어버려 오히려 위험하다
3. 타이어가 진창에 빠졌을때
모래밭이나 진창에 타이어가 빠졌을 때, 빠져나오려고 가속 페달을 밟으면, 밟는만큼 타이어는 더 빠져 버린다. 무턱대고 타이어를 공전시키면 탈출은 더욱 어렵게 되어 버린다. 가까이에 다른차가 있으면, 로프를 사용하여 견인을 받는 것이 제일이다. 로프는 소정의 훅에 단단히 연결할 것. 범퍼등에 걸면 파손의 우려가 있다. 자력으로 탈출할 수 밖에 없을 경우에는, 스콥, 판자, 돌 등을 준비한다. 주변에 사람이 있으면, 밀어줄 것을 부탁한다. 조급하게 서두는 것은 금물이다.
우선 잭업을 하고, 타이어의 밑에 판자나 돌, 골판지 등 단단한 것을 깐다. 타이어의 공기압을 조금 빼 보는 것도 좋다. 타이어의 공기압이 줄면 접지면적이 증가하여 마찰력이 커지므로 탈출이 쉬워진다. 탈출시에는 반드시 기어를 후진으로 하여, 후진주행으로 탈출한다. 기어중에서, 후진기어의 기어비가 가장 낮아 힘이 세기 때문이다.
무사히 탈출하였더라도 그곳에 그냥 정지하지 말고 노면이 단단한 곳까지 그대로 주행한다. 빠져나오는데 성공하였다 하더라도 한번 정지하면, 그속에서 다시 발진하지 못할 우려가 있다. 커버등에서 바깥쪽 바퀴가 진창에 빠져 공전하고, 단단한 노면에 있는 안쪽의 바퀴도 움직이지 않는 경우가 있다. 그런 경우에는 주차브레이크를 조금 당겨 차바퀴에 저항을 주면, 슬립을 하고 있지 않은 안쪽 차바퀴가 회전하여 탈출이 가능해진다.
4. 오버히트 되었을때
최근의 자동차는 냉각계통 장애 이외의 원인으로 돌연 오버히트되는 일은 거의없다. 오버히트가 일어나는 것은 냉각수의 누설, 부족, 팬벨트의 이완 절단, 라디에이터의 막힘이 주원인이다.
① 차를 그늘이나 통풍이 잘되는 곳에 세운다.
② 엔진이 작동하고 있는 상태로 본넷을 열어두어 통풍을 좋게 한다.
③ 온도가 떨어지면 엔진을 정지시킨다.
④ 엔진이 충분히 냉각되고 나서, 냉각수의 유무, 라디에이터 코어부(방열부)에 현저한 오염이나 오물 부착은 없는가, 팬벨트가 느슨해져 있지 않은가 등을 점검한다.
■ 냉각수이 부족일 경우
냉각수가 부족하다면 보충하여 주는데 수돗물이 좋다. 개울물이나 생수는 철분성분 때문에 부식가능성이 있다. 부득히 생수를 사용했다면 나중에 교체하도록 한다.
■ 라디에이터 호스가 손상된 경우
호스가 찢어져 있으면, 청테이프나 비닐테이프를 칭칭 감아 보수한다.
호스가 젖어 있으면 접착력이 약해지므로 천 등으로 잘 닦고나서 테이프를 많이 그리고 단단히 감아준다. 이대로 엔진의 시동을 걸면 압력이 걸려 보수 부위로부터 재차 누수가 발생하므로 라디에이터 캡을 열고 주행한다. 단, 엔진회전수를 올리지 말고, 서행하면서 수리공장으로 직행하도록 한다.
■ 팬팰트에 문제가 있는경우
팬벨트는 냉각팬과 워터펌프를 작동시키고 있다. 느슨해져 있으면 규정된 함량으로 조정한다. 또한 팬벨트가 끊어진 경우 ("뻥"하고 엔진이 폭발하는 것 같은 소리가 남)에는 곧 엔진을 정지시켜야 한다. 끊어진 벨트가 계속 돌면 배선이나 배관을 손상하기도 하고, 회전축에 감겨버리기도 한다. 끊어진 벨트가 엔진룸내에 있으면, 철사를 이용하여 일시적으로 보수할 수 있으나, 벨트없이도 수온계에 주의하면서 저속으로 주행하면 2~3km는 주행할 수 있다. 곧 수리공장에 집어넣는다. 단, 발전기도 움직이지 못하게 되므로, 카세트나 히터 등 전기를 사용하는 것은 모두 꺼 두어야 한다.
■ 라디에이터 코어 부분에 이물이 끼어 막혀 있으면 제거해 준다.
※ 라디에이터 캡을 열때 열이 어느정도 식은 다음 여는 것이 좋다. 냉각수에 압력이 걸려 있으므로 증기나 뜨거운 물이 분출되어 뜻하지 않은 화상을 입는 수가 있으므로 수건등을 덮고 캡을 조금 열어 [피시]하고 증기를 일단 빠지게 하는 것이 좋다.
5. 배터리가 방전되었을 때 시동하는 방법
배터리 방전으로 엔진시동이 불가능한 경우라도, 다른차의 배터리를 전원으로 하여 엔진의 시동을 걸수가 있다. 점퍼 와이어는 보통 빨강코드가 +용, 검정코드가 -용이다.
1. 점퍼 케이블을 아래 번호순서대로 접속한다.
① 배터리가 나간차의 배터리 +단자에 +용 케이블(빨강 코드)의 집게를 물린다.
② 그 케이블의 나머지 집게를 구원차 배터리 +단자에 연결한다.
③ -용 케이블(검정코드)의 집게를 구원차 배터리의 -단자에 연결한다.
④ 그 코드를 배터리가 나가차 배터리로부터 30cm 이상 떨어진 엔진 본체(훅등)에 연결한다.
※ 배터리와 배터리를 직접 연결하면 배터리에서 발생하는 가연성 가스에 인화하여 폭발이 일어날 우려가 있다.
2. 접속 후 구원차의 엔진회전수를 약간 높게 해 둔다. 이것은 전기를 받는 차의 엔진 시동이 어려워, 양쪽차가 모두 시동이 되지 않는 것을 방지하기 위함이다.
3. 배터리가 나간차의 시동을 건다.
4. 엔진의 시동이 걸리면, 연결시의 역순으로 점퍼 케이블을 분리한다.
스타트가 돌아 엔진의 시동이 걸렸어도, 잠시동안은 다소 엔진속도를 높여 그 장소에서 배터리를 회복시킨 후 주행을 시작하도록 한다.
■ 부스터 케이블이 없을 때
우산을 배터리코드 대용으로 사용할 수가 있다. 우선 2대의 자동차범퍼를 서로 맞대고, 배터리의 플러스 단자끼리 금속제 우산대를 연결시키고 시동을 건다. 접속을 확실히 하기위해 철사나 끈으로 매어 둔다.
6. 브레이크가 고장났을때
풋브레이크가 고장 났을 경우에는 엔진 브레이크 및 주차브레이크를 사용하면 된다. 우선 고장을 알리기 위해 비상등을 켜고 엔진브레이크를 사용하면서 속도를 줄여 나가는 것이다. 커브가 급하지 않은 곳에서는 엔진 브레이크를 사용하면서도 충분히 속도를 줄일 수가 있다. 갑작스럽게 주차브레이크를 당기면 차량이 흔들리고 핸들이 틀어져 있을 경우에는 차량이 돌아갈 수 있다. 이는 보통 주차 브레이크는 뒷바퀴에 연결되어 있어 뒤쪽에만 제동이 되기 때문이다. 매뉴얼 차량은 기어를 1단에 넣고, 오토매틱 차량은 레버를 'L'에 옮긴다. 우선 엔진을 끄고 속도가 줄면 사이드브레이크를 잡아당긴다.
두번째는 갑작스러운 돌발상황에서가 문제다. 이 때는 주차브레이크를 이용하여 차량을 90도 회전시켜 정지하는 방법으로 왼손으로 핸들을 오른쪽으로 45도 정도 돌리는 동시에 주차 브레이크를 오른손으로 당겨 올리면 차머리가 오른쪽으로 틀리며 미끄러지면서 멈출 수 있다. 왼쪽으로 차 머리를 틀리게 하려면 핸들 방향만 왼쪽으로 돌리고 조작방법은 동일하다.
7. 전조등이 안 켜질때
밀봉식 헤드라이트의 경우 전조등 렌즈 위를 '탕탕' 때려본다. 끊어진 필라멘트가 붙을 수 있기 때문이다. 일반적으로 헤드램프는 하향등이 끊어지므로 상향등을 켠 후 윗부분을 청테이프 등으로 살짝 가리면 하향등 대용으로 쓸 수 있다.
8. 와이퍼가 작동되지 않을때
와이퍼를 작동시키는 모터소리가 들리지 않는다면 휴즈가 끊어진 것이다.
만일 예비용 휴즈가 없다면 담배꽁초나 비누를 앞창에다 골고루 칠한다. 담배나 비누의 계면활성성분이 빗방울이 생기는 것을 막아주기 때문이다. 비오는 날 사이드 미러가 잘보이지 않는다면 이 방법을 응용할 수 있다.
9. 키가 돌아가지 않을때
차 시동을 걸려고 키를 돌려도 키가 돌아가지 않을 때가 있다. 이것은 핸들의 잠금장치가 작동하고 있기 때문이다. 이 때는 키를 가볍게 돌리면서 핸들을 좌우로 툭툭 치듯이 돌리면 잠금장치가 풀리면서 키가 돌아가게 된다.
10. 시동이 걸리지 않을때
우선 시동시에 스타트 모터가 돌아 가는가를 점검한다. 이 경우는 배터리나 모터에는 이상이 없는 것으로 연료계통에 이상이 있을 수 있다. 연료가 충분한 경우에는 연료펌프에 이상이 있을 수 있으며, 연료가 부족한 경우에는 연료탱크가 있는 뒤쪽을 흔들어 시동을 걸면 시동을 걸 수가 있다. 이 경우는 연료탱크 안에 있던 물이 아래로 내려가 물이 호스로 올라와 시동이 안 걸리는 수가 있기 때문다.
또 한가지는 타이밍 밸트가 끊어지거나 마모된 경우로 이 경우는 정비를 받아야만 한다. 모터가 안도는 경우는 배터리가 방전되었거나 발전기가 고장난 경우다. 발전기가 정상적으로 작동한다면 다른차와 점프를 하면 시동이 걸리고 시동이 꺼지지 않는 한 운행을 할 수가 있지만 발전기가 고장난 경우는 점프선을 떼면 시동이 꺼진다. 이 경우는 발전기를 교환하여야 한다. 응급조치로는 배터리만 갈면 배터리의 힘으로 어느 정도는 주행할 수가 있다.
■ 배터리가 나가 시동이 안걸릴 때
수동변속차량은 키를 시동거는 위치에 놓고, 기어를 2단에 넣은 다음 크러치를 밟은 상태에서 자동차를 내리막길로 내려가게 하거나 평지에서 뒷쪽에서 다른 사람이 밀게한다. 차가 움직이여 어느정도 탄력을 받았다고 판단이 되면 밟았던 클러치를 떼면서 시동을 걸 면 된다. 그러나, 오토매틱 차량은 이 방법을 쓸수 없으므로 평상시 부스터케이블을 가지고 다니도록 하는 것이 좋다.
■ 배터리가 약해 시동이 안걸릴 때
배터리가 약하고 불안한 경우는 시동을 끄기전 모든 전장품의 가동을 중지시키고 10분정도 쉰 후 다시 걸어본다. 그러나 시동모터를 지나치게 돌려서 배터리가 방전되었을 경우 30분 정도 기다린 후 다시 걸어본다.
■ 더위로 시동이 안걸릴 때
이는 열기로 인해 연료 펌프나 연료 파이프 속의 연료가 대기열과 엔진열에 의해 증기로 변화되어 연료의 양이 부족하여 생기는 베이퍼록 현상이다. 이로인해 연료 펌프가 충분히 제 역할을 한다 해도 연료 라인내의 공기가 이그러져(고무풍선 이그러지듯) 연료가 압송되지 못하게 되고 이에따라 연료 공급이 제대로 이루어지지 않아 시동이 꺼지게된다. 이 때는 보넷트를 열어 열을 식히거나, 헝겊을 물에 적셔 연료펌프나 연료 파이프를 식혀주면 시동이 쉽게 걸린다.
11. 스위치를 꺼도 시동이 꺼지지 않을때
엔진이 오버히트하면 스위치를 꺼도 시동이 꺼지지 않을 때가 있다. 이 때는 가속페달을 꽉 밟아 휘발유가 기화기에 다량 분출되면 혼합가스가 진해져 시동이 꺼진다.
12. 신호대기중 시동이 저절로 꺼질때
점화계통 불량일 가능성이 많다. 이 때는 차를 한가한 곳으로 옮겨 플러그와 디스트리뷰터 연결부위의 금속을 점검한다. 평상시 플러그와 디스트리뷰터는 점검을 해 두는 것이 좋다
13. 주차중인 차의 기어가 빠지지 않을때
비탈길에 주차된 차를 발차시킬 때 기어가 잘 빠지지 않는 경우가 있다. 이 때는 사람들이 자동차를 앞뒤로 밀면서 움직이면 된다. 이런 현상은 노후된 차에 자주 생기며 기어의 틈새가 벌어져 서로 완전히 물리지 않아 빠지지 않는 것이다.
14. 밟은 엑셀이 빠지지 않을때
주행중 액셀을 밟은 상태에서 나오지 않는 경우, 이 때는 차가 가속된 상태이므로 급브레이크를 밟으면 차가 미끄러지거나 돌 수 있다. 먼저 안전한 곳에서 시동을 끄고, 엔진브레이크를 걸어서 속도가 떨어지도록 하며, 길가로 대피시킨다.
15. 경음기가 꺼지지 않을때
배터리의 마이너스극 쪽을 빼놓는다. 자동차의 배선은 전화계통, 라이트 계통, 와이퍼계통, 워셔계통으로 분리되어 있다. 라이트나 경음기에 이상이 생기면 그 계통의 커넥터나 휴즈를 제거하면 된다. 배터리는 12V로 감전은 염려 안해도 된다.
16. 주행중 본닛에서 김이 날때
이는 라디에이터 호스가 찢어지면서 누출된 냉각수가 엔진에 튀어서 생기는 것이다. 이 때는 차를 안전한 곳에 세우고 잠시 기다리면 김이 사라진다. 찢어진 부분을 확인하여 닦아내고 테이프로 감는다. 엔진이 식으면 냉각수를 보충한다.
17. 라디에이터에서 물이 샐때
먼저 라디에이터캡을 열어 냉각계통의 압력을 줄여주어야 물이 새는 것을 줄일 수 있다. 임시로 구멍난 곳에 밥알을 으깨어 붙이면 밥알이 말라 붙으면서 구멍을 메워준다.
18. 배터리,브레이크액이 부족할 때
배터리액이 부족할 경우에는 보충해야 하는데 급할 때는 약국에서 증류수를 사 넣어도 된다. 브레이크 페달을 밟아 바닥까지 움직이면 브레이크 오일이 부족한 경우로 즉시 운행을 멈춰야 한다. 먼저 브레이크 마스터 실린더의 오일을 점검해서 부족시 브레이크 오일을 보충한다. 브레이크 오일이 없는 경우는 소주나 위스키를 붓는다.
19. 머플러에서 흰 연기가 날때
액셀레이터를 밟았을 때 머플러에서 흰 연기가 나면 엔진오일이 타는 것이다. 엔진오일이 과소모되는 이유는 피스톤, 링이 불결하거나 실린더, 밸브, 핀 가이드 등이 마모됐을 경우에 나타난다. 즉시 수리를 받도록 하는 것이 좋다.
20. 연료가 떨어졌을때
계기판이 E를 가리킬 때 기어를 1단이나 2단에 넣고 키를 돌리면 스타팅 모터의 구동력에 의해서 조금씩 10여 M는 갈 수 있다. 그래도 안되면 연료탱크 밑바닥에 잇는 너트 (드레인 플러그)를 풀면 약 2.5리터의 휘발유가 나오므로 20km 정도는 갈 수 있다.
21. 차안에 벌이 들어 왔을때
운전중에 벌레를 몰아내려 하면 매우 위험하다. 이 때는 우선 창문을 열고 송풍팬의 스위치를 켠 후, 전면 윈도우 쪽으로 바람이 세게 가게 하면 바람에 밀려 벌이 창밖으로 나가게 된다. 가장 확실한 방법은 차를 세워 몰아낸 후 주행하는 것이다.
22. 차가 모래/길밖/진흙웅덩이/눈길에 빠졌을때
■ 모래에 빠졌을때
여름 휴가철에 해수욕장을 갔을 경우에 가끔 발생하는 것 중에 하나가 모래에 차가 빠졌을 경우다. 이럴 때는 아무리 나오려 해도 모래만 밀려나오고 차가 더 깊숙이 들어가게 된다. 이 경우는 물을 모래에 부으면 모래가 물다짐으로 단단하게 되며 구동축 타이어의 공기를 빼내면 접지력이 높아져 쉽게 나올 수 있다. 이 때 중요한 것은 기어를 1단이 아닌 2단을 넣어야 합니다. 그래야만 회전수가 줄어들고 미끄러짐이 없이 서서히 빠져 나올 수 있다.
■ 바퀴가 길밖으로 빠졌을 때
바퀴가 하나만 빠졌을 때는 차를 좀 더 길밖으로 내민 다음, 크게 핸들을 꺾으면서 전진하면 올라 올 수 있다. 홈이 깊어 차바퀴가 공중에 떠 있을 때는 도로선에 거의 직각이 되게 바퀴를 돌려 후진하면 된다. 그래도 안되면 자키를 이용한다.
■ 진흙웅덩이에 차가 빠졌을 때
나무나 돌, 잡지, 신문지 등을 집어 넣은 후 기어를 2단에 놓고 천천히 출발시킨다. 그래도 안되는 경우는 구동축이 되는 타이어의 공기압을 약간 뽑으면 빠져 나올 수 있다. 나온 뒤에는 반드시 타이어의 공기압을 보충해 주어야 한다.
■ 눈길에 차가 빠졌을 때
바퀴밑에 흙이나 돌을 뿌린 후 낮은 단수의 기어를 넣고 천천히 빠져 나온다. 그래도 안되면 차를 앞뒤로 반복해 움직이면서 트랙션을 더 크게 얻어 빠져 나온다. 겨울에는 삽을 싣고 다니면 유용하게 쓸 수 있다.
23. 차가 물속에 빠졌을때
물이 있는곳을 지나가다 시동이 꺼져 정지했는지 아니면 차 전체가 물속에 잠겼는지에 따라 조치방법이 달라진다. 우선 물 있는곳을 지나가다 시동이 꺼졌을 경우는 보통 점화장치 부품인 배전기와 점화코일, 점화플러그, 점화플러그 배선에 물기가 묻어 전기가 정상적으로 흐르지 못하고 엔진으로 누전되어 시동이 꺼졌다고 볼 수 있다. 점화장치 부품에 묻어 있는 물기를 닦고 시동을 걸면 되는데 상태가 심각할 경우 한쪽으로 주차시킨 후 긴급 봉사반이나 정비업소에 의뢰하는 것이 좋다.
차가 물에 잠겼을 때에는 즉시 차에서 빠져 나와 견인 요청을 해야 한다. 그런데 문제는 물에 잠긴차를 곧바로 시동을 걸어도 되는지, 운행해도 되는지의 여부이다. 일반적으로 보넷트를 기준으로 그 아래까지 물에 잠겼다면 에어클리너 교환 및 케이스 내부 세척과 엔진 옆 부품 특피 점화장치 부품을 세척해야 운행이 가능하다. (정비업소나 세차장까지 운행)그러나 보넷트 위까지 물에 잠겼다면 엔진내부까지 물이 침입했을 우려가 있으므로 견인차로 견인해 정비업소에서 정밀 진단을 받아야 한다.
수해지역에서 자동차가 침수되었을 경우에는 절대로 시동을 걸지 않아야 한다. 시동을 걸 경우 엔진 내부가 파손될 우려가 많기 때문이다. 그리고 앞.뒤 바퀴의 허브 베어링 그리스를 점검해 필요때 교환해주고 브레이크 드럼에 이물질이 묻었을 때에는 드럼이나 라이닝이 이상 마모를 일으키므로 분해 점검하고 라이닝을 교환해 주는 것이 좋다.
[출처 : 인터넷 검색]
참조 사이트 : http://blog.empas.com/headcutter/22155945
브레이크에서 이상음이 들리지 않는 경우는 브레이크액의 누설, 브레이크 페달을 밟을 때 [끼]하는 이상음이 발생하는 경우는 브레이크 라이닝의 마모나 헐거움을 생각할 수 있다.
① 주행중에 브레이크의 제동력이 떨어졌음을 느꼈으면, 엔진회전에 맞추면서, 기어단수를 서서히 감속한다.
② 충분히 감속이 되었으면, 핸드 브레이크를 천천히 당겨 더욱 감속하여 정지시킨다.이 때 급격히 핸드브레이크를 당기면 균형을 잃어 스핀하거나, 브레이크의 와이어가 끊어질 우려가 있으므로 주의하여야 한다. 또한, 당황하여 엔진 스위치를 끄면 핸들이 무거워 방향성을 잃게 되므로 도리어 위험하다.
③ 차를 정지시켰으면 본넷을 열고, 브레이크액의 양을 점검한다. 줄어 있다면, 브레이크 파이프등에 액 누설은 없는지 점검한다. 경상일 경우에는 브레이크액을 보충하면 다소 주행할 수 있으나, 탱크가 비었거나 하는 경우는 전문가에게 연락하여야 한다.
④ 브레이크에서 이상음이 발생할 경우 전문가의 점검을 받을 것.
※ 타이어가 수몰되어 휠이 잠기는 물웅덩이를 지나간 후에는 브레이크의 제동력이 약해지는 수가있다. 드럼과 슈에 물이 묻어 마찰력이 떨어지기 때문이다. 물웅덩이를 빠져나온 경우에는, 브레이크 페달을 2~3회 가볍게 밟아주면, 마찰열에 의해 수분이 증발하여 브레이크는 원상태로 회복된다.
2. 주행중 타이어가 펑크 났을때
최근의 자동차는 일반적으로 튜브리스 스틸 래디얼 타이어를 사용하고 있어서, [뻥]하고 요란스럽게 펑크나는 일은 없어졌다. 주행중에 자동차의 주행이 부자연스러워 타이어를 조사해 보니 펑크가 나 있더라는 경우가 많다. 그러나 펑크가 난 것을 인식하지 못하고 그대로 주행을 계속하면, 브레크 페달을 밟거나핸들을 꺾거나 했을 때 차가 한쪽편으로 쏠려 대단히 위험하다. 차의 이상한 흔들림이나 타이어의 이상음에 주의하여, 일찍 펑크를 발견하도록 유념하여야 한다.
① 타이어가 펑크난 것을 인지하였으면, 급브레이크를 밟는 것은 금물이다. 펑크난 타이어 쪽으로 미끄러질 수가 있다. 브레이크 페달을 여러번 나누어 천천히 밟고, 차를 길가에 바짝대어 정지시킨다. 이것을 펌핑 브레이크(단속 브레이크)라고 한다. 펌핑 브레이크를 이용하면, 스피드 컨트롤이 가능해 짐과 동시에, 순조로운 스피드 다운에 의해, 주의의 상황을 파악할 여유가 생긴다. 또한, 제동등이 점멸하므로, 후속차에게 이상발생을 알려 주의를 환기시킬 수있다.
② 고속 주행중에 펑크가 나서 타이어의 공기가 급격히 빠지거나 파열이 일어나면, 파열된 쪽으로 차체가 기울어져 급격히 핸들을 빼앗긴다. 이 때는 핸들을 단단히 잡고 직진방향으로 누르듯이 하고, 엔진브레이크로 서서히 속도를 떨어뜨려 길가에 댄다. 브레이크를 밟아서는안된다. 급브레이크를 밟으면 콘트롤을 잃어버려 오히려 위험하다
3. 타이어가 진창에 빠졌을때
모래밭이나 진창에 타이어가 빠졌을 때, 빠져나오려고 가속 페달을 밟으면, 밟는만큼 타이어는 더 빠져 버린다. 무턱대고 타이어를 공전시키면 탈출은 더욱 어렵게 되어 버린다. 가까이에 다른차가 있으면, 로프를 사용하여 견인을 받는 것이 제일이다. 로프는 소정의 훅에 단단히 연결할 것. 범퍼등에 걸면 파손의 우려가 있다. 자력으로 탈출할 수 밖에 없을 경우에는, 스콥, 판자, 돌 등을 준비한다. 주변에 사람이 있으면, 밀어줄 것을 부탁한다. 조급하게 서두는 것은 금물이다.
우선 잭업을 하고, 타이어의 밑에 판자나 돌, 골판지 등 단단한 것을 깐다. 타이어의 공기압을 조금 빼 보는 것도 좋다. 타이어의 공기압이 줄면 접지면적이 증가하여 마찰력이 커지므로 탈출이 쉬워진다. 탈출시에는 반드시 기어를 후진으로 하여, 후진주행으로 탈출한다. 기어중에서, 후진기어의 기어비가 가장 낮아 힘이 세기 때문이다.
무사히 탈출하였더라도 그곳에 그냥 정지하지 말고 노면이 단단한 곳까지 그대로 주행한다. 빠져나오는데 성공하였다 하더라도 한번 정지하면, 그속에서 다시 발진하지 못할 우려가 있다. 커버등에서 바깥쪽 바퀴가 진창에 빠져 공전하고, 단단한 노면에 있는 안쪽의 바퀴도 움직이지 않는 경우가 있다. 그런 경우에는 주차브레이크를 조금 당겨 차바퀴에 저항을 주면, 슬립을 하고 있지 않은 안쪽 차바퀴가 회전하여 탈출이 가능해진다.
4. 오버히트 되었을때
최근의 자동차는 냉각계통 장애 이외의 원인으로 돌연 오버히트되는 일은 거의없다. 오버히트가 일어나는 것은 냉각수의 누설, 부족, 팬벨트의 이완 절단, 라디에이터의 막힘이 주원인이다.
① 차를 그늘이나 통풍이 잘되는 곳에 세운다.
② 엔진이 작동하고 있는 상태로 본넷을 열어두어 통풍을 좋게 한다.
③ 온도가 떨어지면 엔진을 정지시킨다.
④ 엔진이 충분히 냉각되고 나서, 냉각수의 유무, 라디에이터 코어부(방열부)에 현저한 오염이나 오물 부착은 없는가, 팬벨트가 느슨해져 있지 않은가 등을 점검한다.
■ 냉각수이 부족일 경우
냉각수가 부족하다면 보충하여 주는데 수돗물이 좋다. 개울물이나 생수는 철분성분 때문에 부식가능성이 있다. 부득히 생수를 사용했다면 나중에 교체하도록 한다.
■ 라디에이터 호스가 손상된 경우
호스가 찢어져 있으면, 청테이프나 비닐테이프를 칭칭 감아 보수한다.
호스가 젖어 있으면 접착력이 약해지므로 천 등으로 잘 닦고나서 테이프를 많이 그리고 단단히 감아준다. 이대로 엔진의 시동을 걸면 압력이 걸려 보수 부위로부터 재차 누수가 발생하므로 라디에이터 캡을 열고 주행한다. 단, 엔진회전수를 올리지 말고, 서행하면서 수리공장으로 직행하도록 한다.
■ 팬팰트에 문제가 있는경우
팬벨트는 냉각팬과 워터펌프를 작동시키고 있다. 느슨해져 있으면 규정된 함량으로 조정한다. 또한 팬벨트가 끊어진 경우 ("뻥"하고 엔진이 폭발하는 것 같은 소리가 남)에는 곧 엔진을 정지시켜야 한다. 끊어진 벨트가 계속 돌면 배선이나 배관을 손상하기도 하고, 회전축에 감겨버리기도 한다. 끊어진 벨트가 엔진룸내에 있으면, 철사를 이용하여 일시적으로 보수할 수 있으나, 벨트없이도 수온계에 주의하면서 저속으로 주행하면 2~3km는 주행할 수 있다. 곧 수리공장에 집어넣는다. 단, 발전기도 움직이지 못하게 되므로, 카세트나 히터 등 전기를 사용하는 것은 모두 꺼 두어야 한다.
■ 라디에이터 코어 부분에 이물이 끼어 막혀 있으면 제거해 준다.
※ 라디에이터 캡을 열때 열이 어느정도 식은 다음 여는 것이 좋다. 냉각수에 압력이 걸려 있으므로 증기나 뜨거운 물이 분출되어 뜻하지 않은 화상을 입는 수가 있으므로 수건등을 덮고 캡을 조금 열어 [피시]하고 증기를 일단 빠지게 하는 것이 좋다.
5. 배터리가 방전되었을 때 시동하는 방법
배터리 방전으로 엔진시동이 불가능한 경우라도, 다른차의 배터리를 전원으로 하여 엔진의 시동을 걸수가 있다. 점퍼 와이어는 보통 빨강코드가 +용, 검정코드가 -용이다.
1. 점퍼 케이블을 아래 번호순서대로 접속한다.
① 배터리가 나간차의 배터리 +단자에 +용 케이블(빨강 코드)의 집게를 물린다.
② 그 케이블의 나머지 집게를 구원차 배터리 +단자에 연결한다.
③ -용 케이블(검정코드)의 집게를 구원차 배터리의 -단자에 연결한다.
④ 그 코드를 배터리가 나가차 배터리로부터 30cm 이상 떨어진 엔진 본체(훅등)에 연결한다.
※ 배터리와 배터리를 직접 연결하면 배터리에서 발생하는 가연성 가스에 인화하여 폭발이 일어날 우려가 있다.
2. 접속 후 구원차의 엔진회전수를 약간 높게 해 둔다. 이것은 전기를 받는 차의 엔진 시동이 어려워, 양쪽차가 모두 시동이 되지 않는 것을 방지하기 위함이다.
3. 배터리가 나간차의 시동을 건다.
4. 엔진의 시동이 걸리면, 연결시의 역순으로 점퍼 케이블을 분리한다.
스타트가 돌아 엔진의 시동이 걸렸어도, 잠시동안은 다소 엔진속도를 높여 그 장소에서 배터리를 회복시킨 후 주행을 시작하도록 한다.
■ 부스터 케이블이 없을 때
우산을 배터리코드 대용으로 사용할 수가 있다. 우선 2대의 자동차범퍼를 서로 맞대고, 배터리의 플러스 단자끼리 금속제 우산대를 연결시키고 시동을 건다. 접속을 확실히 하기위해 철사나 끈으로 매어 둔다.
6. 브레이크가 고장났을때
풋브레이크가 고장 났을 경우에는 엔진 브레이크 및 주차브레이크를 사용하면 된다. 우선 고장을 알리기 위해 비상등을 켜고 엔진브레이크를 사용하면서 속도를 줄여 나가는 것이다. 커브가 급하지 않은 곳에서는 엔진 브레이크를 사용하면서도 충분히 속도를 줄일 수가 있다. 갑작스럽게 주차브레이크를 당기면 차량이 흔들리고 핸들이 틀어져 있을 경우에는 차량이 돌아갈 수 있다. 이는 보통 주차 브레이크는 뒷바퀴에 연결되어 있어 뒤쪽에만 제동이 되기 때문이다. 매뉴얼 차량은 기어를 1단에 넣고, 오토매틱 차량은 레버를 'L'에 옮긴다. 우선 엔진을 끄고 속도가 줄면 사이드브레이크를 잡아당긴다.
두번째는 갑작스러운 돌발상황에서가 문제다. 이 때는 주차브레이크를 이용하여 차량을 90도 회전시켜 정지하는 방법으로 왼손으로 핸들을 오른쪽으로 45도 정도 돌리는 동시에 주차 브레이크를 오른손으로 당겨 올리면 차머리가 오른쪽으로 틀리며 미끄러지면서 멈출 수 있다. 왼쪽으로 차 머리를 틀리게 하려면 핸들 방향만 왼쪽으로 돌리고 조작방법은 동일하다.
7. 전조등이 안 켜질때
밀봉식 헤드라이트의 경우 전조등 렌즈 위를 '탕탕' 때려본다. 끊어진 필라멘트가 붙을 수 있기 때문이다. 일반적으로 헤드램프는 하향등이 끊어지므로 상향등을 켠 후 윗부분을 청테이프 등으로 살짝 가리면 하향등 대용으로 쓸 수 있다.
8. 와이퍼가 작동되지 않을때
와이퍼를 작동시키는 모터소리가 들리지 않는다면 휴즈가 끊어진 것이다.
만일 예비용 휴즈가 없다면 담배꽁초나 비누를 앞창에다 골고루 칠한다. 담배나 비누의 계면활성성분이 빗방울이 생기는 것을 막아주기 때문이다. 비오는 날 사이드 미러가 잘보이지 않는다면 이 방법을 응용할 수 있다.
9. 키가 돌아가지 않을때
차 시동을 걸려고 키를 돌려도 키가 돌아가지 않을 때가 있다. 이것은 핸들의 잠금장치가 작동하고 있기 때문이다. 이 때는 키를 가볍게 돌리면서 핸들을 좌우로 툭툭 치듯이 돌리면 잠금장치가 풀리면서 키가 돌아가게 된다.
10. 시동이 걸리지 않을때
우선 시동시에 스타트 모터가 돌아 가는가를 점검한다. 이 경우는 배터리나 모터에는 이상이 없는 것으로 연료계통에 이상이 있을 수 있다. 연료가 충분한 경우에는 연료펌프에 이상이 있을 수 있으며, 연료가 부족한 경우에는 연료탱크가 있는 뒤쪽을 흔들어 시동을 걸면 시동을 걸 수가 있다. 이 경우는 연료탱크 안에 있던 물이 아래로 내려가 물이 호스로 올라와 시동이 안 걸리는 수가 있기 때문다.
또 한가지는 타이밍 밸트가 끊어지거나 마모된 경우로 이 경우는 정비를 받아야만 한다. 모터가 안도는 경우는 배터리가 방전되었거나 발전기가 고장난 경우다. 발전기가 정상적으로 작동한다면 다른차와 점프를 하면 시동이 걸리고 시동이 꺼지지 않는 한 운행을 할 수가 있지만 발전기가 고장난 경우는 점프선을 떼면 시동이 꺼진다. 이 경우는 발전기를 교환하여야 한다. 응급조치로는 배터리만 갈면 배터리의 힘으로 어느 정도는 주행할 수가 있다.
■ 배터리가 나가 시동이 안걸릴 때
수동변속차량은 키를 시동거는 위치에 놓고, 기어를 2단에 넣은 다음 크러치를 밟은 상태에서 자동차를 내리막길로 내려가게 하거나 평지에서 뒷쪽에서 다른 사람이 밀게한다. 차가 움직이여 어느정도 탄력을 받았다고 판단이 되면 밟았던 클러치를 떼면서 시동을 걸 면 된다. 그러나, 오토매틱 차량은 이 방법을 쓸수 없으므로 평상시 부스터케이블을 가지고 다니도록 하는 것이 좋다.
■ 배터리가 약해 시동이 안걸릴 때
배터리가 약하고 불안한 경우는 시동을 끄기전 모든 전장품의 가동을 중지시키고 10분정도 쉰 후 다시 걸어본다. 그러나 시동모터를 지나치게 돌려서 배터리가 방전되었을 경우 30분 정도 기다린 후 다시 걸어본다.
■ 더위로 시동이 안걸릴 때
이는 열기로 인해 연료 펌프나 연료 파이프 속의 연료가 대기열과 엔진열에 의해 증기로 변화되어 연료의 양이 부족하여 생기는 베이퍼록 현상이다. 이로인해 연료 펌프가 충분히 제 역할을 한다 해도 연료 라인내의 공기가 이그러져(고무풍선 이그러지듯) 연료가 압송되지 못하게 되고 이에따라 연료 공급이 제대로 이루어지지 않아 시동이 꺼지게된다. 이 때는 보넷트를 열어 열을 식히거나, 헝겊을 물에 적셔 연료펌프나 연료 파이프를 식혀주면 시동이 쉽게 걸린다.
11. 스위치를 꺼도 시동이 꺼지지 않을때
엔진이 오버히트하면 스위치를 꺼도 시동이 꺼지지 않을 때가 있다. 이 때는 가속페달을 꽉 밟아 휘발유가 기화기에 다량 분출되면 혼합가스가 진해져 시동이 꺼진다.
12. 신호대기중 시동이 저절로 꺼질때
점화계통 불량일 가능성이 많다. 이 때는 차를 한가한 곳으로 옮겨 플러그와 디스트리뷰터 연결부위의 금속을 점검한다. 평상시 플러그와 디스트리뷰터는 점검을 해 두는 것이 좋다
13. 주차중인 차의 기어가 빠지지 않을때
비탈길에 주차된 차를 발차시킬 때 기어가 잘 빠지지 않는 경우가 있다. 이 때는 사람들이 자동차를 앞뒤로 밀면서 움직이면 된다. 이런 현상은 노후된 차에 자주 생기며 기어의 틈새가 벌어져 서로 완전히 물리지 않아 빠지지 않는 것이다.
14. 밟은 엑셀이 빠지지 않을때
주행중 액셀을 밟은 상태에서 나오지 않는 경우, 이 때는 차가 가속된 상태이므로 급브레이크를 밟으면 차가 미끄러지거나 돌 수 있다. 먼저 안전한 곳에서 시동을 끄고, 엔진브레이크를 걸어서 속도가 떨어지도록 하며, 길가로 대피시킨다.
15. 경음기가 꺼지지 않을때
배터리의 마이너스극 쪽을 빼놓는다. 자동차의 배선은 전화계통, 라이트 계통, 와이퍼계통, 워셔계통으로 분리되어 있다. 라이트나 경음기에 이상이 생기면 그 계통의 커넥터나 휴즈를 제거하면 된다. 배터리는 12V로 감전은 염려 안해도 된다.
16. 주행중 본닛에서 김이 날때
이는 라디에이터 호스가 찢어지면서 누출된 냉각수가 엔진에 튀어서 생기는 것이다. 이 때는 차를 안전한 곳에 세우고 잠시 기다리면 김이 사라진다. 찢어진 부분을 확인하여 닦아내고 테이프로 감는다. 엔진이 식으면 냉각수를 보충한다.
17. 라디에이터에서 물이 샐때
먼저 라디에이터캡을 열어 냉각계통의 압력을 줄여주어야 물이 새는 것을 줄일 수 있다. 임시로 구멍난 곳에 밥알을 으깨어 붙이면 밥알이 말라 붙으면서 구멍을 메워준다.
18. 배터리,브레이크액이 부족할 때
배터리액이 부족할 경우에는 보충해야 하는데 급할 때는 약국에서 증류수를 사 넣어도 된다. 브레이크 페달을 밟아 바닥까지 움직이면 브레이크 오일이 부족한 경우로 즉시 운행을 멈춰야 한다. 먼저 브레이크 마스터 실린더의 오일을 점검해서 부족시 브레이크 오일을 보충한다. 브레이크 오일이 없는 경우는 소주나 위스키를 붓는다.
19. 머플러에서 흰 연기가 날때
액셀레이터를 밟았을 때 머플러에서 흰 연기가 나면 엔진오일이 타는 것이다. 엔진오일이 과소모되는 이유는 피스톤, 링이 불결하거나 실린더, 밸브, 핀 가이드 등이 마모됐을 경우에 나타난다. 즉시 수리를 받도록 하는 것이 좋다.
20. 연료가 떨어졌을때
계기판이 E를 가리킬 때 기어를 1단이나 2단에 넣고 키를 돌리면 스타팅 모터의 구동력에 의해서 조금씩 10여 M는 갈 수 있다. 그래도 안되면 연료탱크 밑바닥에 잇는 너트 (드레인 플러그)를 풀면 약 2.5리터의 휘발유가 나오므로 20km 정도는 갈 수 있다.
21. 차안에 벌이 들어 왔을때
운전중에 벌레를 몰아내려 하면 매우 위험하다. 이 때는 우선 창문을 열고 송풍팬의 스위치를 켠 후, 전면 윈도우 쪽으로 바람이 세게 가게 하면 바람에 밀려 벌이 창밖으로 나가게 된다. 가장 확실한 방법은 차를 세워 몰아낸 후 주행하는 것이다.
22. 차가 모래/길밖/진흙웅덩이/눈길에 빠졌을때
■ 모래에 빠졌을때
여름 휴가철에 해수욕장을 갔을 경우에 가끔 발생하는 것 중에 하나가 모래에 차가 빠졌을 경우다. 이럴 때는 아무리 나오려 해도 모래만 밀려나오고 차가 더 깊숙이 들어가게 된다. 이 경우는 물을 모래에 부으면 모래가 물다짐으로 단단하게 되며 구동축 타이어의 공기를 빼내면 접지력이 높아져 쉽게 나올 수 있다. 이 때 중요한 것은 기어를 1단이 아닌 2단을 넣어야 합니다. 그래야만 회전수가 줄어들고 미끄러짐이 없이 서서히 빠져 나올 수 있다.
■ 바퀴가 길밖으로 빠졌을 때
바퀴가 하나만 빠졌을 때는 차를 좀 더 길밖으로 내민 다음, 크게 핸들을 꺾으면서 전진하면 올라 올 수 있다. 홈이 깊어 차바퀴가 공중에 떠 있을 때는 도로선에 거의 직각이 되게 바퀴를 돌려 후진하면 된다. 그래도 안되면 자키를 이용한다.
■ 진흙웅덩이에 차가 빠졌을 때
나무나 돌, 잡지, 신문지 등을 집어 넣은 후 기어를 2단에 놓고 천천히 출발시킨다. 그래도 안되는 경우는 구동축이 되는 타이어의 공기압을 약간 뽑으면 빠져 나올 수 있다. 나온 뒤에는 반드시 타이어의 공기압을 보충해 주어야 한다.
■ 눈길에 차가 빠졌을 때
바퀴밑에 흙이나 돌을 뿌린 후 낮은 단수의 기어를 넣고 천천히 빠져 나온다. 그래도 안되면 차를 앞뒤로 반복해 움직이면서 트랙션을 더 크게 얻어 빠져 나온다. 겨울에는 삽을 싣고 다니면 유용하게 쓸 수 있다.
23. 차가 물속에 빠졌을때
물이 있는곳을 지나가다 시동이 꺼져 정지했는지 아니면 차 전체가 물속에 잠겼는지에 따라 조치방법이 달라진다. 우선 물 있는곳을 지나가다 시동이 꺼졌을 경우는 보통 점화장치 부품인 배전기와 점화코일, 점화플러그, 점화플러그 배선에 물기가 묻어 전기가 정상적으로 흐르지 못하고 엔진으로 누전되어 시동이 꺼졌다고 볼 수 있다. 점화장치 부품에 묻어 있는 물기를 닦고 시동을 걸면 되는데 상태가 심각할 경우 한쪽으로 주차시킨 후 긴급 봉사반이나 정비업소에 의뢰하는 것이 좋다.
차가 물에 잠겼을 때에는 즉시 차에서 빠져 나와 견인 요청을 해야 한다. 그런데 문제는 물에 잠긴차를 곧바로 시동을 걸어도 되는지, 운행해도 되는지의 여부이다. 일반적으로 보넷트를 기준으로 그 아래까지 물에 잠겼다면 에어클리너 교환 및 케이스 내부 세척과 엔진 옆 부품 특피 점화장치 부품을 세척해야 운행이 가능하다. (정비업소나 세차장까지 운행)그러나 보넷트 위까지 물에 잠겼다면 엔진내부까지 물이 침입했을 우려가 있으므로 견인차로 견인해 정비업소에서 정밀 진단을 받아야 한다.
수해지역에서 자동차가 침수되었을 경우에는 절대로 시동을 걸지 않아야 한다. 시동을 걸 경우 엔진 내부가 파손될 우려가 많기 때문이다. 그리고 앞.뒤 바퀴의 허브 베어링 그리스를 점검해 필요때 교환해주고 브레이크 드럼에 이물질이 묻었을 때에는 드럼이나 라이닝이 이상 마모를 일으키므로 분해 점검하고 라이닝을 교환해 주는 것이 좋다.
[출처 : 인터넷 검색]
참조 사이트 : http://blog.empas.com/headcutter/22155945
이클립스디버깅방법
<이클립스 디버그 방법>
1. 톰켓서버를 먼저 실행
2. 라인에 더블클릭하면 파란 동그라미 생긴다. 여기서 부터 디버그를 하겠다는 표시
3. 웹어플사이트에 액션을 수행하면 창이 뜨고 확인 누르면된다.
그러면 디버그 모드로 간다
4. F6은 한줄씩디버그 하기
오른쪽 위에 variable 과 병행하면서 코드를 본다.
5. F5는 안에 있는 메소드로 들어가고 싶을때 사용.
그리고 들어가면 다시 F6으로 한줄씩 디버깅체크
6. F7은 중도에 다시 돌아가고 싶을 때
F8은 한번에 검사하고 싶은곳을 같이 보고싶을 때
7. 한가지 변수에만 검사하고싶다.
블럭해서 오른쪽 마우스클릭 후 watch 선택
--------------------------------------------
<이클립스 자주쓰는 단축키 및 기술>
Code Assist : Ctrl + Space (자동으로 이클립스 코드 보여주는 기능)
Quick Fix : Ctrl + 1 (에러시 빨간에러표시시 Ctrl + 1 을 누르면 방법 제시)
Quick Hierarchy : Ctrl + T (계층 구조 보기)
Quick Outline : Ctrl + O (아웃라인구조 보기)
Source Code Navigation : F3, Alt + Forward
메소드를 들어가 보고싶을때(ctrl을 누르고 클릭해도가능)
Alt + Back 다시 돌아갈때
Line move : Ctrl + L (라인 이동)
Mark Occurrences : 형광등 기능. 관련된 것에 같은색으로 표시됨.
Search : Ctrl + F (소스내 검색기능)
Ctrl + H (파일이나 자바나 플러그인 등 검색시)
Comment : Ctrl + / (블럭 지정하여 자동으로 주석 처리하기)
Import! : Ctrl + Shift + O (import! 에러시 필요한 정보를 제시하여준다)
참고 사이트 : http://cafe.daum.net/yunilab/2CBy/45?docid=15eBl|2CBy|45|20061030160210&q=%C0%CC%C5%AC%B8%B3%BD%BA%20%BB%E7%BF%EB%B9%E6%B9%FD&srchid=CCB15eBl|2CBy|45|20061030160210
1. 톰켓서버를 먼저 실행
2. 라인에 더블클릭하면 파란 동그라미 생긴다. 여기서 부터 디버그를 하겠다는 표시
3. 웹어플사이트에 액션을 수행하면 창이 뜨고 확인 누르면된다.
그러면 디버그 모드로 간다
4. F6은 한줄씩디버그 하기
오른쪽 위에 variable 과 병행하면서 코드를 본다.
5. F5는 안에 있는 메소드로 들어가고 싶을때 사용.
그리고 들어가면 다시 F6으로 한줄씩 디버깅체크
6. F7은 중도에 다시 돌아가고 싶을 때
F8은 한번에 검사하고 싶은곳을 같이 보고싶을 때
7. 한가지 변수에만 검사하고싶다.
블럭해서 오른쪽 마우스클릭 후 watch 선택
--------------------------------------------
<이클립스 자주쓰는 단축키 및 기술>
Code Assist : Ctrl + Space (자동으로 이클립스 코드 보여주는 기능)
Quick Fix : Ctrl + 1 (에러시 빨간에러표시시 Ctrl + 1 을 누르면 방법 제시)
Quick Hierarchy : Ctrl + T (계층 구조 보기)
Quick Outline : Ctrl + O (아웃라인구조 보기)
Source Code Navigation : F3, Alt + Forward
메소드를 들어가 보고싶을때(ctrl을 누르고 클릭해도가능)
Alt + Back 다시 돌아갈때
Line move : Ctrl + L (라인 이동)
Mark Occurrences : 형광등 기능. 관련된 것에 같은색으로 표시됨.
Search : Ctrl + F (소스내 검색기능)
Ctrl + H (파일이나 자바나 플러그인 등 검색시)
Comment : Ctrl + / (블럭 지정하여 자동으로 주석 처리하기)
Import! : Ctrl + Shift + O (import! 에러시 필요한 정보를 제시하여준다)
참고 사이트 : http://cafe.daum.net/yunilab/2CBy/45?docid=15eBl|2CBy|45|20061030160210&q=%C0%CC%C5%AC%B8%B3%BD%BA%20%BB%E7%BF%EB%B9%E6%B9%FD&srchid=CCB15eBl|2CBy|45|20061030160210
2008년 9월 1일 월요일
세부 - 유명한 식당과 장소. [출처] 세부 - 유명한 식당과 장소
< 식당 >
■ 까오나 Grill - 아얄라 몰 앞에 있는 그릴집, 전체적인 맛이 다른 그릴집보다 나은듯
그리고 특히 갈릭 라이스가 다른곳보다 좀 맛있다. 주문은 셀프로 한다는게 특징.
■ 망고 Grill - 그냥 평범한 그릴집이다. 솔직히 그릴집은 맛이 다 비슷비슷하다.
불에 굽는게 뭐 얼마나 틀릴까, CPILS에서 가장 가까운 그릴집. CPILS 학생증 보여주면
5% 디스카운트 해 줌.
■ Neo Neo - 역시나 그릴집, 여기도 갈릭라이스 맛이 괜찮은듯.
■ City Grill - 로빈슨 몰 근처의 그릴집, 24시간 동안 영업하는게 특징.
■ Sun flower앞의 그릴집 - 이름 어려워서 기억 못하겠다. 어쨌든 여기는 음식이 좀
빨리나오는듯. 이 나라에서 뭐 주문하면 정말 늦게 나오는데 그 중 이 집이 제일 빨리
나왔는듯, 맛도 괜찮음.
■ Casa verde - 외부기숙사(Diplomat hotel)에서 아주 가깝다. 걸어서 3분 거리. 그릴집은
아니고 식당인데 값도 적당하고 baby back rips이 아주 유명한 식당,
다른건 별로 맛있는지 모르겠더라. 그러나 백립은 맛있다.
분위기도 괜찮고...사람들이 아주 많이 가는 장소중 하나
■ Heaven - Sarrosa 맞나 어쨌든 사로사 호텔 근처에 있는 한국 식당. 택시기사가 잘 모르면 저 호텔로 가자고 해서 차타고 조금만 더 가면 된다. 삼겹살 팔아서 사람들이 삽겹살에
소주 한잔하러 많이 간다. 괜찮다. But 한국 같은 좋은 삽겹살은 아니겠지? 필리핀에서
너무 좋은걸 기대하진 말길
■ 유희정(한국식당) - 안 가봤다. 그러나 한국식당이란다. 헤븐보단 크단다.
■ Winter sonata(한국식당) - 역시나 못 가봤다. 한국음식 비싸기만 하고 한국맛도 안
난다는 말에 한국식당은 기피한터라....
■ Gooda good - 이것저것 많이 파는 술집인데 뭐 그릴집 비슷하다. 여기 장점은 역시
24시간 동안 영업 한다는건데 새벽 3시 이후에는 다른걸로 유명하다.
■ Fulip - Asia town 이름하여 The villige에 있는 한국술집. 비싸기만 하고 좋은지 모르겠다.
그러나 많은 CPILS 학생들이 자주 찾는곳. 바깥 테라스 같은 곳에 앉아 있으면 바람불어서
좋긴 하더라.
■ Majestic - 필리핀에서 유명한 음식점인듯, 아주 많다. 대형 쇼핑몰에도 다 있고 여러
곳에 있다. 필리핀 전통음식도 판다는데 그건 못 먹어봤고 맛은 그럭저럭 쓸만하다.
메뉴는 무지 많은데 뭘 알아야 시키지;; 그러나 좀 비싼 레스토랑. 가격대비 성능은 별로.
■ Tops 근처의 이슬라 - 난 못 가봤는데 Sea food 파는 곳이란다. 물론 좀 비싸겠지?
씨푸드는 막탄 아일랜드 쪽에 맛있는 곳이 많다는 애기도 들은듯....
■ SM 몰의 사이사키 - 일식부페, 밑에 글 참조
■ Greenwich - 피자집, 이게 이 나라 상표인지 외국상표인지 모르겠지만 맛있다. 여기
피자헛의 피자맛보단 나은듯, 여기 피자헛은 좀 짜고 역시나 한국의 맛이랑은 다르니까.
■ Jollibee - 이 나라의 롯데리아라고 애기하면 되겠다.
아주 많이 있고 대중적이다. 맛도 뭐 그럭저럭 햄버거맛? ㅋㅋ
식당은 대체적으로 대형몰에 가면 엄청나게 많다. 밖에서 보고 먹고 싶은데 있으면 아무데나 들어가면 된다. 물론 몰안에 있는 것들은 밖에 있는 식당들보다 전반적으로 비싸다.
비싸도 맛이 있으면 상관없지만 꼭 비싸다고 맛있는건 아니니 문제다.
알아서 잘 택하는 수밖에......
< 대형 몰 >
■ SM mall, Ayala mall - CPILS 학생들의 일상적으로 가는 쇼핑몰, 없는게 거의 없다.
옷, 식당, 영화, 환전, 잡화, 다 여기에 있다. 개인적으론 아얄라가 좀 더 정이 간다.
구조가 방사형이라서 ㅋㅋ SM은 일직선으로 만들어 놓고 너무 커서 조금만
돌아다니면 쉽게 피곤해진다.
< 클럽 >
■ Sun flower(night club) - 한국인이 사장이라는 이야기가 있다. 루머인지 모르겠지만
어쨌든 한국 나이트 비슷하게 생겼다. 밴드가 음악을 연주한다는게 좀 이상하긴 하지만 후후.
■ Halo(in SM, club) - 여기는 말 그래도 클럽, 선플라워보다 어린 애들이 많이 오는듯
그리고 한국의 클럽이랑 가장 비슷한 분위기인듯? 크기는 그렇게 넓진 않고 조그만데 주말
피크 타임이면 발 디딜틈이 없다. 미쳐;; 이 나라는 어디가나 게이도 많으니 여자가 먼저
말건다고 좋아하지 말길.
■ The villige안의 이름 모르겠는 그 클럽 - 안 가봤는데 여기보다 헤일로가 났다고
혹자는 애기했음.
< 마사지 >
■ Sogo massage - 소고 호텔 근처의 마사지, 유명한 편이라 사람들이 많이 간다.
■ Ton Ton massage - 로빈슨 몰 앞의 마사지. 깨끗한 분위기. 괜찮다.
■ 3K massage - 역시나 로빈슨 몰 근처, 톤톤과 라이벌 정도의 관계인듯. 3곳중 가장 최근에 만들어진듯, 시설은 가장 깨끗하다.
소고나 톤톤이나 3K나 다 기본적으로 Thai 마사지라 비슷하긴 한데 각 샵마다 약간의 다른
특징이 있다. 소고는 발꿈치를 많이 쓰는 반면에 다른 곳은 안 그렇다던가 하는 뭐 그런
약간의 차이점. 어느 마사지가 더 좋은지는 직접 가보고 느껴보는 수밖에 없다.
가격은 3곳 모두 전신마사지 150p
■ Touch and Heal - 디플로멧 호텔 근처의 마사지, 여기는 타이 마사지가 아니라 손으로
하는 마사지다. 위에 3곳과 약간 방식이 틀리다. 전신마사지 250p로 기억한다.
■ Body and sore - 터치 앤 힐 옆에 있다. 가격은 터치 앤 힐과 동일하고 방식은 안가봐서
모르겠다. 가 본 사람이 괜찮다고 했는거 같기도 하다.
■ Waterfront hotel massage - 시설은 당연 최고이고 전신 450p라고 들었다. 가기전에
한 번 가볼려 했지만 이젠 그 돈도 없어서 못 갈꺼 같다;; 아무튼 스파도 있고 워터프론트
호텔안에 있어서 좋긴 좋단다. 팁 많이 안 주면 욕 먹는다니 주의!! ㅋ
< 기타 장소들 >
■ Join us internet cafe - 로빈슨 몰 근처다. 세부 doctor hospital 앞으로 가자고 하면 된다.
그 맞은편에 있다. 한국사람이 주인인 한국 게임방. 그러나 게임된다는게 유일한 장점이다.
속도는 그렇게 빠르지 않다.
■ Kart Zone - 사로사 호텔 근처에 있다고 한다. 안가봤다. 조그만 카트 타는곳이라는데
트랙 5바퀴에 125p였나 그 정도였다는걸로 기억. 50km가 한계인데 카트가 작아서 달리면
속도감은 나긴 한단다. 별로라는 사람도 있고 좋다는 사람도 있고 그렇다. 내가 안가봐서
뭐라고 말할수가 없다.
07.4.08 수정. 필리핀에서의 추억이 떠오르는군 ㅋㅋ
[출처] 세부 - 유명한 식당과 장소.|작성자 항상겨울
http://blog.naver.com/taxten?Redirect=Log&logNo=20011671896 에서 퍼왔슴다.
만일 문제가 된다면 바로 삭제 하겠습니다.
■ 까오나 Grill - 아얄라 몰 앞에 있는 그릴집, 전체적인 맛이 다른 그릴집보다 나은듯
그리고 특히 갈릭 라이스가 다른곳보다 좀 맛있다. 주문은 셀프로 한다는게 특징.
■ 망고 Grill - 그냥 평범한 그릴집이다. 솔직히 그릴집은 맛이 다 비슷비슷하다.
불에 굽는게 뭐 얼마나 틀릴까, CPILS에서 가장 가까운 그릴집. CPILS 학생증 보여주면
5% 디스카운트 해 줌.
■ Neo Neo - 역시나 그릴집, 여기도 갈릭라이스 맛이 괜찮은듯.
■ City Grill - 로빈슨 몰 근처의 그릴집, 24시간 동안 영업하는게 특징.
■ Sun flower앞의 그릴집 - 이름 어려워서 기억 못하겠다. 어쨌든 여기는 음식이 좀
빨리나오는듯. 이 나라에서 뭐 주문하면 정말 늦게 나오는데 그 중 이 집이 제일 빨리
나왔는듯, 맛도 괜찮음.
■ Casa verde - 외부기숙사(Diplomat hotel)에서 아주 가깝다. 걸어서 3분 거리. 그릴집은
아니고 식당인데 값도 적당하고 baby back rips이 아주 유명한 식당,
다른건 별로 맛있는지 모르겠더라. 그러나 백립은 맛있다.
분위기도 괜찮고...사람들이 아주 많이 가는 장소중 하나
■ Heaven - Sarrosa 맞나 어쨌든 사로사 호텔 근처에 있는 한국 식당. 택시기사가 잘 모르면 저 호텔로 가자고 해서 차타고 조금만 더 가면 된다. 삼겹살 팔아서 사람들이 삽겹살에
소주 한잔하러 많이 간다. 괜찮다. But 한국 같은 좋은 삽겹살은 아니겠지? 필리핀에서
너무 좋은걸 기대하진 말길
■ 유희정(한국식당) - 안 가봤다. 그러나 한국식당이란다. 헤븐보단 크단다.
■ Winter sonata(한국식당) - 역시나 못 가봤다. 한국음식 비싸기만 하고 한국맛도 안
난다는 말에 한국식당은 기피한터라....
■ Gooda good - 이것저것 많이 파는 술집인데 뭐 그릴집 비슷하다. 여기 장점은 역시
24시간 동안 영업 한다는건데 새벽 3시 이후에는 다른걸로 유명하다.
■ Fulip - Asia town 이름하여 The villige에 있는 한국술집. 비싸기만 하고 좋은지 모르겠다.
그러나 많은 CPILS 학생들이 자주 찾는곳. 바깥 테라스 같은 곳에 앉아 있으면 바람불어서
좋긴 하더라.
■ Majestic - 필리핀에서 유명한 음식점인듯, 아주 많다. 대형 쇼핑몰에도 다 있고 여러
곳에 있다. 필리핀 전통음식도 판다는데 그건 못 먹어봤고 맛은 그럭저럭 쓸만하다.
메뉴는 무지 많은데 뭘 알아야 시키지;; 그러나 좀 비싼 레스토랑. 가격대비 성능은 별로.
■ Tops 근처의 이슬라 - 난 못 가봤는데 Sea food 파는 곳이란다. 물론 좀 비싸겠지?
씨푸드는 막탄 아일랜드 쪽에 맛있는 곳이 많다는 애기도 들은듯....
■ SM 몰의 사이사키 - 일식부페, 밑에 글 참조
■ Greenwich - 피자집, 이게 이 나라 상표인지 외국상표인지 모르겠지만 맛있다. 여기
피자헛의 피자맛보단 나은듯, 여기 피자헛은 좀 짜고 역시나 한국의 맛이랑은 다르니까.
■ Jollibee - 이 나라의 롯데리아라고 애기하면 되겠다.
아주 많이 있고 대중적이다. 맛도 뭐 그럭저럭 햄버거맛? ㅋㅋ
식당은 대체적으로 대형몰에 가면 엄청나게 많다. 밖에서 보고 먹고 싶은데 있으면 아무데나 들어가면 된다. 물론 몰안에 있는 것들은 밖에 있는 식당들보다 전반적으로 비싸다.
비싸도 맛이 있으면 상관없지만 꼭 비싸다고 맛있는건 아니니 문제다.
알아서 잘 택하는 수밖에......
< 대형 몰 >
■ SM mall, Ayala mall - CPILS 학생들의 일상적으로 가는 쇼핑몰, 없는게 거의 없다.
옷, 식당, 영화, 환전, 잡화, 다 여기에 있다. 개인적으론 아얄라가 좀 더 정이 간다.
구조가 방사형이라서 ㅋㅋ SM은 일직선으로 만들어 놓고 너무 커서 조금만
돌아다니면 쉽게 피곤해진다.
< 클럽 >
■ Sun flower(night club) - 한국인이 사장이라는 이야기가 있다. 루머인지 모르겠지만
어쨌든 한국 나이트 비슷하게 생겼다. 밴드가 음악을 연주한다는게 좀 이상하긴 하지만 후후.
■ Halo(in SM, club) - 여기는 말 그래도 클럽, 선플라워보다 어린 애들이 많이 오는듯
그리고 한국의 클럽이랑 가장 비슷한 분위기인듯? 크기는 그렇게 넓진 않고 조그만데 주말
피크 타임이면 발 디딜틈이 없다. 미쳐;; 이 나라는 어디가나 게이도 많으니 여자가 먼저
말건다고 좋아하지 말길.
■ The villige안의 이름 모르겠는 그 클럽 - 안 가봤는데 여기보다 헤일로가 났다고
혹자는 애기했음.
< 마사지 >
■ Sogo massage - 소고 호텔 근처의 마사지, 유명한 편이라 사람들이 많이 간다.
■ Ton Ton massage - 로빈슨 몰 앞의 마사지. 깨끗한 분위기. 괜찮다.
■ 3K massage - 역시나 로빈슨 몰 근처, 톤톤과 라이벌 정도의 관계인듯. 3곳중 가장 최근에 만들어진듯, 시설은 가장 깨끗하다.
소고나 톤톤이나 3K나 다 기본적으로 Thai 마사지라 비슷하긴 한데 각 샵마다 약간의 다른
특징이 있다. 소고는 발꿈치를 많이 쓰는 반면에 다른 곳은 안 그렇다던가 하는 뭐 그런
약간의 차이점. 어느 마사지가 더 좋은지는 직접 가보고 느껴보는 수밖에 없다.
가격은 3곳 모두 전신마사지 150p
■ Touch and Heal - 디플로멧 호텔 근처의 마사지, 여기는 타이 마사지가 아니라 손으로
하는 마사지다. 위에 3곳과 약간 방식이 틀리다. 전신마사지 250p로 기억한다.
■ Body and sore - 터치 앤 힐 옆에 있다. 가격은 터치 앤 힐과 동일하고 방식은 안가봐서
모르겠다. 가 본 사람이 괜찮다고 했는거 같기도 하다.
■ Waterfront hotel massage - 시설은 당연 최고이고 전신 450p라고 들었다. 가기전에
한 번 가볼려 했지만 이젠 그 돈도 없어서 못 갈꺼 같다;; 아무튼 스파도 있고 워터프론트
호텔안에 있어서 좋긴 좋단다. 팁 많이 안 주면 욕 먹는다니 주의!! ㅋ
< 기타 장소들 >
■ Join us internet cafe - 로빈슨 몰 근처다. 세부 doctor hospital 앞으로 가자고 하면 된다.
그 맞은편에 있다. 한국사람이 주인인 한국 게임방. 그러나 게임된다는게 유일한 장점이다.
속도는 그렇게 빠르지 않다.
■ Kart Zone - 사로사 호텔 근처에 있다고 한다. 안가봤다. 조그만 카트 타는곳이라는데
트랙 5바퀴에 125p였나 그 정도였다는걸로 기억. 50km가 한계인데 카트가 작아서 달리면
속도감은 나긴 한단다. 별로라는 사람도 있고 좋다는 사람도 있고 그렇다. 내가 안가봐서
뭐라고 말할수가 없다.
07.4.08 수정. 필리핀에서의 추억이 떠오르는군 ㅋㅋ
[출처] 세부 - 유명한 식당과 장소.|작성자 항상겨울
http://blog.naver.com/taxten?Redirect=Log&logNo=20011671896 에서 퍼왔슴다.
만일 문제가 된다면 바로 삭제 하겠습니다.
2008년 8월 22일 금요일
eclipse에서 debuging 하기
eclipse에서 debuging 하기
참조 사이트 : http://kydol37.tistory.com/entry/toolseclipse-eclipse%EC%97%90%EC%84%9C-debuging-%ED%95%98%EA%B8%B0
참조 사이트 : http://kydol37.tistory.com/entry/toolseclipse-eclipse%EC%97%90%EC%84%9C-debuging-%ED%95%98%EA%B8%B0
Eclipse 3.4 + WTP + Spring IDE + Spring Tool Suite 설치하기
Eclipse 3.4 + WTP + Spring IDE + Spring Tool Suite 설치하기
참조 사이트 : http://whiteship.me/1728?srchid=BR1http%3A%2F%2Fwhiteship.me%2F1728
참조 사이트 : http://whiteship.me/1728?srchid=BR1http%3A%2F%2Fwhiteship.me%2F1728
2008년 8월 21일 목요일
에고테스트
에고그램 ? : 에고그램은 미국의 심리학자 J.M.듀세이가 고안한 성격분석 표지법이다. 듀세이는 복잡한 사람의 성격을 5가지 영역으로 구분하여 쉽게 분석할 수 있도록 표준화하였다. 그 기초는 미국의 정신분석학자 에릭 반이 개발한 교류분석법(TA)을 바탕으로 하고 있는데 TA는 5가지 마음 중 어느 부분이 자신에게 영향을 끼치는지에 따라 사고방식이나 행동이 달라진다고 규정하고 있다. 5가지 마음은 비판적인 마음 CP, 용서하는 마음 NP, 부모의 마음 A, 자유로운 어린이의 마음 FC, 순응하는 마음 AC이다. 이 다섯가지 마음의 비율이 개인의 성격을 결정한다고 한다.
참조 사이트 : http://byule.com/board/?mid=ego
참조 사이트 : http://byule.com/board/?mid=ego
2008년 8월 20일 수요일
시제, 수동/능동, 의문/부정 정리
현재
* He watches TV every night.
*
TV is watched by him every night.
그는 매일 밤 TV 를 본다.
* Does he watch TV every night?
*
Is TV watched by him every night?
그는 매일 밤 TV 보니?
* He doesn't watch TV every night.
*
TV isn't watched by him every night.
그는 매일밤 TV 를 보지 않는다.
현재진행 - UNIT8
* He is watching TV now.
*
TV is being watched by him now.
그는 지금 TV 를 보고 있다.
* Is He watching TV now?
*
Is TV being watched by him now?
그는 지금 TV 를 보고 있니?
* He is not watching TV now.
*
TV is not being watched by him now.
그는 지금 TV 를 보고 있지 않다.
과거 - UNIT11, 12
* He watched TV last night.
*
TV was watched by him last night.
그는 어젯 밤 TV 를 봤다.
* Did he watch TV last night?
*
Was TV watched by him last night?
그는 어젯 밤 TV 를 봤니?
* He didn't watch TV last night.
*
TV wasn't watched by him last night.
그는 어젯 밤 TV 를 안 봤다.
과거진행 - UNIT13
* He was watching TV last night.
*
TV was being watched by him last night.
그는 어젯밤 TV 를 보고 있었다.
* Was he watching TV last night?
*
Was TV being watched by him last night?
그는 어젯밤 TV 를 보고 있었니?
* He was not watching TV last night.
*
TV was not being watched by him last night.
그는 어젯밤 TV 를 보고 있지 않았다.
현재완료 - UNIT19
* He has just watched TV.
*
TV has just been watched by him.
그는 지금 막 TV 를 봤었다.
* Has he just watched TV?
*
Has TV just been watched by him?
그는 지금 막 TV 를 봤었니?
* He has not just watched TV.
*
TV has not just been watched by him.
그는 지금 막 TV 를 보지 않았다.
기타
*
He used to work in factory. - UNIT15
그는 공장에서 일했었다. (지금은 공장에서 일하지 않는다)
*
Has he ever worked in factory? - UNIT16
그는 공장에서 일한 적 있니? (과거부터 지금까지 통틀어서)
*
How long has he worked in factory? - UNIT17
그는 얼마나 오랫동안 공장에서 일하고 있니?
*
He has been watching TV for 3 hours.
그는 세시간째 TV 를 보고 있다.
*
He is watching TV this night. - UNIT26
그는 TV 를 볼꺼다. (가까운 미래에 계획까지 다 잡아놓은 상태)
*
He is going to watch TV. - UNI27
그는 TV 를 볼꺼다. (이미 본인이 맘 먹은 상태, 계획은 없음)
*
He will watch TV. - UNIT28
그는 TV 를 볼꺼다. (불확실한 미래, 보려고 하겠지만 안 볼 수도 있음)
*
He might watch TV.
그는 아마도 TV 를 볼꺼다. (불확실한 추측, 가능성)
*
He can watch TV.
그는 TV 를 볼 수 있다.
*
He could watch TV.
그는 TV 를 볼 수 있었다.
*
He must watch TV.
그는 TV 를 꼭 봐야하고 볼 수 밖에 없다. (강제성을 띈 의무, 어쩔 수 없는 것)
*
He should watch TV.
그는 TV 를 보는 것이 좋겠다. (강제성이 없음)
*
He has to watch TV.
그는 TV 를 봐야한다. (구어체에서는 must 보다 많이 쓰임)
참조 사이트 : http://hoooriza.springnote.com/pages/1421070
* He watches TV every night.
*
TV is watched by him every night.
그는 매일 밤 TV 를 본다.
* Does he watch TV every night?
*
Is TV watched by him every night?
그는 매일 밤 TV 보니?
* He doesn't watch TV every night.
*
TV isn't watched by him every night.
그는 매일밤 TV 를 보지 않는다.
현재진행 - UNIT8
* He is watching TV now.
*
TV is being watched by him now.
그는 지금 TV 를 보고 있다.
* Is He watching TV now?
*
Is TV being watched by him now?
그는 지금 TV 를 보고 있니?
* He is not watching TV now.
*
TV is not being watched by him now.
그는 지금 TV 를 보고 있지 않다.
과거 - UNIT11, 12
* He watched TV last night.
*
TV was watched by him last night.
그는 어젯 밤 TV 를 봤다.
* Did he watch TV last night?
*
Was TV watched by him last night?
그는 어젯 밤 TV 를 봤니?
* He didn't watch TV last night.
*
TV wasn't watched by him last night.
그는 어젯 밤 TV 를 안 봤다.
과거진행 - UNIT13
* He was watching TV last night.
*
TV was being watched by him last night.
그는 어젯밤 TV 를 보고 있었다.
* Was he watching TV last night?
*
Was TV being watched by him last night?
그는 어젯밤 TV 를 보고 있었니?
* He was not watching TV last night.
*
TV was not being watched by him last night.
그는 어젯밤 TV 를 보고 있지 않았다.
현재완료 - UNIT19
* He has just watched TV.
*
TV has just been watched by him.
그는 지금 막 TV 를 봤었다.
* Has he just watched TV?
*
Has TV just been watched by him?
그는 지금 막 TV 를 봤었니?
* He has not just watched TV.
*
TV has not just been watched by him.
그는 지금 막 TV 를 보지 않았다.
기타
*
He used to work in factory. - UNIT15
그는 공장에서 일했었다. (지금은 공장에서 일하지 않는다)
*
Has he ever worked in factory? - UNIT16
그는 공장에서 일한 적 있니? (과거부터 지금까지 통틀어서)
*
How long has he worked in factory? - UNIT17
그는 얼마나 오랫동안 공장에서 일하고 있니?
*
He has been watching TV for 3 hours.
그는 세시간째 TV 를 보고 있다.
*
He is watching TV this night. - UNIT26
그는 TV 를 볼꺼다. (가까운 미래에 계획까지 다 잡아놓은 상태)
*
He is going to watch TV. - UNI27
그는 TV 를 볼꺼다. (이미 본인이 맘 먹은 상태, 계획은 없음)
*
He will watch TV. - UNIT28
그는 TV 를 볼꺼다. (불확실한 미래, 보려고 하겠지만 안 볼 수도 있음)
*
He might watch TV.
그는 아마도 TV 를 볼꺼다. (불확실한 추측, 가능성)
*
He can watch TV.
그는 TV 를 볼 수 있다.
*
He could watch TV.
그는 TV 를 볼 수 있었다.
*
He must watch TV.
그는 TV 를 꼭 봐야하고 볼 수 밖에 없다. (강제성을 띈 의무, 어쩔 수 없는 것)
*
He should watch TV.
그는 TV 를 보는 것이 좋겠다. (강제성이 없음)
*
He has to watch TV.
그는 TV 를 봐야한다. (구어체에서는 must 보다 많이 쓰임)
참조 사이트 : http://hoooriza.springnote.com/pages/1421070
Basic Grammar is Use
UNIT 1 - am/is/are
* Thank you, That's very kind of you.
UNIT 2 - am/is/are
*
7개의 의문문
Where, What, Who, How, Why, Which, When
UNIT 3 - I am doing
* ~ing 형으로 바꿀때 규칙
단어의 마지막 두글자가 [모음][자음] 형태이고 그 바로 앞이 [모음] 이 아니면 무조건 마지막 자음 반복
run -> running
sit ->sitting
swim -> swimming
* die(죽다) -> dying, dye(염색하다) -> dying 이니까 바뀐담에 헷갈리지 말기
Quiz
*
그는 나의 첫 사랑이다
He is my first love
*
너는 왜 그렇게 못 됐니?
Why are you so mean?
*
그녀는 뛰는 중이니, 아님 걷는 거니?
Is she running or walking?
UNIT5 - I do, I work, I like, etc.
* on weekends : 주말마다
*
always, never, often, sometimes, usually 의 위치
be, 조동사 + always
always + 일반동사 : We often sleep late on weekends
*
y 로 끝나는 동사를 3인칭 형으로 바꾸기
자음+y 로 끝나는 것만 ies 로 바꾼다
stay -> stays, fly -> flies
UNIT8 - I am doing and I do
*
~ing 형이 될 수 없는 동사
like, love, want, know, understand, remember, depend, prefer, hate, need, mean, believe, forget
*
지각동사
see : 보다 / looking / seeing : 사귀다
hear : 듣다 / listening
taste : 맛이~이다 / tasting : 맛을 보다
feel : 느끼다 / How are you feeling today?
*
예문
Jim is watching television.
I don't understand. (잘못된 예 : I'm not understanding)
UNIT9 - I have.. and I've got
* I have = I've got
* I don't have = I haven't got
* Do you have..? = Have you got..?
*
예문
I've got blue eyes.
We haven't got much time.
UNIT10 - was/were
UNIT11 - worked, got, went, etc
* They watched television last night.
UNIT20 - just, already, yet
* They have just arrived.
* They have already arrived.
* They have not arrived yet.
*
They did not arrive yet.
UNIT26 - What are you doing tommorow?
*
가까운 미래면서 계획이 잡혀있고 마음 먹었을때
He is playing tennis tommorow.
*
단 스케쥴 대로 진행되는 상황은 그냥 현재형 사용
The plane arrives at 7:30 tommorow morning.
What time does the movie start?
UNIT27 - I'm going to
*
이미 하기로 마음 먹은 상태, 단 계획은 없음
I'm going to watch TV tonight.
*
일어날 것이 뻔한 상황
It's going to rain. (근처에 먹구름이 무지 있을때)
I'm going to be late. (이미 늦잠을 자버려서 늦을 게 뻔할 때)
UNIT28 - Will
*
일반적인 미래, 불확실한 미래
Don't drink coffee. you will not sleep.
*
I think.. will..
I think Diana will pass her drivers' test.
*
이미 예정되어 있거나 결정된 사항에 대해서는 will 을 쓰지 말 것
We will go to the movies on Saturday (x)
Will you cook dinner tonight? (x)
UNIT29 - Will
*
제안할 때
I'll carry it for you.
*
Shall I/We
정중하게 제안할 때 (주어는 I 와 We 만 가능)
참조 사이트 : http://hoooriza.springnote.com/pages/1274698?print=1
* Thank you, That's very kind of you.
UNIT 2 - am/is/are
*
7개의 의문문
Where, What, Who, How, Why, Which, When
UNIT 3 - I am doing
* ~ing 형으로 바꿀때 규칙
단어의 마지막 두글자가 [모음][자음] 형태이고 그 바로 앞이 [모음] 이 아니면 무조건 마지막 자음 반복
run -> running
sit ->sitting
swim -> swimming
* die(죽다) -> dying, dye(염색하다) -> dying 이니까 바뀐담에 헷갈리지 말기
Quiz
*
그는 나의 첫 사랑이다
He is my first love
*
너는 왜 그렇게 못 됐니?
Why are you so mean?
*
그녀는 뛰는 중이니, 아님 걷는 거니?
Is she running or walking?
UNIT5 - I do, I work, I like, etc.
* on weekends : 주말마다
*
always, never, often, sometimes, usually 의 위치
be, 조동사 + always
always + 일반동사 : We often sleep late on weekends
*
y 로 끝나는 동사를 3인칭 형으로 바꾸기
자음+y 로 끝나는 것만 ies 로 바꾼다
stay -> stays, fly -> flies
UNIT8 - I am doing and I do
*
~ing 형이 될 수 없는 동사
like, love, want, know, understand, remember, depend, prefer, hate, need, mean, believe, forget
*
지각동사
see : 보다 / looking / seeing : 사귀다
hear : 듣다 / listening
taste : 맛이~이다 / tasting : 맛을 보다
feel : 느끼다 / How are you feeling today?
*
예문
Jim is watching television.
I don't understand. (잘못된 예 : I'm not understanding)
UNIT9 - I have.. and I've got
* I have = I've got
* I don't have = I haven't got
* Do you have..? = Have you got..?
*
예문
I've got blue eyes.
We haven't got much time.
UNIT10 - was/were
UNIT11 - worked, got, went, etc
* They watched television last night.
UNIT20 - just, already, yet
* They have just arrived.
* They have already arrived.
* They have not arrived yet.
*
They did not arrive yet.
UNIT26 - What are you doing tommorow?
*
가까운 미래면서 계획이 잡혀있고 마음 먹었을때
He is playing tennis tommorow.
*
단 스케쥴 대로 진행되는 상황은 그냥 현재형 사용
The plane arrives at 7:30 tommorow morning.
What time does the movie start?
UNIT27 - I'm going to
*
이미 하기로 마음 먹은 상태, 단 계획은 없음
I'm going to watch TV tonight.
*
일어날 것이 뻔한 상황
It's going to rain. (근처에 먹구름이 무지 있을때)
I'm going to be late. (이미 늦잠을 자버려서 늦을 게 뻔할 때)
UNIT28 - Will
*
일반적인 미래, 불확실한 미래
Don't drink coffee. you will not sleep.
*
I think.. will..
I think Diana will pass her drivers' test.
*
이미 예정되어 있거나 결정된 사항에 대해서는 will 을 쓰지 말 것
We will go to the movies on Saturday (x)
Will you cook dinner tonight? (x)
UNIT29 - Will
*
제안할 때
I'll carry it for you.
*
Shall I/We
정중하게 제안할 때 (주어는 I 와 We 만 가능)
참조 사이트 : http://hoooriza.springnote.com/pages/1274698?print=1
2008년 8월 18일 월요일
HWP 파일 다운로드시 저장하고 보면 잘 되지만 열기 했을 경우 안될때...
JSP/Servlet 환경에서 다운로드를 사용할 경우는
아래와 같은 순서를 가진다.
1. HttpServletResponse 로 부터 OutStream 을 얻는다.
2. Header, ContentsType 등을 설정한다.
3. FileStream 을 통해 전송될 파일의 스트림을 얻는다.
4. Response 로 부터 얻은 outputStream 에 파일을 쏜다.
5. 열려진 모든 자원을 닫는다.
뭐 다른것들은 괜찮지만 2번 항목에서 환경에 따라 헤더 설정이 틀려진다.
단독 WAS 환경인지, WAS 앞에 Apache 나 IIS 가 있는지 등등..
웬만한 부분에서는 아래와 같은 Header 설정이면 충분하다.
res.setContentType("appliction/octet-stream");
res.setHeader("Accept-Ranges","bytes");
res.setHeader("Content-Transfer-Encoding", "binary;");
res.setHeader("Pragma", "no-cache;");
res.setHeader("Expires", "-1;");
res.setHeader("Content-Disposition", "attachment; filename=" + fileName + ";");
문제는 위 설정으로 zip 파일이나, 다른 파일들은 저장, 열기가 잘 되지만 유독 HWP 파일에서 문제가 생긴다.
다운로드 창까지는 잘 뜨는데, 열기 버튼을 누르면 파일을 찾을 수 없다고 나온다.
저장해서 보면 잘 보이지만 ㅎㅎ
여차저차 해서 헤더에 아래와 같이 추가해줬다.
res.setHeader("Cache-control","private");
잘 된다 ^^
캐시 컨트롤을 private 으로 하겠다는 의미는 전송되는 개체가 공유 캐시에 보관되지 않고 특정 클라이언트만을 대상으로 해야 한다는 말이다.
참조 사이트 : http://www.javarush.com/tag/hwp%20%ED%8C%8C%EC%9D%BC%20%EC%97%B4%EA%B8%B0
아래와 같은 순서를 가진다.
1. HttpServletResponse 로 부터 OutStream 을 얻는다.
2. Header, ContentsType 등을 설정한다.
3. FileStream 을 통해 전송될 파일의 스트림을 얻는다.
4. Response 로 부터 얻은 outputStream 에 파일을 쏜다.
5. 열려진 모든 자원을 닫는다.
뭐 다른것들은 괜찮지만 2번 항목에서 환경에 따라 헤더 설정이 틀려진다.
단독 WAS 환경인지, WAS 앞에 Apache 나 IIS 가 있는지 등등..
웬만한 부분에서는 아래와 같은 Header 설정이면 충분하다.
res.setContentType("appliction/octet-stream");
res.setHeader("Accept-Ranges","bytes");
res.setHeader("Content-Transfer-Encoding", "binary;");
res.setHeader("Pragma", "no-cache;");
res.setHeader("Expires", "-1;");
res.setHeader("Content-Disposition", "attachment; filename=" + fileName + ";");
문제는 위 설정으로 zip 파일이나, 다른 파일들은 저장, 열기가 잘 되지만 유독 HWP 파일에서 문제가 생긴다.
다운로드 창까지는 잘 뜨는데, 열기 버튼을 누르면 파일을 찾을 수 없다고 나온다.
저장해서 보면 잘 보이지만 ㅎㅎ
여차저차 해서 헤더에 아래와 같이 추가해줬다.
res.setHeader("Cache-control","private");
잘 된다 ^^
캐시 컨트롤을 private 으로 하겠다는 의미는 전송되는 개체가 공유 캐시에 보관되지 않고 특정 클라이언트만을 대상으로 해야 한다는 말이다.
참조 사이트 : http://www.javarush.com/tag/hwp%20%ED%8C%8C%EC%9D%BC%20%EC%97%B4%EA%B8%B0
JAVA 에서 ORACLE의 CLOB 타입 사용하기
JAVA 에서 ORACLE의 CLOB 타입 사용하기
INSERT시
1. CLOB 타입인 필드의 기본값을 empty_clob() 로 설정합니다.
2. setAutoCommit(false) 를 선언한다.
3. CLOB 타입 필드를 제외한 나머지 필드에 데이터를 저장한다.
4. CLOB 타입 필드에 데이터를 넣는 동안 다른 변경 작업을 막기 위해 LOCK을 건다.
5. CLOB 타입 필드에 데이터를 넣는다.
6. Commit() 한다.
7. setAutoCommit(true) 를 선언한다.
예제 소스 코드
import! java.io.*;
import! java.net.*;
import! java.sql.*;
import! oracle.sql.*;
import! oracle.jdbc.driver.*;
public class ClobTest {
public static void main(String[] argv) {
String drv = "oracle.jdbc.driver.OracleDriver";
String dburl = "jdbc:oracle:thin:@192.168.3.30:1521:GRDB21";
String user = "scott";
String password = "tiger";
Connection conn = null;
Statement st;
ResultSet rs;
try {
Class.forName(drv);
System.out.println("Drive Loading...");
conn = DriverManager.getConnection(dburl, user, password);
System.out.println("Connecting...");
st = conn.createStatement();
// 입력할 텍스트 만들기
StringBuffer sb = new StringBuffer();
String clobTest = "한글 테스트입니다
It is difficult
";
for (int i = 0; i < 300; i++)
sb.append(clobTest);
// 1. CLOB 데이터 입력하기 위해, empty_clob() 생성
try {
st.executeUpdate("insert into test_clob values (''02'', empty_clob())");
} catch (Exception ee) {
ee.printStackTrace(System.out);
}
// 2. setAutoCommit을 false로 꼭 해야 한다.
conn.setAutoCommit(false);
// 3. CLOB column에 대한 lock을 얻는다.
rs = st.executeQuery("select desc2 from test_clob where code = ''02'' for update");
if (rs. next()) {
// 4. 오라클의 함수들을 사용하기 위해 cast 하였다.
CLOB cl = ((OracleResultSet)rs).getCLOB("desc2");
// 스트림을 이용한 값 저장
BufferedWriter writer = new BufferedWriter(cl.getCharacterOutputStream());
writer.write(sb.toString());
writer.close();
}
conn.commit();
conn.setAutoCommit(true);
// 입력한 값 읽어 오기
rs = st.executeQuery("select * from test_clob where code = ''02''");
if (rs.next()) {
String code = rs.getString("code");
// CLOB column에 대한 스트림을 얻는다.
Reader rd = rs.getCharacterStream("desc2");
sb = new StringBuffer();
char[] buf = new char[1024];
int readcnt;
while ((readcnt = rd.read(buf, 0, 1024)) != -1) {
// 스트림으로부터 읽어서 스트링 버퍼에 넣는다.
sb.append(buf, 0, readcnt);
}
rd.close();
System.out.println("code : " + code);
System.out.println("desc2 : " + sb.toString());
}
}
catch (Exception e) {
e.printStackTrace(System.out);
}
}
}
코드 출처 : http://rudaks.co.kr/bbs/view.jsp?seq=379&bbs=db&PageNo=1
UPDATE 시
기본은 Insert 와 동일하나, CLOB 필드 업데이트 전에 CLOB 필드의 내용을 모두 비워줘야 한다.
예제 소스 코드
ex) UPDATE 테이블 SET CLOB필드 = empty_clob() WHERE 조건
SELECT 시
1. CLOB 가 아닌 데이터를 모두 SELECT 한다.
2. CLOB 인 데이터를 SELECT 한다.
예제 소스 코드
--- 우선은 밑의 거 두개를 import! 합니다.
< % @ page import!="oracle.jdbc.driver.*" % >
< % @ page import!="oracle.sql.*" % >
-- clob를 불러올 query를 만든다 .(clob만 select 합니다.)
--조건은 물론 pk이겠지요.
queryclob.append(" select body from r2enjoybbs ");
queryclob.append(" where bbsid = ? ");
--- 가져오는 부분
--- body1에다가 clob의 데이타를 넣는다.
StringBuffer body1 = new StringBuffer();
pstmt2 = con.prepareStatement(queryclob.toString());
pstmt2.setInt(1,bbsid);
rs2 = pstmt2.executeQuery();
if(rs2.next())
{
Reader input = rs2.getCharacterStream(1);
char[] buffer = new char[1024];
int byteRead;
while((byteRead=input.read(buffer,0,1024))!=-1)
{
body1.append(buffer,0,byteRead);
}
input.close();
}
rs2.close();
pstmt2.close();
코드 출처 : http://database.ssarang.net/?inc=read&aid=11196&criteria=oracle&subcrit=&id=&limit=20&keyword=clob+select&page=5
참조 사이트 : http://cafe.daum.net/boilra/5ZZ3/6?docid=1vPt|5ZZ3|6|20080319085849&q=empty_clob()&srchid=CCB1vPt|5ZZ3|6|20080319085849
INSERT시
1. CLOB 타입인 필드의 기본값을 empty_clob() 로 설정합니다.
2. setAutoCommit(false) 를 선언한다.
3. CLOB 타입 필드를 제외한 나머지 필드에 데이터를 저장한다.
4. CLOB 타입 필드에 데이터를 넣는 동안 다른 변경 작업을 막기 위해 LOCK을 건다.
5. CLOB 타입 필드에 데이터를 넣는다.
6. Commit() 한다.
7. setAutoCommit(true) 를 선언한다.
예제 소스 코드
import! java.io.*;
import! java.net.*;
import! java.sql.*;
import! oracle.sql.*;
import! oracle.jdbc.driver.*;
public class ClobTest {
public static void main(String[] argv) {
String drv = "oracle.jdbc.driver.OracleDriver";
String dburl = "jdbc:oracle:thin:@192.168.3.30:1521:GRDB21";
String user = "scott";
String password = "tiger";
Connection conn = null;
Statement st;
ResultSet rs;
try {
Class.forName(drv);
System.out.println("Drive Loading...");
conn = DriverManager.getConnection(dburl, user, password);
System.out.println("Connecting...");
st = conn.createStatement();
// 입력할 텍스트 만들기
StringBuffer sb = new StringBuffer();
String clobTest = "한글 테스트입니다
It is difficult
";
for (int i = 0; i < 300; i++)
sb.append(clobTest);
// 1. CLOB 데이터 입력하기 위해, empty_clob() 생성
try {
st.executeUpdate("insert into test_clob values (''02'', empty_clob())");
} catch (Exception ee) {
ee.printStackTrace(System.out);
}
// 2. setAutoCommit을 false로 꼭 해야 한다.
conn.setAutoCommit(false);
// 3. CLOB column에 대한 lock을 얻는다.
rs = st.executeQuery("select desc2 from test_clob where code = ''02'' for update");
if (rs. next()) {
// 4. 오라클의 함수들을 사용하기 위해 cast 하였다.
CLOB cl = ((OracleResultSet)rs).getCLOB("desc2");
// 스트림을 이용한 값 저장
BufferedWriter writer = new BufferedWriter(cl.getCharacterOutputStream());
writer.write(sb.toString());
writer.close();
}
conn.commit();
conn.setAutoCommit(true);
// 입력한 값 읽어 오기
rs = st.executeQuery("select * from test_clob where code = ''02''");
if (rs.next()) {
String code = rs.getString("code");
// CLOB column에 대한 스트림을 얻는다.
Reader rd = rs.getCharacterStream("desc2");
sb = new StringBuffer();
char[] buf = new char[1024];
int readcnt;
while ((readcnt = rd.read(buf, 0, 1024)) != -1) {
// 스트림으로부터 읽어서 스트링 버퍼에 넣는다.
sb.append(buf, 0, readcnt);
}
rd.close();
System.out.println("code : " + code);
System.out.println("desc2 : " + sb.toString());
}
}
catch (Exception e) {
e.printStackTrace(System.out);
}
}
}
코드 출처 : http://rudaks.co.kr/bbs/view.jsp?seq=379&bbs=db&PageNo=1
UPDATE 시
기본은 Insert 와 동일하나, CLOB 필드 업데이트 전에 CLOB 필드의 내용을 모두 비워줘야 한다.
예제 소스 코드
ex) UPDATE 테이블 SET CLOB필드 = empty_clob() WHERE 조건
SELECT 시
1. CLOB 가 아닌 데이터를 모두 SELECT 한다.
2. CLOB 인 데이터를 SELECT 한다.
예제 소스 코드
--- 우선은 밑의 거 두개를 import! 합니다.
< % @ page import!="oracle.jdbc.driver.*" % >
< % @ page import!="oracle.sql.*" % >
-- clob를 불러올 query를 만든다 .(clob만 select 합니다.)
--조건은 물론 pk이겠지요.
queryclob.append(" select body from r2enjoybbs ");
queryclob.append(" where bbsid = ? ");
--- 가져오는 부분
--- body1에다가 clob의 데이타를 넣는다.
StringBuffer body1 = new StringBuffer();
pstmt2 = con.prepareStatement(queryclob.toString());
pstmt2.setInt(1,bbsid);
rs2 = pstmt2.executeQuery();
if(rs2.next())
{
Reader input = rs2.getCharacterStream(1);
char[] buffer = new char[1024];
int byteRead;
while((byteRead=input.read(buffer,0,1024))!=-1)
{
body1.append(buffer,0,byteRead);
}
input.close();
}
rs2.close();
pstmt2.close();
코드 출처 : http://database.ssarang.net/?inc=read&aid=11196&criteria=oracle&subcrit=&id=&limit=20&keyword=clob+select&page=5
참조 사이트 : http://cafe.daum.net/boilra/5ZZ3/6?docid=1vPt|5ZZ3|6|20080319085849&q=empty_clob()&srchid=CCB1vPt|5ZZ3|6|20080319085849
iBATIS SQLMaps 활용법
* 글쓴이: 메룽_성완
*
* 조회수 : 211
*
* 07.11.02 13:08
http://cafe.daum.net/proutils/IWTE/16주소 복사
간결한 데이터 매퍼의 대명사
iBATIS SQLMaps 활용법
iBATIS SQLMaps(이하 아이바티스)는 이미 국내외 많은 개발자들이 사용하고 있는 퍼시스턴스 계층의 프레임워크이다. 실제로 국내에서 가장 크다는 포털 사이트인 네이버와 다음도 아이바티스를 사용하고 있으며, 다른 업체들도 아이바티스를 그대로 사용하거나 약간 변형시킨 형태로 사용하고 있는 것으로 알고 있다. 특집 3부에서는 아이바티스의 특징과 활용법에 대해 알아본다.
이동국 fromm0@gmail.com
과거 ORM의 대표인 하이버네이트와 데이터 매퍼인 아이바티스 간에 어느 프레임워크가 더 좋은가에 대한 논쟁도 있었을 만큼 많은 자바 개발자들은 데이터베이스에 관련된 ORM 프레임워크에 대한 관심이 크다. 이런 논쟁 가운데 아이바티스는 ORM이 아니기 때문에 논쟁의 대상이 될 수 없다는 의견도 있었다. 사용 목적이라는 관점에서 본다면 하이버네이트와 아이바티스는 논쟁의 대상이 될 수 있으나 ORM이냐 아니냐를 가름하는 관점에서 본다면, 역시 아이바티스는 ORM이 아니라고 할 수 있다.
ORM과 데이터 매핑
아이바티스의 핵심 개발자인 래리 메도스(Larry Meadors)는 다음처럼 ORM과 데이터 매퍼를 구분한다.
ORM = 데이터베이스 객체를 자바 객체로 매핑
Data mapping = SQL “구문”을 자바 객체로 매핑
여기서 말하는 개념은 두 프레임워크의 성격을 제대로 이해할 수 있게 해준다. 이러한 개념적인 차이점은 결과적으로 ORM의 캐싱 전략은 데이터베이스 객체에 매핑 된 자바 객체가 캐시에 저장되는 게 기본이고 데이터 매퍼는 객체가 아닌 SQL 구문 자체가 캐시에 저장이 되는 것과 같은 차이점을 낳게 된다. 그렇다고 아이바티스를 ORM의 범주에 포함시키는 데 큰 무리는 없다.
ORM이 생겨난 원인을 무엇일까? 가장 기본적인 것은 현재의 데이터베이스 프로그래밍에서 일반 JDBC 형태의 개발 방법이 개발자에게 필요 이상의 많은 타이핑과 자원관리를 요구한다는 것이다. ORM을 사용해본 개발자는 이 부분에 대해 ORM이 어느 정도 효과를 보인다고 생각할 것이다. 물론 새로운 프레임워크에 대한 학습과 해당 프레임워크가 요구하는 설정작업, 그리고 개발방식은 분명히 개발자에게 또 다른 부담으로 작용하는 것 또한 사실이다. 하지만 개인적으로 개발자는 항상 새로운 어떤 것을 배우고 습득해야 한다. 그런 면에서 이런 프레임워크로 인한 부담을 느끼지 말고 자기개발의 수단으로 생각했으면 좋겠다. 필자가 처음으로 아이바티스를 접했던 3년 전과는 달리 현재는 국내에 서적도 나와 있고 많은 관련문서가 있어서 개발자들이 아이바티스를 학습하는데 전혀 무리가 없을 듯하다. 그래서 이번에는 특정 부분에 집중하지 않고 아이바티스를 활용할 수 있는 부분들을 전체적으로 살펴보고 아이바티스 홈페이지를 통해 논의 되고 있는 아이바티스 3.0이 나아가고자 하는 방향을 여기서 간단히 살펴보고자 한다.
기능에 따른 사용형태
아이바티스를 사용하는 개발에서는 크게 설정 정보를 가지는 SQLMaps 파일과 SQL구문을 가지는 SQLMap 파일, 그리고 아이바티스 API를 사용하는 자바 코드로 구성이 된다고 볼 수 있다. 먼저 설정정보를 가지는 SQLMaps 파일을 살펴보자. SQLMaps 파일 설정은 이미 많이 알려져 있기 때문에 첨부된 예제소스를 참조하도록 한다. 샘플용 소스이기 때문에 typeAlias와 SQLMap 파일의 개수가 적다. 하지만 실제 프로젝트에 아이바티스를 적용할 때는 사전에 typeAlias에 대한 명명 규칙을 정해서 중복 되지 않도록 하거나 각각의 SQLMap 파일에 정의해서 StatementNamespaces로 각각을 구분해주어야 설정 파일의 증가로 복잡해질 때 혼동의 여지가 줄어들 것이다.
전역 세팅에 해당되는 설정과 typeAlias, 그리고 트랜잭션 관리자 및 SQLMap 파일에 대한 위치 정보를 가지고 있다. 전역 세팅에 해당되는 설정은 이외에도 더 있으며 상세한 설명은 이 글의 범위를 벗어나기에 생략한다. 각각의 설정 값에 대한 상세한 정보는 kldp.net에서 호스팅 중인 아이바티스 개발자 가이드 한글문서나 공식 영문문서를 보면 알 수 있다. typeAlias는 말 그대로 타입에 대한 별칭이다. 자바의 패키지 구조로 인해 이름이 긴 클래스를 사용할 경우 차후에 불필요한 중복 타이핑을 해야 하는 등 불편이 따른다. 때문에 여기서는 별칭 형태로 정의할 것이다.
트랜잭션 관리자 부분은 간단히 볼 때 데이터베이스 세팅이다. 간혹 커뮤니티에 아이바티스에서 데이터소스를 두 개 이상 설정할 수 없냐는 질문이 올라오는데 1.x 버전에서는 가능했으나 2.x 부터는 혼란의 소지가 있어 불가능하다. 꼭 필요한 경우라면 이 설정 파일을 데이터 소스 개수만큼 생성하여 동적으로 읽어 들이는 수밖에 없을 듯하다.
마지막으로 SQL 구문을 가지게 되는 SQLMap 파일이다. 여기서는 클래스 패스 기준으로 설정되었다. 아이바티스 사용자들의 공통적인 고민은 WAS의 재시작 없이 SQL구문이 갱신되는 기능일 것이다. 이 경우 아이바티스 단독으로만 사용할 때는 SQLMap 파일을 파일 경로로 지정해주는 방법을 사용할 수 있겠지만, 이 방법 또한 정상적으로 갱신이 안 되는 경우가 있다고 하니 필자로서는 스프링 프레임워크를 사용하는 방법을 권하고 싶다. 스프링 프레임워크를 사용하면 WAS를 재시작하지 않고도 SQL구문이 갱신되는 것을 AppFuse를 통해 간단히 체크해볼 수 있다.
<그림 1>은 이제부터 살펴볼 기본적인 CRUD 작업에 사용된 테이블의 구조다. 계정(account) 정보와 그 계정의 가족 정보(account_family)를 가지는 지극히 간단한 구조로 되어 있다. 하지만 여기서 살펴볼 아이바티스의 기능을 구현하기에는 더없이 적절한 구조라고 생각된다.
일반적인 CRUD 작업
일반적인 CRUD 작업
데이터 매퍼인 아이바티스는 SQL ‘구문’을 자바 객체로 매핑하기 때문에 기본적으로 정적인 CRUD 작업에 가장 최적화되어 있다고 할 수 있다. 물론 데이터베이스 함수 및 프로시저, 동적 SQL 처리에도 사용할 수는 있지만 약간의 제약이 있게 마련이다. 여기서는 SQL 구문의 재사용을 위해 요소를 사용했고 이를 요소를 사용해서 다른 구문에서 가져다가 사용하고 있다. 쿼리문을 일종의 특정 id값을 가지는 xml에 저장하고 그 id를 기준으로 호출해서 사용하는 게 아이바티스의 기본 사용법이다. 이 파일을 이해하는데 별무리가 없으리라 생각된다. 그러면 이 SQL 구문들을 어떻게 호출해서 사용하면 좋을까? 자바 코드를 보자.
<리스트 1> CRUD 작업을 위한 SQLMap 파일
select
acc_id,
acc_first_name,
acc_last_name,
acc_email
from account
insert into account (
acc_id,
acc_first_name,
acc_last_name,
acc_email
) values (
#id#, #firstName#, #lastName#, #emailAddress#
)
자바 코드에서는 각각의 SQL 구문을 호출하는 형태를 <리스트 2>와 같이 취하고 있다. 사전에 아이바티스 설정 파일을 통해 관련 정보를 얻는 부분이 static 구문 안에 처리가 되어 있다. 이 소스는 아이바티스를 처리하는 결과를 보기 위해 log4j 설정과 아이바티스 설정 정보를 읽어오는 두 가지로 구성이 되어 있다. log4j.xml 파일과 아이바티스 설정 파일의 위치를 클래스 패스 기준으로 가져오도록 했다. SqlMapClient가 제공하는 각각의 메소드에 SQLMap 파일에 정의된 SQL 구문의 id와 인자로 넣어줄 객체를 정의하는 형태를 취한다. 짐작하겠지만 SQL 구문의 id와 일치하는 SQL 구문에 해당 객체의 값이 인자로 전달되어서 내부적으로 java.sql의 PreparedStatement 객체 생성 후 일반 JDBC처럼 처리된다.
<리스트 2> CRUD 작업을 위한 자바 코드
private static SqlMapClient sqlMapper;
static {
try {
// iBATIS SQLMaps setting
Reader reader = Resources.getResourceAsReader("kr/or/openframework/dao/ibatis/SqlMapConfig.xml");
sqlMapper = SqlMapClientBuilder.buildSqlMapClient(reader);
reader.close()
} catch (IOException e) {
throw new RuntimeException("Something bad happened while building the SqlMapClient instance." + e, e);
}
}
public static Account selectAccountById(int id) throws SQLException {
return (Account) sqlMapper.queryForObject("selectAccountById", id);
}
public static String insertAccount(Account account) throws SQLException {
sqlMapper.insert("insertAccount", account);
return "SUCCESS";
}
프로시저
예제를 위해 필자는 다음처럼 간단한 프로시저를 생성했다. 여기서는 IN 타입의 파라미터만을 사용했지만 IN과 OUT, INOUT 타입 모두 지원한다. 여기서 사용된 프로시저는 인자로 들어온 값을 id로 해서 샘플용 데이터를 생성한다.
<리스트 3> 프로시저 생성 구문
drop procedure if exists procedurein;
delimiter // ;
create procedure procedurein (in p_param int)
begin
insert into account (
acc_id,
acc_first_name,
acc_last_name,
acc_email
) values (
p_param, "procedure_test", "procedure_test", "test@test.com"
);
end;
//
delimiter ; //
프로시저 호출은 일반적으로 콘솔 창에서 실행하는 것처럼 하고 { }로 감싸주면 된다. 처리 자체는 오히려 CRUD보다 간단하다고 할 수 있으나 직접 해보면 쉽지 않다는 것을 알 수 있다.
<리스트 4> 프로시저 호출을 위한 SQLMap 파일
{ call procedurein(#val#) }
<리스트 5> 프로시저 호출을 위한 자바 코드
public static String callInTypeProcedure(int id) throws SQLException {
sqlMapper.update("inProcedure", new Integer(id));
return "SUCCESS";
}
프로시저의 처리는 아이바티스 홈페이지나 메일링 리스트를 통해 끊임없이 제기되는 문제 중에 하나이다. 개발자와 데이터베이스마다 구현 방식이 조금씩 다른 탓도 있겠지만 여러 가지 눈에 띄는 어려움이 존재하기 때문에 아이바티스 문서를 보면 꼭 표준 형태의 프로시저를 사용하도록 권장하고 있다.
필자의 경우에도 오라클(Oracle)에서는 정상적으로 프로시저 형태의 샘플 코드를 테스트 했으나 MySQL로 작성하면서 이런저런 문제에 봉착했었다. 실제 프로젝트에서 아이바티스를 사용하여 프로시저를 처리할 때는 프로시저 사용 패턴을 정의하고 사전에 정상적으로 처리가 되는지 테스트 해보길 권하고 싶다.
케이스
메소드명
결과세트를 반환할 때
queryForList(), queryForObject()
한 개 이상의 결과 객체를 반환할 때
queryForList()
한개의 결과 객체를 반환할 때
queryForObject()
결과세트를 반환하지 않거나 OUT
파라미터에 결과세트를 세팅하지 않을 때
update()
앞의 예제는 IN 파리미터에 값을 전달하고 내부적으로 처리한 후에 어떠한 데이터도 반환하지 않기 때문에 update() 메소드가 사용되었다(프로시저 처리 시 결과 세트를 반환하고 데이터를 업데이트 할 경우, 요소의 commitRe quired 속성 값을 true로 세팅해줘야 한다).
N+1 문제
<리스트 6> N+1문제를 가지는 형태의 SQLMap 파일
select
acc_id as id,
acc_first_name as firstName,
acc_last_name as lastName,
acc_email as emailAddress
from account
<리스트 7> N+1문제를 가지는 형태의 자바 코드
@SuppressWarnings("unchecked")
public static List selectAccountWithFamilyUsingNPlus1(int id) throws SQLException {
List familys = (ArrayList)sqlMapper.queryForList("selectAccountWithFamilyUsingNplus1", new Integer(id));
return familys;
}
log4j를 이용해 실제로 수행되는 SQL문을 찍어보면 다음과 같이 표시된다.
Executing Statement: select acc_id as id, family_fullname as fullName from Account_family where acc_id = ?
Executing Statement: select acc_id, acc_first_name, acc_last_name, acc_email from account where acc_id = ?
Executing Statement: select acc_id, acc_first_name, acc_last_name, acc_email from account where acc_id = ?
2(N)개의 데이터를 가져오기 위해 실제로는 SQL 문을 한 번 더(+1) 수행하여 총 3번(Account_family에 한번, Account에 두 번)을 실행하게 되는 셈이다. 이것을 N+1 문제라고 하는데 이를 개선하기 위해 groupBy를 사용할 수 있다.
<리스트 8> N+1문제를 가지지 않는 형태의 SQLMap 파일
<리스트 9> N+1문제를 가지지 않는 형태의 자바 코드
@SuppressWarnings("unchecked")
public static List selectAccountWithFamilyAvoidNPlus1(int id) throws SQLException {
List familys = (ArrayList)sqlMapper.queryForList("selectAccountWithFamilyAvoidNplus1", new Integer(id));
return familys;
}
조인 구문과 groupBy를 사용하면 다음처럼 일반 join 문을 사용하여 처리를 하기 때문에 N+1과 같은 문제가 발생하지 않는다. 현재는 이 방법이 가장 추천된다고 할 수 있다. 하지만 방법적으로 하위 결과 맵을 사용하는 것이 추천되는 방법이라고 보기는 어려울 듯하다. 아이바티스 3.0에서는 좀 더 개선된 방법이 제공될 것으로 짐작된다.
Executing Statement: select a.acc_id, a.acc_first_name, a.acc_last_name, a.acc_email, f.family_fullname from account a left join account_family f on a.acc_id=f.acc_id where a.acc_id=?
동적 SQL
<리스트 10> 동적 SQL을 사용하는 SQLMap파일 내용
<리스트 11> 동적 SQL을 호출하는 자바코드
@SuppressWarnings("unchecked")
public static List selectAccountDynamic(Account account) throws SQLException {
List accounts = (List)sqlMapper.queryForList("selectAccountDynamic", account);
return accounts;
}
필자의 경우 인자로 넣어준 id의 값이 3이었기 때문에 다음처럼 WHERE acc_id =1이 추가되어 처리되었다. 동적 SQL의 경우 자바 코드가 아닌 XML의 태그로 동적 SQL을 생성하기 때문에 손에 익지 않아 불편할 수도 있다. 이미 아이바티스 개발팀은 이 동적 SQL 부분에 대한 개선작업을 진행하고 있다. 그 결과물로 3.0에서 도입될 방식에 대해 잠시 뒤에 살펴보도록 하겠다.
<리스트 12> 동적 SQL을 호출하는 결과
Executing Statement: select acc_id as id, acc_first_name as firstName, acc_last_name as lastName, acc_email as emailAddress from account WHERE acc_id = 1
아이바티스 3.0 소식
아이바티스 3.0 개발은 다음과 같은 방향으로 진행이 된다.
- 테스트 주도 개발
- 성능보다는 코드의 간결성
- 복잡한 디자인 보다는 간결한 디자인
- 하나의 JAR파일
- 다른 라이브러리의 의존성을 없앰
- 더 나은 플러그인 지원
- 추가적인 플러그인을 위한 프로젝트(http://sourceforge.net/ projects/ibatiscontrib/)
역시나 기본적으로 계속 간결한 프레임워크를 유지하면서 많은 사용자들이 원하는 기능은 플러그인 형태로 제공하는 것이 기본적인 개발 방향임을 짐작할 수 있다. 역시 아이바티스는 간단함 내지 간결함으로 표현할 수 있는 프레임워크이다.
그럼 저 기본 방향을 염두에 두고 현재 다소 형상화되어 보이는 3.0 기능에 대해 간단히 살펴보자.
인터페이스 바인딩
일단 다음과 같은 기존 코딩 방식에 대해 살펴보자. 기존 방식의 문제점은 매핑 구문명이 문자열 기반이라 매핑 구문명의 철자가 잘못되어 있을 경우 에러가 발생하게 되고 컴파일시가 아닌 런타임 시 에러가 발견할 수 있게 된다. 더군다나 문자열 기반이라 SQLMap 파일의 증가는 곧 사용할 구문에 대한 체크에 일부 시간을 소요할 수밖에 없도록 만드는 계기가 된다. 그리고 반환 타입은 형 변환을 통해 명시화되지만 실제로 반환 타입의 모호로 인해 형 변환 시 ClassCastException은 아이바티스 사용자라면 한번쯤 겪게 되는 에러가 된다. 즉 애매한 형 변환과 문자열 기반의 매핑 구문은 결과적으로 대부분의 에러가 런타임 시 발생하여 개발을 힘들게 만드는 요인이 되고 있다. 이런 점을 해결하기 위해 나온 것인 이 인터페이스 바인딩이다.
기존에 XML에 타입을 선언하고 문자열 기반으로 구문을 호출하는 것 대신에 좀 더 서술적이고 타입에 안전한 인터페이스의 사용으로 앞서 언급된 문제점을 많이 보완해 나가고 있다. 다음의 코드는 기존 방식의 호출을 새로운 인터페이스 바인딩 방법으로 호출한 것이다. 애매한 형 변환 작업이 없고 문자열 기반의 매핑 구문을 사용하지 않아 기본적으로 컴파일 시 많은 에러를 찾아낼 수 있다. 요즘처럼 IDE를 기본적으로 사용하는 환경이라면 얼마나 많은 도움이 될지는 의심할 여지가 없다.
결과적으로 인터페이스 바인딩을 통해 매핑 구문명과 파라미터 타입, 결과 타입을 자동적으로 알 수 있게 되는 셈이다.
다중 레벨 설정
아이바티스의 오랜 설정 방식인 XML은 3.0에서도 역시 좋은 방법이 되겠지만 3.0에서 디폴트 설정 방법이 되지는 않는다. 3.0에서는 다음과 같은 다중 레벨 설정이 가능하게 된다.
- 관례(Convention)
- 어노테이션(말 그대로 하면 주석) : 앞의 관례보다 우선시 된다.
- XML : 앞의 관계, 어노테이션보다 우선시 된다.
- 자바 API : 앞의 관례, 어노테이션, XML보다 우선시 된다.
관례는 메소드 시그니처로 정해진 규칙이라고 보면 된다.
Employee getEmployee (int id); 라는 메소드 시그니처는 다음과 같은 SQL과 동일 시 된다고 볼 수 있다.
SELECT id, firstName, lastName FROM Employee WHERE id = ?
여기서 메소드 반환 타입의 이름이 테이블 명이 되고 메소드의 인자로 주어진 값이 자동으로 WHERE 조건문을 구성한다고 볼 수 있다. 간단한 조건문이나 들어가는 형식의 전체 데이터를 뽑는 기능이라면 이 메소드를 선언하여 추가 작업 없이 해당 기능이 구현할 수 있다.
어노테이션으로 설정하기
XML 설정을 넘어서 어노테이션으로 메타데이터 정보를 설정하는 기능이 많이 도입되었다. 이에 아이바티스도 이러한 기능을 추가적으로 지원한다. 현재 아이바티스의 XML 파일은 다음과 같은 정보를 가진다.
- 설정
- 메타 정보
- 코드
설정은 환경적인 정보이다.
메타정보는 결과 맵과 파라미터 맵, 그리고 캐시 모델들을 나타내고 코드는 SQL과 동적 SQL 요소를 포함한다. 설정 정보는 properties 파일이나 XML에 담겨야하고, 코드는 자바 코드나 XML에 담겨야 한다. 단 메타정보만이 어노테이션에서 처리가 가능하도록 될 것이다.
어노테이션의 예제는 다음과 같다. 앞의 관례에 의한 방식에서 칼럼 별 타입을 정의하고 조건문을 구체화하기 위해 어노테이션이 사용된 것을 볼 수 있다.
<리스트 13> CRUD 작업을 위한 어노테이션 사용 예제
@Select({"SELECT #id(EMP_ID:NUMERIC), #firstName(FIRST_NAME:VARCHAR), #lastName(LAST_NAME:VARCHAR) ",
"FROM EMPLOYEE",
"WHERE EMP_ID = @id"})
Employee selectEmployee(int id);
@Insert({"INSERT INTO EMPLOYEE (EMP_ID, FIRST_NAME, LAST_NAME)",
"VALUES (@id, @firstName, @lastName)"})
void insertEmployee(Employee emp);
@Delete("DELETE EMPLOYEE WHERE EMP_ID = @id")
void deleteEmployee(int id);
<리스트 14>와 같은 형식의 어노테이션도 사용 가능하게 된다. 여기서는 ResultClass와 PropertyResult를 추가적으로 어노테이션을 통해 정의한 것이다.
<리스트 14> ResultClass, PropertyResults를 사용하는 어노테이션 예제
@ResultClass (Department.class)
@PropertyResults({
@Result(property="id", column="DEPT_ID"),
@Result(property="name", column="NAME"),
@Result(property="employees",
nestedQuery=@QueryMethod(type=CompanyMapper.class, methodName="getEmployeesForDeparment", parameters="id"))
})
@Select("SELECT #id, #name FROM DEPARTMENT WHERE COMP_ID = @id ")
List getDepartmentsForCompany(int id);
<리스트 15>와 같이 캐싱을 설정할 수도 있다.
<리스트 15> 캐싱 설정의 어노테이션 사용 예제
@CacheContext("Employee")
public class EmployeeMapper {
void insertEmployee(Employee emp);
Employee getEmployee(int id);
List findEmployeesLike(Employee emp);
}
기존 설정이라면 다음과 같은 의미를 가진다.
<리스트 16> 캐싱 설정의 기존방식 예제
...
@flushCache
List updateAndGetSpecialEmployees();
는 다음과 같은 의미를 가진다.
예제를 통해 보면 현재의 설정을 일일이 XML 파일에 적어야 할 사항을 어노테이션을 통해 설정을 함으로써 일단 XML 파일 내용의 갱신 문제에 좀 더 자유로워 질 수 있을 듯하다. 한편, 개발자가 초기 XML 설정 외에 대부분의 작업을 자바 소스에서 제어함으로써 작업도 한결 수월하게 할 수 있을 것이다.
XML 설정 향상
다음은 XML 설정 향상과 관련된 주요 내용들이다.
1. 필드와 생성자 파라미터 그리고 자바빈즈 프로퍼티에 결과 및 파라미터를 맵핑된다.
2. N+1 문제를 해결하는 조인 매핑과 groupBy는 사용이 더 쉬워진다. <리스트 17>의 요소를 사용해서 하위 결과 맵을 생성하는 작업이 필요 없도록 한다.
3. 결과 맵과 파라미터 맵은 기본적으로 ‘자동 매핑’ 되고 이름이 일치하지 않는 프로퍼티만을 명시한다.
4. 기능적으로 좀 더 뛰어나면서 간단한 타입 핸들러 구현체와 데이터 타입 변환 필터를 제공할 것이다.
5. 가장 큰 변화는 XML 파일이 Mapper.class의 복사본과 함께 처리한다는 점이다. 이를테면 EmployeeMapper.xml은 클래스패스에 존재하는 EmployeeMapper.class를 위해 로드 된다. 해당 매퍼 클래스의 객체를 생성하면 자동으로 같은 이름의 매퍼 XML 파일이 로드 되는 형식이라고 짐작된다. 객체 생성에 따라 매퍼 XML 파일이 로드 되는 형식이라면 SQL 구문의 갱신이 3.0에서는 어느 정도 해결될 듯하다.
<리스트 17> Mapper용 XML설정
동적 SQL
현재의 요소를 사용하는 방법 외에도 3.0에서는 다음과 같은 방법이 가능하게 된다. 아무래도 자바 개발자에게는 XML 에서 문자열을 조작하는 것보다는 자바 로직으로 처리하는 편이 훨씬 수월할 것이다.
<리스트 18> SQLSource를 확장한 동적 SQL시용 예제
public class GetAccountListSQL extends SQLSource {
public String getSQL(Object param) {
Account acct = (Account) param;
append("select * from ACCOUNT");
prepend(“WHERE”); // 다음의 append 앞에 기본적으로 추가한다.
if (exists(acct.getEmailAddress())) {
append("AND", "ACC_EMAIL like #EmailAddress#"); // 필요하다면 첫 번째 인자를 붙이겠지만 그렇지 않다면 첫 번째 인자는 무시된다.
}
if (greaterThan(0,acct.getID())) {
append("AND", "ACC_ID = #ID#");
}
prepend(); // 앞의 prepend 뒤에 아무 코드가 없다면 앞의 prepend를 지운다.
append ("order by ACCT_LAST_NAME");
}
}
<리스트 18>은 다음과 같이 사용할 수 있다.
@SQLSource(GetAccountListSQL.class)
List getAccountList(Account acct);
또는 다음처럼도 가능하다.
그 외에 테이블 관계를 나타내기 위한 간단한 기능이 추가되고 SQL 생성을 지원하는 몇 가지 옵션도 추가될 것으로 보인다.
지금까지 개인적으로 원했던 기능 중에 3.0에서 추가되도록 활발히 진행 중인 것 위주로 살펴보았다. 하지만 곰곰이 생각해보면 아이바티스가 추구했던 간결함은 오히려 반감되고 있는 게 아닌가 하는 우려도 든다. 아이바티스의 장점은 간결함이다. JDBC에 익숙한 개발자라면 몇 시간의 교육만으로도 실제 프로젝트에 적용할 수 있을 정도다. 단점이라면 매핑 작업이 번거롭다는 점을 들 수 있을 것이다. 파라미터 맵과 결과 맵에 매핑해주는 작업이 JDBC를 그대로 사용하는 것보다 그렇게 쉬운 작업이 아니다. 그럼에도 불구하고 아이바티스를 많이 사용하게 되는 데에는 충분히 사용할만한 장점이 있기 때문일 것이다. 앞으로도 발전하는 아이바티스의 모습을 기대해 본다.
제공 : DB포탈사이트 DBguide.net
출처명 : 한국마이크로소프트 [2007년 9월호
*
* 조회수 : 211
*
* 07.11.02 13:08
http://cafe.daum.net/proutils/IWTE/16주소 복사
간결한 데이터 매퍼의 대명사
iBATIS SQLMaps 활용법
iBATIS SQLMaps(이하 아이바티스)는 이미 국내외 많은 개발자들이 사용하고 있는 퍼시스턴스 계층의 프레임워크이다. 실제로 국내에서 가장 크다는 포털 사이트인 네이버와 다음도 아이바티스를 사용하고 있으며, 다른 업체들도 아이바티스를 그대로 사용하거나 약간 변형시킨 형태로 사용하고 있는 것으로 알고 있다. 특집 3부에서는 아이바티스의 특징과 활용법에 대해 알아본다.
이동국 fromm0@gmail.com
과거 ORM의 대표인 하이버네이트와 데이터 매퍼인 아이바티스 간에 어느 프레임워크가 더 좋은가에 대한 논쟁도 있었을 만큼 많은 자바 개발자들은 데이터베이스에 관련된 ORM 프레임워크에 대한 관심이 크다. 이런 논쟁 가운데 아이바티스는 ORM이 아니기 때문에 논쟁의 대상이 될 수 없다는 의견도 있었다. 사용 목적이라는 관점에서 본다면 하이버네이트와 아이바티스는 논쟁의 대상이 될 수 있으나 ORM이냐 아니냐를 가름하는 관점에서 본다면, 역시 아이바티스는 ORM이 아니라고 할 수 있다.
ORM과 데이터 매핑
아이바티스의 핵심 개발자인 래리 메도스(Larry Meadors)는 다음처럼 ORM과 데이터 매퍼를 구분한다.
ORM = 데이터베이스 객체를 자바 객체로 매핑
Data mapping = SQL “구문”을 자바 객체로 매핑
여기서 말하는 개념은 두 프레임워크의 성격을 제대로 이해할 수 있게 해준다. 이러한 개념적인 차이점은 결과적으로 ORM의 캐싱 전략은 데이터베이스 객체에 매핑 된 자바 객체가 캐시에 저장되는 게 기본이고 데이터 매퍼는 객체가 아닌 SQL 구문 자체가 캐시에 저장이 되는 것과 같은 차이점을 낳게 된다. 그렇다고 아이바티스를 ORM의 범주에 포함시키는 데 큰 무리는 없다.
ORM이 생겨난 원인을 무엇일까? 가장 기본적인 것은 현재의 데이터베이스 프로그래밍에서 일반 JDBC 형태의 개발 방법이 개발자에게 필요 이상의 많은 타이핑과 자원관리를 요구한다는 것이다. ORM을 사용해본 개발자는 이 부분에 대해 ORM이 어느 정도 효과를 보인다고 생각할 것이다. 물론 새로운 프레임워크에 대한 학습과 해당 프레임워크가 요구하는 설정작업, 그리고 개발방식은 분명히 개발자에게 또 다른 부담으로 작용하는 것 또한 사실이다. 하지만 개인적으로 개발자는 항상 새로운 어떤 것을 배우고 습득해야 한다. 그런 면에서 이런 프레임워크로 인한 부담을 느끼지 말고 자기개발의 수단으로 생각했으면 좋겠다. 필자가 처음으로 아이바티스를 접했던 3년 전과는 달리 현재는 국내에 서적도 나와 있고 많은 관련문서가 있어서 개발자들이 아이바티스를 학습하는데 전혀 무리가 없을 듯하다. 그래서 이번에는 특정 부분에 집중하지 않고 아이바티스를 활용할 수 있는 부분들을 전체적으로 살펴보고 아이바티스 홈페이지를 통해 논의 되고 있는 아이바티스 3.0이 나아가고자 하는 방향을 여기서 간단히 살펴보고자 한다.
기능에 따른 사용형태
아이바티스를 사용하는 개발에서는 크게 설정 정보를 가지는 SQLMaps 파일과 SQL구문을 가지는 SQLMap 파일, 그리고 아이바티스 API를 사용하는 자바 코드로 구성이 된다고 볼 수 있다. 먼저 설정정보를 가지는 SQLMaps 파일을 살펴보자. SQLMaps 파일 설정은 이미 많이 알려져 있기 때문에 첨부된 예제소스를 참조하도록 한다. 샘플용 소스이기 때문에 typeAlias와 SQLMap 파일의 개수가 적다. 하지만 실제 프로젝트에 아이바티스를 적용할 때는 사전에 typeAlias에 대한 명명 규칙을 정해서 중복 되지 않도록 하거나 각각의 SQLMap 파일에 정의해서 StatementNamespaces로 각각을 구분해주어야 설정 파일의 증가로 복잡해질 때 혼동의 여지가 줄어들 것이다.
전역 세팅에 해당되는 설정과 typeAlias, 그리고 트랜잭션 관리자 및 SQLMap 파일에 대한 위치 정보를 가지고 있다. 전역 세팅에 해당되는 설정은 이외에도 더 있으며 상세한 설명은 이 글의 범위를 벗어나기에 생략한다. 각각의 설정 값에 대한 상세한 정보는 kldp.net에서 호스팅 중인 아이바티스 개발자 가이드 한글문서나 공식 영문문서를 보면 알 수 있다. typeAlias는 말 그대로 타입에 대한 별칭이다. 자바의 패키지 구조로 인해 이름이 긴 클래스를 사용할 경우 차후에 불필요한 중복 타이핑을 해야 하는 등 불편이 따른다. 때문에 여기서는 별칭 형태로 정의할 것이다.
트랜잭션 관리자 부분은 간단히 볼 때 데이터베이스 세팅이다. 간혹 커뮤니티에 아이바티스에서 데이터소스를 두 개 이상 설정할 수 없냐는 질문이 올라오는데 1.x 버전에서는 가능했으나 2.x 부터는 혼란의 소지가 있어 불가능하다. 꼭 필요한 경우라면 이 설정 파일을 데이터 소스 개수만큼 생성하여 동적으로 읽어 들이는 수밖에 없을 듯하다.
마지막으로 SQL 구문을 가지게 되는 SQLMap 파일이다. 여기서는 클래스 패스 기준으로 설정되었다. 아이바티스 사용자들의 공통적인 고민은 WAS의 재시작 없이 SQL구문이 갱신되는 기능일 것이다. 이 경우 아이바티스 단독으로만 사용할 때는 SQLMap 파일을 파일 경로로 지정해주는 방법을 사용할 수 있겠지만, 이 방법 또한 정상적으로 갱신이 안 되는 경우가 있다고 하니 필자로서는 스프링 프레임워크를 사용하는 방법을 권하고 싶다. 스프링 프레임워크를 사용하면 WAS를 재시작하지 않고도 SQL구문이 갱신되는 것을 AppFuse를 통해 간단히 체크해볼 수 있다.
<그림 1>은 이제부터 살펴볼 기본적인 CRUD 작업에 사용된 테이블의 구조다. 계정(account) 정보와 그 계정의 가족 정보(account_family)를 가지는 지극히 간단한 구조로 되어 있다. 하지만 여기서 살펴볼 아이바티스의 기능을 구현하기에는 더없이 적절한 구조라고 생각된다.
일반적인 CRUD 작업
일반적인 CRUD 작업
데이터 매퍼인 아이바티스는 SQL ‘구문’을 자바 객체로 매핑하기 때문에 기본적으로 정적인 CRUD 작업에 가장 최적화되어 있다고 할 수 있다. 물론 데이터베이스 함수 및 프로시저, 동적 SQL 처리에도 사용할 수는 있지만 약간의 제약이 있게 마련이다. 여기서는 SQL 구문의 재사용을 위해
<리스트 1> CRUD 작업을 위한 SQLMap 파일
select
acc_id,
acc_first_name,
acc_last_name,
acc_email
from account
insert into account (
acc_id,
acc_first_name,
acc_last_name,
acc_email
) values (
#id#, #firstName#, #lastName#, #emailAddress#
)
자바 코드에서는 각각의 SQL 구문을 호출하는 형태를 <리스트 2>와 같이 취하고 있다. 사전에 아이바티스 설정 파일을 통해 관련 정보를 얻는 부분이 static 구문 안에 처리가 되어 있다. 이 소스는 아이바티스를 처리하는 결과를 보기 위해 log4j 설정과 아이바티스 설정 정보를 읽어오는 두 가지로 구성이 되어 있다. log4j.xml 파일과 아이바티스 설정 파일의 위치를 클래스 패스 기준으로 가져오도록 했다. SqlMapClient가 제공하는 각각의 메소드에 SQLMap 파일에 정의된 SQL 구문의 id와 인자로 넣어줄 객체를 정의하는 형태를 취한다. 짐작하겠지만 SQL 구문의 id와 일치하는 SQL 구문에 해당 객체의 값이 인자로 전달되어서 내부적으로 java.sql의 PreparedStatement 객체 생성 후 일반 JDBC처럼 처리된다.
<리스트 2> CRUD 작업을 위한 자바 코드
private static SqlMapClient sqlMapper;
static {
try {
// iBATIS SQLMaps setting
Reader reader = Resources.getResourceAsReader("kr/or/openframework/dao/ibatis/SqlMapConfig.xml");
sqlMapper = SqlMapClientBuilder.buildSqlMapClient(reader);
reader.close()
} catch (IOException e) {
throw new RuntimeException("Something bad happened while building the SqlMapClient instance." + e, e);
}
}
public static Account selectAccountById(int id) throws SQLException {
return (Account) sqlMapper.queryForObject("selectAccountById", id);
}
public static String insertAccount(Account account) throws SQLException {
sqlMapper.insert("insertAccount", account);
return "SUCCESS";
}
프로시저
예제를 위해 필자는 다음처럼 간단한 프로시저를 생성했다. 여기서는 IN 타입의 파라미터만을 사용했지만 IN과 OUT, INOUT 타입 모두 지원한다. 여기서 사용된 프로시저는 인자로 들어온 값을 id로 해서 샘플용 데이터를 생성한다.
<리스트 3> 프로시저 생성 구문
drop procedure if exists procedurein;
delimiter // ;
create procedure procedurein (in p_param int)
begin
insert into account (
acc_id,
acc_first_name,
acc_last_name,
acc_email
) values (
p_param, "procedure_test", "procedure_test", "test@test.com"
);
end;
//
delimiter ; //
프로시저 호출은 일반적으로 콘솔 창에서 실행하는 것처럼 하고 { }로 감싸주면 된다. 처리 자체는 오히려 CRUD보다 간단하다고 할 수 있으나 직접 해보면 쉽지 않다는 것을 알 수 있다.
<리스트 4> 프로시저 호출을 위한 SQLMap 파일
{ call procedurein(#val#) }
<리스트 5> 프로시저 호출을 위한 자바 코드
public static String callInTypeProcedure(int id) throws SQLException {
sqlMapper.update("inProcedure", new Integer(id));
return "SUCCESS";
}
프로시저의 처리는 아이바티스 홈페이지나 메일링 리스트를 통해 끊임없이 제기되는 문제 중에 하나이다. 개발자와 데이터베이스마다 구현 방식이 조금씩 다른 탓도 있겠지만 여러 가지 눈에 띄는 어려움이 존재하기 때문에 아이바티스 문서를 보면 꼭 표준 형태의 프로시저를 사용하도록 권장하고 있다.
필자의 경우에도 오라클(Oracle)에서는 정상적으로 프로시저 형태의 샘플 코드를 테스트 했으나 MySQL로 작성하면서 이런저런 문제에 봉착했었다. 실제 프로젝트에서 아이바티스를 사용하여 프로시저를 처리할 때는 프로시저 사용 패턴을 정의하고 사전에 정상적으로 처리가 되는지 테스트 해보길 권하고 싶다.
케이스
메소드명
결과세트를 반환할 때
queryForList(), queryForObject()
한 개 이상의 결과 객체를 반환할 때
queryForList()
한개의 결과 객체를 반환할 때
queryForObject()
결과세트를 반환하지 않거나 OUT
파라미터에 결과세트를 세팅하지 않을 때
update()
앞의 예제는 IN 파리미터에 값을 전달하고 내부적으로 처리한 후에 어떠한 데이터도 반환하지 않기 때문에 update() 메소드가 사용되었다(프로시저 처리 시 결과 세트를 반환하고 데이터를 업데이트 할 경우,
N+1 문제
<리스트 6> N+1문제를 가지는 형태의 SQLMap 파일
select
acc_id as id,
acc_first_name as firstName,
acc_last_name as lastName,
acc_email as emailAddress
from account
<리스트 7> N+1문제를 가지는 형태의 자바 코드
@SuppressWarnings("unchecked")
public static List
List
return familys;
}
log4j를 이용해 실제로 수행되는 SQL문을 찍어보면 다음과 같이 표시된다.
Executing Statement: select acc_id as id, family_fullname as fullName from Account_family where acc_id = ?
Executing Statement: select acc_id, acc_first_name, acc_last_name, acc_email from account where acc_id = ?
Executing Statement: select acc_id, acc_first_name, acc_last_name, acc_email from account where acc_id = ?
2(N)개의 데이터를 가져오기 위해 실제로는 SQL 문을 한 번 더(+1) 수행하여 총 3번(Account_family에 한번, Account에 두 번)을 실행하게 되는 셈이다. 이것을 N+1 문제라고 하는데 이를 개선하기 위해 groupBy를 사용할 수 있다.
<리스트 8> N+1문제를 가지지 않는 형태의 SQLMap 파일
<리스트 9> N+1문제를 가지지 않는 형태의 자바 코드
@SuppressWarnings("unchecked")
public static List
List
return familys;
}
조인 구문과 groupBy를 사용하면 다음처럼 일반 join 문을 사용하여 처리를 하기 때문에 N+1과 같은 문제가 발생하지 않는다. 현재는 이 방법이 가장 추천된다고 할 수 있다. 하지만 방법적으로 하위 결과 맵을 사용하는 것이 추천되는 방법이라고 보기는 어려울 듯하다. 아이바티스 3.0에서는 좀 더 개선된 방법이 제공될 것으로 짐작된다.
Executing Statement: select a.acc_id, a.acc_first_name, a.acc_last_name, a.acc_email, f.family_fullname from account a left join account_family f on a.acc_id=f.acc_id where a.acc_id=?
동적 SQL
<리스트 10> 동적 SQL을 사용하는 SQLMap파일 내용
<리스트 11> 동적 SQL을 호출하는 자바코드
@SuppressWarnings("unchecked")
public static List
List
return accounts;
}
필자의 경우 인자로 넣어준 id의 값이 3이었기 때문에 다음처럼 WHERE acc_id =1이 추가되어 처리되었다. 동적 SQL의 경우 자바 코드가 아닌 XML의 태그로 동적 SQL을 생성하기 때문에 손에 익지 않아 불편할 수도 있다. 이미 아이바티스 개발팀은 이 동적 SQL 부분에 대한 개선작업을 진행하고 있다. 그 결과물로 3.0에서 도입될 방식에 대해 잠시 뒤에 살펴보도록 하겠다.
<리스트 12> 동적 SQL을 호출하는 결과
Executing Statement: select acc_id as id, acc_first_name as firstName, acc_last_name as lastName, acc_email as emailAddress from account WHERE acc_id = 1
아이바티스 3.0 소식
아이바티스 3.0 개발은 다음과 같은 방향으로 진행이 된다.
- 테스트 주도 개발
- 성능보다는 코드의 간결성
- 복잡한 디자인 보다는 간결한 디자인
- 하나의 JAR파일
- 다른 라이브러리의 의존성을 없앰
- 더 나은 플러그인 지원
- 추가적인 플러그인을 위한 프로젝트(http://sourceforge.net/ projects/ibatiscontrib/)
역시나 기본적으로 계속 간결한 프레임워크를 유지하면서 많은 사용자들이 원하는 기능은 플러그인 형태로 제공하는 것이 기본적인 개발 방향임을 짐작할 수 있다. 역시 아이바티스는 간단함 내지 간결함으로 표현할 수 있는 프레임워크이다.
그럼 저 기본 방향을 염두에 두고 현재 다소 형상화되어 보이는 3.0 기능에 대해 간단히 살펴보자.
인터페이스 바인딩
일단 다음과 같은 기존 코딩 방식에 대해 살펴보자. 기존 방식의 문제점은 매핑 구문명이 문자열 기반이라 매핑 구문명의 철자가 잘못되어 있을 경우 에러가 발생하게 되고 컴파일시가 아닌 런타임 시 에러가 발견할 수 있게 된다. 더군다나 문자열 기반이라 SQLMap 파일의 증가는 곧 사용할 구문에 대한 체크에 일부 시간을 소요할 수밖에 없도록 만드는 계기가 된다. 그리고 반환 타입은 형 변환을 통해 명시화되지만 실제로 반환 타입의 모호로 인해 형 변환 시 ClassCastException은 아이바티스 사용자라면 한번쯤 겪게 되는 에러가 된다. 즉 애매한 형 변환과 문자열 기반의 매핑 구문은 결과적으로 대부분의 에러가 런타임 시 발생하여 개발을 힘들게 만드는 요인이 되고 있다. 이런 점을 해결하기 위해 나온 것인 이 인터페이스 바인딩이다.
기존에 XML에 타입을 선언하고 문자열 기반으로 구문을 호출하는 것 대신에 좀 더 서술적이고 타입에 안전한 인터페이스의 사용으로 앞서 언급된 문제점을 많이 보완해 나가고 있다. 다음의 코드는 기존 방식의 호출을 새로운 인터페이스 바인딩 방법으로 호출한 것이다. 애매한 형 변환 작업이 없고 문자열 기반의 매핑 구문을 사용하지 않아 기본적으로 컴파일 시 많은 에러를 찾아낼 수 있다. 요즘처럼 IDE를 기본적으로 사용하는 환경이라면 얼마나 많은 도움이 될지는 의심할 여지가 없다.
결과적으로 인터페이스 바인딩을 통해 매핑 구문명과 파라미터 타입, 결과 타입을 자동적으로 알 수 있게 되는 셈이다.
다중 레벨 설정
아이바티스의 오랜 설정 방식인 XML은 3.0에서도 역시 좋은 방법이 되겠지만 3.0에서 디폴트 설정 방법이 되지는 않는다. 3.0에서는 다음과 같은 다중 레벨 설정이 가능하게 된다.
- 관례(Convention)
- 어노테이션(말 그대로 하면 주석) : 앞의 관례보다 우선시 된다.
- XML : 앞의 관계, 어노테이션보다 우선시 된다.
- 자바 API : 앞의 관례, 어노테이션, XML보다 우선시 된다.
관례는 메소드 시그니처로 정해진 규칙이라고 보면 된다.
Employee getEmployee (int id); 라는 메소드 시그니처는 다음과 같은 SQL과 동일 시 된다고 볼 수 있다.
SELECT id, firstName, lastName FROM Employee WHERE id = ?
여기서 메소드 반환 타입의 이름이 테이블 명이 되고 메소드의 인자로 주어진 값이 자동으로 WHERE 조건문을 구성한다고 볼 수 있다. 간단한 조건문이나 들어가는 형식의 전체 데이터를 뽑는 기능이라면 이 메소드를 선언하여 추가 작업 없이 해당 기능이 구현할 수 있다.
어노테이션으로 설정하기
XML 설정을 넘어서 어노테이션으로 메타데이터 정보를 설정하는 기능이 많이 도입되었다. 이에 아이바티스도 이러한 기능을 추가적으로 지원한다. 현재 아이바티스의 XML 파일은 다음과 같은 정보를 가진다.
- 설정
- 메타 정보
- 코드
설정은 환경적인 정보이다.
메타정보는 결과 맵과 파라미터 맵, 그리고 캐시 모델들을 나타내고 코드는 SQL과 동적 SQL 요소를 포함한다. 설정 정보는 properties 파일이나 XML에 담겨야하고, 코드는 자바 코드나 XML에 담겨야 한다. 단 메타정보만이 어노테이션에서 처리가 가능하도록 될 것이다.
어노테이션의 예제는 다음과 같다. 앞의 관례에 의한 방식에서 칼럼 별 타입을 정의하고 조건문을 구체화하기 위해 어노테이션이 사용된 것을 볼 수 있다.
<리스트 13> CRUD 작업을 위한 어노테이션 사용 예제
@Select({"SELECT #id(EMP_ID:NUMERIC), #firstName(FIRST_NAME:VARCHAR), #lastName(LAST_NAME:VARCHAR) ",
"FROM EMPLOYEE",
"WHERE EMP_ID = @id"})
Employee selectEmployee(int id);
@Insert({"INSERT INTO EMPLOYEE (EMP_ID, FIRST_NAME, LAST_NAME)",
"VALUES (@id, @firstName, @lastName)"})
void insertEmployee(Employee emp);
@Delete("DELETE EMPLOYEE WHERE EMP_ID = @id")
void deleteEmployee(int id);
<리스트 14>와 같은 형식의 어노테이션도 사용 가능하게 된다. 여기서는 ResultClass와 PropertyResult를 추가적으로 어노테이션을 통해 정의한 것이다.
<리스트 14> ResultClass, PropertyResults를 사용하는 어노테이션 예제
@ResultClass (Department.class)
@PropertyResults({
@Result(property="id", column="DEPT_ID"),
@Result(property="name", column="NAME"),
@Result(property="employees",
nestedQuery=@QueryMethod(type=CompanyMapper.class, methodName="getEmployeesForDeparment", parameters="id"))
})
@Select("SELECT #id, #name FROM DEPARTMENT WHERE COMP_ID = @id ")
List
<리스트 15>와 같이 캐싱을 설정할 수도 있다.
<리스트 15> 캐싱 설정의 어노테이션 사용 예제
@CacheContext("Employee")
public class EmployeeMapper {
void insertEmployee(Employee emp);
Employee getEmployee(int id);
List
}
기존 설정이라면 다음과 같은 의미를 가진다.
<리스트 16> 캐싱 설정의 기존방식 예제
@flushCache
List
는 다음과 같은 의미를 가진다.
예제를 통해 보면 현재의 설정을 일일이 XML 파일에 적어야 할 사항을 어노테이션을 통해 설정을 함으로써 일단 XML 파일 내용의 갱신 문제에 좀 더 자유로워 질 수 있을 듯하다. 한편, 개발자가 초기 XML 설정 외에 대부분의 작업을 자바 소스에서 제어함으로써 작업도 한결 수월하게 할 수 있을 것이다.
XML 설정 향상
다음은 XML 설정 향상과 관련된 주요 내용들이다.
1. 필드와 생성자 파라미터 그리고 자바빈즈 프로퍼티에 결과 및 파라미터를 맵핑된다.
2. N+1 문제를 해결하는 조인 매핑과 groupBy는 사용이 더 쉬워진다. <리스트 17>의
3. 결과 맵과 파라미터 맵은 기본적으로 ‘자동 매핑’ 되고 이름이 일치하지 않는 프로퍼티만을 명시한다.
4. 기능적으로 좀 더 뛰어나면서 간단한 타입 핸들러 구현체와 데이터 타입 변환 필터를 제공할 것이다.
5. 가장 큰 변화는 XML 파일이 Mapper.class의 복사본과 함께 처리한다는 점이다. 이를테면 EmployeeMapper.xml은 클래스패스에 존재하는 EmployeeMapper.class를 위해 로드 된다. 해당 매퍼 클래스의 객체를 생성하면 자동으로 같은 이름의 매퍼 XML 파일이 로드 되는 형식이라고 짐작된다. 객체 생성에 따라 매퍼 XML 파일이 로드 되는 형식이라면 SQL 구문의 갱신이 3.0에서는 어느 정도 해결될 듯하다.
<리스트 17> Mapper용 XML설정
동적 SQL
현재의
<리스트 18> SQLSource를 확장한 동적 SQL시용 예제
public class GetAccountListSQL extends SQLSource {
public String getSQL(Object param) {
Account acct = (Account) param;
append("select * from ACCOUNT");
prepend(“WHERE”); // 다음의 append 앞에 기본적으로 추가한다.
if (exists(acct.getEmailAddress())) {
append("AND", "ACC_EMAIL like #EmailAddress#"); // 필요하다면 첫 번째 인자를 붙이겠지만 그렇지 않다면 첫 번째 인자는 무시된다.
}
if (greaterThan(0,acct.getID())) {
append("AND", "ACC_ID = #ID#");
}
prepend(); // 앞의 prepend 뒤에 아무 코드가 없다면 앞의 prepend를 지운다.
append ("order by ACCT_LAST_NAME");
}
}
<리스트 18>은 다음과 같이 사용할 수 있다.
@SQLSource(GetAccountListSQL.class)
List
또는 다음처럼도 가능하다.
그 외에 테이블 관계를 나타내기 위한 간단한 기능이 추가되고 SQL 생성을 지원하는 몇 가지 옵션도 추가될 것으로 보인다.
지금까지 개인적으로 원했던 기능 중에 3.0에서 추가되도록 활발히 진행 중인 것 위주로 살펴보았다. 하지만 곰곰이 생각해보면 아이바티스가 추구했던 간결함은 오히려 반감되고 있는 게 아닌가 하는 우려도 든다. 아이바티스의 장점은 간결함이다. JDBC에 익숙한 개발자라면 몇 시간의 교육만으로도 실제 프로젝트에 적용할 수 있을 정도다. 단점이라면 매핑 작업이 번거롭다는 점을 들 수 있을 것이다. 파라미터 맵과 결과 맵에 매핑해주는 작업이 JDBC를 그대로 사용하는 것보다 그렇게 쉬운 작업이 아니다. 그럼에도 불구하고 아이바티스를 많이 사용하게 되는 데에는 충분히 사용할만한 장점이 있기 때문일 것이다. 앞으로도 발전하는 아이바티스의 모습을 기대해 본다.
제공 : DB포탈사이트 DBguide.net
출처명 : 한국마이크로소프트 [2007년 9월호
피드 구독하기:
글 (Atom)