이미지와 시멘틱 :: Photosynth

Photosynth(Photo+Synthesis)는 마이크로소프트 라이브 랩에서 새롭게 선보인 사진합성 기술입니다.
웹사이트에서 구구절절 소개하고 있는데, 글만 보고는 알듯모를듯 하죠.
Photosynth의 개념은 간단합니다.
“온라인상의 수많은 사진을 합성해서 3D로 보여주고 이미지와 이미지의 관계를 다이나믹하게 탐색할 수 있도록 하는 것”
말 그대로 '사진으로 다이브' 하는걸 현실세계에 구현 해 내고 있습니다...
웹상에서 이미지와 이미지가 어떻게 의미를 가지고 연결 될 수 있는지를 극명하게 보여주는 기술인거 같습니다.

2007/06/05 18:47 2007/06/05 18:47
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

올드보이 주제음악(The Last Walts) 국악기 버전

며칠전 올렸던 미션임파서블을 연주 했던 '닮은 사람들' 또다른 국악기 연주인
올드보이 주제음악입니다. 지난번 연주보다 훨씬 근사하게 들리네요.


                              연주 : 닮은 사람들
2007/06/05 17:47 2007/06/05 17:47
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

히로스에 료코 - Hirosue Ryoko - Majiでkoiする5秒前

이랬던 히로스에 료코양이 결혼한지 벌써 3년 반이나 흐르다니..
- '이 노래 흥얼 거리던것도 대학교 다닐때 였구나.. '참 세월 빠르다.. 그치?


히로스에 료코



오카자와 다카히로 와 히로스에 료코
오카자와 다카히로와 히로스에 료코
2007/06/04 10:37 2007/06/04 10:37
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다
  1. Blog Icon
    174보호사

드디어, 온라인 피싱( online phishing) 메일을 받다!!

출근해서 gmail에 접속했더니 National Credit Union Administration 이라고 (사칭하는 걸로 보이는) 사람으로부터

Official information for all Federal Credit Union 이란 제목으로
아래와 같은 메일을 보내왔다.

Dear Credit Union holder account,
 
This notice informs you that your Credit Union bank has joined our Federal Credit Union(FCU) network. For both, our and your security, we are asking you to activate an online account on our database. After activation you can login on our system with your SSN and your Credit/Debit PIN number.
 
You must visit the FCU activation page and fill in the form to activate your online account:
 
https://www.ncua.gov/activate_account ( 원 링크는 삭제!! )
 
In accordance with NCUA User Agreement, you can use your online account in 24 hours after activation. We thank you for your prompt attention to this matter. Please understand that this is a security measure intended to help protect you and your account.
 
 
National Credit Union Administration Team apologize for any inconvenience.



이렇게 허술하게 온다....



드디어 내게도 온라인 피싱 메일이 날아온것이다.
용하게 gmail의 스팸메일분류를 통과하여 오다니..
그런데.. 아니, 이렇게 허술한 메일에 속아서 링크를 클릭하는 사람도 있단 말인가?
영어를 썩 잘한다고 할 수 없는 내가봐도 뻔히 보이는 이런 허술한 메일로 사람들을
낚으려 들다니... 참 세상 너무 날로 드시려는거 아닌지...
2007/06/04 09:04 2007/06/04 09:04
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

DB연동이 필요없는 나만의 공짜 온라인 갤러리를 가져보자!

웹상에 사진이나 이미지를 전시하기위해서는 호스팅서비스를 이용하여
계정과 DataBase공간을 할당 받아 잘 알려진 제로보드라든지 여타 게시판 혹은
갤러리기능을 수행할 수 있는 웹어플리케이션을 자신의 계정에 세팅한 후 사용 하는것이 일반적인
절차입니다.

때문에 자신의 계정을 가지고 있지 않은 많은 사람들은 포탈에서 제공하는 게시판,블로그, 혹은
사진전문 사이트 등을 활용하여 자신의 사진을 게시하고 있습니다.

오늘날의 갤러리류의 프로그램들은 DataBase에 설정사항이라든지 게시물에대한 정보를
기록 해 두기 때문에  DataBase없이는 작동을 하지 않습니다.

이 자리에서는 조금 독특한 갤러리 프로그램을 소개 하고자 합니다.
프로그램 이름은 iFoto 입니다.
우선, 아래 링크를 클릭 해 여기서 소개하고자 하는 iFoto 갤러리에대한 감을 잡아보실까요.

http://cucme.1111mb.com/gallery/ 2007.6.28. 현재 접속 불능.
http://kinnerup.com/rasmus/ifoto/

어떠세요? 뭔가 부족해 보이지만 심플함이 느껴지시죠?
화려한 기능으로 무장한 갤러리가 필요없다거나 계정을 구하고 프로그램을 세팅하여
DB와 연동 하는것 까지는 불필요하다고 생각하는 사람들에게 좋은 솔루션일 듯 합니다.

개발자 홈페이지 : http://ifoto.ireans.com/
프로그램 다운로드 : http://sourceforge.net/project/showfiles.php?group_id=160256
프로그램 구동환경 : PHP, GD2

이 프로그램을 이용하여 자신만의 갤러리를 가지기위해서 취해야 하는 행동 단계는 다음과 같습니다.
1. 갤러리 프로그램을 DownLoad 한다. ( 위의 프로그램 다운로드 경로 참조 )

2. 무료 계정을 구한다. ( 아래쪽에 설명이 이어질 것이다. )

3. 무료 계정에  FTP로 접속한다.

4. 1 에서 다운로드 받은 갤러리 프로그램을 압축을 풀어 무료계정에 업로드 한다.

5. 무료 계정에 이미지혹은 사진을 업로드 할 폴더를 만든다.

6. FTP로 사진을 업로드 한다.

7. 갤러리를 브라우저로 접속하여 업로드한 사진을 감상한다.
  ( 덧붙여 주위사람에게 자신의 갤러리를 알린다. ^.~ )

어떤가요? 전혀 복잡하지 않죠?

이제 위 순서 대로 차근차근 하나씩 진행 해 나만의 초간단 갤러리를 소유 해 보시죠.

1. 갤러리 프로그램을  DownLoad한다.
사용자 삽입 이미지

iFoto-1.0.1.zip 파일을 다운로드 한다.

사용자 삽입 이미지



2. 무료계정을 구한다.
  --> 이 부분은 이전 포스팅 '해외 무료(계정) 호스팅 소개' 편을 참조하면 된다.

3. 무료계정에 FTP로 접속한다.
자주 사용하시는 FTP클라이언트 ( 알FTP, filezilla, CuteFTP등 )를 이용하셔서
생성한 계정에 접속 합니다.
ftp 주소 : 신청한ID.1111mb.com
ftp 포트 : 21
아이디 : 신청한ID
패스워드 : 신청시 기입한 패스워드

사용자 삽입 이미지



4. 1에서 다운받은 갤러리프로그램을 압축을 풀어 계정에 업로드한다.

사용자 삽입 이미지

iFoto1.0.1.zip 파일 : gallery 하위 디렉토리에 iFoto 관련 파일들이 들어있다.

사용자 삽입 이미지

계정의 /gallery 에 올렸다.

파일들을 다 올리고 처음 접속하면 아래와 같이 /gallery/include/thumbnail.php 파일에서 문제가 생길 수도 있다.
어쩐일인지 파일이 업로드 되는 도중에 파일내용이 변경되어버린 경우가 대부분일것이다.
이런경우에는 계정에 올라간 thumbnail.php파일을 삭제한 후 다시 올려 올려 보도록 하자.
파일전송을 아스키타입이아닌 바이너리타입으로 세팅하여 업로드 하면 이런 문제는 생기지 않는다.
사용자 삽입 이미지

모든 파일이 정상적으로 업로드 되었다면 아래와같은 페이지가 보일 것이다.
이제 남은 일은 사진들을 올리는 일이 남았다.
사용자 삽입 이미지


5. 무료 계정에 이미지혹은 사진을 업로드 할 폴더를 만든다.

우선 ftp프로그램을 이용하여 계정에 접속 한 후 /gallery/gallery 폴더로 이동 해 보면 위 화면에서 보인 My Shot 과 My Pet 디렉토리가 보일 것이다. 어차피 예제 사진이고 각자가 올릴 사진도 아니니까 두 디렉토리는 지워 준다.
사용자 삽입 이미지

두 디렉토리를 선택해서 삭제!!
사용자 삽입 이미지

그런다음 업로드 할 디렉토리를 생성 해 준다. 이 디렉토리는 갤러리 좌측 메뉴에 그대로 나타나게 되며 디렉토리안에 디렉토리를 생성 해도 된다.
사용자 삽입 이미지

적당히 디렉토리를 만들고..
사용자 삽입 이미지

디렉토리 속성, 혹은 chmod조작으로 755를 만들어 준다.
사용자 삽입 이미지

사용자 삽입 이미지



6. FTP로 사진을 업로드 한다.

갤러리에 전시할 사진을 선택하여 위에서 만들어준 디렉토리에 업로드 한다.
사용자 삽입 이미지

사용자 삽입 이미지


7. 갤러리를 브라우저로 접속하여 업로드한 사진을 감상한다.


업로드가 끝나고 처음 접근하면 아래와 같이 각 사진의 썸네일을 만드는 중이라는 표시가 나타나고,
사용자 삽입 이미지

잠시 후 페이지를 다시열면 아래와같이 이미지들이 보인다.
사용자 삽입 이미지


자, 이로써 간단하게 작동하는 갤러리를 가지게 되었습니다.
이 프로그램을 이용했을경우 장점을 굳이 따지자면 브라우저로 일일이 파일을 업로드 하고 파일에 대한 정보를 기술하지 않아도 됩니다.
그냥 FTP클라이언트를 이용해 서버에 디렉토리를 만들고 이미지를 업로드하면 갤러리 프로그램이 알아서 메뉴와 이미지를 배치합니다.
그 다음으로, 백업과 계정의 이전이 편합니다. 별다른 설정이 없기 때문에 다른 계정으로 옮기고 싶을경우 위 프로그램을 업로드한
디렉토리와 파일을 새로운 계정에 그대로 업로드 하기만 하면 됩니다.
단점을 꼽자면, 한글 파일명이나 한글로 디렉토리를 만들면 글자가 깨져보입니다.( 댓글에는 한글도 잘 보입니다만.. )

몇가지 추가정보..


2007/06/04 02:36 2007/06/04 02:36
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

레아 디존 (Leah Dizon) - 戀しよう

필리핀/프랑스 혼혈로 미국에서 레이싱걸과 모델을 겸업하다 지금은
일본으로 건너가 가수로 데뷔한 레아디존의 戀しよう입니다.




15금 모습도 있는 레아디존 사진과 프로필..

2007/06/03 22:27 2007/06/03 22:27
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

구글 스트리트뷰( google street view )의 사생활 침해 가능성

저녁 뉴스시간에 구글의 새로운 서비스인 구글 스트리트뷰(google strret view)가
사생활을 침해 할 수 있다는 보도를 접했습니다.

언뜻 보니 담장을 넘는 사람이 찍혀있거나 스트립클럽을 다녀오는 일반인의 모습이
그대로 담겨 있더군요..

관련기사를 찾아보니
Top 15 Google Street View Sightings 이란 타이틀로
http://mashable.com  Stan Schroeder 이란분이 올린 글이더군요.

기술의 발전으로 누릴 수 있는 혜택이 커짐과 동시에 이런저런 문제 역시 발생하기
마련입니다. 

찾는 사람은 순전히 악의없는 재미로 찾겠지만 당하는사람 입장에선 썩 유쾌하지만은
않을 듯 합니다.

구글뿐만아니라 수많은 개발사와 소프트웨어 엔지니어들이 이미지검색 기법을
고안하고 구현해 나가고 있는데 어느정도 기술적 성과가 나타나면 해결 될 수 있을까요?

아래는 원문의 일부입니다.

15. The Woz

Street named after Steve Wozniak. OK, it’s not such a big deal, but this is number 15, we’re just getting warmed up here, OK?

Woz

Link

14. The laws are there to be broken

Well, at least he’s not speeding by much.

Speeding

Link

13. The Void

And to your left, you can see the endless void that consumes all life. Please stick to the right side of the street.

Void

Link

12. Your face called…

…it wants its left side back.

Half Face

Link

11. He sees things we cannot see

The cameras that Google is using for this aren’t really working all that well.

Crazy Eyes

Link

10. Giant Pumpkin

It’s a giant pumpkin. Right there in the field. Turn the image 180 degrees for a weird pink smoky…thing, too.

Pumpkin

Link

09. The guy with no head.

This guy shouldn’t complain, at least it’s hard to identify him.

Headless

Link

08. Semi-naked babe

We could open our web browser and find zillions of pictures of hot babes within seconds. In better quality. And more naked. But, there’s something about finding a blurry pic of a semi-naked babe drawn on a truck on Google Maps that makes our heart race.

Semi naked babe

Link

07. The Internet sucks

“The Internet sucks, come here for your erotic needs”, they say. Well, is Tera Patrick being all naked and naughty in there? Is she? Didn’t think so.

Internet sucks

Link.

06. Cornelius and his dog

There’s a sad background story to this one. Read it here.

Cornelius

Link

05. Girls sunbathing

A couple of girls sunbathing on a lawn isn’t exactly spectacular, but it’s better than the blurry picture of the semi-naked babe on a truck.

Sunbathing babes

Link

04. Guy getting into the adult book store.

Hey, it could have been worse. He could have been going out of a strip club, or something.

Adult Book Store

Link

03. Guy getting out of strip club

We’re gonna have to be honest here: the guy looks like he’s merely paying for parking. But, that’s a strip club behind him, and we will, of course, assume he just spent some sexy time with Mimi and Peaches. Is that a happy grin on his face? Sure it is.

Strip club

Link

02. Crime in progress

Maybe the guy just forgot his keys. Or he’s practicing for the free climbing contest. Hey, is that a lockpicking set dangling out of his pocket?

Breaking in

Link

01. ET

Some might say it’s a lens flare. Some might argue it’s a camera malfunction. It’s the sunlight reflecting off the…lamp post…and a lens flare….and a camera malfunction, skeptics will yell!

But deep in your heart you all know it’s ET. Phooooone. Hooooome.

ET

Link

2007/06/03 21:28 2007/06/03 21:28
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

미션임파서블 주제음악 국악기버전

악기 배치가 절묘합니다.
원곡보단 긴박감이 조금 떨어지는것 같지만 그건 국악기와 서양악기의
차이때문일수도 있다고 생각됩니다.


연주 - 닮은 사람들
2007/06/03 20:57 2007/06/03 20:57
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

Eugeny Kozhevnikov

웹서핑 중에 Eugeny Kozhevnikov란 작가의 사진 몇 컷을 보게 되었는데..
그 이미지가 너무 강렬해서 두고두고 보고 싶어서 이렇게 살짝 데려옵니다.

Eugeny Kozhevnikov
Eugeny Kozhevnikov
Eugeny Kozhevnikov
Eugeny Kozhevnikov
Eugeny Kozhevnikov
Eugeny Kozhevnikov
Eugeny Kozhevnikov
Eugeny Kozhevnikov
Eugeny Kozhevnikov

by Eugeny Kozhevnikov

2007/06/01 16:58 2007/06/01 16:58
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

Gallery2 의 아키텍처 다이어그램

서비의 Photo Gallery 에 사용하고 있으며
http://gallery.menalto.com 에서 open source로 개발을 진행하는
사진/앨범관리 웹 프로그램인 Gallery2의 전체 Archtiecture Diagram이
있을 게시해 본다.


gallery2 architecture diagram
이미지 출처 : http://gallery.menalto.com
2007/05/31 11:47 2007/05/31 11:47
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

현재 서비의 다락방의 블로그 발견지수는?

블로그 전문 검색 서비스인 나루(naaroo)에서 블로그 자신의 발견지수를 알려준다는
소식을 접하고 냉큼 찾아 가 봤다.

  http://www.naaroo.com/play/find <-- 요기서 확인~

자신의 블로그 주소를 입력하면 얼마나 많은 포스팅이 검색에 노출되는지로 알려주는
서비스인줄 알았는데 막상 가 보니 설문에 체크하여 결과를 보는 심심풀이용이 아닌가..
그래도 찾아간게 아까워서 재미삼아 체크!!

그 결과는~

70



왠만큼 눈에 띄는 당신의 블로그!
그러나 여기서 멈출 순 없습니다.
당신의 블로그에게 부족한 2%를 채우기 위해
무엇을 또 할 수 있을까요?
RSS 기능을 좀 더 적극적으로 활용해보세요.
메타블로그에서 목소리를 좀 내 보는 건 어떨까요?

2007/05/31 11:14 2007/05/31 11:14
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

JDOM과 XML 파싱

2007/05/30 10:29

서비 JAVA , ,

Java에서의 XML 가공을 간소화 해주는 JDOM

대부분의 개발자는 과거 XML 데이타 구조를 가공하기 위해 수많은 Java 라이브러리 중 하나를 이용해본 적이 있을 것이다. 그렇다면 JDOM(Java Document Object Model)은 무엇이며 개발자는 왜 JDOM을 필요로 할까?

JDOM은 Java에 최적화된 XML 데이타 가공을 위한 개방 소스 라이브러리이다. JDOM은 W3C(World Wide Web Consortium) DOM과 유사하기는 하지만, DOM을 기반으로 설계되거나 DOM을 모델링하지 않은 대안적인 문서 객체 모델이다. 가장 큰 차이점은 DOM은 언어 중립적으로 설계되었고 초기에 HTML 페이지의 JavaScript 가공에 주로 이용되었던 반면, JDOM은 Java 전용으로 설계됐기 때문에 메소드 오버로딩(method overloading), 컬렉션(collections), 리플렉션(reflection) 및 친숙한 프로그래밍 환경 등 Java의 기본 기능들을 활용한다는 데 있다. Java 프로그래머에게는 JDOM이 보다 자연스럽고 ‘알맞게’ 느껴질 것이다. 이는 언어 중립적인 CORBA(Common Object Request Broker Architecture)에 비해 Java에 최적화된 RMI(Remote Method Invocation) 라이브러리가 보다 더 자연스럽게 느껴지는 것과 유사하다고 할 수 있다.

JDOM은 jdom.org에서 구할 수 있으며, 개방 소스로 Apache 스타일(상용 친화적) 라이선스로 제공된다. JDOM은 공동 협력을 통해 설계 및 개발됐으며, 메일링 리스트에 등록된 가입자만도 3,000여 명에 이른다. 또한 이 라이브러리는 Sun의 JCP(Java Community Process)에 Java Specification Request(JSR-102)로 채택됐으며, 곧 공식 Java 사양으로 채택될 것으로 전망된다.

이 글에서는 JDOM의 기술적 측면에 대해 다룰 것이다. 먼저, 주요 클래스에 대한 정보를 소개하고, 이어 Java 프로그램에서 JDOM을 이용하는 방법에 대해 설명할 것이다.

ORACLE XML TOOLS

이 XDK (XML Developer Kit)는 오라클이 개발자를 위해 제공하는 무료 XML 툴 라이브러리입니다. 이 라이브러리에서는 JDOM과 함께 이용할 수 있는 XML 파서와 XSLT 변환 엔진이 제공됩니다. 이들 툴에 대한 자세한 정보는 Oracle XML 홈페이지인 oracle.com/xml에서 제공됩니다.

파서를 다운로드받으려면 "XDK for Java"로 명명된 XML Developer Kit를 찾은 뒤 좌측의 "소프트웨어" 항목을 클릭해 다운로드를 시작합니다. 다운로드 받은 파일을 열면 xalparserv2.jar 파일에 파서가 들어있습니다.

JDOM 및 기타 소프트웨어가 기본값으로 오라클 파서를 이용하도록 구성하려면 oracle.xml.jax.JXSAXParserFactory에 JAXP javax.xml.parsers.SAXParserFactory 시스템 속성을 설정해야 합니다. 이는 JAXP에 오라클 파서를 이용하겠다고 밝히는 것입니다. 가장 쉬운 방법은 다음의 명령줄을 이용하는 것입니다.

java -Djavax.xml.parsers.SAXParserFactory=
oracle.xml.jaxp.JXSAXParserFactory

혹은 아래와 같이 프로그래밍 방식을 이용할 수도 있습니다.

System.setProperty("jaxax.xml.parsers
.SAXParserFactory",
"oracle.xml.jaxp.JXSAXParserFactory");

오라클은 XDK외에도 Oracle9i Database Release 2에 고유 XML 리포지토리를 제공하고 있습니다. Oracle9i XML Database (XDB)는 고성능을 지닌 고유 XML 스토리지 및 검색 기술입니다. XDB는 W3C XML 데이타 모델을 Oracle9i Database로 완벽하게 수용하며 XML의 네비게이션 및 질의를 위한 새로운 표준 액세스 방법을 제공합니다. XDB를 이용할 경우 관계형 데이타베이스 기술의 모든 이점과 함께 XML 기술의 장점을 활용할 수 있습니다.

JDOM 패키지의 구조

JDOM 라이브러리는 6개 패키지로 구성되어 있다. 첫째, org.jdom 패키지에는 Attribute, CDATA, Comment, DocType, Document, Element, EntityRef, Namespace, ProcessingInstruction, Text 등 XML 문서와 그 컴포넌트를 나타내는 클래스들이 포함돼 있다. XML에 익숙한 개발자라면 클래스 이름만 봐도 이해가 될 것이다.

다음은 XML 문서를 생성하는 클래스를 담고 있는 org.jdom.input 패키지이다. 가장 중심적이고 중요한 클래스는 SAXBuilder이다. SAXBuilder는 수신되는 SAX(Simple API for XML) 이벤트를 참조해 이에 대응하는 문서를 구성함으로써 문서를 생성한다. 파일이나 다른 스트림으로부터 문서를 생성하고자 한다면 SAXBuilder를 이용해야 한다. SAXBuilder는 SAX 파서를 이용해 스트림을 읽은 뒤 SAX 파서 콜백에 따라 문서를 생성한다. 이 설계의 좋은 점은 SAX 파서의 속도가 빨라질수록 SAXBuilder도 빨라진다는 것이다. 그밖에 주요 입력 클래스는 DOMBuilder이다. DOMBuilder는 DOM 트리를 통해 문서를 생성한다. 이 클래스는 이미 존재하는 DOM 트리를 JDOM 버전으로 대신 사용하고자 할 경우 편리하다.

이러한 빌더의 잠재성에는 아무런 제한이 없다. 예를 들어, Xerces에는 SAX보다 더 낮은 수준에서 운용되는 XNI(Xerces Native Interface)가 있으므로 SAX를 통해 노출되지 않는 일부 파서 정보를 다루기 위해서 XNIBuilder를 사용하는 것이 적합할 수도 있다. JDOM 프로젝트를 지원해온 한 가지 대중적인 빌더는 ResultSetBuilder이다. 이 빌더는 JDBC ResultSet을 통해 SQL 결과를 다양한 구성의 요소(element)와 속성(attribute)을 가지는 XML 문서를 표현한다.

org.jdom.output 패키지에는 XML 문서를 출력하는 클래스가 포함돼 있다. 가장 중요한 클래스는 XMLOutputter이다. XMLOutputter는 파일, 스트림, 소켓으로 출력할 수 있도록 문서를 바이트 스트림으로 변환한다. XMLOutputter는 원시 출력, 가공 출력, 압축 출력 등을 지원하는 다수의 특별 구성 옵션을 가지고 있다. 이 클래스는 상당히 복잡하다. DOM Level 2에 아직도 이런 기능이 없는 것은 바로 이런 이유 때문일 것이다.

그 밖에 문서의 컨텐트를 기반으로 SAX 이벤트를 생성하는 SAXOutputter가 있다. 이 클래스는 모호해 보이기는 하지만 XSLT 변환시 매우 유용한데, 이는 문서 데이타를 엔진으로 전송하는 데 있어 SAX 이벤트가 바이트 스트림보다 훨씬 효율적인 방식이기 때문이다. 또한 문서를 DOM 트리 형식으로 표현하는 DOMOutputter도 있다. 그 밖에 수십 라인의 코드만으로 문서를 JTree로 보여주는 JTreeOutputter도 있는데, JTreeOutputter를 ResultSetBuilder와 함께 사용할 경우 코드 몇 라인만 추가하는 것만으로도 SQL 질의 결과를 트리 뷰로 나타낼 수 있다.

DOM과는 달리, JDOM에서는 해당 문서가 빌더에 구속되지 않는다는 점에 주목해야 한다. 따라서 데이타를 담는 클래스와 데이타를 구조화하는 다양한 클래스, 이 데이타를 사용하는 그 밖의 여러 클래스가 포함된 세련된 모델이 생성된다. 원하는 만큼 자유롭게 혼합해 사용할 수 있다.

org.jdom.transform 및 org.jdom.XPath 패키지에는 기본 XSLT 변환과 XPath 조회를 지원하는 클래스가 포함돼 있다.

마지막으로, org.jdom.adapters 패키지는 DOM 상호작용의 라이브러리를 지원하는 클래스를 포함하고 있는데, 이 패키지의 클래스를 호출할 필요가 전혀 없다. 이들 클래스가 존재하는 이유는 각 DOM의 구현 방식이 각각의 부트 스트래핑 작업 방식별로 서로 다른 함수 이름을 사용하기 때문이며, 이에 따라서 각 어댑터 클래스가 표준 콜을 파서 전용 콜로 번역한다. JAXP(Java API for XML Processing)는 어댑터 클래스가 과도하게 사용될 때의 문제점에 대한 대안으로서, 실제로 이들 클래스에 대한 요구를 감소시키는 역할을 한다. 그러나 모든 파서가 JAXP를 지원하는 것은 아니고, 또한 라이선스 문제 때문에 어디나 JAXP가 설치돼 있는 것도 아니기 때문에, 이러한 클래스들에 대한 필요성은 여전히 남아 있다.

문서의 생성

문서는 org.jdom.Documentclass에 의해 표현된다. 다음은 완전히 새로운 문서를 생성하는 경우이다.

// This builds: <root/>

Document doc = new Document(new Element("root"));

또한 파일이나 스트림, 시스템 ID, URL 등을 통해 문서를 생성할 수도 있다.

// This builds a document of whatever's in the given resource
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(url);

소수의 콜을 조합함으로써 간단한 JDOM 문서를 생성할 수도 있다.

// This builds: <root>This is the root</root>

Document doc = new Document();
Element e = new Element("root");
e.setText("This is the root");
doc.addContent(e);

파워유저라면 다양한 방법을 연속적으로 호출하는 'method chaining'선호할 것이다. 이 방식을 통해 여러 개의 메소드를 한 번에 호출할 수 있다. 다음은 method chaining의 예이다.

Document doc = new Document(
  new Element("root").setText("This is the root"));

다음은 JAXP/DOM를 이용해 동일한 문서를 생성하는 예이다.

// JAXP/DOM
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.newDocument();
Element root = doc.createElement("root");
Text text = doc.createText("This is the root");
root.appendChild(text);
doc.appendChild(root);

SAXBuilder 이용하기

앞서 설명했듯이 SAXBuilder는 모든 바이트 근간 자원으로부터 문서를 생성하는 간단한 메커니즘을 제공한다. 입력 변수가 없는 기본 SAXBuilder() 생성자는 내부적으로 JAXP를 이용하여 SAX 파서를 선택한다. 파서를 변경하고자 할 때는 javax.xml.parsers.SAXParserFactory 시스템 속성을 파서가 제공하는 SAXParser Factory를 가리키도록 설정하면 된다. Oracle9i Release2 XML 파서의 경우 다음과 같이 실행하면 된다.

java -Djavax.xml.parsers.SAXParserFactory=

oracle.xml.jaxp.JXSAXParserFactory YourApp

Xerces 파서의 경우 다음과 같이 실행한다.

java -Djavax.xml.parsers.SAXParserFactory=org.apache.xerces.jaxp
.SAXParserFactoryImpl YourApp

만약 JAXP가 설치돼 있지 않다면 SAXBuilder는 Apache Xerces를 기본값으로 이용한다. SAXBuilder 인스턴스가 생성된 뒤에는 다음과 같은 몇 가지 속성을 빌더에 설정할 수 있다.

setValidation(boolean validate)
WebLOCATOR

개방 소스 JDOM 라이브러리: jdom.org

Java Servlet Programming (second edition), (제이슨 헌터(Jason Hunter) 저) (2001년 O'Reilly & Associates 출간): www.oreilly.com

이 메소드는 문서 생성 중 DTD(Document Type Definition)에 대해 검증할 것인지 여부를 파서에 알려준다. 기본으로 설정된 값은 false이다. 사용된 DTD는 문서의 DocType 내에서 참조된 것이다. 다른 DTD에 대해 검증하는 것은 아직 불가능한데, 이 기능을 지원하는 파서가 아직 없기 때문이다.

setIgnoringElementContentWhitespace(boolean ignoring)

위 메소드는 요소 컨텐트에서 ‘무시할 수 있는 여백(ignorable whitespace)’을 무시할 것인지 여부를 파서에 알려준다. XML 1.0 사양에 의하면, 요소 컨텐트의 여백은 파서에 의해 보존돼야 하지만 DTD에 대해 검증할 경우 문서의 특정 부분이 여백을 지원하지 않는다는 사실을 파서가 인식할 수 있기 때문에 이 영역의 여백은 ‘무시할 수’ 있다. 기본값으로는 해제 상태이다. 문서를 입력 때와 동일한 컨텐트를 출력하고자 할 때가 아니라면 ‘무시 가능’으로 사용하는 것이 일반적으로 성능상 바람직하다. 단, 이 플래그는 DTD 검증이 수행될 때만 유효하며 이때는 이미 검증 과정을 통한 성능 저하가 발생한 것이기 때문에 결국 이 메소드는 검증이 이미 이용되고 있을 경우에만 유용하다는 점을 유의해야 한다.

setFeature(String name, String value)

위 메소드는 기본 SAX 파서상에 기능을 설정하는 방법이다. 이 방법은 원시적인 호출 방식이기 때문에 이 방법을 이용할 때는 매우 신중해야 한다. 왜냐하면 특정 기능(예 : 네임스페이스 변경)을 잘못 설정할 경우 JDOM 작업이 중단될 수도 있기 때문이다. 게다가 파서 전용 기능에 의존할 경우 이식성을 제한할 위험이 있다. 이 콜은 스키마 검증을 선택할 때 가장 유용하다.

setProperty(String name, Object value)

위 메소드는 기본 SAX 파서상에 속성을 설정하는 방법이다. 이 방법 역시 원시 호출 방식으로, 위험한 동시에 특히 스키마 검증시 파워유저에게 유용한 방법이다. 다음 코드는 이 방법들을 조합해 검증 기능을 선택하고 여백 무시 가능 기능으로 설정한 뒤 JAXP 선택 파서를 이용해 로컬 파일을 읽게 된다.

SAXBuilder builder = new SAXBuilder();
builder.setValidation(true);
builder.setIgnoringElementContentWhitespace(true);
Document doc = builder.build(new File("/tmp/foo.xml"));

XMLOutputter를 이용한 문서 출력

문서는 다양한 포맷으로 출력될 수 있지만 가장 흔한 포맷은 바이트 스트림이다. JDOM에서는 XMLOutputter 클래스가 이 기능을 제공한다. 이 클래스의 기본 생성자는 문서에 저장된 원문 그대로 문서를 출력하려 한다. 아래 코드는 원문 그대로 문서의 내용을 파일에 출력하는 코드이다.

// Raw output
XMLOutputter outp = new XMLOutputter();
outp.output(doc, fileStream);

여백에 신경 쓰지 않아도 된다면 텍스트 트리밍을 선택해 약간의 공간을 절약할 수 있다.

// Compressed output
outp.setTextTrim(true);
outp.output(doc, socketStream);

사람 눈에 맞춰 문서의 인쇄 상태를 보기 좋게 만들려면 들여쓰기와 줄 바꿔쓰기를 추가하면 된다.

outp.setTextTrim(true);
outp.setIndent("  ");
outp.setNewlines(true);
outp.output(doc, System.out);

이미 여백을 통해 포맷된 문서에 위의 가공 기능을 다시 적용할 경우 트리밍을 선택해야 한다. 그렇지 않으면 이미 포맷된 상태에서 또다른 포매팅을 가하는 것이 돼 최종 출력 상태가 보기 흉하게 된다.

요소 트리의 네비게이션

JDOM은 요소 트리(element tree)의 네비게이션을 간편하게 해준다. 루트 요소를 호출하려면 다음 코드를 이용한다.

Element root = doc.getRootElement();
모든 자식 요소 리스트를 불러오는 방법은 다음과 같다.

List allChildren = root.getChildren();

주어진 이름의 요소만을 호출하려면,

List namedChildren = root.getChildren("name");

주어진 이름의 요소 중 첫 번째 요소만을 호출하려면 다음을 이용한다.

Element child = root.getChild("name");

getChildren() 콜을 통해 반환된 리스트는 모든 Java 프로그래머가 알고 있는 리스트 인터페이스의 구현인 java.util.List이다. 이 리스트에서 특기할 만한 것은 이것이 라이브 리스트라는 점이다. 리스트에 가해진 모든 변경사항은 원본 문서 객체에도 반영된다.

// Remove the fourth child
allChildren.remove(3);
// Remove children named "jack"
allChildren.removeAll(root.getChildren("jack"));
// Add a new child, at the tail or at the head
allChildren.add(new Element("jane"));

allChildren.add(0, new Element("jill"));

이러한 리스트를 통한 대치 방법을 이용하면, 수많은 별도의 방법들을 과도하게 사용하지 않고도 요소를 다양하게 가공할 수 있다. 그러나, 편의상 주로 이용하는 작업인, 마지막에 요소를 추가하거나 이름이 있는 요소들을 삭제하는 경우 요소 자체에 이미 동일한 메소드가 포함돼 있기 때문에 이 작업을 실행할 때는 리스트를 우선 호출할 필요가 없다.

root.removeChildren("jill");
root.addContent(new Element("jenny"));

JDOM의 또 다른 장점은 한 문서 내에서 혹은 여러 문서 사이에서 요소들을 이동하는 작업이 간편하다는 것이다. 이 때 몇 개의 문서간에 이동하든 관계없이 동일한 코드를 사용할 수 있다.

Element movable = new Element("movable");
parent1.addContent(movable);    // place
parent1.removeContent(movable); // remove
parent2.addContent(movable);    // add

DOM의 경우 요소의 이동이 JDOM에서만큼 쉽지 않은데, 이는 DOM에서는 요소들이 그들을 생성한 객체에 강하게 묶여 있기 때문이다. 따라서 문서간 이동시에는 DOM 요소가 직접 '임포트' 되어야 한다.

JDOM에서 한 가지 유념할 사항은, 요소를 다른 데 추가하기 전에 제거해야 한다는 점이다. 이렇게 해야 트리 내에서 순환이 발생하는 것을 막을 수 있다. detach() 메소드를 이용하면 분리/추가 작업을 라인 하나로 처리할 수 있다.

parent3.addContent(movable.detach());

요소를 다른 부모에 추가하기 전에 먼저 분리하지 않았을 경우, 해당 라이브러리는 Exception을 떨어트릴 것이다(정확하고 도움이 되는 오류 메시지와 함께). 또한 라이브러리는 요소에 스페이스와 같은 부적절한 문자가 포함되지 않도록 요소의 이름과 컨텐트를 확인한다. 또한 단일 루트 요소의 포함 여부, 일관적인 네임스페이스 선언 여부 및 주석과 CDATA 섹션에 금지된 문자열이 없는지 등 기타 여러 규칙도 검증한다. 이를 통해 가능한 한 프로세스 초기 단계에서 문서가 'well-formed' 인지 확인하는 과정이 이루어지게 되는 것이다.

요소 속성의 처리

요소 속성의 예를 들면 다음과 같다.

<table width="100%" border="0"> ... </table>

요소 참조를 통해, 어떤 이름의 속성 값이든 요소에 요청할 수 있다.

String val = table.getAttributeValue("width");

또한 타입 변환과 같은 특별 가공 작업을 위해 속성을 객체로 불러올 수도 있다.

Attribute border = table.getAttribute("border");
int size = border.getIntValue();

속성을 설정하거나 변경하려면 setAttribute()를 사용한다.

table.setAttribute("vspace", "0");

속성을 삭제하려면 removeAttribute()를 사용한다.

table.removeAttribute("vspace");

텍스트 컨텐트를 가진 요소의 예를 들면 다음과 같다.

<description>
  A cool demo
</description>

JDOM에서는 호출을 통해 텍스트를 직접 이용할 수 있다.

String desc = description.getText();

한 가지 유의할 점은, XML 1.0 사양에서는 여백의 보존이 요구되기 때문에 이 경우 '\n A cool demo\n'반환된다는 것이다. 그러나 실제 환경에서는 여백의 포매팅에 대해 크게 유념할 필요가 없으므로 가장자리의 여백을 무시하고 텍스트를 불러오는 편리한 방법이 있다.

String betterDesc = description.getTextTrim();

여백을 아예 없애고 싶다면 스페이스를 이용해 내부의 여백을 표준화하는 getTextNormalize() 메소드를 이용하면 된다. 이 메소드는 다음과 같은 텍스트 컨텐트에 이용할 때 편리한다.

<description>
  Sometimes you have text content with formatting
  space within the string.
</description>

텍스트 컨텐트를 변경하고자 할 때는 setText() 메소드를 이용한다.

description.setText("A new description");

텍스트에 포함된 특수 문자는 모두 문자로서 올바르게 해석되어 출력시에 적절한 의미를 유지하게 된다. 다음 콜을 예로 들어보자.

element.setText("<xml/> content");

내부 저장 영역은 이 문자열을 그대로 문자로 저장할 것이다. 이 컨텐트에 대한 함축적 파싱은 이루어지지 않는다. 출력시에는 다음과 같이 표현된다.

&lt;xml/&gt; content<elt>

이는 이전 setText() 콜의 의미론적 내용을 보존하기 위한 것이다. 따라서, 요소 내에 XML 컨텐트를 포함하고자 한다면 적절한 JDOM 자식 요소 객체를 추가해야 할 것이다.

JDOM에서는 CDATA 섹션을 처리할 수도 있다. CDATA 섹션은 파싱되어서는 안 될 텍스트 블록을 지시한다. 원래 CDATA 섹션은 &lt;와 &gt; 같은 에스케이프 문자열을 과도하게 사용하지 않고도 HTML이나 XML을 손쉽게 포함시킬 수 있게 해주는 문법적인 용어이다. 그러나 JDOM에서는 이를 객체화하여 사용한다. CDATA 섹션을 생성하려면 이 문자열을 CDATA 객체로 래핑하면 된다.

element.addContent(new CDATA("<xml/> content"));

JDOM의 장점은 getText() 콜이 문자열을 CDATA 섹션으로 나타낼 것인지 일일이 물어보지 않고 문자열을 반환한다는 점이다.

혼합 컨텐트의 처리

어떤 요소에는 여백, 주석, 텍스트, 자식 요소 등 수많은 항목들이 포함되어 있다.

<table>

  <!-- Some comment -->
  Some text
  <tr>Some child element</tr>
</table>

어떤 요소에 텍스트와 자식 요소가 모두 들어 있을 경우 ‘혼합 컨텐트’를 포함하고 있다고 한다. 혼합 컨텐트를 처리하는 것은 어려울 수도 있지만, JDOM을 이용하면 쉽게 처리할 수 있다. 텍스트 컨텐트를 불러오고 자식 요소를 네비게이션하는 기본 이용 사례는 간단하게 처리할 수 있다.

String text = table.getTextTrim();  // "Some text"
Element tr = table.getChild("tr");  // A straight reference

주석, 여백 블록, 프로세싱 명령어, 엔티티 참조 등이 필요한 고급 응용의 경우, 혼합 컨텐트를 리스트로서 직접 불러올 수 있다.

List mixedCo = table.getContent();
Iterator itr = mixedCo.iterator();
while (itr.hasNext()) {
  Object o = i.next();
  if (o instanceof Comment) {
    ...
  }
  // Types include Comment, Element, CDATA, DocType,
  // ProcessingInstruction, EntityRef, and Text
}

자식 요소 리스트와 마찬가지로 혼합 컨텐트 리스트를 변경할 경우 원래 문서에도 영향을 미치게 된다.

// Remove the Comment.  It's "1" because "0" is a whitespace block.
mixedCo.remove(1);

자세히 살펴보면, 여기에 Text 클래스가 포함돼 있다는 사실을 알 수 있다. JDOM은 내부적으로 Text 클래스를 이용해 문자열 컨텐트를 저장하는데, 이는 이 문자열이 부모를 갖도록 하고 XPath 액세스를 보다 쉽게 지원하도록 하기 위한 것이다. 원시 컨텐트 리스트에 액세스할 때 텍스트만을 불러오거나 설정할 경우라면 이 클래스에 대해 염려할 필요가 없다.

DocType, ProcessingInstruction, EntityRef 클래스에 대해 보다 자세한 정보는 jdom.org의 API 설명서를 참조하기 바란다.



원문 출처 : http://www.oracle.com/global/kr/magazine/webcolumns/2002/o52jdom.html

2007/05/30 10:29 2007/05/30 10:29
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

구글검색 메인 페이지 디자인 변경

오늘 구글 접속 했더니 메인 페이지 디자인에 변화가 생겼더군요..

예전엔 검색메뉴만 덩그러니 있었는데 지금은 아래쪽에 구글 제품들이 구글CI에 사용된 컬러를 이용한 점들로 나열되어 있습니다.

구글에서 핵심제품들이라 생각했기에 메인인 검색 페이지에 노출했겠죠?
제가 사용하고 있는 구글 서비스는 gmail과 picasa 정도네요..

구글
기존 검색 화면 아래쪽에 구글 제품들이 나열 되어있습니다.



구글
마우스 오버시 아이콘이 표시됩니다.
2007/05/30 10:24 2007/05/30 10:24
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

NetBeans IDE 5.0의 GUI 작성


NetBeans IDE 5.0의 GUI 작성

이 자습서에서는 다음을 수행하는 방법을 설명합니다.

  • GUI 작성기 인터페이스 사용
  • GUI 컨테이너 생성
  • 구성 요소 추가
  • 구성 요소 크기 조정
  • 구성 요소 정렬
  • 구성 요소 앵커 조정
  • 구성 요소 자동 크기 조정 동작 설정
  • 구성 요소 등록 정보 편집

    이 자습서는 보통 30분 이내에 완료할 수 있습니다.

    주: 아이콘이 표시될 때마다 이 아이콘을 클릭하여 GUI 작성기 기능에 대한 대화식의 자세한 데모를 볼 수 있습니다.


시작하기

NetBeans 5.0부터는 IDE의 GUI 작성기가 더 강력하고 직관적인 방향으로 개정되었기 때문에 사용자가 레이아웃 관리자를 깊이 이해하지 못해도 짜임새 있는 GUI를 자유롭게 작성할 수 있습니다. NetBeans의 새 GUI 작성기를 사용하면 GUI 작성의 어려운 부분을 생략하고 원하는 곳에 구성 요소를 배치하는 것만으로 폼 레이아웃을 지정할 수 있습니다.

프로젝트 생성

IDE의 모든 Java 개발은 프로젝트 내에서 이루어지기 때문에 먼저 소스와 기타 프로젝트 파일을 넣을 새 ContactEditor 프로젝트를 생성해야 합니다. IDE 프로젝트는 Java 소스 파일과 관련 메타 데이터가 있는 그룹이며 프로젝트별 등록 정보 파일과 작성 및 실행 설정을 제어하는 Ant 작성 스크립트, Ant 대상을 IDE 명령에 매핑하는 project.xml 파일이 포함되어 있습니다. Java 응용 프로그램은 여러 IDE 프로젝트로 구성되는 경우가 많지만, 이 자습서에서는 한 프로젝트에 전부 저장되는 간단한 응용 프로그램을 작성합니다.

새 ContactEditor 응용 프로그램 프로젝트를 생성하려면

  1. 파일 > 새 프로젝트를 선택합니다. 또는 IDE 도구 모음에서 새 프로젝트 아이콘을 클릭할 수도 있습니다.
  2. 범주 창에서 일반 노드를 선택하고 프로젝트 창에서 Java 응용 프로그램을 선택합니다. 다음을 클릭합니다.
  3. 프로젝트 이름 필드에 ContactEditor를 입력하고 프로젝트 위치를 지정합니다.
  4. 주 프로젝트로 설정 확인란이 선택되어 있는지 확인하고, 주 클래스 생성이 선택되어 있으면 선택을 해제합니다.
  5. 마침을 클릭합니다.


    IDE에서 시스템의 지정된 위치에 ContactEditor 폴더를 생성합니다. 이 폴더에는 Ant 스크립트 등의 모든 프로젝트 관련 파일, 소스 및 테스트를 저장하는 폴더, 프로젝트별 메타데이터 폴더가 포함됩니다. 프로젝트 구조를 보려면 IDE의 파일 창을 사용합니다.

GUI 컨테이너 생성

새 응용 프로그램을 생성한 후에 프로젝트 창의 소스 패키지 폴더에 빈 <default package> 노드가 포함되어 있는 것을 확인할 수 있습니다. 인터페이스를 계속 작성하려면 다른 필수 GUI 구성 요소를 넣을 Java 컨테이너를 생성해야 합니다. 이 단계에서는 JFrame 구성 요소를 사용하여 컨테이너를 생성하고 컨테이너를 새 패키지에 보관합니다.

JFrame 컨테이너를 생성하려면

  1. 프로젝트 창에서 ContactEditor 노드를 마우스 오른쪽 버튼으로 클릭하고 새로 만들기 > JFrame 폼을 선택합니다.
  2. 클래스 이름으로 ContactEditorUI를 입력합니다.
  3. 패키지로 my.contacteditor를 입력합니다.
  4. 마침을 클릭합니다.

    IDE에서 ContactEditorUI.java 응용 프로그램에 ContactEditorUI 폼과 ContactEditorUI 클래스를 생성하고 GUI 작성기에서 ContactEditorUI 폼을 엽니다. my.contacteditor 패키지가 기본 패키지를 대체합니다.

 


GUI 작성기 익히기

이제 응용 프로그램에 사용할 새 프로젝트가 설정되었으니 잠시 GUI 작성기 인터페이스를 익혀 보겠습니다. 대화식의 데모를 통해 GUI 작성기 인터페이스를 살펴 보려면 데모 보기 아이콘을 클릭하십시오.

IDE의 GUI 작성기 인터페이스

데모 보기

JFrame 컨테이너를 추가하면 IDE에서는 위 그림과 같이 새로 생성된 ContactEditorUI 폼을 도구 모음과 함께 편집기 탭에 표시합니다. ContactEditor 폼이 GUI 작성기의 디자인 뷰에 열리고 IDE의 가장자리를 따라 세 개의 추가 창이 자동으로 표시되며 GUI 폼을 작성하는 동안 탐색, 구성, 편집을 수행할 수 있게 됩니다.

GUI 작성기에는 다음과 같은 다양한 창이 있습니다.

  • 디자인 영역. Java GUI 폼을 생성 및 편집하는 데 사용되는 GUI 작성기 기본 창입니다. 도구 모음에 있는 소스 및 디자인 토글 버튼을 사용하면 클래스의 소스 코드나 GUI 구성 요소의 그래픽 뷰를 볼 수 있습니다. 추가 도구 모음 버튼을 사용하면 선택 및 연결 모드 중에서 선택, 구성 요소 정렬, 구성 요소 자동 크기 조정 동작 설정, 폼 미리 보기 등의 일반 명령에 편리하게 액세스할 수 있습니다.
  • 검사기. 응용 프로그램에서 시각적인 구성 요소와 그렇지 않은 구성 요소를 모두 트리 계층으로 표시합니다. 검사기에서는 GUI 작성기에서 편집 중인 트리 내의 구성 요소에 관한 시각적인 피드백을 제공하며, 사용 가능한 패널에서 구성 요소를 정리할 수 있게 해줍니다.
  • 팔레트. JFC/Swing, AWT 및 JavaBeans 구성 요소와 레이아웃 관리자 등의 탭이 포함된 사용 가능한 구성 요소를 표시하는 사용자 정의 가능 목록입니다. 사용자 정의자를 사용하여 팔레트에 표시되는 범주를 생성, 제거 및 재정렬할 수도 있습니다.
  • 등록 정보 창. 현재 GUI 작성기, 검사기 창, 프로젝트 창 또는 파일 창에서 선택된 구성 요소의 등록 정보를 표시합니다.

소스 버튼을 클릭하면 IDE에서 편집기에 응용 프로그램의 Java 소스 코드를 표시하며 GUI 작성기에서 자동으로 생성된 코드를 보호 블록이라는 파란색 영역으로 표시합니다. 보호 블록은 소스 뷰에서 편집할 수 없도록 보호된 영역입니다. 소스 뷰에서는 편집기에 흰색 영역으로 표시된 코드만 편집할 수 있습니다. 보호 블록에 있는 코드를 변경해야 하는 경우에는 디자인 버튼을 클릭하면 IDE의 편집기가 GUI 작성기로 돌아가며 폼에서 필요한 사항을 조정할 수 있게 됩니다. 변경 사항을 저장하면 IDE에서 파일의 소스를 업데이트합니다.

주: 고급 개발자를 위해 JAR, 라이브러리 또는 기타 프로젝트에서 팔레트로 사용자 정의 구성 요소를 추가할 수 있는 팔레스 사용자 정의자가 마련되어 있습니다.

 



주요 개념

IDE의 GUI 작성기는 그래픽 인터페이스 생성의 작업 흐름을 간소화하여 개발자로부터 복잡한 Swing 레이아웃 관리자 작업 부담을 덜어 줍니다. 이를 위해 GUI 작성기는 이해와 사용이 쉬운 간단한 레이아웃 규칙으로 직관적인 "마음껏 디자인하기" 패러다임을 지원할 수 있도록 현재 NetBeans IDE GUI 작성기를 확장합니다. 폼의 레이아웃을 지정하는 동안 GUI 작성기는 구성 요소의 최적 간격과 정렬을 제안하는 시각적인 지침을 제공합니다. GUI 작성기는 배경에서 디자인 결정 사항을 새 GroupLayout 레이아웃 관리자 및 기타 Swing 구조로 구현되는 기능 UI로 변환합니다. 여기서는 동적 레이아웃 모델이 사용되기 때문에 GUI 작성기로 작성된 GUI는 구성 요소 사이에 정의된 관계를 바꾸지 않고 변경 사항에 맞게 조정하며 런타임에 예상과 일치하는 동작을 보입니다. 폼 크기를 조정하거나, 로켈을 전환하거나, 다른 모양 및 색감을 지정할 때마다 GUI는 대상 모양 및 색감의 삽입 그림과 오프셋에 맞게 자동으로 조정됩니다.

마음껏 디자인하기

IDE의 GUI 작성기에서는 절대 위치 지정을 사용하는 경우와 같이 구성 요소를 원하는 위치에 두기만 하면 폼을 작성할 수 있습니다. GUI 작성기에서 필요한 레이아웃 관리자를 파악한 후 자동으로 코드를 생성합니다. 삽입 그림, 앵커, 채우기 등을 직접 신경 쓸 필요가 없습니다. 업데이트된 Swing 라이브러리의 JAR 파일을 포함하여 패키지를 만들면 응용 프로그램을 배포할 때 예상대로 작동하도록 할 수 있습니다.

자동 구성 요소 위치 지정(맞추기)

폼에 구성 요소를 추가하면 GUI 작성기에서 운영 체제의 모양 및 색감에 따라 구성 요소 위치 지정에 도움이 되는 시각적인 피드백을 제공합니다. GUI 작성기에서는 폼에서 구성 요소를 배치할 위치에 관해 유용한 힌트와 기타 시각적인 피드백을 제공하며 지침에 따라 자동으로 구성 요소를 제 위치에 맞춥니다. 이 제안은 폼에 이미 배치된 구성 요소의 위치를 기준으로 이루어지지만 런타임에 다른 대상 모양 및 색감에서 적절하게 렌더링할 수 있을 정도의 여유도 허용됩니다.

시각적 피드백

GUI 작성기에서는 구성 요소 앵커 지정과 연결 관계에 관한 시각적 피드백도 제공합니다. 이 표시기를 사용하면 런타임에 GUI의 모양과 동작에 영향을 주는 다양한 위치 관계 및 구성 요소 고정 동작을 빠르게 확인할 수 있습니다. 그러면 GUI 디자인 프로세스가 빨라지며 짜임새 있는 시각적 인터페이스를 신속하게 생성할 수 있게 됩니다.

 


먼저

GUI 작성기의 인터페이스를 익혔으니 이제 ContactEditor 응용 프로그램의 UI 개발을 시작할 차례입니다. 이 절에서는 IDE의 팔레트를 사용하여 폼에 필요한 다양한 GUI 구성 요소를 추가하는 방법을 살펴 보겠습니다.

NetBeans 5.0의 마음껏 디자인하기 패러다임 덕에 더 이상은 레이아웃 관리자와 씨름하며 컨테이너 안에서 구성 요소의 크기와 위치를 제어하려 애쓸 필요가 없습니다. 이제는 필요한 구성 요소를 다음 그림과 같이 GUI 폼에 끌어다 놓기만 하면 됩니다.

구성 요소 추가: 기본

GUI 작성기가 Java GUI 생성 프로세스를 간소화하기는 하지만 레이아웃 작업을 시작하기 전에 인터페이스의 모습을 미리 그려 보는 것도 도움이 됩니다. 여러 인터페이스 디자이너들이 이 방법을 "모범" 기술로 생각하고 있지만, 이 자습서에서는 GUI 미리 보기 절로 바로 건너뛰어 완성된 폼의 모습을 볼 수 있습니다.

폼의 최상위 컨테이너로 이미 JFrame을 생성했기 때문에 다음 단계에서는 제목 테두리를 사용하여 UI 구성 요소의 클러스터를 지정할 수 있도록 JPanel을 추가합니다. 다음 그림을 참조하여 이 작업을 수행할 때 보이는 IDE의 "끌어서 놓기" 동작을 확인하십시오.

JPanel을 추가하려면

  1. 팔레트 창에서 Swing 범주의 JPanel 구성 요소를 마우스 버튼으로 클릭한 후 놓아서 선택합니다.
  2. GUI 작성기에서 커서를 폼의 왼쪽 위 모서리로 가져갑니다. 구성 요소가 컨테이너의 왼쪽 위 가장자리 근처에 있는 경우에는 기본 여백을 나타내는 수평 및 수직 정렬 지침이 나타납니다. 폼 안쪽을 클릭하여 이 위치에 JPanel을 배치합니다.

    다음 그림과 같이 JPanel 구성 요소가 ContactEditorUI 폼에 나타나고, 주황색 강조 표시로 선택된 구성 요소임이 표시됩니다. 마우스 버튼을 놓고 나면 구성 요소의 앵커 관계를 표시하는 작은 표시기가 나타나고 검사기 창에 해당 JPanel 노드가 표시됩니다.


다음으로는 JPanel 크기를 조정하여 잠시 후에 배치할 구성 요소의 자리를 마련해야 하지만, 먼저 다른 GUI 작성기의 시각화 기능을 잠깐 살펴 보겠습니다. 그러려면 방금 추가한 JPanel 선택을 해제해야 합니다. 제목이 있는 테두리를 아직 추가하기 않았기 때문에 패널이 사라집니다. 하지만 JPanel 위로 커서를 가져가면 가장 자리가 밝은 회색으로 바뀌기 때문에 위치를 명확하게 확인할 수 있습니다. 구성 요소 안쪽의 아무 부분이나 클릭하여 다시 선택하고 크기 조정 핸들과 앵커 표시기가 다시 나타나게 하면 됩니다.

JPanel 크기를 조정하려면

  1. 방금 추가한 JPanel을 선택합니다. 구성 요소의 주위에 작은 사각형 모양의 크기 조정 핸들이 다시 나타납니다.
  2. JPanel 오른쪽 가장자리의 크기 조정 핸들을 클릭한 채로 폼의 가장자리에 점선으로 된 정렬 지침이 나타날 때까지 끕니다.
  3. 크기 조정 핸들을 놓아 구성 요소의 크기를 조정합니다.

    다음 그림과 같이 권장 오프셋에 따라 컨테이너의 왼쪽 여백과 오른쪽 여백 사이에서 JPanel 구성 요소가 확장됩니다.



이제 UI의 이름 정보를 포함할 패널을 추가했으니 프로세스를 반복하여 첫 번째 패널 바로 아래에 전자 메일 정보를 포함할 다른 패널을 추가해야 합니다. 다음 그림을 참조하고 GUI 작성기에서 제안하는 위치 지정에 주의하며 앞의 두 태스크를 반복합니다. 두 JPanel 사이에 제안된 수직 간격이 가장자리에 제안되는 간격보다 좁은 것을 확인하십시오. 두 번째 JPanel을 추가하고 나면 폼의 나머지 공간을 채우도록 크기를 조정합니다.

GUI의 위쪽 섹션과 아래쪽 섹션에 해당하는 기능을 시각적으로 구분하기 위해서는 각 JPanel에 테두리와 제목을 추가해야 합니다. 먼저 등록 정보 창을 사용하여 이 작업을 수행한 후 팝업 메뉴를 사용해 보겠습니다.

JPanel에 제목 테두리를 추가하려면

  1. GUI 작성기에서 위쪽 JPanel을 선택합니다.
  2. 등록 정보 창에서 테두리 등록 정보 옆에 있는 생략 기호 버튼(...)을 클릭합니다.
  3. 나타나는 JPanel 테두리 편집기에서 사용 가능한 테두리 창의 TitledBorder 노드를 선택합니다.
  4. 아래의 등록 정보 창에서 제목 등록 정보에 Name을 입력합니다.
  5. 글꼴 등록 정보 옆의 생략 기호(...)를 클릭하고 글꼴 스타일로 굵게를 선택한 후 크기에 12를 입력합니다. 확인을 클릭하여 대화 상자를 종료합니다.
  6. 아래쪽 JPanel을 선택하고 2단계에서 5단계까지를 반복하되, 이번에는 JPanel을 마우스 오른쪽 버튼으로 클릭하고 팝업 메뉴를 사용하여 등록 정보 창에 액세스합니다. 제목 등록 정보에 E-mail을 입력합니다.

    JPanel 구성 요소 모두에 제목 테두리가 추가됩니다.

위 절차의 데모를 보려면 다음을 클릭합니다. 데모 보기

폼에 개별 구성 요소 추가

이제 연락처 목록에 있는 실제 연락처 정보를 나타내는 구성 요소를 추가하기 시작해야 합니다. 이 태스크에서는 연락처 정보를 표시할 네 개의 JTextField와 필드를 설명하는 JLabel을 추가하겠습니다. 이 태스크를 수행하는 동안 GUI 작성기에서 운영 체제의 모양 및 색감에 정의된 대로 기본 구성 요소 간격을 제안하는 수평 및 수직 지침을 표시하는 것을 확인하십시오. 이 기능을 통해 런타임에 대상 운영 체제의 모양 및 색감에 맞게 GUI가 자동으로 렌더링되게 할 수 있습니다.

폼에 JLabel을 추가하려면

  1. 팔레트 창의 Swing 범주에서 JLabel 구성 요소를 선택합니다.
  2. 앞서 추가한 Name JPanel 위로 커서를 이동합니다. JLabel이 왼쪽과 위쪽 가장자리에 약간의 여백을 두고 JPanel의 왼쪽 위 모서리에 배치되는 것을 나타내는 지침이 표시되면 클릭하여 레이블을 배치합니다.

    JLabel이 폼에 추가되고 구성 요소를 나타내는 해당 노드가 검사기 창에 추가됩니다.

계속 진행하기 전에 방금 추가한 JLabel의 표시 텍스트를 편집해야 합니다. 언제든지 구성 요소의 표시 텍스트를 편집할 수 있지만, 가장 쉬운 방법은 추가할 때 편집하는 것입니다.

JLabel의 표시 텍스트를 편집하려면

  1. JLabel을 두 번 클릭하여 표시 텍스트를 선택합니다.
  2. First Name:을 입력하고 Enter 키를 누릅니다.

    JLabel의 새 이름이 표시되고 편집 결과에 따라 구성 요소의 너비가 조정됩니다.


이제 JTextField를 추가하며 GUI 작성기의 기준선 정렬 기능을 살펴 보겠습니다.

폼에 JTextField를 추가하려면

  1. 팔레트 창의 Swing 범주에서 JTextField 구성 요소를 선택합니다.
  2. 커서를 방금 추가한 First Name: JLabel의 바로 오른쪽으로 이동합니다. JTextField의 기준선이 JLabel의 기준선에 정렬되는 것을 나타내는 수평 지침이 나타나고 두 구성 요소 사이의 간격이 수직 지침으로 제안되면 클릭하여 JTextField 위치를 지정합니다.

    JTextField가 다음 그림과 같이 JLabel의 기준선에 정렬된 폼의 위치에 맞춰집니다. JLabel이 더 긴 텍스트 필드의 기준선에 정렬되도록 약간 아래로 내려갑니다. 이번에도 구성 요소를 나타내는 노드가 검사기 창에 추가됩니다.



계속 진행하기 전에 다음 그림과 같이 방금 추가한 구성 요소 옆에 JLabel과 JTextField를 더 추가해야 합니다. 이번에는 Last Name:을 JLabel의 표시 텍스트로 입력하고 JTextField의 자리 표시자 텍스트는 그대로 남겨 둡니다.



JTextField 크기를 조정하려면

  1. 방금 Last Name: JLabel의 오른쪽에 추가한 JTextField를 선택합니다.
  2. JTextField의 오른쪽 가장자리 크기 조정 핸들을 JPanel을 감싸는 오른쪽 가장자리 방향으로 끕니다.
  3. 텍스트 필드와 JPanel 오른쪽 가장자리 사이의 여백을 제안하는 수직 정렬 지침이 나타나면 마우스 버튼을 놓아 JTextField 크기를 조정합니다.

    다음 그림과 같이 JTextField의 오른쪽 가장자리가 JPanel의 권장 가장자리 여백에 맞게 정렬됩니다.


이전 절차의 데모를 보려면 데모 보기를 클릭합니다.

폼에 여러 구성 요소 추가

이제 곧 추가할 두 개의 JTextField를 설명하는 Title:Nickname: JLabel을 추가하겠습니다. Shift 키를 누른 채로 구성 요소를 끌어 놓으면 폼에 빠르게 추가할 수 있습니다. 이 작업을 수행하는 동안 GUI 작성기에서 기본 구성 요소 간격을 제안하는 수평 및 수직 지침을 표시하는 것을 다시 확인하십시오.

폼에 여러 JLabel을 추가하려면

  1. 팔레트 창에서 Swing 범주의 JLabel 구성 요소를 마우스 버튼을 클릭한 후 놓아서 선택합니다.
  2. 커서를 앞에서 추가한 First Name: JLabel 바로 아래 위치로 이동합니다. 새 JLabel의 왼쪽 가장자리가 위에 있는 JLabel의 왼쪽 가장자리에 정렬되었으며 둘 사이에 약간의 여백이 있음을 나타내는 지침이 나타나면 Shift 키를 누른 채 클릭하여 첫 번째 JLabel을 배치합니다.
  3. 계속 Shift 키를 누른 채로 클릭하여 첫 번째 JLabel의 바로 오른쪽에 다른 JLabel을 배치합니다. 두 번째 JLabel의 위치를 지정하기 전에 Shift 키를 놓아야 합니다. 마지막 JLabel의 위치를 지정하기 전에 Shift 키를 놓지 않은 경우에는 Esc 키를 누릅니다.

    JLabel이 폼에 추가되며 다음 그림과 같이 두 번째 행을 생성합니다. 각 구성 요소를 나타내는 노드가 검사기 창에 추가됩니다.



계속하기 전에 앞으로 설정할 정렬의 효과를 볼 수 있도록 JLabel의 이름을 편집해야 합니다.

JLabel의 표시 텍스트를 편집하려면

  1. 첫 번째 JLabel을 두 번 클릭하여 표시 텍스트를 선택합니다.
  2. Title:을 입력하고 Enter 키를 누릅니다.
  3. 1단계와 2단계를 반복하며 두 번째 JLabel의 이름 등록 정보에 Nickname:을 입력합니다.

    다음 그림과 같이 JLabel의 새 이름이 폼에 표시되고 편집된 너비에 따라 이동합니다.


위 절차의 데모를 보려면 데모 보기를 클릭합니다.

구성 요소 삽입

이미 폼에 배치된 구성 요소 사이에 구성 요소를 추가해야 하는 경우가 있습니다. 두 개의 기존 구성 요소 사이에 구성 요소를 추가하면 GUI 작성기에서 기존 구성 요소를 자동으로 이동하여 새 구성 요소가 들어갈 자리를 마련합니다. 이를 보여주기 위해 다음 두 그림에서 보이는 것처럼 앞서 추가한 JLabel 사이에 JTextField를 삽입하겠습니다.

두 JLabel 사이에 JTextField를 삽입하려면

  1. 팔레트 창의 Swing 범주에서 JTextField 구성 요소를 선택합니다.
  2. JTextField가 두 개의 기존 필드와 모두 겹치며 기준선에 정렬되도록 Title:Nickname: JLabel 위로 커서를 이동합니다. 새 텍스트 필드 위치를 지정하기가 어려운 경우에는 아래의 첫 번째 이미지와 같이 Nickname JLabel의 왼쪽 지침에 맞추면 됩니다.
  3. 클릭하여 JTextField를 Title:Nickname: JLabel 사이에 배치합니다.

    JTextField가 두 JLabel 사이의 위치에 맞춰집니다. 제안된 수평 오프셋에 맞게 가장 오른쪽의 JLabel이 오른쪽으로 이동합니다.



이어서 폼의 오른쪽에서 각 연락처의 별명을 표시하는 추가 JTextField 하나를 폼에 추가해야 합니다.

JTextField를 추가하려면

  1. 팔레트 창의 Swing 범주에서 JTextField 구성 요소를 선택합니다.
  2. 커서를 Nickname 레이블의 오른쪽으로 이동한 후 클릭하여 텍스트 필드를 배치합니다.

    JTextField가 왼쪽에 있는 JLabel 옆에 정렬됩니다.


JTextField 크기를 조정하려면

  1. 이전 태스크에서 추가한 Nickname: 레이블의 JTextField 크기 조정 핸들을 레이블이 포함된 JPanel의 오른쪽 방향으로 끕니다.
  2. 텍스트 필드와 JPanel 가장자리 사이의 여백을 제안하는 수직 정렬 지침이 나타나면 마우스 버튼을 놓아 JTextField 크기를 조정합니다.

    JTextField의 오른쪽 가장자리가 JPanel의 권장 가장자리 여백에 정렬되고 GUI 작성기에서 적절한 크기 조정 동작을 제시합니다.

이전 절차의 데모를 보려면 데모 보기를 클릭합니다.

 


진행

정렬은 짜임새 있는 GUI를 생성하는 데 있어 가장 기본적인 부분에 속합니다. 앞의 절에서는 ContactEditorUI 폼에 JLabel과 JTextField 구성 요소를 추가하면서 IDE의 정렬 기능을 살펴 보았습니다. 다음으로는 응용 프로그램에 필요한 다양한 다른 구성 요소로 작업하면서 GUI 작성기의 정렬 기능을 좀더 깊이 살펴 보겠습니다.

구성 요소 정렬

폼에 구성 요소를 추가할 때마다 GUI 작성기에서는 표시되는 정렬 지침에 따라 효율적으로 구성 요소를 정렬합니다. 하지만 구성 요소 그룹 사이에 다른 관계를 지정해야 하는 경우도 있습니다. 앞에서는 ContactEditor GUI에 필요한 JLabel 네 개를 추가했지만 정렬은 하지 않았습니다. 이제 JLabel의 두 열을 정렬하여 오른쪽 가장자리를 맞추겠습니다.

구성 요소를 정렬하려면

  1. 폼의 왼쪽에서 First Name:Title: JLabel을 선택합니다.
  2. 도구 모음에서 열의 오른쪽 정렬 버튼()을 클릭합니다. 또는 구성 요소 중 하나를 마우스 오른쪽 버튼으로 클릭하고 팝업 메뉴에서 정렬 > 열의 오른쪽을 선택할 수도 있습니다.
  3. Last Name:Nickname: JLabel에 대해서도 이 과정을 반복합니다.

    표시 텍스트의 오른쪽 가장자리가 정렬되도록 JLabel의 위치가 이동합니다. 앵커 관계가 업데이트되며 구성 요소가 그룹으로 지정된 것을 나타냅니다.

앞서 추가한 JTextField를 마무리하기 전에 JLabel 사이에 삽입한 두 개의 JTextField 크기가 정확하게 조정되게 해야 합니다. 폼의 오른쪽 가장자리로 확장한 두 개의 JTextField와 달리 삽입된 구성 요소의 크기 조정 동작은 자동으로 설정되지 않습니다.

구성 요소 크기 조정 동작을 설정하려면

  1. Ctrl 키를 누른 채로 두 개의 삽입된 JTextField 구성 요소를 클릭하여 GUI 작성기에서 선택합니다.
  2. 두 개의 JTextField가 모두 선택된 상태에서 하나를 마우스 오른쪽 버튼으로 클릭한 후 팝업 메뉴에서 자동 크기 조정 > 수평을 선택합니다.

    JTextField는 런타임에 수평으로 크기가 조정되도록 설정됩니다. 정렬 지침과 앵커 표시기가 업데이트되며 구성 요소 관계의 시각적인 피드백을 제공합니다.


구성 요소를 같은 크기로 설정하려면

  1. Ctrl 키를 누른 채로 폼에 있는 네 개의 JTextField를 모두 클릭하여 선택합니다.
  2. JTextField가 선택된 상태에서 하나를 마우스 오른쪽 버튼으로 클릭한 후 팝업 메뉴에서 기본 크기 설정을 선택합니다.

    JTextField가 모두 같은 너비로 설정되고 각각의 위쪽 가장자리에 표시기가 추가되며 구성 요소 관계의 시각적인 피드백을 제공합니다.

이제 사용자가 ContactEditor 응용 프로그램에서 표시할 정보의 형식을 선택할 수 있게 해 주는 JComboBox를 설명하는 JLabel을 더 추가해야 합니다.

JLabel을 구성 요소 그룹에 정렬하려면

  1. 팔레트 창의 Swing 범주에서 JLabel 구성 요소를 선택합니다.
  2. 커서를 JPanel 왼쪽에 있는 First NameTitle JLabel 아래로 이동합니다. 새 JLabel의 오른쪽 가장자리가 위에 있는 구성 요소 그룹(두 개의 JLabel)의 오른쪽 가장자리에 정렬되는 것을 나타내는 지침이 표시되면 클릭하여 구성 요소를 배치합니다.

    JLabel이 다음 그림과 같이 위의 JLabel 열과 오른쪽 정렬되는 위치에 맞춰집니다. GUI 작성기에서 정렬 상태 선을 업데이트하여 구성 요소의 간격과 앵커 관계를 나타냅니다.


위의 예에서와 같이 JLabel을 두 번 클릭하여 표시 텍스트를 선택한 후 표시 이름에 Display Format:을 입력합니다. JLabel이 위치에 맞춰지면 긴 표시 텍스트에 맞게 다른 구성 요소가 이동합니다.

이전 절차의 데모를 보려면 데모 보기를 클릭합니다.

기준선 정렬

텍스트(JLabels, JTextFields 등)가 포함된 구성 요소를 추가 또는 이동할 때마다 IDE는 구성 요소에 있는 텍스트의 기준선에 맞는 정렬을 제안합니다. 예를 들어, 앞에서 JTextField를 삽입했을 때 이 필드의 기준선은 인접한 JLabel에 자동으로 정렬되었습니다.

이제 ContactEditor 응용 프로그램에서 표시하는 정보의 형식을 사용자가 선택할 수 있게 해 주는 콤보 상자를 추가하겠습니다. JComboBox를 추가하면서 기준선을 JLabel의 텍스트에 정렬합니다. 위치 지정을 돕기 위해 표시되는 기준선 정렬 지침을 다시 확인하십시오.

구성 요소의 기준선을 정렬하려면

  1. 팔레트 창의 Swing 범주에서 JComboBox 구성 요소를 선택합니다.
  2. 커서를 방금 추가한 JLabel의 바로 오른쪽으로 이동합니다. JComboBox의 기준선이 JLabel에 있는 텍스트의 기준선에 정렬되는 것을 나타내는 수평 지침이 나타나고 두 구성 요소 사이의 간격이 수직 지침으로 제안되면 클릭하여 콤보 상자를 배치합니다.

    다음 그림과 같이 구성 요소가 왼쪽에 있는 JLabel의 기준선과 정렬되는 위치에 맞춰집니다. GUI 작성기에서 구성 요소의 간격과 앵커 관계를 나타내는 상태 줄을 표시합니다.



JComboBox 크기를 조정하려면

  1. GUI 작성기에서 JComboBox를 선택합니다.
  2. JComboBox와 JPanel 가장자리 사이의 기본 오프셋을 제안하는 정렬 지침이 나타날 때까지 JComboBox의 오른쪽 가장자리에 있는 크기 조정 핸들을 오른쪽으로 끕니다.

    다음 그림과 같이 JComboBox의 오른쪽 가장자리가 JPanel의 권장 가장자리 여백에 맞게 정렬되고 구성 요소의 너비가 자동으로 설정되며 폼과 함께 크기가 조정됩니다.



구성 요소 모델 편집은 이 자습서의 범위를 벗어나기 때문에 일단은 JComboBox의 자리 표시자 항목 목록을 그대로 두겠습니다.

이전 절차의 데모를 보려면 데모 보기를 클릭합니다.

 


배운 내용 검토

ContactEditor GUI를 작성하는 작업이 깔끔하게 시작되었지만, 잠시 인터페이스에 필요한 구성 요소를 몇 개 더 추가하면서 배운 내용을 복습해 보겠습니다.

지금까지는 위치 지정에 도움이 되는 IDE의 정렬 지침을 사용하여 ContactEditor GUI에 구성 요소를 추가하는 작업에 집중했습니다. 하지만 구성 요소 배치에서 앵커 역시 중요한 부분을 차지한다는 것을 알아야 합니다. 아직 이 기능에 대해 제대로 설명하지는 않았지만, 알지 못하는 사이에 이 기능은 이미 활용되고 있었습니다. 앞서 설명한 것과 같이 폼에 구성 요소를 추가하면 IDE에서 대상 모양 및 색감에 해당되는 기본 위치 지정을 지침으로 제안합니다. 새 구성 요소를 배치하면 이 구성 요소는 가까운 컨테이너 가장자리나 구성 요소에 앵커되어 런타임에 구성 요소 관계가 유지되게 합니다. 이 절에서는 GUI 작성기가 보이지 않는 곳에서 수행하는 작업을 살펴 보며 좀더 간소하게 태스크를 수행하는 일에 집중합니다.

추가, 정렬 및 앵커

GUI 작성기를 사용하면 일반적인 작업 흐름의 동작을 간소화하여 폼을 쉽고 빠르게 배치할 수 있습니다. 폼에 구성 요소를 추가하면 GUI 작성기는 구성 요소를 기본 위치에 맞추고 필요한 연결 관계를 설정하여 사용자가 복잡한 구현 세부 정보와 씨름하는 대신 폼 디자인에 집중할 수 있도록 합니다.

JLabel의 표시 텍스트를 추가, 정렬 및 편집하려면

  1. 팔레트 창의 Swing 범주에서 JLabel 구성 요소를 선택합니다.
  2. 아래쪽 JPanel의 전자 메일 제목 바로 아래로 커서를 이동합니다. JLabel이 왼쪽과 위쪽 가장자리에 약간의 여백을 두고 JPanel의 왼쪽 위 모서리에 배치되는 것을 나타내는 지침이 표시되면 클릭하여 JLabel을 배치합니다.
  3. JLabel을 두 번 클릭하여 표시 텍스트를 선택합니다. 그리고 E-mail Address: 를 입력한 후 Enter 키를 누릅니다.

    JLabel이 폼의 기본 위치에 맞춰지고 이 요소를 포함하는 JPanel의 위쪽 및 왼쪽 가장자리에 앵커됩니다. 앞에서와 마찬가지로 구성 요소를 나타내는 해당 노드가 검사기 창에 추가됩니다.


JTextField를 추가하려면

  1. 팔레트 창의 Swing 범주에서 JTextField 구성 요소를 선택합니다.
  2. 커서를 방금 추가한 E-mail Address 레이블의 바로 오른쪽으로 이동합니다. JTextField의 기준선이 JLabel에 있는 텍스트의 기준선과 정렬되는 것을 나타내는 지침이 표시되고 두 구성 요소 사이의 여백이 수직 지침으로 제안되면 클릭하여 텍스트 필드를 배치합니다.

    JTextField가 E-mail Address: JLabel 오른쪽에 정렬되며 JLabel에 연결됩니다. 해당 노드도 검사기 창에 추가됩니다.

  3. JTextField와 JPanel 가장자리 사이의 오프셋을 제안하는 정렬 지침이 나타날 때까지 JTextField의 크기 조정 핸들을 요소를 포함하는 JPanel의 오른쪽으로 끕니다.

    JTextField의 오른쪽 가장자리가 기본 여백을 나타내는 정렬 지침에 맞춰집니다.

이제 ContactEditor의 전체 연락처 목록을 표시하는 JList를 추가해야 합니다.

JList를 추가하고 크기를 조정하려면

  1. 팔레트 창의 Swing 범주에서 JList 구성 요소를 선택합니다.
  2. 커서를 앞서 추가한 E-mail Address JLabel의 바로 아래로 이동합니다. JList의 위쪽과 왼쪽 가장자리가 JPanel의 왼쪽 가장자리와 위의 JLabel을 따라 기본 여백을 두고 정렬되는 것을 나타내는 지침이 표시되면 클릭하여 JList를 배치합니다.
  3. JList가 위에 있는 JTextField와 같은 너비임을 나타내는 정렬 지침이 표시될 때까지 포함하는 JPanel의 오른쪽으로 JList의 오른쪽 크기 조정 핸들을 끕니다.

    정렬 지침으로 지정된 위치에 JList가 정렬되며 해당 노드가 검사기 창에 표시됩니다. 새로 추가된 JList에 맞게 폼도 확장됩니다.


JList는 주로 긴 데이터 목록을 표시하는 데 사용되기 때문에 보통은 JScrollPane도 추가해야 합니다. JScrollPane이 필요한 구성 요소를 추가하면 GUI 작성기에서 자동으로 JScrollPane을 추가합니다. JScrollPane은 시각적 구성 요소가 아니기 때문에 GUI 작성기에서 생성된 JScrollPane을 보거나 편집하려면 검사기 창을 사용해야 합니다.

이전 절차의 데모를 보려면 데모 보기를 클릭합니다.

구성 요소 크기 조정

모달 대화 상자에 있는 버튼과 같이 서로 관련된 구성 요소 여러 개를 같은 크기로 설정하여 시각적인 일관성을 유지하는 것이 좋은 경우가 많습니다. 이를 설명하기 위해 여기서는 다음 그림과 같이 연락처 목록에서 개별 항목을 추가, 편집 및 제거할 수 있게 해 주는 ContactEditor 폼에 네 개의 JButton을 추가합니다. 그 뒤에는 네 개의 버튼이 관련된 기능을 제공하는 것을 쉽게 알아볼 수 있도록 버튼을 같은 크기로 설정합니다.

여러 버튼의 표시 텍스트를 추가, 정렬 및 편집하려면

  1. 팔레트 창에서 JButton 구성 요소를 선택합니다.
  2. JButton을 아래쪽 JPanel의 E-mail Address JTextField 오른쪽으로 이동합니다. JButton의 기준선과 오른쪽 가장자리가 JTextField의 기준선 및 가장자리에 정렬되는 것을 나타내는 지침이 표시되면 Shift 키를 누른 채 클릭하여 JFrame의 오른쪽 가장자리를 따라 첫 번째 버튼을 배치합니다. 마우스 버튼을 놓으면 JTextField의 너비가 JButton에 맞게 줄어듭니다.
  3. 커서를 아래쪽 JPanel에 있는 JList의 오른쪽 모서리로 이동합니다. JButton의 위쪽 및 오른쪽 가장자리가 JList의 가장자리에 정렬되는 것을 나타내는 지침이 표시되면 Shift 키를 누른 채 클릭하여 JFrame의 오른쪽 가장자리를 따라 두 번째 버튼을 배치합니다.
  4. 이미 추가한 두 JButton 아래에 두 개의 JButton을 더 추가하여 열을 생성합니다. 제안된 간격을 지키며 일관성을 유지할 수 있게 JButton의 위치를 지정합니다. 마지막 JButton의 위치를 지정하기 전에 Shift 키를 놓지 않은 경우에는 Esc 키를 누릅니다.
  5. 각 JButton을 두 번 클릭하고 각 이름의 텍스트를 입력합니다. 맨 위 버튼에 Add를 입력하고, 두 번째 버튼에 Edit를 입력하고, 세 번째 버튼에 Remove를 입력하고, 네 번째 버튼에 As Default를 입력합니다.

    정렬 지침에서 지정한 위치에 JButton 구성 요소가 정렬됩니다. 버튼의 너비가 새 이름에 맞게 변경됩니다.



이제 원하는 곳에 버튼이 배치되었으니 네 개의 버튼을 같은 크기로 설정하여 시각적인 일관성을 유지하고 네 버튼이 관련된 기능을 수행하는 것을 나타낼 차례입니다.

구성 요소를 같은 크기로 설정하려면

  1. Ctrl 키를 누른 채 JButton을 하나씩 선택하여 네 개를 모두 선택합니다.
  2. 그 중 하나를 마우스 오른쪽 버튼으로 클릭하고 팝업 메뉴에서 동일한 크기 > 동일한 너비를 선택합니다.

    JButton이 가장 긴 이름이 있는 버튼과 같은 크기로 설정됩니다.

이전 절차의 데모를 보려면 데모 보기를 클릭합니다.

들여쓰기

여러 구성 요소를 다른 구성 요소 아래에 클러스터로 지정하여 관련된 기능 그룹에 속한 것을 나타내야 하는 경우가 있습니다. 예를 들어 같은 레이블 아래에 서로 관련된 여러 확인란을 배치하는 경우가 있습니다. GUI 작성기를 사용하면 운영 체제의 모양 및 색감에 맞게 기본 오프셋을 제안하는 특수 지침을 제공하여 들여쓰기를 쉽게 해낼 수 있습니다.

이 절에서는 JLabel 아래에 JRadioButton 몇 개를 추가하여 사용자가 응용 프로그램의 데이터 표시 방법을 사용자 정의할 수 있게 합니다. 작업을 수행하는 동안 다음 그림을 참조하거나, 절차 뒤의 데모 보기 아이콘을 클릭하여 대화식 데모를 보십시오.

JLabel아래에서 JRadioButton을 들여쓰기하려면

  1. Mail Format이라는 이름의 JLabel을 JList 아래의 폼에 추가합니다. 레이블이 위에 있는 JList와 왼쪽 정렬되어 있는지 확인합니다.
  2. 팔레트 창의 Swing 범주에서 JRadioButton 구성 요소를 선택합니다.
  3. 커서를 방금 추가한 JLabel 아래로 이동합니다. JRadioButton의 왼쪽 가장자리가 JLabel의 왼쪽 가장자리와 정렬된 것을 나타내는 지침이 표시되면 보조 들여쓰기 지침이 나타날 때까지 JRadioButton을 오른쪽으로 조금씩 이동합니다. Shift 키를 누른 채 클릭하여 첫 번째 라디오 버튼을 배치합니다.
  4. 커서를 첫 번째 JRadioButton의 오른쪽으로 이동합니다. 제안된 구성 요소 간격에 주의하며 Shift 키를 누른 채 클릭하여 두 번째 및 세 번째 JRadioButton을 배치합니다. 마지막 JRadioButton 위치를 지정하기 전에 Shift 키를 놓아야 합니다.
  5. 각 JRadioButton을 두 번 클릭하고 각 이름에 원하는 텍스트를 입력합니다. 왼쪽 라디오 버튼에 HTML을, 두 번째 라디오 버튼에 Plain Text를, 세 번째 라디오 버튼에 Custom을 입력합니다.

    세 개의 JRadioButton이 폼에 추가되고 Mail Format JLabel 아래에서 들여쓰기됩니다.


이제 세 개의 JRadioButton을 ButtonGroup에 추가하여 한 번에 한 라디오 버튼만 선택할 수 있게 하는 토글 동작을 사용할 수 있게 해야 합니다. 그러면 NameFinder 응용 프로그램의 연락처 정보가 선택한 메일 형식으로 표시됩니다.

JRadioButton을 ButtonGroup에 추가하려면

  1. 팔레트 창의 Swing 범주에서 ButtonGroup 구성 요소를 선택합니다.
  2. GUI 작성기 디자인 영역 안을 아무 곳이나 클릭하여 ButtonGroup 구성 요소를 폼에 추가합니다. ButtonGroup이 폼 자체에는 나타나지 않지만 검사기의 기타 구성 요소 영역에는 표시됩니다.
  3. 폼에서 세 개의 JRadioButton을 모두 선택합니다.
  4. 등록 정보 창에 있는 buttonGroup 등록 정보 콤보 상자에서 buttonGroup1을 선택합니다.

    세 JRadioButton이 버튼 그룹에 추가됩니다.

이전 절차의 데모를 보려면 데모 보기를 클릭합니다.

 


마지막 조정

ContactEditor 응용 프로그램 GUI의 틀을 만드는 데 성공했지만, 아직 몇 가지 할 일이 남아 있습니다. 이 절에서는 GUI 작성기에서 간소화해주는 일반적인 레이아웃 태스크를 몇 가지 더 살펴 보겠습니다.

마무리

이제 사용자가 개별 연락처에 입력하는 정보를 확인하고 연락처 목록에 추가하거나 취소하고 데이터베이스를 변경하지 않은 채로 남겨 두는 데 사용할 수 있는 버튼을 추가해야 합니다. 이 단계에서는 두 개의 필수 버튼을 추가한 후 표시 텍스트의 길이가 달라도 폼에서 같은 크기로 나타나게 편집합니다.

버튼의 표시 텍스트를 추가 및 편집하려면

  1. JFrame 폼의 아래쪽 가장자리까지 아래쪽 JPanel을 확장한 경우에는 JFrame의 아래쪽 가장자리를 아래로 끕니다. 그러면 JFrame의 가장자리와 JPanel의 가장자리 사이에 OK 및 Cancel 버튼이 들어갈 공간이 생깁니다.
  2. 팔레트 창의 Swing 범주에서 JButton 구성 요소를 선택합니다.
  3. 커서를 폼 위에서 E-mail JPanel의 아래쪽으로 이동합니다. JButton의 오른쪽 가장자리가 JFrame의 오른쪽 아래 모서리에 정렬된 것을 나타내는 지침이 표시되면 클릭하여 단추를 배치합니다.
  4. JFrame의 아래쪽 가장자리를 따라 제안된 간격을 사용하여 첫 번째 JButton 왼쪽에 다른 JButton을 추가합니다.
  5. 각 JButton을 두 번 클릭하여 표시 텍스트를 선택합니다. 왼쪽 버튼에 OK를 입력하고 오른쪽 버튼에 Cancel을 입력합니다. 버튼의 너비가 새 이름에 맞게 변경됩니다.
  6. 두 JButton을 모두 선택한 후 그 중 하나를 마우스 오른쪽 버튼으로 클릭하고 팝업 메뉴에서 동일한 크기 > 동일한 너비를 선택하여 두 JButton을 같은 크기로 설정합니다.

    JButton 구성 요소가 폼에 나타나고 해당 노드가 검사기 창에 표시됩니다. JButton 구성 요소의 코드도 편집기의 소스 뷰에서 볼 수 있는 폼의 소스 파일에 추가됩니다. 각 JButton은 가장 긴 이름이 있는 버튼과 같은 크기로 설정됩니다.

마지막으로 해야 할 일은 다양한 구성 요소에서 자리 표시자 텍스트를 삭제하는 것입니다. 폼이 틀을 갖춘 후에 자리 표시자 텍스트를 제거하는 것은 구성 요소 정렬 및 앵커 관계 문제를 방지할 수 있는 유용한 기술이지만, 대부분의 개발자들은 폼에서 레이아웃을 진행하는 도중에 이 텍스트를 제거합니다. 폼을 훑어 보면서 각 JTextField의 자리 표시자 텍스트를 선택하여 삭제합니다. 여기서는 뒤의 자습서에서 사용할 수 있도록 JComboBox와 JList의 자리 표시자 항목을 그대로 남겨 두겠습니다.

이전 절차의 데모를 보려면 데모 보기를 클릭합니다.

 


GUI 미리 보기

이제 ContactEditor GUI를 성공적으로 작성했으니 인터페이스를 사용하여 결과를 확인할 수 있습니다. 작업을 진행하면서 GUI 작성기의 도구 모음에 있는 폼 미리 보기 버튼()을 클릭하면 폼을 미리 볼 수 있습니다. 폼이 자체 창에서 열리며 작성 및 실행 전에 테스트해 볼 수 있게 됩니다.

 


GUI 응용 프로그램 배포

GUI 작성기에서 생성된 인터페이스가 IDE 외부에서 작동하려면 응용 프로그램을 배포할 때 다양한 레이아웃 관련 확장이 포함된 외부 라이브러리를 포함해야 합니다. NetBeans 5.0 GUI 작성기는 Swing 레이아웃 확장 라이브러리를 사용하기 때문에 런타임에는 이 라이브러리도 응용 프로그램의 클래스 경로에 있어야 합니다.

Swing 레이아웃 확장 라이브러리의 JAR 파일은 시스템의 다음 위치에서 찾을 수 있습니다.

NetBeans_installation_folder/ide6/modules/ext/swing-layout-installed_version.jar
독립형 GUI 응용 프로그램 배포 및 실행

GUI 응용 프로그램에서 런타임에 자동으로 Swing 레이아웃 확장 라이브러리를 사용할 수 있도록 IDE는 프로젝트를 작성할 때마다 JAR(및 프로젝트의 클래스 경로에 있는 다른 모든 JAR 파일)을 dist/lib 폴더에 자동으로 복사합니다. IDE에서는 각 JAR 파일을 응용 프로그램 JAR 파일의 manifest.mf 파일에 있는 Class-Path 요소에 추가합니다.

IDE 외부의 배포를 위해 GUI 응용 프로그램을 준비하려면

  1. 프로젝트의 dist 폴더(lib 폴더 포함)를 ZIP 아카이브로 압축합니다.

명령줄에서 독립형 GUI 응용 프로그램을 실행하려면

  1. 프로젝트의 dist 폴더로 이동합니다.
  2. 다음을 입력합니다.
    java -jar <jar_name>.jar

주: NetBeans IDE의 pre-release 버전을 사용하거나 다음 오류가 발생하는 경우:
Exception in thread "main" java.lang.NoClassDefFoundError: org/jdesktop/layout/GroupLayout$Group

manifest.mf 파일에서 현재 설치된 버전의 Swing 레이아웃 확장 라이브러리를 참조하는지 확인하십시오.

레이아웃 확장 라이브러리에 대한 자세한 내용은 Swing 레이아웃 확장 프로젝트를 참조하십시오.

 


추가 자료

이제 IDE의 GUI 작성기 자습서를 완료했습니다. NetBeans IDE 사용에 대한 자세한 내용은 다음을 참조하십시오.

  • Matisse GUI 작성기 FAQ. NetBeans GUI 작성기 사용에 관한 유용한 팁과 방법을 모아 두었습니다.
  • NetBeans 온라인 도움말. NetBeans IDE 자체에 포함된 설명서입니다. 온라인 도움말을 열려면 F1 키를 누르십시오.
  • NetBeans IDE 사용. NetBeans IDE에서 Java 응용 프로그램을 개발하는 경우에 대한 전체 설명서입니다.
  • NetBeans 지원 및 문서. NetBeans IDE 사용자를 위한 자료, FAQ 및 메일링 목록이 있는 전체 목록입니다.


원문 출처 : http://www.netbeans.org/kb/50/quickstart-gui_ko.html

2007/05/29 17:16 2007/05/29 17:16
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

인연 - 피천득

인연. 피천득

지난 사월 춘천에 가려고 하다가 못 가고 말았다.
나는 성심여자대학에 가보고 싶었다. 그 학교에 어느 가을 학기, 매주 한 번씩 출강한 일이 잇다. 힘드는 출강을 한 학기 하게 된 것은, 주 수녀님과 김 수녀님이 내 집에 오신 것에 대한 예의도 있었지만 나에게는 사연이 있었다.

수십 년전 내가 열일곱 되던 봄, 나는 동경에 간 일이 잇다. 어떤 분의 소개로 사회 교육가 미우라선생 댁에 유숙을 하게 되었다. 시바꾸 시로가네에 있는 그 집에는 주인 내외와 어린 딸 세 식구가 살고 있었다.

하녀도 서생도 없었다. 눈이 예쁘고 웃는 얼굴을 하는 아사꼬는 처음부터 나를 오빠같이 따랐다. 아침에 낳았다고 아사꼬라는 이름을 지어주었다고 하였다. 그 집 뜰에는 큰 나무들이 있었고 일년초 꽃도 많았다. 내가 간 이튿날 아침, 아사꼬는 '스위트피'를 따다가 꽃병에 담아 내가 쓰게 된 책상 위에 놓아주었다. '스위트피'는 아사꼬같이 어리고 귀여운 꽃이라고 생각하였다.

성심여학원 소학교 일 학년인 아사꼬는 어느 토요일 오후 나와 같이 저희 학교까지 산보를 갔었다. 유치원부터 학부까지 있는 카톨릭 교육 기관으로 유명한 이 여학원은 시내에 있으면서 큰 목장까지 가지고 있었다. 아사꼬는 자기 신발장을 열고 교실에서 신는 하얀 운동화를 보여주었다.

내가 동경을 떠나던 날 아침, 아사꼬는 내 목을 안고 내 뺨에 입을 맞추고, 제가 쓰던 작은 손수건과 제가 끼던 작은 반지를 이별의 선물로 주었다. 옆에서 보고 있던 선생 부인은 웃으면서 "한 십년 지나면 좋은 상대가 될 거예요" 하였다. 나는 얼굴이 더워지는 것을 느꼈다. 나는 아사꼬에게 안델센의 동화책을 주었다.

그후 십 년이 지나고 삼사 년이 더 지났다. 그동안 나는 국민학교 일 학년 같은 예쁜 여자 아이를 보면 아사꼬 생각을 하였다. 내가 두번째 동경에 갔던 것도 사월이었다. 동경역 가까운 데 여관을 정하고 즉시 미우라 댁을 찾아갔다. 아사꼬는 어느덧 청순하고 세련되어 보이는 영양(令孃)이 되어 있었다. 그 집 마당에 피어 있는 목련꽃과도 같이,그때 그는 성심 여학원 영문과 삼 학년이었다. 나는 좀 서먹서먹했으나, 아사꼬는 나와의 재회를 기뻐하는 것 같았다. 아버지 어머니가 가끔 내 말을 해서 나의 존재를 기억하고 있었나 보다.

그날도 토요일이었다. 저녁 먹기 전에 같이 산책을 나갔다. 그리고 계획하지 않은 발걸음은 성심 여학원 쪽으로 옮겨져 갔다. 캠퍼스를 두루 거닐다가 돌아올 무렵, 나는 아사꼬 신발장은 어디 있느냐고 물어보았다. 그는 부슨 말인가하고 나를 쳐다보다가, 교실에는 구두를 벗지 않고 그냥 들어간다고 하였다. 그리고는 갑자기 뛰어가서 그
날 잊어버리고교실에 두고 온 우산을 가지고 왔다. 지금도 나는 여자 우산을 볼 때면 연두색이 고왔던 그 우산을
연상한다.

<쉘부르의 우산>이라는 영화를 내가 그렇게 좋아한 것도 아사고의 우산 때문인가 한다. 아사꼬와 나는 밤 늦게까지 문학 이야기를 하다가 가벼운 악수를 하고 헤어졌다. 새로 출판된 버지니아 울프의 소설 <세월>에 대해서도 이야기 한 것 같다.

그후 또 십여 년이 지났다. 그동안 제2차 세계대전이 있었고 우리나라가 해방이 되고 또 한국 전쟁이 있었다. 나는 어쩌다 아사꼬 생각을 하곤 했다. 결혼은 하였을 것이요, 전쟁통에 어찌 되지나 않았나, 남편이 전사하지나 않았나 하고 별별 생각을 다하였다. 1954년 처음 미국 가던 길에 나는 동경을 들러 미우라 댁을 찾아갔다. 뜻밖에 그 동네가 고스란히 그대로 남아 있었다. 그리고 미우라 선생네는 아직도 그집에서 살고 있었다. 선생 내외분은 흥분된 얼굴로 나를 맞이하였다. 그리고 한국이 독립이 돼서 무엇보다도 잘 됐다고 치하를 하였다. 아사꼬는 전쟁이 끝난 후 맥아더 사령부에서 번역 일을 하고 있다가. 거기서 만난 일본인 2세와 결혼을 하고 따로 나서 산다는 것이었다. 아사꼬가 전쟁 미망인이 되지 않은 것은 다행이었다. 그러나 2세와 결혼하였다는 것이 마음에 걸렸다. 만나고 싶다고 그랬더니 어머니가 아사꼬의 집으로 안내해 주었다.

뾰족 지붕에 뾰족 창문들이 있는 작은 집이었다. 이십여년 전 내가 아사꼬에게 준 동화책 겉장에 있는 집도 이런 집이었다."아, 이쁜집! 우리 이담에 이런 집에서 같이 살아요." 아사꼬의 어린 목소리가 지금도 들린다. 십년쯤 미리 전쟁이 나고 그만큼 일찍 한국이 독립되었더라면 아사꼬의 말대로 우리는 같은 집에서 살 수 있게 되었을지도 모른다. 뾰족 지붕에 뾰족 창문들이 있는 집이 아니라도 이런 부질없는 생각이 스치고 지나갔다.

그 집에 들어서자 마주친 것은 백합같이 시들어가는 아사꼬의 얼굴이었다. <세월>이란 소설 이야기를 한 지 십 년이더 지났었다. 그러나 그는 아직 싱싱하여야 할 젊은 나이다. 남편은 내가 상상한 것과 같이 일본 사람도 아니고, 미국 사람도 아닌 그리고 진주군 장교라는 뽐내는 것 같은 사나이였다. 아사꼬와 나는 절을 몇번씩 하고 악수도 없이 헤어졌다.

그리워하는 데도 한 번 만나고는 못 만나게 되기도 하고 일생을 못 잊으면서도 아니 만나고 살기도 한다. 아사꼬와 나는 세 번 만났다. 세번째는 아니 만났어야 좋았을 것이다.
오는 주말에는 춘천에 갔다 오려 한다. 소양강 가을 경치가 아름다울 것이다.

2007/05/29 12:57 2007/05/29 12:57
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다