반응형

bcp migration~~~


bcp util은 sybase 혹은 mssql에 내장되어 있는 UTIL입니다.

사용법은 다음과 같습니다.

왝~ 뭐가 이렇게 많아..

그러나 다 사용되는 놈들이랍니다.

간단히 정말 간단히 bcp 로 백업해봅시다.


bcp [[database_name.]owner.]table_name[:slice_number] {in | out} datafile


[-m maxerrors] [-f formatfile] [-e errfile]

[-F firstrow] [-L lastrow] [-b batchsize]

[-n] [-c] [-t field_terminator] [-r row_terminator]

[-U username] [-P password] [-I interfaces_file] [-S server]

[-a display_charset] [-q datafile_charset] [-z language] [-v]

[-A packet size] [-J client character set]

[-T text or image size] [-E] [-g id_start_value] [-N] [-X]

[-M LabelName LabelValue] [-labeled]

[-K keytab_file] [-R remote_server_principal]

[-V [security_options]] [-Z security_mechanism] [-Q]


예로

bcp pubs2..authors out "c:\ddd.dat" -c -Usa -P

치시면 pubs2라는 db에 authors가 ddd.dat라는 파일로 c:\에 생성됩니다.

그러면 집어넣을때는

bcp pubs2..authors in "c:\ddd.dat" -c -Usa -P

화 ~~~ 정말 간단하죠.. 그럼 아주 유용한 팁을 하나 소개하겠습니다.

dos창을 띄워서 혹은 UNIX 유저는 terminal을 하나 띄워서 다음과 같은 bcptest.sql이라는 화일을 만듭니다. 내용은 다음과 같이 적어 주세요


use pubs2

go

select 'bcp pubs2..'+name+' out '+name+'.dat -c -Usa -P' from sysobjects where type='U'

go


당연히 -P 다음에는 sa의 password를 적어야 합니다.

글구 저는 pubs2 라는 테스트 db의 테이블들을 bcp로 카피한겁니다.

그러니까 여러분은 bcp로 카피하고자 하는 테이블이 있는 데이타베이스를 적어 주세요.

화일을 저장하고 파일이 있는 디렉토리에서 다음을 실행시킵니다.

(주의:이때 위에서 c:\에서 했다고 c:\에서 실행하지 마세요.

c:\에 bcp라는 폴더를 맹글구 난다음 그 안에 bcptest.sql를 맹글구 test하십쇼)


isql -Usa -P -ibcptest.sql -oresult.sql


그럼 result.sql이 현재의 디렉토리에 생성됩니다. 내용을 보세요.


------------------------------------------------------------------------------bcp pubs2..authors out authors.dat -c -Usa -P


bcp pubs2..publishers out publishers.dat -c -Usa -P


bcp pubs2..roysched out roysched.dat -c -Usa -P


bcp pubs2..sales out sales.dat -c -Usa -P


bcp pubs2..salesdetail out salesdetail.dat -c -Usa -P


bcp pubs2..titleauthor out titleauthor.dat -c -Usa -P


bcp pubs2..titles out titles.dat -c -Usa -P


bcp pubs2..stores out stores.dat -c -Usa -P


bcp pubs2..discounts out discounts.dat -c -Usa -P


bcp pubs2..au_pix out au_pix.dat -c -Usa -P


bcp pubs2..blurbs out blurbs.dat -c -Usa -P


(11 rows affected)


다음과 같죠... 흠 이것에서 맨위에 -------

을 없애고 맨밑에 (11 rows affected)을 없애고 저장하면 ....

흐 NT에서는 이 파일을 생성할때 result.sql 말구 result.bat로 생성하세요.

글구 발로 클릭하면 현재의 디렉토리에 bcp 된 화일이 자~~르륵

UNIX에서는 chmod로 실행 퍼미션을 주시고...실행하시면 자르륵 어서 해보세요.

담은 집어넣는거 할겁니다.




출처 : http://ase.sni.co.kr/

반응형

제우스+사이베이스+jsp


엔터를 쳐서 저장한 값을 textarea 에 불러오면 옆으로 붙어서 나온다


이럴때


<%=common.toKorean(content).replaceAll("\r\n","<br>") %>


하면 엔터를 쳤던 부분이 모두 <BR> 태그로 변경되어 제대로 나온다.

반응형

Mook

파이어폭스와 썬더버드, 모질라를 트레이에 넣을 수 있게 하는 확장 기능입니다.

트레이에 넣기
최소화 버튼을 오른쪽 클릭하거나 [도구]-[Minimize to Tray]를 선택, 혹은 Ctrl+Shift+M을 하면 트레이에 넣을 수 있습니다. 최소화 버튼을 왼쪽 클릭하여 트레이에 넣고 싶으면 확장 기능 설정에서 [Always minimize to tray]를 선택하면 됩니다. 그리고 최소화 버튼을 가운데 클릭하거나 Ctrl+오른쪽 클릭하면 열려 있는 창을 모두 트레이에 넣을 수 있습니다.

빠른 실행
모질라처럼 파이어폭스와 썬더버드의 창을 열지 않고 바로 트레이에 넣을 수 있습니다. 파이어폭스나 썬더버드를 실행할 때 -turbo를 추가로 입력하면 됩니다.

참고
- 윈도우즈에서만 사용할 수 있습니다.
- 프로그램이 설치된 폴더나 윈도우즈의 시스템 폴더에 mscvcr71.dll 파일이 있어야만 사용할 수 있습니다.


http://minimizetotray.mozdev.org/

반응형
OpenSource/Free Softwares for Windows
윈도우용 오픈소스/무료 소프트웨어

MS-Windows 에서 내가 사용하는 오픈소스 혹은 무료 소프트웨어들을 정리한다.
대부분 업무상 사용해도 문제되지 않는 것들이다.(일부 제외)

일반 도구

* VirtuaWin : 데스크탑 분할 프로그램. 모니터가 한 개인 상태에서 여러개의 창을 분류별로 각 데스크탑에 나눠 두면 작업 효율성이 향상된다. 유닉스 계열의 X-Window에 기본적으로 있는 기능인데, 윈도우에서 그것을 흉내낸 프로그램이다. 이것은 내가 개발을 위해서 거의 필수적으로 까는 프로그램이다.
* NcFTP : 콘솔기반 멀티 플랫폼 FTP 클라이언트
* Filezilla : GUI FTP/SFTP 클라이언트/서버
* PuTTY(한글판) : SSH/Telnet 클라이언트
* RocketDock : 아이콘 독. 화면 좌우/상하에 아이콘 독을 둘 수 있다.
* Windows XP PowerToys : 특히 Open command prompt here화 Tweak UI, Task Switch를 꼭 설치한다.
* AtNotes : 포스트 잇
* 빵집 : 압축 프로그램. Alz 지원.
* 7Zip : 압축 프로그램. 오픈 소스. 매우 뛰어난 압축률의 7z 지원.
* 다음 툴바 : 바이러스/스파이웨어 백신
* Speedswitch XP : WIndowsXP 노트북 CPU 속도 저절
* KMPlayer : 동영상 재생기
* Foobar 2000 : 음악 재생기
* eMule : P2P 공유
* Adobe Acrobat Reader : PDF 리더
* Nate On : 메신저
* Google Talk : 메신저
* XNews : Usenet 을 이용한 파일 다운로드. binnews.kornet.net
* 바닥 : 동영상 변환(iRiver H320 용)
* VirtualDub : 동영상 변환
* 꿀뷰2 : 그림과 만화 보기
* 오픈캡쳐 : 화면 캡쳐

사무/그래픽

* OpenOffice.org : 오픈 소스 오피스 스위트
* Paint .Net : 오픈 소스 PhotoShop
* photo WORKS : 이미지 편집 도구

웹 브라우저/EMail

* FireFox : 최강의 멀티 플랫폼 웹 브라우저
* Opera : 가볍고 빠르고 웹 표준을 아주 잘 준수하는 브라우저
* Thunder Bird : 모질라 재단의 이메일/뉴스 클라이언트

Database 관련

* SQLTools(한국) : 오라클 쿼리/관리 도구. 우리나라사람이 만든 것.
* SQLTools.Net(sf.net) : 오라클 쿼리/관리 도구. SF.net 에 있는 것. Oracle Client 필수.
* SQuirrel SQL : Java 기반 데이터베이스 관리도구. JDBC 드라이버가 있는 모든 DB.
* Aqua Data Studio : Java 기반 데이터베이스 관리도구. JDBC 드라이버가 있는 모든 DB. 상용이지만 개인 사용은 무료.

텍스트 편집기

* Vim : VI Improved. 멋진 멀티 플랫폼 에디터. 내가 주로 사용하는 에디터.
* Notepad++ : Windows 용 프로그래머의 에디터
* JEdit : Java 기반 프로그래머용 에디터. 매우 강력한 플러그인 기능 지원.

개발 도구

* Eclipse : Java IDE.
* NetBeans : Sun 이 만든 Eclipse의 경쟁자. NetBeans Profiler 등을 이용.
* JSwat : GUI 자바 디버거
* WinMerge : 텍스트 비교(Diff) 툴
* WinTail : 로그 파일을 볼 때 사용하는 tail 명령과 같은 기능. 매우 단순.
* Tail For Win32 : 다양한 로그 파일을 한꺼번에 등록해서 볼 수 있는 tail 기능.
* Follow : Java로 만들어진 tail. 여러 파일 처리 가능.
* Tortoise CVS : CVS 클라이언트
* Tortoise SVN : Subversion 클라이언트
* Cygwin : MS-Windows 에서 Unix 환경 구축
* IE용 DevToolbar
반응형
유용한 즐겨찾기 모음 ======================================================================================= JDK 1.4 한글 도움말(javastudy) : http://www.javastudy.co.kr/api/api1.4/ JDK 1.4 한글 API(forcert) : http://www.forcert.com/programming/api/j2se/1.4.0k/index.html servlet api : http://jakarta.apache.org/tomcat/tomcat-4.1-doc/servletapi/index.html - 2.3 http://jakarta.apache.org/tomcat/tomcat-5.0-doc/servletapi/index.html - 2.4 jsp2.0 api : http://jakarta.apache.org/tomcat/tomcat-5.0-doc/jspapi/index.html - 2.0 J2EE 한글 도움말 : http://forcert.com/programming/api/j2ee/1.3.0k/ J2EE 1.4 튜토리얼 : http://java.sun.com/j2ee/1.4/docs/tutorial/doc/index.html JSTL 1.1 : http://java.sun.com/products/jsp/jstl/1.1/docs/tlddocs/index.html Spring API : http://www.springframework.org/docs/api/index.html Hibernate API : http://www.hibernate.org/hib_docs/api/ 자바 패키지별 예제(영문) : http://sangchin.byus.net/FlashHelp/Almanac.htm ================================================================================== 자바 싸이트 ----------------------------------------------------------------------------------- 자바스터디 : http://www.javastudy.co.kr/ (강좌 정리) 자바누리 : http://www.javanuri.com/ 자바랜드 : http://www.javaland.co.kr/ 소설같은 자바 : http://www.jabook.org/ (책 한권) 자바서비스넷 : http://www.javaservice.net/ (중고급 정보) 김상욱의 개발자side : http://50001.com/ (소스 등) 종스클럽닷컴: http://www.jongsclub.com/ JLAB : http://www.jlab.net/ OKJSP : http://www.okjsp.pe.kr/ 제이스톰 : www.jstorm.pe.kr/ 자바 튜토리알(영어) : http://java.sun.com/docs/books/tutorial/index.html 스윙 컴포넌트 예제(영어) : http://java.sun.com/docs/books/tutorial/uiswing/components/components.html MS SQL2000 JDBC 드라이버 다운로드 : http://www.microsoft.com/korea/download/server.asp 자카르타 프로젝트 한글화 : http://jakarta.apache-korea.org/ 자바지기 : http://wiki.javajigi.net/ 자바지기 eclipse 강좌 : http://wiki.javajigi.net/display/IDE/Eclipse 자바지기 struts 강좌 : http://wiki.javajigi.net/display/FRAMEWORK/Home 이클립시안 : http://eclipsians.net/ 자바 카페 : http://www.javacafe.or.kr/ 자바 API 예제(영어) : http://javaalmanac.com/egs/ Sun Korea Developer Network : http://kr.sun.com/developers/ IBM Java 입문서 : http://www-128.ibm.com/developerworks/kr/java/newto/ ================================================================================== JSP 싸이트 ----------------------------------------------------------------------------------- JSP 스쿨 : http://www.jspschool.com/ (정리 잘됨, 자료실 Good) OKJSP : http://www.okjsp.pe.kr/ (종류별로 정리잘된 싸이트) JSP스터디 : http://www.jspstudy.co.kr/ (오른쪽 메뉴중 lecture list 강좌보면 좋다) AboutJSP : http://aboutjsp.com/ (강좌, 팁, QnA 등) 자북 (소설같은 JSP) : http://www.jabook.org/ (책 소설같은 JSP의 1부, 2부 있음) 까오기 : http://www.kkaok.pe.kr/ (여러 유영한 팁들) 더블 아이큐 : http://www.doubleiq.pe.kr/ (정리된 강좌와 QnA 등 ) 김호 JSP : http://www.kimho.pe.kr/jsp/index.html ================================================================================== J2EE 싸이트 ----------------------------------------------------------------------------------- J2EE 스터디 : http://www.j2eestudy.co.kr/ 웹로직 관련 문서 등 있는 싸이트 : http://www.itadvisor.co.kr/ ======================================================================================== 홈페이지 관련 싸이트 ----------------------------------------------------------------------------------- 태그매니아 : http://www.tagmania.net/ 야자바 HTML : http://www.yajava.com/shop/mart7/inc.php?inc=content_main/html HTML's Land : http://ilovehansem.com/~html/ ib96 동영상 무료 회원 HTML 강좌 : http://htm.ib96.com/ 태그조아 : http://www.tag.zoa.to/ 모노카페 : http://my.dreamwiz.com/monocafe/ 김덕현 : http://my.dreamwiz.com/kim0057/ 송파나루터 : http://www.studyho.com/ 트리오 : http://trio.co.kr/ 태그대학 : http://www.tag4u.wo.to/ 송현건 : http://home.introcom.net/~gosoo99/ 스타트 홈페이지 : http://www.starthomepage.com/index.jsp 태그야 놀자 : http://www.tagyanolja.com/ 컴으로 허자허자(다음카페) : http://cafe.daum.net/herjaherja 태그 연습장(컴으로 허자허자) : http://www.herjaherja.com/bonus/tag.htm 태그 연습장(샐리디카) : http://myhome.naver.com/sallynice/blog/sallyedit.htm ======================================================================================== 자바스크립트 관련 싸이트 ----------------------------------------------------------------------------------- 자바스크립트 정리 Good : http://koxo.com/lang/js/ 자바스크립트 인터넷 강의 : http://javascript.ubedu.com/ CGI & JavaScript : http://www.cginjs.com/ JS Guide : http://jsguide.net/ver2/ 이용석의 자바스크립트 : http://user.chollian.net/~spacekan/ 블루 비 : http://www.blueb.co.kr/ 자바방 : http://javabang.net/ 학꺼니 홈 : http://user.chollian.net/~chk012/frame.html 까오기(왼쪽 developer 메뉴의 javascript 클릭) : http://www.kkaok.pe.kr/ 해피스크립트 : http://www.happyscript.com/ 자스코 (유료싸이트) : http://www.jasko.co.kr/ 영문 싸이트 : http://www.devguru.com/Technologies/ecmascript/quickref/javascript_index.html 자바스크립트 정리(영어 사이트) : http://www.javascripttoolbox.com/bestpractices/ ======================================================================================== 개발자 참고 싸이트 ----------------------------------------------------------------------------------- 웹 개발자 가이드 : http://www.mozilla.or.kr/docs/web-developer/standard/ MSDN 링크 : http://msdn.microsoft.com/library/default.asp ======================================================================================= 온라인 해킹/바이러스 진단 및 치료 프로그램(국민은행 제공, 하우리 백신) : http://update.inca.co.kr/kookmin/livecall/kook_livecall.html ======================================================================================= ====================================================================================== 기타 관련 다운로드 싸이트(JDK, MySQL, 톰캣 등) ====================================================================================== JDK 1.4.x 자바 Development Kit http://java.sun.com 톰캣 : http://tomcat.apache.org/ --------------------------------------------------------------------------------------- MySQL MySQL 데이터베이스 http://mysql.com 한국 MySQL : http://mysqlkorea.co.kr/ MySQL Connector/J (JDBC Driver for MySQL) http://dev.mysql.com/downloads/connector/ MySQL-Front : http://www.mysqlfront.de/download.html SQLyog(MySQL툴) 다운 : http://www.webyog.com/sqlyog/thanks.php --------------------------------------------------------------------------------------- 오라클 9i 링크 : http://www.oracle.com/technology/software/products/oracle9i/index.html 오라클 다운 : http://download.oracle.com/otn/nt/oracle9i/9201/92010NT_Disk1.zip http://download.oracle.com/otn/nt/oracle9i/9201/92010NT_Disk2.zip http://download.oracle.com/otn/nt/oracle9i/9201/92010NT_Disk3.zip ================================================================================== All In One Eclipse 이클립스 다운로드 ---------------------------------------------------------------------------------- 일본어 : http://aioec.sourceforge.jp/cgi-bin/wiki.cgi 영어 : http://aioec.sourceforge.jp/cgi-bin/wiki.cgi?page=english%5Ftop ================================================================================== 이클립스 eclipse 3.1.1 다운로드 정리 WTP 다운 : http://www.eclipse.org/webtools/ 이클립스 플러그인 순위 : http://eclipse-plugins.info/eclipse/ratings_overview.jsp 한국의 미러 싸이트 : http://eclipse.areum.biz/downloads/ (톰캣 개발시 유용한 플러그인) 톰캣 플러그인 : http://www.sysdeo.com/sysdeo/eclipse/tomcatplugin 직접 다운 : http://www.sysdeo.com/sysdeo/content/download/393/4930/file/tomcatPluginV31.zip tomcatPluginV31.zip 다운 받아서 압축 해제해서 C:\eclipse\plugins 에 복사 ================================================================================== 자카르타 Ant 한글 싸이트 : http://ant.apache-korea.org/ 자카르타 Ant 다운로드 : http://ant.apache.org/bindownload.cgi 다운로드 리스트 : http://archive.apache.org/dist/ant/binaries/ ant 1.5.4 다운 로드 : http://archive.apache.org/dist/ant/binaries/apache-ant-1.5.4-bin.zip ant 1.6.5 다운 로드 : http://ftp.apache-kr.org/ant/binaries/apache-ant-1.6.5-bin.zip ---------------------------------------------------------------------------------------- 자바스크립트 에디터 : http://sourceforge.net/projects/jseditor http://heanet.dl.sourceforge.net/sourceforge/jseditor/net.sf.wdte.js_0.0.9b.zip CSS 에디터 : http://www.vasanthdharmaraj.com/Software.aspx?=csseditor JSEclipse : http://www.interaktonline.com/downloads/eclipse/100/JSEclipse_1.2.1.zip AnyEdit : http://andrei.gmxhome.de/anyedit/links.html --------------------------------------------------------------------------------------- (스트럿츠 개발시 유용한 플러그인) EasyStruts : eclipse 에서 스트럿츠 개발시 사용하는 플러그인. 1. 다운로드 : 주소 http://sourceforge.net/projects/easystruts 2. 직접 다운로드 http://prdownloads.sourceforge.net/easystruts/org.easystruts.eclipse_0.6.4.zip?download --------------------------------------------------------------------------------------- (스트럿츠) 1. 스트럿츠 다운 http://archive.apache.org/dist/struts/ 2. 스트럿츠 직접 다운로드 http://ftp.apache-kr.org/struts/binaries/struts-1.2.7.zip http://mirror.apache.or.kr/jakarta/struts/binaries/jakarta-struts-1.1.zip (ANT 다운 로드) http://www.apache.org/dist/ant/ --------------------------------------------------------------------------------------- (스트럿츠 참고 싸이트) 자바 프레임워크(네이버 스트럿츠 카페) : http://cafe.naver.com/deve.cafe ======================================================================================= MyClipse 동영상 자료 : http://www.myeclipseide.com/images/tutorials/webprojectdemo.htm ======================================================================================= 우키의 블로그 : http://www.jaewook.net/ 한글패치 : http://lang.playxp.com/ 웹마 : http://www.mdiwebma.com/ jwBrowser : http://samba.ssyy.net/ 구글 : http://www.google.co.kr 심파일 : http://simfile.chol.com/ 이클립스 : http://www.eclipse.org/ ie toy, ad-free : http://loser.miniwini.com/tt/ 자료 : http://baechul.com/cgi/technote/main.cgi?board=pds 브피피닷넷 : http://vbpp.net/ 자료 소스 : http://semtle.cuk.ac.kr/bbs/list.php?id=pds 웹빌드 : http://www.webbuild.co.kr 넷탑 : http://www.nettop.pe.kr 파워빌더 유저 가이드 : http://www.pbuser.com/main.html 미친감자 : http://mazinga.egloos.com/ EditPlus 자바 컴파일 설정 : http://www.javacafe.or.kr/lecture/cafeLecture/tool/EditPlusSetting/EditPlusSetting.htm 구글 툴바 : http://toolbar.google.com/T3/intl/ko/index_ie.php ================================================================================== PDA 싸이트 ----------------------------------------------------------------------------------- 투데이스피피시 : http://www.todaysppc.com PDA 프로그램 모음 싸이트 : http://www.fingertool.com/ 포인트피디에이 : http://www.pointpda.com 코리아닷컴 피디에이 : http://pda.korea.com/ 정리 잘된 싸이트 : http://www.114pda.com/ 무료 PDA 소프트웨어(영어) : http://www.freewareppc.com 클리앙 : http://www.clien.net/ PDA용 GPS : http://www.freenavi.co.kr/ PDA용 GPS : http://shop.free-gps.com/ RW6100 드라이버 다운로드 : http://h50177.www5.hp.com/support/FA294PA/drivers/os_2045.html RW6100 메뉴얼 : http://h50201.www5.hp.com/manual/index.asp MissPDA : http://www.misspda.com/ 아이핸디고(외국의 아방고와 비슷한 한국판 사이트) : http://www.ihandygo.com/ 마이폴더 PDA 자료실 : http://pda.myfolder.net/ PDA용 뉴스 싸이트 정리 : http://clip.bakion.com/ PPC용 프로그램 개발(영어) : http://www.codeppc.com/ ================================================================================== XML 싸이트 ----------------------------------------------------------------------------------- 안항준의 XML : http://my.netian.com/~aphise/ XML 스터디 : http://www.xmlstudy.co.kr/ 김종민의 XML : http://xml.80port.net/ 자바지기 : http://www.javajigi.net/ XML Developer Group : http://xml.geonji.co.kr/ Rapsodie's XML Resource : http://user.chollian.net/~rapsodie/main.html 용어사전과 XML : http://trio.co.kr/ HowXML : http://www.howxml.com/ 군산대학교 XML 연구실 : http://xmlab.kunsan.ac.kr/ XML 강좌 링크 : http://www.howon.ac.kr/~ktlim/lecture/xml/xml-index.htm 코리아 인터넷 XML 강좌 : http://korea.internet.com/channel/index.asp?cid=193 XML 홈페이지 만들기 강의 자료 : http://muse.inchon.ac.kr/jschae/internet_xml.html XML 강의 자료 : http://kuic.kyonggi.ac.kr/~ejlee/xml/#course-note XML 강의 : http://hyejeon.ac.kr/%7Ekrkuki/xmlq_1.html 자바지기 XML 강좌 : http://wiki.javajigi.net/display/XML/Home ================================================================================== 기타 싸이트 ----------------------------------------------------------------------------------- 소스들 : http://bluebild.byus.net/ 구글툴바 : http://toolbar.google.com/intl/ko/index_ie.php 개인 이글루 싸이트(프로그래밍) : http://kwon37xi.egloos.com/ 자카르타프로젝트(?) : http://www.jakartaproject.com/ TDD : http://wiki.tdd.or.kr/wiki.py CSS : http://ilmol.com/wp/css DB Desiner 4 : http://www.fabforce.net/ manwal 블로그 : http://blog.etnews.co.kr/html/blog_home.php?bid=manwal 데이타베이스 사랑 넷 : http://database.sarang.net/ Xrath 블로그 : http://xrath.com/blog/index.php?category=Development 루비 : http://forum.rubykr.org/ 루비 홈 : http://www.ruby-lang.org/en/ RDE : http://homepage2.nifty.com/sakazuki/rde_e.html MMF 플레이어 : http://www.playersparadise.net/download/ 누룽지 : http://www.nulunggi.pe.kr/ JavaRSS : http://javarss.pe.kr/ ======================================================================================== OKJSP 동영상 강좌 : http://www.okjsp.pe.kr/lecture/viewlet/ 이클립스 톰캣 디버그 : http://www.okjsp.pe.kr/lecture/viewlet/okjsp2005/10_lomboz_tomcat_debug.html Xper 위키 : http://xper.org/wiki/xp/ 자카르타 한글 번역 : http://jakarta.apache-korea.org/ 이클립시안 : http://eclipsians.net/ 국현님 싸이트 : http://goodhyun.com/ Jazz Virtual Machine : http://www.jazzvm.net/ 오라클자바 : http://www.oraclejava.co.kr/ JavaJiGi 강좌 1. Eclipse 강좌 2. Struts 강좌 3. XML 강좌 빌크 블루엣 인터내셔널에서 운영하는 작은 커뮤니티 : http://www.bilc.co.kr/ 구글 바로 가입하기 : http://www.bytetest.com/ larky : http://larky.biz/blog/ mabaji " http://tong.nate.com/mabaji J2EE Study : http://www.j2eestudy.co.kr 한국 JBoss 사용자 그룹 : http://www.krjbug.com/ 행복한고니 블로그 : http://mygony.com/tt/index.php 주홍넷 : http://www.joohong.net/ (게임기획) NT FAQ : http://www.ntfaq.co.kr/ 해킹 : http://www.ganseo.com/zboard/new_center.php ======================================================================================== 데이타베이스 관련 싸이트 ======================================================================================== 오라클 강좌 : http://oracleclub.com/ 오라클용 무료 DB 툴 (DBA Master 2000) : http://www.dbany.com/ 데이타베이스 정보 : http://www.databaser.net/ Korea Oracle Use Group : http://www.koug.net/ 데이터베이스 벤더간 함수, 문법 비교 : http://www.crossdb.com/dbknowledgebase/differencestable.html 데이타베이스 : http://home.ditco.com/~angel/Advanced/advanced.html 무료 오라클 툴(SmartSQL) : http://smartsql.hubweb.net/ ======================================================================================== 인터넷 서점 ======================================================================================== 도서가격 비교 (마이마진): http://book.mm.co.kr/ 강컴 : http://www.kangcom.com 네이버 책 : http://book.naver.com/ 리브로 : http://www.libro.co.kr/books/index.asp?mall_id=1 알라딘 : http://www.aladdin.co.kr/home/wbookmain.aspx 모닝365 : http://www.morning365.com/ 반디앤루니스 : http://www.bandibook.com/ yes24 : http://www.yes24.com 교보 : http://www.kyobobook.co.kr/ ======================================================================================== 파이썬 관련 싸이트 ======================================================================================== 파이썬 문서고 : http://home.paran.com/johnsonj/ Python : http://www.python.org/ 왕초보를 위한 파이썬 : http://turing.cafe24.com/ ======================================================================================== C 컴파일러 다운로드 ======================================================================================== C++ 다운로드 : http://turboc.borlandforum.com/impboard/attach/0000043200/tc++win31.zip MS Visual C++ Toolkit 2003 : http://msdn.microsoft.com/visualc/vctoolkit2003/ 볼랜드 BC++ 컴파일러 : http://www.borland.com/products/downloads/download_cbuilder.html 아래의 Compiler 라고 써있는 링크를 클릭하면 다운로드 받을 수 있음. Compiler Windows 5.5 08/24/2000 8.7 Mb 무료 C++ 컴파일러 DevC++ : http://turboc.borlandforum.com/impboard/attach/0000071056/devcpp4990setup.exe ======================================================================================== 프로그램 소스 모음 링크 ======================================================================================== 생각하며 배우는 C++ 소스 링크 : http://www.hanbitbook.co.kr/example/1277/ 알기쉽게 풀어쓴 웹로직과 EJB 소스 : http://www.hanbitbook.co.kr/exam/1278 자바5.0 프로그래밍 소스(한빛미디어) : http://hanbitbook.co.kr/example/1377/ 인포북 소스 : http://www.infopub.co.kr/info/pds/group_pds/bbs.asp 정보문화사 소스 : http://www.infopub.co.kr/jungbo/pds/group_pds/bbs.asp 영진 프로그래밍 소스 링크 : tp://board3.youngjin.com/bbs/List_new.asp?bbsidx=135 대림 자료실 : tp://www.drbook.co.kr/pds/?pds=1-1 한빛 자료실 : tp://www.hanbitbook.co.kr/old_board/arumari2.html?id=data&n=&s=&query=&t=&kind=&page=0 한빛 미디어 소스 : http://www.hanbitbook.co.kr/exam/ ======================================================================================== 크랙 링크 ======================================================================================== http://www.astalavista.box.sk/ http://www.crackdb.com/ ======================================================================================== 지도 링크 ======================================================================================== 네이버 지도 : http://local.naver.com/navermap_browser/?mode=1&init=1 엠파스 지도 : http://map.empas.com/ 지도 찾기 : http://www.speednavi.co.kr/searchmap/ 지하철 노선도 : http://www.smrt.co.kr/cyberstation/cyberstation.jsp?sv=1&skind=1&goline=undefined ======================================================================================== 포토샾 ======================================================================================== http://www.photoshopq.com/ ======================================================================================== 기타 ======================================================================================== 폭 맞춰 출력하기 : http://www.visiontech.ltd.uk/ (설명 : 인터넷 익스플로러에서 프린트할 때 내용이 폭에 안 맞아 짤릴때 사용하면 좋음) (방법 : 클릭해서 들어가서 콘트롤 설치한 후 상단 표준단추에 "빨간 W"로 프린트) 테이블은 이제 그만 쉬어야할 때 1 : http://ilmol.com/wp/2005/06/09/25/ 테이블은 이제 그만 쉬어야할 때 2 : http://ilmol.com/wp/2005/08/15/110/ 웹에서 테이블을 DIV로 변경 : http://www.qindex.info/Q_drctry/webtools/StylingTable.asp 레이아웃을 위해 테이블 사용이 잘못된 이유:문제의 원인, 해결방안 : http://softwant.com/standards/index.php ======================================================================================== 컴퓨터 싸게 사기 ======================================================================================== http://www.pops4u.co.kr/ http://www.assacom.com/ ======================================================================================== 컴퓨터 싸게 사기 ======================================================================================== 하드웨어 정보 보여주는 유틸 (everest ) 램 종류와 속도가 궁금해서 찾아봤음 : http://file.naver.com/cgi-bin/simSearchPds.cgi?start=&number=&cat=99&q=everest&w=t&opt=0&x=38&y=13 ======================================================================================== 기타 유용한 정보(?) 잡학지식 ======================================================================================== 휴면 계좌 통합 조회 : http://www.sleepmoney.or.kr/default_cust.jsp 중국사람이 만든 웹 OS ^^ : http://www.pc2n.com/staticos/index.html ======================================================================================== 블로그 ======================================================================================== 네이버 블로그 http://blog.naver.com/free7sh http://blog.naver.com/swinter8 http://blog.naver.com/drods http://blog.naver.com/mmfcom http://blog.naver.com/imcho57 http://blog.naver.com/khd7138 http://blog.naver.com/julymorning4 http://blog.naver.com/geerark 엠파스 블로그 http://blog.empas.com/ahnyounghoe/ 이글루스 블로그 http://kwon37xi.egloos.com/ ======================================================================================= Eclipse Article Eclipse 시작 Eclipse 시작하기 : JDK 설치에서부터 Eclipse 다운로드등 Eclipse를 처음 시작하는 개발자들이 알아야하는 내용에 대하여 다루고 있다. Eclipse에 새로운 플러그인 설치하기 : Eclipse에 새로운 플러그인을 추가하는 방법에 대하여 두가지로 나누어 살펴본다. 또한 새로운 플러그인을 찾을 수 있는 방법에 대해서도 다룬다. Eclipse 사용시 알아두면 좋은 유용한 단축키 모음 Eclipse 강좌 Eclipse 사용을 위한 동영상 강좌 : Eclipse 3.1이 배포되면서 좋은 동영상 강좌들이 많이 올라와 있다. Eclipse의 많은 기능들을 느끼고 사용해 볼 수 있다. Eclipse 에서 Middlegen 사용하기 : 프로잭트를 하다보면 Database의 변경이 있을 수 있다. 만일 이러한 상황에서 Hiberanate같은 framework를 사용할 시에 변경될 때마다 해당 xml mapping파일과 java dto 객체를 생성하는 일은 참으로 번거로운 일이 아닐 수 없으며 이러한 비용을 줄이기 위해 eclipse용 plugin으로 middlegen이 나왔습니다. Eclipse 사용시 유용한 팁 Eclipse 사용시 알아두면 유용한 팁 Eclipse 성능 높히기 Eclipse 기반하에서 Remote Debugging 설정 : Eclipse 기반하에서 Remote Debugging을 실행하는 방법에 대하여 다룬다. Eclipse With PlugIn Eclipse에 Web Tools Project 설치 및 사용방법 : 지금까지 Eclipse에서 불편하게 느꼈던 웹 개발의 편의성을 향상 시켜줄 막강한 플러그인에 관한 설치에서부터 다양한 툴들을 사용방법에 대하여 다룬다. Eclipse에 Tomcat Server플러그인 설치하기 Eclipse에 JRUN Server플러그인 설치하기 Eclipse에 JBoss Server플러그인 설치하기 Eclipse에 Lomboz플러그인 설치하기 1 Eclipse에 Lomboz플러그인 설치하기 2 Eclipse With 버전 관리 시스템 CVS 설치와 Eclipse와의 연동 Eclipse와 CVS과 연결하여 사용하기 [Eclipse와 CVS를 이용하여 팀 작업하기] Subversion 설치 및 Eclipse와의 연동 Visual Source Safe 설치와 Eclipse와의 연동 Children Hide Children | View in hierarchy Eclipse에 Web Tools Project 설치 및 사용방법 (통합 개발 환경) Eclipse 시작하기 (통합 개발 환경) Eclipse에 새로운 플러그인 설치하기 (통합 개발 환경) Eclipse 사용시 알아두면 좋은 유용한 단축키 모음 (통합 개발 환경) Eclipse 사용시 알아두면 유용한 팁 (통합 개발 환경) Eclipse 성능 높히기 (통합 개발 환경) Eclipse에 Tomcat Server플러그인 설치하기 (통합 개발 환경) Eclipse에 JRUN Server플러그인 설치하기 (통합 개발 환경) Eclipse에 JBoss Server플러그인 설치하기 (통합 개발 환경) Eclipse에 Lomboz플러그인 설치하기 1 (통합 개발 환경) Eclipse에 Lomboz플러그인 설치하기 2 (통합 개발 환경) CVS 설치와 Eclipse와의 연동 (통합 개발 환경) Eclipse와 CVS과 연결하여 사용하기 (통합 개발 환경) Subversion 설치 및 Eclipse와의 연동 (통합 개발 환경) Visual Source Safe 설치와 Eclipse와의 연동 (통합 개발 환경) Eclipse 에서 Middlegen 사용하기 (통합 개발 환경) Eclipse 기반하에서 Remote Debugging 설정 (통합 개발 환경) java.net과 이클립스를 이용한 오픈소스 자바 어플리케이션 개발 이 튜토리얼은 이클립스를 소개하고 이를 활용하여 java.net에 호스팅 된 자바 어플리케이션 개발에 대해 살펴봅니다. 1부. 이클립스에서 새로운 프로젝트 생성하기 2부. 이클립스와 CVS를 이용한 팀 개발 ======================================================================================= 자바를 닷넷으로 바꿔주는 프로젝트 (MS) : http://msdn.microsoft.com/vstudio/downloads/tools/jlca/default.aspx 닷넷을 자바로 바꿔주는 프로젝트(라이브러리, 넷빈즈 플러그인) : https://net2java.dev.java.net/ HTML, JavaScript, ASP 등 : http://www.dragoneye.co.kr/ 웹 기획 문서 링크 : http://www.ihelpers.co.kr/webdevdoc/index.php 기획 찜 : http://plan.jjim.com/ ======================================================================================= 사이버유 강의실 Ⅰ. 인터넷기초 & 홈페이지 인터넷과 전자상거래 홈페이지만들기(HTML) Ⅱ. 시스템&프로그램 설치 퍼스널 웹서버(PWS) 설치 액세스로 데이터베이스 만들기 MS-SQL 서버설치 및 운영 리눅스에서 MAP 설치 오디비씨(ODBC) 설정 Ⅲ. 자바(Java) 프로그래밍 자바 프로그래밍 자바이야기 [※ 음성강의] 자바 웹프로그래밍(JSP) [※ 음성강의] 웹 정보추출 에이전트 Ⅳ. 데이터베이스(DB) 구조적 질의어 (SQL) Oracle DBMS & SQL (Link) MySQL for Linux Ⅴ. C언어 프로그래밍 C 언어 프로그래밍 (권수태,황인수) Unix & C Language CGI 프로그램의 개념과 폼 태그 CGI 기초와 CGI 예제 Ⅵ. 액티브서버페이지(ASP) 프로그래밍 ASP(Active Server Pages) 기초 | ASP란? | ASP 문법 | ASP 객체 | 웹과 디비연동 프로그래밍 파일 업로드(Upload) (기초, 예제) ASP와 비주얼 베이직 함수 예제로 배우는 ASP 프로그래밍 | 사용자인증 | 방명록 | 게시판 | Ⅶ. 강의자료(PPT) 경영정보시스템 [ MIS의 이해 ] 의사결정지원시스템 시스템분석 및 설계 데이터베이스 자바 프로그래밍 컴퓨터기초및언어 emwac 설치 : http://empire.achor.net/v7/lesson/win2000/ Oracle Database 10g: The Top 20 Features for DBAs : http://www.oracle.com/technology/pub/articles/10gdba/week5_10gdba.html 손병목의 지식공유 : http://www.itmembers.net/ apmsetup (아파치 PHP MySQL 한방에 설치) : http://www.apmsetup.com/ ======================================================================================== 번역 ======================================================================================== 구글 번역 : http://www.google.co.kr/language_tools?hl=ko 알타비스타 번역 : http://babel.altavista.com/translate.dyn icanread 영어 번역 : http://www.icanread.co.kr/ektran/ektran.html 짧은 문장 번역 : http://standard.beta.amikai.com/amitext/indexUTF8.jsp 영어 문장 번역 : http://ns.cnenews.net/ek-web/cgi-bin/sentTrans-ek 영어/일본어 단문 번역 : http://gtlac.keric.or.kr/cm_menu/home/translate/english.jsp 한중일 번역 : http://www.infoseek.co.jp/Honyaku?pg=honyaku_top.html ======================================================================================== 유용한 링크 ======================================================================================== nullsoft 인스톨 프로그램(무료) : http://nsis.sourceforge.net/Main_Page JBoss IDE tutorial : http://docs.jboss.com/jbosside/tutorial/build/en/html/index.html 자바지기 위키 WIKI : http://wiki.javajigi.net/homepage.action =========================================================================== JBuilder 2005 Foundation - 완전무료 자바 개발툴 =========================================================================== 완전히 무료로 쓸 수 있는 자바 개발툴, JBuilder 2005 Foundation입니다. 심지어 등록조차 필요가 없습니다. J빌더의 가장 기본적인 기능만 있지만, 그래도 같은 무료 배포인 이클립스보다는 강력하다고 하네요. 윈도우용 설치프로그램/문서/예제 http://file.borlandforum.com/jbuilder/JBuilder2005Foundation/jb2005_fnd_windows.zip http://file.borlandforum.com/jbuilder/JBuilder2005Foundation/jb2005_fnd_docs_windows.zip http://file.borlandforum.com/jbuilder/JBuilder2005Foundation/jb2005_fnd_samples_windows.zip 리눅스용 설치프로그램/문서/예제 http://file.borlandforum.com/jbuilder/JBuilder2005Foundation/jb2005_fnd_linux.tar.gz http://file.borlandforum.com/jbuilder/JBuilder2005Foundation/jb2005_fnd_docs_linux.tar.gz http://file.borlandforum.com/jbuilder/JBuilder2005Foundation/jb2005_fnd_samples_linux.tar.gz 솔라리스용 설치프로그램/문서/예제 http://file.borlandforum.com/jbuilder/JBuilder2005Foundation/jb2005_fnd_solaris.zip http://file.borlandforum.com/jbuilder/JBuilder2005Foundation/jb2005_fnd_docs_solaris.zip http://file.borlandforum.com/jbuilder/JBuilder2005Foundation/jb2005_fnd_samples_solaris.zip 맥용 설치프로그램/문서/예제 http://file.borlandforum.com/jbuilder/JBuilder2005Foundation/jb2005_fnd_mac.zip http://file.borlandforum.com/jbuilder/JBuilder2005Foundation/jb2005_fnd_docs_mac.zip http://file.borlandforum.com/jbuilder/JBuilder2005Foundation/jb2005_fnd_samples_mac.zip Extras - Ant 1.6.2 http://file.borlandforum.com/jbuilder/JBuilder2005Foundation/jb2005_fnd_extras.zip eclipse WTP J2EE Tutorials Building a CMP Based School Schedule Web Application This tutorial is similar to the Building a School Schedule Web Application except EJBs are used. This tutorial walks the user through developing a Container Managed Entity Bean (CMP) to store a simple schedule. A Session Bean is used to query the CMP. Finally, a Servlet and JSP are built to serve as the front end. Building and Running a Web Application This document is the first in a series of tutorials where we will demonstrate how you can use the rich set of tools and APIs that comes with the Web Tools Platform Project. This first tutorial will give you a step by step tour of using some the tools for web development. For this purpose we will build and run a J2EE web application using WTP tools and Apache Tomcat. Building a School Schedule Web Application In this tutorial you will create a school schedule Web application. This application will allow students to input their courses and create a schedule. This tutorial will introduce you to JSP's, servlets and the Web Tools Platform project's server tools. Building a Simple EJB Application In this tutorial you will create a simple EJB component and a client web application. This tutorial will introduce you to Session beans and the Web Tools Platform project's support for XDoclet and server tools. Cactus Integration in the Web Tools Project This article briefly explains Cactus, its common uses and advantages and then provides a step-by-step tutorial on how to use the Cactus integration provided by WTP. The article assumes that you are familiar with JUnit and the basics of using WTP to build, deploy and run web projects. Deploy Web Applications to the Oracle Application Server This tutorial will step you through the details of deploying a Web Application to the Oracle Application Server Containers for J2EE (OC4J). SDN JCreater Tutorial : http://developers.sun.com/prodtech/javatools/jscreator/learning/tutorials/index_ko.jsp
반응형

자바에서 각 이벤트는 하나의 이벤트 타입에 속하게 됩니다.

사용자가 JButton 컴포넌트를 클릭할 때 발생하는 actionPerformed 이벤트는 ActionEvent라고 하는 이벤트 타입에

속합니다. 여기에서 이벤트 타입은 EventObject 클래스에서 파생되는 클래스로 정의됩니다.

그리고 각 이벤트 타입에 속하는 모든 이벤트는 리스너 인터페이스의 멤버가 됩니다.

예를 들어 ActionEvent 이벤트 타입에 속하는 actionPerformed 이벤트는 ActionListener라고 하는 리스너

인터페이스의 멤버가 되는 것이지요.

 

결국 하나의 이벤트 타입에 대하여 하나의 리스터 인터페이스가 있는 셈입니다.

 

Interface

Class

ActionListener

ActionEvent

AdjustmentListener

AdjustmentEvent

AWTEventListener

AWTEvenetListenerProxy

ComponentListener

ComponentAdapter

ContainerListener

ComponentEvent

FocusListener

ContainerAdapter

HierachyBoundsListener

ContainerEvent

HierachyListener

FocusAdapter

InputMethodListener

FocusEvent

ItemListener

HierachyBoundsAdapter

KeyListener

HierachyEvent

MouseListener

InputEvent

MouseMotionListener

InputMethodEvent

MouseWheelListener

InvocationEvent

TextListener

ItemEvent

WindowFocusListener

KeyAdapter

WindowListener

KeyEvent

WindowStateListener

MouseAdapter

 

MouseEvent

 

MouseMotionAdapter

 

MouseWheelEvent

 

PaintEvent

 

TextEvent

 

WindowAdapter

 

WindowEvent

 

 

하나의 리스너 인터페이스에 여러 메소드 즉, 여러 이벤트가 포함될 수 있습니다.

예를 들어 창과 관련된 이벤트에서는 windowActivated, windowClosed, windowClosing, windowDeactivated,

windowDeiconified windowIconified, windowOpened 등이 있으며, 이들 이벤트는 모두 windowListener라고 하는

리스너 인터페이스의 멤버가 됩니다.

 

이러한 리스너 인터페이스를 구현하는 클래스를 어댑터(Adapter)라고 하며, 어댑터의 인스턴스를 리스너라고 합니다.

그리고 리스너 인터페이스를 구현하고 있는 리스너를 이벤트 소스에 등록시켜야 합니다.

이벤트 소스란 이벤트를 발생시키는 객체입니다.

public class MyPanel extends Jpanel implements ActionListener{

public void actionPerformed(ActionEvent e){

JoptionPane.showMessageDialog(

this,

getSource().ToString() + “ 를 클릭했습니다.”,

“actionPerformed 이벤트”,

JoptionPane.OK_OPTION);

}

public MyPanel(){

jButton = new Jbutton(“클릭하세요.”);

jButton.addActionListener(this);

}

}

 

public class MyPanel extends Panel{

ActionAdapter actionAdapter = new ActionAdapter();

public MyPanel(){

jButton = new Jbutton(“클릭하세요.”);

jButton.addActionListener(actionAdapter);

}

}

 

class WindowClosing extends WindowAdapter{

    public void windowClosing(WindowEvent e){

        System.exit(0);

    }

}

 

class MyFrame extends JFrame{

    public MyFrame(){

        WindowClosing listener = new WindowClosing();

        addWindowListener(listener);

    }

}

 

class MyFrame extends JFrame{

    public MyFrame(){

        addWindowListener(new WindowAdapter(){

            public void windowClosing(WindowEvent e){

                System.exit(0);

            }

        });

    }

}

 

* “예전에 누가 Adapter를 사용하면 리스너에 있는 method()를 모두 구현하지 않아도

되며 필요한 method()구현하면 된다고 했었는데, 사실은 Adapter 클래스를

상속받아서 새로운 리스너를 구현하는 것입니.”

반응형

Method Categories and Interface

 

Category

Interface Name

Methods

Action

ActionListener

actionPerformed(ActionEvent)

Item

ItemListener

itemStateChanged(ItemEvent)

Mouse

MouseListener

mousePressed(MouseEvent)

mouseReleased(MouseEvent)

mouseEnterd(MouseEvent)

mouseExited(MouseEvent)

mouseClicked(MouseEvent)

Mouse Motion

MouseMotionListener

mouseDragged(MouseEvent)

mouseMoved(MouseEvent)

Key

KeyListener

keyPressed(KeyEvent)

keyReleased(KeyEvent)

keyTyped(KeyEvent)

Focus

FocusListener

focusGained(FocusEvent)

focusLost(FocusEvent)

Adjustment

AdjustmentListener

adjustmentValueChanged(AdjusmentEvent)

Component

ComponenetListener

componentMoved(ComponentEvent)

componentHidden(ComponentEvent)

componentResized(ComponentEvent)

componentShown(ComponentEvent)

Window

WindowListener

windowClosing(WindowEvent)

windowOpened(WindowEvent)

windowIconified(WindowEvent)

windowDeiconified(WindowEvent)

windowClosed(WindowEvent)

windowActivated(WindowEvent)

windowDeactivated(WindowEvent)

Container

ContainerListener

componentAdded(ContainerEvent)

componentRemoved(ContainerEvent)

Text

TextListener

textValueChanged(TextEvent)

 

 

 

 

 

AWT Components

 

Component Type

Description

Button

A named rectangular box used for receiving mouse clicks

Canvas

A panel used for drawing

Checkbox

A component allowing the user to select an item

ChekboxMenuItem

A checkbox within a menu

Choice

A pull-down static list of items

Component

The parent of all AWT components, except menu components

Container

The parent of all AWT containers

Dialog

The base class of all modal dialog boxes

Frame

The base class of all GUI windows with window manager controls

Label

A text string component

List

A component that containers a dynamic set of items

Menu

An element under the menu bar, which containers a set of menu items

MenuItem

An item within a menu

Panel

A basic container class used most often to create complex layouts

Scrollbar

A component that allows a user to “select from a range of values”

ScrollPane

A container class that implements automatic horizontal and vertical

Scrolling for a single child component

TextArea

A component that allows the user to enter a block of text

TextField

A component that allows the user to enter a single line of text

Window

The base class of all GUI windows, without window manager controls

  

Component Events

 

Component Type

Act

Adj

Cmp

Cnt

Foc

Itm

Key

Mou

MM

Text

Win

Button

V

 

V

 

V

 

V

V

V

 

 

Canvas

 

 

V

 

V

 

V

V

V

 

 

Checkbox

 

 

V

 

V

V

V

V

V

 

 

CheckboxMenuItem

 

 

 

 

 

V

 

 

 

 

 

Choice

 

 

V

 

V

V

V

V

V

 

 

Component

 

 

V

 

V

 

V

V

V

 

 

Container

 

 

V

V

V

 

V

V

V

 

 

Dialog

 

 

V

V

V

 

V

V

V

 

V

Frame

 

 

V

V

V

 

V

V

V

 

V

Label

 

 

V

 

V

 

V

V

V

 

 

List

V

 

V

 

V

V

V

V

V

 

 

MenuItem

V

 

 

 

 

 

 

 

 

 

 

Panel

 

 

V

V

V

 

V

V

V

 

 

Scrollbar

 

V

V

 

V

 

V

V

V

 

 

ScrollPane

 

 

V

V

V

 

V

V

V

 

 

TextArea

 

 

V

 

V

 

V

V

V

V

 

TextField

V

 

V

 

V

 

V

V

V

V

 

Window

 

 

V

V

V

 

V

V

V

 

V

 

Act – ActionListener

Adj – AdjustmentListener

Cmp – ComponentListener

Cnt – ContainerListener

Foc – FocusListener

Itm – ItemListener

Key – KeyListener

Mou – MouseListener

MM – MouseMotionListener

Text – TextListener

Win – WindowListener

 

반응형
 
태평한 잔치에서 군신이 함께 즐기니 그 모습이 아름답고 좋기가 그지없는 형국입니다
본래 업은 없으나 횡재를 만나 성공할 운세이니 귀인의 도움보다는 나의 노력이 클 것입니다
심신이 다 함께 편하니 집안에 활기가 넘치고 가족 간에 화목이 있으니 어찌 일이 이루어지지 않겠습니까
만일 자식을 낳지 많으면 일신이 영귀해질 것이니 길성이 가까이 하기 때문입니다
자식을 보면 분명 공명의 아들이니 후에 큰 일을 하게 될 것이며 가족이나 친지 중에 새 식구가 들어도 대통의 징조로 삼을 수 있습니다
동서 양방향에서 귀인이 와서 도와주니 근심이 있으면 남과 상의하여 도움을 구하시기 바랍니다
ㅈ과 ㅎ성씨가 해로우니 가까이하는 것을 피하시고 재물에 관한 거래를 하지 않도록 하시기 바랍니다
봉황이 붉은 조서를 머금은 괘를 얻었으니 태을귀인이 임하여 길성을 크게 하고 운수를 대통하게 합니다
십리길 길가에서 관인이 말을 버리니 어려운 사연을 한 번은 겪으시겠군요
마음에 상처가 되는 일은 고민을 길게 하지 마십시오
길고 긴 강물에 돛을 올리니 순풍이 불어오고 바람에 배를 맡기듯 순�! �� 순응하면 얻음이 큰 해임을 명심하여야 할 것입니다
횡재도 노력하지 않으면 얻어질 수 없는 법이니 노력하여 얻은 것을 어찌 횡재라 하겠습니까? 타인이 보기에 질투할 정도의 재물을 얻을 것이니 큰 기쁨이 있을 것입니다
뜻하지 않은 곳에서 예상 밖의 재물이 들어오는 형태이기 때문에 다른 사람이 보기에는 괜한 횡재처럼 보이지만 실상은 자신의 노력의 결과임을 알아야 합니다
다만, 뜻밖에 들어오는 재물이 사연을 품고 있는 재물이 될 수 있으니 얻고도 마음이 편하지 않을 돈은 받지 않는 것이 좋겠습니다
재운이 크게 되어 재물을 구분하여 받아도 끊이지 않을 것이니 정상적이지 않은 돈보다는 복 돈을 받는 것이 좋습니다
재물이 들어오기 시작하면 끊이지 않을 것이니 우선은 자신의 주머니를 먼저 채우는 것이 중요합니다
돈을 쓰는 것은 나중으로 미루어도 문제가 없을 것이니 먼저 예상하여 지출을 하면 후 일에는 얻을 것이 없습니다
들어오게 될 재물에 신경 쓰는 것보다는 이미 들어온 재물을 관리하시는 것이 중요함을 잊지 마시기 바랍니다
작은 노력으로도 큰 것을 취하게 되는 운이 있는 때가 있습니다
올해가 바로 그러한 운세에 진입하였으니 일이 가장 잘 풀려나가는 대통의 운세입니다

우연히 주운 돌도 보석의 가치가 있는 시기이니 앉아서 한가롭게 시간을 보내는 일마저도 시간낭비가 되는 셈입니다
외부에서 활동하는 사람은 어느 누구를 만나도 자신을 도와주는 역할을 하게 될 것입니다
시간을 아껴서 최대한 활동영역을 넓히고 대인관계를 확장해야 되는 시기입니다
서비스 업종이나 장사를 하시는 분은 처음 맞이하는 손님을 잘 상대하시기 바랍니다
한 사람의 소중한 인연이 끊이지 않는 인연을 만들어내는 기운이 있으니 한 사람이 열이 되어 돌아오고 점점 더 많은 사람들과의 인연으로 돌아오는 큰 기쁨을 맛보게 될 것입니다
영업을 하시는 분은 성과를 크게 이룰 것이니 큰 계약이 성사되어 회사에서 위치가 크게 올라갑니다
사업을 하시는 분은 한 번의 어려움만 극복하면 귀성이 들어 미래를 준비하는 토대를 마련할 것이니 앞으로 거칠 일이 없을 것입니다
만나는 사람마다 도움을 주고자 하니 덕을 쌓고 마음의 욕심을 버린다면 �! 遲습� 더욱 많아지고 만사가 형통하게 될 대길의 운수입니다
좋은 운을 이끄는 하늘의 기운이 크게 들어오는 시기이고 아주 좋은 귀인을 맞이하는 때이니 인연이 좋지 않을 리가 없습니다
다만 대길의 인연과 크게 흉한 기운의 인연이 같이 들어오니 그것을 구분하는 지혜로움이 필요할 것입니다
하지만 나에게 큰 도움을 주는 귀인은 나에게 바라는 것이 없습니다
그러므로 나에게 무언가를 바라는 인연이라면 좋지 않은 인연으로 봐도 될 것이며 그 연결의 고리도 길지 않을 것입니다
그러나 막역하게 다가서는 인연이라면 길운을 포함한 사람이니 후 일 나에게 큰 도움을 주게 될 것입니다
업무적으로 만나는 사람은 모두 인연이 좋으니 개인적인 만남에서 나에게 바라는 자가 있으면 이를 경계하시기 바랍니다
애정은 각별한 시기이니 반드시 사랑을 하게 될 것입니다
인연이 필요한 사람은 너무도 좋은 시기이지만 그렇지 않은 경우는 좋은 운이 허비되지 않도록 선을 그을 필요가 있습니다
바라면 얻을 수 있는 운수이니 활용을 잘 하셔서 좋은 인연을 많이 만드시기 바랍니다
반응형
IBM 소프트웨어 엔지니어 (마음은 게이머)인 Scott Clee가 테트리스 게임 모델을 재사용 가능한 자바 빈 컴포넌트로 포장하는 간단한 방법을 소개한다. 일단 게임의 구성 요소들이 자바 객체들로 나누어지면 완전한 게임 모델 빈을 형성하도록 재조립될 수 있고, 실제로 어떤 테트리스 GUI에도 결합될 수 있다. forum에서 이 글에 대한 여러분의 생각을 저자와 다른 독자들과 공유하기 바란다.

-참조 : http://www.ibm.com/developerworks/kr/library/j-tetris/

테트리스 게임의 구성 요소들을 자바 객체로 나누어 재사용 가능한 자바 게임 컴포넌트로 만드는 방법

한 친구가 자신은 새로운 프로그래밍 언어를 배울 때마다 그 언어를 사용해 테트리스 게임을 작성하는데 도전한다고 말한 적이 있다. 이러한 전통하에, 내가 처음 자바 언어를 사용한 프로그래밍 법을 배웠을 때 나도 같은 시도를 해 보기로 했다. 나의 첫번째 시도는 하나의 완전한 게임이긴 했지만 매우 간단하고 흉한 것이었다. 시간이 가고 내가 자바 설계와 개발에 더 많은 경험을 얻음에 따라 나는 GUI에서 게임 모델을 분리시켜 (Swing 컴포넌트와 유사하게) 테트리스 빈을 만들 수 있다는 사실을 알았다. 그래서 나는 그것을 해 보기 시작했다.

이 글에서 나는 테트리스 빈을 구축하고 구현하는 방법을 안내하겠다.

테트리스는 자바 객체로 표현될 수 있는 몇 개의 구성 요소를 가지고 있다.:

  • The Tetris pieces 테트리스 조각
  • 조각을 가지고 있는 테트리스 판
  • 판 위의 조각 제어, 점수 관리 등을 하는 게임

이 요소들 각각을 좀 더 자세히 살펴보자.

  • 각 요소는 정확히 네 개의 블록으로 구성되어 있다.
  • 조각 내의 각 블럭은 테트리스 판 내에 (x.y) 좌표를 가지고 있다.
  • 각 조각은 0, 2, 4의 회전율을 가지고 있다.
  • 각 조각은 L, J, S, O, I, Z, 혹은 T 모양을 지닐 수 있다.


그림 1. 각 테트리스 조각에 네 요소가 필요함 : 블록, (x,y) 좌표, 회전율 및 모양
Four elements of each Tetris piece
테트리스 빈으로 무엇을 할 수 있을까?

다음은 테트리스 빈을 만든 후 내가 수행한 몇 가지 일들이다.
  • 빈의 두 인스턴스를 연결시켜 대결 게임을 만들다.
  • Netris라는 이름을 가진, 최초의 Psion Netpad용 테트리스 게임을 만들다
  • 빈을 애플릿에 통합시켜 브라우저와 호환되는 테트리스 게임을 만들다.

첫번째 두 아이템은 매우 간단한 시스템을 사용해 구현될 수 있다. 각 조각에 대해 중앙 블록을 선택하고 이 블록의 (x,y) 좌표를 저장하면, 조각 내의 나머지 블록들을 이 블록을 중심으로 한 상대 좌표로 저장할 수 있다. 이 방식은 중앙 조각에 대한 상대 블록으로 모양을 저장함으로써 조각의 어떤 형태도 기술할 수 있게 해준다. 중앙 지점은 java.awt.Point로 저장될 수 있고 상대 좌표는 java.awt.Point 배열에 저장될 수 있다. 좌표 계산을 쉽게 하기 위해, 중앙 조각을 (0,0) 상대 좌표를 가진 블록으로 저장할 수 있다.

이 시스템은 또한 조각의 회전을 계산할 때 더 쉽다. 간단한 행렬 조작을 사용하여 단순히 y좌표를 x 좌표로 바꾸고 x 좌표는 y 좌표의 마이너스 값으로 바꾸면 조각을 시계방향으로 90도 회전시킬 수 있다. 우리는 중앙 지점을 중심으로 상대 좌표를 사용하고 있기 때문에, 여기에서도 마찬가지로 할 수 있다:



temp = x;
x = -y;
y = temp;

여러분은 또한 시계방향 회전을 3번 적용하면 조각을 시계 반대 방향으로 90도 회전시킬 수 있다. (믿지 못하겠다면 한 번 해보기 바란다.)

마지막으로, 모든 조각이 동일한 회전율을 가지는 것은 아니므로, 이 문제를 보충하기 위해 회전 기법을 체크해 보아야 할 것이다.

우리는 모든 유형의 조각을 표시하는데 동일한 TetrisPiece 클래스를 사용하기 때문에 이들을 구분할 방법이 필요하다. 이를 위해 우리는 몇 개의 정적인 int 생성자를 사용하여 다른 유형들을 표시하고 지역 변수가 조각의 유형을 저장하도록 한다. 다음은 이 생성자들 중 하나의 예이다:



public static final int L_PIECE = 0;

조각을 테트리스 판 위에서 이동시킬 것이므로 이를 위한 이동 메소드를 제공해야 한다. 몇 가지 이동 (이미 가능한 한 제일 오른쪽 끝에 와 있는데 다시 오른쪽으로 가려는 시도)은 불법적일 수 있다. 따라서 우리는 모든 이동 요청을 확인할 필요가 있다. 우리는 참조를 저장할 테트리스 판에서 이것을 구현할 것이다. 따라서 우리 클래스의 생성자는 여기에서 두 가지 매개 변수를 가질 것이다: 첫번째는 만들어진 조각의 유형이고, 두번째는 테트리스판에 대한 참조이다. 생성자에서 우리는 initalizeBlocks()이라는 private 유틸리티 메소드를 호출할 것인데, 이 메소드는 조각의 상대 좌표값을 각각의 조각 유형에 설정할 것이다.

이동이 합법적인지를 체크하는 간단한 방법은 판에서 조각을 떼내어 원하는 방향으로 이동시킨 후 맞는지 보는 것이다. 맞으면 조각을 보드의 새 위치에 둔다. 그렇지 않으면 이동을 취소하고 원래 있던 자리에 다시 둔다. 반환되는 값은 그 결과에 따라 true (이동이 맞으면)나 false(이동이 맞지 않으면)가 될 것이다.

좀 더 주의를 기울여야 할 이동의 한 유형은 조각이 떨어지는 경우이다. 떨어진다는 것은 조각이 판의 제일 아래쪽으로 바로 내려간다는 의미이다. 이를 위해 우리는 더 이상 움직일 수 없을 때가지 조각을 아래로 계속 이동시키는 while 루프가 필요하다. 그러면 조각은 그 위치에 배치될 것이다.

조각에 적용될 수 있는 다양한 이동들을 구별하기 위해 우리는 다음 예제에 나타난 것과 같이 몇 가지 추가적인 static int 생성자를 사용할 것이다.:



public static final int LEFT = 10;

조각이 맞는지 보기 위해 나중에 willFit() 메소드가 TetrisBoard 클래스에서 구현된 것이다.

마지막으로 TetrisPiece 클래스를 포장하기 위해 우리는 중앙 지점과 상대 좌표와 같은 몇 가지 변수에 대한 getters와 setters, 그리고 무작위 유형의 TetrisPiece 인스턴스를 반환할 getRandomPiece()라는 정적인 메소드를 가진다.

TetrisPiece 클래스를 포함한 완성된 소스를 참고 자료에서 다운로드받을 수 있다.

테트리스 판은 빈 블록과 색깔 있는 블록을 가지고 있는 2D 격자판으로 생각할 수 있다. 다양한 유형의 테트리스 조각들이 int 생성자에 의해 구별되기 때문에, 우리가 해야 할 일은 빈 블록의 값을 정의하는 것 뿐이고 우리는 판을 2D int 배열로 저장할 수 있다. 이 방식을 사용하면 판 내의 빈 블록은 다음에 의해 표시될 것이다.:



public static final int EMPTY_BLOCK = -1;

유연성을 유지하기 위해 판의 크기를 가변적으로 하겠지만 이것을 생성자 내에 정의할 것이다. 따라서 생성자는 열과 행의 수를 나타내는 두 ints를 받아들일 것이다. 그리고 나서 2D 배열 내의 모든 값을 기본적으로 빈 블록으로 만드는 resetBoard() 메소드를 호출할 것이다.

조각들이 판에 추가되고 제거되기 때문에 우리는 addPiece()removePiece()메소드를 제공한다. addPiece() 메소드는 TetrisPiece()를 취하고 판에서 이 메소드가 차지하는 모든 위치의 값을 자신의 유형으로 설정함으로써 작동한다. removePiece() 메소드는 판의 값이 빈 블록의 값으로 설정된다는 점을 제외하면 비슷하다.

판에 변화가 있을 때 사용자가 알 수 있도록 하기 위해, 조각이 추가되거나 이동되었을 때 BoardEvent가 구동될 것이다. 이 이벤트를 듣는 클래스들에 대해 우리는 BoardListener 인터페이스가 필요한데, 이벤트가 구동되었을 때 이 인터페이스의 boardChange()메소드가 호출된다. 이 이벤트들은 화면 수정이 필요할 때 통지되도록 테트리스 판 GUI에 의해 사용될 수 있다. listener를 저장하기 위해 우리는 java.util.Vector를 사용할 것이고, listener를 추가/삭제하고 이벤트를 구동시키기 위한 관련 메소드를 제공할 것이다.

때때로 여러분이 조각을 추가하고 삭제할 때 BoardEvents를 구동시키는 것이 부적절할 수 있다. 조각이 떨어져야 할 때 (이 이동은 조각을 떨어뜨리기 위해 while 루프를 사용한다는 것을 기억하라)를 예로 들 수 있다. 이 경우 조각이 바닥에 부딪쳤을 때만 이벤트가 필요하다. 이를 용이하게 하기 위해 우리는 boolean 매개변수를 취하도록 addPiece() 메소드를 만들어 값이 true일 경우에만 이벤트가 구동되도록 할 것이다.

테트리스 게임의 중요 요소 중 하나는 한 행이 완료되면 그 행은 사라지고 그 위의 모든 행들이 내려온다는 것이다. 이를 위해 우리는 삭제될 행의 지수를 매개변수로 취하는 removeRow() 메소드를 제공할 것이다. 행이 없어진 후에 BoardEvent가 구동될 것이다.

private 변수들에 접근하기 위해 필요한 getter와 setter들 외에도, 우리는 하나의 메소드가 더 필요하다. 앞에서 설명한 willFit()가 그것이다. 이 메소드는 TetrisPiece를 매개변수로 취해 그 조각이 판에 맞는지 결정하기 위한 boolean 값을 돌려준다. 맞는다는 것은 그 조각이 판의 경계 안에 있고 판에서 그 조각이 맞춰질 곳에 있는 블록의 값이 비어 있다고 설정되어 있음을 의미한다. 이런 경우 true 값이 반환된다.

이제 TetrisBoard 클래스가 완성되었다.이 클래스를 포함한 완성된 소스를 참고 자료에서 다운로드받을 수 있다.

100 피트 벽을 가진 테트리스?

어느날 나는 이 빈을 타워 블록의 점등 시스템에 연결시키고 빌딩의 측면을 따라 내려가면서 테트리스 게임을 하고 싶어졌다. 나는 누군가가 이렇게 했다는 것을 신문에서 읽은 후 내내 이것을 하고 싶어해 왔다.

이제 테트리스 게임에서 사용되는 두 개의 주 컴포넌트를 만들었으므로, 이들을 모아 게임 로직을 만들면 된다.

게임의 흐름을 제어하기 위한 좋은 방법은 이것을 java.lang.Thread를 확장하는 내부 클래스에 내장시키는 것이다. 이 방식의 한 가지 장점은 게임 속도를 제어하기 위해 스레드 sleep 호출을 추가할 수 있다는 것이다. 또 다른 장점은 현재 주 애플리케이션 스레드가 자유롭기 때문에 하나의 GUI가 첨부될 때 색칠 문제가 없어진다는 것이다. 이 문제는 주 스레드가 계속 묶여 있어 색칠할 시간이 없을 때 때때로 발생할 수 있다.

스레드 내의 로직은 run() 메소드 내의 while 루프 속에 구현될 것이다. 루프는 계속해서 조각을 만들어 내고 조각을 더 이상 맞출 수 없을 때까지 이들을 게임판으로 떨어뜨릴 것이다. 이 때 fPlaying이라는 지역 boolean 변수가 false로 설정되어 루프를 끝내고 GameEvent를 구동시켜 게임이 종료되었음을 표시할 것이다.

while 루프 내에 fPaused의 boolean 값을 체크하는 if 절이 있다. 이 값이 true로 설정되었을 경우 루프는 계속 실행되겠지만 모든 게임 로직이 무시되어 종료되는 느낌을 줄 것이다. Boolean이 false로 다시 바뀌면 게임이 계속될 것이다.

우리는 한 번에 하나씩 떨어지는 조각에만 관심을 가지고 있으므로, 여기에 대한 참조를 저장할 fCurrPiece라는 변수를 만들 것이다. 이 변수가 null 값으로 설정되면 이전의 조각이 더 이상 아래로 내려갈 수 없으며 판의 최종 위치에 도착했음을 의미한다. 이 때 우리는 새 조각을 만들어 판의 맨 위 중앙에 둔다. fCurrPiece 변수가 null값이 아닌 모든 경우에 우리가 해야 할 일은 그 것을 한 위치로 떨어뜨리고 주어진 시간 동안 스레드를 휴면 상태로 만드는 것이다.

한 조각이 더 이상 움직일 수 없게 되었을 때 우리는 행이 완성되었는지 보아야 한다. 이를 위한 손쉬운 방법은 한 쌍의 중첩 for 루프를 사용하는 것이다. 이 for 루프의 바깥 쪽 루프는 행의 지수를 따라 작업하며, 안쪽의 루프는 지수 전체에 걸쳐 확인 작업을 수행한다. 만일 우리가 완성된 행을 발견하면, TetrisBoard 클래스에 구현된 removeRow() 메소드를 호출하며 완성된 행의 지수를 전달할 수 있다. 이제 제거된 행 위의 모든 행들이 하나씩 내려올 것이기 때문에 우리는 이들을 다시 체크해야 할 것이다. 여러 행을 한번에 완성하도록 장려하기 위해 우리는 완성된 행의 개수를 저장하고 각각 더 높은 점수를 줄 것이다.

테트리스 게임의 또 다른 주요 요소는 더 많은 행이 완성될수록 조각이 더 빨리 내려온다는 것이다. 이 기능은 지금까지 완성된 행의 개수를 체크하고 이에 따라 스레드의 휴면 주기를 점차 감소시켜가는 방식으로 구현될 수 있다.

GameThread 내부 클래스를 만들기 위해 필요한 것은 이것이 전부지만, 구현해야 할 또 다른 내부 클래스가 있다. 다수의 이벤트가 구동될 것이고 이들은 listerners가 저장되도록 요구할 것이므로, 이들을 모두 한 장소에 두는 것이 좋을 것이다. 우리는 EventHandler 내부 클래스를 사용하여 이를 수행할 것이다.

EnvetnHandler 내부 클래스
이 클래스는 우리가 구동하는 이벤트에 관심이 있는 listener들에 대한 참조를 저장할 것이다. listener들에 대한 addremove 메소드를 제공할 뿐 아니라 이벤트들을 구동하기 위한 유틸리티 메소드도 있을 것이다.

이 클래스는 다음 유형의 이벤트들을 다룬다. :

  • GameEvent : 게임이 시작되거나 멈출 때마다 구동된다. 게임 START 혹은 END를 표시하기 위한 값을 가지고 있다.

  • BoardEvent : 게임판에 변경 사항이 있을 때 구동된다. EventHandler 클래스에서 추가/삭제 listener 호출이 TetrisBoard 클래스로 전달된다.

  • ScoreEvent: 점수가 바뀔 때 구동된다.

구동될 수 있는 많은 다른 유형의 이벤트들이 있지만, 간편성을 위해 나는 위에서 설명한 이벤트들만 사용하였다. 우리가 구현할 수 있는 다른 이벤트에는 LineEvent가 있는데, 한 행, 혹은 여러 행이 완성되었을 때 구동되고 화면 애니메이션을 일으키는데 사용될 수 있다.

TetrisGame 마무리하기

이제 내부 클래스들을 완성하였으므로 TetrisGame 클래스의 나머지 부분을 설명해야 한다. 모든 자바 빈과 마찬가지로 우리는 매개 변수 없는 생성자가 필요하다. 이 생성자에서 우리는 EventHandler 클래스와 TetrisBoard 클래스의 인스턴스를 만들 것이다. TetrisBoard 클래스 10x20이라는 기본 사이즈를 가질 것이다.

게임 상태를 제어하기 위해 우리는 개시, 중지, 일시 중지 메소드를 사용할 것이다. startGame() 메소드는 모든 게임 변수를 리셋하고 ScoreEvent (이제 0으로 리셋됨)와 GameEvent (START라는 매개 변수 유형을 가짐)를 구동시킬 것이다. 또한 GameThread를 생성하여 개시할 것이다. stopGame() 메소드는 fPlaying 변수를 false로 바꾸어 GameThread가 끝나도록 하고 END라는 매개변수 유형으로 GameEvent를 구동시킨다. setPause() 메소드는 한 게임을 일시 중지시키는 역할만 한다.

필요한 모든 getters와 setters와 별도로, 구현할 메소드가 하나 더 있는데, move() 메소드가 그것이다. 이 메소드는 이동 방향을 매개변수로 취하는데, 이것은 TetrisPiece 클래스에서 나오는 생성자이다. move() 메소드는 게임이 진행중이며 일시 중지 상태가 아니라고 가정하고 이동하려고 시도한다. 그 이동이 아래로 떨어지는 요청인데 성공하지 못한다면 fCurrPiece가 null 값으로 설정되고 조각은 게임판 내의 현재 위치에 남아 있을 것이다. 그러면 GameThread는 새로운 조각을 생성한다.

TetrisGame에 대해서는 이게 전부이다. 이 클래스를 포함한 완성된 소스를 참고 자료에서 다운로드 받을 수 있다.

이제 완벽함을 위해 우리는 BeanInfo 클래스를 만들고 이 클래스들을 적절한 파일들로 채울 수 있지만, 여기에서는 그럴 필요가 없다. 우리가 필요한 것은 우리의 빈을 테스트할 간단한 GUI이고 참고 자료에 하나가 제공되고 있다. 이것은 테트리스 게임판을 그리기 위해 한 개의 내부 클래스를 사용하고 키 조작을 조정하기 위한 몇 가지 로직을 포함하고 있는 간단한 클래스이다. GUI는 javax.swing.JFrame에 표시되며, 선택적으로 java.applet.Applet이 될 수도 있다.

우리의 테트리스 빈을 테스트하기 위해 소스 파일을 푸는데, 디렉토리 구조를 그대로 두기 바란다. (왜냐하면 내가 빈 클래스들이 TetrisBean 디렉토리에 있도록 이들을 TetrisBean 패키지에 두었기 때문에 때문이다.) 여러분이 소스 파일을 푼 경로를 자바 클래스 경로에 추가하고 파일을 컴파일한다. 이제 여러분이 해야 할 일은 "java Scottris"를 실행시키는 것 뿐이다.

나는 이러한 테트리스 빈을 구현할 수 있는 많은 방법이 있다는 것을 알고 있다. 내가 이 글에서 소개한 것은 아주 간단한 방법이며, 이것이 여러분의 창조력에 불을 붙일 수 있기를 바란다. 나는 여러분이 이것을 자유롭게 개선시키기 바란다.




위로


참고자료




위로


필자소개

Photo of Scott Clee

Scott Clee는 현재 IBM의 CICS 제품에 대한 FV Tester로 일하고 있다. 4년간 자바 프로그래머로 일했으며 자바와 관련된 재미있는 프로젝트를 취미 삼아 수행하는 것을 즐긴다.





위로
반응형

저자 JZ Ventures사의 사장 겸 대표 컨설턴트인 John Zukowski

이 아티클의 영문 원본은
http://java.sun.com/mailers/techtips/corejava/2007/tt0907.html#2
에서 볼 수 있습니다.

이 팁은 Java SE 6을 사용하여 작성되었습니다. 이번 및 향후 테크팁을 사용하기 위해 Java Platform, Standard Edition 6 Development Kit(JDK 6)을 Java SE 다운로드 페이지에서 다운로드할 수 있습니다.

선호 설정(Preferences) API는 표준 플랫폼 1.4버전에 도입된 직후 2003년 7월 15일자 영문기사  선호 설정API에서 맨 처음 다뤄진 바 있다.

이 기사에서는 사용자별 선호 설정을 가져오고 설정하는 방법에 대해 설명했다. 선호 설정 API는 사용자별 설정을 가져오고 설정하는 것에 국한되지 않는다. 시스템 선호 설정, 선호 설정 가져오기 및 내보내기, 선호 설정과 연결된 이벤트 알림도 있다. 선호 설정을 저장하기 위한 사용자 정의 위치를 제공하는 방법도 있다. 언급한 처음 세 옵션에 대해 여기서 설명한다. 사용자 정의 기본 선호 팩토리 만들기는 이후의 팁에서 다루기로 한다.

시스템 선호 설정

선호 설정 API는 서로 다른 두 가지 선호 설정 집합을 제공한다. 첫 번째 집합은 개별 사용자용으로서, 동일한 시스템의 여러 사용자가 서로 다른 설정을 정의할 수 있게 한다. 이를 사용자 선호 설정이라고 한다. 동일한 시스템을 공유하는 각 사용자는 자신의 고유한 값 집합을 선호 설정의 그룹과 연결할 수 있다. 사용자 비밀번호, 시작 디렉토리 등이 그 예이다. 한 시스템의 모든 사용자가 동일한 비밀번호와 홈 디렉토리를 갖는 것은 바람직하지 않다. 독자들도 그렇게 생각하리라 기대한다.

또 다른 선호 설정 형태는 시스템 유형이다. 한 시스템의 모든 사용자가 동일한 시스템 선호 설정 집합을 공유한다. 예를 들어, 설치된 프린터의 위치는 일반적으로 시스템 선호 설정이다. 굳이 사용자별로 다른 프린터 집합을 설치할 필요는 없다. 동일한 시스템을 사용하는 사람이라면 그 시스템을 기준으로 구별되는 모든 프린터를 알고 있을 것이다.

시스템 선호 설정의 또 다른 예로 게임 고득점이 있다. 전체 고득점은 오로지 하나만 존재해야 한다. 여기서 시스템 선호 설정이 사용될 수 있다. 이전 팁에서 userNodeForPackge() 및 그에 이어 userRoot()가 사용자 기본 설정 노드를 가져오는 데 어떻게 사용되는지 확인했다면, 다음 예제에서는 systemNodeForPackage() 또는 루트용 systemRoot()를 사용하여 시스템 기본 선호 트리 중 알맞은 부분을 가져오는 방법을 보여 준다. 알맞은 기본 선호 노드를 가져오는 메소드 호출과 달리 API 사용법은 동일하다.

이번 예제는 간단한 게임이므로 여기서는 게임 용어를 엄격하지 않게 사용하기로 한다. 이 게임에서는 0 ~ 99 범위에서 임의의 수를 선택한다. 그 수가 이전에 저장된 값보다 높으면 "high score"를 업데이트한다. 또한 이 예제에서는 현재의 고득점을 보여 준다. 선호 설정 API 사용법은 간단한 편이다. 여기서는 getSavedHighScore()를 사용하여 저장된 값을 가져오고, 아직 저장된 고득점이 없으면 기본값인 -1을 제공하며, updateHighScore(int value)를 사용하여 새로운 고득점을 저장한다. HIGH_SCORE 키는 새로운 선호 설정 API 액세스에서 공유하는 상수이다.

private static int getSavedHighScore() {
    Preferences systemNode = Preferences.systemNodeForPackage(High.class);
    return systemNode.getInt(HIGH_SCORE, -1);
  }

  private static void updateHighScore(int value) {
    Preferences systemNode = Preferences.systemNodeForPackage(High.class);
    systemNode.putInt(HIGH_SCORE, value);
 }



전체 프로그램은 다음과 같이 된다.

import java.util.*;
import java.util.prefs.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class High {
  static JLabel highScore = new JLabel();
  static JLabel score = new JLabel();
  static Random random = new Random(new Date().getTime());
  private static final String HIGH_SCORE = "High.highScore";

  public static void main (String args[]) {
    /* -- Uncomment these lines to clear saved score
    Preferences systemNode = Preferences.systemNodeForPackage(High.class);
    systemNode.remove(HIGH_SCORE);
    */

    EventQueue.invokeLater(
      new Runnable() {
        public void run() {
          JFrame frame = new JFrame("High Score");
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          updateHighScoreLabel(getSavedHighScore());
          frame.add(highScore, BorderLayout.NORTH);
          frame.add(score, BorderLayout.CENTER);
          JButton button = new JButton("Play");
          ActionListener listener = new ActionListener() {
            public void actionPerformed(ActionEvent e) {
              int next = random.nextInt(100);
              score.setText(Integer.toString(next));
              int old = getSavedHighScore();
              if (next > old) {
                Toolkit.getDefaultToolkit().beep();
                updateHighScore(next);
                updateHighScoreLabel(next);
              }
            }
          };
          button.addActionListener(listener);
          frame.add(button, BorderLayout.SOUTH);
          frame.setSize(200, 200);
          frame.setVisible(true);
        }
      }
    );
  }

  private static void updateHighScoreLabel(int value) {
    if (value == -1) {
      highScore.setText("");
    } else {
      highScore.setText(Integer.toString(value));
    }
  }

  private static int getSavedHighScore() {
    Preferences systemNode = Preferences.systemNodeForPackage(High.class);
    return systemNode.getInt(HIGH_SCORE, -1);
  }

  private static void updateHighScore(int value) {
    Preferences systemNode = Preferences.systemNodeForPackage(High.class);
    systemNode.putInt(HIGH_SCORE, value);
 }
}


그리고 몇 번의 실행 후 화면은 다음과 같이 된다. 61점이 그다지 높은 점수가 아니더라도 고득점이 될 가능성은 있다.

High Score 61













서로 다른 사용자로 애플리케이션을 실행해 보고 모두 동일한 고득점이 적용되는지 확인할 수 있다.
가져오기 및 내보내기

어떤 사용자나 시스템에서 다른 사용자 또는 다른 시스템으로 선호 설정을 전송하려는 경우, 해당 사용자/시스템에서 선호 설정을 내보낸 다음 다른 사용자/시스템으로 이를 가져올 수 있다. 선호 설정을 내보내기할 때 XML 형식의 문서로 내보내며, 독자들이 굳이 알 필요는 없지만 이 문서의 DTD는 http://java.sun.com/dtd/preferences.dtd에서 지정한다. exportSubtree() 메소드를 사용하여 하위 트리 전체를 내보내거나 exportNode() 메소드를 사용하여 단일 노드만 내보낼 수 있다. 두 메소드 모두 OutputStream 인수를 받아 저장 위치를 지정한다. XML 문서는 UTF-8 문자 인코딩 방식이다. 그런 다음 importPreferences() 메소드를 통해 데이터 가져오기가 이루어지는데, 이 메소드는 InputStream 인수를 받는다. API 측면에서 보면 시스템 노드/트리 가져오기와 사용자 노드 가져오기 사이에는 아무런 차이가 없다.

이전 예제에 몇 줄의 코드를 추가하면 새로 업데이트된 고득점을 high.xml 파일로 내보낸다. 추가된 코드 중에는 파일을 저장하고 예외를 처리하는 새로운 스레드를 시작하는 작업이 상당 부분을 차지한다. 단일 노드를 내보내는 부분은 단 세 줄이다.

    Thread runner = new Thread(new Runnable() {
      public void run() {
        try {
          FileOutputStream fis = new FileOutputStream("high.xml");
          systemNode.exportNode(fis);
          fis.close();
        } catch (Exception e) {
          Toolkit.getDefaultToolkit().beep();
          Toolkit.getDefaultToolkit().beep();
          Toolkit.getDefaultToolkit().beep();
        }
      }
    });
    runner.start();


내보내기할 때 파일은 다음과 같이 된다.

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE preferences SYSTEM "http://java.sun.com/dtd/preferences.dtd">
<preferences EXTERNAL_XML_VERSION="1.0">
  <root type="system">
    <map/>
    <node name="<unnamed>">
      <map>
        <entry key="High.highScore" value="95"/>
      </map>
    </node>
  </root>
</preferences>

루트 요소에 "system"이라고 말하는 유형 속성이 있다. 이는 그것이 노드의 유형임을 나타낸다. 또한 노드에는 "<unnamed>"라는 값의 이름 속성이 있다. High 클래스는 패키지에 포함되어 있지 않으므로 명명되지 않은 시스템 노드 영역에서 작업해야 한다. 이 항목 속성은 현재의 고득점 값(여기서는 95)을 제공하는데, 실제 값은 다를 수 있다.

이 예제에서는 import 코드를 포함시키지 않겠지만, 가져오기를 수행하려면 선호 설정에 대한 정적 메소드를 호출하고 알맞은 입력 스트림을 전달하면 된다.

FileInputStream fis = new FileInputStream("high.xml");
  Preferences.importPreferences(fis);
  fis.close();



XML 파일은 선호 설정이 시스템 또는 사용자 유형인지 여부에 대한 정보를 포함하므로 가져오기 호출에서 이 정보를 명시적으로 포함할 필요는 없다. 발생 가능한 일반적인 IOExceptions 외에도 가져오기 호출은 파일 형식이 잘못된 경우 InvalidPreferencesFormatException을 throw한다. 또한 내보낼 데이터를 백업 저장소로부터 올바르게 읽을 수 없다면 BackingStoreException을 throw하기도 한다.

이벤트 알림

원래 버전의 High 게임은 고득점 선호 설정을 업데이트한 다음 화면의 레이블을 업데이트하도록 명시적으로 호출한다. 이 작업을 수행하는 더 좋은 방법은 선호 설정 노드에 수신기를 추가하는 것인데, 그러면 값이 변경될 때 레이블의 값 업데이트가 자동으로 트리거될 수 있다. 따라서 고득점이 여러 위치로부터 업데이트되더라도 업데이트된 값을 저장한 다음 레이블을 업데이트하는 코드를 추가할 필요가 없다.

다음 두 줄은

 updateHighScore(next);
  updateHighScoreLabel(next);

알맞은 수신기를 추가하여 한 줄로 만들 수 있다.

updateHighScore(next);

그러한 작업에 꼭 알맞은 PreferenceChangeListener 및 그와 연결된 PreferenceChangeEvent가 있다. 수신기는 연결된 노드의 모든 변경 사항을 알게 되므로, 다음과 같이 어떤 키-값 쌍이 수정되었는지 확인해야 한다.

  PreferenceChangeListener changeListener =
        new PreferenceChangeListener() {

      public void preferenceChange(PreferenceChangeEvent e) {
        if (HIGH_SCORE.equals(e.getKey())) {
          String newValue = e.getNewValue();
          int value = Integer.valueOf(newValue);
          updateHighScoreLabel(value);
        }
      }
    };
    systemNode.addPreferenceChangeListener(changeListener);

PreferenceChangeEvent에는 세 가지 중요한 등록 정보가 있다. key, new value 그리고 node 자체이다. 그러나 new value가 선호 설정의 모든 편의 메소드를 포함하지는 않는다. 예를 들어, 값을 int로 검색할 수 없다. 그 대신 값을 수동으로 변환해야 한다. 수정된 High 클래스는 다음과 같이 된다.


import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import java.util.prefs.*;
import javax.swing.*;

public class High {
  static JLabel highScore = new JLabel();
  static JLabel score = new JLabel();
  static Random random = new Random(new Date().getTime());
  private static final String HIGH_SCORE = "High.highScore";
  static Preferences systemNode =
  Preferences.systemNodeForPackage(High.class);

  public static void main (String args[]) {
    /* -- Uncomment these lines to clear saved score
    systemNode.remove(HIGH_SCORE);
    */

    PreferenceChangeListener changeListener =
        new PreferenceChangeListener() {

      public void preferenceChange(PreferenceChangeEvent e) {
        if (HIGH_SCORE.equals(e.getKey())) {
          String newValue = e.getNewValue();
          int value = Integer.valueOf(newValue);
          updateHighScoreLabel(value);
        }
      }
    };
    systemNode.addPreferenceChangeListener(changeListener);

    EventQueue.invokeLater(
      new Runnable() {
        public void run() {
          JFrame frame = new JFrame("High Score");
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          updateHighScoreLabel(getSavedHighScore());
          frame.add(highScore, BorderLayout.NORTH);
          frame.add(score, BorderLayout.CENTER);
          JButton button = new JButton("Play");
          ActionListener listener = new ActionListener() {
            public void actionPerformed(ActionEvent e) {
              int next = random.nextInt(100);
              score.setText(Integer.toString(next));
              int old = getSavedHighScore();
              if (next > old) {
                Toolkit.getDefaultToolkit().beep();
                updateHighScore(next);
              }
            }
          };
          button.addActionListener(listener);
          frame.add(button, BorderLayout.SOUTH);
          frame.setSize(200, 200);
          frame.setVisible(true);
        }
      }
    );
  }

  private static void updateHighScoreLabel(int value) {
    if (value == -1) {
      highScore.setText("");
    } else {
      highScore.setText(Integer.toString(value));
    }
  }

  private static int getSavedHighScore() {
    return systemNode.getInt(HIGH_SCORE, -1);
  }

  private static void updateHighScore(int value) {
    systemNode.putInt(HIGH_SCORE, value);
    // Save XML in separate thread
    Thread runner = new Thread(new Runnable() {
      public void run() {
        try {
          FileOutputStream fis = new FileOutputStream("high.xml");
          systemNode.exportNode(fis);
          fis.close();
        } catch (Exception e) {
          Toolkit.getDefaultToolkit().beep();
          Toolkit.getDefaultToolkit().beep();
          Toolkit.getDefaultToolkit().beep();
        }
      }
    });
    runner.start();
  }
}



PreferenceChangeListener/Event 클래스 쌍 외에도 선호 설정 변경을 알리기 위한 NodeChangeListenerNodeChangeEvent 콤보가 있다. 그러나 이는 특정 노드의 값을 변경하는 것이 아니라 알림 노드를 추가하고 제거하는 용도이다. 물론 선호 설정 뷰어와 같은 것을 작성하려면 노드가 나타나는지 여부 및 그 시점을 알 필요가 있으므로 이 클래스도 관심사가 될 수 있다.

전체 선호 설정 API는 애플리케이션의 수명이 끝나더라도 데이터베이스 시스템에 의존할 필요 없이 데이터를 저장하는 매우 편리한 방법이 될 수 있다. API에 대한 자세한 내용은 Sir, What is Your Preference? 영문기사를 참조한다.

+ Recent posts