Web Application Stress Test
목 차 1 Web Application Stress Test Overview. 2 Web Application Stress Test Tool A. ACT(Microsoft Application Center Test) ? 스크립트 작성법.. ? 테스트 속성 설정.. B. OpenSTA(Open System Testing Architecture) ? 스크립트 작성법.. ? 테스트 속성 설정.. C. ACT vs OpenSTA. D. Performance Monitor(성능 모니터) ? 성능 카운터 항목.. ? 성능 모니터 사용 권고 사항.. 3 Web Application Stress Testing. A. 스트레스 테스트 계획.. ? 테스트 목적 설정.. ? 테스트 환경 설정.. ? 테스트 시나리오 정의.. B. 스트레스 테스트 실행.. ? System Performance(응답시간) ? System Capacity(용량) C. 스트레스 테스트 분석.. ? 테스트 결과 분석 가이드..
웹 어플리케이션 개발 후 실제 운용 상황을 가상하여 테스트를 실시함으로써 어플리케이션, 시스템, 네트워크 상황들을 점검해보는 목적이다. 안정적으로 동시 사용자 x 명까지 수용할 수 있는 시스템이다라는 가정을 검증하는 과정이다. ACT(Microsoft Application Center Test)는 웹 어플리케이션에 대한 성능 테스트를 수행하고 관련 성능 정보를 수집하여 해당 웹 어플리케이션의 성능을 가늠해 볼 수 있게 해주는 툴이다. 웹 어플리케이션이 이용되는 상황을 스크립트로 작성하여 시뮬레이션 할 수 있다. 1. [시작] -> [프로그램] -> [Microsoft Visual Studio .NET] ->[ Visual Studio .NET Enterprise Features] -> [Microsoft Application Center Test]를 선택하여 ACT를 시작한다. 2. [파일]->[새 프로젝트]를 선택하여 프로젝트 이름과 저장될 위치를 지정한다. 이름 : WooriBanca Stress Test , 위치 : \ WooriBanca\Stress Test\ 3. 새로 생성된 프로젝트 폴더의 [테스트]에서 마우스 오른쪽을 눌러 [새 테스트(N)…]를 선택한다. 5단계의 테스트 마법사가 실행된다. ![](http://www.gosu.net/GosuWeb/Article/200411/321/GB3XWFXSNJ3K@namo.co.kr_clip_image002.jpg)
4. 마법사 2번째 단계 ‘테스트 원본 선택’에서 “새 테스트 기록하기”를 선택한다. 이는 매크로 기능처럼 사용자가 취한 행위를 vbs 스크립트로 자동 생성해준다. 4번째 단계 ‘브라우저 기록’에서 “기록시작”을 누르면 신규 브라우저가 화면에 나타난다. 이 페이지에서 시작하여 우리은행 Bancassurance 의 특정 업무를 수행하는 과정을 실제 시뮬레이션 한다. 끝나면, 기록중지를 누른다. 테스트 명을 지정(Woori Banca test)하고 마친다. 테스트 속성에는 일반 / 사용자 / 카운터 3개의 탭 페이지가 있다. l 일반 : 테스트 회수, 시간 등을 설정 ![](http://www.gosu.net/GosuWeb/Article/200411/321/0MTK03S8K0AM@namo.co.kr_clip_image004.jpg)
Ø 테스트 로드 수준 브라우저 동시 연결 수 : ACT는 지정된 수만큼 동시에 브라우저 연결을 설정한다. 실제 프로세스가 뜨는 것은 아니다. Ø 테스트 지속 시간 : 지정한 시간 동안 반복적으로 테스트를 수행한다. Ø 지정한 횟수만큼 테스트 실행 : 실행시간에 상관없이 스크립트 수행을 지정된 회수만큼 수행한다. l 사용자 : 사용자 인증과 쿠키 처리 방식을 설정 ![](http://www.gosu.net/GosuWeb/Article/200411/321/P862B5FJP108@namo.co.kr_clip_image006.jpg)
l 카운터 : 테스트시 모니터링할 서버, 클라이언트의 성능 카운터 설정 <![endif]>
Ø 테스트 수행과정에서 서버 및 클라이언트에서 모니터링 할 카운터를 설정한다. Ø 원격 컴퓨터의 성능카운터를 확인하려면 관리자 권한이 있어야 한다. OpenSTA(Open System Testing Architecture)는 WAE(Web Application Environment)하에서 동작하는 웹 서버, 어플리케이션 서버 및 데이터베이스 서버 등에 부하테스트를 수행할 수 있는 성능 테스팅 툴(Performance Testing Tool)이다. 가상 유저(Virtual User)를 이용한 실 사용자와 동일한 부하를 생성할 수 있고 생성된 스크립트의 결과 등 분석 자료를 추출할 수 있다. http://opensta.org/download.html 에서 프로그램을 다운로드 할 수 있고 http://portal.opensta.org/ 에서 필요한 기술 정보를 얻을 수 있다. 1. [시작] -> [프로그램] -> [OpenSTA] -> [OpenSTA Commander]를 선택하여 OpenSTA를 시작한다. 2. 아래의 그림의 메뉴를 이용해 새로운 테스트 스크립트를 생성하고 디폴트 이름을 적절하게 변경한다.
3. 생성된 스크립트를 더블 클릭하여 나온 아래와 같은 화면에서 버튼을 클릭하여 브라우저를 통해서 테스트 시나리오를 레코딩한다.
4. 아래의 그림의 메뉴를 이용해 새로운 테스트를 생성하고 디폴트 이름을 적절하게 변경한다.
5. 테스트를 더블 클릭하여 나타난 화면에 테스트하고자 하는 Script를 끌어다 놓는다. 하나의 테스트에는 여러 개의 테스
Posted by tornado
[방문히트이벤트] 7000 히트를 잡아라!박종복님이 당첨되었습니다. |
Posted by tornado
|
데이터 모델 정규화/반정규화의 실전 프로젝트 적용 이춘식 정규화를 잘 이해하여 데이터 모델링을 해야 하는 프로젝트 모델러가 이를 정확하게 이해하지 못하는 경우가 종종 있다. 검증되어 있고 체계화된 이론적 기반 위에 데이터베이스라는 기초를 건축하지 않으면 그 데이터베이스는 모래 위에 세운 집처럼 금방 무너지고 말 것이다. 정규화의 이론은 건축물의 기초공사를 해야 하는 사상에 해당한다. 그저 어렴풋이, 알듯 모를듯 희미한 기억의 지식으로 튼튼하고 견고한 데이터 모델을 만들어 낼 수 없다. “붕어빵에 붕어가 없다!”고 한다. 데이터 모델링을 학교나 학원에서 배운 사람이나 시스템 구축 프로젝트에서 데이터 모델링을 경험한 사람치고 정규화에 대한 이야기를 듣거나 이야기하지 않은 사람은 없을 것이다. 그만큼 정규화의 이론은 데이터를 분석하여 데이터 모델로 만들고 그것을 다시 데이터베이스화하는 이론의 뿌리가 되는 중요한 것이다. 그러나 붕어빵에 붕어가 없듯이 정규화에 대한 언급은 누구나 하지만 정규화에 대한 내용을 정확하게 이해하고 실전에 적용할 수 있는 사람은 의외로 극히 드물다는 사실을 즉시해야 하고 사태의 심각성을 인식할 필요가 있다. 정규화에 관련된 이론을 배운다고 하면 대부분 과목, 수강신청, 교수 등 항상 정해진 샘플 사례에 표시 방법도 과목코드->과목명과 같이 설명되어 실전 프로젝트에서 사용하는 표기법(notation)과 동 떨어져 있다. 따라서 학습할 때는 개념적으로 이해한다고 하더라도 혹은 적어도 시험문제가 출제되면 100점은 맞는다고 하더라도, 실전 프로젝트에서는 무엇을 어떻게 왜 그렇게 해야 하는지 도무지 이해하지 못하는 경우가 대부분이다. 잘 정리된 이론은 실세계에서 응용되어 다른 창조물을 도출할 수 있을 때 비로소 지식가치의 효용이 있다. 하지만 불행히도 정규화의 이론은 그 내용이 너무 훌륭함에도 불구하고 실전에 반영하는 방법을 정확하게 알지 못해 그의 가치를 제대로 적용하지 못하는 경우가 자주 나타나는 것이다. 이제 우리의 눈을 희미하게 하는 이론의 틀을 깨고 개념을 명확하게 하여 실전에서 곧 바로 적용할 수 있는 참된 지식가치로 정규화의 이론을 활용해 보자. 정규화 규칙은 어디에 쓰는 물건인가? “그런데 실전 프로젝트에서는 정규화를 적용한 적이 없습니다!”라고 반문하는 독자도 있을 것이다. 맞는 이야기이다. 프로젝트에서는 정규화라고 하는 태스크(task)로 일을 진행하지는 않는다. 다만, 프로젝트에서 데이터 모델링을 할 때는 논리 모델->물리 모델 2단계로 수행하거나 개념 모델->논리 모델->물리 모델 3단계 또는 객체지향 분석설계에서는 클래스 다이어그램->OR(객체-관계형) 맵핑->물리 모델로 하거나 업무가 익숙하고 시스템의 규모가 작은 경우 곧 바로 물리적인 데이터 모델링을 하는 경우로 진행한다. “그렇다면 데이터베이스에서 그렇게 중요하다고 하는 정규화 방법은 활용되지 않는가?”라고 반문할 수 있다. 정규화 규칙은 실제 프로젝트에서 두 가지 성격으로 중요하게 반영이 된다. 첫 번째는 엔티티 타입을 오브젝트 분석 방법에 의해 도출할지라도 분석 방법의 배경에는 이미 중복 제거 및 주식별자에 의한 종속과 속성에 의한 종속 등 제3정규화 규칙이 모델링 작업의 기초에 관여한다고 봐도 된다. 즉 숙련된 데이터 모델러는 이미 정규화에 대한 개념이 확보된 상태에서 각각의 오브젝트를 엔티티 타입으로 선정하며 새로운 엔티티 타입으로 분리될 때도 각 속성의 집합 개념과 종속성의 개념을 적용하여 분리시켜 나간다. 두 번째는 정규화 방법을 프로젝트에서 적절하게 활용하기 위해서는 오브젝트별로 엔티티 타입을 분석해가면서 각각의 오브젝트가 적절하게 도출이 되었는지 또는 더 분리되어야 해야 하는지를 정규화 규칙에 대입하며 검증하는 것이다. 또한 단계별로 작업이 수행된 이후에 정규화 규칙에 의해 모든 엔티티 타입에 대해서 검증하는 작업이 필요하고 이상이 있는 경우에는 정규화 규칙을 적용하여 엔티티 타입을 정제해 나가도록 한다. 정규화의 의미 그러면, 데이터 모델링에서 정규화는 무엇을 의미하는가? 1970년 6월 E.F Code 박사는 ‘대규모 데이터 저장을 위한 관계형 데이터 모델(A Relational Model of Data for Large Shared Databanks)’이라는 연구에서 새로운 관계형 모델을 발표했다. 수학자인 Code 박사에 의해 제안된 정규화의 이론은 실세계에서 발생하는 데이터들을 수학적인 방법에 의해 구조화시켜 체계적으로 데이터를 관리할 수 있도록 하였다. 처음에는 1차 정규화, 2차 정규화, 3차 정규화가 제시되었으나 이후에 보이스-코드 정규화가 제시되었고, 이후 4차 정규화, 5차 정규화의 이론이 발표되었다. 정규화(normalization)란 다양한 유형의 데이터 값 검사를 통해 데이터 모델을 더 구조화시키고 개선시켜 나가는 절차에 관련된 이론이다. 정규화가 프로세스를 나타내는 의미라면 정규형(normalform)은 정규화가 완성된 이후의 엔티티 타입(테이블)을 지칭하는 용어이다. 정규화를 이해하기 위해서는 이론적인 기반이 되는 함수 종속성을 이해할 필요가 있다. 함수의 종속성(functional dependency)은 데이터들이 어떤 기준 값에 의해 종속되는 현상을 지칭하는 것이다. 이 때 기준 값을 결정자(determinant)라 하고 종속되는 값을 종속자/의존자(dependent)라고 한다. <그림 1> 함수의 종속성 <그림 1>을 보면 사람이라는 엔티티 타입에는 주민등록번호, 이름, 출생지, 호주라는 속성이 존재한다. 여기에서 이름, 출생지, 호주라는 속성은 주민등록번호 속성에 종속된다. 만약 어떤 사람의 주민등록번호가 신고되면 그 사람의 이름, 출생지, 호주가 생성되어 단지 하나의 값만을 가지게 된다. 이를 기호로 표시하면 다음과 같다. 주민등록번호 -> (이름, 출생지, 호주) 즉 ‘주민등록번호가 이름, 출생지, 호주를 함수적으로 결정한다’라고 말할 수 있다. 실세계의 데이터들은 대부분 이러한 함수 종속성을 가지고 있다. 함수의 종속성은 데이터가 가지고 있는 근본적인 속성으로 인식되고 있다. 정규화의 궁극적인 목적은 반복적인 데이터를 분리하고 각 데이터가 종속된 테이블에 적절하게(프로세스에 의해 데이터의 정합성이 지켜질 수 있어야 함) 배치되도록 하는 것이므로 이 함수의 종속성을 이용하여 정규화 작업이나 각 오브젝트에 속성을 배치하는 작업을 한다. • 정규화는 적절한 엔티티 타입에 각각의 속성들을 배치하고 엔티티 타입을 충분히 도출해가는 단계적인 분석 방법이다.• 정규화 기술은 엔티티 타입에 속성들이 상호 종속적인 관계를 갖는 것을 배경으로 종속 관계를 이용하여 엔티티 타입을 정제하는 방법이다.• 각각의 속성들이 데이터 모델에 포함될 수 있는 정규화의 원리를 이용하여 데이터를 분석하는 방법에서 활용될 수 있다.• 정규화는 현재 데이터를 검증할 수 있고 엔티티 타입을 데이터가 표현하는 관점에서 정의하는데 이용할 수 있다.• 정규화는 엔티티 타입을 분석하는 관점이 오브젝트별 분석하는 방법이 아닌 개별 데이터를 이용한 수학적인 접근방법을 통해 분석하는 방법이다. 정규화에 대한 실전 프로젝트 적용 사례 <표 1>은 1차 정규화, 2차 정규화, 3차 정규화와 보이스-코드정규화 그리고 4차와 5차 정규화에 대한 정리이다. 정규화의 정의를 이용하여 실전 프로젝트에서는 어떻게 적용할 수 있는지 살펴보자. <표 1> 정규화에 대한 정리 정규화 | 정규화 내용 | 1차 정규화 | 복수의 속성 값을 갖는 속성을 분리 | 2차 정규화 | 주식별자에 종속적이지 않은 속성의 분리 부분 종속 속성을 분리 | 3차 정규화 | 속성에 종속적인 속성의 분리 이전 종속 속성의 분리 | 보이스-코드 정규화 | 다수의 주식별자 분리 | 4차 정규화 | 다가 종속 속성 분리 | 5차 정규화 | 결합 종속일 경우는 두 개 이상의 N개로 분리 |
1차 정규화(복수의 속성 값을 갖는 속성의 분리) 1차 정규화(first normalization)는 복수의 속성 값을 가진 속성을 분리한다. 즉 테이블 하나의 컬럼에는 여러 개의 데이터 값이 중복되어 나타나지 않아야 한다는 것이다. 이는 각 속성에 값이 반복 집단이 없는 원자 값(atomic value)으로만 구성되어 있어야 한다는 것을 의미한다. 이를 다시 정의하면, “모든 엔티티 타입의 속성에는 하나의 속성 값만을 가지고 있어야 하며 반복되는 속성 값의 집단은 별도의 엔티티 타입으로 분리한다”로 정의할 수 있다. 이 때 전제조건은 결정자에 의존하는 의존자의 반복성을 나타낸다. 실전 프로젝트에서 나타나는 데이터 모델의 표기법을 이용한 사례를 보도록 하자. 1차 정규화 사례 1 ‘한 번의 주문에 여러 개의 제품을 주문한다’는 업무 규칙이 있는데 <그림 2>의 왼쪽 편과 같이 데이터 모델링을 했다고 가정해 보자. 왼쪽의 엔티티 타입은 하나의 주문에 여러 개의 제품이 존재하므로 주문번호, 주문일자, 배송요청일자의 동일한 속성 값이 주문한 제품의 수만큼 반복해서 저장될 것이다. 따라서 오른쪽과 같이 1차 정규화를 적용하여 중복속성 값을 제거한다. <그림 2> 1차 정규화의 응용 1 이 사례의 특징은 주문의 PK(Primary Key)인 주문번호가 중복 속성 값을 가지기 때문에 PK를 가진 데이터베이스 테이블 생성이 불가능하다는 특징이 있다. 1차 정규화 사례 2 로우(Row) 단위로 1차 정규화가 안 된 모델은 PK의 유일성이 확보되지 않으므로 인해 실전 프로젝트에서는 거의 찾아보기가 힘들다. 반면 로우 단위로 중복된 내용을 컬럼 단위로 펼쳐 중복하는 경우가 아주 많이 발견된다. 1차 정규화의 응용이 된 형태로 볼 수 있다. 계층형 데이터베이스에서 이와 같은 형식의 모델링을 많이 했는데 관계형 데이터베이스에서도 이러한 형식으로 모델링을 진행하는 경우가 많이 발견된다. <그림 3> 1차 정규화의 응용 2 <그림 3>의 모델을 보면 왼쪽 모델의 일재고 엔티티 타입에는 3개월 분에 대한 장기재고 수량, 주문수량, 금액, 주문금액이 차례대로 기술되어 있다. 이렇게 되면 장기재고 관리가 4개월 이상으로 늘어날 때 모델을 변경해야 하는 치명적이 결함이 있다. 따라서 오른쪽과 같이 1차 정규화를 통해 모델을 분리함으로써 업무 변형에 따른 데이터 모델의 확장성을 확보하도록 해야 한다. 2차 정규화(주식별자에 종속적이지 않은 속성의 분리) 1차 정규화를 진행했지만 속성 중에 주식별자에 종속적이지 않고 주식별자를 구성하는 속성의 일부에 종속적인 속성인, 부분종속 속성(PARTIAL DEPENDENCY ATTRIBUTE) 을 분리하는 것이 2차 정규화(SECOND NORMALIZATION)이다. 2차 정규화는 반드시 자신의 테이블을 주식별자를 구성하는 속성이 복합 식별자일 경우에만 대상이 되고 단일 식별자일 경우에는 2차 정규화 대상이 아니다. 2차 정규화 사례 여러 개의 속성이 주식별자로 구성되어 있을 때 일반속성 중에서 주식별자에 일부에만 종속적인 속성이 있을 경우 2차 정규화를 적용하여 엔티티 타입을 분리하도록 한다. <그림 4> 2차 정규화 응용 <그림 4>의 모델은 고객번호에 종속적이지 않은 속성들을 분리하여 고객점포라는 새로운 엔티티 타입을 생성하였다. 실전 프로젝트에서는 코드 유형의 엔티티 타입들이 2차 정규화가 되지 않고 하나의 엔티티 타입으로 표현되는 경우가 많이 발견된다. 이 모델에서 함수종속 관계 표기법으로 표기하자면 고객번호 -> (고객명)으로 표시하여 별도의 엔티티 타입으로 분리할 수 있다. 3차 정규화(속성에 종속적인 속성 분리) 3차 정규화(third normalization)는 속성에 종속적인 속성을 분리하는 것이다. 즉 1차 정규화나 2차 정규화를 통해 분리된 테이블에서 속성 중 주식별자에 의해 종속적인 속성 중에서 다시 속성 간에 종속 관계가 발생되는 경우에 3차 정규화를 진행한다. 3차 정규화의 대상이 되는 속성들을 이전 종속(transitive dependence) 관계 속성이라고 한다. 이것은 곧 주식별자에 의해 종속적인 속성 중에서 다시 다른 속성을 결정하는 결정자가 존재하여 다른 속성이 이 결정자 속성에 종속적인 관계를 나타낸다. 3차 정규화 실전 적용 결정자 역할을 하는 일반 속성이 존재하고, 결정자 역할 속성에 의존하는 의존자가 존재하는 엔티티 타입은 3차 정규화의 대상이 된다. <그림 5> 3차 정규화 응용 <그림 5>의 모델은 고객 엔티티 타입에 등록카드에 대한 정보가 포함되어 있는 모습이다. 등록카드번호가 결정자 역할을 하고 있고 등록카드사명과 등록카드유효일자가 의존자 역할을 하는 속성 간의 종속적인 속성이 발견되었으므로 3차 정규화의 대상이 되는 모델이다. 따라서 등록카드에 대한 내용에 대해 별도의 엔티티 타입을 도출한 오른쪽 모델로 만듦으로서 3차 정규화를 완성하였다. 실전 프로젝트에서는 1:1관계의 엔티티 타입이 하나로 통합이 되었거나 업무분석 과정에서 하나의 엔티티 타입에 많은 속성이 포함되어 있을 때 3차 정규화의 대상이 되는 경우가 많이 나타난다. 이 모델에서 함수종속 관계 표기법으로 표기하자면 등록카드번호 -> (등록카드사명, 등록카드유효일자)으로 표시하여 별도의 엔티티 타입으로 분리할 수 있다. 보이스-코드 정규화 1차 정규화, 2차 정규화, 3차 정규화는 모두 하나의 주식별자를 가졌을 때를 가정하여 진행하였다. 만약 하나의 테이블에 여러 개의 식별자가 존재하면 비록 1, 2, 3 정규형을 모두 만족하더라도 데이터를 조작하는 데 문제가 발생될 수 있다. 복잡한 식별자 관계에 의해 발생되는 문제를 해결하기 위해 3차 정규화를 보완한 보이스-코드 정규화(boyce-code normalization)를 진행한다. 보이스-코드 정규화란 테이블에 존재하는 식별자가 여러 개 존재할 경우 식별자가 중복되어 나타나는 현상을 제거하기 위해 정규화 작업을 진행한다. BCNF 실전 적용 납품 엔티티 타입의 주식별자는 부품번호, 부품이름, 납품번호 세 개의 속성의 구성이 되어 있고 세 개의 속성을 구성한 주식별자는 납품수량, 납품단가에 대해 결정자 역할을 한다. 그런데 부품번호+납품번호 만으로도 납품수량, 납품단가에 대해 결정자 역할을 할 수도 있고 부품이름+납품번호 만으로도 납품수량, 납품단가에 대해 결정자 역할을 할 수도 있다. 또한 부품번호와 부품이름은 상호간에 결정자역할을 하는 특성을 가지고 있다. 이러한 성격을 이용하여 데이터 모델에서는 최소의 속성의 조합이 주식별자를 갖게 하도록 BCNF(Boyce Codd Normal Form)를 적용한다. 즉, 부품번호를 주식별자로 하여 하여 부품을 구성하거나 부품이름을 주식별자로 하여 부품 엔티티 타입을 분리하여 납품과 관계를 갖게 하는 형식으로 정규화를 진행하는 방식이 바로 보이스-코드 정규화 방법이 된다. <그림 6> BCNF 정규화의 응용 개념적 설명은 무척 까다롭지만 실전 사례를 통해서는 쉽게 이해되는 부분이다. 다시 한 번 정리하면, 주식별자 속성 중에 주식별자의 유일성을 확보하는 최소한의 속성이 아닌 쓸데없이 추가된 속성을 분리하는 것이 보이스-코드 정규화라고 할 수 있다. 또한 주식별자 속성 중에 상호간의 함수종속 관계를 가지는 것을 분리한다. <그림 6>의 부품번호와 부품이름 사례처럼 단독으로 주식별자에 참여할 수 있으면서 상호간의 종속 관계가 있는 코드, 코드명을 생각하면 쉽게 이해될 수 있다. 주식별자 속성이 많아질수록 보이스-코드 정규화의 대상이 되는 경우가 나타나므로 개념을 잘 정리하여 실전에서 데이터 모델을 검증할 수 있도록 해야 한다. 4차 정규화(특정 속성 값에 따라 선택적인 속성의 분리) 보이스-코드 정규화까지 정규화 작업을 진행하면 함수의 종속성에 관한 작업은 모두 정리가 되었다. 이제 더 이상 속성 사이의 종속적인 관계로 인해 발생하는 정규화 작업은 필요하지 않게 되는 것이다. 그러나 하나의 테이블에 두 개 이상의 독립적인 다가속성(multi-valued attribute)이 존재하는 경우에 다가종속(multi-valued dependency)이 발생되어 문제가 생긴다. 다가종속이라는 단어를 해석하면, 하나의 속성 값에 두 개의 이상의 의미를 가지는 값을 가지는 것을 의미한다. 4차 정규화의 대상이 되는 경우는 실제 프로젝트에서는 독립적인 엔티티 타입을 설계할 때 발생하기 보다는 동시에 여러 개의 엔티티 타입과의 관계에서 발생되는 경우가 많이 있다. 4차 정규화의 실전 적용 <그림 7>과 같은 업무 규칙이 있다. ‘한 명의 사원은 여러 개의 프로젝트를 지원할 수 있다’ 그리고 ‘한 명의 사원은 여러 개의 기술을 보유할 수 있다’ 즉 사원과 프로젝트, 사원과 기술 간의 업무적인 관계의 규칙이 있는 경우이다. 이 업무 규칙은 보유하는 기술이 있다는 사실을 관리하고 보유한 기술은 지원한 프로젝트와는 아무런 상관이 없다는 것이 특징이다. 그럼에도 불구하고 <그림 7>의 왼쪽처럼 사원과 프로젝트와 기술 간의 관계를 모두 연결하면 4차 정규화의 규칙을 위배하여 어떤 사원이 새로운 기술을 습득하여 사원내역 엔티티 타입에 등록하려고 하면 마치 금방 습득한 기술을 가지고 어떤 프로젝트를 지원한 것처럼 값을 채워줘야만 하는 현상에 빠지게 된다. 따라서 필요하지 않은 조인 관계를 해소하기 위해 오른쪽 모델과 같이 업무 규칙에 적합하게 관계를 분리하는 방법이 4차 정규화이다. <그림 7> 4차 정규화의 응용 4차 정규화가 실전 프로젝트에서 거의 나타나지 않는다고 하는 사람들이 많은데 필자가 파악하기로는 2차 정규화나 BCNF보다 더 많이 발생된다. 단, 4차 정규화를 하지 않고 개발을 하다가 새로운 값을 채울 경우에 값을 기본 값(default value)으로 지정해버리는 경우가 많이 있다. 참조무결성 제약조건(FK)를 데이터베이스 테이블에 걸지 않는 경우에 가능한데 구축단계 때 많은 프로젝트에서 이와 같은 편법으로 프로그램을 작성한다. 좋지 않은 경우이다. 이와 같은 경우 데이터모델에 나타난 관계가 실제 데이터에서 불가피하게 단절되어 나타나므로 무결성 체크가 불가능해진다. 설계단계 때 불필요한 관계에 의해 나타나는 4차 정규화의 대상 엔티티 타입을 검증하여 정규화를 적용하도록 해야 한다. 반정규화 논리적인 데이터 모델링 단계에서는 모든 엔티티 타입과 속성들을 정규화 규칙에 적절하게 분석하여 데이터 모델링을 수행한다. 이 단계는 실전 프로젝트에서는 분석단계 때 수행하는 경우가 많고 설계단계 때는 데이터베이스 성능을 고려하여 물리적인 데이터 모델링을 수행하는데 물리적인 데이터 모델링의 여러 개의 타스크 중에 반정규화를 수행하게 된다. 반정규화라고 하면, 일반적으로 다른 엔티티 타입에 있는 속성을 중복한 것만을 생각하는 경우가 많이 있다. 훨씬 많은 반정규화 유형이 있고 각각은 유용하게 활용될 수 있음을 알 수 있다. 반정규화란 정규화된 엔티티 타입, 속성, 관계에 대해 시스템의 성능향상과 개발(development)과 운영(maintenance)의 단순화를 위해 데이터모델을 조정하는 프로세스를 의미한다. 단순하게 정규화 규칙에 반대되는 개념으로만 생각한다면 속성의 중복 정도가 반정규화의 범위에 해당되지만 물리적인 성능을 고려한 반정규화의 개념으로 생각한다면 테이블 통합/분리, 속성 중복, 속성 추가, 관계 중복 등이 반정규화의 범위에 해당된다. 반정규화를 적용하기 전에 반드시 중요하게 고려해야 할 점은 데이터의 무결성을 유지시킬 수 있는 방안을 마련하고 반정규화를 적용해야 한다는 것이다. 시스템을 개발할 때는 성공적인 오픈을 위해 성능을 중요하게 여겨 여러 테이블에 속성들을 반정규화하는 경우가 많은데 반정규화를 많이 할수록 데이터의 무결성은 깨져 이상한 데이터가 많이 남아있거나 돈의 액수가 맞지 않거나 등록된 접수 건수가 맞지 않은 현상이 시스템을 운영하는 중에 점점 많이 발생하게 되어 나중에는 시스템을 사용하지 못하게 되는 경우가 발생된다. 데이터 무결성을 중요하게 생각하고 반정규화를 적용할 필요가 있다. 반정규화에 대한 실전 프로젝트 적용 사례 반정규화를 하는 대상으로는 테이블, 속성, 관계에 대해 적용할 수 있으며 꼭 테이블과 속성, 관계에 대해 중복으로 가져가는 방법만이 반정규화가 아니고 테이블, 속성, 관계를 추가하거나 분할할 수 있으며 제거할 수도 있다. 1차 정규화에 대한 반정규화 고객에 대한 엔티티 타입에 방문을 두 번까지 가능하다고 할 때 고객번호, 고객명이 중복 속성 값을 갖기 때문에 1차 정규화의 대상이 되어 중간에 있는 고객방문 엔티티 타입으로 1차 정규화가 되었다. 그러나 최대 2회까지 방문이 가능하다는 업무 규칙을 이용하여 성능과 단순성을 고려하여 오른쪽에 있는 1차 정규화에 대한 반정규화 엔티티 타입으로 설계된 예이다. <그림 8> 1차 반정규화의 응용 최대 발생하는 값을 이용한 이와 같은 반정규화의 유형은 실전 프로젝트에서 빈번하게 사용되지만 최대 발생 값을 변할 수 있는 경우는 정규화된 모습으로 모델링해야 확장성(flexible)이 보장된다는 것을 기억해야 한다. 2차 정규화에 대한 반정규화 주식별자가 두 개 이상일 때 일부 주식별자 속성에 의존적인 속성을 분리하는 2차 정규화에서 조인에 의한 성능저하와 단순성 확보를 위해 반정규화를 적용할 수 있다. <그림 9> 2차 반 정규화의 모델 <그림 9>의 모델은 일자별 매각 물건 엔티티 타입에서 매각 일자가 결정자가 되고 매각 장소와 매각 시간이 의존자가 된 함수 종속성이 존재하여 2차 정규화를 적용했다가 다시 조인에 의한 성능저하 예방과 단순성을 위해 다시 일자별매각물건이라는 엔티티 타입에 반정규화를 한 경우이다. 3차 정규화에 대한 반정규화 <그림 10>의 모델을 보면 수납이라고 하는 엔티티 타입은 속성간의 결정자(수납확인번호)와 의존자가 존재하는 3차 정규화의 대상이 되는 모습이다. 따라서 수납확인번호를 결정자로 하고 수납확인방법, 수납확인일자, 수납확인자사번을 속성으로 하는 3차 정규화를 적용하였다. <그림 10> 3차 반정규화의 응용 반정규화를 하는 대상으로는 테이블, 속성, 관계에 대해 적용할 수 있으며 꼭 테이블과 속성, 관계에 대해 중복으로 가져가는 방법만이 반정규화가 아니고 테이블, 속성, 관계를 추가할 수도 있고 분할할 수도 있으며 제거할 수도 있다. 정규화에 위배되는 것은 아니지만 성능을 위해 적용하는 반정규화의 방법 테이블 통합/분리, 속성 중복, 관계 중복 등 여러 가지가 있을 수 있다. 이력의 최근 변경 속성 값 반정규화 <그림 11>의 모델은 공급자에 대한 전화번호, 메일주소, 위치 등에 대한 변경 정보를 각각 관리하는 현재 데이터와 이력 데이터에 대한 데이터 모델이다. 모든 속성 값이 중복이 없어 완벽히 정규화된 모습이지만 이력 모델이 정규화되어 있음으로 인해 최근 값을 처리하는 데 상당한 시간이 소요되고 SQL 구문도 복잡하게 된다. 따라서 데이터를 조회할 때는 프로세스의 대부분은 가장 최근 값을 참조한다는 성격을 이용하여 오른쪽과 같이 최근 값에 대한 속성 값만을 관리하기 위해 공급자 엔티티 타입에 전화번호, 메일주소, 위치에 대한 속성을 추가하였다. <그림 11> 최근 변경 값 속성의 반정규화 <그림 11>에서 공급자번호 1001~1005에 해당하는 공급자번호, 공급자명, 전화번호, 메일주소, 위치에 대한 정보를 조회하면 다음과 같이 작성된다. SELECT A.공급자명, B.전화번호, C.메일주소, D.위치 FROM 공급자 A, (SELECT X.공급자번호, X.전화번호 FROM 전화번호 X, (SELECT 공급자번호, MAX(순번) 순번 FROM 전화번호 WHERE 공급자번호 BETWEEN '1001' AND '1005' GROUP BY 공급자번호) Y WHERE X.공급자번호 = Y.공급자번호 … WHERE A.공급자번호 = B.공급자번호 AND A.공급자번호 = C.공급자번호 AND A.공급자번호 = D.공급자번호 AND A.공급자번호 BETWEEN '1001' AND '1005' SELECT 공급자명, 전화번호, 메일주소, 위치 FROM 공급자 WHERE 공급자번호 BETWEEN '1001' AND '1005' 정규화된 모델에서 SQL반정규화된 모델에서 SQL 반정규화 적절한 반정규화를 통해 성능도 훨씬 향상되었을 뿐만 아니라 SQL 구문도 비교가 안될 만큼 단순해졌음을 알 수 있다. 관계 반정규화 속성의 반정규화에서 데이터를 조회하는 경로를 단축하기 위해 일반속성(주식별자가 아닌)을 중복할 수도 있고 주식별자 속성을 중복할 수도 있다. 주식별자 속성의 중복 중 전체 주식별자를 이루는 전체 속성의 중복은 곧 관계의 중복을 의미한다. 관계의 반정규화는 인위적인 속성의 중복 없이 조회경로 단축을 통해 조인에 의한 데이터 처리 속도를 향상시키는 장점이 있다. <그림 12>의 왼쪽은 고객, 주문, 주문목록, 배송 엔티티 타입이 정규화가 잘 되어 있고 관계도 업무 규칙에 따라 식별자 관계/비식별자 관계로 적절하게 설정되어 있다. 그런데 배송 엔티티 타입에 발생되는 프로세스가 데이터를 처리할 때 항상 고객에 있는 속성의 모든 정보를 참조해야 하는데 왼쪽 정규화된 모델에서는 항상 주문목록과 주문을 경유하여 고객정보를 처리함으로 조인에 의한 성능저하가 예상된다. 따라서 조회경로를 단축하기 위해 오른쪽과 같이 관계를 추가로 연결하여, 즉, 이미 고객->주문->주문목록->배송으로 관계는 연결되어 있지만 성능을 위해 고객->주문으로 직접 관계를 연결한 관계의 반정규화를 적용한 사례이다.
<그림 12> 관계의 반정규화 <그림 12>의 데이터 모델에 왼쪽에 있는 데이터 모델에 대해 배송일시와 고객번호, 고객명을 가져오는 SQL 문장을 작성하면 다음과 같이 작성될 수 있다. SELECT D.고객번호, D.고객명, A.일시 FROM 배송 A, 주문목록 B, 주문 C, 고객 D WHERE A.배송번호 = ‘20031001001’ AND 배송.주문번호 = 주문목록.주문번호 AND 배송.제품번호 = 주문목록.제품번호 AND 주문.주문번호 = 배송.주문번호 AND 고객.고객번호 = 주문.고객번호 간단한 고객에 관련된 정보를 읽어오는데 2개의 테이블을 필요하지 않게 읽은 경우이다. 오른쪽과 같이 관계가 중복된 경우는 배송일시와 고객번호, 고객명을 가져오기 위해 다음과 같이 SQL 문장을 구성할 수 있다. SELECT B.고객번호, B.고객명, A.일시 FROM 배송 A, 고객 B WHERE A.배송번호 = ‘20031001001’ AND 배송.고객번호 = 주문.고객번호 2개의 테이블에 대해서만 접근을 하므로 관계가 중복되지 않은 경우보다 훨씬 쉽게 SQL 문장도 구성되며 성능도 더 낫다. 테이블의 관계가 5단계 6단계까지 내려가면서 중간에 비식별자관계로 연결되어 있고 빈번하게 조인이 되는 경우라면 관계의 중복을 고려할 수 있다. 프로젝트 상황에 따라 관계의 반정규화는 성능과 단순성에 있어 매우 유용하다. 호두과자에는 호두가 있다! 중부지방을 경유하는 기차 여행을 하면 자주 호두과자를 먹게 된다. 붕어 없는 붕어빵과는 다르게 호두과자에는 호두 알갱이가 있어 제법 고소한 맛이 난다. 이처럼 관공서, 학교, 기업 등에 구축하는 데이터베이스가 견실하기 위해서는 잘 정리된 정규화 사상이 녹아져 있어 정규화 사상 맛이 나는 데이터 모델이어야 한다. 그리고 거기에 체계화된 방법과 타당성 있는 반정규화를 적용한 데이터 모델을 만들어 내야 한다. 이 일은 그렇게 해도 되는 선택적인 사항이 아니라 한 번 구축하면 변경이 불가능하고 잘못된 데이터베이스는 시간에 따라 엄청난 문제와 제정을 낭비하기 때문에 그렇게 해야 하는 당위성을 가지고 있는 중요한 작업이다. 그러기 위해서는 데이터 모델링을 수행하는 사람은 정규화/반정규화에 대해 거울로 자기 얼굴을 보듯 정확한 이해와 체계적인 사고를 바탕으로 데이터 모델링을 할 수 있는 능력을 가져야 한다. 이 글을 읽는 독자는 이론을 위한 이론, 학교시험에서 점수 획득을 위한 지식의 단계를 뛰어넘어 실전에서 무한한 가치를 창조해 내는 진정한 지식가치의 이론을 겸비하여 최고의 데이터 모델링을 수행하는 전문가가 되기를 희망한다. |
Posted by tornado
하이버네이트 작업중에...... 새로운 로우가 추가되는 부분에서 계속 오류 ... 쿼리 찍어봤더니.. Insert 문이 아닌.. Update 문을 신나게 찍고 있다 -.- 왜그럴까... 소스 한참 보다가 보니... Util 클래스에서.. Wrapper 클래스가 null 이면.. 0 으로 바꿔주는 부분이 있다.. 하여간 PK 부분이 null 이 아니고... 0 으로 들어가니... update xx set kkk = ? where DOC_NO = ? 으로 계속 업데이트를 하고 앉아있지 ㅡㅡ many-to-one 으로 지정된 클래스에서 이렇게 됨 ㅡㅡ; 괜히 무게잡구 담배만 빨았네 ㅡㅡ;
Posted by tornado
tripwire설치 및 운영가이드
2001. 11.
장윤숙, jys@certcc.or.kr
1. 개요
공격자가 시스템 침입에 성공하면 다음번 침입을 쉽게 하기위해 루트킷(rootkit)이나 트로이잔 목마(trojan horse)프로그램을 설치하는 경우가 대부분이다.
루트킷에 포함되는 프로그램으로는 ps, ls, netstat, login등의 시스템 프로그램들이 있는데, 이런 루트킷은 시스템에 원래 있었던 프로그램들과 바꿔치기되서 관리자가 시스템을 점검해도 이상없게 보이도록 하고 공격자의 행동을 숨기기도 한다.
예를 들어 ps를 바꿔치기 해서 시스템 관리자가 ps를 실행시켜도 공격자가 실행한 프로그램은 보이지 않게 한다든지, ls를 바꿔치기 해서 ls로 보더라도 공격자가 만든 파일은 보이지 않도록 하는 것이다.
또한 공격자는 공격이 성공한 후 시스템의 취약점을 찾아서 패치를 해서 다른 공격자가 들어오는 것을 막기도 한다.
이렇게 침입 당한 시스템에서 어떤 파일이나 디렉토리가 수정, 변조되었는지 등을 찾는 것이 쉽지만은 않다. 혹 파일의 크기나 수정된 시간, 생성된 시간 등을 비교하여 알아낸다고 할지라도 파일의 크기나 시간정보 조차도 변조가 가능하므로 이를 믿을 수 없다.
따라서 원래 파일의 무결성을 체크할 수 있는 프로그램이 필요할 것이고, 이를 효율적으로 해주는 도구가 바로 tripwire이다.
tripwire는 MD5, SHA, CRC-32등의 다양한 해쉬 함수를 제공하고, 파일들에 대한 데이터베이스를 만들어 이를 통해 해커들에 의한 파일들의 변조여부를 판별하므로 관리자들이 유용하게 사용할 수 있다.
tripwire는 먼저 시스템에 존재하는 파일에 대해 데이터 베이스를 만들어 저장한 후 생성된 데이터베이스와 비교하여 추가·삭제되거나 변조된 파일이 있는지 점검하고 관리자에게 레포팅해주는 무결성 검사도구이다.
Top
2. tripwire 구하기
tripwire는 1992년 Purdue University의 Dr. Eugene Spafford와 Gene Kim에 의해 개발되었다. 초기의 tripwire 1.x는 오픈소스이었으나 2.x로 오면서 tripwire사에서 상용화하여 발표하고 tripwire 1.3대의 ASR(Academic Source Release)에 대해서는 공개로 배포하고 있다.
또한 tripwire사에서는 tripwire 오픈소스 프로젝트를 추진하여 Linux 시스템에서는 Open Source로 2.3대의 tripwire를 다운받아 설치할수 있다. (http://www.tripwire.org) 그러나 Solaris, Windows NT, HP-UX, IBM AIX 시스템에서 2.x를 설치하려면 상업용 버전을 이용하여야 한다. (http://www.tripwire.com)
Linux 7.x 시스템의 경우 대부분 tripwire가 설치되어 있기 때문에 다운받지 않고 설치할수 있으며, 본인은 리눅스 Linux7.0 환경에서 tripwire-2.3 버전을 설치 및 테스트하였다.
설치여부나 설치된 버전을 확인하고자 하는 경우에는 다음 명령을 이용한다.
rpm -qa | grep tripwire
만약 시스템에 설치되어 있지 않다면 tripwire 프로그램(http://www.tripwire.org)을 다운받아 설치한다.
Top
3. tripwire 설치
여기서는 rpm로 제공되는 2.3버전을 Linux 7.0에 설치할것이다.
tripwire를 rpm으로 설치할 경우 설치과정은 크게 다음의 4단계로 볼 수 있다.
1. tripwire 설정파일·정책파일 생성하기(twinstall.sh) 2. 데이터베이스 초기화 (tripwire --init) 3. 무결성 검사 (tripwire --check) 4. 데이터베이스 갱신(tripwire --update)
이제 본격적인 설치에 대해 살펴보도록 하자.
■ tripwire다운받기
http://www.tripwire.org에서 운영하는 시스템에 맞는 tripwire를 rpm으로 다운받는다.
■ 압축풀기
다운로드받은 압축 파일을 푼다 # tar -xzvf tripwire-2.3-47.i386.tar.gz 압축을 풀어 생긴 tripwire-2.3-47.i386.rpm 패키지 파일을 설치한다. # rpm -Uvh tripwire-2.3-47.i386.rpm 기본적으로 tripwire는 /etc/tripwire디렉토리에 설치된다. /etc/tripwire 디렉토리에 생성되는 파일의 내용을 보면 다음과 같다. -rwxr-xr-x 1 root root 603 6월 22 03:02 twcfg.txt ======> 설치를 위한 환경설정파일 -rwxr-xr-x 1 root root 10100 6월 22 03:02 twinstall.sh ======> 설치스크립트 -rwxr-xr-x 1 root root 41255 6월 22 03:02 twpol.txt ======> 정책파일
Top
■ tripwire 설정파일·정책파일 생성하기
# ./twinstall.sh twinstall.sh를 실행시키면 tripwire는 site keyfile과 local keyfile을 생성하기 위한 Passphrases를 입력하도록 한다. site keyfile은 정책파일과 환경파일을 설정하는데 사용되고, local keyfile은 tripwire 데이터베이스와 레포트 파일을 초기화하고 보호하는데 사용되는 일종의 암호의 일종이다. (passphrases는 최소 8자 이상의 문자열이어야 한다.) 설정파일·정책파일을 생성하는 과정을 살펴보면 아래와 같다.
1) keyfile passphrase를 생성하기 위해 몇 개의 passphrase를 요구한다.
Creating key files... (When selecting a passphrase, keep in mind that good passphrases typically have upper and lower case letters, digits and punctuation marks, and are at least 8 characters in length.)
2) site keyfile passphrase를 입력하면 다시 한번 확인하고 키를 생성한다.
Enter the site keyfile passphrase: Verify the site keyfile passphrase: Generating key (this may take several minutes)...Key generation complete. (When selecting a passphrase, keep in mind that good passphrases typically have upper and lower case letters, digits and punctuation marks, and are at least 8 characters in length.)
Top
3) local keyfile passphrase를 입력하면 다시 한번 확인하고 키를 생성한다.
Enter the local keyfile passphrase: Verify the local keyfile passphrase: Generating key (this may take several minutes)...Key generation complete. ----------------------------------------------
4) site passphrase를 이용하여 configuration file을 완성한다.
Signing configuration file... Please enter your site passphrase: Wrote configuration file: /etc/tripwire/tw.cfg A clear-text version of the Tripwire configuration file /etc/tripwire/twcfg.txt has been preserved for your inspection. It is recommended that you delete this file manually after you have examined it. ----------------------------------------------
5) site passphrase를 이용하여 policy file을 완성한다.
다음의 policy file이 생성되었다는 메시지와 함께 설치가 끝나게 된다. Signing policy file... Please enter your site passphrase: Wrote policy file: /etc/tripwire/tw.pol A clear-text version of the Tripwire policy file /etc/tripwire/twpol.txt has been preserved for your inspection. This implements a minimal policy, intended only to test essential Tripwire functionality. You should edit the policy file to describe your system, and then use twadmin to generate a new signed copy of the Tripwire policy.
Top
■ 데이터베이스 초기화
다음의 명령어를 실행하여 데이터베이스를 초기화한다. (/usr/sbin에서)
# ./tripwire --init
이때 tripwire는 local passphrase를 요구한다.
Please enter your local passphrase: Parsing policy file: /etc/tripwire/tw.pol
tripwire는 데이터베이스를 생성하고 그 결과를 출력한다.
Generating the database... *** Processing Unix File System *** Wrote database file: /var/lib/tripwire/cyber118.twd The database was successfully generated.
설정과정이 끝났으면 twcfg.txt과 twpol.txt 파일을 삭제하거나 안전한 장소에 보관하여야 한다.
Top
■ 무결성 검사
다음의 명령으로 시스템에 있는 파일들에 대한 무결성을 검사할수 있다.
# ./tripwire --check Parsing policy file: /etc/tripwire/tw.pol *** Processing Unix File System *** Performing integrity check... Wrote report file: /var/lib/tripwire/report/cyber118-20010629-005928.twr
무결성 검사가 끝나면 /var/lib/tripwire/report 아래에 결과 파일이 생성된다.
Top
■ 데이터베이스 갱신
무결성 검사 후 발견되어진 변경 파일 중 침입에 의한 것이 아니라 정상적인 변화라면 기존에 만들어져 있던 데이터베이스를 갱신하여야한다.
# ./tripwire --update또는 # ./tripwire -m u
tripwire --update mode을 이용하면 데이터베이스의 재초기화 없이도 데이터베이스를 갱신할수 있다.
■ 정책파일 갱신
정책파일을 갱신하는 방법에는 tripwire --update-police과 twadmin --creat-polfile 두가지가 있다.
① # ./tripwire --update-police 또는 # ./tripwire -m p /etc/tripwire/policy.txt
tripwire --update-police mode는 이전의 rule과 비교하여 새로운 rule에 대한 정보를 업데이트하는 것이므로 데이터베이스를 재초기화 하지 않아도 된다.
② # ./twadmin --creat-polfile # ./twadmin --creat-polfile mypol.txt (여기서mypol.txt는 새로운 정책파일의 이름이다.)
twadmin --creat-polfile mode는 새로운 정책파일을 만드는 명령으로 이를 위해서는 데이터베이스의 재초기화가 필요하다.
Top
4. Tripwire Configuration File & Policy File Reference
4-1. 환경설정파일(Configuration File-twcfg.txt)
환경설정파일(twcfg.txt)은 tripwire유틸리티와 설정파일들이 어디에 설치되어 있는지 등에 대한 정보를 저장하고 있는데 내용을 살펴보면 다음과 같다.
ROOT =/usr/sbin POLFILE =/etc/tripwire/tw.pol DBFILE =/var/lib/tripwire/$(HOSTNAME).twd REPORTFILE =/var/lib/tripwire/report/$(HOSTNAME)-$(DATE).twr SITEKEYFILE =/etc/tripwire/site.key LOCALKEYFILE =/etc/tripwire/$(HOSTNAME)-local.key EDITOR =/bin/vi LATEPROMPTING =false LOOSEDIRECTORYCHECKING =false MAILNOVIOLATIONS =true EMAILREPORTLEVEL =3 REPORTLEVEL =3 MAILMETHOD =SENDMAIL SYSLOGREPORTING =false MAILPROGRAM =/usr/sbin/sendmail -oi -t
Top
아래의 표는 설정파일 변수들과 그 변수들이 무엇을 나타내는지 등에 대해 요약한 것이다.
설정파일 변수들 |
설명 |
Required
Variables |
POLFILE |
정책파일의 위치 지정 Initial value: /etc/tripwire/tw.pol |
DBFILE |
데이터베이스 파일의 위치 지정 Initial value: /etc/tripwire/$(HOSTNAME).twd |
REPORTFILE |
생성된 결과 파일의 위치 지정 Initial value: /var/lib/report/$(HOSTNAME)-$(DATE).twr |
SITEKEYFILE |
사이트키 파일의 위치 지정 Initial value: /etc/tripwire/site.key |
LOCALKEYFILE |
로컬키 파일의 위치 지정 Initial value: /etc/tripwire/$(HOSTNAME)-local.key |
Optional
Variables |
EDITOR |
사용하고자 하는 편집기의 위치 지정 Initial value: /bin/vi |
LATEPROMPTING |
tripwire가 패스워드 요구하는 것을 가장 마지막에 하도록 설정 Initial value: false |
SYSLOGREPORTING |
SYSLOGREPORTING이 true로 설정되면 database initializations, integrity checks, database updates, and policy file등의 update 을 syslog에 알림. Initial value: true. |
LOOSEDIRECTORYCHECKING |
디렉토리 변경사항이 있는지를 출력해야 하는 것을 나타냄. 설정되어 있지 않으면 변화된 파일뿐만 아니라 그 파일이 있는 디렉토리도 결과에 출력되고 설정되면 파일의 변화만을 출력함. Initial value: false |
REPORTLEVEL |
twprint --print-report command로 report를 출력할 때의 레벨로서 0-4까지의 레포트레벨이 있음. Initial value: 3 |
Email
Notification
Variables |
MAILNOVIOLATIONS |
무결성 검사시 아무런 변화가 없을 때에도 email notification을 할지를 나타냄. Initial value: true |
EMAILREPORTLEVEL |
email report level로 0-4 Initial value: 3 |
MAILMETHOD |
email notification을 위해 사용할 protocol명시 Initial value: SENDMAIL |
MAILPROGRAM |
특정 메일 프로그램의 위치 지정 Initial value: /usr/sbin/sendmail -oi -t |
Top
4-2. tripwire 정책파일 (twpol.txt)
tripwire 정책파일(twpol.txt)은 tripwire가 감시할 대상(파일, 디렉토리)과 그 위치를 명시한다.
관리하는 시스템에 맞게 정책파일(twpol.txt)을 수정할 수 있는데 이는 불필요하게 들어있는 파일을 제거하고 필요한 파일은 추가함으로써 tripwire에서 쓸모 없는 결과물이 나오는 경우를 상당히 줄일수 있도록 한다.
또한 configuration script를 실행시킨 후에 정책파일을 수정하면 데이터베이스파일을 초기화하기 전에 configuration file을 재실행해야하는 번거로움이 있으므로 tripwire를 설치하기 전에 시스템에 맞게 설정하는 것이 좋다.
① policy file의 구성요소
policy file의 기본적인 구성요소는 다음과 같다.
policy file component |
meaning |
Rules |
policy file의 기본구성요소로 무결성 검사시 시스템의 object에 대해 monitor할 properity를 명시해주는것 |
Stop points |
무결성 검사시 스캔하지 않을 시스템의 object 명시 |
Attributs |
이메일을 보내거나 recursion을 조정하는 rule을 수정하는 부분 |
Directive |
하나의 policy파일을 네트웍 서버에서 사용할 때. |
Variable |
관리자가 편리하게 정보를 바꾸도록 설정 |
Top
1) rules
rules의 기본형식은 다음과 같다.
object name -> property mask; object name 은 스캔할 디렉토리나 파일의 경로이고 property mask는 실행 혹은 실행하지 않을 object property에 대해 설정해주는 부분이다. (여기서 ->는 object name 과 property mask를 구별해주는 기호이고 ;은 rule의 끝을 나타낸다.) 예1) 예를 들어 /etc 디렉토리 전부에 대해서 +pinug라는 property mask로 스캔하려면 다음과 같이 기술해준다. /etc -> +pinug; ※여기서 +pinug 라는 property mask는 관리자가 정의한것으로 이렇게 관리자가 정의해서 사용할수도 있고 이미 정해져 있는 viriable을 이용할수도 있다. 이미 정해져 있는 viriable에 대해서는 5) viriable를 참고하라. 예2) /etc 디렉토리에 대해서는 관리자가 정의한 mask1으로 스캔하고 /etc/passwd 파일에 대해서만 mask2를 써서 스캔하도록 설정할 때 /etc -> $(mask1) ; /etc/passwd -> $(mask2) ; property mask에 대한 표는 아래와 같다.
Top
Property |
Meaning |
- |
Ignore the following properties |
+ |
Record and check the following properties |
p |
File permissions |
i |
Inode number |
n |
Number of links (i.e., inode reference count) |
u |
User id of owner |
g |
Group id of owner |
t |
File type |
s |
File size |
d |
Device number of the disk on which the inode associated with the file is stored |
r |
Device number of the device to which the inode points. Valid only for device objects. |
b |
Number of blocks allocated |
m |
Modification timestamp |
c |
Inode creation/modification timestamp |
l |
Indicates that the file is expected to grow. If the file is smaller than the last recorded size, it is a violation of this property. This can be useful for log files. |
a |
Access timestamp The +a property is incompatible with the hash properties(+CMSH). To calculate the hash, the file must be opened and read, which changes the access timestamp. Specifying any of +CMSH will always cause a violation of the +a property. |
C |
CRC-32, POSIX 1003.2 compliant 32-bit Cyclic Redundancy Check. Choose this hash for relatively high performance but relatively low security. |
M |
MD5, the RSA Data Security, Inc.® Message Digest Algorithm. Choose this hash for high security. |
S |
SHA, part of the SHS/SHA algorithm. Choose this hash for high security. |
H |
HAVAL, a strong 128-bit signature algorithm. Choose this hash for high security. |
Top
2) Stop Points
Stop Points는 무결성 검사를 하는 동안 스캔하지 않을 object에 대해 설정하는 부분이다. 기본형식은 다음과 같다.
! object name;
예) /etc/rc.d와 /etc/muttab에 대해서는 스캔하지 않고 나머지 /etc의 모든 부분에 대해서는 스캔할 때 /etc ->$(Readonly) -ar; !/etc/rc.d; !/etc/mnttab;
Top
3) Rule Attributes
Rule Attributes는 정책파일 전체로 무결성 검사를 하지 않고 몇 개의 rule name 에 대해서만 점검을 한다든지 policy file에 변화가 있는 부분에 대해 관리자가 이메일로 받을 수 있도록 설정하는 등의 설정을 하는 부분이다.
예1) /usr/lib rule에 변화가 있을때 email report를 xxx@xxx.com에게 보내려할때 /usr/lib -> $(ReadOnly) ( emailto = xxx@xxx.com ) ;
예2) “"rcfiles" 라는 rule에 대해서만 무결성 검사를 하고자 할때 tripwire --check --rule-name “"rcfiles"
Rule Attributes의 내용은 아래와 같다.
Attribute |
Description |
rulename |
Associates a name with a rule. The default value is the last element of the object name to which the rule applies. |
emailto |
Specifies email address(es) to which notification of any violations is sent. The default value is none. |
severity |
Associates a numeric severity level with a rule. The default value is 0. The valid range is from 0 to 1000000. |
recurse |
Controls recursive scanning of directories. True (-1), false (0), and numerical values > 0 are valid. The default value is true. |
4) Directives
하나의 policy파일을 가지고 여러대의 시스템에 공유하여 사용하고자 할 때 설정해주는 부분이다.
Top
5) Variables
policy file에서는 두가지의 variable을 사용할수 있는데 Global variables은 policy file 전체에 대해서 사용할 수 있고 local variables은 정해진 section에서만 사용 가능하다.
기본 형식은 다음과 같다.
variable = value;
예1) # Define the variable mask1 = +pinugC-a ; # and now use it. /home/projectA -> $(mask1) ; /home/projectB -> $(mask1)+MSH-db ;
미리 정해놓은 Variables에 관한 표는 아래와 같다.
Variable |
Definition |
ReadOnly |
This variable is good for files that are widely available but are intended to be read-only. Expands to: +pinugsmtdbCM-raclSH |
Dynamic |
This variable is good for monitoring user directories and files that tend to change frequently. Expands to: +pinugtd-rsacmblCMSH |
Growing |
This variable is useful for files that can grow, but not shrink, such as log files: Expands to: +pinugtdl-rsacmbCMSH |
IgnoreAll |
This variable tracks a file’s presence or absence, but doesn't check any other properties. Expands to: -pinusgamctdrblCMSH |
IgnoreNone* |
This variable turns on all properties and provides a convenient starting point for defining your own property masks. Expands to: +pinusgamctdrbCMSH-l |
Device |
This variable is useful for devices or other files that Tripwire software should not attempt to open. Expands to : +pugsdr-intlbamcCMSH |
Top
5. tripwire command
① tripwire test mode
tripwire의 email notification system의 작동을 체크하기 위해 test mode로 다음의 명령어를 쓸 수 있다.
# tripwire --test --email jys@certcc.or.kr
Sending a test message to: jys@certcc.or.kr
email notification이 올바르게 작동한다면 아래의 메시지를 받을 것이다.
Subject: Test email message from Tripwire Date: Fri 29 Jun 2001 09:06:58 +0900 From: "Tripwire(R) 2.3.0.47" <tripwire@localhost.localdomain> To: jys@cert.certcc.or.kr
If you receive this message, email notification from tripwire is working correctly.
Top
② crontab을 이용한 주기적인 자동점검 및 e-mail을 통해 레포트 받아보기
파일 시스템에 주기적인 점검이 없으면 tripwire는 소용이 없다. 그러므로 매일 밤 tripwire로 점검하고 이를 e-mail로 받아볼수 있도록 설정한다면 보다 편리하게 tripwire를 사용할수 있다.
1) tripwire 레포트를 만들기 위하여 shell script를 만든다.
/usr/local/bin밑에 "runtripwire.sh" 라는 파일에 아래의 내용을 포함하는 파일을 만든다. [root@cyber118 bin]# vi runtripwire.sh #!/bin/sh /usr/sbin/tripwire -m c | mail -s "tripwire report from linux-1" jys@certcc.or.kr
2) crontab에 추가하기
crontab -e 명령을 써서 매일 밤 1:01에 위의 script를 실행하도록 설정한다. 1 1 * * * /usr/local/bin/runtripwire.sh 이와 같이 설정했으면 매일 밤 tripwire와 실행되어 e-mail로 결과 레포트를 받을 수 있다.
아래는 실제로 점검결과를 메일로 받은 화면이다.
아래의 결과메일에서 보면 ls, netstat, ps등이 변조되었음을 확인할수 있다.
![](http://www.superuser.co.kr/security/certcc/tripwire_02.gif)
Top
③ twprint
tripwire 데이터베이스 파일들과 바이너리들은 encode되고 sign되므로 twprint 명령어를 사용함으로써 database와 report file을 text 형식으로 볼수 있다.
예1) 데이터베이스 파일을 텍스트파일로 프린트할 때 #twprint --print-dbfile > db.txt
예2) report 결과 파일을 텍스트파일로 프린트할 때 #twprint -m r --twrfile cyber118-20010703-035644.twr
(여기서 cyber118은 machine name이고 20010703-035644은 무결성검사를 한 날짜와 시간)
■ tripwire설치를 마치며
tripwire는 생성된 데이터베이스와 비교하여서 파일에 변화가 있는지 점검한다.
그러므로 이미 해킹을 당한 후 루트킷이나 백도어 등이 설치되어 있는 상태에서 tripwire가 설치된다면 tripwire는 무용지물이다. 또한 데이터베이스를 변경할수 있는 침입자는 무결성 검사도구를 파괴할수 있으므로, 무결성 검사를 위해 사용되는 데이터베이스는 승인되지 않는 변경으로부터 보호되어야 할 것이다.
Top
참고자료
· http://www.linuxsecurity.com/feature_stories/feature_story-81.html · http://sourceforge.net/project/showfiles.php?group_id=3130tripwire-2.3.0-docs-pdf.tar.gz · 리눅스 보안의 모든 것 (인포 북) · Security PLUS for UNIX (포항공대 유닉스 보안 연구회 저, 영진출판사)
Top
자료제공 : CERTCC-KR : 한국정보보호진흥원
Posted by tornado
잼있네요.^^ 제소스를 조금 테스트 해보니 후두둑 쏟아지는 버그들 -_-.. 근데 여러번 느끼지만, 외국은 맥 정말 많이 쓰네요. 개발자들도.. 냐옹~ ![](http://www-128.ibm.com/developerworks/i/c.gif) | 손쉬운 정적 분석 툴로 버그 잡기
Elliotte Rusty Harold 조교수, Polytechnic University 2005년 1 월 07 일 소스, 정적 분석 툴인 PMD는 버그를 잡기위한 툴로 손색이 없다. PMD의 사용법을 설명한다. Tom Copeland의 PMD는 오픈 소스(BSD 라이센스) 툴로서 자바 소스 코드를 분석하여 잠재적인 버그를 찾아낸다. 일반적인 부분에서는 FindBugs와 Lint4j(참고자료)같은 툴과 비슷하다. 하지만 이 모든 툴들은 다른 버그들을 찾아내기 때문에 주어진 코드 기반에서 이들 각자를 실행하는 것이 적합하다. 이 글에서 PMD를 사용하는 방법과 활용법을 설명하겠다. PMD의 명령행 인터페이스도 연구할 예정이다. PMD를 Ant와 통합하여 자동 소스-코드 체크를 수행할 수 있고 주요 IDE와 프로그래머의 에디터를 위한 플러그인도 있다. PMD의 설치와 실행 PMD는 자바로 작성되고 JDK 1.3 또는 이후 버전이 필요하다. 명령행을 사용하는 것이 익숙하다면 PMD의 설치와 실행은 단순하다. zip 파일을 다운로드하고(참고자료), /usr 또는 홈 디렉토리에 저장한다. 이 글에서는 /usr에 저장하는 것으로 간주하겠다. PMD 를 실행하는 가장 쉬운 방법은 pmd.sh 스크립트(Unix/Linux) 또는 pmd.bat 스크립트(Windows)를 호출하는 것이다. 이 스크립트들은 bin 디렉토리 보다는 pmd-2.1/etc에 있다. 스크립트에는 세 개의 명령행 인자들이 있다: - 체크 할 .java 파일로 가는 경로
- 아웃풋 포맷을 가르키는
html 또는 xml 키워드 - 실행 할 규칙 세트 이름들
예를 들어, 다음 명령어는 네이밍 규칙 세트를 사용하여 ImageGrabber.java 파일을 검사하여 XML 아웃풋을 만든다: $ /usr/pmd-2.1/etc/pmd.sh ImageGrabber.java xml rulesets/naming.xml
|
결과 분석 위 명령어에서 나온 아웃풋은 기본적으로 System.out 으로 보내지며 리포트 형식을 취한다(Listing 1): Listing 1. PMD XML 리포트
<?xml version="1.0"?><pmd> <file name="/Users/elharo/src/ImageGrabber.java"> <violation line="32" rule="ShortVariable" ruleset="Naming Rules" priority="3"> Avoid variables with short names like j </violation> <violation line="105" rule="VariableNamingConventionsRule" ruleset="Naming Rules" priority="1"> Variables that are not final should not contain underscores (except for underscores in standard prefix/suffix). </violation> </file> <error filename="/Users/elharo/src/ImageGrabber.java" msg="Error while processing /Users/elharo/ImageGrabber.java"/> </pmd>
|
Listing 1에서 PMD 가 두 개의 문제들을 발견했음을 알 수 있다: ImageGrabber.java의 32번째 줄에서 짧은 변수 이름과 105번째 줄에서 밑줄을 포함하는 이름이 그것이다. 작은 문제인 것 처럼 보이지만 결과는 엄청날 수 있다. 이 경우, 105번째 줄의 밑줄은 10년 묵은 코드의 그저 픽스하기 쉬운 코드의 단편이였다. 하지만 첫 번째 문제를 검사해보면 j 변수를 완전히 제거할 수 있었다는 것을 깨닫게 된다. 왜냐하면 각각 증가되고 있었던 또 다른 변수의 기능들을 중복시키기 때문이다. 프로그램은 작동했지만 앞으로의 변화에 대비해야 하는 것보다는 훨씬 더 위험한 것이었다. 여러분이 제거한 모든 코드 라인들은 버그가 들어올 수 있는 하나의 작은 장소이다. PMD 아웃풋을 파일로 리다이렉트 하거나 일반적인 방식으로 에디터로 전달(pipe)할 수 있다. 나는 HTML로 아웃풋을 만들어서 이것을 웹 브라우저에 로딩해 보곤 한다. (그림 1) 그림 1. PMD 아웃풋(HTML)
아웃풋을 파일로 보내는 것은 소스 트리를 검사할 때 특히 유용하다. 디렉토리 이름, zip 파일, JAR 아카이브 파일을 첫 번째 인자로서 전달한다면 PMD 는 그 디렉토리 또는 아카이브에 있는 모든 .java 파일을 반복적으로 검사한다. 소량의 아웃풋이 위협적이다. 특히 PMD가 많은 오류 가능성을 만들어 낼 때 그렇다. 예를 들어 XOM 코드 베이스(참고자료)에서 PMD를 실행할 때, "in과 같은 짧은 이름을 가진 변수를 피하라(Avoid variables with short names like in" 는 보고를 지속적으로 보낸다. "in"은 InputStream 을 나타내는 변수 이름으로서 완벽하다고 생각한다. 그럼에도 불구하고 괜찮은 텍스트 에디터에서 아웃풋을 검사한다면 빈번한 오류를 인식하고 지우는 것이 쉽다는 것을 알게 된다. 이들은 매우 비슷하기 때문이다. 그때 다른 재명명 문제를 픽스 할 수 있다. PMD에서 유일하게 부족한 한 가지 기능은 "lint comment"를 소스 코드에 추가하여 명백히 위험한 연산을 수행한다는 것을 나타내는 기능이다. 이것은 기능이지 버그는 아니다. 이것 외에는 PMD는 대체적으로 괜찮다. 예를 들어, 오랜 시간동안 try -catch 블록은 XOM의 다양한 장소에서 발생했다: try { this.data = data.getBytes("UTF8"); } catch (UnsupportedEncodingException ex) { // All VMs support UTF-8 }
|
PMD는 이것을 빈 catch 블록으로 플래그를 단다. VM이 UTF-8 인코딩을 인식하지 못한다는 것을 발견하게 될 때 까지는 문제가 없을 것처럼 보였다. 그래서 이 블록을 다음과 같이 바꾸고 PMD는 괜찮아졌다: try { this.data = data.getBytes("UTF8"); } catch (UnsupportedEncodingException ex) { throw new RuntimeException("Broken VM: Does not support UTF-8"); }
|
규칙 PMD는 16 가지 규칙 세트가 있고 자바 코드의 다양한 일반 문제들을 다룬다. 이중 어떤 것은 문제가 있는 것도 있다: 규칙 이름 명령행에서 전달되는 규칙들의 이름은 문서화가 잘 되어있지 않다. 이들을 파악하려면 여러 시도와 오류 과정을 거쳐야 한다. 괄호 안에 있는 이름들을 사용할 수 있다. |
- Basic (rulesets/basic.xml) -- 대부분의 개발자들이 동의하는 규칙:
catch 블록들은 비어있어서는 안되고, equals() 를 오버라이딩 할 때 마다 hashCode() 를 오버라이드한다.
- Naming (rulesets/naming.xml) -- 표준 자바 네이밍 규약을 위한 테스트: 변수 이름들은 너무 짧아서는 안된다; 메소드 이름은 너무 길어서는 안된다; 클래스 이름은 대문자로 시작해야 하고, 메소드와 필드 이름들은 소문자로 시작해야 한다.
- Unused code (rulesets/unusedcode.xml) -- 결코 읽히지 않은 프라이빗 필드와 로컬 변수, 접근할 수 없는 문장, 결코 호출되지 않는 프라이빗 메소드 등을 찾기.
- Design (rulesets/design.xml) -- 다양한 좋은 디자인 원리 체크, 이를 테면:
switch 문장은 default 블록을 갖고 있어야 하고, 심하게 중첩된 if 블록은 피해야 하고, 매개변수들은 재할당되어서는 안되며, 더블(double)이 동일함(equality)과 비교되어서도 안된다.
- Import statements (rulesets/imports.xml) -- 임포트 문장에 대한 작은 문제들 점검. 같은 클래스를 두 번 반입하는 것이나
java.lang 에서 클래스를 임포팅하는 것 등.
- JUnit tests (rulesets/junit.xml) -- 테스트 케이스와 테스트 메소드 관련 특정 문제 검색. 메소드 이름의 정확한 스펠링과
suite() 메소드가 정적이고 퍼블릭인지 여부.
- Strings (rulesets/string.xml) -- 스트링 관련 작업을 할 때 발생하는 일반적인 문제들 규명. 스트링 리터럴 중복,
String 구조체 호출, String 객체에 toString() 호출하기 등.
- Braces (rulesets/braces.xml) --
for , if , while , else 문장이 괄호를 사용하는지 여부 검사.
- Code size (rulesets/codesize.xml) -- 과도하게 긴 메소드, 너무 많은 메소드를 가진 클래스, 리팩토링에 대한 유사한 후보들을 위한 테스트.
- Javabeans (rulesets/javabeans.xml) -- 직렬화 될 수 없는 bean 클래스 같이 JavaBeans 코딩 규약을 위배하는 JavaBeans 컴포넌트 검사.
- Finalizers --
finalize() 메소드는 자바에서 일반적인 것은 아니기 때문에 사용법에 대한 규칙이 비교적 익숙하지 않다. 이 그룹의 검사는 finalize() 메소드 관련한 다양한 문제들을 찾는다. 이를 테면, 비어있는 finalizer, 다른 메소드를 호출하는 finalize() 메소드 finalize() 로의 호출 등이 그것이다.
- Clone (rulesets/clone.xml) --
clone() 메소드에 대한 규칙: clone() 을 오버라이드하는 클래스는 Cloneable 을 구현해야 하고, clone() 메소드는 super.clone() 을 호출해야 하며, clone() 메소드는 실제로 던지지 않더라도 CloneNotSupportedException 을 던지도록 선언되어야 한다.
- Coupling (rulesets/coupling.xml) -- 클래스들간 과도한 커플링 표시 검색. 지나치게 많은 임포트, supertype 또는 인터페이스가 충분한 곳에서 subclass 유형 사용하기, 너무 적은 필드, 변수, 클래스 내의 리턴 유형 등.
- Strict exceptions (rulesets/strictexception.xml) -- 예외 테스트: 메소드는
java.lang.Exception 을 던지도록 선언되어서는 안되고, 예외는 플로우 제어에 사용되어서는 안되며, Throwable 은 잡혀서는 안된다.
- Controversial (rulesets/controversial.xml) -- 일부 PMD 규칙들은 유능한 자바 프로그래머가 받아들일 수 있는 것들이다. 하지만 어떤 것은 논쟁의 여지가 충분하다. 이 규칙 세트에는 좀더 의심스러운 검사들이 포함되어 있다. 변수에 null 할당하기, 메소드에서 온 다중의 리턴 포인트
sun 패키지에서 임포팅 등이 포함된다.
- Logging (rulesets/logging-java.xml) --
java.util.logging.Logger 를 위험하게 사용하는 경우 검색: 끝나지 않고 정적이지 않은 logger와 한 클래스에 한 개 이상의 logger 등.
명령행에서 이름과 콤마를 분리하여 여러 규칙 세트들을 한번에 검사할 수 있다: $ /usr/pmd-2.1/etc/pmd.sh ~/Projects/XOM/src html rulesets/design.xml,rulesets/naming.xml,rulesets/basic.xml
|
자신의 규칙 세트 구현하기 특정 규칙 세트로 종종 검사하고 있다면 이들을 자신만의 규칙 세트 파일로 결합할 수도 있다.(Listing 2) 이 규칙 세트는 기본 규칙, 네이밍 규칙, 디자인 규칙들을 반입한다: Listing 2. 기본 규칙, 네이밍 규칙, 디자인 규칙들을 반입하는 규칙 세트
<?xml version="1.0"?> <ruleset name="customruleset"> <description> Sample ruleset for developerWorks article </description> <rule ref="rulesets/design.xml"/> <rule ref="rulesets/naming.xml"/> <rule ref="rulesets/basic.xml"/> </ruleset>
|
좀더 세분화 된 것을 원한다면 각 세트에서 원하는 개별 규칙들을 선택할 수 있다. 예를 들어 Listing 3은 세 개의 빌트인 세트에서 11 개의 특정 규칙들을 선택한 커스텀 규칙 세트를 보여주고 있다. 큰 코드 기반을 검사하는 것은 많은 시간이 걸리기 때문에 찾고자 하는 특정 문제를 보다 빨리 찾을 수 있다. Listing 3. 11 가지 특정 규칙을 반입한 규칙 세트
<?xml version="1.0"?> <ruleset name="specific rules"> <description> Sample ruleset for developerWorks article </description> <rule ref="rulesets/design.xml/AvoidReassigningParametersRule"/> <rule ref= "rulesets/design.xml/ConstructorCallsOverridableMethod"/> <rule ref="rulesets/design.xml/FinalFieldCouldBeStatic"/> <rule ref="rulesets/design.xml/DefaultLabelNotLastInSwitchStmt"/> <rule ref="rulesets/naming.xml/LongVariable"/> <rule ref="rulesets/naming.xml/ShortMethodName"/> <rule ref="rulesets/naming.xml/VariableNamingConventions"/> <rule ref="rulesets/naming.xml/MethodNamingConventions"/> <rule ref="rulesets/naming.xml/ClassNamingConventions"/> <rule ref="rulesets/basic.xml/EmptyCatchBlock"/> <rule ref="rulesets/basic.xml/EmptyFinallyBlock"/> </ruleset>
|
세트 안에 대부분의 규칙들을 포함시킬 수 있지만 동의하지 않는 것이나 또는 오류 가능성들이 있는 것들은 배제할 수 있다. 예를 들어, XOM은 테이블 검색을 수행할 때 종종 switch 문장을 디폴트 블록 없이 사용한다. 나는 대부분의 디자인 규칙들을 지킬 수 있지만 <exclude name="SwitchStmtsShouldHaveDefault"/> 자식 요소를 디자인 규칙을 반입하는 규칙 요소에 추가하여 default 블록을 놓치는 지에 대한 검사를 하지 않는다: Listing 4. switch 문장이 디폴트를 가져야 한다는 디자인 규칙을 배제한 규칙 세트
<?xml version="1.0"?> <ruleset name="dW rules"> <description> Sample ruleset for developerWorks article </description> <rule ref="rulesets/design.xml"> <exclude name="SwitchStmtsShouldHaveDefault"/> </rule> </ruleset>
|
(PMD가 옳다면 대신 디폴트 블록을 추가해야 한다.) 빌트인 규칙에는 제한이 없다. 자바 코드를 작성하고 PMD를 재컴파일 하거나 XPath 식을 작성하여 새로운 규칙을 추가할 수 있다. 결론 (매우 비싼) 빌트인 규칙들을 사용해서 PMD는 코드의 실제 문제들을 반드시 찾아낸다. 이들 중 어떤 것은 미미하지만 어떤 것은 그렇지 않다. 모든 버그를 찾는 것은 아니다. 단위 테스트와 수락 테스트를 수행해야 한다. 또한 PMD는 알려진 버그를 잡을 때 훌륭한 디버거용 대체도 아니다. 하지만 알지 못했던 버그를 찾을 때 빛을 발한다. PMD가 문제를 찾을 수 없었던 코드 베이스를 보지 못했다. PMD는 싸고 쉬우며 재미있는 방식으로 프로그램을 향상시킨다. 전에 PMD를 사용하지 않았다면 시도해보라. |
출처 : http://www-128.ibm.com/developerworks/kr/library/j-pmd/#N101F9
Posted by tornado
proxool 커넥션 풀 소스를 보다가... jndi 를 이용하는 다른 방법이 보이길래 끄적여 봄... http://tyrex.sourceforge.net/ <-- 요기에 보면 여러가지 프로젝들이 보인다.. 그중... 설명은 안나온것 같은데.. 톰캣 처럼.. jndi 를 불편하게 사용해야 할 경우(반드시 server.xml 에 적어줘야 하며, 서버 재시작 필요함.. readonly 환경이라 그렇다고 하넹..) tyrex-naming 을 이용하면 된다.... 현재 버젼은 1.0.2 인가 그렇고.. 테스트 한 패키지는 1.0.1 이며 naming 관련 부분만 이용했다. 먼저.. 간단한 자바 빈 클래스.. 이 녀석을 jndi 에 등록할것임.. package com.javarush.test; public class TestBean { private String print; public TestBean(){ }
public String getPrint() { return print; } public void setPrint(String print) { this.print = print; } }
----------------------------------------------- 초기화 시켜줄 서블릿... web.xml 에 당근 등록해야 하고... <load-on-startup>3<load-on-startup> 으로 지정했다. import java.io.IOException; import java.util.Hashtable; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.spi.NamingManager; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import tyrex.naming.MemoryContextFactory; import com.javarush.test.TestBean; public class InittServlet extends HttpServlet { public void destroy() { super.destroy(); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
} public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
} public void init() throws ServletException { String alias = "myAliasName"; String jndiName = "my/testbean"; try{ TestBean bean = new TestBean(); bean.setPrint("HIHI"); Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, MemoryContextFactory.class.getName()); env.put(Context.URL_PKG_PREFIXES, "tyrex.naming"); env.put(Context.PROVIDER_URL, alias); Context context = new InitialContext(env); context.createSubcontext("my"); context.bind(jndiName, NamingManager.getObjectInstance(bean, null, null, null)); context.close(); }catch(Exception e){ e.printStackTrace(); } } }
--------------------------------------------------------------------- Test 용 JSP <%@ page contentType="text/html; charset=euc-kr" import = "javax.naming.*, java.util.*, com.javarush.test.*, tyrex.naming.*" %><% String alias = "myAliasName"; String jndiName = "my/testbean"; Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, MemoryContextFactory.class.getName()); env.put(Context.URL_PKG_PREFIXES, "tyrex.naming"); env.put(Context.PROVIDER_URL, alias); Context context = new InitialContext(env); TestBean bean = (TestBean) context.lookup(jndiName); context.close(); out.print(bean.getPrint()); %> ------------------------------------ 첨부된 tyrex-1.0.1_naming.jar 파일은 WEB-INF/lib 에 두고.. 실행해 보면 브라우저에 HIHI 가 출력될 것임....
Posted by tornado
점심 먹구 와서.. 길드워 한판땡기고(현재 렙 1이다 ㅎㅎ) eclipse 구동시키고 프로젝트 하나 열어봤다.. 근데 이상한일 ... 패키지 전체를 인식 못하고... 임포트 정렬 기능 사용하면... 지정된 import 문이 싹~! 없어져버리네 ㅡㅡ; 문제는 특정 프로젝트의 프라퍼티에서.. 소스폴더 설정이 없어지고, 외부 jar 라이브러리 로 지정해 놓은 설정도 싸그리 없어진다는 거다.. 예전에 한번 당해서.. 지금은 별로 당황스럽지는 않은데.. 도대체 누가 범인일까?? 이클립스??? myeclipse??? 잡히면 두거써
Posted by tornado
Roadrunner Records의 가장 정상적이고 메이져다운 계약이라는 평가를 받은 유일
한 FA 계약 밴드 Trivium의 첫 메이져 데뷰작 타이틀이 Ascendancy로 확정났으며 내년 3월 1일 발매한다고 합니다.최근 연달아 FA 영입 실패를 만회하려는 듯 여러 레 이블들이 뛰어든 이번 계약 성공에 대한 평가는 두고 두고 좋은 평가를 받을겁니다. 신보에 대해 레이블측은,
오차없는 테크니컬과 트윈기타가 버티고 있으며 화끈한 비트에 스크림부터 부드러운 보컬이 가득 담긴 앨범이라고 밝혔는데요,순수한 메틀 앨범이라는 꼬리표도 붙었습 니다.평균 20세라는 멤버들의 나이이지만 밴드는 Ill Nino.40 Below Summer.The Autumn Offering 등과 투어를 돌았습니다.밴드는 또한 신보에 대해 " 스래쉬와 프로 그레시브.하드코어 요소를 포함하고 있다면서 시간을 추월한 사운드를 창조했다 " 라고 밝혔습니다.
신보의 아트웍은 Mastodon 경력의 Paul Romano가 완성했으며 앨범의 가사 컨셉에 따라 만들었다고 합니다.이들의 곡은 아래의 Link를 통해 확인이 가능합니다.메틀코 어팬들에게 추천합니다.
Trivium 곡 들어보기
* Roadrun.com / 정리 : Rocknew.com
Posted by tornado
2.5.레드햇 리눅스 스펙 정보
Red Hat Linux comes with a variety of resource monitoring tools. While there are more than those listed here, these tools are representative in terms of functionality. The tools are:
레드햇 리눅스는 다양한 리소스 모니터링 툴을 가지고 있다. 여기 소개하는 것은 보다 잘 알려진 것들이며 이들보다 더 많은 툴들이 존재한다.
2.5.1. free
free 명령어는 시스템 메모리 현황을 보여준다.
Mem: 줄은 물리적인 메모리, Swap:은 스왑 메모리의 현황이다. 그리고 -/+/ buffers/cache:는 현재 시스템 버퍼에서 사용중인 물리적 메모리의 양이다.
total used free shared buffers cached Mem: 255508 240268 15240 0 7592 86188 -/+ buffers/cache: 146488 109020 Swap: 530136 26268 503868 |
free는 기본적으로 그 순간의 메모리 현황을 보여주는 것이기때문에 매우 짧은 주기의 모니터링이나 메모리 관련 장애가 발생한 순간에 빠른 상황판단을 할 때 유용하다. 비록 free -s 옵션을 쓰면 메모리 현황을 반복적으로 보여주기는 하지만 그 변화를 제대로 감지하기는 힘들다.
![Tip](http://www.redhat.com/docs/manuals/linux/RHL-9-Manual/admin-primer/stylesheet-images/tip.png) |
Tip |
|
free -s를 좀 더 유용하게 쓰는 방법은 watch 명령어와 함께 쓰는 것이다. 예를 들어 매 2초마다 메모리 현황을 보려한다면 이렇게 해보라.
watch 명령어는 2초마다 free 명령어를 실행시킨다. 이렇게 하면 지나간 화면을 스크롤 하지 않아도 시간에 따른 메모리 현황을 좀 더 쉽게 알아볼 수 있다. 그리고 -n 옵션을 써서 화면을 갱신시키고 -d 옵션으로 바뀐 부분만 반전시킬 수도 있다.
자세한 부분은 man page를 보면 알 수 있다. watch는 여러 곳에서 다양하게 응용할 수 있으므로 기억하도록 하자. |
2.5.2. top
free가 메모리 관련 정보만 표시할 수 있는 반면에, top은 CPU 현황, 프로세스 통계, 메모리 현황같은 것들을 보여준다. 게다가 free와는 다르게 연속으로 갱신된다. watch free 한것처럼....그러나 watch top을 할 필요는 없다.
11:13am up 1 day, 31 min, 5 users, load average: 0.00, 0.05, 0.07 89 processes: 85 sleeping, 3 running, 1 zombie, 0 stopped CPU states: 0.5% user, 0.7% system, 0.0% nice, 98.6% idle Mem: 255508K av, 241204K used, 14304K free, 0K shrd, 16604K buff Swap: 530136K av, 56964K used, 473172K free 64724K cached PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND 8532 ed 16 0 1156 1156 912 R 0.5 0.4 0:11 top 1520 ed 15 0 4084 3524 2752 S 0.3 1.3 0:00 gnome-terminal 1481 ed 15 0 3716 3280 2736 R 0.1 1.2 0:01 gnome-terminal 1560 ed 15 0 11216 10M 4256 S 0.1 4.2 0:18 emacs 1 root 15 0 472 432 416 S 0.0 0.1 0:04 init 2 root 15 0 0 0 0 SW 0.0 0.0 0:00 keventd 3 root 15 0 0 0 0 SW 0.0 0.0 0:00 kapmd 4 root 34 19 0 0 0 SWN 0.0 0.0 0:00 ksoftirqd_CPU0 5 root 15 0 0 0 0 SW 0.0 0.0 0:00 kswapd 6 root 25 0 0 0 0 SW 0.0 0.0 0:00 bdflush 7 root 15 0 0 0 0 SW 0.0 0.0 0:00 kupdated 8 root 25 0 0 0 0 SW 0.0 0.0 0:00 mdrecoveryd 12 root 15 0 0 0 0 SW 0.0 0.0 0:00 kjournald 91 root 16 0 0 0 0 SW 0.0 0.0 0:00 khubd 185 root 15 0 0 0 0 SW 0.0 0.0 0:00 kjournald 186 root 15 0 0 0 0 SW 0.0 0.0 0:00 kjournald 576 root 15 0 712 632 612 S 0.0 0.2 0:00 dhcpcd |
화면은 두가지 섹션으로 구분되는데 위쪽은 uptime, 평균 부하량, 프로세스 갯수, CPU 상태, 메모리와 스왑의 현황 통계등을 표시한다. 아래쪽은 top이 실행되고 있는 동안의 정확한 프로세스 레벨의 통계를 표시한다.
![Warning](http://www.redhat.com/docs/manuals/linux/RHL-9-Manual/admin-primer/stylesheet-images/warning.png) |
Warning |
|
top이 보이기는 간단하게 보이지만 사실은 그렇지 않다. 간단한 명령줄을 제공하는데 프로세스의 우선순위를 바꿀 수도 있고 kill 시그널을 날릴 수도 있다. top 실행화면에서 [?]를 누르면 도움말이 나오니 참조하기 바란다. [q]를 치면 빠져나온다. |
2.5.2.1. The GNOME System Monitor — top의 그래픽 버전
GUI에 익숙한 유저들은 GNOME System Monitor 를 사용해도 좋을 것이다. top 처럼 시스템 전체 현황, 프로세스 갯수, 메모리와 스왑 현황, 프로세스 레벨의 통계를 보여주는 유틸이다.
그러나 GNOME System Monitor 는 이런 정보들을 그림으로 알기 쉽게 표시해준다. 다음은 GNOME System Monitor 에서 프로세스 리스트를 표시한 것이다.
보여지는 각 프로세스들을 선택하고 More Info 를 클릭하면 좀 더 상세한 정보가 표시된다.
CPU, 메모리, 디스크 사용량 등을 알고 싶으면 System Monitor 탭을 선택하면 된다.
2.5.3. vmstat
시스템 성능을 간결한 형태로 보고싶으면 vmstat를 사용한다. 이 툴은 프로세스, 메모리, 스왑, I/O, 시스템, 그리고 CPU 현황을 한줄에 표시해준다.
procs memory swap io system cpu r b w swpd free buff cache si so bi bo in cs us sy id 1 0 0 0 524684 155252 338068 0 0 1 6 111 114 10 3 87 |
프로세스 관련 필드는
-
r — CPU사용을 기다리는 실행가능 프로세스의 갯수
-
b — 인터럽트가 불가능한 슬립 상태에 있는 프로세스의 갯수
-
w — 스왑아웃됐지만 실행가능상태에 있는 프로세스의 갯수
메모리 관련 필드는
스왑 관련 필드는
-
si — 디스크에서 스왑-인 된 메모리의 양
-
so — 디스크로 스왑-아웃된 메모리의 양
I/O 관련 필드는
-
bi — 블럭 장치로 보내진 블럭들
-
bo— 블럭 장치로부터 받은 블럭들
시스템 관련 필드는
-
in — 초당 인터럽트의 갯수
-
cs — 초당 문맥교환된 갯수
CPU관련 필드는
옵션없이 vmstat를 실행하면 단 한줄만이 표시된다. 이 줄은 시스템이 부팅된 시간부터 계산된 평균값이다.
그러나 대부분의 관리자들은 이 데이터는 신경쓰지 않는다. 대신 설정된 시간 간격에 따라 반복적으로 표시되는 통계 데이타를 이용한다. 예를 들어 vmstat 1 은 1초 간격으로 새로운 현황줄을 표시한다. vmstat 1 10 은 1초 간격으로 새로운 현황줄을 10회 표시한다.
경험있는 관리자들은 vmstat 를 리소스와 성능적인 문제를 빨리 판단하려 할 때 사용한다. 그러나 좀처럼 보이지 않는 것을 알아내려 한다면 다른 도구를 같이 사용해야 한다.
2.5.4. Sysstat Suite - 확장 리소스 모니터링 툴
여태까지 소개했던 툴이 매우 짧은 주기의 모니터링엔 도움이 되는 반면, 시스템 리소스 현황의 스냅샷을 제공하지는 못한다. 게다가 그런 간단한 툴로는 시스템의 여러 양상을 모니터링하지 못한다.
그러므로 좀 더 복잡하고 정교한 툴이 필요하게 되었고 Sysstat이 바로 그런 툴이다.
Sysstat contains the following tools related to collecting I/O and CPU statistics:
Sysstat는 다음과 같은 I/O와 CPU관련 정보를 수집하는 툴이다.
- iostat
-
한개 이상의 디스크의 I/O 통계와 CPU 활용도의 개요를 제공한다.
- mpstat
-
좀 더 깊이있는 CPU 통계를 제공한다.
Sysstat는 또한 시스템 리소스 활용 데이터를 수집하고 그 데이터에 기초하여 매일 리포트를 생성한다. 그 툴들은
- sadc
-
시스템 활동 데이타 수집프로그램으로 알려져 있다. sadc는 일정한 형태의 시스템 리소스 활용데이타를 수집하고 파일로 저장한다.
- sar
-
sadc로 생성된 데이터 파일로부터 리포트를 생성한다. sar는 데이터의 집중적인 분석을 위해 대화형으로 리포트를 화면에 표시하거나 파일로 저장할 수 있다.
2.5.4.1. The iostat command
iostat 명령어는 가장 기본적인 CPU와 디스크 I/O 통계를 제공하는 툴이다.
Linux 2.4.18-18.8.0 (pigdog.example.com) 12/11/2002 avg-cpu: %user %nice %sys %idle 6.11 2.56 2.15 89.18 Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn dev3-0 1.68 15.69 22.42 31175836 44543290 |
첫번째 줄에서는 커널 버전, 호스트이름, 현재 날짜를 표시하고 그 다음줄은 부팅 시점부터 시스템의 평균 CPU 현황을 개략적으로 표시한다. CPU 현황 리포트는 다음과 같은 비율을 포함한다.
CPU 현황 다음엔 장치 현황 리포트다. 이것은 한 줄당 각각의 개별 디스크 현황을 나타내며 다음과 같은 정보를 포함하고 있다.
이것은 단지 iostat가 보여줄 수 있는 정보의 일부분일 뿐이다. 자세한 사항은 man page를 참조하라.
2.5.4.2. The mpstat command
mpstat 명령어는 옵션없이 수행하면 iostat의 정보와 차이가 없다.
Linux 2.4.18-14smp (pigdog.example.com) 12/11/2002 07:09:26 PM CPU %user %nice %system %idle intr/s 07:09:26 PM all 6.40 5.84 3.29 84.47 542.47 |
CPU가 핸들링하고 있는 초당 인터럽트 갯수를 보여주는 컬럼을 제외하면 정말 차이가 없다. 하지만 -P ALL 옵션을 사용해보면 상황은 틀려진다.
Linux 2.4.18-14smp (pigdog.example.com) 12/11/2002 07:13:03 PM CPU %user %nice %system %idle intr/s 07:13:03 PM all 6.40 5.84 3.29 84.47 542.47 07:13:03 PM 0 6.36 5.80 3.29 84.54 542.47 07:13:03 PM 1 6.43 5.87 3.29 84.40 542.47 |
다중 프로세서 시스템에서 mpstat는 각각의 CPU에 대한 현황을 보여준다. CPU가 얼마나 효율적으로 사용되고있는 지 알 수 있다.
2.5.4.3. The sadc command
위에 언급했듯이, sadc 명령어는 시스템 현황 데이터를 수집하고 추후 분석을 위해 파일로 저장한다. 기본적으로 데이터는 /var/log/sa/ 디렉토리에 쌓인다. 이 파일들은 sa<dd> 의 형식으로 저장되며 <dd> 는 날짜를 나타낸다.
sadc는 일반적으로 sa1 스크립트로 실행한다. 이 스크립트는 /etc/crond.d에 위치한 sysstat 파일을 참조하여 cron에 의해 주기적으로 수행된다. sa1 스크립트는 매초단위로 sadc를 실행한다. 기본적으로 cron은 10분마다 sa1 스크립트를 실행하며 /var/log/sa/sa<dd> 파일에 일정한 시간간격으로 수집된 데이터를 저장한다.
2.5.4.4. The sar command
sar 명령어는 sadc가 수집한 데이터를 바탕으로 시스템 현황 리포트를 생성한다. 레드햇 리눅스에 설정된 바에 따르면 sar는 sadc가 수집한 데이터를 자동으로 리포트로 생성한다. 이 리포트는 sar<dd> 의 형식으로 /var/log/sa에 저장되며 <dd>는 날짜를 나타낸다.
sar는 일반적으로 sa2 스크립트에 의해 수행된다. 이 스크립트는 sysstat파일을 참조하여 cron에 의해 주기적으로 수행된다. 보통 cron은 매일 23시 53분에 sa2를 수행하며 그 날의 데이터에 대한 리포트를 생성한다.
2.5.4.4.1. 리포트 파악하기
sar 리포트의 표시형식은 여러가지 섹션으로 구성된 레드햇 리눅스의 설정에 따른다. 각 섹션은 데이터가 수집된 날짜 순으로 정렬되며 일정한 형식의 데이터를 담고있다. sadc가 매 10분 마다 초단위로 수행되도록 설정되었기 때문에 기본적인 sar 리포트는 00:00 부터 23:59까지 10분 마다 증가한다. [2]
리포트의 각 섹션은 섹션에 포함된 데이터의 개요를 먼저 설명한다. 머릿말은 일정한 간격으로 반복되어 리포팅을 거듭할 수록 데이터 해석을 더 쉽게 할 수 있도록 한다. 각 섹션은 그 섹션의 평균 데이터를 표시하며 끝맺음을 한다.
00:30부터 23:40까지 수집된 데이터의 sar 리포트 샘플이다.
00:00:01 CPU %user %nice %system %idle 00:10:00 all 6.39 1.96 0.66 90.98 00:20:01 all 1.61 3.16 1.09 94.14 … 23:50:01 all 44.07 0.02 0.77 55.14 Average: all 5.80 4.99 2.87 86.34 |
이 섹션에선 CPU 현황이 표시되고있다. 이것은 iostat의 결과와 매와 흡사하다.
듀얼 프로세서 시스템에서 수집된 CPU 현황에서 생성된 섹션에서 보듯이 다른 섹션은 매 시간 단순한 한 줄 이상의 데이터 가치를 가지고 있다.
00:00:01 CPU %user %nice %system %idle 00:10:00 0 4.19 1.75 0.70 93.37 00:10:00 1 8.59 2.18 0.63 88.60 00:20:01 0 1.87 3.21 1.14 93.78 00:20:01 1 1.35 3.12 1.04 94.49 … 23:50:01 0 42.84 0.03 0.80 56.33 23:50:01 1 45.29 0.01 0.74 53.95 Average: 0 6.00 5.01 2.74 86.25 Average: 1 5.61 4.97 2.99 86.43 |
레드햇 리눅스의 sar 설정은 17가지의 서로 다른 데이터를 생성하도록 되어있다. 자세한 사항은 man 페이지를 참조하기 바란다.
Posted by tornado
http://webfx.eae.net/dhtml/ 탐색기만 있는줄 알았는데 ... 다양하네 ㅎㅎㅎ
Posted by tornado
http://www.muhwa.com/!/sample/obxtabpage/ PHPSCHOOL 갔다가 퍼옴.. 난 왜 이생각을 안하고... 손으로 쳤을까 ㅡㅡ;
Posted by tornado
< 새로운 파일 만들기 >
포토샵 상단의 File을 클릭 New를 클릭하면 New대화 상자가 나타납니다. [Name]항목에 임의의 파일이름 "dojang"쯤이라고 입력하고 Width(도큐멘트의 가로너비) : 100pixels, Height(도큐멘트의 새로높이) : 100pixels, Resolution(해상도) : 72pixels/inch, Mode : RGB Color로 설정하고 OK버튼을 클릭하면 화면에 새로운 도큐멘트가 생성이 됩니다. | < 그림 1 > ![](http://www.photomoa.co.kr/dojang/img/1.gif) | | < 텍스트 삽입 > 도장에 새겨질 텍스트를 삽입하는 방법을 알아 보도록 합니다.
도구상자 하단의 전경색(Set Foreground color)을 클릭하면 Color Picker대화 상자가 나타납니다. 도장밥 색상처럼 약간 검은계통의 빨간색을 선택하고 OK버튼을 클릭하면 전경색이 지정된 색상으로 변화 된 것을 볼 수 있습니다. 도구상자에서 Type tool을 클릭하고 도큐멘트에 마우스를 클릭하여 글자를 입력하고, 쓰여진 글자를 마우스로 드래그 하여 선택하여 줍니다. 메뉴바 아래의 옵션툴바에서 폰트를 지정하는 드롭다운 버튼을 클릭하여 굵은 서체인 "HeadLine-Bold"를 선택하고 폰트 크기를 "30pt"정도로 설정한 후, Set the Aniti-aliasing method는 "Smooth"를 선택하면 아래의 그림과 같이 텍스트가 바뀌어 집니다. | < 그림 2 > ㅡ![](http://www.photomoa.co.kr/dojang/img/2.gif) | | < 도장 테두리 만들기 > 새로운 레이어를 생성하여 그 레이어에 도장 테두리를 만드는 방법을 알아 보도록 합니다.
레이어 팔레트 하단에 Create a new Layer를 클릭하면 레이어"Layer 1"이 생성됩니다. 도구상자에서 Rectangular Marquee Tool을 마우스로 클릭하고 메뉴바 아래의 옵션 툴바에 Feather값을 "0px"로 설정한 후 아래의 그림과 같이 글자를 포함하게 마우스로 드래그하여 선택영역을 만들어 줍니다. | < 그림 3 > ![](http://www.photomoa.co.kr/dojang/img/3.gif) | | 상단 메뉴 Edit를 클릭 Stroke를 클릭하면 Stroke대화 상자가 나타납니다. [Stroke]항목의 Width를 글자 크기와 비슷한 두께인 "8px"정도로 설정하고 [Location(테두리가 나타날 위치 선정)]항목에는 Inside(선택영역 안쪽)을 선택한 후 OK버튼을 클릭하면 선택영역 테두리 안쪽에 굵은 선이 생깁니다.
| < 그림 4 > ![](http://www.photomoa.co.kr/dojang/img/4.gif) | | < 레이어 합치기 > 이제 도장으로 만들어질 텍스트와 테두리가 완성이 되었습니다. 도장과 같이 글자부분과 테두리 부분을 필터를 이용하여 거칠하게 만들어 보도록 합니다. 레이어가 따로 존재하면 각각에 필터를 적용해야 되지만, 레이어를 병합하여 필터를 한번만 적용하여 봅니다.
도장테두리가 생성되었다면, 키보드의 Ctrl키를 누른채 알파벳 D를 클릭하면 선택영역이 해제됩니다. 레이어 팔레트에서 폰트 레이어인 "소스나라" 눈 아이콘 옆의 빈칸을 클릭하면 연결고리(indicates of layer is Linked)를 생성합니다. 레이어 팔레트 상단의 드롭다운 버튼을 클릭하고 Merge Linked(연결된 레이어를 병합)를 클릭하면 레이어"Layer 1"과 글자레이어인 "소스나라"가 하나의 레이어로 병합 됩니다. | < 그림 5 > ![](http://www.photomoa.co.kr/dojang/img/5.gif) | | 상단 메뉴 Filter를 클릭 Stylize를 클릭 Diffuse(이미지경계의 픽셀들을 흩뿌려줌으로써 회화적인 이미지를 만듦)를 클릭하면 Diffuse대화 상자가 나타납니다. [Mode]항목에 "Darken Only(어두운 부분만 선택)를 선택하고 OK버튼을 클릭하면 테두리 부분이 거칠어져 보입니다.
| < 그림 6 > ![](http://www.photomoa.co.kr/dojang/img/6.gif) | | < 그림자 효과적용하기 > 위와 같이 하여 도장이 완성되었습니다. 한가지 더 그림자 효과를 적용하여 입체감을 느끼게 만들고 마무리를 합니다.
레이어 팔레트 하단의 "f(Add a Layer Style)"라고 된 부분을 마우스로 클릭하여 Drop Shadow를 선택하면 "Layer Style"대화 상자가 나타납니다. [Structure]항목인 Distance, Spread, Size값을 각각 3px, 0px, 3px로 설정하고 OK버튼을 클릭합니다.
| < 그림 7 > ![](http://www.photomoa.co.kr/dojang/img/7.gif) |
Posted by tornado
|