728x90

회사 내부 네트워크에서 회사내에 있는 가상 PC의 윈도우 터미널에 접속이 되지 않아 라우터의 설정을 좀 찾아보았습니다.

찾아보니 NAT Hairpin에 대한 설명을 찾을 수 있었고, WinBox에서 NAT Rule을 설정하는 방법을 찾아서 적용해 보았습니다.

아래는 EdgeRouter 매뉴얼에서 NAT Hairpin 을 설명한 글입니다.

 

일반적으로 NAT 포트 포워딩 룰은 *네트워크 바깥*에서 *네트워크 안*으로 hostname 또는 라우터의 퍼블릭 주소를 통해서 사용됩니다. 하지만 같은 로컬 네트워크 내의 로컬 서버의 주소는 더 사용하기 쉬운 NAT 헤어핀이 적용됩니다. 예를 들어, 사용자의 랩탑과 메일 서버가 같은 로컬 네트워크 내에 있는 경우, 혼란을 피하기 위해서 같은 로컬 내트워크 내에 있을 때나 그렇지 않을 때나 같은 서버명을 사용하기를 선호할 것입니다.

 

아래는 NAT Hairpin 설정 절차 예제입니다.

이 설정은 요약하자면 내부에서 외부 네트워크를 거쳤다가 다시 내부 네트워크로 접속하게 하는 것입니다.

 

I solved the problem. 

8)

 Fewi, thanks for your hints mate!

/1. Services hairpin to .10
     chain=dstnat action=dst-nat to-addresses=192.168.10.10 protocol=tcp 
     dst-address=!192.168.10.0/24 dst-address-type=local 
     dst-port=80,21
/2. NAT all traffic from local to internet
     chain=srcnat action=masquerade src-address=192.168.10.0/24 
     out-interface=WAN 
/3. NAT all traffic from local to local
     chain=srcnat action=masquerade protocol=tcp src-address=192.168.10.0/24 
     dst-port=80,21 

 192.168.10.0/24 is the local network segment.
192.168.10.10 is the local IP of the WEB/FTP server
There are TWO rules to be added, 1. and 3. above. Rule 2 is also necessary and is the well known rule which provides NAT for the local clients to the internet.
Rule 1. hairpinning, helped with the client's packet to reach the server. Rule 3. is for the server's response to reach back the local client.

I hope this will be helpful to others and I also hope in the near future this is documented in under wiki or in the user manual to become common knowledge to the user. 

:-|

 

 

위의 IP 주소에서 내부 IP 대역을 써주시면 됩니다. 참고되시길 바랍니다.

 

https://wiki.mikrotik.com/wiki/Hairpin_NAT

https://forum.mikrotik.com/viewtopic.php?f=13&t=36548#p179950

https://docs.buf4.com/edgemax/edgerouter-configuration/_204952134-EdgeRouter-NAT-Hairpin-Nat-Inside-to-Inside-Loopback-Reflection-.html

http://www.2cpu.co.kr/bbs/board.php?bo_table=QnA&wr_id=384899

728x90

'용어' 카테고리의 다른 글

thin client   (0) 2011.03.14
기간계/계정계/정보계/대외계  (0) 2011.03.10
웹 서버와 WAS(Web Application Server)의 정의  (0) 2010.08.19
JEUS의 DB 연결  (0) 2010.07.28
ISV (independent software vendor)  (0) 2010.06.03
728x90

thin client ; 씬클라이언트


씬클라이언트는 CD-ROM 드라이브, 디스켓 드라이브 및 확장 슬롯 등이 없이 오직 필수적인 장치들로서 구성되어, 중앙에서 관리할 수 있도록 설계된 업무용 PC로서 넷PC 또는 네트웍 컴퓨터 등과 비슷한 말이다. 이 용어는 네트웍 상의 소형컴퓨터들이 대개 근거리통신망이나 다른 서버들의 클라이언트의 역할을 하는 경향이 있다는 사실에서부터 출발하였다. 이 아이디어는 컴퓨터들의 기능을 오직 필수적인 응용에만 제한하기 때문에, 클라이언트에 설치된 응용프로그램의 측면에서 보면 "날씬한" 상태로 구매되는 경향이 있을 것이다.


씬클라이언트라는 용어는 다소 다른 개념을 가지고 있는 넷PC와 네트웍 컴퓨터 둘 모두에 대해 사용되고 있다. 넷PC는 인텔 마이크로프로세서와 윈도우 운영체계에 기반을 두고 있지만, 네트웍 컴퓨터는 오라클과 썬마이크로시스템즈에 의해 개념이 뒷받침되고 있는데, 반드시 인텔 마이크로프로세서가 사용되어야 하는 것이 아니며, 자바 기반의 운영체계를 사용한다.


씬클라이언트에 관한 아이디어는 특정 업무만 전담하는 저가형 PC 수요에 부응하는 데 있다. 씬클라이언트와 이를 보완하는 서버에 관한 수요는 1998년 동안에 빠르게 성장할 것으로 예상된다.


http://terms.co.kr/

728x90
728x90

기간계

새로운 솔루션 도입전 고객이 이전에 사용하던 시스템. (기존 시스템의 메인 업무에 해당하는 부분)

대부분 대형주전산기(main frame)을 총칭

 

계정계

금융권의 다양한 시스템 중 고객의 거래를 처리하는 핵심 시스템이다.특히 개인/법인/기타 고객들이 가진 ‘통장'에 관한 정보를 가지고 있기 때문에, 입금/ 출금/ 계좌이체/ 지로/ 신규 통장개설/통장 폐쇄 등의 전반적인 금융 업무가 모두 여기에 해당된다. 따라서 계정계는 은행 내 시스템의 여러 범주 가운데 가장 거대하고 중요한 시스템이다.

 

정보계

계정계가 고객의 거래를 관리한다면,정보계는 거래의 ‘기록’을 관리하고, 기록의 ‘통계’ 등을 관리하는 시스템이다.정보계 시스템은 기록을 바탕으로 예측,성과 측정, 결산 등의 업무를 처리한다. 흔히 데이터웨어하우스(DW)라고 부르는 시스템이 정보계 시스템의 중심이 된다. 정보계에서는 데이터로의 접근성에 대한 속도가 중요시되며, DW에 비하여 정보를 저정하는 기간이 짧다

 

대외계

각 금융기관의 대내외망을 연결하는 시스템으로 CD공동망, 타행환, 전자금융, 사이버증권, 기업뱅킹, 신용정보 등 다양한 금융서비스를 제공하는데 필요한 대내외 채널들을 통합적 관리함


http://blog.naver.com/bj2034?Redirect=Log&logNo=60048053873

728x90
728x90

웹 서버와 WAS(Web Application Server)의 정의 ]

웹서버와 WAS는 비슷한 개념이기 때문에 같이 또는 다르게 사용되는 단어 가운데 하나이다인터넷 확산 초기에는 웹서버라는 개념으로 통칭해서 사용했지만시간이 지남에 따라 WAS를 더 많이 사용하고 있다인터넷 사용자가 증가함에 따라각 웹 사이트는 보다 많은 사용자에게 원활한 서비스를 제공하기 위해 기능적인 layer를 나누게 되었고 여기서 웹서버와 WAS의 구분점이 생기게 된 것이다.

기능적으로만 본다면거의 대부분의 웹 서버가 웹 애플리케이션을 동작시킬 수 있겠지만 모두 웹 서버 혹은 WAS라고 부르는 것보다는 어떤 기능을 수행하는지에 따라즉 기능상의 분류를 통해 구분지어 사용해야 할 것이다.

 

구분 웹서버 WAS
설명 1. 웹브라우저(Web Client)에게 컨텐츠를 제공하는 서버이다. 즉 정적인 HTML이나 jpeg, gif같은 이미지를 HTTP 프로토콜을 통해 웹 브라우저에 제공한다.

2. 최근에는 웹서버에서도 내부 애플리케이션을 동작시킬 수 있는 컨테이너를 내장하고 있다.
서버단에서 애플리케이션을 동작할 수 있도록 지원한다. 일반적으로 컨테이너라는 용어로 쓰인다. 초창기에는 CGI, 그 이 후에는 Servlet, ASP, JSP, ASP, PHP등의 프로그램으로 사용되고 있다.

 

 

 

웹 서버와 WAS(Web Application Server)의 구성에 따른 분류 ]

 

1.     기본적인 웹 사이트 구성

 

 

 

 

<그림 1>은 웹 사이트의 가장 기본적인 구성 환경이다모든 콘텐츠를 한 곳에 집중시켜 웹 서버와WAS의 역할을 동시에 수행한다사용자가 많지 않거나 트래픽이 적을 때 효율적이며 간단한 구조로 개발 및 테스트 시스템 구성시 활용의 가치가 높다.

 

장점 : 사용자 증가에 따라 스위치 장비를 통해 로드 밸런싱을 수행하고여러대의 WAS를 통해 지원이 가능하다필요시에 추가로 WAS를 증설하는 구조라고 볼 수 있다.

단점 : WAS가 정적인 데이터(HTML/Image)의 처리와 동적인 데이터(웹 애플리케이션)의 처리를 동시에 수행하기 때문에 최적화 측면에선 바람직하지 않다또한 정적데이터의 입출력 처리를 위해 웹 애플리케이션의 수행을 방해할 수 있고그 반대의 경우도 있다.

 

 

 

 

2.     웹 서버와 WAS로 구성된 환경

 

 

 


 
<그림 2>는 웹 서버와 WAS의 기능적 분류를 통해 효과적인 분산을 유도한 형태이다정적인 데이터는 구조적으로 앞에 존재하는 웹 서버에서 처리하고동적인 데이터는 뒷단의 WAS가 처리한다.

 

사용자의 요청에 대해서 정적 데이터인 HTML과 자바스크립트 파일, CSS, Image 등을 앞단의 웹 서버에 위치시켜 처리함으로써 WAS로 서비스 요청이 넘어가지 않게 한다.

또한 웹 애플리케이션 서비스를 위치적으로 뒤편에 존재하는 WAS에 넘겨줌으로써 WAS는 웹 애플이케이션의 수행이 집중할 수 있다.

웹 서버 단에서 처리할 것과 WAS에게 넘겨질 것을 처리하는 방식은 웹 서버 단의 Configuration을 통해 처리할 수 있다특정 확장자나 디렉토리 업무를 WAS로 넘길지 여부는 웹 서버 단에서 처리한다.


 

3.     특정기능에 대한 서버를 별도로 두고 있는 환경

 

 

 

 

점점 화려해지는 UI를 자랑하는 페이지들이 많아짐에 따라 이미지의 비중이 증가하고이런 이미지들이 전체 네트워크 비중의 상당부분을 차지한다따라서 이미지 서버를 따로 구성해 네트워크 비중도 줄이면서 웹 서버와 WAS를 좀 더 효과적으로 사용할 수 있는 구조라 할 수 있다.

또는 특정 콘텐츠에만 집중적인 요청을 받는 경우도 있다예를 들어대학 입시 때 경쟁률 조회는 상당히 많은 사용자에 의해 조회가 되고, Reload 또한 빈번하게 일어나므로 특정시간 간격으로 HTML을 생성하고페이지를 특정 서버에 위치시켜 적절하게 부하를 분산시켜 해결이 가능하다.

 

장점 : 다양한 환경에 대한 대처가 빠름

 

단점 : 구조를 정확하게 이해하지 않았을 경우에는 개발 및 테스트에 많은 시간이 쓰임

  

 

4.     WAS단을 Logic으로 구분하여 구성

 

      

 

 

 

<그림 4>는 <그림 2>의 변경된 형태이다. WAS단의 프로그램이 많은 비중을 차지하는 경우, Presentation Logic을 담당하는 프로그램과 Business Logic을 담당하는 프로그램을 구분하는 구성이다이런 구성은 특정 로직 부분의 부하에 따라 적절한 대응을 할 수 있으나 구조가 복잡해지는 단점이 있다.

  

 

[ WAS 관련 용어 정의 ]

 

1.     자바 서블릿(Java Servlet)

자바를 사용하여 웹페이지를 동적으로 생성하는 서버측 프로그램 혹은 그 사양을 말하며흔히 서블릿이라고 한다.

자바 서블릿은 Java EE사양의 일부분으로주로 이 기능을 이용하여 쇼핑몰이나 온라인 뱅킹 등의 다양한 웹 시스템이 구현되고 있다. 비슷한 기술로는 펄 등을 이용한 CGI, PHP를 아파치 웹 서버 프로세스에서 동작하게 하는 mod_php, 마이크로소프트사의 IIS에서 동작하는 ASP 등이 있다. CGI는 요청이 있을 때마다 새로운 프로세스가 생성되어 응답하는 데 비해자바 서블릿은 외부 요청마다 프로세스보다 가벼운 쓰레드로써 응답하므로 보다 가볍다또한 자바 서블릿은 자바로 구현되므로 다양한 플랫폼에서 동작한다.

 

2.     엔터프라이즈 자바빈즈(Enterprise JavaBeans, EJB)EJB는 기업환경의 시스템을 구현하기 위한 서버측 컴포넌트 모델이다, EJB는 애플리케이션의 업무 로직을 가지고 있는 서버 애플리케이션이다. EJB사양은 Java EE의 자바 API중 하나로주로 웹 시스템에서 JSP는 화면 로직을 처리하고, EJB는 업무 로직을 처리한다.EJB의 종류는 세션 빈(Session Bean), 엔티티 빈(Entity Bean), 메시지 구동 빈(Message-driven Bean)이 있다.

 

3.     자바 메시지 서비스(Java Message Service, JMS)JMS는 자바 프로그램이 네트워크를 통해 데이터를 송수신하는 자바 API이다.

 

4.     자바 가상 머신(Java Virtual Machine, JVM)JVM은 자바 바이트코드를 수행할 수 있는 환경이다자바 바이트코드는 주로 자바를 컴파일하여 생성하지만다른 언어의 컴파일러에서도 생성할 수 있다자바 가상 머신은 자바 플랫폼의 기반을 이루며 다양한 하드웨어 기반 플랫폼에 포팅된다. JVM은 자바 플랫폼의 주요한 부분이며 마이크로소프트 윈도(95/98/NT)리눅스유닉스 오에스  등 대부분의 운영체제는 물론인터넷 익스플로러와 넷스케이프 등과 같은 웹 브라우저 등 여러 가지 플랫폼에 설치되어 사용될 수 있으며,휴대전화나 가전기기에도 설치할 수 있다따라서 자바 플랫폼은 여러 플랫폼을 지원하여 미들웨어로서의 역할과 플랫폼 스스로의 역할을 동시에 수행할 수 있다사용자는 자바 바이트코드로 컴파일된 자바 프로그램을 실행시키기 위해서 이 자바 가상머신을 이용하면 된다.

원 개발사인 썬 마이크로시스템즈에서 자바 가상 머신의 기준이 되는 표준판(Java SE과 표준판을 핸드폰이나 PDA 등 임베디드 기기용인 축소판(Java ME으로 구분하여 가상 머신을 배포하고 있다기업판(Java EE)의 경우에는 표준판의 자바 가상 머신을 기반으로 확장된 라이브러리 집합을 정의한 것이기 때문에 자바 가상 머신의 종류로 분류하기 애매하다 마이크로시스템즈에서 제공하는 자바 가상 머신 말고도 각 운영체제 개발사가 제공하는 자바 가상 머신이 있으며, GNUGCJ나 아파치 소프트웨어 재단(ASF: Apache Software Foundation)의 하모니(Harmony)와 같은 오픈 소스 자바 가상 머신도 존재한다이러한 공개 소프트웨어 단체의 움직임에 따라 썬 마이크로시스템즈에서도 자사의 자바 가상 머신 및 개발 도구 킷을 오픈 소스 정책에 맞추어 공개한 상황이다.

 

5.     힙 메모리(heap memory)

프로그램을 사용할 수 있는 자유 메모리프로그램 실행 시에 함수로 보내는 데이터 등을 일시적으로 보관해 두는 소량의 메모리와 필요시 언제나 사용할 수 있는 대량의 메모리가 있다이때소량의 메모리를 ‘스택이라 하고 대량의 메모리를 ‘이라 한다 ‘이 없어지면 메모리 부족으로 ‘이상 종료하게 된다.

 

6.     자바 서버 페이지(JavaServer Pages, JSP)HTML내에 자바 코드를 삽입하여  서버에서 동적으로 웹 페이지를 생성하여  브라우저에 돌려주는 언어이다Java EE 스펙 중 일부로  애플리케이션 서버에서 동작한다자바 서버 페이지는 실행시에는 자바 서블릿으로 변환된 후 실행되므로 서블릿과 거의 유사하다고 볼 수 있다하지만,서블릿과는 HTML 표준에 따라 작성되므로 웹 디자인하기에 편리하다이와 비슷한 구조인 것인 PHPASPASP.NET 등도 있다아파치 스트럿츠나 자카르타 프로젝트의 JSTL 등의 JSP 태그 라이브러리를 사용하는 경우에는 자바 코딩없이 태그만으로 간략히 기술이 가능하므로 생산성을 높일 수 있다. 클라이언트에서 서비스가 요청되면, JSP의 실행을 요구하고, JSP는  애플리케이션 서버의 서블릿 컨테이너에서 서블릿 원시코드로 변환된다그 후에 서블릿 원시코드는 바로 컴파일된 후 실행되어 결과를 HTML 형태로 클라이언트에 돌려준다.

 

7.     Java Database Connectivity(JDBC)

자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API이다. JDBC는 데이터베이스에서 자료를 쿼리하거나 업데이트하는 방법을 제공한다. JDBC Java로 작성된 프로그램을일반 데이터베이스에 연결하기 위한 응용프로그램 인터페이스 규격입니다이 응용프로그램 인터페이스는 데이터베이스 관리 시스템에 넘겨질 SQL 형태의 데이터베이스 접근요구 문장을각 시스템에 맞도록 바꾸어준다. API는 동적으로 올바른 Java 패키지를 로드하고, JDBC 드라이버 매니저에 등록하기 위한 메커니즘을 제공합니다드라이버 매니저가, JDBC connection을 생성하기 위한 connection factory로서 사용됩니다.

 

8.     Java Management eXtensions(JMX)

응용 프로그램 소프트웨어/객체/장치 (프린터 등및 서비스 지향 네트워크 등을 감시 관리를 위한 도구를 제공하기 위한 자바 API이다이러한 리소스는 MBean(Managed Bean)이라는 객체로 표현된다.

 

9.     Java Naming and Directory Interface(JNDI)

디렉터리 서비스에서 제공하는 데이터 및 객체를 발견(discover)하고 참고(lookup)하기 위한 자바 API이다.

 

 

출처 : http://round1tko.tistory.com/64

(출처의 링크글이 사라진 것 같습니다. 양해 부탁드립니다.)

728x90

'용어' 카테고리의 다른 글

thin client   (0) 2011.03.14
기간계/계정계/정보계/대외계  (0) 2011.03.10
JEUS의 DB 연결  (0) 2010.07.28
ISV (independent software vendor)  (0) 2010.06.03
2단계 커밋  (0) 2010.03.02
728x90

 

이번에는  JEUS에서 DB와의 연결기능을 제공하는

DataSource와 DBConnectionPool에 대해 알아보도록 하겠습니다.

 

 

▣ 제목

 

DataSource와 DBConnectionPool이란 무엇인가?

 

 

▣ 내용

 

1. JDBC란?

Java DataBase Connectivity.

Java에서 DataBase와 연동하기 위한 표준 기술을 말한다.

DB의 종류와는 상관 없이 표준 API를 사용하여 DB와의 연동을 할 수 있다.(물론 SQL은 DB별로 달라질 수 있음)

 

 

일반적은 JDBC 코딩 절차

1. JDBC Driver를 로딩 or 등록

2. DB에 대한 Connection 생성

    (DB와 소켓 연결이 되고 DB에 session 하나가 생성됨)

3. 수행할 SQL에 대해 Statement를 생성하고 Statement의 SQL을 수행

    (DB에서 SQL이 수행되고 cursor가 생성됨)

4. 3의 결과로 ResultSet이 생성되고 이것으로 부터 SQL의 수행결과를 조회함.

5. 반드시 ResultSet, Statement를 close

6. 반드시 Connection을 close

    (DB와 소켓 연결이 해제되고 DB의 session도 소멸됨)

 

 

위의 경우 문제점

매번 DB와의 Connection을 얻어서 SQL을 수행하는 구조는

DB와의 socket을 connect/close 하는 오버헤드,

DB에서 session의 생성/소멸 하는 오버헤드

가 있으며 이 부분이 실제로 DB의 부하 뿐만 아니라

AP의 수행시간 중 상당시간이 소요하게 된다.

즉, 속도나 부하측면에서 바람직하지 않다.

 

 

 

개선 방법

매번 DB와의 Connection을 얻어서 SQL을 수행하는 구조대신에

한 번 얻어온 DB와의 Connection을 끊지 않고 재사용하는 구조.

 

 

1. 먼저 Connection Pool에서는 DB로 부터 Connection을 미리 일정갯수 만큼 얻어와서 가지고 있는다.

2. AP에서 DB Connection이 필요한 경우 직접 DB와 연결을 맺지 않고

Connection Pool에 요청하여 Connection Pool이 가지고 있는 Connection들 중 사용가능한 Connection의

reference를 얻는다.(DB와 Connection을 새로 생성하는 것이 아님)

3. AP에서 필요한 작업을 수행한 후 Connection Pool로 사용했던 Connection을 반납한다.

 

이 때 Connection의 생성과 관계되는 어떠한 작업도 하지 않으며

기존에 DB로 부터 얻어온 Connection을 계속 재사용하게 된다.

Pooling을 하는 것과 하지 않는 것의 수행시간 차이는 수십배에 달한다.

 

 

 

2.  WAS에서 DB Connection Pooling 기능을 제공하지 않았던 시절에는?

해당 프로젝트의 선임급 개발자가 직접 DB Connection Pooling 기능을 하는 모듈을 작성하거나,

이미 공개되어있는 Connection Pool 라이브러리를 가져다 사용하였다.

직접 작성한 것이나 공개된 모듈은 안정성이나 여러 장애 상황에 취약한 점이 있다.(상용 WAS에서 제공하는 것에 비해)

그리고 구현된 API가 각 라이브러리 마다 천차만별이어서 서로 호환성이 없고

Connection Pool에서 Connection을 get, put 하는 코드가 서로 달랐다.

 

 

 

3. JEUS 에서 제공하는 DataBase Connection Pooling 기능

 

* DBConnectionPool

2번 항목에서 설명한 것과 동일한 형태의 Connection Pool 모듈이다.

Web Container(Servlet Engine)에 설정(container.xml, WEBMain.xml)하며 2번 항목의 것과 마찬가지로

Connection을 얻는 코드가 표준적이지 않다.

 

* DataSource

J2EE 스펙에서 정의되어 있는 DB 연결방식이다.

Pooling 기능을 제공하며, XA(분산트랜잭션) 기능을 제공한다.

즉, DBConnectionPool 과 기능상 동일하며 XA 기능을 제공한다.

DataSource는 JNDI 에 등록되어 있고, 표준화된 API를 사용하여 얻어올 수 있다.

J2EE Application(Servlet, JSP, EJB, ...)을 호환성있게 작성하려면 DataSource를 사용하여야 한다.

JEUS 서버 환경(JeusMain.xml, JEUSMain.xml)에 설정한다.

 

 

* 두 모듈의 장단점

DataSource를 사용하기 위해서는 JNDI 기반의 API를 사용하여 lookup하는 과정이 필요하다.

이 때 InitialContext 생성 및 lookup 시간에 약간의 시간이 더 소요된다.

DBConnectionPool은 DriverManager나 Driver 기반의 API를 사용하므로

DataSource에 비해 속도가 (아주)약간 빠르다.

대신 DBConnectionPool은 J2EE 표준이 아니다.

만일 J2EE 스펙에 맞추어 개발해야 하거나, XA 기능을 사용하거나, EJB를 사용한다면

DataSource를 사용해야 한다.

두 모듈의 기능적인 차이는 없다. 요즘은 대부분 DataSource를 사용하는 추세이다.

 

 

 

DBConnectionPool

 

 

▣ 내용

 

DBConnectionPool은 JEUS의 Servlet Engine에서 제공해 주는 DB Connection Pool이다.

이전 TechLetter에서 설명한 바와 같이 DBConnectionPool은 J2EE 표준이 아니며,

특정한 코드를 사용하여 Connection을 Pool 로 부터 얻어올 수 있다.

DBConnectionPool은 Servlet Engine이 존재하는 JVM에서만 참조할 수 있다.

Servlet Engine1에서 설정한 DBConnectionPool을 Servlet Engine 2에서 얻어올 수 없다는 이야기다.

 

간단한 샘플(JEUS 4.x, Oracle)

WEBMain.xml

-----------------------------------------------------------

<web-container>
    ...
    <db-connection-pool>
        <pool-name>oraclePool</pool-name>
        <pool-type>shared</pool-type>
        <connection-url>jdbc:oracle:thin:@192.168.0.2:1521:ora9i</connection-url>
        <driver-class-name>oracle.jdbc.driver.OracleDriver</driver-class-name>
        <connection-argument>user=scott;password=tiger</connection-argument>
        <dynamic-increment>false</dynamic-increment>
        <close-long-active-connection>true</close-long-active-connection>
        <max-active-time>300000</max-active-time>
        <db-pool-control>
            <min>2</min>
            <max>10</max>
            <step>2</step>
            <max-idle-time>300000</max-idle-time>
        </db-pool-control>
    </db-connection-pool>
    ...
</web-container>
-----------------------------------------------------------

 

 

설정항목(반드시 메뉴얼 참조하여 설정값의 의미를 정확하게 알아둘 것)

* pool-name

    DBConnectionPool의 이름. AP에서 DBConnectionPool을 찾을 때 사용.

* pool-type

    DBConnectionPool내의 Connection을 worker thread들이 공유할지 여부.

    반드시 shared로 사용할 것.

* connection-url

    해당 DB에 접속하기 위한 JDBC connection URL. DB마다 다름

* driver-class-name

    JDBC driver의 class name. DB마다 다름.

* connection-argument

    DB에 connection을 맺을 때 넘겨줄 정보. ";"로 구분.

    기본적으로 user, password를 포함해야 하고 기타 다른 옵션을 포함할 수 있음.

* dynamic-increment

    DBConnectionPool의 connection 갯수가 max에 도달하였을 때

    AP로 부터 connection 요청이 있는 경우에 DB와 Connection을 임시적으로 증가시킬지 여부.

    true라면 connection을 DB로 부터 하나 더 맺어서 AP에 넘겨주고, AP에서 해당 connection을

    반납하면 해당 connection은 DBConnectionPool로 반납하는 것이 아니라 DB와의 연결을

    완전히 해제해 버린다.

    false이면 DBConnectionPool에 다른 AP가 connection을 반납할 때 까지 대기한다.

* close-long-active-connection

   Pool로 부터 AP가 얻어간 connection이 <max-active-time> 동안 반환되지 않고 있는 경우에

   timeout으로 간주하고 강제로 connection을 회수하여 Pool로 반납한다.

   단, DB connection pool monitoring interval을 주기로 하여 검사하기 때문에

   반드시 여기에 지정된 시간과 일치하지는 않는다.

* max-active-time

   Pool로 부터 얻어온 connection의 timeout을 판단하는 시간주기

* min

   Pool의 초기 갯수

* max

    Pool의 최대 갯수

* step

   min -> max로 증가할 때의 증가폭

* max-idle-time

   DBConnectionPool 내의 connection 갯수가 min과 max 사이인 경우

   DBConnectionPool은 자체적으로 max 에서 min으로 줄어들려는 시도를 한다.

   이 때 이값을 초과하는 connection이 있는 경우 DBConnectionPool에서 제거하는 기준이 된다.

                                      

 

 

DBConnectionPool로 부터 Connection을 얻는 코드

메뉴얼을 보면 3종류의 코드가 나와 있으나 JDBC driver의 동기화와 관련된 문제가 많이 발생하기 때문에

반드시 반드시(매우 중요) 아래의 코드를 사용하도록 한다.

 

Driver myDriver = (Driver)Class.forName("jeus.jdbc.pool.Driver").newInstance();
Connection conn = myDriver.connect("jdbc:jeus:pool:oraclePool", null);

빨간글씨는 pool-name에 지정한 문자열이다.

 

 

▣ 참고사항

 

위의 설정예에서 설명한 설정항목은 기본적인 항목을 설명한 것이며

이외의 다른 수많은 설정항목이 존재하므로 반드시 메뉴얼을 숙지하여

사이트 지원시 적절하게 구성하여야 한다.

장애나 속도 저하를 유발할 수 있으므로

의미를 알 수 없는 설정이 있는 경우에는 반드시 메뉴얼이나 선배사원에게 문의 후 사용할 것.

 

 

이하 설정예.(사이트 지원시 복사/수정해서 사용하도록 한다.)

 

 

JEUS 3.x

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

Oracle

-----------------------------

    <DBConnectionPool
        ConnectionPoolID="sharedOraclePool"
        ConnectionPoolType="shared"
        ConnectionURL="jdbc:oracle:thin:@harry.freens.org:1521:ORA9i"
        DriverClassName="oracle.jdbc.driver.OracleDriver"
        ConnectionArguments="user=system;password=manager"
        CloseLongActiveConnection="true"
        MaxActiveTimeSecs="60">
            <DBPoolControl
                InitCapacity="2"
                MaxCapacity="10"
                IncrementRate="2"
                MaxIdleTimeSecs="300"/>
    </DBConnectionPool>

MS-SQL

--------------------------------

<Container>
    ...
    </ContextGroup>
    ...
    <DBConnectionPool MaxUseCount="-1"
        ConnectionPoolType="shared"
        CloseDelayMillis="-1"
        MaxActiveTimeSecs="-1"
        ConnectionPoolID="mssql_pool"
        ConnectionArguments="user=sa;password=xxx"
        DriverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver"
        DynamicIncrement="true"
        ConnectionURL="jdbc:microsoft:sqlserver://165.141.142.136:1433"
        LoginDelayMillis="-1"
        CloseLongActiveConnection="false"
        ConnectionTimeOutSecs="10">
        <DBPoolControl
            MaxCapacity="10"
            InitCapacity="5"
            MaxIdleTimeSecs="300"
            IncrementRate="2" />
        </DBConnectionPool>
    ...
</Container>

 

 

Informix

----------------------------------

<DBConnectionPool
    ConnectionPoolID="infor"
    ConnectionPoolType="shared"
    ConnectionURL="jdbc:informix-sqli://tmaxs1:1526/kangto94:informixserver=ids921"
    DriverClassName="com.informix.jdbc.IfxDriver"
    ConnectionArguments="user=informix;password=hope123"
    CloseLongActiveConnection="false"
    MaxActiveTimeSecs="60"
    DynamicIncrement="false"
    ConnectionTimeOutSecs="10">
    <DBPoolControl
        InitCapacity="4"
        MaxCapacity="10"
        IncrementRate="2"
        MaxIdleTimeSecs="300"/>
</DBConnectionPool>

 

DB2

--------------------------------------

  <DBConnectionPool
                ConnectionPoolID="ibmPool"
                ConnectionPoolType="shared"
                ConnectionURL="jdbc:db2:KFBCIDB"
                DriverClassName="COM.ibm.db2.jdbc.app.DB2Driver"
                ConnectionArguments="user=db2cibt;password=kfbcibt01"
                CloseLongActiveConnection="false"
                MaxActiveTimeSecs="60"
                DynamicIncrement="false"
                ConnectionTimeOutSecs="10">
                <DBPoolControl InitCapacity="0"
                        MaxCapacity="25"
                        IncrementRate="5"
                        MaxAliveTimeSecsWhenRequest="300"
                        MaxIdleTimeSecs="300"/>
  </DBConnectionPool>

 

 

 

JEUS 4.x

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

Oracle

---------------------------------

<web-container>
    ...
    <db-connection-pool>
        <pool-name>oraclePool</pool-name>
        <pool-type>shared</pool-type>
        <connection-url>jdbc:oracle:thin:@192.168.0.2:1521:ora9i</connection-url>
        <driver-class-name>oracle.jdbc.driver.OracleDriver</driver-class-name>
        <connection-argument>user=scott;password=tiger</connection-argument>
        <dynamic-increment>true</dynamic-increment>
        <close-long-active-connection>true</close-long-active-connection>
        <max-active-time>300000</max-active-time>
        <db-pool-control>
            <min>2</min>
            <max>10</max>
            <step>2</step>
            <max-idle-time>300000</max-idle-time>
        </db-pool-control>
    </db-connection-pool>
    ...
</web-container>

 

Sybase

-------------------------------------

    <db-connection-pool>
        <pool-name>sybaseTest</pool-name>
        <pool-type>shared</pool-type>
        <pooling-rule>stack</pooling-rule>
        <!-- sybase script examples     ip   : listen port -->
        <connection-url>jdbc:sybase:Tds:166.104.172.31:4000</connection-url>        
        <driver-class-name>com.sybase.jdbc2.jdbc.SybDriver</driver-class-name>
        <connection-argument>user=aaa;password=bbbb</connection-argument>
        <db-pool-control>
            <min>3</min>
            <max>10</max>
        </db-pool-control>
    </db-connection-pool>

 

MS-SQL

------------------------------------------

<web-container>
    ...
    <db-connection-pool>
        <pool-name>mssql_pool</pool-name>
        <pool-type>shared</pool-type>
        <connection-url>jdbc:microsoft:sqlserver://165.141.142.136:1433</connection-url>
        <driver-class-name>com.microsoft.jdbc.sqlserver.SQLServerDrive</driver-class-name>
        <connection-argument>user=sa;password=</connection-argument>
        <dynamic-increment>true</dynamic-increment>
        <close-long-active-connection>true</close-long-active-connection>
        <max-active-time>300000</max-active-time>
        <db-pool-control>
            <min>2</min>
            <max>10</max>
            <step>2</step>
            <max-idle-time>300000</max-idle-time>
            <max-alive-time>600000</max-alive-time>
        </db-pool-control>
    </db-connection-pool>
    ...
</web-container>

 

 

MySQL

---------------------------------------------

<web-container>
    ...
    <db-connection-pool>
        <pool-name>mysqlPool</pool-name>
        <pool-type>shared</pool-type>
        <connection-url>jdbc:mysql://localhost:3306/test</connection-url>
        <driver-class-name>org.gjt.mm.mysql.Driver</driver-class-name>
        <connection-argument>user=root;password=passwd</connection-argument>
        <dynamic-increment>true</dynamic-increment>
        <close-long-active-connection>true</close-long-active-connection>
        <max-active-time>300000</max-active-time>
        <db-pool-control>
            <min>2</min>
            <max>10</max>
            <step>2</step>
            <max-idle-time>300000</max-idle-time>
            <max-alive-time>600000</max-alive-time>
        </db-pool-control>
    </db-connection-pool>
    ...
</web-container>


 

 

▣ 제목

 

DataSource

 

 

▣ 내용

 

J2EE 표준?

DataSource는 J2EE 스펙에 포함되어 있다.

이 말은 J2EE Application 작성에서 DB와의 연동은 DataSource를 사용하는 것이 바람직하고

Connection을 얻는 코드나 사용법, 동작 등이 표준화 되어 있다는 말이다.

즉, 타 WAS로의 소스 수정 없이 migration 가능하다.

그리고 connection Pooling 뿐만 아니라 DBConnectionPool에서는 제공하지 않는 분산 환경에서의 Transaction(XA)

기능을 제공한다.(EJB에서는 반드시 DataSource를 사용해야 한다.)

 

DataSource는 JNDI 기반의 코드로 얻어온다.

DataSource는 JNDI 서버에 등록되어 있다가 InitialContext의 lookup() 메소드로 얻어올 수 있다.

즉, 원격(다른 JVM)에서도 InitialContext를 생성하여 DataSource를 얻어서 사용할 수 있다.

 

DataSource의 장점

1. JDBC 코딩시 DB정보에 대한 하드코딩이 필요없다. 설정은 JEUSMain.xml에 들어간다.

2. Pooling이 지원된다.

3. XA(분산트랜젝션)이 지원된다.

4. J2EE 표준이다.(모든 WAS에서의 사용 코드 동일)

5. 다른 JVM에서도 호출하여 사용할 수 있다.

 

JEUS에서 DataSource의 설정과 생성

DataSource는 JeusMain.xml(or JEUSMain.xml)에 설정한다.

JEUS는 기동시 jeus manager가 DataSource 설정을 읽어들여 JNDI에 DataSource를 등록(BIND)한다.

하지만 이 과정에서 DB와의 Connection이 생성되지는 않는다.

DataSource를 lookup()하는 JVM에 Pool이 생성되고 DB와의 Connection을 맺어서 Pool에 집어넣게 된다.

물론 최초 lookup 시에 한번만 Pool 초기화/생성이 이루어지게 된다.

(lookup 이 호출되기 이전에는 Pool이 생성되지 않음에 주의)

요약하면, DataSource는 jeus manager가 JNDI에 bind 시키며 DataSource를 JNDI에서 최초로 lookup할 때

(lookup하는)해당 JVM에서는 Pool이 생성되고 DB와 connection을 생성한다.

 

 

샘플로 알아보자(환경 : JEUS 4.x, Oracle)

----------------------------------------------------------

<jeus-system>

    ...

    <resource>
        <data-source>
            <database>
                <vendor>oracle</vendor>
                <export-name>jdbc/mohwDS</export-name>
                <data-source-class-name>oracle.jdbc.pool.OracleConnectionPoolDataSource</data-source-class-name>
                <data-source-name>oracle.jdbc.pool.OracleConnectionPoolDataSource</data-source-name>
                <data-source-type>ConnectionPoolDataSource</data-source-type>
                <database-name>dbs001</database-name>
                <user>gworks</user>
                <password>gworks</password>
                <server-name>152.99.129.41</server-name>
                <port-number>1521</port-number>
                <driver-type>thin</driver-type>
                <connection-pool>
                    <pooling>
                        <min>20</min>
                        <max>50</max>
                        <step>5</step>
                        <period>10</period>
                    </pooling>
                    <wait-free-connection>
                        <enable-wait>true</enable-wait>
                        <wait-time>15000</wait-time>
                    </wait-free-connection>
                    <operation-to>180000</operation-to>
                </connection-pool>
            </database>
        </data-source>
        ...
    </resource>
----------------------------------------------------------

 

설정항목

* database

   이 태그 하나가 DataSource 설정 1개를 나타낸다.

* vendor

   DB제공업체. oracle, db2, sybase, others 등의 값을 갖는다.

* export-name

   JNDI에 등록될 이름. JNDI에 등록될 이름은 중복되면 안된다.

* data-source-class-name

   DataSource에서 사용될 JDBC driver내의 class name.

   DB 마다 다르며 data-source-type에 따라서도 달라진다.

* data-source-name

   일반적으로 data-srouce-class-name을 따른다.

* data-source-type

   용도에 따라 DataSource, ConnectionPoolDataSource, LocalXADataSource, XADataSource 중 선택

* database-name

   Database의 이름. Oracle은 SID.

* user

   DB의 user. OS의 user와는 별개임.

* password

   DB user의 password

* server-name

   DB 의 IP or hostname. hostname을 사용할 경우 hosts 파일에 등록되어 있어야 함.

* port-number

   DB 의 listen port

* driver-type

   JDBC driver type. DB 마다 다름.

* min

  Pool의 최소값

* max

   Pool의 최대값

* step

   min에서 max로 증가시 증가폭

* period

   max에서 min으로 감소할 때 제거할 connection 판단 기준시간.(주의 : 분단위임.)

* wait-free-connection

   pool의 connection이 모두 사용중이어서 사용가능한 connection이 없을 때

   AP에서 getConnection()을 호출한 경우의 동작에 대한 설정부분.

   enable-wait이 true이면 wait-time에 지정된 시간만큼 기다리고

   false이면 대기하지 않고 (아마도)null을 리턴할 것이다.(or Exception 발생)

   만일 wait-time에 지정된 시간만큼 기다려도 connection을 얻지 못하는 경우는

   Exception이 던져진다.

* operation-to

   DB와의 연동 작업시 time out 시간.

 

이외에도 많은 설정항목이 있으므로 반드시 메뉴얼을 숙지하여

각 설정항목에 대해 명확히 이해하도록 한다.

 

 

DataSource의 4가지 type

* DataSource

   Connection만 반환한다. Pooling 기능 없음.

* ConnectionPoolDataSource

   Pooling 기능을 하며 connection을 반환한다.

* XADataSource

   Pooling 기능을 하며 XA(분산트랜젝션)을 지원하는 connection을 반환한다.

* LocalXADataSource

   Pooling 기능을 하며 connection을 반환한다.

   Local DB(단일 DB에 단일 user를 사용하는 경우)인 경우 XADataSource처럼 동작한다.(트랜젝션 지원)

 

일반적으로 트랜젝션 지원이 필요없는 작업에는 ConnectionPoolDataSource를 사용한다.

트랜젝션이 지원되는 DataSource인 경우에는 ConnectionPoolDataSource보다

시스템과 DB에 부하를 많이 주게 된다.

트랜젝션 지원이 필요한 작업(EJB, UserTransaction 등)에는 XADataSource나 LocalXADataSource를

사용한다. LocalXADataSource는 실제로는 ConnectionPoolDataSource이지만

단일DB(단일user)에 대해서는 XA처럼 동작하는 DataSource이다.

따라서 multi-DB가 아닌 경우에는 트랜젝션이 필요한 경우에 LocalXADataSource를 사용하는 것이

속도나 부하 측면에서 유리하다.

 

그리고 DataSource type에 따라서 <data-source-class-name>, <data-source-name> 의 설정값이

달라지므로 주의한다.

 

type별 class name

DataSource
  For Oracle : oracle.jdbc.pool.OracleDataSource
  For Sybase : com.sybase.jdbc2.jdbc.SybDataSource
  For db2: COM.ibm.db2.jdbc.DB2DataSource
ConnectionPoolDataSource and LocalXADataSource
  For Oracle : oracle.jdbc.pool.OracleConnectionPoolDataSource
  For Sybase: com.sybase.jdbc2.jdbc.SybConnectionPoolDataSource
  For db2: COM.ibm.db2.jdbc.DB2ConnectionPoolDataSource
XADataSource
  For Oracle : oracle.jdbc.xa.client.OracleXADataSource
  For Sysbae : com.sybase.jdbc2.jdbc.SybXADataSource
  For db2: COM.ibm.db2.jdbc.DB2XADataSource

 

 

▣ 참고사항

 

XADataSource는 트랜젝션을 container에서 관리하기 때문에

AP에서 명시적인 트랜젝션 관리(Connection.setAutocommit(xxx), commit(), rollback())는

Exception이 발생한다.

 

XADataSource를 사용하는 경우에 트랜젝션에 포함되지 않는 select 문장의 수행은

원칙적으로 ConnectionPoolDataSource를 사용해야하나

개발의 편의를 위해 select 문장의 수행도 XADataSource를 사용하는 경우에는

반드시 transaction delegation 기능을 사용하여야 한다.

 

EJB에서 트랜젝션을 사용할 경우나 UserTransaction을 사용할 경우

반드시 XADataSource나 LocalXADataSource를 사용하여야 한다.

 

DataSource는 JEUS 시스템 내(servlet engine, ejb engine, jms engine 등) 뿐만 아니라

단독 java application에서도 JNDI의 lookup 코드를 사용하여 DataSource기능을 사용할 수 있다.

단, DB의 Connection Pool은 JNDI 서버내에 생기는 것이 아니라 해당 JVM에 생기고

Pool은 해당 JVM의 종료시에 소멸된다.

 

 

 

JEUS 3.x 설정샘플

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

Oracle

--------------------------

<JeusSystemConfig>
 <DataSource>
  <Database>
   <Vendor>oracle</Vendor>
   <ExportName>dbsource</ExportName>
   <DatabaseName>orcl</DatabaseName>
   <DataSourceClassName>oracle.jdbc.pool.OracleConnectionPoolDataSource</DataSourceClassName>
   <DataSourceName>oracle.jdbc.pool.OracleConnectionPoolDataSource</DataSourceName>
   <ServiceName/>
   <Description/>
   <NetworkProtocol/>
   <Password>tiger</Password>
   <PortNumber>1521</PortNumber>
   <ServerName>192.168.85.1</ServerName>
   <User>scott</User>
   <DriverType>thin</DriverType>
   <DataSourceType>ConnectionPoolDataSource</DataSourceType>
   <ConnectionPool>
    <MinPoolSize>2</MinPoolSize>
    <MaxPoolSize>6</MaxPoolSize>
    <IncreasingStep>1</IncreasingStep>
    <ResizingPeriod>10</ResizingPeriod>
    <OperationTimeout>30000</OperationTimeout>
    <WaitForFreeConnection>
     <WaitingTime>10000</WaitingTime>
    </WaitForFreeConnection>
   </ConnectionPool>
  </Database>
 </DataSource>

 

MS-SQL

----------------------------

        <Database> 
            <Vendor>unknown</Vendor> 
            <ExportName>sqlDS</ExportName> 
            <DataSourceClassName>jeus.jdbc.driver.blackbox.BlackboxConnectionPoolDataSource</DataSourceClassName> 
            <Property> 
                <Name>URL</Name> 
                <Type>java.lang.String</Type> 
                <Value>jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=testDB;SelectMethod=cursor</Value> 
            </Property> 
            <Property> 
                <Name>DriverClassName</Name> 
                <Type>java.lang.String</Type> 
                <Value>com.microsoft.jdbc.sqlserver.SQLServerDriver</Value> 
            </Property> 
            <Property> 
                <Name>Password</Name> 
                <Type>java.lang.String</Type> 
                <Value>iidol</Value> 
            </Property> 
            <Property> 
                <Name>User</Name> 
                <Type>java.lang.String</Type> 
                <Value>iidol</Value> 
            </Property>             
            <DataSourceType>ConnectionPoolDataSource</DataSourceType> 
            <ConnectionPool> 
                <MinPoolSize>1</MinPoolSize> 
                <MaxPoolSize>2</MaxPoolSize> 
                <IncreasingStep>1</IncreasingStep> 
                <ResizingPeriod>10</ResizingPeriod> 
                <OperationTimeout>30000</OperationTimeout> 
                <WaitForFreeConnection> 
                    <WaitingTime>10000</WaitingTime> 
                </WaitForFreeConnection> 
            </ConnectionPool> 
        </Database>

 

 

 

Sybase

---------------------------

<DataSource> 
    <Database>
        <Vendor>sybase</Vendor> 
        <ExportName>test_sy</ExportName> 
        <DatabaseName>master</DatabaseName> 
        <DataSourceName>com.sybase.jdbc2.jdbc.SybConnectionPoolDataSource</DataSourceName> 
        <Description>test11</Description> 
        <NetworkProtocol /> 
        <Password>xlaortm</Password> 
        <PortNumber>4100</PortNumber> 
        <ServerName>pollux5</ServerName> 
        <User>sa</User> 
        <DriverType /> 
        <DataSourceType>ConnectionPoolDataSource</DataSourceType>
        <ConnectionPool> 
            <MinPoolSize>6</MinPoolSize> 
            <MaxPoolSize>10</MaxPoolSize> 
            <IncreasingStep>2</IncreasingStep> 
            <ResizingPeriod>3</ResizingPeriod> 
        </ConnectionPool> 
    </Database> 
</DataSource>

 

 

 

Informix

-----------------------------

    <DataSource>
        <Database>
            <Vendor>unknown</Vendor>
            <ExportName>datasource1</ExportName>
            <DataSourceClassName>jeus.jdbc.driver.blackbox.BlackboxConnectionPoolDataSource</DataSourceClassName>
            <Property>
                <Name>URL</Name>
                <Type>java.lang.String</Type>
                <Value>jdbc:informix-sqli://61.33.32.126:1526/bank959:informixserver=tmax5</Value>
            </Property>
            <Property>
                <Name>DriverClassName</Name>
                <Type>java.lang.String</Type>
                <Value>com.informix.jdbc.IfxDriver</Value>
            </Property>
            <Property>
                <Name>Password</Name>
                <Type>java.lang.String</Type>
                <Value>7skswkddl</Value>
            </Property>
            <Property>
                <Name>User</Name>
                <Type>java.lang.String</Type>
                <Value>root</Value>
            </Property>               
            <DataSourceType>ConnectionPoolDataSource</DataSourceType>
            <ConnectionPool>
                <MinPoolSize>4</MinPoolSize>
                <MaxPoolSize>4</MaxPoolSize>
                <IncreasingStep>1</IncreasingStep>
                <ResizingPeriod>10</ResizingPeriod>
                <OperationTimeout>30000</OperationTimeout>
                <WaitForFreeConnection>
                    <WaitingTime>10000</WaitingTime>
                </WaitForFreeConnection>
            </ConnectionPool>
        </Database>
     </DataSource>

 

 

JEUS 4.x

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

 

DB2

--------------------------------

<jeus-system>
    . . .
    <resource>
        <data-source>
            <database>
                <vendor>db2</vendor>
                <export-name>db2local</export-name>
                <data-source-class-name>
                    COM.ibm.db2.jdbc.DB2ConnectionPoolDataSource
                </data-source-class-name>
                <data-source-type>LocalXADataSource</data-source-type>
                <database-name>SAMPLE</database-name>
                <description>Customer DB</description>
                <password>jeus2013</password>
                <encryption>false</encryption>
                <port-number>0</port-number>
                <server-name/>
                <user>db2inst1</user>
                <connection-pool>
                    <pooling>
                        <min>2</min>
                        <max>4</max>
                        <step>1</step>
                        <period>10</period>
                    </pooling>
                    <wait-free-connection>
                        <enable-wait>true</enable-wait>
                        <wait-time>10000</wait-time>
                    </wait-free-connection>
                    <operation-to>30000</operation-to>
                </connection-pool>
            </database>
            . . ..
        </data-source>
        . . .
    </resource>
</jeus-system>

 

 

Oracle

----------------------------

<jeus-system>

 

    <resource>
        <data-source>
            <database>
                <vendor>oracle</vendor>
                <export-name>jdbc/mohwDS</export-name>
                <data-source-class-name>oracle.jdbc.pool.OracleConnectionPoolDataSource</data-source-class-name>
                <data-source-type>ConnectionPoolDataSource</data-source-type>
                <database-name>dbs001</database-name>
                <data-source-name>oracle.jdbc.pool.OracleConnectionPoolDataSource</data-source-name>
                <user>gworks</user>
                <password>gworks</password>
                <port-number>1521</port-number>
                <server-name>152.99.129.41</server-name>
                <driver-type>thin</driver-type>
                <connection-pool>
                    <pooling>
                        <min>20</min>
                        <max>50</max>
                        <step>5</step>
                        <period>10</period>
                    </pooling>
                    <wait-free-connection>
                        <enable-wait>true</enable-wait>
                        <wait-time>15000</wait-time>
                    </wait-free-connection>
                    <operation-to>180000</operation-to>
                </connection-pool>
            </database>
        </data-source>
        ...
    </resource>

 

 

Sybase

-----------------------

<resource>
        <data-source>
                <database>
                        <vendor>sybase</vendor>
                        <export-name>pms</export-name>
                        <data-source-class-name>com.sybase.jdbc2.jdbc.SybConnectionPoolDataSource</data-source-class-name>
                        <data-source-type>ConnectionPoolDataSource</data-source-type>
                        <database-name>smaf</database-name>
                        <data-source-name>com.sybase.jdbc2.jdbc.SybConnectionPoolDataSource</data-source-name>
                        <description>pms DB</description>
                        <network-protocol>Tds</network-protocol>
                        <user>smaf</user>
                        <password>smaf2003</password>
                        <encryption>false</encryption>
                        <port-number>6100</port-number>
                        <server-name>210.103.193.3</server-name>
                        <connection-pool>
                                <pooling>
                                        <min>10</min>
                                        <max>100</max>
                                        <step>5</step>
                                        <period>10</period>
                                </pooling>
                                <wait-free-connection>
                                        <enable-wait>true</enable-wait>
                                        <wait-time>10000</wait-time>
                                </wait-free-connection>
                                <operation-to>30000</operation-to>
                        </connection-pool>
                </database>
        </data-source>
</resource>

 

 

Informix

--------------------------

<jeus-system>
    . . .
    <resource>
        <data-source>
            <database>
                <vendor>others</vendor>
                <export-name>informixdatasource</export-name>
                <data-source-class-name>
       jeus.jdbc.driver.blackbox.BlackboxConnectionPoolDataSource
                </data-source-class-name>
                <data-source-type>
                    ConnectionPoolDataSource
                </data-source-type>
                <connection-pool>
                    <pooling>
                        <min>4</min>
                        <max>8</max>
                        <step>1</step>
                        <period>600000</period>
                    </pooling>
                    <wait-free-connection>

728x90

'용어' 카테고리의 다른 글

기간계/계정계/정보계/대외계  (0) 2011.03.10
웹 서버와 WAS(Web Application Server)의 정의  (0) 2010.08.19
ISV (independent software vendor)  (0) 2010.06.03
2단계 커밋  (0) 2010.03.02
ERP (enterprise resource planning)  (0) 2010.01.21
728x90

ISV (independent software vendor)

ISV는 하나 이상의 컴퓨터 하드웨어나 운영체계 플랫폼에서 실행되는 소프트웨어 제품을 만들고 판매하는 회사를 말한다. 마이크로소프트, IBM, 휴렛패커드, 애플 등과 같이 플랫폼을 만드는 회사들은, "비즈니스 파트너"라고 불리는 특별한 계획에 의거하여 ISV를 격려하고, 지원을 제공한다. 일반적으로, 하나의 플랫폼에서 더 많은 응용프로그램들이 실행되면, 고객들에게 더 많은 가치를 제공하게 된다. 물론, 마이크로소프트, IBM 등과 같은 플랫폼 제작회사들도 역시 응용프로그램들을 만들지만, 모든 것을 자체적으로 만들기에는, 요구되는 자원이나 특별한 지식들을 가지고 있지 못한 경우가 대부분이다. 윈도우95나 매킨토시 플랫폼에서 실행되는 모든 프로그램들을 생각해보면, 거기에 얼마나 많은 ISV들이 있는지를 알게 될 것이다. 일부 ISV들은 IBM의 소규모 비즈니스용 AS/400 등과 같이 특정 운영체계에 초점을 맞추며, 거기에는 수천 개 이상의 ISV 응용프로그램들이 있다. 다른 ISV들은 공학 등과 같은 특정 응용분야에 특화되어 있으며, 주로 최상위 유닉스 기반의 워크스테이션 플랫폼에 사용되는 소프트웨어를 개발한다.

ISV는 플랫폼에 추가되는 소프트웨어를 만들고 판매한다. OEM 회사들은 대형 제품을 만들기 위하여 하드웨어 플랫폼 구성요소들을 사용한다. VAR들은 자신들의 소프트웨어 제품 패키지에 플랫폼 소프트웨어를 통합시킨다.

  • 웍그룹 서버를 만드는 회사인 Galacticomm에서 자사의 Showcased ISV Software를 위한 웹페이지를 제공합니다.
  • IBM에서는 자신들의 제품을 위한 ISV들에 관한 정보를 고객들에게 제공합니다. 예를 들어, CICS 트랜잭션 서버를 지원하는 ISV에 관한 정보가 들어 있는 페이지가 여기에 있습니다.
  • 마이크로소프트는 써드파티 소프트웨어라고 부르는 것에 관한 비슷한 정보를 제공합니다.

www.terms.co.kr

728x90

'용어' 카테고리의 다른 글

웹 서버와 WAS(Web Application Server)의 정의  (0) 2010.08.19
JEUS의 DB 연결  (0) 2010.07.28
2단계 커밋  (0) 2010.03.02
ERP (enterprise resource planning)  (0) 2010.01.21
클래스패스와 환경 변수, 그것이 알고 싶다.   (0) 2010.01.05
728x90

2단계 커밋 (2-phase commit)이란?

2단계 커밋은 커밋(Commit)과 취소(Abort)를 수행하는데 두 단계를 거친다는 말이다.
첫 번째 phase는 준비단계로서, 데이터베이스는 커밋을 위한 모든 준비를 수행한다.
분산 트랜잭션에 참여한 모든 데이터베이스가 준비단계를 성공한 후에야 두 번째 phase인 커밋단계가 수행되는 것이다.
만약 분산 트랜잭션에 참여한 어느 한 데이터베이스라도 prepare를 실패한다면 두 번째 phase는 커밋이 아닌 취소를 수행한다.

여기서 분산 트랜잭션이란 네트워크에 분산되어 있는 자원들에 트랜잭션을 수행하는 것을 말한다.
예를 들어, 어떤 어플리케이션이 MS-SQL과 오라클에 데이터를 트랜잭션 하에서 수행해야 한다면 분산 트랜잭션이 필요하다. 대개의 경우 분산 트랜잭션은 턱시도, 티맥스, 엔트라와 같은 TP 모니터나 EJB, COM+ 등과 같은 컴포넌트 기반 미들웨어가 그 기능들을 제공한다.
분산 트랜잭션의 반대되는 개념으로서 로컬 트랜잭션은 단일 자원(데이터베이스)에 대한 커밋과 롤백을 수행하며 1-phase 커밋으로 트랜잭션을 수행한다.

 

많은 트랜잭션은 하나의 RM (보통 데이터베이스)만을 포함하고 있다. 이 경우 RM은 보통 트랜잭션을 확약하고 롤백하기 위한 대부분의 작업을 수행한다. (거의 모든 트랜잭션성 RM이 자체적인 트랜잭션 관리자를 내장하고 있는데, 이는 지역 트랜잭션, 즉 그 RM만이 참여한 트랜잭션을 처리할 수 있다.)

그러나 트랜잭션이 두 개, 혹은 그 이상의 RM (아마도 두 개의 개별적인 데이터베이스, 혹은 데이터베이스와 JMS 큐, 또는 두 개의 개별적인 JMS provider)을 포함하고 있다면 "모두 처리하든지 아니면 아무것도 처리하지 않는"다는 의미론이 그 RM 내에서 뿐 아니라 트랜잭션 내의 모든 RM에게 적용되도록 하고 싶을 것이다. 이런 경우 TPM은 2단계 확약을 전개할 것이다.

2단계 확약에서 TPM은 각 RM에게 "준비" 메시지를 보내어 그 RM이 준비가 되었고 트랜잭션을 수행할 수 있는지 물어본다. 모든 RM으로부터 긍정적인 답을 받으면 자신의 트랜잭션 로그에 트랜잭션이 확약되었다고 기록한 후 모든 RM에게 그 트랜잭션을 확약하라고 지시한다. 만일 어느 한 RM이라도 실패한다면, 재구동시 TMP에게 장애가 일어나는 시점에 미완으로 남아있던 트랜잭션의 상태에 대하여 질의하고, 그들을 확약하거나 혹은 롤백한다.

2단계 확약을 사회 생활에 비유해 보면 결혼식을 들 수 있다. 목사나 판사가 먼저 신랑, 신부에게 각각 "당신은 그/그녀를 당신의 남편/아내로 받아들이겠습니까?"하고 물어본다. 신랑, 신부 모두 "네"라고 대답하면 둘은 모두 결혼했음이 선언된다.; 그렇지 않다면 둘 모두 결혼하지 않은 상태로 남을 것이다. 누가 먼저 "네"라고 대답했는지에 상관없이, 한 사람은 결혼했는데 다른 쪽은 결혼하지 않은 상태로 남는 경우는 없다.



 


다음은 텀즈에 있는 2PC (2-phase commit)에 대한 정의 이다.

분산 컴퓨팅 환경에서 사용자의 트랜잭션을 처리하는데 있어, 트랜잭션 관리 프로그램은 트랜잭션에 관련된 모든 데이터베이스가 성공적으로 수정되었음을 확실하게 하기 위하여 2단계 커미트라고 불리는 프로토콜을 사용할 수 있다. 만일 데이터베이스의 수정이 성공적으로 이루어지지 않은 경우에, 그 트랜잭션은 롤백 상태가 되어 트랜잭션이 개시되기 이전의 상태로 되돌아간다. 만약 그 트랜잭션이 관련된 컴퓨터들에 의해 성공적으로 종료되었다면, 모든 데이터베이스의 수정을 위한 커미트가 이루어지며, 새로운 트랜잭션들이 자유로이 접근할 수 있도록 자원에 걸려 있던 로크들이 풀어진다.

아래에 이 프로토콜에 관한 간략한 설명이 있다.

  1. 한 컴퓨터 내에 있는 트랜잭션 관리 프로그램은 대체로 최초 요구에 연계되어, 관련된 모든 컴퓨터들을 대신하여 트랜잭션을 조정한다. 트랜잭션 관리 프로그램은 "트랜잭션 시작"이라는 내용을 로그 파일에 기재하고, 관련된 다른 컴퓨터들에게 트랜잭션 요청을 보낸다.

  2. 참여하고 있는 각 컴퓨터들은 자신의 로그에 트랜잭션을 기재하고, 다른 사용자가 쓸 수 없도록 데이터베이스 자원에 로크를 걸어 데이터베이스 변경을 수행하고, 트랜잭션 관리 프로그램에게 "커미트 할 준비가 되었다"는 메시지를 보낸다.

  3. 관리 프로그램은 관련된 모든 컴퓨터들로부터 "커미트 할 준비가 되었다"는 메시지를 받은 뒤에, 트랜잭션이 종료되었다는 사실을 로그 파일에 기재하고 나서, 모든 컴퓨터들에게 트랜잭션을 커미트 하라고 통보한다.

  4. 참여하고 있는 각 컴퓨터는 이 사실을 트랜잭션 로그 내에 기록한 다음, 자원에 걸려있던 로크를 풀어준다.

  5. 만약 모든 컴퓨터들이 트랜잭션을 커미트 하기 전의 어느 순간에 하나 이상의 컴퓨터에서 문제가 발생하면, 관리 프로그램은 트랜잭션이 시작되기 전의 상태로 되돌리도록 롤백 메시지를 전파한다.




응용 프로그래머에게 있어서의 2단계 커미트는 BEGIN, COMMIT, 그리고 필요한 경우 ROLLBACK 등의 프로그램 요청을 함으로써 구현된다. 

728x90

'용어' 카테고리의 다른 글

JEUS의 DB 연결  (0) 2010.07.28
ISV (independent software vendor)  (0) 2010.06.03
ERP (enterprise resource planning)  (0) 2010.01.21
클래스패스와 환경 변수, 그것이 알고 싶다.   (0) 2010.01.05
DBMS의 종류  (0) 2010.01.04
728x90
ERP (enterprise resource planning) ; 전사적 자원 관리

ERP[이알피]란 제조업을 포함한 다양한 비즈니스 분야에서 생산, 구매, 재고, 주문, 공급자와의 거래, 고객서비스 제공 등, 주요 프로세스 관리를 돕는 여러 모듈로 구성된 통합 애플리케이션 소프트웨어 패키지를 뜻하는 산업 용어이며 재무 및 인적자원을 위한 모듈 또한 포함되어 있다.

일반적으로 ERP시스템은 관계형 데이터베이스를 기반으로 통합된 시스템의 형태이며, ERP시스템 구축은 비즈니스 프로세스 분석, 사용자 재훈련, 새로운 작업절차 등을 포함한다.

최근, ERP 아웃소싱을 제공하는 대표적인 ERP 패키지로는 SAP R/3, 오라클 Application, Peoplesoft, J. D. Edwards, BPCS 등이 있으며, 국내 패키지로는 삼성SDS의 Uni ERP, 영림원의 K시스템, 한국기업전산원의 탑 ERP 등이 있다.



ERP의 특징

1.

다국적, 다통화(多通貨), 다언어 지원
대부분의 ERP패키지는 다국적, 다통화, 다언어를 지원하고 있다. 여러 나라의 상거래 방식, 생산 방식을 패키지에서 지원하며 기업은 필요한 기능을 선택하여 사용할 수 있다.

2.

통합 시스템
ERP는 기업 활동 전 부분에 걸쳐있는 자원을 하나의 체계로 관리한다. 정보의 일관성, 실시간 처리로 인한 신속성 등은 기업의 경쟁력 제고에 중요한 기반을 제공한다.

3.

Best Practice에 의한 BPR 지원
ERP는 기업의 업무를 위한 기능을 "Best Practice"에 기반하여 제공한다. Best Practice는 세계의 일류 기업이 사용하는 업무 처리 프로세스를 공통화시킨 프로세스를 말하는데, 이를 자사에 도입함으로써 비즈니스 프로세스 리엔지니어링(BPR)을 실현하는 효과를 볼 수 있다.

4.

통합 데이터베이스
ERP의 업무 프로세스는 중앙의 데이터베이스를 매개로 기업활동 전반에 걸쳐 통합되어 있다. 통합 데이터베이스를 통해 하나의 정보는 한번만 입력되며 입력된 정보는 가공하지 않은 데이터로 어느 업무에서도 참조될 수 있다.

5.

매개변수 설정에 의한 단기간의 도입과 개발
ERP패키지는 매개변수 설정을 통해 필요한 기능을 구현하는 방식이다. 매개변수 설정을 이용하여 단기간에 시스템을 도입할 수 있다.

6.

개방형 시스템
대다수의 ERP시스템은 특정 하드웨어에 의존하지 않는 개방형 시스템이다. 다양한 하드웨어를 조합하여 클라이언트/서버 구조의 시스템을 구축할 수 있고 확장성도 뛰어나다.

728x90

'용어' 카테고리의 다른 글

ISV (independent software vendor)  (0) 2010.06.03
2단계 커밋  (0) 2010.03.02
클래스패스와 환경 변수, 그것이 알고 싶다.   (0) 2010.01.05
DBMS의 종류  (0) 2010.01.04
OLE DB에 대한 이야기  (0) 2009.12.17
728x90

클래스패스와 환경 변수, 그것이 알고 싶다. 
김세곤 
2001년 4월 17일 


서론 
초보 자바 프로그래머를 괴롭히는 큰 문제 중에 그놈의 클래스패스는 빠지지 않는다. 클래스패스는 사실 이렇게 하나의 글로 설명하기조차 매우 부끄러운 사소한 것인데, 초보 자바 프로그래머에게는 절대 사소하지 않은 것이 현실이다. 더군다나, 가슴 아프게도 대부분의 자바 관련 서적은 클래스패스에 지면을 할애할 만한 형편도 안되고, 대부분의 저자들이 별것도 아닌 것에 공들여 설명하려 하지 않기 때문에, 당연히 클래스패스에 대해서는 많은 독자들이 제대로 이해하지 못한 채 끙끙댄다. 한편으로는, 이것은 기초를 제대로 다지지 않은 독자들의 책임이 크다. 클래스패스를 잘 설정해서 자바 프로그램을 컴파일하고 실행하는 기술은 자바 언어의 첫번째 단추이고, 이 내용은 대부분의 자바 책(자바 관련 서적이 아닌 자바 그 자체를 설명하는 책)에서는 설명이 되어 있기 때문이다.

필자는 JSP Bible이라는 책을 집필하고 독자로부터 많은 질문을 받았는데, 거짓말 보태지 않고 50% 이상의 독자가 클래스패스로 골머리를 썩고 있었다. JSP로 웹 개발을 시도하려 한다면 자바 언어의 첫번째 단추인 클래스패스와 컴파일 정도에는 문제가 없어야 하는데, 아쉽게도 이 첫번째 단추를 못 껴서 진도를 못 나가다니 가슴 아픈 현실이 아닐 수 없다. 

가장 좋은 방법은 역시 자바 언어를 제대로 공부하고 나서 JSP, Servlet, EJB 등 그 다음 단계의 공부를 진행하는 것이다. 그런데, 이유야 어찌 됐건, 대부분의 독자들은 자바에 대한 기초없이 응용 단계인 JSP, Servlet, EJB 등으로 마구 앞질러 나간다. 그리고, 막히면 다시 자바 언어를 체계적으로 공부하지 않고, 끙끙거리며 당장 진도를 나가려고 발버둥친다. 이 대목에서 찔리는 독자 여러분들이 분명히 많을 것이다. 

솔직히 말해서, 필자는 JSP Bible 집필 당시에 자바의 생기초라 할 수 있는 클래스패스 설정하기 및 컴파일하기 등에 대해서 이렇게 많은 독자들이 모르리라고 예상하지 못했다. 그리고, 끊임없이 클래스패스에 대한 질문을 받으면서, 같은 답변을 계속 하다보니 이제는 클래스패스에 대한 질문만 만나면 경기가 난다. 

필자는 이 글로 더 이상 클래스패스나 환경 변수 혹은 컴파일하기 등에 관련된 질문이 없기를 간절히 기대한다. 더 나아가서 많은 자바를 공부하고자 하는 개발자들이 제발 자바 언어에 대해서는 탄탄하게 기초를 다졌으면 한다. 

클래스 이름과 패키지 
갑돌이가 A.java 라는 자바 프로그램을 만들었다고 하자. 그리고, 자신의 컴퓨터 C 드라이브의 myClass라는 폴더에 A.java를 컴파일한 A.class를 넣어 두었다고 치자. 그리고는 A.class를 잘 사용하다가 어느날 똑순이가 만든 클래스를 사용할 일이 있어서 똑순이의 클래스들을 건네 받았는데, 그 중에 A.class라는 같은 이름의 클래스가 있다는 사실을 알았다. 갑돌이는 갑자기 답답해졌다. 자, 어찌 하면 갑돌이가 만든 클래스 A와 똑순이가 만든 클래스 A를 구별할 수 있을까? 

해답은 바로 패키지이다. 

갑돌이의 회사는 gabdol이고, 똑순이의 회사는 ddogsun이므로, 이 이름을 클래스 이름 A에 붙여쓰면 구별이 될 수가 있는 것이다. 갑돌이의 클래스 A의 이름을 gabdol.A로 똑순이의 클래스 A의 이름을 ddogsun.A로 사용하면 고민이 해결된다는 말이다. 그런데, 덕팔이의 회사 이름이 갑돌이의 회사 이름과 같다면 또 이름이 충돌하게 된다. 그렇다면 전세계에서 유일한 이름을 클래스 이름 앞에 붙여주면 아주 간단해진다. 전세계에서 유일한 이름으로는 머리속에 팍 떠오르는 것이 회사의 도메인 명이다. 갑돌이네 회사가 www.gabdol.com이라는 도메인 이름을 소유하고 있다면, 갑돌이네 회사에서 만드는 모든 클래스의 이름을 com.gabdol.A와 같은 식으로 만들면 문제가 해결된다. 바로, 이 com.gabdol이 클래스 A의 패키지 이름이 되는 것이다. 만일, 갑돌이네 회사가 두 개의 자바 소프트웨어를 개발했는데, 둘 다 A.java라는 클래스가 있다면 이를 또 구별해야 한다. 이런 경우라면 com.gabdol 뒤에 임의로 갑돌이네 회사가 알아서 패키지 이름을 만들면 된다. 두 개의 소프트웨어 이름이 sw1, sw2라고 하면 com.gabdol.sw1.A, com.gabdol.sw2.A 식으로 클래스 이름을 사용하는 것이다. 

이렇게 패키지를 사용하게 되면 이름 충돌의 문제도 해결할 수 있을 뿐만 아니라, 클래스를 분류하기도 쉽다. 예를 들어, 갑돌이네 회사에서 고객에 관련된 클래스들의 패키지 이름을 com.gabdol.client로 하고, 상품에 관련된 클래스들의 패키지 이름을 com.gabdol.product로 정하면 클래스들의 성격을 패키지 이름만 보고도 쉽게 파악할 수 있는 것이다. 

클래스의 위치 
이제, 갑돌이가 만드는 클래스의 이름이 com.gabdol.sw1.A로 정해졌다고 하자. 그렇다면 이 클래스는 어디에 위치해야 할까? com.gabdol.sw2.A와 같은 폴더에 존재하면 안 되므로, 패키지 이름에 따라 클래스의 위치가 유일하게 구별될 수 있어야 한다. 갑돌이는 자신의 클래스르 모두 C:\\myClass라는 폴더에 두고 있으므로, com.gabdol.sw1.A 클래스는 C:\\myClass\\com\\gabdol\\sw1 폴더에 두고, com.gabdol.sw2.A 클래스는 C:\\myClass\\com\\gabdol\\sw2 폴더에 두면 두 클래스가 충돌하지 않을 것이다. 이렇게 하면, 소스 파일과 컴파일된 클래스 파일이 다음처럼 위치하게 된다. 

C:\\myClass\\com\\gabdol\\sw1\\A.java 
C:\\myClass\\com\\gabdol\\sw1\\A.class 
C:\\myClass\\com\\gabdol\\sw2\\A.java 
C:\\myClass\\com\\gabdol\\sw2\\A.class 


이제, 패키지의 이름에 따른 클래스의 위치에 대해서 감이 오는가? 

패키지 선언과 임포트 
com.gabdol.sw1.A 클래스의 패키지는 com.gabdol.sw1이고 com.gabdol.sw2.A 클래스의 패키지는 com.gabdol.sw2이다. 이 정보는 당연히 두 소스 코드 내에 들어가야 한다. 방법은 간단하다. C:\\myClass\\com\\gabdol\\sw1\\A.java 코드의 첫머리에 다음의 한 줄만 쓰면 된다. 


package com.gabdol.sw1; 


여기서, com.gabdol.sw1.A 클래스가 com.gabdol.sw2 패키지에 들어있는 클래스들을 사용하고 싶다고 하자. 어떻게 해야 할까? 방법은 두 가지이다. 

첫번째는 클래스의 이름을 완전히 써 주는 것이다. 다음처럼 말이다. 


package com.gabdol.sw1; 
... 
com.gabdol.sw2.B b = new com.gabdol.sw2.B(); 
... 


이렇게 하면 클래스 B가 com.gabdol.sw2 패키지 내에 있는 것이 드러나므로 컴파일 시에 문제가 없다. 

두번째는 패키지를 임포트(import)하는 것이다. 다음처럼 하면 된다. 


package com.gabdol.sw1; 
import com.gabdol.sw2.*; 
... 
B b = new B(); 
... 


위의 코드의 import com.gabdol.sw2.*; 부분은 com.gabdol.sw1.A 클래스가 com.gabdol.sw2 패키지 내의 클래스들을 사용하겠다는 뜻이다. 이렇게 하면 자바 컴파일러가 B b = new B(); 부분을 컴파일하면서 B라는 클래스를 com.gabdol.sw1.A가 속해있는 com.gabdol.sw1 패키지와 임포트한 com.gabdol.sw2 패키지 내에서 찾게 된다. 만일, com.gabdol.sw1과 com.gabdol.sw2 패키지에 모두 B라는 이름의 클래스가 있다면 당연히 컴파일러는 어떤 것을 써야할지 모르므로 에러를 낸다. 이 경우에는 다음처럼 하는 수밖에 없다. 


package com.gabdol.sw1; 
import com.gabdol.sw2.*; 
... 
com.gabdol.sw1.B b1 = new com.gabdol.sw1.B(); 
com.gabdol.sw2.B b2 = new com.gabdol.sw2.B(); 
... 


import com.gabdol.sw1.*과 같이 *를 사용하면 com.gabdol.sw1 패키지 내의 모든 클래스를 사용하겠다는 뜻이고, com.gabdol.sw1.B 클래스만 사용한다면 import com.gabdol.sw1.B라고 명시하면 된다. 

클래스패스 
이제, 갑돌이는 C:\\myClass\\com\\gabdol\\sw1\\A.java 파일을 컴파일하려 한다. 갑돌이는 C:\\myClass\\com\\gabdol\\sw1\\ 폴더로 이동해서 다음처럼 할 것이다. 

javac A.java 


결과는 당연히 클래스 B를 찾을 수 없다는 에러 메시지이다. com.gabdol.sw1.B 클래스가 컴파일된 바이트코드인 B.class가 도대체 어디에 있는지 자바 컴파일러로서는 알 길이 없기 때문이다. 이 때 필요한 것이 클래스패스이다. 갑돌이가 다음처럼 하면 컴파일이 성공적으로 이루어진다. 

javac -classpath C:\\myClass A.java 


여기에 "-classpath C:\\myClass" 부분은 자바 컴파일러에게 C:\\myClass폴더를 기준으로 패키지를 찾으라는 뜻이다. 즉, com.gabdol.sw1.B 클래스는 C:\\myClass 폴더를 시작으로 C:\\myClass\\com\\gabdol\\sw1 폴더에서 찾고, com.gabdol.sw2.B 클래스는 C:\\myClass\\com\\gabdol\\sw2 폴더에서 찾는 것이다. 

그런데, 갑돌이는 돌쇠에게 건네 받은 클래스들을 C:\\otherClass 라는 폴더에 저장하고 있었는데, 이 중에 일부 클래스를 A.java에서 사용할 일이 생겼다. 돌쇠가 건네 준 클래스는 com.dolsse.ddol 이라는 패키지에 포함되어 있고, 이 클래스들은 C:\\otherClass\\pr\\com\\dolsse\\ddol 폴더에 있다면, 돌쇠가 준 클래스들은 C:\\otherClass\\pr 폴더를 시작으로 찾아야 한다. 따라서, 돌쇠의 클래스를 사용하는 A.java 파일을 컴파일하기 위해서는 다음처럼 해야 한다. 

javac -classpath "C:\\myClass;C:\\otherClass\\pr" A.java 


이렇게 하면 C:\\myClass 폴더에 저장되어 있는 com.gabdol.sw1.A, com.gabdol.sw2.B 클래스와 C:\\otherClass\\pr 폴더에 저장되어 있는 com.dolsse.ddol.* 클래스들을 자바 컴파일러가 제대로 찾을 수 있게 되는 것이다. 

A.java를 컴파일해서 얻어진 클래스를 직접 실행하려면 자바 가상 머신을 구동해야 하는데, 이 때에서 당연히 A.class가 사용하는 다른 클래스를 자바 가상 머신이 찾을 수 있어야 한다. 따라서, 역시 컴파일할 때와 마찬가지로 클래스패스가 필요하다. A.class를 실행하려면 다음처럼 해야 한다. 

java -classpath "C:\\myClass;C:\\otherClass\\pr" com.gabdol.sw1.A 


실행할 때에는 실행하고자 하는 클래스의 패키지 이름까지 명시해야 한다. 왜냐하면, 자바 가상 머신이 클래스를 실행할 때에는 지정된 이름이 패키지 이름을 포함한 것으로 생각하기 때문이다. 만일, 다음처럼 한다면, 

java -classpath "C:\\myClass;C:\\otherClass\\pr" A 


자바 가상 머신은 C:\\myClass\\A.class 혹은 C:\\otherClass\\pr\\A.class를 찾으려고 할 것이다. 

클래스패스란 여러 폴더에 산재한 클래스들의 위치를 지정해서 패키지에 따라 클래스를 제대로 찾을 수 있게 해 주는 값이다. 

환경 변수 
매번, 컴파일할 때와 실행할 때에 classpath 옵션에 클래스패스를 명시하는 것을 불편하다. 한 번의 설정으로 이런 문제를 해결하기 위해서 환경 변수라는 것을 사용한다. 많은 독자들이 역시 환경 변수가 무엇인지, 어떻게 설정하는지 모르는 경우가 많으므로 여기서 잘 정리해 보겠다. 

환경 변수는 말 그래로 변수에 어떤 값을 저장시키되 이를 환경에 저장하는 것이다. 환경에 저장한다는 말은 그 환경 내의 모든 프로그램이 그 변수의 값을 알 수 있게 된다는 뜻이다. 여러분이 윈도우 95/98/Me의 도스창 혹은 윈도우 NT/2000의 명령창을 실행시키면, 그 명령창 내에서 각종 프로그램을 구동할 수가 있는데, 이 때, 그 명령창의 환경에 변수 값을 설정하면 그 명령창 내에서 구동되는 프로그램들은 환경 변수 값을 얻을 수가 있게 된다. 

명령창 내에서 환경 변수를 설정하는 방법은 간단하다. 

C:\\> SET 변수이름=값 


혹은 

C:\\> SET 변수이름="값" 


처럼 하면 된다. 여러분의 명령창 또는 도스창을 띄워서 다음처럼 해 보자. 

C:\\> SET myname="Hong Gil Dong" 


이렇게 하면 환경 변수 myname에는 "Hong Gil Dong"이 설정된다. 제대로 설정이 되었는지 확인해 보기 위해서는 다음처럼 하면 된다. 

C:\\> echo %myname% 
"Hong Gil Dong" 


첫 번째 줄은 환경 변수 myname의 값을 출력하라는 명령이고, 두 번째 줄은 그 결과가 나온 것이다. 

환경 변수는 메모리가 허락하는 양만큼 설정할 수 있다. 즉, 다음처럼 복수 개의 환경 변수를 설정할 수 있다는 말이다. 

C:\\> SET myname="Hong Gil Dong" 

C:\\> SET yourname="Kim Gap Soon" 


자, 이번에는 이 명령창을 종료하고 다른 명령창을 띄워 보자. 그리고, 다음처럼 myname 환경 변수의 값을 출력해 보자. 

C:\\> echo %myname% 
%myname% 


두 번째 줄과 같은 결과가 나온다. 조금 전에 설정했던 값을 온데간데 없다. 왜 그럴까? 이유는 간단하다. 환경 변수는 그 명령창 내에서만 존재하기 때문이다. myname 변수를 설정한 명령창을 종료했기 때문에, 이와 동시에 myname 환경 변수가 사라진 것이다. 또, myname 변수를 설정한 명령창을 종료하지 않았다고 해도, 다른 명령창에서는 myname 변수 값을 공유하지 않는다. 오로지, 변수를 설정한 그 명령창 내에서만 그 변수는 의미가 있게 되는 것이다. 

이렇게 환경 변수가 명령창 내에서만 의미가 있기 때문에, 온갖 프로그램에서 공유하기 위해서는 명령창에서 환경 변수를 설정하는 방법 외에 다른 방법을 사용해야 한다. 윈도우 95/98/Me라면 autoexec.bat 파일을 사용하고, 윈도우 NT/2000이라면 글로벌 환경 변수를 설정하는 별도의 방법이 존재한다. 

우선, 윈도우 NT/2000이라면 다음처럼 한다. 

1. 바탕화면의 "내 컴퓨터"를 오른쪽 클릭한다. 

2. "고급" 메뉴를 택한다. 

3. 가운데 "환경 변수" 메뉴를 택한다. 

4. 두 창이 나오는데 위 쪽은 특정 로그인 사용자에 대한 환경 변수를 설정하는 것이고, 아래 쪽은 모든 사용자에게 적용되는 환경 변수를 설정하는 것이다. 관리자(Administrator) 권한을 갖고 있다면 아래 시스템 변수의 값을 설정할 수 있다. 상황에 맞게 선택하면 된다. 

5. 버튼이 "새로 만들기", "편집", "삭제"가 있는데, 새로운 환경 변수를 만드는 경우에는 "새로 만들기"를 클릭하고, 기존 변수 값을 수정하고자 한다면 "편집"을 누른다. "삭제"는 물론 변수를 아예 없애는 경우에 클릭한다. 

6. "새로 만들기"나 "편집"을 클릭하면 변수 이름과 값을 설정하게 되어 있는데 여기에 원하는 이름과 값을 입력하면 된다. 


윈도우 95/98/Me라면, autoexec.bat 파일을 편집기로 열어서 "set 변수이름=값"을 아무데나 추가하면 된다. 

자, 이제는 글로벌 환경 변수에 클래스패스 변수를 설정해 보자. 

윈도우 NT/2000이라면 위의 단계를 차례로 실행한 후에, 이미 CLASSPATH 혹은 classpath 변수가 있다면 이를 편집하고, 없다면 새로 만들기를 하면 된다. 지금까지 예로 든 대로라면 다음의 값을 입력하면 된다. 

C:\\myClass;C:\\otherClass\\pr 

<김상욱 주: 이렇게만 하면 한 디렉토리에서 방금 만들어진 클래스파일 즉 현재 디렉토리의 클래스파일을 찾지 못하기 때문에 현재 디렉토리를 나타내는 . 을 추가한다.> 

<즉, .\\C:\\myClass;C:\\otherClass\\pr 이렇게 입력하여야 합니다.> 


윈도우 95/98/Me라면 autoexec.bat 파일을 열어서, 다음의 한 줄을 추가한다. 

set CLASSPATH="C:\\myClass;C:\\otherClass\\pr" 

<김상욱 주: 마찬가지 이유로 set CLASSPATH=".;C:\\myClass;C:\\otherClass\\pr" 로 입력되어야 합니다.> 


그렇다면, 자바 컴파일러와 자바 가상 머신은 이렇게 설정한 환경 변수와는 어떤 관계가 있을까? 자바 컴파일러와 자바 가상 머신은 -classpath 옵션을 지정하지 않으면 환경 변수 CLASSPATH 혹은 classpath의 값을 시스템으로부터 얻어서 이를 클래스패스로 사용한다. 클래스패스의 값을 환경 변수로부터 얻을 수 있도록 애초부터 만들어진 것이다. 

jar 파일과 클래스패스 
jar 파일은 클래스들을 묶어 놓은 것이다. 즉, 갑돌이는 자신이 만든 com.gabdol 이하의 모든 클래스를 하나의 파일인 gabdol.jar 파일로 묶을 수가 있다. 이렇게, gabdol.jar 파일을 C:\\gg\\cc 폴더 아래에 두었다면 이 압축 파일 내의 클래스를 역시 자바 컴파일러와 자바 가상 머신이 찾을 수 있도록 해야 한다. 이 때에는 파일 이름까지 포함해서 클래스패스에 추가해야 한다. 다음처럼 말이다. 

set CLASSPATH=C:\\gg\\cc\\gabdol.jar;C:\\myClass;C:\\otherClass\\pr 


마치며 


지금까지 자바 프로그램의 가장 기초라고 할 수 있는 클래스패스에 대해서 알아 보았다. 필자는 이 글로 더 이상의 클래스패스에 대한 질문이 사라졌으면 하는 바램이다. 독자 여러분이 클래스패스를 고민하는 것도 시간 낭비이고, 저자가 이에 대해서 일일이 답변해 주는 것도 시간 낭비라고 생각된다. 만일, 독자 여러분이 클래스를 찾지 못한다는 에러를 만난다면 100% 클래스패스 설정 잘못이므로, 이 글을 잘 읽어서 근본적으로 클래스패스에 대해서 이해한 후에 문제를 해결하는 노력을 기울이도록 하자. 

728x90

'용어' 카테고리의 다른 글

2단계 커밋  (0) 2010.03.02
ERP (enterprise resource planning)  (0) 2010.01.21
DBMS의 종류  (0) 2010.01.04
OLE DB에 대한 이야기  (0) 2009.12.17
아카이빙(Archiving) 과 백업(Backup) 의 차이점  (0) 2009.11.12
728x90

DBMS의 종류



대표적 상용 DBMS의 간략히 소개하고자 한다.

① Oracle

 Oracle사의 대표적인 제품으로써 전 세계적으로 가장 많은 수요자 층을 확보하고 있는 제품이다. 현재 Oracle10g버전이 출시되어 있다. 유닉스, 리눅스, 윈도우 버전이 따로 있으며 리눅스 버전의 경우에는 홈페이지에서 다운로드 받아 개발용으로 사용할 수 있다.


Oracle Korea 홈페이지 (http://www.oracle.co.kr)

 

 

② Microsoft SQL Server

 마이크로소프트의 대표적인 데이터베이스 시스템이다. 윈도우 환경에서 가장 많이 사용되고 있으며 비주얼 베이직과의 직접적인 프로그래밍도 가능하다. Windows 2000 서버나 Windows 2003 서버를 사용하는 시스템에서 활용되고 있으며 SQL Server2005까지 출시되었다.


Microsoft의 SQL Server 홈페이지 (http://www.microsoft.com/sql/


 

③ DB2

 IBM의 DB2(Data Base 2)는 1983년에 발표된 상업용 관계 데이터 베이스 관리 시스템으로서 MVS/XA와 MVS/370 운영체제에서 사용되며, SQL을 데이터 언어로 사용하여 다수의 사용자들이 여러 개의 관계 데이터 베이스를 동시에 접근할 수 있는 대형 데이터 베이스를 위한 시스템이다. 현재 DB2 9까지 출시 되었다.


IBM DB2 소개 홈페이지 (http://www-306.ibm.com/software/data/db2/v9/)

④ Sybase

 Sybase는 엔터프라이즈 정보시스템 구축을 위한 Client/Server 환경에서 가장 강력한 데이터베이스 관리시스템 소프트웨어로, 데스크탑 환경에서뿐만 아니라 엔터프라이즈 컴퓨팅에 이르기까지 토탈 솔루션 제공한다. 기존에 RDBMS 들의 단점을 보완한 Client/Server 아키텍처를 기본 사상으로 개발되어, 하드웨어 플랫폼과 무관한 개방형 시스템 구조로 확장성과 상호 운용성, 신뢰성 및 가용성을 최대의 장점으로 부각된 제품이다.


Sybase 홈페이지 (http://www.sybase.com)

⑤ Informix

 Informix사의 Informix DBMS는 객체지향기술을 접목하여 Image, Audio, Video, TimeSeries 등 비정형 Data의 탁월한 통합처리를 보장하며 OLTP에서부터 DataWare Housing, Data Marts, Internet / Intranet / Extranet, GIS, Entertainment산업에 이르는 모든 Application을 지원하는 시스템이다.


Informix 홈페이지 (http://www.informix.com/

⑥ Microsoft Access

 마이크로소프트의 대표적인 개인용 데이터베이스 관리 시스템이다. Office 프로그램에 제공되며, 비주얼 베이직에서 기본적으로 활용하는 데이터베이스이다. MDB라는 확장자를 가지고 저장되며, 윈도우에만 사용이 가능하다.

728x90

+ Recent posts