오늘은 PHP로 웹서비스 개발시, 테스트를 도울 수 있는 라이브러리에 대해 소개하겠습니다.

이 라이브러리를 사용하려면 CodeIgniter 프레임워크 환경이 필요합니다.


1. CodeIgniter 란?

CodeIgniter(이하 CI)란 PHP를 이용하여 웹사이트를 개발하는 사람들을 위한 도구 모음입니다. CI는 일반적 작업에서 사용되는 다양한 라이브러리를 제공하며, 논리적이고 쉬운 인터페이스를 갖추고 있어서 최소코드로 생산성을 높여줄 수 있는 오픈 소스 프레임워크 입니다.

CI는 매우 가볍고, 빠릅니다(라고 개발사에서는 말합니다). 

M-V-C 패턴에 기반을 둔 CI는 비지니스 로직 계층과 표현 계층이 분리되어있어서 명확한 구조를 유지하지만, 유연성이 좋으므로 프로그램이 복잡해지면 품질관리를 하기가 어렵다고 합니다. 하지만 품질 관리하기 위한 테스트 적용이 쉬운 구조 또한 M-V-C 패턴이라고 하는데요. 최근 TDD(Test Driven Development) 가 부상하면서 테스트의 중요성이 주목받고 있는 시점에, CI는 TDD를 가능하게 하는 프레임 워크라고 할 수 있습니다.

CI는 기본적으로 Unit Test Library가 제공이 되고 있지만, 다음에 소개할 라이브러리는 좀 더 깔끔한 인터페이스와 쉬운 사용법을 가능하게 합니다.


그럼 이제 라이브러리에 대해 알아볼까요?

2. Toast란?

Toast는 CI를 사용하여 개발할때 TDD를 위한 Unit Test Library입니다. 

현재 1.5ver.까지 나와있고, CI 1.7.X 기준으로 작성된 라이브러리 입니다.

홈페이지 : http://jensroland.com/projects/toast/

밑에 자료는 CI2.X기준으로 수정된 버전입니다. (http://www.cikorea.net 에 올라와져있는 자료입니다.)


2.1. 설치방법

1) 공식 홈페이지(CI 1.7X) 또는 한국 CI사용자 포럼(CI 2.X)에서 다운로드 하신 후 압축을 풀어주세요.

2) CI 프로젝트에서 application폴더 하위에 있는 controller와 view폴더 밑에 업로드 합니다.

/app/controllers/test

/app/views/test

3) 브라우저에서 실행하면 끝.


2.2  실행방법 및 예시테스트

테스트 class를 실행하고 싶으면, class이름을  브라우저에  적어주면 됩니다.

http://www.example_mydomain.com/test/my_test_class


테스트 class중에 개별 function 테스트를 하고 싶으면, class이름과 function이름의 붙어있는 prefix인 
'test_'를 뺀 부분을 브라우저에 적어주면 됩니다.

http://www.example_mydomain.com/test/my_test_class/some_action


'test/' 폴더 안에 있는 전체 테스트 class를 실행시키고 싶으시면, Toast_all controller를 브라우저에
적어주면 됩니다. (간혹 버전에 따라 toast_all로 실행이 안될수도 있습니다.그럴때는 Toast_all로 실행해 보세요.)

http://www.example_mydomain.com/test/toast_all


음은 1개의 테스트 class를 실행시킨 예시 스크린샷 입니다.


3. 마무리 하면서...

물론 CI의 내장 단위테스트 라이브러리가 있긴 하지만, 제작자의 말대로 

1) 가벼우면서 기존CI를 저해하지 않고,  

2) CI와 완벽통합되고,

3) JUnit 스타일이면서,

4) 웹브라우저를 통한 테스트를 하며,

5) 개별 또는 통합테스트가 가능한

라이브러리 입니다.

실제 사용했을때 매우 간단한 방법으로 여러개의 테스트를 일괄적으로 할 수 있고,
여러가지의 경우를 테스트 빠르게 할 수 있어서 매우 만족했습니다.
CI환경에서의 TDD를 시도하신다면 정말 강추할만한 라이브러리 입니다.  



Reference: 

CodeIgniter Korea 
http://www.cikorea.net/source/view/618/page/1

공식홈페이지
http://jensroland.com/projects/toast/

'Newbie's Log' 카테고리의 다른 글

MVC(Model, View, Controller) 패턴에 대하여.  (0) 2014.08.07
AngularJS Tutorial  (0) 2014.07.29
Apache VirtualHost에 대해 알아보자  (0) 2014.06.19
빅오 표기  (0) 2014.06.16
Hadoop 맛보기 및 Storm과의 비교  (0) 2014.05.27
Posted by 알 수 없는 사용자
,

현재 운영중인 Web Service의 유지 보수를 위해, 개인 PC에 APM(Apache Php Mysql)을 이용하여 개발환경을 구축하게 되었다. 또한 그 과정 중 Apache Virtual Host를 사용하게 되었다.

여기서는 전체 개발 환경 구축 과정 중 처음 경험하게된 Apache Virtual Host에 대해 포스팅 할 것이며, Apache Virtual Host가 무엇이고 어떻게 설정 및 사용하는지 알아볼 것이다.



Apache Virtual Host란?

  Web Server에는 기본적으로 존재하는 Host가 있으며, 이를 Main Host라고 한다. 하나의 Web Server에는 Main Host 외에 별도의 디렉토리를 가진 여러개의 Host를 설정하여 사용할수 있다.

  이 중 Main Host 외에 나머지 Host를 모두 Virtual Host라고하며, 이를 이용하여 하나의 컴퓨터에서 여러개의 Web Site(예를 들어 Embian1.com, Embian2.com)를 서비스할수 있다. Apache에서는 Name-based Virtual Host  IP-based Virtual Host 두 가지 방식을 제공한다. 글쓴이는 Apache가 제공하는 두 가지 방식 중 Name-based Virtual Host 방식을 이용하여 Virtual Host를 설정하고 적용해 보았다.

아래에서 간단하게 설명하겠지만, 자세한 설명이 필요하다면 링크를 걸어두었으니 참고하길 바란다.


1. Name-based Virtual Host 

  일명 이름 기반의 가상호스트라고 한다. 이것은 하나의 IP Address당 여러 이름을 가지는 방식이며, 가장 보편적인 방법이다. 


2. IP-based Virtual Host

  일명 IP Address 기반의 가상호스트라고 하며, 각 웹 사이트마다 다른 IP Address 또는 Port를 가지는 방식이다. IP Address를 다르게 하는 방법도 있지만, 동일한 Ip Address를 주고 Port를 다르게 하는 방법도 있다.

  (1) IP Address를 다르게 하는 방법


 (2) Port를 다르게 하는 방법



Apache Virtual Host 설정

Apache Virtual Host가 무엇인지는 간단하게 파악했으니, 설정 방법에 대해 알아보자. 다시 한번 말하지만, 글쓴이는 Apache가 제공하는 두 가지 방식 중 Name-based Virtual Host 방식을 이용하여 Virtual Host를 설정하였다.


1. Test용 Web Site 디렉토리 및 Sample Page 생성

  (1) Test용 Web Site 디렉토리 생성 : mkdir -p /var/www/example

  (2) 결과 확인을 위한 Sample Page 생성 : vi /var/www/example/index.html

  

  글쓴이는 Sample Page로 간단하게 아래와 같이 만들었다.

  


2. Test용 Virtual Host 설정

  (1) Apache에서 제공하는 Main Host 파일 복사 :  

  cp /etc/apache2/sites-available/000-default.conf  /etc/apache2/sites-available/example.conf

  (2) 복사한 파일 열기 : vi /etc/apache2/sites-available/example.conf

  (3) 복사한 파일 수정 : 'example.conf'를 아래와 같이 수정한 후 저장한다.

 ServerName

  사용할 도메인명 입력

  글쓴이 설정 : embian.example.com

 ServerAdmin

  에러 발생시 에러 정보가 전송될 이메일 등록

   글쓴이 설정 : 기본 설정

 DocumentRoot

  사용할 도메인으로 접속했을때 처음 접속되는 디렉토리 경로 (Index 파일이 위치한)

   글쓴이 설정 : /var/www/example

 ErrorLog

  Error Log 경로 및 파일 이름

   글쓴이 설정 : 기본 설정 (/var/log/apache2)

 CustomLog

  Custom Log 경로 및 파일이름

   글쓴이 설정 : 기본 설정 (/var/log/apache2)

기타 다른 설정에 대해서는 여기를 참조하길 바란다.



Apache Virtual Host 적용

  설정한 Virtual Host를 적용한다. 적용하기 위해서는 먼저 앞서 만든 '/etc/apache2/sites-available' 디렉토리에 있는 'example.conf '파일을 '/etc/apache2/sites-enabled'에 등록 시킨 후, Apache Service를 Reload 해주어야 한다.

(* 참고 : 'sites-available'은 호스팅 되지 않은 설정이 저장되며, 'sites-enabled'에는 호스팅 되는 설정이 저장 된다.)


  (1) 'sites-enabled'에 등록 : a2ensite example.conf

(*참고 : 'a2ensite'은 해당 파일을 'sites-available'에서  'sites-enabled'으로 등록시켜주는 명령어이다.)

  (2) Apache Reload : service apache2 reload

  



결과 확인

  앞서 생성한 'index.html' 파일과 같은 결과가 나오는지 웹 사이트에 들어가 확인하기 위해, 먼저 도메인이 DNS에 등록되어 있어야 하지만 글쓴이는 Local에서 구동할 것이므로 간단히 로컬에서 테스트하는 방법을 설명하겠다. 

  도메인 입력시 Network Process가 가장 먼저 들리는 파일은 Hosts 파일이다.  따라서 이 파일에 사용할 도메인 명과 IP Address를 입력한다. 

  (1) /etc/hosts 파일 수정 : 사용할 도메인 명 및 IP Address를 추가한다.

글쓴이는 Local에서 실행하므로 'localhost'옆에 적어주었다.

  


  (2) Web Site

  


여기까지 Apache Virtual Host 무엇이며, 설정 및 결과 확인에 대해 알아보았다.

Virtual Host를 설정해보기 전까지만 해도 어찌 해야할지 막막하기만 했는데,  막상 하고 보니 '별거 아니네'하는 생각이든다. 간단한 만큼 겁먹지말고 한번쯤 직접 해보고, 유용하게 사용하길 바란다.


'Newbie's Log' 카테고리의 다른 글

AngularJS Tutorial  (0) 2014.07.29
TDD를 위한 Library: Toast - Unit Testing for CodeIgniter  (0) 2014.06.22
빅오 표기  (0) 2014.06.16
Hadoop 맛보기 및 Storm과의 비교  (0) 2014.05.27
parallel-ssh(PSSH)에대해 알아보자!  (0) 2014.05.23
Posted by 알 수 없는 사용자
,

빅오 표기

Newbie's Log 2014. 6. 16. 16:03

시간 복잡도에 대해 공부하다가 빅-오에 대한 이야기가 많이 나와 간단하게 정리해 보도록 하겠다. '데이터 수의 증가'에 따른 '연산횟수의 증가 형태를 표현한 것'이 빅-오이다.대표적인 빅-오 표기에 대해 알아보자.


O(1)

-상수형 빅-오라 한다. 이는 데이터 수에 상관없이 연산횟수가 고정인 유형의 알고리즘을 뜻한다.

예를 들면 연산의 횟수가 데이터 수에 상관없이 4회 진행되는 알고리즘일지라도 O(3)이라 하지 않고 O(1)이라 한다.

이렇듯 O(1)에는 연산횟수가 고정인 유형의 알고리즘을 대표한다는 의미가 담겨있다.


O(

-로그형 빅-오라 한다. 이는 '데이터 수의 증가율'에 비해서 '연산횟수의 증가율'이 훨씬 낮은 알고리즘을 의미한다. 따라서 매우 바람직한 유형이다. 참고로 로그의 밑이 얼마냐에 따라서 차이가 나긴 하지만, 그 차이는 알고리즘의 성능관점에서 매우 미미하기 때문에 대부분의 경우에 있어서 무시가 된다.


O(n)

-이를 선형 빅-오라 한다. 이는 데이터의 수와 연산횟수가 비례하는 알고리즘을 의미한다.


O(n)

-이를 선형로그형 빅-오라 한다. 이는 데이터의 수가 두 배로 늘 때, 연산횟수는 두배를 조금 넘게 증가하는 알고리즘을 의미한다. n 과  을 곱한 형태라서 난해해 보이지만, 알고리즘 중에는 이에 해당하는 알고리즘이 적지 않다.


O()

-이는 데이터 수의 제곱에 해당하는 연산횟수를 요구하는 알고리즘을 의미한다. 따라서 데이터의 양이 많은 경우에는 적용하기가 부적절한데, 이는 이중으로 중첩된 반복문 내에서 알고리즘에 관련된 연산이 진행되는 경우에 발생한다. 달리 말하면 중첩된 반복문의 사용은 알고리즘 디자인에서 그리 바람직하지 못하다고 할 수 있다.


O()

-데이터 수의 세 제곱에 해당하는 연산횟수를 요구하는 알고리즘을 의미한다. 이는 삼중으로 중첩된 반복문 내에서 알고리즘에 관련된 연산이 진행되는 경우에 발생한다. 이 역시 그냥 적용하기에는 무리가 있는 알고리즘이다.


O()

-이를 지수형 -오라 한다. 이는 사용하기에 매우 무리가 있는 , 사용한다는 자체가 비현실적인 알고리즘이다. '지수적 증가'라는, 매우 무서운 연산횟수의 증가를 보이기 때문이. 처음 알고리즘을 개발했을 이러한 성능을 보인다면, 개선의 과정을 거쳐서 현실적인 연산횟수를 보이는 알고리즘으로 수정되어야 한다.


지금까지 설명한 빅-오 표기들의 성은을 대소로 정리하면 다음과 같다.

O(1) < O() < O(n) < O(n) < O()< O() < O()


그래프로 정리해 보면 다음과 같다.





Posted by 알 수 없는 사용자
,

Hadoop1.0.3 에 대한 간단한 설명 및 Storm WordCount 와 Hadoop WordCount를 비한 자입니다. 


01234567891011121314151617



Posted by 알 수 없는 사용자
,

요 근래 몇달 간 계속 성능 테스트를 진행하다보니 각각 다른 서버에서 은 명령어를 반복하는일만 수백번은 한듯하다.. 멍청하면 몸이 고생이라 했던가....(쿨럭) 


이런 불편한점을 해결해보고자 찾던중 PSSH를 알게되었다!! 사용하다보니 편리할뿐만 아니 초보 개발자인 나에게는 신세계가 따로 없었다!  

PSSH는 parallel-ssh의 약자로 똑같은 파일의 복사나 명령어 을 다수의 리눅스기반 노드에서 실행해야할 경우 사용한다. 현재 PSSH 버전은 2.4이며, Python을 기반으로 만들어졌다. 

본격적으로 PSSH의 설치와 사용법에대해 알아보도록 하자.


설치

설치방법은 parallel-ssh 홈페이지를 참고하였으며, 아래와 같다. (설치 환경 : Ubuntu 12.04)

 (1) ~$ wget 'http://peak.telecommunity.com/dist/ez_setup.py'

(2) ~$ sudo python ez_setup.py

(3) https://code.google.com/p/parallel-ssh/source/browse/INSTALL에서 zip파일 다운

(4) ~$ sudo python setup.py install


사용 방법

PSSH 사용 전에 먼저 다른서버에 ssh 공개키가 등록 되어있는지 확인하고, 등록 되어있지 않다면 먼저 등록하길 바란다. 지금부터 ssh 공개키가 등록되어있다는 전제하에 PSSH 사용법에 대해 알아보겠다.

옵션

먼저 실행시에 어떤옵션들을 줄수있는지 살펴보자.

-i : 결과 출력

-x : ssh 명령어 옵

-h : 호스트 파일 불러오

-ㅣ: 사용자 이름 입

-A : 패스워드  입

-O : ssh config 명령어 옵

-H : 목적지 주소 기재(ip, hostname, domain 입력), 2개 이상의 서버에 명령할 경우 띄어쓰기 사 


1. "-h" 옵션 사용 파일 형

ip는 무조건 기재되어야 하며 ip대신  hostname도 사용 가능하다.

 입력 요소

 예

  ip

 192.168.0.1

  ip, port

 192.168.0.1:30

  ip, user

 192.168.0.1 root

  user, ip, port

 root@192.168.0.1:30


2. ip, user  두 가지 요소 의 예

192.168.0.41부터 192.168.0.46까지 ip이고, embian이 user이다. 


실행

앞서 보았던 "ip, user  두 가지 요소 입력시의 예제"와 같은 내용을 "dept.hosts"라는 이름의 파일로 저장해 두었다. 이 파일을 이용하여 간단한 테스트 몇 가지를 진행하였고, 이를 통해 사용 방법을 설명하겠다.


1. 총6개의 서버에 동일하게 ls 명령을 보낸다.

명령어

  pssh -h dept.hosts -i ls

결과 화면

 

명령어 실행시 1)몇번째로 실행되었는지 알려주는 번호와 2)해당 명령어 실행 시간 및 3)성공 여부, 4)실행 결과 등이 나타난다. 

위의 예제 처럼 -h옵션을 사용하였을 경우 원격서버의 정보가 기입되어있는 파일명을 적어주어야 하며, -i 옵션을 사용 하였을 경우 해당 명령어의 실행결과를 출력한다.

만약 [SUCCESS]가 아닌 [FAILURE]가 나온다면 실행 결과가 아닌 error정보가 출력된다.


2. 총6개의 서버에 동일하게 ELK 디렉토리로 이동한 후 ls 명령을 보낸다.

명령어

 pssh -h dept.hosts -i "cd ELK && ls"

결과 화면


3. 총6개의 서버에 동일하게 ELK 디렉토리안의 log_generator 를 실행한다.

명령

 pssh -h dept.hosts -i "cd ELK/log_generator_v0.2 && java -jar etc/log_generator-0.0.5-SNAPSHOT.jar 1000"

과 화

 

2, 3 의 예제처럼 여러개의 명령어를 붙여서 사용하고 싶다면 "명령어1 && 명령어2 && 명령어3" 이용하면 된다. 


여기까지 PSSH에대해 알아보았다. 잘 사용한다면 local 서버에서 간편하게 명령어 하나로 여러대의 서버를 제어할 수 있을듯하다. 열심히 익혀서 몸이 고생하는 일 없도록 하자. 


참고

PSSH 설치 : https://code.google.com/p/parallel-ssh/source/browse/INSTALL

Posted by 알 수 없는 사용자
,

Logstash와 Elasticsearch Performance Test중 

Elasticsearch Performance Test 부분과 관련하여 정리한 자료입니다.


0123456789101112131415161718192021222324


Posted by 알 수 없는 사용자
,

싱그러운 봄이 지나고 세상이 초록색으로 물드는 여름이 다가오고 있습니다.

3월에 입사한 embian Newbie들은 새로운 것을 하나하나 배워가는 즐거움을 느끼고 있는데요.




사회에 첫발을 디뎌 한 껏 들뜬 새내기 개발자들을 위해 기술적으로나 인맥으로나 한단계 업 시켜줄 팁을 소개할까 합니다.

저도 새내기 개발자기 때문에 평소에 저에게 도움이 될만한 여러 정보를 수집하고 있었는데요 

오늘은 Newbie들을 위한 개발자 행사를 소개하겠습니다. ! 빠밤!

물론 개발자행사를 참여 하는 것에 대한 의구심을 가지고 계신 분도 있겠지만 저는 개발자행사를 참여함으로써

많은 정보와 도움을 얻었고 저만 알고 있기 아깝기 때문에 이렇게 공유하려고 합니다.^^


1.여자개발자모임 개발자 세미나 (개최시기 :5월 ~ 6월)


여.개.모는 는제가 활동하고 있는 개발자 커뮤니티 중 하나입니다.

다수의 남자 개발자들속에서 소수의 여자개발자들을 위한 커뮤니티인데요.

개발을 하는 일을 자랑스러워 하고 즐기고 있고 열정을 가진 여성개발자들이 서로의 기술을 공유하고 배우고, 나름대로 가지고 있는 고충을 공유함으로써 함께 성장해 나가는 것이 목적입니다.

여자 개발자 모임은 1년에 한번씩 큰 행사를 하는데요. (물론 작은 행사들도 있지만 ㅎㅎ)

바로 여자 개발자 모임 개발자 세미나입니다.

2014년은 5월 24일날 개최합니다. 

자세한 정보는 아래의 링크를 참고해 주세요!

http://onoffmix.com/event/27171


공식 커뮤니티 사이트

http://cafe.naver.com/womendevel


p.s 간간히 남성분들도 참여하고 계신다는 점 잊지마세요~


2.Spring Camp(개최시기 : 1년에 1회(날짜는 대중없음))


생긴지 약 3년정도 밖에 되지 않은 개발자 행사인데요.

Korean Spring User Group에서 Spring을 주제로 하여 운영하는 행사입니다.

2013년에는 10월달에 행사를 개최했었는데 2014년에는 5월 31일날 개최합니다.

자세한 정보는 아래의 링크를 참고해 주세요!

http://onoffmix.com/event/27670


공식 커뮤니티 사이트

http://onoffmix.com/event/27670

https://www.facebook.com/groups/springkorea/


3.GDG Korea Woman 세미나


Google Developers Groups Korea Women(GDG Korea Women) 는 한국에 있는 여성 엔지니어들을 위한 모임입니다.

제가 활동하고 있는 모임 중 하나인데요.

다양한 구글 기술들에 대해 이야기하며 엔지니어로서의 역량을 기르고 여성 엔지니어들의 친목을 다질 수 있는 곳입니다.

거의 한달에 한번 꼴로 다양한 기술관련 세미나를 여니까 여성 개발자 분들은 참여 go ! go !

2014년 5월 31일에  Google Korea에서 개최하는 GDG Korea WebTech를 하니까 관심있는 분은 아래의 링크를 참고해 해주세요!

https://sites.google.com/site/gdgdevfestkorea2014/


공식 커뮤니티 사이트 

https://plus.google.com/u/0/communities/116463742909053357630


4.Deview(개최 시기: 10월)


지식을 나누고 SHARING,탁월함 EXCELLENCE 을 추구하며, 함께 성장 GROWTH 하는 컨퍼런스 입니다.

2006년 NAVER 사내 기술행사로 시작하여 2008년부터 외부 개발자들과  함께하여 매년 2천명 이상 참석하는 대한민국 대표 개발자 컨퍼런스입니다.

웹, 모바일, 오픈소스와 개발자문화 부터 빅데이터와 멀티코어 컴퓨팅, IT산업에 필요한 선행기술을 소개하며 더 풍성해진 주제와 연사들을 만날 수 있는 기회입니다.

2013년 Deview를 보고싶으시면 아래의 링크를 참고해주세요 ^^

http://deview.kr/2013/deview.nhn


5.Devon(개최 시기: 10월)


Devon은 국내 대표 기술 커뮤니티와 Daum이 함께 만들어가는 열린 컨퍼런스입니다.

일반적인 강의 위주 콘퍼런스 형식을 완전히 탈피하여 만남, 나눔, 공감, 즐거움을 느낄 수 있는 IT인들의 축제인데요.

자유롭게 IT 리더들의 대담을 청취할 수 있고, 다양하고 새로운 기술들을 경험할 수 있으며 개발자들과 소통할 수 있는 행사입니다.

2013년 Deview를 보고싶으시면 아래의 링크를 참고해주세요 ^^


6.Daum DevDay


Daum DevDay는 오픈 API를 이용한 창의적인 아이디어 구현과 개발자간 교류 확대를 위해 진행되는 1박 2일간의 행사입니다.

참가신청을 통해 팀을 선별한 후 무박 2일동안 자유 주제로 오픈 API를 기반한 매쉬업 과제 수행 후 발표를 하는데요.우수한 성적을 낸 팀에게는 상품을 주기도 합니다. 

1년에 한 번 정도 행사를 개최하니 관심있는 분은 아래의 링크를 참고해주세요^^

http://daumdna.tistory.com/category/%EA%B8%B0%EC%88%A0%ED%96%89%EC%82%AC/%EB%94%94%EB%B8%8C%EB%8D%B0%EC%9D%B4



이외에도  onoffmix에 방문하셔서 검색해보시면 좋은 개발자 행사가 많습니다!

개발자 행사에 참여하여 좀 더 성장해 보자구요!











Posted by 알 수 없는 사용자
,

입사할때만해도 한겨울이었는데, 어느새 시간이 훌쩍 지나가버려 날씨는 점점 여름을 향해 달려가네요. :) 

기술적 포스팅은 잠시 접어두고, 이번 포스팅은 시스템에 접속하여 작업할때 자주 쓰는
리눅스 command에 대해 몇가지를 살펴보도록 하겠습니다.

리눅스기반의 서버에서 작업을 해본 경험이 많지 않아서 처음 시스템내 작업할때 굉장히 긴장되었습니다. 

혹시라도 내가 날린 명령어 한 개가 시스템을 다 죽일 수 도 있을것같은 기분이 들었지요. 
물론, 지금은 아무렇지 않게 command를 날리며 이리 저리 작업을 합니다만,
삭제 명령어를 사용할때는 두번, 세번 확인하곤 합니다.


그럼 다음의 command를 같이 보실까요?


$rm OPTION ] [file(s)/Directory]

소위 한번씩 들어봤을법한 악마의 명령어 

$rm -rf /* 
모든 하위 디렉토리 및 파일을 다 삭제하고 자기 자신까지 지워버며 시스템을 통째로 날린다는 그 무시무시함!! (**부장님께서는 실제로 해 보셨다고 하네요. @_@;;; 

위의 명령어에서 사용된 옵션을 보면 :

-r : 디렉토리를 재귀적으로 삭제.
-f: 존재하지 않는 파일이 있어도 에러를 보여주지 않음.

다음은 자주 쓰이는 옵션입니다.

-d : 디렉토리의 링크를 제거. 관리자 권한 필요함.
-i : 파일을 삭제해도 좋은지 확인.
-v : 로그를 표시.

사용 예를 한번 볼까요?

 $ rm delete_me.txt  

 // 파일 1개 삭제 

 $ rm multiple_file_*

 // multiple_file_로 시작하는 모든 파일 제거

 $ rm -r directory

 // directory라는 디렉토리를 삭제

전 시스템까지는 아니지만 이 rm을 잘못 날려서 한참 작업한 파일을 날려먹었었던 적이 있었더랬죠...

그런데 말입니다, 리눅스에서 작업을 할 때 rm만 주의해야하는게 아니었습니다.


$cp [ OPTION ] [SOURCE] [DESTINATION]

몇일전에 작업을 하다가 백업을 하려고 

$cp * /백업파일이 들어있는 폴더이름/. 

이렇게 명령어를 쳤어야 하는데,

$cp /백업파일이 들어있는 폴더이름/* .

이렇게 쓰는 바람에 모든 파일이 고치기 전으로 돌아가 버리는 웃지 못할 일이 벌어졌습니다.
엔터를 쳐 버린 나의 손가락을 탓을 하며 다시 파일작성을....하아.....ㅠㅠ 

그래서 옵션이 중요한 것입니다!!!

-a : 가능한 한 원 파일의 구조와 속성을 그대로 복사. 
-b : 복사할 때 덮어쓰게 되는 파일은 백업을 만듦. 
-f : 복사 위치에 존재하는 파일을 제거하고 다시 복사. 
-i : 복사 시 같은 이름의 파일이 존재한다면 덮어쓸 것인가 확인. 
-I : 하드 링크를 만듦. 
-P : 원본 파일의 소유자, 그룹, 권한, 시간 기록을 그대로 복사. 
-R , -r : 파일과 하위 디렉토리에 포함된 파일 모두를 복사. 
-s : 디렉토리가 아닌 파일의 심볼릭 링크를 만듦.
-u : 파일의 정보를 갱신. 
-x : 다른 파일 시스템인 하위 디렉토리는 무시. 


사용예는 다음과 같습니다.

 $cp -i file1 /test/.

// test 폴더 아래 file1 파일을 복사
// 이때 대상 폴더에 같은 파일이름이 존재하면 덮어쓸 것인지 확인

 $cp /test/* .

// test 폴더 아래의 모든 파일을 현재 디렉토리에 복사 


위의 두 개의 command는 사용할 때 항상 신중하고 조심해서 사용하는 명령어라면,
다음의 명령어들은 시스템을 검사하거나 파일을 확인할 때 유용한 command입니다.


$cat [OPTION] [file(s)]

파일의 내용을 표준 출력으로 내보내어, 파일내용을 알아보거나, 여러 파일을 하나의 파일로 출력하여 연결해줌.

 $cat file

// file내용을 표준출력으로 보여준다.

 $cat file1 file2 > onefile

// file1과 file2를 onefile로 합한다.


$df [OPTION] [file]

디스크 용량 및 남아있는 공간크기 확인

-h : 용량을 사람이 보기 쉬운 단위로 표시해준다. (1m를 1,048,576단위로 계산, h는human의 약자 )
-k : 용량을 킬로바이트 단위로 표시한다.

 $df -h

 Filesystem      Size   Used  Avail Capacity  iused   ifree %iused  Mounted on

 /dev/disk0s2   112Gi   76Gi   36Gi    68% 19926383 9485985   68%   /

 devfs          197Ki  197Ki    0Bi   100%      680       0  100%   /dev

 map -hosts       0Bi    0Bi    0Bi   100%        0       0  100%   /net

 map auto_home    0Bi    0Bi    0Bi   100%        0       0  100%   /home

 /dev/disk1s2   137Mi  126Mi   10Mi    93%    32361    2627   92%    


$du [OPTION] [file]

디렉토리나 파일의 용량 확인

-a : 디렉토리 이외의 파일에 대해서도 표시한다.
-l : 링크를 포함해서 계산한다.
-c : 모든 용량을 합을 표시한다.
-k : 용량을 KB단위로 표시한다.
-m : 용량을 MB단위로 표시한다.
-s : 지정한 파일이나 디렉토리만의 합계를 표시한다.
-S : 서브디렉토리를 포함해서 집계한다. 

 $du -csh ./Downloads/

 2.9G ./Downloads/

 2.9G total


$ifconfig [interface]

네트워크 인터페이스 설정

옵션없이 간단하게 자신의 ip 확인 가능.


  eth0

Link encap:Ethernet  HWaddr e0:3f:49:a3:b8:4e
inet addr:XXX.XXX.XXX.XXX  Bcast:XXX.XXX.XXX.XXX  Mask:255.255.255.0
inet6 addr: fe80::e23f:49ff:fea3:b84e/64 Scope:Link
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
RX packets:5156295 errors:0 dropped:7395 overruns:0 frame:0
TX packets:7262660 errors:0 dropped:0 overruns:0 carrier:0
 collisions:0 txqueuelen:1000 
 RX bytes:1944698944 (1.9 GB)  TX bytes:9913942713 (9.9 GB)


$grep [OPTION
PATTERN [FILE...]

파일 중에서 어떠한 패턴을 검색, 결과물을 화면에 출력.

-c : 찾고자 패턴의 갯수만 표시


$head [OPTION] [file]

파일의 처음 n개의 내용을 보고자할 때 사용.

$tail [OPTION] [file]

파일의 마지막 n개의 내용을 보고자할 때 사용.

$history

작업했던 command 내용 불러오기.


$ps [OPTION]

 프로세서들의 상태를 점검.

-a : 다른 사용자들의 프로세서도 보여준다.
-u :
 각 프로세서의 사용자 이름과 시작 시간을 보여준다. 
-x : 
로그인 상태에 있는 동안 아직 완료되지 않은 프로세서들을 보여준다

 USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

 root         1  0.0  0.0  37208  6552 ?        Ss   15:47   0:01 /sbin/init

 root         2  0.0  0.0      0     0 ?        S    15:47   0:00 [kthreadd]

 root         3  0.0  0.0      0     0 ?        S    15:47   0:00 [ksoftirqd/0]

 root         5  0.0  0.0      0     0 ?        S<   15:47   0:00 [kworker/0:0H]

 root         7  0.2  0.0      0     0 ?        R    15:47   0:18 [rcu_sched]

 root         8  0.2  0.0      0     0 ?        S    15:47   0:17 [rcuos/0]

 root         9  0.0  0.0      0     0 ?        S    15:47   0:04 [rcuos/1]

 root        10  0.0  0.0      0     0 ?        S    15:47   0:02 [rcuos/2]

 root        11  0.0  0.0      0     0 ?        S    15:47   0:01 [rcuos/3]

 root        12  0.0  0.0      0     0 ?        S    15:47   0:00 [rcu_bh]

 root        13  0.0  0.0      0     0 ?        S    15:47   0:00 [rcuob/0]

 root        14  0.0  0.0      0     0 ?        S    15:47   0:00 [rcuob/1]

 root        15  0.0  0.0      0     0 ?        S    15:47   0:00 [rcuob/2]

 root        16  0.0  0.0      0     0 ?        S    15:47   0:00 [rcuob/3]

 root        17  0.0  0.0      0     0 ?        S    15:47   0:00 [migration/0]

 root        18  0.0  0.0      0     0 ?        S    15:47   0:00 [watchdog/0]

 root        19  0.0  0.0      0     0 ?        S    15:47   0:00 [watchdog/1]

  ...



$man [command]

주어진 명령이나 자원들의 매뉴얼을 출력

man 페이지를 이용하면 다양한 옵션을 사용할 수 있어서 원하는 결과물을 얻기 쉽게 해주기도 하기도 합니다. 그러므로 man 페이지는 가까이 하는 것이 좋겠지요? ^.^


앗! 그러고 보니 가장 중요한 서버에 접속하는 방법을 빠뜨렸군요!!

$ssh [-l login_name] userID@hostName

OpenSSH/SSH 클라이언트 (remote login 프로그램)

시스템에 접속하려면 위의 명령어로 시스템 서버에 접속을 요청하면 Password를 입력하라는 화면이 출력되고, 
userId에 할당된 Password를 넣으면 시스템에 접속시켜줍니다.

장시간 동안 작업을 하지 않게 되면 broken pipe로 접속이 끊기게 되므로,
작업을 하지 않을 때면 적절히 종료시켜주는 것도 참 중요하겠지요.



그렇게 어렵지 않으면서, 정말 자주 쓰이는 command에 대해 간단히 적어봤는데요, 
저는 
내일도 위의 command들을 이용하여 시스템 작업을 할 것 입니다.

간단하지만 그 능력을 가늠하기 힘든 리눅스 command. 더욱 더 노련한 리눅스 유저를 목표로 하며, 오늘 포스팅은 마칩니다. 



Posted by 알 수 없는 사용자
,

지난 포스팅에서는 UML의 역사 및 구성 요소에 대해 간단히 알아보았다. 오늘은 지난 포스팅에 이어 UML의 구성 요소중 도해(Diagram)에 관해 이야기 하겠다. 'UML에 대해 하나도 몰라!'라고 한다면 지난 포스팅을 먼저 참고하길 바란다.


UML Diagram

여기서는 주요 Diagram 몇 가지에 대한 간단한 설명 및 표기법을 알아본다.


1. Use Case Diagram

시스템이 제공할 서비스(Use Case)와 그 이용자(Actor)의 관계(Association)를 표현한 것으로 주로 개발 주기 초기에 사용자의 기능적 요구 사항을 기술하는데 사용한다.

Use Case Diagram의 표기법은 다음 그림1과 같다.

<그림1. Use Case Diagram, http://en.wikipedia.org/wiki/File:Use_case_restaurant_model.svg>


2. Activity Diagram

Activity(또는 Action)의 실행 순서나 실행 조건, 실행자의 관계를 표현한 것으로 업무 영역, 시스템 영역의 처리 흐름을 파악하기 위한 Diagram이다.  주로 특정 비즈니스 프로세스, 오퍼레이션, Use Case의 내부 업무 흐름 등을 파악할 때 사용한다.

Activity Diagram의 표기법은 다음 그림2와 같다.

<그림2. Activity Diagram, http://en.wikipedia.org/wiki/File:Activity_conducting.svg>


3. Sequence Diagram

객체(Object) 사이의 메시지 교환을 나타내는 Diagram으로 객체 간의 동적인 상호 관계를 시간 순서에 따라 표현한 것이 특징이다. 또한 Use Case의 기능을 구체적으로 실현하며 실제 프로그램으로 구현 가능하게 자세히 작성해야 한다.

Sequence Diagram의 표기법은 다음 그림3과 같다.

<그림3. Sequence Diagram, http://en.wikipedia.org/wiki/File:CheckEmail.svg>


4. Class Diagram

Class 구조를 나타내는 Diagram으로 Class들을 정의하고 그들 간에 존재하는 관계를 다양한 방식으로 표현하는 것이 특징이다.

Class의 표기 및 Class간의 다양한 관계 표기법은 다음과 같다. 하나씩 살펴보도록 하자.


Class 표기

UML에서 Class Members 표기는 다음과 같다.

+ 

   Public

-

   Private

#

   Protected

/

   Derived (can be combined with one of the others)

_

   Static

~

   Package

<표1. Class Members 표기법>


Class는 크게 Class Name, Attributes, Operation 이 세 가지로 나누며 Class의 표기는 다음 그림4와 같다.

<그림4. Class 표기법1, http://www.uml-diagrams.org/class-diagrams.html>


Class Members도 사용하며 Class 좀 더 자세히 표현하자면 다음 그림5와 같다.


<그림5. Class 표기법2, http://www.uml-diagrams.org/class-diagrams.html>


위의 Class를 Code로 구현해보자면 다음 그림6과같이 표현할수 있으며, 각 용도에 맞게 Body 부분을 채우면 된다.

<그림6. 그림5에 대한 Java Code >


Class간 관계 표기

Class Diagram에서 절대 빼놓을수 없는것 중 하나가 Class사이의 관계라고 할수 있다. 따라서 여기서는 Class 사이의 관계 표기법과 이를 어떻게 Code로 구현하는지 알아보고자 한다.


먼저 Class 사이의 관계는 다음 그림7과같이 표현하며, 차례대로 하나씩 설명하겠다.

<그림7. Class간 관계 표기법>


(1) Generalization (일반화)

일반화란 Super(부모) Class와 Sub(자식) Class 사이의 관계를 나타낸다. Super Class는 여러 Sub Class들의 공통적인 특징을 뽑아내어 담고 있는 Class로서, Super Class와 Sub Class사이에는 'is a' 관계가 성립한다. 이 관계는 객체 지향에서 상속을 의미한다. 

 아래 그림8은 일반화 표기법과 그 표기에 따라 Code로 구현한 예제이다. 이 예제에서 Super Class는 User이고, Sub Class는 Customer와 Admin이며, 이를 통해 두 Class사이에 'is a'관계가 성립함을 알수 있다. 

- Customer is a User.

- Admin is a User.

<그림8. 일반화>

위의 그림8과 같이 일반화(상속)는 실선과 속이 빈 삼각형을 이용하여 삼각형이 Super Class쪽을 향하도록 표시하며, 자바에서 extends 키워드를 사용하여 구현한다.

또한 Sub Class에서는 Super Class의 Attributes(필드)와 Operation(메소드)을 상속 받아 사용할수 있으며, 추가로 필요한 Attributes Operation을 추가하거나 Operation을 Overriding(오버라이딩)하여 재정의를 할수도 있다.


(2) Realization (실체화)

실체화란 Interface(인터페이스)의 Signature만 있는 Operation(메소드)을 Overriding(오버라이딩)하여  Class마다 알맞은 기능을 할수 있도록 구현하는 것을 의미한다.

아래 그림9는 실체화 표기법과 그 표기에 따라 Code로 구현한 예제이다. 

<그림9. 실체화>

위의 그림9와 같이 실체화의 표기법은 2가지가 있다.

- Interface(인터페이스)를 Class처럼 표시하고 스테레오 타입 «interface»를 Class Name 위에 적는다. 또한 실체화는 점선과 비어있는 삼각형을 이용하여 삼각형이 Interface(인터페이스)쪽을 향하도록 표시한다.

- Interface(인터페이스)를 원으로 표시하고 원 밑에 인터페이스의 이름을 적는다. 또한 Interface(인터페이스)와 Class 사이의 관계는 실선으로 연결하여 나타낸다.

이와 같은 실체화는 자바에서 implements 키워드를 사용하여 구현한다.


(3) Dependency (의존)

의존은 Class Diagram에서 가장 많이 사용되는 관계로서 어떤 Class가 다른 Class를 참조하는 것을 나타낸다. 참조되어지는 Class가 변경될 경우 참조하는 Class는 영향을 받지만 그 반대의 경우는 성립되지 않는다.

아래 그림10은 의존 표기법과 그 표기에 따라 Code로 구현한 예제이다. 이 예제에서 참조되어지는 Class는 User이고, User Class를 참조하는 Class는 Schedule이다.

<그림10. 의존>

위 그림10과 같이 의존은 점선 화살표를 이용하여 화살표의 끝이 참조하는 Class쪽을 향하도록 표시하며, 자바에서 참조의 형태는 Operation(메소드) 안에서 참조되어지는 Class의 객체의 생성, 사용, 반환 및 Operation(메소드) 호출 및 매개변수로 참조되어지는 Class의 객체를 받아 구현하는 방법 등 여러가지가 있다. 

단, 해당 객체의 참조를 계속 유지하지는 않는다.


(4) Association (연관), Directed Association (방향성 있는 연관)

연관은 Class로 부터 생성된 Instance(인스턴스)들 사이의 관계를 나타낸다. 상대 Instance를 가리킬수 있는 속성을 가지며 표현은 Role Name(역할명)을 사용한다. 또한 각 Instance의 수(Multiplicity : 다중도)도 표시할수 있다.

아래 그림11은 연관 표기법과 그 표기에 따라 Code로 구현한 예제이다.

<그림11. 연관>


Instance 수(다중도) 표현

0..1 

  0 또는 하나의 Instance

 0..* 또는 *

  0부터 무한까지의 Instance

 1

  하나의 Instance

 1..*

  적어도 하나 이상의 Instance

 n..m

  n부터 m까지의 Instance 

<표2. Instance 수 표기법>


방향성

연관의 방향성에는 양방향과 단방향 두 가지가 있다.

첫 번째로 양방향은 Association(연관)으로 실선 하나로 Class사이를 연결하여 표시하며, 위 그림11의 가장 왼쪽 예제에 해당한다. 이는 'User와 Address는 관련이 있다'는 의미이다. User가 Address를 참조할 수도, Address가 User를 참조할 수도 있다.

두 번째로 단방향은 Directed Association(방향성있는 연관)으로 실선과 화살표로 Class 사이를 연결하여 표시하며 위 그림11의 가운데 예제에 해당한다. 이는 'User가 Address를 참조한다'는 의미이다.


참고로 위 그림11의 가장 오른쪽 예제는 가운데 Diagram과 비슷한 의미를 가지고 있지만 조금 다른 형태인 속성 표기법으로 나타낸 것이다. 보이는 바와 같이 Role Name(역할명)은 보통 Class의 Attributes(필드)명이 된다. 가운데 Diagram과 다른 점은 Data Type이 List라는것까지 알려준다는 것이다.

가운데 예제와 가장 오른쪽 예제가 같은 의미를 가지도록 가운데 예제를 고쳐본다면 아래 그림12와 같다.

<그림12. 같은 의미의 연관 관계 표기법>


(5) Aggregation(집합 연관)

집합 연관은 연관의 한 종류로서 '전체-부분' 관계를 나타내며, '전체-부분' 관계는 'has a'관계가 성립한다. 유의해야할 것은 전체와 부분이 서로 독립적이라는 점이다. 즉, 부분이 없다고해서 전제에 큰 영향을 미치지 않는다.

아래 그림13은 집합 표기법과 그 표기에 따라 Code로 구현한 예제이다. 

<그림13. 집합>

위  그림13과 같이 집합 연관은 속이 빈 다이아몬드를 전체 쪽을 향하도록 하며, 이를 실선 화살표로 부분 쪽에 연결하여 표시한다. 이를 통해 전체와 부분을 알수 있다. 위 예제에서 전체는 Computer이고, 부분은 각각 Monitor, Keyboard, Body이다.

위에서 전체와 부분은 서로 독립적이라고 설명 했는데, 이에 대해 위 그림13의 예제로 설명하자면 부분이 되는  Keyboard가 없다고해서 Computer가 아니라고 할수 없다. 한마디로 Keyboard가 없어도 Computer는 Computer이다.

이는 전체와 부분이 서로 생명 주기가 다르다는 것을 의미하기도 한다.


(6) Composition(복합 연관)

복합 연관도 집합 연관과 마찬가지로 연관의 한 종류로서 '전체-부분' 관계를 나타내며, '전제-부분' 관계는 'has-a'관계가 성립한다. 하지만 주의해야할 점은 집합과 다르게 전제와 부분이 독립적이지 않다. 즉, 부분이 전체에 매우 큰 영향을 미친다.

아래 그림14는 합성 표기법과 그 표기에 따라 Code로 구현한 예제이다. 

<그림14. 합성>

위  그림14와 같이 복합 연관은 속이 채워진 다이아몬드가 전체쪽으로 향하도록 하며, 이를 실선 화살표로 부분 쪽에 연결하여 표시한다. 집합 연관과 마찬가지로 이를 통해 전체와 부분을 알수 있다. 위 예제에서 전체는 Player이고, 부분은 각각 Screen, Controller이다.

위에서 전체와 부분은 서로 독립적이지 않다고 설명 했는데, 이에 대해 위 그림14의 예제로 설명하자면 부분이 되는  Controller가 없다면 Player는 Player가 아니다. 이해를 좀 더 돕기 위해 전체인 자동차와 부분인 엔진을 예로 들자면 자동차에 엔진이 없다면 자동차의 생명은 끝난다고 할수 있고, 엔진이 없는 자동차는 자동차라 할수 없다.

이는 전체와 부분이 서로 생명 주기를 같이 한다는 것을 의미한다.


결론

지난 포스팅에서는 UML이 왜, 어떻게 탄생했으며 무엇인지 맛보았고, 이번 포스팅에서는 UML에서 꼭 알아두어야 할 Diagram에 대해 설명하였다. 

특히 Class Diagram에 대해 꼭 익혀두길 바라는 바다. Class Diagram을 어떻게 그리는지도 중요하지만 Class Diagram을 Code로 옮길수 있어야 한다. 

Class Diagram을 그리면서 동료와 함께 실컷 설계해 두었는데 이를 Code로 옮기지 못한다면 다 무슨 소용이겠는가.

맨 마지막에 설명한 집합과 합성은 명확한 정의가 없어 많은 사람들이 혼란스러워하고 있고 아직도 논란이 되고있는 부분중에 하나 이다. 때문에 집합과 합성을 사용할 때에는 더 각별한 주의를 요한다.



참고 문헌

위키 : http://en.wikipedia.org/wiki/Class_diagram

Posted by 알 수 없는 사용자
,

Logstash와 Elasticsearch Performance Test중 

Logstash Performance Test 부분과 관련하여 정리한 자료입니다.


0123456789101112131415161718192021

Posted by 알 수 없는 사용자
,