애자일 개발 프로세스의 개념
애자일 개발 프로세스란, 어느 특정 개발 방법론을 가리키는 말은 아니고, "애자일(Agile=기민한, 좋은것을 빠르고 낭비없게 만드는 것) 개발을 가능하게 해주는 다양한 방법론 전체를 지칭하는 말이다. 예전에는 애자일 개발 프로세스는 "경량(Lightweight)"프로세스로 불렸다. 익스트림 프로그래밍 (XP:eXtreme Programming)이 애자일 개발 프로세스의 대표적인 방법이라 볼수 있다.


애자일 개발 프로세스의 배경
애자일 프로세스의 배경에는 소프트웨어 개발 자체가 과거와 양상이 바뀌었다는 전제가 있다. 90년대 후반까지의 소프트웨어 개발은 장기간에 걸쳐 많은 사람들을 투입하고 충분한 비용을 투입하여 진행하는 것이었다. 소프트웨어 공학이나 많은 관리 방법론들이 모두 이러한 종류의 프로젝트를 대상으로 삼고 있다.

그러나 지금의 소프트웨어는 개발기간이 짧고 적은 비용을 투입한다. 게다가 매우 복잡하고 개방적이다. 또한, 사회의 상황이나 시장의 변동에 따라 변화가 심하고 요구사항도 시시각각 변해가고 있다. 그래서 이미 고전적인 소프트웨어 공학이나 관리 기법 만으로는 대처할수 없게 되었다.

이런 문제에 대한 기술적인 해결책으로 "객체지향(OO:Object Oriented)"이 있다. 객체지향 기술은 그동안의 개발 문제를 적절하게 대처해 주었다. 그리고, 객체지향 개발을 하기 위해서는 그에 적합한 개발 프로세스가 필요했다. 그래서 수많은 애자일 개발 프로세스가 이러한 필요에 따라 만들어졌다. 따라서, 애자일 개발 프로세스의 상당수는 객체지향 기술을 기반으로 한다.

애자일 개발 프로세스는, 제한된 시간과 코스트 안에서 정보는 불완전하고 예측은 불가능 하다는 전제를 가진다.그리고 그 전제아래에서 합리적인 답을 내도록 하는 것이 애자일 개발 프로세스이다.


애자일 개발 프로세스와 전통적인 개발 프로세스와의 차이
전통적인 개발 프로세스들은 폭포수 모델과 계획 기반 개발을 따르는 반면, 애자일 개발 프로세스는 그에 반한다는 점에서 가장 큰 차이를 가진다.
폭포수 모델과 계획 기반 개발 기법들은, 일련의 차례와 탄탄한 계획을 기반으로 하여 개발을 진행시킨다. 이것은, 이해하기도 쉽고 사용하기도 쉬운 바람직한 기법이기도 하지만, 이로 인해서 많은 부작용이 생길 수 있다. 가장 큰 부작용이 발생할 때는, 계획대로 진행되지 않을 경우이다. 이럴경우에는 다음과 같은 부작용이 발생하게 된다.

  • 납기일 전 철야
  • 철야에도 불구하고 납기일 지연
  • 지연에 따른 비난과 스트레스가 개발자에게 향하여 에너지 소진
  • 결국 납기된 솔루션은 고객의 요구를 충족하지 못함

이런 부작용은 근본적인 개발 프로세스 접근법의 차이에서 나타난다. 전통적인 개발 프로세스들은 공업에서 사용하는 정형적 프로세스 제어 모델을 따르고 있다. 정형적 프로세스 제어모델은, 동일한 입력에 대해서 동일한 결과가 기대 될 경우에 적합하다. 하지만, 소프트웨어를 포함한 IT의 개발은 경험적 프로세스 제어 모델로 접근할 필요가 있다. 경험적 프로세스 제어 모델은 항상 불확실성을 수반하고 포용하고 있다. 애자일 개발 프로세스는 경험적 프로세스 제어모델로 개발을 관리한다.


애자일 개발 프로세스의 종류
애자일 개발 프로세스로 불리우는 개발 방법론에는 다음과 같은 것들이 있다.

  • 익스트림 프로그래밍, XP - 애자일 개발 프로세스의 대표자로 애자일 개발 프로세스의 보급에 큰 역할을 하였다. 이 방법은 고객과 함께 2주 정도의 반복개발을 하고, 테스트와 우선 개발을 특징으로 하는 명시적인 기술과 방법을 가지고 있다.
  • 스크럼 - 30일마다 동작 가능한 제품을 제공하는 스플린트를 중심으로 하고 있다. 매일 정해진 시간에 정해진 장소에서 짧은시간의 개발을 하는 팀을 위한, 프로젝트 관리 중심의 방법론이다.
  • 크리스탈 패밀리 - 이 방식은 프로젝트의 규모와 영향의 크기에 따라서 여러종류의 방법론을 제공한다. 그중에서 가장 소규모 팀에 적용하는 크리스탈 클리어는 익스트림 프로그래밍 만큼 엄격하지도 않고 효율도 높지 않지만, 프로젝트에 적용하기 쉬운 방법론이다.
  • Feature-Driven Development - feature마다 2주정도의 반복 개발을 실시한다. Peter Coad가 제창하는 방법론으로써, UML을 이용한 설계 기법과도 밀접한 관련을 가진다.
  • Adaptive Software Development, ASD - 소프트웨어 개발을 혼란 자체로 규정하고, 혼란을 대전제로 그에 적응할 수 있는 소프트웨어 방법을 제시하기 위해 만들어진 방법론이다. 내용적으로는 다른 방법론들과 유사하지만, 합동 어플리케이션 개발(Joint Application Development, 사용자나 고객이 설계에 참가하는 개발 방법론)을 사용하고 있는것이 조금 다르다.
  • 익스트림 모델링 - 익스트림 모델링은 UML을 이용한 모델링 중심 방법론이다. 다만, 여타 모델링 방법들과는 달리, 항상 실행가능 하고 검증가능한 모델을 작성하는 공정을 반복해서, 최종적으로는 모델로부터 자동적으로 제품을 생성하게 한다.

출처: 위키피디아 백과


만약 애자일에 대해서 더 알고 싶다면 아래의 PDF를 참조하기 바란다. "애자일의 미래"라는 제목으로 Google에서 검색하면 나오지만 혹시라도 나중에 링크가 깨질지도 모르기 때문에 올려 놓는다.
저자는 '김창준'이란 분으로 애자일 이야기라는 블로그를 운영하고 있다.
Posted by 서오석
,
Unified Software Development Process는 내가 본 책에서는 Lifecycle에서 다루고 있다. 어떤 곳에서는
Unified Software Development Process Model이라고 말한다.
범주로 보면 USDP는 객체지향 방법론 중 하나이다.

설명

USDP는 Jacobson, Booch, Rumbaugh에 의해 1999년에 개발되었다. 이 방법론은 소프트웨어 개발이 여러번 반복을 거쳐 수행된다. 근데 이 반복 안에는 요구사항 분석, 설계, 구현, 테스트 및 평가과정을 포함하고 있어서 자체로서 하나의 개발주기를 이룬다. 그렇기 때문에 큰 범위로는 개발방법론이며 작게는 Lifecycle로 표현하는 것 같다. 이런 반복적인 개발 방법에서는 반복마다 실행 가능한 릴리즈가 산출되고, 반복이 거듭될 수록 향상되어 최종 시스템으로 발전된다.

개발순서
사용자 삽입 이미지
Inception
고객과의 준비적 상호 작용 단계다. 요구사항 분석, 원형에 대한 설계, 구현이 이루어지는 단계이다.

Elaboration
요구사항 분석 및 아키텍처 확정 단계이다

Construction
기본 기능만 가진 제품 산출 단계로 주요 설계 및 구현을 수행한다.

Transition
제품 릴리즈 완성 단계로 구현 및 테스트를 수행한다.

장점
반복적인 개발 방법은 위험 요소를 초기에 발견할 수 있고 아키텍처에 대한 정의를 중요한 요소로 삼고 개발하기 때무에 이해가 쉽고 변경에 대한 관리가 용이하다.



'소프트웨어공학 > 다양한 방법론' 카테고리의 다른 글

방법론- eXtreme Programming  (0) 2008.04.19
방법론- Agile Software Development  (0) 2008.04.19
Posted by 서오석
,

설명

나선형 모형은 Boehm이 제안한 것으로, 폭포수 모형과 프로토 타입 모형의 장점에 위험 분석 기능을 추가한 모형이다. 

  • 나선을 따라 돌듯이 여러 번의 소프트웨어 개발 고정을 거쳐 점진적으로 완벽한 최종 소프트웨어를 개발하는 것으로, 점진적 모형이라고도 한다.
  • 소프트웨어를 개발하면서 발생할 수 있는 위험을 관리하고 최소화하는 것을 목적으로 한다.
  • 프로젝트 총 예산이 1~5%정도 더 증가한다.
  • 각각의 사이클 별로 지속기간이 한계가 있다.

개발 순서

사용자 삽입 이미지
Planning 
계획 및 정의 단계로 개발자가 고객을 만나 개발하고자 하는 제품의 요구사항을 듣는다. 이때 개발자는 고객의 의도를 파악하고 계획을 위한 자료로 활용한다. 여기서 제품의 성능, 기능, 시스템의 목표를 규명하고 제약조건을 파악한다.

Risk analysis
초기 요구사항을 가지고 위험을 규명한다. 개발하려는 시스템의 기술적 위험, 정보 부족, 프로젝트 관리, 자원관리등을 예측하고 위험관리를 통해 위험을 방지한다.

Software development
어떠한 모델을 적용하여 시스템을 개발할 것인가를 결정한다. 사용자가 UI를 중시여기면 Prototype model을, SI에 위험이 존재하거나 요구사항이 완벽한 경우 Waterfall model을 사용한다

User evaluation
앞 단계에서 구현된 소프트웨어를 고객이나 사용자가 평가한다. 이 단계에서 feedback을 얻는 데 요구되는 여러 작업를 포함하며 다음 단계에 고객의 평가를 반역할 수 있는 자료를 얻을 수 있다.

장점

  • 가장 현실적인 모형으로, 대규모 프로젝트나 큰 시스템에 적합하다
  • 점진적으로 개발 과정이 반복되므로 누락되거나 추가딘 요구사항을 첨가할 수 있고, 정밀하며, 유지보수 과정이 필요 없다.
  • 위험분석 단계에서 기술과 관리의 위험 요소들을 하나씩 제거해 나감으로써 완성도 높은 소프트웨어를 만들 수 있다.
  • 각 단계에 적당한 테스팅이 이루어져 개발과정에 발생하는 여러 문제점의 해결방안을 찾기 때문에 테스팅 비용 및 개발지연등의 문제를 해결할 수 있다.


단점

  • 위험성 평가에 크게 의존하기 때문에 이를 발견하지 않으면 반드시 문제가 된다.
  • 위험요인을 추출하고 분석하는데 많은 비용이 소요되고 초기의 요구분석 결과 자체가 불완전한 경우, 위험분석의 의미가 없다.
  • 위험분석 결과가 불완전한 경우, 사용자의 요구충족에 의미가 없고, 개발비용만 낭비하게 된다.
  • 상대적으로 복잡하여 프로젝트 관리 자체가 어렵게 될 수도 있다.


 

Posted by 서오석
,

RDBMS 이론이 소개 된 지 어느덧 30년이 지났다. 30년의 긴 세월이 흐르면서 RDBMS는 우리의 일상에도 많은 부분을 차지하게 된 것 같다. 우리가 사용하는 대부분의 웹 사이트에서 RDBMS를 사용하고 있으며 이로 인해 우리의 정보는 체계적으로 관리되고 있을 것이다. RDBMS의 보급화와 함께 RDBMS의 기술은 계속 향상되고 있지만 이 중에서 RDBMS의 탄생과 함께 태어난 조인은 그 중요성에 비해 많은 천대를 받는 것 같다. 이제라도 우리는 RDBMS의 꽃인 조인을 정확히 이해해 보자.

권순용 | kwontra@hanmail.net


지금도 수많은 사이트에서 데이터 연결에 대한 불신을 가지고 있는 것이 현실이다. 어떤 사이트에 가보면 데이터 연결 방법 중에 하나인 조인을 사용하지 못하게 하고 또 어떤 사이트에 가보면 서브쿼리를 사용하지 못하게 하는 것을 지켜보는 경우가 있었다. 물론, 서브쿼리도 데이터 연결의 한가지 방법이며 조인과 거의 유사하게 수행된다.

분명 조인은 RDBMS의 꽃이며 이러한 핵심 기술을 이용하지 않는다면 RDBMS를 이용해서 무슨 효과를 기대할 수 있겠는가? 조인의 실제 수행 방식을 이해하지 않으려 하고 조인을 잘못 사용했기 때문에 나타나는 현상을 그대로 받아들이고 그것만을 가지고 모든 것을 평가하는 것이 현실인 것 같다.

조인의 수행 방식을 정확히 이해했다면 우리는 이와 같은 성능 저하 현상을 바로 잡을 수 있다는 사실을 명심해야 할 것이다. ‘조인은 성능을 저하시킨다’는 잘못 알고 있는 사실을 다시 확인해 보는 기회로 삼아보았으면 좋겠다.


조인은 데이터를 감소시킨다

조인은 현재 데이터베이스의 크기를 감소시킬 수 있는 유일한 방법이다. 이와 같이 이야기한다면 의아해 할 것이다. 조인이 어떻게 데이터베이스의 크기를 감소시킬 수 있겠는가? 당연히 조인을 이용하여 데이터베이스의 크기를 감소시킬 수는 없다.

여기서 말하는 것은 데이터베이스의 정규화를 거치게 되면 데이터베이스에 존재하는 테이블은 분리되며 테이블이 분리된다면 일반적으로 데이터베이스의 크기는 감소하게 된다. 이와 같이 테이블을 분리하여 두 개 이상의 테이블에서 우리가 원하는 데이터를 추출하기 위해서는 조인을 이용해야 한다는 것이다.

이와 같기 때문에 정확히 이야기한다면 데이터를 감소시키기 위해 조인을 사용한다기 보다는 크기가 감소된 데이터에 대해 조회를 수행하기 위해 조인을 사용한다는 것이다.

예를 들어, 어느 회사에 직원 테이블이 존재하며 또 하나의 경우는 사원 테이블과 부서 테이블이 별도로 존재한다고 가정하자. 회사에는 1,000,000명의 직원이 존재하며 해당 회사에는 1,000개의 팀이 존재한다고 가정하자. 그렇다면 아래와 같이 구성될 수 있을 것이다.

<그림>처럼 테이블을 구성했다고 가정하자. 그렇다면 각각의 테이블의 크기는 어떻게 되겠는가? 먼저, 직원 테이블을 확인해 보자. 직원 테이블의 하나의 데이터의 길이는 1055Byte의 길이이다. 또한, 직원 테이블에는 1,000,000건의 데이터가 저장되므로 해당 테이블의 전체 크기는 데이터만 1,000,000건*1055Byte=1055MB가 되므로 약 1GB 정도의 크기가 된다. 그렇다면 위의 그림에서 밑에 존재하는 사원 테이블과 부서 테이블을 분리한 경우는 어떠한가?


<그림> 조인이 필요없는 테이블과 조인이 필요한 테이블


사원 테이블은 1,000,000건의 데이터가 저장되어 있으며 하나의 데이터의 길이는 535Byte가 된다. 사원 테이블의 전체 데이터 건수는 1,000,000건이므로 1,000,000*535 Byte = 535MB가 되므로 사원 테이블의 크기는 535MB 정도가 된다. 그렇다면 부서 테이블의 크기는 어떠한가? 부서 테이블의 하나의 데이터의 길이는 525 Byte가 된다.

부서 테이블에는 1,000건의 데이터가 존재하므로 테이블의 전체 크기는 1,000*530Byte이므로 530KB의 크기가 된다. 따라서 위의 그림의 아래와 같이 부서 테이블과 사원 테이블로 구성한다면 두 테이블의 크기를 모두 합해도 535MB 정도의 크기가 될 것이다.

그렇다면 위의 테이블 크기 및 구조를 통해 우리는 무엇을 알 수 있겠는가? 우리가 유추해 낼 수 있는 항목은 크게 두 가지이다.

첫 번째로 두 가지 경우에 대해 모든 데이터를 추출하기 위해 액세스해야 하는 데이터의 양이다. 위의 그림에서 직원 테이블로만 구성되어 있는 경우를 확인해 보자. 직원 테이블의 데이터를 모두 추출하고자 한다면 직원 테이블의 크기만큼 디스크 I/O가 발생하게 된다. 따라서, 직원 테이블의 크기인 1055MB만큼의 디스크 I/O가 발생하게 된다.

반면에 위의 그림에서 사원 테이블과 부서 테이블을 분리한 경우는 어떠한가? 사원 테이블과 부서 테이블을 액세스하여 모든 데이터를 추출해야 한다면 각각의 테이블을 모두 액세스해야 할 것이다. 그렇기 때문에 위에서 계산한 것과 같이 535MB의 디스크 I/O가 발생하게 된다.

이와 같다면 과연 어떻게 테이블을 구성해야 하겠는가? 물론, 위의 그림에서 테이블을 어떻게 구성하는가에 상관 없이 결과는 동일한 데이터가 추출될 것이다. 직원 테이블로만 구성한 경우에는 1055MB의 디스크 I/O를 발생시키게 되며 사원 테이블과 부서 테이블로 분리하여 모든 데이터를 액세스한다면 535MB의 디스크 I/O를 발생시키게 된다.

디스크 I/O를 통해 확인한다면 직원 테이블로 구성하는 것보다는 사원 테이블과 부서 테이블로 분리하는 형태를 선택해야 할 것이다. 사원 테이블과 부서 테이블로 분리하는 형태를 선택한다면 우리는 더 적은 디스크 I/O를 통해 원하는 모든 데이터를 추출할 수 있을 것이다.

두 번째로 원하는 데이터를 추출하기 위한 데이터의 액세스 방법을 예상할 수 있을 것이다. 직원 테이블 하나로 구성하는 경우에는 하나의 테이블만 존재하게 되므로 하나의 테이블을 통해 모든 데이터를 액세스할 수 있게 된다.

그렇기 때문에 인덱스가 존재한다면 인덱스를 이용하는 수행 방식을 이용하거나 또는 인덱스가 존재하지 않는다면 인덱스를 이용하지 않고 테이블을 처음부터 끝까지 액세스하게 될 것이다. 반면에 사원 테이블과 부서 테이블로 분리하는 경우는 두 테이블의 데이터를 동시에 추출하기 위해서는 조인을 사용해야 할 것이다.

이와 같이 테이블을 분리한다면 전체 데이터의 크기는 감소한다. 데이터의 감소는 우리에게 많은 혜택을 주게 된다. 이러한 데이터의 감소를 위해서는 테이블을 분리해야 하며 분리된 테이블에서 원하는 데이터를 추출하기 위해서는 조인을 이용해야 한다. 이처럼 대용량 데이터베이스의 데이터를 감소시키기 위해서는 조인은 필수 불가결할 것이다.


조인을 수행하기 위한 경우의 수를 이해하자

조인을 수행하기 위해서는 다양한 경우의 수가 존재한다고 것을 이해하겠는가? 그렇다면 과연 조인 방식에는 어느 정도 다양한 경우의 수가 존재하는 것일까? 그 중 어떤 조인 방식이 최적의 성능을 보장하겠는가? 이제부터 조인을 수행하기 위한 경우의 수에 대해 확인해 보자.

SQL> SELECT COL1, COL2, COL3
FROM TAB1, TAB2, TAB3
WHERE TAB1.KEY1 = TAB2.KEY2
AND TAB2.KEY2 = TAB3.KEY3;

위와 같은 기본적인 조인 SQL을 수행한다고 가정하자. SQL은 데이터베이스에 존재하는 테이블의 데이터를 액세스하는 언어이다. 그렇다면 위의 조인 SQL이 수행될 수 있는 경우의 수에는 어떤 경우가 존재하는가? 여기서 말하는 경우의 수는 조인이 수행되는 방법을 의미한다. 조인이 수행될 수 있는 경우의 수는 아래와 같은 두 가지 요소에 의해 다양하게 발생할 수 있다.

·테이블의 조인 순서-먼저 액세스되는 테이블과 뒤에 액세스되는 테이블

·조인 방식-중첩 루프 조인, 해쉬 조인, 소트 먼지 조인

첫 번째로 위의 요소 중 테이블의 조인 순서를 확인해 보자. 조인은 두 개 이상의 테이블에서 필요한 데이터를 추출하게 되므로 먼저 액세스하는 테이블과 뒤에 액세스하는 테이블이 존재하게 된다. 그렇기 때문에 세 개의 테이블에 대해 조인을 수행하게 된다면 조인 순서는 3*2*1=6의 경우의 수가 존재하게 된다.

예를 들어, TAB1 테이블이 먼저 액세스되고 뒤에 TAB2 테이블이 액세스되며 마지막에 TAB3 테이블이 액세스되는 조인 순서도 이 경우의 수에 포함이 될 것이다. 결국, 테이블 조인 순서에 의해 발생할 수 있는 경우의 수는 6개가 된다.

두 번째로 조인 방식에 의한 경우의 수를 확인해 보자. 조인 방식은 조인을 수행하는 내부 수행 방법을 의미한다. 앞서 언급했듯이 조인은 세 가지 방식이 존재하게 된다. 따라서, 조인 방식은 세 가지의 경우의 수가 존재할 것이다.

이와 같다면 해당 조인 SQL에서 최종적으로 발생하는 경우의 수는 어떻게 되겠는가? 두 가지 경우의 수의 곱이 전체 경우의 수가 될 것이다. 그렇기 때문에 전체 경우의 수는 6*3=18가지의 경우의 수가 존재하게 된다.

예를 들어, TAB1 테이블, TAB2 테이블 및 TAB3 테이블 순으로 조인이 수행되며 TAB1 테이블과 TAB2 테이블은 해쉬 조인을 사용하고 그 결과 값과 TAB3 테이블은 중첩 루프 조인을 수행하는 경우도 18가지의 경우의 수에 포함될 것이다.

이와 같이 하나의 조인 SQL은 우리가 생각지도 않은 다양한 경우의 수가 존재하며 해당 조인 SQL이 수행될 경우에는 18가지 경우의 수 중 하나의 방법을 선택하여 조인 SQL을 수행하게 된다.

그렇다면 조인 SQL의 수행을 위한 경우의 수와 성능은 어떤 관계를 가지게 되는가? 이는 성능과 매우 밀접한 관계를 가지게 된다. 위의 예제에서 18가지의 경우의 수중 최적의 성능을 보장하는 경우는 몇 가지 안 된다. 나머지 경우의 수는 성능을 저하시키는 경우에 해당된다. 이제부터 우리는 이러한 조인의 경우의 수를 고려하여 조인 SQL을 작성해야만 성능을 보장 받을 수 있을 것이다.


조인의 성능은 다양하다

전체 데이터를 액세스하는 경우에는 하나의 테이블을 액세스하는 경우보다는 분리된 테이블의 데이터를 액세스하는 경우에 디스크 I/O가 감소했다. 디스크 I/O만 고려한다면 성능과 관련된 모든 항목은 고려된 것인가? 그것만은 아닐 것이다. 그렇다면 성능 관련해서 과연 무엇을 고려해야 하는가?

그것은 분리된 테이블에서 원하는 데이터를 추출하기 위해 사용하는 조인의 수행 방식이다. 하나의 테이블을 액세스한다면 인덱스를 이용한 테이블 액세스 방식 또는 테이블을 처음부터 마지막까지 액세스하는 테이블 전체 스캔 방식이 존재하게 된다. 이와 같이 하나의 테이블을 액세스한다면 매우 단순한 액세스가 발생하게 된다.

하지만, 조인을 이용한다면 이와 같이 단순한 방식으로만 수행되는 것은 아니다. 조인을 수행하기 위한 조인 방식이 존재하며 이와 같은 조인 방식을 이용하여 조인을 수행하게 된다.그렇다면 조인 방식에는 어떠한 것이 존재하는가?

·중첩 루프 조인(NESTED LOOP JOIN)

·해쉬 조인(HASH JOIN)

·소트 머지 조인(SORT MERGE JOIN)

위와 같은 조인 방식이 존재한다는 것은 무엇을 의미하는가? 하나의 조인은 위의 방법 중 하나의 조인 방식을 이용할 수도 있으며 경우에 따라서는 위의 조인 방식 중 하나의 조인 방식이 아닌 두 개 이상의 조인 방식을 이용할 수도 있다.

이는 무엇을 의미하는가? 경우의 수가 많다는 것은 다양한 처리 방법이 존재하는 것이며 이와 같이 모든 경우의 조인 방법이 동일한 성능을 보장할 수는 없을 것이다. 그렇기 때문에 어떻게 수행되는가에 따라 성능을 보장할 수도 있고 성능을 저하시킬 수도 있을 것이다.

결국, 하나의 테이블을 액세스하는 경우에는 SQL의 실행 계획이 매우 단순하기 때문에 거의 예외가 없지만 두 개 이상의 테이블에서 데이터를 추출하는 조인의 경우에는 위와 같이 많은 경우의 수가 존재하게 된다.

이와 같이 존재하는 많은 경우의 수에는 하나의 테이블로 구성하여 데이터를 액세스하는 경우보다 성능이 저하되는 경우도 존재하며 또는 하나의 테이블로 구성하여 데이터를 액세스하는 경우보다 성능이 더 좋아지는 경우도 존재하게 된다. 일반적으로 많은 경우의 수는 하나의 테이블로 구성하여 데이터를 액세스하는 경우보다 성능이 저하된다.

문제는 여기에 존재하게 된다. 조인을 수행하는 많은 경우의 수가 단일 테이블을 액세스하는 경우보다 성능이 저하될 수 있으며 이와 같은 경우 중 하나의 수행 방식이 선택된다면 우리는 조인이 항상 성능을 저하시킨다는 고정관념에 빠지게 된다. 그렇게 된다면 이와 같은 성능 저하를 경험한 사람은 다시는 조인을 사용하지 않고 단일 테이블로 구성하여 조인을 사용하지 않으려 할 것이다.

이와 같다면 데이터는 자연스럽게 증가하게 된다. 과연, 이것이 올바른 방법인가? 조인을 사용하는 경우에 다양한 수행 방식 중 가장 최적의 조인 방식을 선택한다면 어떻게 되겠는가? 이와 같다면 단일 테이블을 액세스하는 경우보다 조인을 이용하는 경우가 더 좋은 성능을 보장할 수 있을 것이다. 여기서 우리는 결론을 내릴 수 있을 것이다.

테이블을 분리함으로써 우리는 조인을 사용해야 하며 조인을 수행하기 위한 방식에는 다양한 경우의 수가 존재하게 된다. 다양한 경우의 수 중 우리는 최적의 조인 방식을 찾아야만 한다는 것이다. 이 것이 조인을 효과적으로 사용하면서 데이터를 감소시킬 수 있는 유일한 방법이 될 것이다.


조인은 다양하게 표현된다

앞에서 언급한 SQL의 경우는 누가 보더라도 조인이라는 것을 이해할 것이다. 과연, 분리된 테이블에서 원하는 데이터를 추출하는 방법에는 위와 같이 FROM 절에 필요한 테이블을 나열하는 방법밖에는 존재하지 않는 것일까? 이와 같은 방법 외에도 여러 가지 방법으로 분리된 테이블의 데이터를 연결할 수 있다.

·스칼라 서브쿼리-SELECT 절에 SELECT 절을 사용하는 데이터 연결

·서브쿼리-WHERE 절에 SELECT 절을 사용하는 데이터 연결

위와 같은 종류가 중요한 것은 아니다. 이와 같은 종류도 모두 조인에 해당하기 때문에 두 개 이상의 테이블에서 필요한 데이터를 추출하게 되며 그렇기 때문에 먼저 액세스되는 테이블과 뒤에 액세스되는 테이블이 존재하게 된다.

물론, 조인 방식도 앞서 언급한 세 가지 방식 중 하나를 이용하게 된다. 이와 같기 때문에 데이터 연결을 수행하는 대부분의 방식은 다양한 경우의 수가 존재하며 이 중 성능을 보장하는 경우는 몇 가지 존재하지 않게 된다.

결국, 테이블 분리에 의한 데이터의 연결을 수행하는 방식은 다양한 형태로 존재한다. 하지만, 대부분의 데이터 연결 방식이 다양하게 수행된다. 여기서 중요한 것은 다양한 경우의 수에서 성능을 보장하는 경우의 수는 많지 않다는 것이다. 그렇기 때문에 우리의 역할은 다양한 경우의 수에서 최적의 경우의 수를 찾아야 한다는 것이다. 이와 같이 최적의 경우의 수를 찾지 못한다면 우리는 평생 조인을 사용하지 말고 단일 테이블로 구성하여 단순 액세스를 수행해야 한다고 주장하게 될 것이다.

하지만, 최적의 성능을 보장하는 경우의 수를 찾아냈다면 드디어 조인의 혜택을 제대로 누릴 수 있게 되는 것이다. 조인은 절대 성능 저하의 아키텍처를 가지고 있지 않다. 단지, 우리가 모르고 사용하기 때문에 성능 저하를 발생시킨다고 생각하게 되는 것은 아닌가 생각한다.

제공 : DB포탈사이트 DBguide.net


출처 : 경영과컴퓨터 [2008년 2월호]
Posted by 서오석
,

설명
원형모델의 주목적은 원형을 가능한 빨리 개발한 후 고객과 검증하는 것이다. 고객으로부터 피듭백을 받은 후에는 원형을 폐기하는 경우도 있고 중요 부분만 구현하여 피드백을 얻은 후 지속적으로 발전시켜 완제품을 만들어 낼 수도 있다.

  • 프로토 타입 모형은 사용자의 요구사항을 정확하게 파악하기 위해서 미리 실제로 개발할 소프트웨어의 시제품을 만들어서 최종 결과물을 예측하는 모형이다.
  • 시스템의 모형을 만드는 과정으로 초기 요구사항에 대한 소프트웨어를을 구현하는데 이는 추후 구현단계에서 사용될 골격이 된다.
  • 성능, 보안, 신뢰도와 같은 소프틍웨어의 특성을 무시한다.
  • 변경이 체계적으로 이루어지지 않기 때문에 유지보수가 힘들다.
  • 폭포수 모델에서 발견되는 개발이 완료된 시점에서 오류가 발견되거나 요구사항과 맞지 않는 단점을 해결하기 위한 모형이다.

개발 순서

사용자 삽입 이미지


Initial analysis
처음 개발할 시스템의 분석 작업, 고객의 일부 요구사항 또는 불안전 요구사항으로 부터 제품의 기본 골격을 잡는다. 

Define objectives
프로토타입을 정의해야할 부분을 고객과 상의하여 진행. 이부분을 잘해야 어떻게 프로토타입의 구조를 결정할지 정의할 수 있다.

Specify
순차적 디자인 원칙에 의거하여  모델을 정의하고 수정한다. 사용자 인터페이스에 초점을 맞춘다.

Construct
프로토타입으로 정해진 모델을 빠르게 개발한다. 고객이 요구하는 기능을 구현하고 필요한 요소를 파악하는데 중점을 둔다. 중요한 것은 프로그램의 신뢰도나 품질이 아니라 빨리 만드는 것이다.

Evaluate
가장 중요한 단계로 프로토타입을 고객과 같이 평가하고 고객이 원하는 요구사항과 맞는지 확인한 후 다시 정의 단계로 넘어간다.

장점

  • 요구사항을 충실히 반영하며, 요구사항의 변경이 용이하다.
  • 사용자 요구사항이 불명확할 때 사용하는 것이 좋다
  • 제품의 추적성과 시험가능성이 확보된다.
  • 최종 결과물이 만들어지기 전에 의뢰자가 최종 결과물의 일부 또는 모형을 볼 수 있다.
  • 시스템의 이해와 품질향상에 도움이 된다.
  • 고객과 개발자 모두에게 공동의 참조 모델을 제공한다.

단점

  • 프로토 타입의 결과를 최종 결과물이라고 고객에게 혼란을 줄 수 있다.
  • 단기간에 제작해야 하기 대문에 비효율적인 언어나 알고리즘을 사용할 수 있다.
  • 소프트웨어 개발에 많은 시간이 소요되며 산출물이 많아진다.
  • 중간과정을 점검할 수 있는 일정표와 산춤물이 없기 때문에 관리 통제가 어렵다.
  • 실제 프로토타입을 검수하고 확인할 고객이 그리 많지 않다. (자기 업무도 많은데 어떻게 신경쓰냐..)
Posted by 서오석
,

설명

폭포수 모형은 소프트웨어 개발에서 각 단계를 확실히 매듭짓고 그 결과를 철저하게 검토하여 승인 과정을 거친 후에 다음 단계를 진행하며 이전 단계로 넘어갈 수 없는 방식이다.

  • 폭포수 모형은 소프트웨어 공학에서 가장 오래되고 가장 폭넓게 사용하며 고전적 생명 주기 모형이라고도 한다.
  • 소프트웨어 개발 과정의 앞 단계가 끝나야만 다음단계로 넘어갈 수 있는 선형 순차적 모형이다
  • 각 단계별로 산출물이 나오며 단계별 평가서가 존재한다.
  • 두개 이상의 과정이 병행하여 수행되지 않는다

개발 순서

사용자 삽입 이미지

System engineering
높은 수준의 구조 명세서를 작성한다. 모델에 사용할 각종 문서를 정의한다.

Requirements Analysis
요구사항을 수집하고 문제를 이해, 분석하는 단계이다. 분석가는 고객의 요구사항을 기능, 성능, 인터페이스 등으로 파악하고 문서화 한다. 이 단계에서 산출물은 요구사항 명세서, 기능 명세서, 인수 테스트 명세서등이 있다.

Disign
소프트웨어 아키텍처 명세서, 시스템 테스트 명세서, 디자인 명세서, 서브시스템 테스트 명세서, 단위 테스트 명세서등 모든 시스템 구조를 결정하게 된다.

Construction
설계명세서를 토대로 실제 프로그래밍을 하게 된다.

Testing
단위 테스트 레포트, 서브 시스템 테스트 레포트, 시스템 테스트 레포트, 인수테스트 레포트등의 산출물이 나오며 프로그램이 입력에 따라 제대로 작동하는지 여부와 오류를 발견하기 위해 수행된다.

Installation
시스템에 인스톨해야할 소프트웨어라면 인스톨 작업을 하게 된다.

Maintenance
요구사항 정의 변경에 따른 유지보수 및 산출물 변경을 하게 된다. 유지보수를 하게 되는 이유는 여러가지 인데 고객이 성능향상이나 기능 추가를 요구할 경우, 새로운 운영체제나 주변장치등이 바뀌는 경우, 테스팅 단계에서 미리 체크하지 못한 오류등을 수정할 경우가 있다. 실제 프로젝트 예산의 70%가 유지보수단계에 쓰일 정도로 시스템이 제대로 구축이 안되어있다면 엄청난 예산을 잡아먹는다.

장점

  • 모형의 적용 경험과 성공사례가 많다.
  • 단계별 정의가 분명하고, 각 단계별 평가가 확실하게 이루어진다.
  • 각 프로세스 단계의 역할 이해가 용이하다.
  • 단계별 산출물이 정확하여 개발공정의 기준점을 잘 제시한다.
  • 프로젝트의 관리가 용이하다.

단점

  • 프로젝트 초기, 요구사항을 정의할 때 정확한 요구사항을 제시하지 않을 경우 프로세스의 각 단계가 진행될 수록 요구사항의 변경, 추가가 매우 어렵다. (고객의 feedback 반영이 어려움)
  • 각 단계별로 다음 단계로 진행될 때 오류 없이 진행되어야 하지만 현실적으로 오류없이 다음단계로 진행되기 어렵다.
  • 만약 계획대로 진행되지 않을 경우 납기일 전 철야, 납기일 지연, 지연에 따른 비난과 스트레스가 개발자에게 향하여 에너지 소진, 고객의 요구를 충족하지 못하는 등의 부작용이 발생한다.
  • 고객은 개발된 제품이 자신이 원하는 것인지 알기 위해서 프로젝트 후반까지 기다려야만 한다.
  • 만약 고객이 요구한 시스템이 아니면 최악의 경우 프로젝트가 실패하게 될 수도 있다.


 

Posted by 서오석
,


지난 몇 년 동안 XML은 데이터 전송을 위한 새로운 표준으로 각광 받아 왔으며, 기업의 XML 기반 솔루션 도입 사례가 증가하면서 그 영향력 또한 증가하고 있습니다. 전체 데이터 전송 작업에 XML 표준을 적용하는 기업의 사례가 늘고 있으며, 이로 인해 사용되는 XML 포맷 또한 복잡해지고 있습니다. 이 과정에서 XML 포맷 내에 여러 개의 네임스페이스, 수천 개의 엘리먼트, 재귀적 정의 등이 사용되기도 합니다. 이러한 포맷을 통해 생성된 XML 문서의 규모와 복잡성 역시 증가하고 있으며, 따라서 컨텐트의 관리가 한층 까다로운 과제로 부각되고 있습니다. 하지만 이러한 문제를 해결하는데 도움이 될만한 정보는 부족한 것이 현실입니다.

본 문서에서는 Oracle Database 11g에 포함된 XML DB 기능을 이용하여 복잡한 XML 컨텐트를 관리하는 방법, 그리고 Oracle XML DB가 다른 상용 ETL 제품과 비교했을 때 제공하는 이점에 대해 설명하고 있습니다. 본 문서에서 설명되는 XML 스키마 예제는 아래와 같은 내용을 포함하고 있습니다:

 •  복잡한 XML 스키마의 등록
 •  데이터베이스에 XML 파일을 삽입
 •  관계형 쿼리를 통해 XML 데이터를 조회
 •  XML 스키마 수정을 위한 In-Place Evolution 활용

그 밖에도, Oracle XML DB 솔루션의 성능과 처리 속도를 극대화하기 위한 전략과 복잡한 XML 포맷의 실제 활용 방안 등에 대한 설명이 제공됩니다.


Oracle XML DB 배경 정보


Oracle XML DB는 XML 컨텐트의 저장, 처리, 인출을 위한 강력한 툴로 Oracle Database에 기본 포함된 형태로 제공됩니다. Oracle XML DB는 다양한 XML 포맷에 수반되는 개별적인 요구 사항에 대응하기 위해 비구조형(structured), 바이너리(binary), 구조형(structured) 등의 여러 가지 저장 옵션을 제공합니다.

 •  비구조형 저장 방식(CLOB, character large object). 전체 문서를 하나의 오브젝트로 취급하여 데이터베이스에 저장하는 방식으로, 데이터의 INSERT 작업 시 성능이 가장 뛰어나다는 이점을 제공합니다. 하지만 다른 방식에 비해 저장 효율성이 떨어질 뿐 아니라 관계형 쿼리에 의한 조회 시 가장 낮은 성능을 보인다는 단점이 있습니다. 관계형 접근이 요구되는 환경에서는 크고 복잡한 XML 문서를 비구조형 옵션으로 저장하는 것은 결코 바람직한 대안이 될 수 없습니다. 비구조형 저장 방식은 디스크 공간에 여유가 많고 문서를 원본 포맷 그대로 저장하고자 하는 경우에 주로 사용됩니다.

 •  바이너리 저장 방식. Oracle Database 11g에 새로 추가된 옵션으로, XML 데이터를 위한 파싱 과정을 완료한 바이너리 포맷으로 데이터를 저장합니다. 이 옵션은 XML 스키마와 기본 호환하며 비구조형 저장 방식에 비해 디스크 공간 효율성과 쿼리 성능이 뛰어나다는 장점을 제공합니다. 바이너리 저장 방식은 비구조형 옵션과 비교가 어려울 정도로 개선된 성능을 제공하지만 구조형 저장 방식의 성능에는 미치지 못합니다. 바이너리 저장 방식은 관계형 접근의 성능을 일정 수준 보장할 수 있다고 판단되는 경우 효과적인 대안이 됩니다. 바이너리 저장 옵션은 그 활용이 매우 편리하므로 구조형 저장 옵션을 고려하기 전에 먼저 대안으로 생각해 볼 필요가 있습니다.

 •  구조형 저장 방식. 스키마 기반(schema-based) 저장 방식이라고도 불리는 이 옵션은 오브젝트-관계형 모델을 사용하여 데이터베이스에 XML 문서를 저장합니다. 구조형 저장 방식은 디스크 공간 효율성, 관계형 쿼리 성능의 측면에서 가장 뛰어나다는 이점을 갖습니다. 또 한편으로 파일의 INSERT 작업에서 높은 오버헤드를 수반하며 스키마 등록 과정에서 추가적인 준비 과정이 필요하다는 문제가 있습니다. 구조형 저장 방식은 최적화된 관계형 쿼리 성능을 구현하고자 하는 경우에 최적의 대안이 됩니다. 특히 매우 크고 복잡한 파일을 관계형 쿼리를 통해 효율적으로 처리하고자 하는 경우에 적합합니다.

XML 문서의 크기와 복잡성에 대한 인식은 기업 환경에 따라 크게 달라집니다. OLTP 데이터베이스에서 XML을 이용하여 EDI(electronic data interchange) 환경을 구현한 경우라면 파일의 라인 수가 수천 개 정도만 되어도 그 크기가 아주 큰 것으로 간주됩니다. 반면, 기가바이트 단위의 XML 문서를 주기적으로 처리하는 수 테라바이트급의 데이터 웨어하우스 환경에서는 라인 수가 수백만 개 정도는 되어야 큰 파일이라 할 수 있을 것입니다. XML 문서의 복잡성을 판단할 때에도 같은 개념이 적용됩니다.

본 문서에서는 문서가 다음과 같은 속성을 가질 때 "복잡한" 것으로 간주하고 있습니다.

 •  싱글 루트(single-rooted) 파일에 여러 개의 네임스페이스를 가짐
 •  검증 과정에서 다양한 옵션을 적용할 수 있도록 유연한 XML 정의를 허용함.
 •  재귀적 또는 순환적 참조를 가짐.
 •  정적이지 않은 XML 스키마를 포함함.

본 문서에서는 20MB 이상의 크기를 갖는 싱글-루트 XML 문서 파일을 "큰" 파일로 간주합니다. 이렇게 정의된 속성은 엔터프라이즈 솔루션이 요구하는 확장성, 관리성 등의 고려 사항에 영향을 미칩니다.

최적의 저장 방식을 선택하기 위한 황금률은 따로 존재하지 않습니다. 파일 구조, 성능 목표, 사용 가능한 리소스, 예상 데이터 량 등에 따라 최적의 대안이 달라질 수 있습니다. 어떤 저장 방식이 가장 좋을 것인지 판단하기 어렵다면 여러 가지 포맷을 적용해 가면서 최적의 대안을 확인하는 방법이 바람직합니다. 일반적으로 문서의 크기가 크고 관계형 쿼리가 실행되는 환경에서는 성능, 리소스의 측면에서 비구조형 저장 방식이 좋은 대안이 되기 어렵습니다. 바이너리 XML은 비즈니스 관점에서 쿼리 성능을 일정 수준 보장할 수 있다고 판단되는 경우, 또는 유지 보수에 수반되는 시간을 최대한 단축하고자 하는 경우에 적합합니다. 반면 관계형 쿼리의 성능이 가장 주된 관심사이고 XML 문서에 신속하게 접근해야 하는 경우라면 구조형 저장 방식이 최상의 대안이 될 가능성이 높습니다.


구조형 스토리지를 이용한 처리 속도의 극대화


구조형 저장 방식은 파일 INSERT 작업에 많은 오버헤드를 수반합니다. 하지만 큰 문서를 여러 개의 파일로 분할함으로써 오버헤드를 절감하는 것이 가능합니다. 예를 들어 700MB의 싱글-루트 XML 파일을, 올바른 XML 스키마를 갖는 10개의 작은 파일로 분할할 수 있습니다. 70MB 파일 10개를 처리하는 것이 700MB 파일 1개를 처리하는 것보다 성능 면에서 유리합니다. 작업의 동시성 레벨은 데이터베이스의 프로세싱 파워에 의해 결정됩니다. 이러한 방법으로 데이터베이스 동시성을 개선하고 처리 속도를 극대화할 수 있습니다.

Oracle XML DB를 사용할 때 고려해야 할 또 한 가지 사항으로, 하나의 XML 파일을 처리하는 속도는 개별 CPU 속도에 의해 제약된다는 점을 들 수 있습니다. 다시 말해, 프로세서를 여러 개 장착한다 해도 단일 문서의 처리 속도를 개선하는 데에는 도움이 되지 않습니다. 구조형 저장 방식으로 복잡한 싱글-루트 700MB 문서를 처리하는 경우를 생각해 봅시다. 1.35GHz 프로세서를 이용하여 이 문서를 처리하는 시간은 약 10분 정도 걸립니다. 데이터베이스의 CPU 수가 12개이든 72개이든 이 수치는 달라지지 않습니다. 단일 XML 문서의 처리 속도를 개선하려면 더 높은 성능의 CPU를 사용해야 합니다. 예를 들어 3.4GHz 프로세서를 사용한다면 처리 속도가 4분으로 단축될 수 있을 것입니다. 이에 반해, 여러 개의 XML 파일을 처리해야 하는 경우에는 여러 개의 프로세서를 사용하여 INSERT 작업의 동시성을 개선하고 처리 속도를 크게 향상시킬 수 있습니다. 예를 들어 700MB 파일이 10개의 70MB 문서로 분할되어 있다면, 1.35GHz 프로세서를 장착한 데이터베이스에서 1분 이내로 처리 시간을 단축할 수 있습니다. CPU의 수가 충분하다면 10개의 문서를 데이터베이스 내에서 동시에 처리할 수도 있을 것입니다.

하지만 그 결과를 정확하게 예측하는 것은 불가능합니다. 데이터베이스의 성능은 운영 체제, 프로세싱 파워, 메모리, 스키마 정의 등 여러 가지 요인에 따라 달라질 수 있기 때문입니다. 주어진 환경의 성능을 최적화하기 위한 최선의 방안은 여러 가지 전략을 구현해 보면서 그 장단점을 직접 비교해 보는 것입니다.


Oracle XML DB와 상용 패키지 제품의 비교


파일의 데이터를 데이터베이스로 가져 오기 위한 ETL(extract, transform, load) 툴이 다양하게 출시되어 있습니다. 이러한 툴들은 일반적으로 드래그-앤-드롭 기능을 이용한 단순화된 프론트엔드 인터페이스를 통해 내부 프로세스의 복잡성을 숨길 수 있도록 구현됩니다. ETL 툴에서 XML 로드 작업을 생성하는 과정에서는 추출 대상 필드를 정의하는 작업이 필요합니다. XPath가 올바르게 정의되지 않은 경우 문서로부터 데이터가 제대로 수집되지 않을 것입니다. 복잡한 XML 문서 환경에서, Oracle XML DB는 문서에 대한 데이터베이스 중심형 뷰를 제공하고 각 문서를 오브젝트-관계형 모델로 전환하여 보여 준다는 이점을 제공합니다. 파일이 데이터베이스 내에 성공적으로 로드되면, 별도의 파싱 과정을 거치지 않고도 데이터에 즉각적으로 접근할 수 있습니다.

Oracle XML DB의 또 다른 장점으로, 이 기능이 Oracle Database에 기본 포함되어 있으며 별도의 라이센싱을 요구하지 않는다는 점을 들 수 있습니다. 하지만 라이센싱 비용을 추가로 부담하는 것이 문제가 되지 않는 경우라면 상용 ETL 패키지 대신 굳이 Oracle XML DB를 사용할 필요가 있을까요? 이 질문에 답변하기 위해서는, 먼저 Oracle XML DB가 매우 복잡한 형태의 XML 문서에 수반되는 요구 사항을 어떻게 해결하고 있는지 이해할 필요가 있습니다.


복잡한 XML 컨텐트의 처리 문제


XML 컨텐트가 유연하고, 지속적으로 변화하고, 재귀적으로 정의된 매우 큰 문서로 구성되어 있는 경우 개발자는 여러 가지 문제에 부딪힐 수 밖에 없습니다. 복잡한 XML 문서에서는 XML 스키마가 매우 크고 높은 수준의 유연성이 요구되는 경우가 많습니다. 따라서 업계 표준을 준수하는 동시에 기업 내부의 요구 사항을 반영하기 위해서는 유연한 XML 스키마가 반드시 필요합니다.

세 곳의 기업에서 동일한 XML 스키마를 표준으로 채택한 경우를 생각해 봅시다. 이 XML 스키마는 공유/표준 엘리먼트 이외에도 각 기업이 내부적으로 정의한 엘리먼트가 함께 포함되어 있어야 합니다. 이러한 요구 사항을 지원하기 위해서는 다양한 형태의 엘리먼트를 참조하는 제너릭 컨테이너 엘리먼트를 이용하여 유연성을 극대화해야 합니다. 그 결과로, 전혀 다른 엘리먼트를 갖는 문서들이 동일한 XML 스키마 내에서 사용될 수 있어야 합니다. 개발자의 관점에서 볼 때, 이러한 유연성은 XML 파서(parser)의 개발을 어렵게 합니다. 어떤 엘리먼트가 사용될지 예측하기가 어렵기 때문입니다. COTS ETL 툴과 커스텀 파서에는 데이터 추출을 위한 구체적인 XPath가 명시되어야 하며, 따라서 문서 내의 모든 데이터를 캡처하기 위해서는 가능한 모든 XPath가 확인되어야 합니다. 사용 가능한 XPath의 종류가 엄청나게 많음을 감안할 때 이는 매우 비현실적인 솔루션이 될 수 밖에 없습니다. 그 뿐 아니라 스키마에 재귀적/순환적 참조가 존재한다면 그 수는 무한대로 증가할 것입니다. 캡처되지 않은 데이터가 감지되는 경우 이를 해결하기 위한 유일한 방안은 전체 파일을 다시 파싱하는 것입니다.

아래와 같은 XML 스키마를 고려해 봅시다(스키마에는 순환적 참조가 사용되고 있으며, 제너릭 엘리먼트를 이용하여 유연성을 보장하고 있습니다):


크게보기

이 XML 스키마는 세일즈/인벤토리 데이터의 전송을 위한 업계 표준으로 사용될 수 있습니다. standardData.xsd 네임스페이스에서 childContainer 엘리먼트와 companySpecificContainer 엘리먼트가 셀프-참조(self-referencing) 옵션을 제공하고 있음을 주목하시기 바랍니다. 이러한 설계를 통해 개별 기업들이 부모/자식 관계를 이용하여 데이터의 세분화 수준을 결정하도록 할 수 있습니다. 또 각각의 기업은 인벤토리, 세일즈 데이터 중 하나 또는 두 가지 모두를 포함시킬 수 있습니다. 또 각 기업의 요구 사항에 따라 상점, 제품, 세일즈 정보를 0개에서 무한대까지 포함시킬 수 있는 유연성이 제공됩니다.

ABC라는 회사가 여러 상점의 인벤토리/세일즈 데이터를 포함시키고자 하는 경우를 가정해 봅시다. 이를 위해 CompanySpecificContainer 엘리먼트들을 사용하여 각 상점(부모)을 정의하고, CompanySpecificContainer 엘리먼트들을 사용하여 각 상점의 제품(자식)을 정의할 수 있습니다. ABC 회사가 사용할 수 있는 문서의 예가 아래와 같습니다:


크게보기

이에 반해 XYZ라는 기업은 단 하나의 상점만을 갖고 있으며, 파일 내에 표준적인 세일즈 데이터만을 포함시키고자 합니다. 이 경우 childContainer 엘리먼트를 제외하고 salesInformation 엘리먼트들만을 포함시킬 수 있습니다. 표준 세일즈 데이터만을 기술하는 XYZ 회사의 문서 예가 아래와 같습니다:


크게보기

두 가지 문서는 서로 매우 다르지만 동일한 XML 스키마를 공유합니다. 이처럼 하나의 유연한 XML 포맷을 이용하여 다양한 기업의 요구 사항을 반영하는 업계 표준을 구현하는 것이 가능합니다. 또 제너릭 컨테이너 엘리먼트를 위한 재귀적 참조를 활용하여 각 기업이 얼마나 세분화된 정보를 포함시킬 것인지 결정하도록 지원할 수 있습니다. 예를 들어 CompanyABC.xml로부터 현재 재고량에 대한 데이터를 추출하기 위한 XPath가 아래와 같습니다.

'/rootElement/fileData/xn:childContainer/xn:CompanySpecificContainer/
xn:CompanySpecificContainer/xn:attributes/cs:csProduct/cs:value'

이 회사가 보다 세분화된 형태로 데이터를 저장하기를 원하는 경우, 'substore'를 위한 자식 엘리먼트를 아래와 같이 추가할 수 있을 것입니다:

'/rootElement/fileData/xn:childContainer/xn:CompanySpecificContainer/xn:CompanySpecificContainer/
xn:CompanySpecificContainer/xn:attributes/cs:csProduct/cs:value'

이러한 XML 스키마 설계는 각 기업의 요구 사항에 따라 컨텐트를 자유롭게 배치할 수 있는 여지를 제공합니다. 제너릭 컨테이너 엘리먼트와 참조 옵션을 이용하여 각 문서가 별도의 데이터베이스처럼 기능하도록 구성할 수 있습니다. 이러한 파일의 예측 불허적인 성격을 감안할 때, 커스텀 코드 또는 상용 ETL 패키지를 이용하여 이 XML 데이터를 관리하기 위해서는 매우 번거로운 개발 작업이 필요할 것이며 유지보수에도 많은 비용이 필요할 것입니다. 이 XML 스키마를 사용 중인 회사가 새로운 XPath를 포함시키는 경우, 추출 작업을 위한 코드에도 데이터 캡처를 위한 내용이 추가되어야 합니다. 또 업데이트된 XPath가 적용되지 않은 상태에서 파싱된 파일들은 다시 처음부터 파싱 처리 되어야 합니다. 이처럼 복잡한 XML 스키마의 컨텐트를 관리하기 위해서는 여러 가지 까다로운 문제를 고려해야 합니다.


Oracle XML DB 솔루션


Oracle XML DB는 모든 파일을 데이터베이스 내에 저장하므로 위에서 설명한 XPath 매핑 문제로 고민할 필요가 없습니다. Oracle XML DB 환경에서는 문서가 INSERT 처리되는 즉시 문서의 컨텐트를 바로 조회할 수 있습니다. XML 스키마의 유연성 수준에 관계 없이, 문서에 포함된 데이터는 적절한 XPath를 통해 접근될 수 있습니다. 따라서 데이터의 가용성을 극대화하는 한편 유지 보수 비용을 최소화하는 것이 가능합니다.

XML DB 솔루션을 구현하기 위해서는 먼저 XML 스키마를 등록하는 과정이 필요합니다. (정의 파일과 문서는 XML_TEST 디렉토리에 위치합니다):



XML 스키마를 위한 오브젝트-관계형 구조를 생성한 다음에는, (root 엘리먼트의 주석에 명시된) 디폴트 테이블에 XML 파일을 INSERT 처리합니다.

insert into XML_DEFAULT values (XMLTYPE(BFILENAME ('XML_TEST','CompanyABC.xml'),nls_charset_id('AL32UTF8')));
/

파일의 INSERT 작업은 수 분의 일 초 내에 신속하게 완료됩니다. 그리고 바로 관계형 쿼리를 통해 데이터에 접근할 수 있습니다. 현재 인벤토리 현황을 조회하기 위한 쿼리의 예가 아래와 같습니다:


크게보기

이렇게 구현된 환경에서는 XML 스키마 정의를 준수하는 어떤 문서든 관리가 가능합니다. Oracle XML DB의 데이터 중심형 XML 뷰를 이용하여 다양한 컨텐트의 XML 문서를 작성하고 추상화 계층의 구현을 통해 (다른 ETL 툴에서는 불가피하게 수반되는) 개발 과정의 복잡성을 제거할 수 있습니다.

위의 예는 Oracle XML DB의 강력한 XML 저장/인출 기능을 보여 주고 있습니다. 하지만 복잡한 XML 스키마의 경우 변경 작업 또한 매우 빈번하게 발생할 수 있다는 점을 고려할 필요가 있습니다. Oracle XML DB는 변경 사항을 XML 스키마에 어떤 방식으로 적용할까요?


XML 스키마 변경 내역의 관리


앞의 예를 통해 제너릭 컨테이너 엘리먼트와 참조 옵션을 이용하여 스키마의 유연성을 구현하는 방법에 대해 설명하였습니다. 이러한 설계가 XML 스키마의 유연성을 매우 높여 주는 것은 분명합니다. 하지만 각 기업의 요구 사항이 변경될 때마다 CompanySpecific.1.0.xsd 네임스페이스를 수정해야 할 필요성을 함께 고려할 필요가 있습니다.

스키마 정의에 발생하는 변경 사항을 관리하는 것은 XML 기반 솔루션에서 오래 전부터 문제가 되어 왔습니다. XML 스키마가 XML 문서의 검증을 위해 사용된다는 점을 감안하면 이는 당연한 것입니다. 스키마에 정의되지 않은 엘리먼트가 문서에 포함된 경우, 이 문서는 올바르지 않은 포맷을 가진 것으로 간주됩니다. 과거에는 Oracle XML DB에 이에 관련한 약점이 존재했습니다. 등록된 XML 스키마를 변경하기 위해서는 copyEvolve 프로시저를 사용하여 매우 복잡한 작업을 수행해야 했기 때문입니다. copyEvolove 프로시저는 리소스에 락을 걸고, 임시 테이블을 생성하고, 스키마 내의 모든 XML 테이블 데이터를 임시 테이블로 이동하고, 스키마 변경을 적용한 뒤, 다시 데이터를 XML 테이블로 가져옵니다. XML 테이블의 데이터 용량이 증가하면 할 수록 이 작업에 걸리는 시간은 증가합니다. 테이블의 크기에 따라 다를 수 있지만, 하나의 엘리먼트 또는 속성을 스키마에 추가하는 데에도 수 시간이 걸릴 수 있습니다. 복잡한 XML 환경에서는 이러한 해법이 결코 스키마 관리를 위한 대안으로 고려될 수 없습니다.

오라클은 이러한 문제의 해결을 위해 Oracle XML DB 11g에 inPlaceEvolve라는 새로운 프로시저를 추가하였습니다. inPlaceEvolve 프로시저는 데이터 이동 작업 없이 온라인 상태에서 스키마 수정 작업을 수행할 수 있도록 지원합니다. 따라서 복잡한 XML 환경에서 빈번하게 발생하는 변경 작업을 신속하게 완료할 수 있습니다.

앞의 예에서 csProduct 정의에 새로운 엘리먼트를 추가해야 하는 경우를 생각해 봅시다:



Oracle XML DB 11g에서는 이 변경 작업을 매우 쉽고 간단하게 완료할 수 있습니다. 새로운 inPlaceEvolve 프로시저는 스키마 URL과 xdiff XML 스키마를 준수하는 XMLType 문서(XMLDiff)를 필요로 합니다. XMLDiff 문서는 XML 스키마의 변경 사항을 반영한 특수한 포맷의 문서입니다. XMLDiff 문서를 수동으로 생성하는 대신, 오라클 데이터베이스의 xmldiff 함수를 이용하여 자동으로 생성할 수 있습니다.

먼저 업데이트된 XML 스키마 정의 파일인 CompanySpecific.1.1.xsd를 이용하여 새로운 스키마 파일을 생성합니다. 그런 다음 기존 스키마를 첫 번째 매개변수로, 새로운 스키마를 두 번째 매개변수로 사용하여 오라클 데이터베이스 xmldiff 함수를 실행합니다.



XMLDiff 문서를 조회하기 위한 쿼리는 아래와 같습니다.

select xmldiff(xmltype(:oldSchemaDoc),xmltype(:newSchemaDoc)).getClobVal() from dual;
/

본 예제에서는 XMLDiff 문서의 저장을 위해 CLOB 변수를 사용하고 있습니다.

var diffXMLDoc clob;
begin
select xmldiff(xmltype(:oldSchemaDoc),xmltype(:newSchemaDoc)).getClobVal() into :diffXMLDoc from dual;
end;
/

XMLDiff 문서를 생성했다면, 이제 PlaceEvolve 프로시저를 호출하여 온라인 상태에서 XML 스키마를 변경할 수 있습니다.



트레이스 파일을 조회해 보면 새로운 엘리먼트가 추가된 것을 확인할 수 있습니다:

change to ct sqltype = csProduct1046_T
------------ QMTS Executing SQL ------------
ALTER TYPE "XMLTEST"."csProduct1046_T" ADD ATTRIBUTE "class" VARCHAR2(4000 CHAR) CASCADE NOT INCLUDING TABLE DATA
/
--------------------------------------------

이 새로운 기능을 이용하여 XML 스키마에 대한 관리 효율성을 크게 개선할 수 있습니다. Oracle XML DB를 대규모 엔터프라이즈 환경에서 사용할 수 있는 가능성 또한 크게 높아졌다고 볼 수 있습니다.


실제 적용


Oracle XML DB 11g는 다른 어떤 대안보다도 유용하고 실질적인 포괄적 컨텐트 관리 솔루션을 제공합니다. Oracle XML DB는 각 문서에 대한 데이터베이스 중심형 뷰를 기반으로, XML 컨텐트의 저장 및 인출을 위한 혁신적이고 강력한 대안을 제공합니다. 다양한 저장 옵션을 이용하여 모든 유형의 문서들을 그 크기나 복잡성에 관계 없이 효과적으로 관리할 수 있습니다. XML 스키마 정의의 온라인 업데이트 기능은 컨텐트가 자주 변경되는 환경에서 Oracle XML DB를 이상적인 솔루션으로 활용될 수 있게 합니다.

본 문서에서 설명된 XML 문서의 처리 방법이 꽤 복잡해 보일 수도 있겠지만, 이러한 방법은 실제로 여러 업계에서 표준으로 활용되기 시작하고 있습니다. 통신 업계의 경우, 무선 업체들이 분산 전송 지표(distributing transmission metrics)를 위해 위에서 설명한 것과 유사한 XML 스키마를 이용하고 있기도 합니다. 복잡한 XML 포맷이 제공하는 가치와 유연성, 그리고 Oracle XML DB의 강력한 컨텐트 관리 기능을 감안할 때, Oracle XML DB 11g의 미래는 매우 밝다고 볼 수 있습니다.


V.J. Jain 은 Varun Jain Inc의 오라클 애플리케이션 및 오라클 데이터베이스 부문 수석 컨설턴트입니다. 그가 기고한 다른 자료들을 Oracle-Developer.com에서 확인할 수 있습니다.

여러분의 의견을 보내 주십시오


제공 : DB포탈사이트 DBguide.net

 
출처명 : 한국오라클
Posted by 서오석
,
아나이런..

열심히 라이언일병구하기 번외편을 만들었는데..

교수님이 맘에 들어하시지 않는다..

결국 중간고사 제출 할 영상 다시 만들어야 한다..--;;

'사는 이야기' 카테고리의 다른 글

연구실 이야기 - 졸업프로젝트..  (0) 2008.04.30
쥬니버와 Daum 의 관계  (0) 2008.04.28
여행을 떠나다.  (0) 2008.04.27
연구실이란 공간. - 졸업프로젝트를 하며..  (0) 2008.04.27
핸드폰이라..  (0) 2008.04.27
Posted by 서오석
,

파티션 테이블의 사용이 많아지면서 파티션 테이블의 인덱스에 관심이 높아지는 것은 당연한 일일 것이다. 테이블만 파티션 테이블로 생성한다면 이는 생각만큼의 효용가치는 없게 된다. 테이블을 생성하면서 해당 테이블에 인덱스가 존재하지 않는 경우는 그렇게 많지 않을 것이다. 대부분 테이블에 인덱스를 하나 이상 생성하여 조회 속도의 향상을 기대할 것이다. 이런 이유에서 파티션 테이블에서 파티션 인덱스의 생성은 매우 중요한 역할을 수행하게 된다. 지난 호에서는 로컬 인덱스와 글로벌 인덱스에 대해 언급을 하였다. 파티션 테이블의 인덱스는 로컬 인덱스와 글로벌 인덱스만이 존재하는 것은 아니다. 로컬 인덱스와 글로벌 인덱스가 가용성 등의 관리의 목적이었다면 PREFIX 인덱스와 NONPREFIX 인덱스는 성능 관점에서의 파티션 인덱스의 종류이다.

PREFIX 인덱스와 NONPREFIX 인덱스를 생성하자

PREFIX 인덱스 또는 NONPREFIX 인덱스 또한 로컬 인덱스 또는 글로벌 인덱스와 마찬가지로 가장 기본적인 사항이 인덱스의 생성일 것이다. 가장 먼저 PREFIX 인덱스와 NONPREFIX 인덱스를 생성하는 방법을 확인해 보자.

===============================
CREATE TABLE TEST
(YYYYMMDD VARCHAR2(6) NOT NULL.
ID CHAR(12) NOT NULL,
PHONE_NUMBER CHAR(11))
PARTITION BY RANGE(YYYYMM)
(PARTITION PART_200801 VALUES LESS THAN (‘200802’),
PARTITION PART_200802 VALUES LESS THAN (‘200803’));
CREATE INDEX TEST_IDX ON TEST(YYYYMM, ID)
LOCAL
(PARTITION PK_200801 VALUES LESS THAN (‘200802’),
PARTITION PK_200802 VALUES LESS THAN (‘200803’));
===============================

와 같이 인덱스를 생성한 경우를 확인해 보자. 위의 인덱스는 PREFIX 인덱스가 된다. 물론, 해당 인덱스는 로컬 인덱스이기도 한다. 위의 SQL을 수행한다면 로컬 인덱스이면서 PREFIX 인덱스가 생성이 될 것이다. 이미 로컬 인덱스는 지난 호에서 자세히 언급하였다. 그렇다면 위의 인덱스는 어떤 이유에서 PREFIX 인덱스가 되는가? 그 이유는 간단하다. PREFIX 인덱스는 파티션 인덱스의 파티션을 구분하는 컬럼이 인덱스의 첫번째 컬럼으로 생성하는 경우이다. 위의 예제에서 인덱스는 로컬 인덱스이므로 파티션 테이블을 구성한 파티션 키 컬럼인 YYYYMM 컬럼이 인덱스의 파티션 키 컬럼이 된다. 또한, 해당 인덱스의 첫 번째 컬럼이 YYYYMM 컬럼이므로 해당 인덱스를 PREFIX 인덱스라고 부르게 된다. 따라서, PREFIX 인덱스는 아래와 같이 정의할 수 있을 것이다.


PREFIX 인덱스 - 인덱스의 파티션 키 컬럼과 인덱스를 구성하는 첫 번째 컬럼이 동일한 파티션 인덱스

그렇다면 위와 같이 PREFIX 인덱스가 아닌 경우를 우리는 NONPREFIX 인덱스라고 부르게 될 것이다. 아래에서 NONPREFIX 인덱스를 생성하는 SQL을 확인해 보자.


===============================
CREATE INDEX TEST_IDX ON TEST( ID)
LOCAL
(PARTITION PK_200801 VALUES LESS THAN (‘200802’),
PARTITION PK_200802 VALUES LESS THAN (‘200803’));
===============================

위와 같이 파티션 인덱스를 생성한다면 어떻게 되겠는가? 파티션 테이블은 앞서 예제와 동일한 테이블이라고 가정하자. 해당 인덱스는 로컬 인덱스이기 때문에 인덱스는 YYYY MM 컬럼으로 분리되어 있을 것이다. 인덱스 컬럼은 ID 컬럼으로 구성되므로 인덱스의 파티션 키 컬럼과 인덱스를 구성하는 첫 번째 컬럼이 다르게 된다. 이와 같은 구조로 인덱스가 생성된다면 해당 인덱스를 NONPREFIX 인덱스라고 한다.


NONPREFIX 인덱스 - 인덱스의 파티션 키 컬럼과 인덱스를 구성하는 첫 번째 컬럼이 동일하지 않은 파티션 인덱스

결국, 위와 같은 형태의 인덱스를 NONPREFIX 인덱스라고 하게 된다. 그렇다면 이와 같은 PREFIX 인덱스와 NONPREFIX 인덱스의 차이는 무엇인가? 보기에는 단지 인덱스를 구성하는 컬럼의 위치에 따라 인덱스의 종류가 결정되는 형태이다. 이제부터 PREFIX 인덱스와 NONPREFIX 인덱스의 차이를 확인해 보자.

PREFIX 인덱스는 성능을 위한 보호 장치를 가지고 있다

PREFIX 인덱스가 성능에 대해 보호 장치를 가지고 있다는 것은 무엇을 의미하는가? 그렇다면 NONPREFIX 인덱스는 성능을 위한 보호 장치를 가지고 있지 않은 것인가? NONPREFIX 인덱스는 성능에 대해 보호 장치를 가지고 있지 않게 된다. 그렇다고 NONPREFIX 인덱스가 반드시 성능 문제를 발생시킨다는 의미는 아니다.
앞서 언급한 예제에서 PREFIX 인덱스의 경우를 확인해 보자. 해당 인덱스를 이용하기 위해서는 아래와 같은 SQL이 수행되어야 할 것이다.


===============================
SELECT * FORM TEST
WHERE YYYYMM = ‘200708’
AND ID = ‘200’;
===============================

위와 같이 SQL을 수행한다면 해당 SQL은 테이블이 YYYYMM 컬럼으로 분리되어 있기 때문에 YYYYMM 컬럼의 값이 ‘200708’인 데이터만 저장되어 있는 파티션만을 엑세스하면 원하는 데이터를 모두 추출할 수 있게 된다. WHERE 조건에서 ID 컬럼이 생략되더라도 YYYYMM 컬럼의 값이 ‘200708’인 데이터가 저장되어 있는 파티션만을 엑세스하게 될 것이다.
이처럼 PREFIX 인덱스의 첫 번째 컬럼에 대해 WHERE 조건에서 동일 조건(=)로 조회를 수행한다면 하나의 파티션만 엑세스하여 원하는 결과를 모두 추출할 수 있게 되므로 테이블을 전체 엑세스하는 최악의 경우를 방지할 수 있을 것이다. 이와 같기 때문에 PREFIX 인덱스는 성능을 위한 보호 장치를 가지고 있다고 하게 된다.
하지만, NONPREFIX 인덱스를 이용하는 SQL의 경우에는 이와 같이 하나의 테이블 파티션만을 엑세스하여 원하는 데이터를 모두 추출할 수는 없게 된다. 이 뜻은 NOPREFIX 인덱스를 이용하는 SQL은 전체 인덱스 파티션을 엑세스하여야만 원하는 데이터를 모두 추출할 수 있다는 의미가 된다. 이에 대한 자세한 내용은 다음 호에서 언급하도록 하겠다.



제공 : DB포탈사이트 DBguide.net


출처 : 마이크로소프트웨어
Posted by 서오석
,

이번에 디지털 영상 컨텐츠라는 수업을 듣는데 중간고사로 30초짜리 동영상을 만드는 것이 있어서
해봤다.

기말고사에도 동영상 제작 후 제출 하는 것이라 그냥 기말고사 때 만들 동영상의 에고편으로 만들었다.

대략 줄거리는 라이언 일병 구하기 영화에서 스쳐지나가는 전쟁신에 대한 조명 같은 것이다.

그러니까 주인공들이 잠깐 지나가는 곳을 배경으로 그 곳의 전투를 외전처럼 만들 생각이다.

뭐.. 만드는 툴은 프리미어2.0이랑 Company of hero의 시네마 모드를 이용해서 만든 것이고 사운드는 라이언 일병 구하기 영화에서 일부 가져왔다.

Company of hero의 카메라 앵글 및 조작기능이 제한적인데다가 한번 플레이하면 뒤로 돌리는 기능이 없어서 잘못 찍으면 다시 플레이를 봐야한다. 한번 플레이 시간이 1시간 정도 되니 토나온다..ㅋ

음.. 감상해봅시다~!

 



근데 교수님이 맘에 안들어 하시면 다른 거 만들어야 겠다.-0-;;
Posted by 서오석
,
데이터베이스 쿼리문의 가장 기본적인 SELECT이다.

근데 써보면 알겠지만 이론적으로는 쉬운데 실제로 해보면 무진장 어렵다.

더군다나 쿼리튜닝을 하는 건 더 어렵다.

그래서 우선 여기선 가장 기본적인 쿼리문을 보여주려고 한다.

SELECT *|{DISTINCT} column|expression [alias],....}
   FROM table;

각각의 옵션을 보자.

* : 이건 From에 쓴 테이블이 가지고 있는 column을 모두 보여준다.
DISTINCT : 만약 tuple의 중복값을 제거 하고 싶은 경우 사용한다. 근데 되도록 안쓰는게 좋다.
column|expression : 자신이 보고 싶은 테이블의 컬럼명이나 함수들을 쓴다.
[alias] : 컬럼에 줄임말(닉네임)을 붙여줄 때

Ex)

Posted by 서오석
,
음..
이 소프트웨어는 꽤나 옛날 프로그램이다. 1991년에 만들어졌다고 하는데 버전이 0.14가 마지막인 것 같다.
뭐 나름 여러 기능을 가지고 있고 은근히 확장성도 좋아서 쓸만하다.



이 프로그램을 인스톨 하고나서 케이웨더 플러그인을 설치해야 한다.
다른 압축 파일을 열면 폴더 한개와 파일 두개가 나온다.
사용자 삽입 이미지

위의 kweather폴더는 프로그램이 설치된 폴더 안의 Skins\Tranquil 안에 옮겨준다.

사용자 삽입 이미지
그 다음 설정파일인 FileReadPlugin.dll과 WebParser.dll은 rainmeter\Plugins 안에 붙여넣기를 해준다
폴더 안에 파일이 있다고 나오면 덮어쓰기해주면 된다.

이제 날씨 설정을 해보자. 물방울 아이콘에서 마우스 오른쪽을 눌러 설정에 들어가자
설정 항목은 Configs-> Tranquil-> Kweather.ini을 클릭하면 된다.

사용자 삽입 이미지
그럼 바탕화면 좌측 상단에 흰색으로 날씨에 관한 글이 뜨기 시작한다.
근데 아마 보면 아무것도 안나올 것이다.
여기서 Kweather 자체 설정을 들어가서 변경해주어야 할 부분이 있다.

사용자 삽입 이미지

저기서 Edit Skin이라는 것을 누르자.
그럼 각종 설정을 할 수 있는 텍스트 창이 뜨게 된다.

사용자 삽입 이미지
Update는 날씨를 업데이트할 시간이다 기본값은 1000이고 그냥 바꾸지 말도록 하자.

Locale= 은 바로 자신이 살고 있는 곳의 숫자를 입력해야하는 곳이다 필자는 서울에 살고 있으므로 9이지만 지방에 사는 사람들은 위의 Variables에서 자신의 도시이름을 찾아서 입력하도록 하자.

TxtPath의 값을 바꾸어주어야 하는데 C:\DOCUME~1\MASTER\LOCALS~1\Temp\Rainme~1\data
부분 중 \MASTER\ 이 부분이 유저 이름이다. 이건 각각의 컴퓨터마다 이름이 다르다.
자신의 유저 이름을 알고 싶으면 C:\Documents and Settings에 가보자. 그럼 자신이 쓰는 유저이름이 나올 것이다. 단 dos형식으로 적어줘야한다.
예를 들어 자신의 유저이름이 '오돌이바보같은넘' 이라면 오돌이~1 이렇게 적어줘야한다.
그럼  C:\DOCUME~1\오돌이~1\LOCALS~1\Temp\Rainme~1\data 이렇게 될 것이다.

마지막으로 날씨가 뜨는 글자체가 흰색으로 되어있기 때문에 이것을 검은색 혹은 자신이 원하는 색으로 변경해주도록 하자.
Systemcolor1 = 255,255,255,200  이라고 되어있는데 이 3자리 숫자가 칼라다. RGB를 사용하기 때문에 0에 가까운 숫자들 일수록 검은색에 가깝다.

이렇게 했으면 저장을 하고 설정창에서  Refresh all을 누르면 변경된 사항이 저장된다.

 그리고 드레그 해서 자신이 원하는 화면에 가져다 둔다. 그 다음 스킨 옵션에 keep on screen과 Hide on Mouse Over 를 채크하고 Draggable을 비활성화시켜서 화면에 고정해버린다.

이로서 날씨 설정이 끝났다. 다 끝나면 화면에 이렇게 뜰 것이다.

사용자 삽입 이미지
마우스를 가져가면 이 글씨들이 사라진다.

물론 더 간편한 날씨정보 프로그램이나 위젯들이 있지만 개인적으로 케이웨더의 기상정보가 굉장히 잘 맞는 편이기 때문에 필자는 설정이 다소 복잡하더라도 이걸 쓰는 중이다.

그리고 시스템을 모니터링하는 화면을 보여주는 것은 매우 간단하다.
사용자 삽입 이미지
저 Bar의 Bar-CD를 누르면된다. CDEFG는 하드디스크의 숫자이다 자신의 하드디스크가 E드라이브까지 있다면 Bar-CDE를 체크하면 된다.

그럼 이런 시스템 모니터링 화면이 나온다.
사용자 삽입 이미지

깔끔하고 필요한 부분만 있어서 좋다.

Skin에 보면 다른 플러그인들도 있지만 이 두개가 좋다. 참고로 이 소프트웨어를 사용하면 대략 메모리가 10메가정도 먹는다.
사용자 삽입 이미지

음 가벼운건지는 잘 모르겠지만 어쨋건 요즘 컴퓨터에선 어떻게 보면 별 문제가 되지 않는다.

바이러스와 관련된 이야기

Posted by 서오석
,

View는 사용자가 실제로 테이블을 만들고 데이터를 집어넣어서 사용하는 것이 아니라 이미 만들어진 Table에서 자신이 원하는 일부를 마치 테이블 처럼 정의 한 것이다.

뷰를 만드는 형식은 아래와 같다.

CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW viewname  [(alias[, alias..)]
AS subqurey
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY [CONSTRAINT constraint]];
     
각각의 옵션을 보자

OR REPLACE : 만약에 기존에 만들어 놓은 똑같은 이름의 View가 있다면 덮어 써라.
         FORCE : DB에 View로 사용할 테이블이 존재하지 않더라도 View를 만들어라.
     NOFORCE : DB에 View로 사용할 테이블이 존재하지 않으면 만들지 말아라.
WITH CHECK OPTION : View에서 insert, update 작업을 할때 사용되는 제약사항을 기술한다.
WITH READ ONLY : 이 옵션을 사용하면 View는 오직 읽기만 가능하다.      


ex) EMPLOYEE 테이블의 EMPNO와 NAME을 VIEW로 만들고 싶은 경우
    1. 기본 문법
      CREATE VEIW EMPLOYEE_VIEW AS
      SELECT EMPNO, NAME
         FROM EMPLOYEE;

사용방법은 SELECT 문과 같다.
 
     SELECT *
        FROM EMPLOYEE_VIEW;

  2. 옵션을 사용한 문법
      CREATE OR REPLACE VIEW EMPLOYEE_VIEW AS
      SELECT EMPNO, NAME
         FROM EMPLOYEE
           WITH READ ONLY;

Posted by 서오석
,

이 문제는 윈도우용 오라클 사용자들에게 일어나는 문제다.

Oracle10g를 예로 들어서 설명하겠다.

EM으로 들어가서 어떠한 설정을 할 경우 저장을 하기 위해 시스템을 shutdown하거나 restart해야한다. 이때 EM에서 아래와 같은 화면을 만나게 된다.

사용자 삽입 이미지

문제는 DB의 sys 계정과 OS 계정의 패스워드를 입력하면 OS 패스워드가 틀렸다고 나오면서 다음화면으로

넘어가지 않는다. 이걸 해결하려면 몇가지 절차를 진행시켜 줘야한다. 아래외 같이 순서대로 진행해 보자.

1. C:\WINDOWS\system32\drivers\etc\hosts 파일을 notepad로 open한다.

맨 아래 보면 이런 형식이 있다.

   (형식) 
   자신의 DB서버IP주소  HOSTNAME

여기다가 자기 컴퓨터의 IP와 컴퓨터 이름을 입력한다.
컴퓨터 이름은 "내 컴퓨터->마우스오른쪽->속성->컴퓨터 이름"에서 확인할 수 있다.

(내 컴퓨터 이름이 havana 라면..)
   (예) 
   172.16.5.205    havana   <--추가  (자신의 컴퓨터가 유동IP라면 IP대신 localhost라고 쓰자)

2. 시작-->실행-->regedit 엔터

[내컴퓨터]-> [HKEY_LOCAL_MACHINE]->[SOFTWARE]->[ORACLE]-> [KEY_OraDB10g_home1]

오른쪽 창에서 마우스 오른클릭 후, [새로만들기]-> [문자열값] TNS_ADMIN 입력 후, [엔터]-> 생성된 TNS_ADMIN 항목을 더블클릭

--> 나타나는 박스의 값에  C:\oracle\product\10.2.0\db_1\NETWORK\ADMIN 입력 후, 엔터
(여기에 입력하는 값은 자기가 인스톨한 오라클의 경로로 해야 한다.)
                     
3. OS 로그인계정(administrator) 비번 설정

제어판->사용자계정에 들어가서 자신의 계정에 비밀번호를 넣어준다.

4. 권한 부여

[제어판]--> [관리도구] --> [로컬보안정책] 실행

왼쪽 창에서 [로컬정책] 더블클릭 --> [사용자 권한할당] 선택
오른쪽 창에서 [일괄 작업으로 로그온] 더블클릭 후 실행되는 등록정보 창에서 다음 수행

 [사용자 또는 그룹추가] 버튼 클릭 --> [고급] --> [지금찿기]--> [administrator] 선택 --> [확인]
 --> [고급] --> [지금찿기] -->[SYSTEM] 선택 --> [확인]--> [확인] --> [확인]


5. db console 재기동

cmd 창 실행

c:\>set ORACLE_SID=oracle ('oracle'은 자신의 오라클 SID임 **10g default는 orcl임**)

C:\>emctl stop dbconsole

C:\>emctl start dbconsole

이렇게하면 문제가 해결된다.

참고로 유닉스 계열의 OS에서는 일어나지 않는다.

 

Posted by 서오석
,