# genkernel --menuconfig all

- 원하는 옵션선택후 reboot 하면 알아서 적용됨.
by cranix 2006. 12. 18. 16:40
1. 새로운 사용자 등록 (GRANT 이용)
 
(1) MySQL에서 모든 권한을 갖는 관리자용 사용자(root)를 추가할 때 
mysql>
GRANT ALL PRIVILEGES ON *.* to root@localhost IDENTIFIED BY 'password' WITH GRANT OPTION;
(2) 일반 사용자(user)에게 자신의 DB(mydb)의 모든 테이블에 모든 권한을 부여할 때 mysql> GRANT ALL PRIVILEGES on mydb.* to user@localhost IDENTIFIED BY 'password'; 2. MySQL의 root 사용자 암호 바꾸기 (mysqladmin 이용) (1) root 패스워드 변경하기. mysql> mysqladmin -u root password new-passwd
(2) 잊어버린 root 암호 다시 설정하기
a. MySQL 모든 프로세서 죽이기
# killall mysqld
b. grant-table을 사용하지 않고 MySQL 데몬을 시작
# ./asfe_mysql --skip-grant-tables &
c. 사용자 테이블이 있는 mysql DB로 접속하여 root 패스워드 다시 설정
# mysql -u root mysql mysql> update user set password=password('newpassword') where user='root';
d. 새로운 암호를 적용하기 위해 flush privileges를 실행
mysql> flush privileges;
e. 다시 모든 MySQL 데몬을 죽인다
# killall mysqld
f. grant-table을 사용하기 위해서 정상적인 방법으로 데몬을 시작
# ./safe_mysqld & 3. 데이타베이스&테이블 생성 및 삭제 (1) 데이타베이스 생성 및 삭제하기
mysql> database
(2) 테이블 생성 및 삭제하기
mysql> table (......); # mysql -u user_name -p db_name < create_table.sql 4. 데이타 검색 (1) 기본형식
mysql> selcet from [];
(2) 정렬해서 검색하기
mysql> select from [where ] -> order by [asc | desc];
(3) 특정 문자열이 포함된 칼럼 검색하기
mysql> select from where like 'string'; 5. 데이터 백업 및 복구 (1) 백업
# mysqldump -u -p >
(2) 복구
# mysql -u -u -p <














출처 : http://cafe.naver.com/bio2bio.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=282http://cafe.naver.com/bio2bio.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=282

' > Mysql' 카테고리의 다른 글

mysql DATE 연산함수  (908) 2009.08.19
MYSQL 글자 붙이기  (44) 2007.07.23
MYSQL LAST_INSERT_ID()  (26) 2007.07.20
MYSQL JOIN 구문  (1087) 2007.06.10
MYSQL EUC-KR 을 UTF-8 로 변경하기  (682) 2007.03.09
by cranix 2006. 12. 18. 15:17


- 아래와같이 로컬 포트를 확인하면 mysql 이 살아있지만
# nmap localhost

- 아래와같이 외부포트를 확인하면 mysql 이 죽어있는경우
# nmap cranix.net

- mysql 의 아래 설정파일에서 변경해 주면 된다.
# /etc/mysql/my.cnf 에 bind-address=127.0.0.1 부분 주석걸면 된다.
by cranix 2006. 12. 18. 15:03
한비야 책을 몇권 읽고나서 팬이됬다.

인터넷 돌아다니다가 그녀와 관련된 동영상을 보게되었는데...

역시 그녀다.



무엇이 내 가슴을 뛰게 하는가?

외국출장 가는 비행기 안에서 한국 청년을 만났다. 군복무를 마치고 복학하기 전 배낭여행을 하고 있다고 했다. 내 세계 여행기를 읽었다는 그 친구가 내게 물었다.
“재미있는 세계 여행이나 계속하지 왜 힘든 긴급구호를 하세요?”

“그 일이 내 가슴을 뛰게 하고 피를 끓게 만들기 때문이죠.”

이렇게 대답하고 나서 속으로 깜짝 놀랐다. 몇 년 전 케냐에서의 일이 떠올랐기 때문이다.

동아프리카 케냐와 소말리아 국경 근처에 우리 단체의 구호캠프가 있었다. 대규모 가뭄 긴급구호로서 식량 및 물 배분과 동시에 이동 안과병원을 운영하고 있었다. 그곳은 한센병(나병) 비슷한 풍토병과 함께 악성 안질이 창궐하여 수많은 사람들의 목숨을 앗아가는 곳이었다.

그 이동 병원에 40대 중반의 케냐인 안과의사가 있었다. 알고 보니 대통령도 만나려면 며칠 기다려야 할 정도로 유명한 의사인데 이런 깡촌에 와서 전염성 풍토병 환자들을 아무렇지 않게 만지며 치료하고 있는 거였다. 궁금한 내가 물었다.

“당신은 아주 유명한 의사면서 왜 아무도 알아주지 않는 이런 험한 곳에서 일하고 있나요?”

이 친구, 어금니가 모두 보일 정도로 활짝 웃으며 말했다.

“내가 가지고 있는 기술과 재능을 돈 버는 데만 쓰는 건 너무 아깝잖아요? 무엇보다도 이 일이 내 가슴을 몹시 뛰게 하기 때문이죠.”

순간 벼락을 맞은 것처럼 온몸에 전율이 일고 머릿속이 짜릿했다. 서슴없이 가슴 뛰는 일을 하고 있다고 말하는 그 의사가 몹시 부러웠고, 나도 언젠가 저렇게 말할 수 있다면 얼마나 좋을까 생각했었다. 그 제대병도 잠시 생각하더니 약간 흥분된 목소리로 내가 그랬던 것처럼 말하는 것 아닌가?

“나도 언젠가 그렇게 말할 수 있으면 좋겠습니다.”

그러고는 내 가슴을 뛰게 하는 긴급구호를 하려면 어떤 준비를 해야 하는지 물었다. 나는 이 일을 하는 데는 어떤 교육을 받고 어떤 기술을 습득하느냐보다 어떤 삶을 살기로 결정했느냐가 훨씬 중요하다고 믿는다.

예컨대, 자기가 가진 능력과 가능성을 힘있는 자에 보태며 달콤하게 살다가 자연사할 것인지, 그것을 힘없는 자와 나누며 세상의 불공평과 맞서 싸우다 장렬히 전사할 것인지를 말이다. 나는 두 번째 삶에 온통 마음이 끌리는 사람만이 긴급구호를 제대로 할 수 있다고 생각한다. 그런 사람은 좀처럼 지치지 않는다. ‘누가 시켰어?’ 이 한마디면 일하면서 겪는 괴로움이 곧바로 사그라들곤 한다. 그렇지 않은 사람은 겉멋에 겨워 흉내만 내고, 남 탓을 하거나 작은 어려움에도 쉽게 포기하기 십상이다.

“나 역시 내가 하고 싶은 일을 하고 싶지만 현실은 다르잖아요?” 제대병이 더욱 진지하게 물었다. 물론 다르다. 그러니 선택이랄 수밖에. 평생 새장 속의 새로 살면서 안전과 먹이를 담보로 날 수 있는 능력을 스스로 포기할 것인가, 아니면 새장 밖의 위험을 감수하면서 가지고 있는 능력을 최대한 발휘하며 창공으로 날아오를 것인가.

새장 속의 삶을 택한 사람들의 선택도 존중한다. 나름대로 충분한 장점과 이점이 있으니까. 그러나 세상 많은 사람들이 새장 밖은 불확실하여 위험하고 비현실적이며 백전백패의 무모함뿐이라는 말은 사실이 아니라는 것을 알려주고 싶다. 새장 밖의 삶을 사는 한 사람으로서, 새장 밖의 충만한 행복에 대해 말해주고 싶다. 새장 안에서는 도저히 느낄 수 없는, 이 견딜 수 없는 뜨거움도 고스란히 전해주고 싶다. 그러니 제발 단 한 번만이라도 자신의 가슴을 뛰게 하는 일이 무엇인지, 진지하게 생각해보라고 권하고 싶다.

며칠 전 비행기 안에서 한 청년에게 던졌던 질문, 내가 나에게도 수없이 하는 질문을 여러분께 드리며 ‘한비야 칼럼’을 마친다.

“무엇이 나를 움직이는가? 가벼운 바람에도 성난 불꽃처럼 타오르는 내 열정의 정체는 무엇인가? 쓰고 또 쓰고 마지막 남은 에너지를 기꺼이 쏟고 싶은 그 일은 무엇인가?”

한비야 월드비전 긴급구호팀장

2004년 10월 27일 한겨레신문



http://buriburi.info/49

'자유글' 카테고리의 다른 글

설치형 블로그와 미니홈피  (6) 2006.12.21
피곤한 이유는?  (48) 2006.12.21
디스커버리호 하늘을 뚫다  (18) 2006.12.19
여기는 서울가는 고속버스안..  (39) 2006.12.17
첫글  (68) 2006.12.16
by cranix 2006. 12. 18. 00:20

토요일날 강릉 내려왔다가 다시 서울가는중이다..

근데... 눈이 너무많이와서 완전 제대로 고립됬다..ㅡ.ㅡ;

오늘안으로 도착할지 의문이다.

내일 회사도 가야하는데...

뭐 이해해 주겠지.ㅋㅋㅋ

근데 이거 몇년전까지많도 꿈도못꿀일이 지금은 되는거보니..

기술이 발전하긴 했나보다.

몇년전만해도 고속버스 안에서 인터넷을 상상이나 할수 있었을래나..

여튼.. TLOGIN 괜찮다.

가격만 좀 다운된다면 계속 써볼 의향도 있다.

뭐 내년부터는 패킷당 요금으로 바뀐다던데...

그냥 지금처럼 정액제로 가지...

'자유글' 카테고리의 다른 글

설치형 블로그와 미니홈피  (6) 2006.12.21
피곤한 이유는?  (48) 2006.12.21
디스커버리호 하늘을 뚫다  (18) 2006.12.19
파워인터뷰 '한비야' 편에서..  (36) 2006.12.18
첫글  (68) 2006.12.16
by cranix 2006. 12. 17. 18:49

원래 jk2.properties 파일이 톰켓 conf 디렉토리에 있어야 하지만 톰켓 5.5 에서 jk2 가 deprecated  되었기때문에 없다. 개발자들의 흥미가 떨어져서 중단됬다고 한다..ㅡ.ㅡ;

그러나 걱정하지 말자 server.xml 파일에 기존의 jk 커넥터가 기본으로 설정되어 있으니 그냥 사용하면 된다. (똑같은 jk 이기때문에 호환 되는거 같다.)

그리고 아파치로 서비스 하게되면 8080 번 포트의 기본 커넥터가 필요없어지니 server.xml 파일에서 주석 걸어두는게 좋을 것이다.



이 문서는 apache2 와 tomcat5.5 가 설치되어있다고 가정한다.



1. UBUNTU 에 JK2 설치하기


$ sudo apt-get install libapache2-mod-jk2



2. jk2.conf, jk2.load 파일 apache2 conf 파일에서 Include 하기

- apache2 conf 파일을 열어보면 아래와같은 부분을 볼수있다.


Include /etc/apache2/mods-enabled/*.load
Include /etc/apache2/mods-enabled/*.conf


- /etc/apache2/mods-enabled 디렉토리에 load 나 conf 파일을 넣어준다면 자동 Include 된다는 소리다.

- /etc/apache2/mods-available 디렉토리에 있는 jk2.conf,jk2.load 파일을 mods-enabled 로 링크 해주자.


3. jk2.conf 파일을 열어보면 아래와같이 또 인클루드 하는데 해당 파일이 없을테니 만들어주자


JkSet config.file /etc/apache2/workers2.properties



4. /etc/apache2/workers2.properties 파일


# Define the communication channel
[status:]
[uri:/jkstatus/*]
group=status:
[shm:]disabled=1
[channel.socket:localhost:8009]
info=Ajp13 forwarding over socket
tomcatId=localhost:8009


# Web Applicaton
[uri:/jsp-examples/*]
info=Map the whole webapp



5. 톰켓 & apache2 재시작


6. http://localhost/jsp-examples/ 들어가봤을때 제대로 나오면 성공이다.

by cranix 2006. 12. 16. 20:17

회사에 select 태그를 이용하는 페이지가 있었는데.. 이놈이 어느순간 상당히 긴~ 값을 가지더니 태그 자체도 늘어나버려서 테이블을 다 깨먹는 사고를 쳐버렸다..ㅡ.ㅡ;
이것때문에 페이지를 하나 더 만들어서 페이징처리하고.. 등등 하기엔 너무 귀찮았다..ㅡ.ㅡ;
어디 좋은방법 없을까 하며 뒤지며 다니다가 htc 라는 것을 보게되었다.
백문이 불여일견이다.
만들어 보도록 하자.

사용자 삽입 이미지

이런 셀렉트박스를 아래와같이 바꾸는 HTC 를 만들어 보겠다.

사용자 삽입 이미지

이것은 위에 보이는 텍스트박스에 글자를 입력하면 해당되는글자가 필터링되서 아래 리스트에 나타나는 것이다.

자. 먼저 이걸 javascript 만으로 구현한다고 생각해보자.
일단 구현은 했다고 치자.
그런데 select 태그가 수십개다?
그러면 어떻게 모든 태그에 적용을한다?
이거 만드는거보다 더 노가다일꺼다..ㅡ.ㅡ;
이 모든것을 말끔히 해결해준게 htc 였다.
htc 로 구현하면 아래와같이 behavior 하나만 추가해주면 바로 변경이 된다.

[code html]<select name="selectbox_focus" style="behavior: url('selectBox.htc');">
<OPTION VALUE="1">옵션 1</OPTION>
<OPTION VALUE="2">옵션 2</OPTION>
<OPTION VALUE="3">옵션 3</OPTION>
<OPTION VALUE="4">선택 1</OPTION>
<OPTION VALUE="5">선택 2</OPTION>
<OPTION VALUE="6">선택 3</OPTION>
<OPTION VALUE="7">옵션 4</OPTION>
<OPTION VALUE="8">옵션 5</OPTION>
<OPTION VALUE="9">옵션 6</OPTION>
<OPTION VALUE="10">선택 4</OPTION>
<OPTION VALUE="11">선택 5</OPTION>
<OPTION VALUE="12">선택 6</OPTION>
<OPTION VALUE="13">옵션 7</OPTION>
<OPTION VALUE="14">옵션 8</OPTION>
<OPTION VALUE="15">옵션 9</OPTION>
<OPTION VALUE="16">선택 7</OPTION>
<OPTION VALUE="17">선택 8</OPTION>
<OPTION VALUE="18">선택 9</OPTION>
</select>[/code]

이거.. 상당히 편하다.
그럼 이제 htc 파일 만드는법을 알아보자.

 [code xml]<public:component>
<public:attach event="ondocumentready" handler="initSelectBox" />
<public:property name="setWidth" put="setupWidth" />
<public:property name="setPopupWidth" put="setupPopupWidth" />

<script>

//TODO

</script>

</public:component>[/code]

위와같은 형태로 만든다.
이게 끝이다.
나머지는 <script></script> 부분에서 javascript 로 처리해주면 된다.

 

1.<public:component>

이 구문은 htc 선언부다.
htc 는 html component 라고도 부르기때문에 이런형태의 선언이 생긴거 같다.

2.<public:attach event="ondocumentready" handler="initSelectBox" />

이부분은 htc 가 걸려있는 오브젝트의 이벤트를 잡아내는 것이다.
"ondocumentready" 라는것은 htc 가 포함되어있는 문서의 로드가 끝났을때를 가르킨다.
뒷부분의 handler 부분에 써있는것은 스크립트 부분에 구현해 줘야한다.

3.<public:property name="setWidth" put="setupWidth" />

이 부분은 property 를 설정하는 부분이다.
<select name="selectbox_focus" style="behavior: url('selectBox.htc');" setWidth="100">
select 태그의 htc 선언부를 위와같이 property 를 추가해서 넣을수도 있다.
이 property 는 init 보다 먼저 실행된다.

4. <script></script>

이부분은 처리를 담당할 javascript 를 쓰는 부분이다.
여기서 this 는 해당 오브젝트를 가르킨다.
자세한 소스는 첨부되어있는 파일을 보기바란다.

- 추가 -

htc 파일을 웹서버에서 쓰려면 해당 웹서버에 mime 타입이 선언되어 있어야 한다.
톰켓 5.5 에는 기본으로 선언되어 있었는데 resin3 에는 없었다.
이거때문에 좀 고생했다..ㅡ.ㅡ;
다른 서버는 테스트 안해봤지만 혹 서버에 올렸는데 htc 가 실행이 안된다면 아래와같이 mime 타입을 선언해 주길바란다.

[code xml]<mime-mapping>
       <extension>htc</extension>
       <mime-type>text/x-component</mime-type>
</mime-mapping>[/code]

 

by cranix 2006. 12. 16. 20:16

익스플로어 6으로 넘어오면서 보안설정이 강화되어서 다른 URL 에서 쿠키를 쓰려면 아래와같이 P3P 표준 규격을 따르도록 헤더를 따로 설정해 줘야한다.

예를들어 IFRAME 내에있는 사이트가 쿠키나 세션 연동이 안될경우 쓰면 된다.



- JSP -


response.setHeader("P3P","CP='CAO PSA CONi OTR OUR DEM ONL'");




- 웹서버 -


Header add P3P "CP=\"ALL CURa ADMa DEVa TAIa OUR BUS IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC OTC\""
Header set P3P "CP=\"ALL CURa ADMa DEVa TAIa OUR BUS IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC OTC\""



- HTML -


<meta http-equiv="p3p" content='CP="CAO DSP AND SO " policyref="/w3c/p3p.xml"' >



- 아파치서버 conf/httpd.conf -


<IfModule mod_headers.c>
Header add P3P "CP=\"DSP CUR OTPi IND OTRi L FIN\""
IfModule>



- PHP -


Header("p3p: CP=\"CAO DSP AND SO ON\" policyref=\"/w3c/p3p.xml\"");

@header('P3P: CP="ALL CURa ADMa DEVa TAIa OUR BUS IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC OTC"');



by cranix 2006. 12. 16. 20:16

톰켓 4.x 버젼까지는 됬는데 5.x 버젼으로 가면서 셋팅법이 약간 바꼇다.;

이거때문에 좀 애먹었다..ㅡ.ㅡ;


1. MYSQL 드라이버를 받아서 설치하기;

  - 이거 잘못넣어놓으니까 자꾸 클래스를 못찾는 에러를 발생한다.  톰켓루트의 shared/lib 이나 애플리케이션루트의 WEB-INF/lib 디렉토리에 넣으면 컴파일은 되나 실행하면 클래스를 못찾는다는것을 명심하자.

  - 가장 귀찮지만 좋은방법은 환경변수에 클래스패스를 걸어서 따로 모아두는거다.(귀찮다.)

  - 두번째 방법은 톰켓루트 common/lib 에 넣어놓는거다. 이거는 클래스패스 안걸어도 톰켓이 알아서 찾아간다. (난 이걸로 쓰겠다.)

  - 마지막으로 가장 무식한방법인 jre/lib/ext 에 넣는 방법이다. (이건 대략 비추)


2. server.xml 설정하기;

  - 이게 문제다. 5.x 버젼으로 오면서 약간 바꼇다. 확인해보자.

  - 아래것을 <Context> 태그 사이에 넣어주면 된다.


  - 먼저 기존것은 다음과 같다.


  <Resource auth="Container" name="jdbc/mysql" type="javax.sql.DataSource"/>
  <ResourceParams name="jdbc/mysql">
  <parameter>
    <name>factory</name>
    <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
  </parameter>
  <parameter>
    <name>url</name>
    <value>jdbc:mysql://localhost:3306/cranix</value>
  </parameter>
  <parameter>
    <name>driverClassName</name>
    <value>com.mysql.jdbc.Driver</value>
  </parameter>  
  <parameter>
    <name>maxIdle</name>
    <value>10</value>
  </parameter>
  <parameter>
    <name>maxActive</name>
    <value>20</value>
  </parameter>
  <parameter>
    <name>maxWait</name>
    <value>-1</value>
  </parameter>
  <parameter>
    <name>minEvictableIdleTimeMillis</name>
    <value>600000</value>
  </parameter>
  <parameter>
    <name>username</name>
    <value>ID</value>
  </parameter>
   <parameter>
    <name>password</name>
    <value>PASS</value>
  </parameter>
  </ResourceParams>


  - 이것이 아래와같이 변경됬다.


  <Resource
   name="jdbc/mysql"
   auth="Container"
   type="javax.sql.DataSource"
   username="[ID]"
   password="[PASS]"
   driverClassName="com.mysql.jdbc.Driver"
   url="jdbc:mysql://localhost:3306/cranix"
  />


  - 짧아져서 좋긴한데.. 몇시간동안 헤멨다 (역시 네이버형님은 모르는게 없다.!)


3. web.xml 설정하기

  -  이건 변함없다.


<resource-ref>
<description>Use for valuation systems DataSource</description>
<res-ref-name>jdbc/mysql</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>



4. 커넥션 확인하기!

  - JNDI 를 써서 커넥션을 확인해보자.

  - 먼저 아래와같이 JNDI 를 컨트롤하는 클래스를 하나만들자.


  - JndiConnectionManager.java


package cranix.common.util;
import java.sql.*;
import javax.naming.*;
import javax.sql.DataSource;
import java.util.Hashtable;


public class JndiConnectionManager {
private static JndiConnectionManager jcm = null;

private Hashtable<String, DataSource> table = null;
private Context initContext = null;

private JndiConnectionManager() throws Exception {
table = new Hashtable<String, DataSource>();
initContext = (Context)new InitialContext().lookup("java:comp/env/");
}
private DataSource getDataSource(String name) throws Exception {
DataSource ds = table.get(name);
if (ds == null) {
  ds = (DataSource)initContext.lookup(name);
  table.put(name, ds);
}
return ds;
}
public static JndiConnectionManager getInstance() throws Exception {
if (jcm == null)
  jcm = new JndiConnectionManager();

return jcm;
}

public Connection openConnection(String name) throws Exception {
DataSource ds = getDataSource(name);
Connection conn = ds.getConnection();  
return conn;
}
public void closeConnection(Connection conn) throws Exception {
conn.close();
}
}



  - 다음 위 클래스를 쓰는 jndiTest.jsp 파일을 만든다.


<%@page import="java.sql.Connection,cranix.common.util.JndiConnectionManager" %>
<%
  JndiConnectionManager jcm = JndiConnectionManager.getInstance();
  Connection conn = jcm.openConnection("jdbc/mysql");
  jcm.closeConnection(conn);
%>
success!


  - 이제 실행해보자!

  - 예외가 발생하지 않는다면 성공!

' > Jsp' 카테고리의 다른 글

jsp 직접실행 막기  (53) 2007.12.12
JSP 페이지를 열때마다 자동으로 캐시 지우기  (42) 2007.03.18
스트러츠 2.0  (92) 2006.12.16
by cranix 2006. 12. 16. 20:15

annotation 한글로 읽으면 어노테이션 사전적 의미로는 "주석" 이다.

주석은 이미 있지않은가?

이게 java5 에 왜 추가가되었을까?

뭐..좀더 확장된 개념의 주석이라고 보면되겠다.

기존의 주석과 달라진점은 프로그램상에서 처리가 가능하다는것이다.

주석을 프로그램상에서 처리할일이 뭐가있지? 라고 생각은 했는데..

아래예제와같이 테스트프로그램 같은데서 쓰일수 있다.



먼저 어노테이션 사용법을 알아보자


1. 먼저 어노테이션 인터페이스를 선언하자

- maker.java


package cranix.test;
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
public @interface maker {
int num();
String name();
String id();
String date() default "unsigned";
}


- 위에서 주석이라고 했지만 class 형태로 만들어진다.

- 어노테이션은 인터페이스에만 선언이 가능하다.

- @Retention(RetentionPolicy.RUNTIME) : 이 어노테이션을 쓰게되면 정보를 CLASS 파일에 저장하도록 한다. (이래야지만 파싱할수 있다.)

- 어노테이션의 선언은 @interface 로 하면된다.

- 메소드들의 내용은 올수없고 형태만 올수있다.

- default 가 찍히지 않은 메소드는 필수로 입력해야 한다.


2. 자 이제 위에서 만든 어노테이션을 사용해 보자

AnnotationCopyright.java


package cranix.test;
import java.lang.annotation.*;

@maker(
num=1,
name="정의돈",
id="cranix"
)
public class AnnotationCopyright {
public static void main(String args[]) {
for (Annotation a: AnnotationCopyright.class.getAnnotations()) {
  System.out.println("Annotation : " + a);
}
}
}


- class.getAnnotations() 와 같이 어노테이션을 파싱할수 있다.

- 물론 어노테이션 인터페이스에서 @Retention(RetentionPolicy.RUNTIME) 를 선언해 줘야지만 가능하다


3. 이제 위엣걸 실행시켜 보자


Annotation : @cranix.test.maker(date=unsigned, num=1, name=정의돈, id=cranix)


- @ 하나는 하나의 어노테이션이니까 루프를 한번만 도는거다.






이제 annotation을 이용해서 jUnit 과 비스무리한 초간단 테스트 프로그램을 만들어 보겠다.


1. 어노테이션 인터페이스를 만들어준다.

- Test.java


package cranix.test.annotation;
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Test {}




2. 테스트할 프로그램을 만든다.

- TestClass.java


package cranix.test;
import cranix.test.annotation.*;

public class TestClass {
@Test public static void m1() {}
public static void m2() {}
@Test public static void m3() {
throw new RuntimeException("런타임 익셉션");
}
public static void m4() {}
@Test public static void m5() {}
@Test public static void m6() throws Exception {
throw new Exception("엑셉션");
}
public static void m7() {}


public static void main(String args[]) throws Exception {
AnnotationTest.test(TestClass.class);
}
}


- 어노테이션이 들어간것이 보이는가?

- 테스트를 원하는 메소드 앞에 @Test 라는 어노테이션을 선언해 주자.



3. 이제 어노테이션이 들어간 클래스를 파싱해서 테스트 해보도록 하자


- AnnotationTest.java


package cranix.test.annotation;
import java.lang.reflect.*;

public class AnnotationTest {
public static void test(Class clazz) throws Exception {
int passed = 0;
int faild = 0;
for (Method m: clazz.getMethods()) {
  if (m.isAnnotationPresent(Test.class)) {
   try {
    m.invoke(null);
    passed++;
   }
   catch(Throwable e) {
    System.out.printf("%s 메소드에서 테스트실패 - 이유 : %s\n",m,e.getCause());
    faild++;
   }
  }
}
System.out.printf("테스트 종료 - 성공 : %d, 실패 : %d\n",passed,faild);  
}
}


- m.isAnnotationPresent(Test.class) 라는것은 메소드가 Test.class 어노테이션을 받고있는것인가 검사하는 것이다.

- 이렇게 하면 @Test 어노테이션을 받고있는 메소드만 테스트를 수행하게 되는것이다.


4. 실행을 하면 아래와같이 나온다.


public static void cranix.test.TestClass.m3() 메소드에서 테스트실패 - 이유 : java.lang.RuntimeException: 런타임 익셉션
public static void cranix.test.TestClass.m6() throws java.lang.Exception 메소드에서 테스트실패 - 이유 : java.lang.Exception: 엑셉션
테스트 종료 - 성공 : 2, 실패 : 2


- 이런 멍청한 테스트 프로그램을 쓰지는 않겠지만 충분히 응용가능하다고 본다.




자 이제까지 간단하게 어노테이션을 알아봤다.

jUnit,EJB3 에서도 어노테이션을 쓴다고 한다.

EJB3 는 안써봐서 모르겠고 jUnit 은 충분히 이해할만 하다.


자바 프로그래밍의 개념이 조금 확장된것이 느껴지지 않는가?

'알짜정보 > Java' 카테고리의 다른 글

JNLP 테스트  (36) 2010.02.14
JAVA 리눅스 IP 주소 알아내기  (38) 2008.12.02
apache 프로젝트의 commons-dbcp 를 이용하여 connection pool 만들기.  (42) 2008.08.15
java 에서 xmlrpc 사용하기  (38) 2008.07.13
JAVA5(1.5) 달라진점!  (19) 2006.12.16
by cranix 2006. 12. 16. 20:14