jar 파일 포맷의 힘

2007/05/14 18:48

서비 JAVA ,

원문 출처 : http://www-128.ibm.com/developerworks/kr/library/j-jar/
* 본 글은 저의 저작물이 아니며 그런 이유로 제 블로그에 포스팅 하는 글에 대한 CCL의 영향을 받지 않습니다. *

대부분의 자바 프로그래머들은 JAR 파일의 기본 작동에 익숙하다. 하지만 JAR 파일 포맷의 막강한 힘을 아는 개발자는 드물다.

JAR 파일

JAR 파일 포맷은 대중적인 ZIP 파일 포맷을 근간으로 하여 많은 파일들을 하나로 모으는데 사용된다. ZIP 파일과는 달리 JAR 파일은 압축과 디스트리뷰션 뿐만 아니라 라이브러리, 컴포넌트, 플러그인 등의 전개와 캡슐화에도 사용되며 컴파일러나 JVM 같은 툴이 직접 사용하기도 한다. 전개 디스크립터 같이 JAR에 포함된 특별한 파일은 특정 JAR가 취급되는 방법을 툴에 지시한다.

JAR 파일은 다음과 같은 데에 사용된다:

JAR 파일 포맷은 많은 혜택과 기능을 제공하며 ZIP 또는 TAR 같은 전통적인 아카이브 포맷이 줄 수 없는 많은 것들을 제공한다. 이를 테면:

JAR의 압축과 압축풀기

jar 툴( jar 참조)은 파일을 기본적으로 압축한다. 압축이 풀린 JAR 파일은 압축된 JAR 파일 보다 더 빠르게 로딩될 수 있다. 로딩 시간 동안 파일의 압축 풀기 시간이 줄어들기 때문이다. 하지만 네트워크를 통한 다운로드 시간은 압축이 풀린 파일이 더 길다.

META-INF 디렉토리

대부분의 JAR 파일에는 META-INF 디렉토리가 포함되어 있는데 이는 패키지의 저장과 보안 및 버저닝 정보 같은 확장 설정 데이터를 저장하는데 사용된다. META-INF 디렉토리의 파일과 디렉토리는 Java2platform에서 인식 및 인터프리팅되어 애플리케이션, 확장, 클래스 로더를 설정한다:

jar 툴

JAR 파일로 기본적인 태스크를 수행하려면 자바 개발 킷의 일부로 제공되는 Java Archive Tool (jar 툴)을 사용한다. jar 툴을 jar 명령어로 호출한다. 표 1은 일반 애플리케이션이다:

표 1. jar 툴의 일반적인 사용

기능 명령어
개별 파일에서 JAR 파일 만들기 jar cf jar-file input-file...
디렉토리에서 JAR 파일 만들기 jar cf jar-file dir-name
압축 풀린 JAR 파일 만들기 jar cf0 jar-file dir-name
JAR 파일 업데이트 jar uf jar-file input-file...
JAR 파일 내용보기 jar tf jar-file
JAR 파일 내용 추출하기 jar xf jar-file
JAR 파일에서 특정 파일 추출하기 jar xf jar-file archived-file...
실행 JAR 파일로 패키지된 애플리케이션 실행하기 java -jar app.jar



위로


실행 JAR 파일

실행 JAR 파일은 특별히 설정된 JAR 파일에 저장된 독립적인 자바 애플리케이션이다. 파일을 추출하거나 클래스 경로를 설정하지 않고 JVM에 의해 직접 실행될 수 있다. 비 실행 JAR에 저장된 애플리케이션을 구동하려면 이를 클래스 경로에 추가하고 애플리케이션의 메인 클래스를 이름별로 호출해야한다. 하지만 실행 JAR 파일을 사용하면 이를 추출하거나 메인 엔트리 포인트를 알 필요 없이 애플리케이션을 실행할 수 있다.

실행 JAR 파일 만들기

실행 JAR 파일을 만들기는 쉽다. 모든 애플리케이션 코드를 하나의 디렉토리에 놓는 것으로 시작한다. 애플리케이션의 메인 클래스가 com.mycompany.myapp.Sample이라고 가정해보자. 애플리케이션 코드를 포함하고 메인 클래스를 구분하는 JAR 파일 생성이 필요하다. 이를 위해 라는 manifest 파일을 어딘가에(애플리케이션 디렉토리는 아니다) 만들고 여기에 다음 행을 추가한다:


Main-Class: com.mycompany.myapp.Sample

그런 다음 JAR 파일을 다음과 같이 만든다:


jar cmf manifest ExecutableJar.jar application-dir

실행 JAR 파일 시작하기

애플리케이션을 ExecutableJar.jar라는 실행 JAR 파일로 묶었으므로 다음 명령어를 사용하여 파일에서 직접 애플리케이션을 시작할 수 있다:


java -jar ExecutableJar.jar




위로


패키지 실링(sealing)

JAR 파일안에 패키지를 봉합(sealing)한다는 것은 이 패키지에 정의된 모든 클래스가 같은 JAR 파일에서 찾아져야 한다는 것을 의미한다. 이로서 패키지 작성자는 패키지된 클래스들의 버전 영속성을 강화할 수 있다. 봉합은 보안 조치도 제공하여 코드 탬퍼링을 탐지한다.

패키지를 봉합하려면 패키지용 Name 헤더를 추가한다. 그 뒤에 Sealed 헤더 값을 JAR manifest 파일에 대해 "true"로 한다. 실행 JAR 파일과 마찬가지로 manifest 파일을 적절한 헤더 엘리먼트로 지정하여 JAR를 봉합할 수 있다:


Name: com/samplePackage/
Sealed: true

Name 헤더는 패키지의 관련 경로명을 정한다. 파일이름과 구별되도록 "/"로 끝난다. Name 헤더에 뒤따르는 모든 헤더는 공백 라인 없이 Name 헤더에 지정된 파일이나 패키지에 붙는다. 위 예제에서 Sealed 헤더가 공백 라인 없이 Name 헤더 다음에 발생했기 때문에 Sealed 헤더는 com/samplePackage 패키지에만 붙는것으로 인터프리팅된다.

확장 패키징

확장은 자바 플랫폼에 기능을 추가한다. 확장 메커니즘은 JAR 파일 포맷에 구현된다. 확장 메커니즘으로 JAR 파일이 다른 필요한 JAR 파일들을 Class-Path 헤더를 통해 manifest 파일에 지정할 수 있다.

extension1.jar와 extension2.jar가 같은 디렉토리 안의 두 개의 JAR 파일에 있다고 가정해보자. extension1.jar의 manifest는 다음 헤더를 포함하고 있다:


Class-Path: extension2.jar

이 헤더는 extension2.jar의 클래스들이 extension1.jar의 클래스를 목표에 맞춘 확장 클래스로서 작용한다는 것을 나타내고 있다. extension1.jar의 클래스들은 extension2.jar가 클랫의 경로의 일부가 될 필요 없이 extension2.jar의 클래스를 호출할 수 있다.

예를 들어 ExtensionDemo 클래스를 레퍼런싱하는 ExtensionClient 클래스가 ExtensionClient.jar라고 하는 JAR 파일에 번들되었고 ExtensionDemo 클래스가 ExtensionDemo.jar에 번들되었다고 가정해보자. ExtensionDemo.jar가 확장으로 취급되기 위해서는 ExtensionDemo.jar는 ExtensionClient.jar의 manifest 안의 Class-Path 헤더에 리스트되어야 한다:


Manifest-Version: 1.0
Class-Path: ExtensionDemo.jar




위로


JAR 파일의 보안

JAR 파일은 jarsigner 툴을 사용하거나 java.security API를 통해서 직접 서명될 수 있다. 서명된 JAR 파일은 원래 JAR 파일과 정확히 같다. manifest만이 업데이트 된 것과 두 개의 추가 파일들이 META-INF 디렉토리에 추가된 것을 제외하고.

Keystore 데이터베이스에 저장된 인증을 사용하여 JAR 파일은 서명된다. Keystore에 저장된 인증은 패스워드로 보호된다.


그림 1. Keystore 데이터베이스
Keystore Database

JAR의 각 서명자는 JAR 파일의 META-INF 디렉토리안에 있는 .SF 확장자가 붙은 서명으로 표현된다. 이 파일의 포맷은 manifest 파일과 비슷하다. 메인 섹션과 개별 엔트리들로 구성되어 있다. 서명된 JAR에서 오는 파일을 확인하기 위해 서명 파일의 다이제스트 값은 JAR 파일의 상응 엔트리에 대비하여 계산된 다이제스트와 비교된다.


Listing 1. Manifest와 서명 파일

Contents of signature file META-INF/MANIFEST.MF

Manifest-Version: 1.0
Created-By: 1.3.0 (Sun Microsystems Inc.)

Name: Sample.java
SHA1-Digest: 3+DdYW8INICtyG8ZarHlFxX0W6g=

Name: Sample.class
SHA1-Digest: YJ5yQHBZBJ3SsTNcHJFqUkfWEmI=

Contents of signature file META-INF/JAMES.SF

Signature-Version: 1.0
SHA1-Digest-Manifest: HBstZOJBuuTJ6QMIdB90T8sjaOM=
Created-By: 1.3.0 (Sun Microsystems Inc.)

Name: Sample.java
SHA1-Digest: qipMDrkurQcKwnyIlI3Jtrnia8Q=

Name: Sample.class
SHA1-Digest: pT2DYby8QXPcCzv2NwpLxd8p4G4=

디지틀 서명

디지틀 서명은 .SF 서명 파일의 서명완료된 버전이다. 디지틀 서명 파일은 바이너리 파일이며 .SF 파일과 같은 파일이름을 갖고 있지만 다른 확장이다. 확장은 디지틀 서명 유형에 따라 다양하고 (RSA, DSA, PGP). JAR 서명에 사용된 인증 유형에 따라 다르다.

Keystore

JAR 파일에 서명하려면 프라이빗 키를 가져야 한다. 프라이빗 키와 관련 퍼블릭 키 인증은 패스워드로 보호된 데이터베이스(keystores)에 저장된다. JDK는 Keystore를 구현 및 변경하는 툴을 포함하고 있다. Keystore의 각 키는 앨리어스에 의해 구분되는데 전형적으로 키를 소유한 서명자의 이름이다.

모든 Keystore 엔트리들은 고유 앨리어스로 액세스된다. 앨리어스는 Keystore에 엔터티를 추가할 때 keytool -genkey 명령어를 사용하여 지정되어 키 쌍을 만든다. 뒤따르는 keytool 명령어는 이와 같은 앨리어스를 사용하여 엔터티를 언급해야 한다.

예를 들어 "james"라는 앨리어스로 새로운 퍼블릭/프라이빗 키 쌍을 만들고 퍼블릭 키를 자가 서명된 인증으로 래핑하려면 다음 명령어를 사용한다:


keytool -genkey -alias james -keypass jamespass
-validity 80 -keystore jamesKeyStore
-storepass jamesKeyStorePass

jarsigner 툴

jarsigner 툴은 Keystore를 사용하여 JAR 파일에 대한 디지틀 서명을 만들거나 확인한다.

위 예제에서 처럼 "jamesKeyStore" Keystore를 만들었고 여기에 "james" 앨리어스와 키를 포함하고 있다고 가정해보자. 다음 명령어로 JAR 파일에 서명할 수 있다:


jarsigner -keystore jamesKeyStore -storepass jamesKeyStorePass
-keypass jamespass -signedjar SSample.jar Sample.jar james

이 명령어는 앨리어스가 "james"이고 패스워드가 "jamespass"인 키를 보내 Sample.jar 파일에 서명하고 SSample.jar라는 서명된 JAR를 만든다.


jarsigner -verify SSample.jar




위로


JAR 인덱싱(indexing)

애플리케이션 또는 애플릿이 다중의 JAR 파일들로 번들된다면 클래스 로더는 단순한 리니어 검색 알고리즘을 사용하여 클래스 경로의 엘리먼트를 검색한다. 클래스 로더가 존재하지 않은 리소스를 찾으려고 하면 애플리케이션 또는 애플릿 내의 모든 JAR 파일들은 다운로드 되어야한다. 큰 네트워크 애플리케이션과 애플릿의 경우 늦은 시작, 지연된 응답, 네트워크 대역 낭비를 초래한다.

JDK 1.3 이후 JAR 파일 포맷은 인덱싱(indexing)을 지원하여 네트워크 애플리케이션(특히 애플릿)의 클래스 검색 프로세스를 최적화했다. JarIndex 메커니즘은 애플릿 또는 애플리케이션에 정의된 모든 JAR 파일의 내용을 모아 첫 번째 JAR 파일의 인덱스 파일에 이 정보를 저장한다. 첫 번째 JAR 파일이 다운로드된 후에 애플릿 클래스 로더는 모아진 콘텐트 정보를 사용하여 JAR 파일을 효율적으로 다운로드한다. 이 디렉토리 정보는 INDEX.LIST라는 이름으로 간단한 텍스트 파일로 저장된다.(META-INF 디렉토리).

JarIndex 만들기


그림 2. JarIndex
JarIndex Demo

다음 명령어를 사용하여 JarIndex_Main.jar, JarIndex_test.jar, JarIndex_test1.jar용 인덱스 파일을 만든다:


jar -i JarIndex_Main.jar JarIndex_test.jar SampleDir/JarIndex_test1.jar

INDEX.LIST 파일은 간단한 포맷을 갖고 있으며 색인된 JAR 파일에 저장된 패키지 또는 클래스 이름을 포함하고 있다.(Listing 2):


Listing 2. JarIndex INDEX.LIST 파일

JarIndex-Version: 1.0

JarIndex_Main.jar
sp

JarIndex_test.jar
Sample

SampleDir/JarIndex_test1.jar
org
org/apache
org/apache/xerces
org/apache/xerces/framework
org/apache/xerces/framework/xml4j



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

Sony Alpah new line

소니 DSLR 후속기종에대한 소식이 솔솔 풀려나고 있습니다.
올 하반기에 중급기와 FF바디인 플래그쉽이 모두 나올거 같은데요..

지금까지는 DSLR에 대한 동경같은게 거의 없었는데.. 플래그십 나오면 마음이 동 할지도 모르겠습니다.

문제는 가격인데.. 타 브랜드의 플래그쉽 가격으로 미루어보더라도 살인적인 가격까지는 아니더라도 출시 후 한동안은
바라만 봐야 하는 수준의 가격대이지 않을까 하는 생각이 드네요..


사용자 삽입 이미지
- 이미지 출처 : DC inside -

바디도 바디지만 같이 출시하는 자이즈렌즈군도 가슴을 설레게 하는군요..
바디를 못산다면 렌즈 한개만이라도 어떻게 써 봐야 겠습니다...
2007/05/09 13:34 2007/05/09 13:34
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

2007 Hi Seoul Festival

어린이날을 맞아 한강시민공원에서 펼쳐진 하이서울 페스티발 현장을 다녀왔더랬습니다.

비올거란 구라청의 예상은 역시나 보기좋게 빗나가고 더위에 허덕일 정도의 기온이 계속 되었죠.. ^^;;

2시깨에 도착 했는데 행사장은 DJ페스티발로 시끌시끌... 처음엔 그 소음에 정신을 못차리겠더니 시간이 조금 흐르고 분위기에 익숙해지니 괜찮아 지더군요.

행사장 천막으로 빙~ 둘러서 많은 행사들이 진행된 덕에 유쾌한 시간 보냈습니다.


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

로코클럽 세미누드 촬영회

로코클럽 촬영회

지난 주말은 정말 정신없는 시간 보냈습니다.
금요일, 토요일은 회사 워크샵이었고,, 토요일 오전 일찍 서울로 돌아와 결혼식으로 잠시 귀국한 후배녀석 식장에 들렀다가
곧바로 제가 속한 모 온라인 사진동호회의 촬영회에 참석 하였습니다.

이번 촬영회는 충무로 소재 모 호프집을 대여하여 진행 했습니다. 저는 아직까지는 딱히 '누드 찍어 보고싶다.'는 바람을 가지고 있는 편이
아니었지만 기회도 되었고하니 누드 촬영회장의 분위기를 맛보기 위한 목적으로 참석 하였습니다. 그런 이유로 촬영장비도 본격적으로
준비하지 않고 갔더랬습니다. 식장을 들렀다 간 탓에 제가 도착했을때는 이미 많은분들이 사진 촬영에 열을 올리고 계시더군요. 

2월 출사이후 처음뵙는 이창성님은 말쑥하게 양복을 차려입고 계시더군요..
온라인상으로만 알고 지낸 박상욱님도 뵐 수 있었습니다.

이번 모델 촬영 역시 여느 스튜디오 '단체'출사와 마찬가지로 많은 사진사분들이 소수의 모델분을 촬영 하다보니
조명의 배치나 모델분의 포즈를 제 마음대로 표현하는건 힘들었습니다.

이번 촬영회를 통하여 제 사진의 표현력이 부족함을 다시한번 느낄 수 있는 계기가 되었고 그와 더불어 사진을 돋보이게 하는 감각과 후보정 기술에 대한 관심이 조금 더 늘었습니다.

누드 촬영회에 참여해서 촬영분위기를 파악해 본다는 원래 취지를 생각해보면 역시 참여하기 잘했다는 생각입니다.

촬영회 분위기
2007/04/30 11:49 2007/04/30 11:49
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

쎄로( cyril ) 는 진짜 초능력자가 아닐까..

이 동영상은 제가 제작한 동영상이 아니므로 제가 저작권자가 아니며
그런 이유로 제 블로그에 포스팅 하는 글에 대한 CCL의 영향을 받지 않음을 밝혀둡니다.
---------------------------------------------------------------------------

마술은 눈속임이란걸 머리로 이해하면서 봐도 놀라운 쎄로의 마술.
정말로 쎄로는 초능력자이거나 외계인이 아닐까..?

2007/04/29 20:40 2007/04/29 20:40
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

時をかける少女 - 시간을 달리는 소녀

시간을 달리는 소녀



작년 개봉당시 리나양님의 포스팅으로
'시간을 달리는 소녀'의 극장판 애니메이션이 개봉 됐다는 소식을 접하고 죽
이 애니메이션을 볼 수 있는 날을 기대 해오다 어제 기회가 되어 드디어 보게 되었습니다.


시간을 달리는 소녀 삽입곡 : Song by 華子


가사를 살짝 음미해 볼까요..




시간을 달리는 소녀

약간 심심한듯하면서도 섬세하고 미려한 그림체와 등장인물의 성격이 잘 묻어나는
성우의 목소리..

리냐양님의 포스팅에서도 알수 있지만 '학원물'이면서 사건의 진행과 여주인공의
감정의 이동을 '달려서 시간을 거슬러올라간다' 는 장치를 통해 진행하고 있습니다.
SF의 요소가 들어있지만 이 부분은 어디까지나 이야기를 끌어가기위한 장치/소품이며
이 애니메이션의 중심에는 누구나 겪어 봤음직한 성장기 소녀의 감정이 있습니다.

늘 주위에 있던 친한 사람으로부터 자기를 진심으로 좋아하고 있다는 고백을 받았을 때
그 사람에 대한 감정을 자신도 모르는 상태라면?
당신이라면 어떻게 하겠습니까?
우리의 주인공 소녀는 시간을 거슬러 갈 수 있기 때문에 그 고백의 순간을 없었던 것으로
해 버리려 하지만 그러면 그럴수록 일이 꼬여 가며 그런와중에 자신의 감정을 확인하게 됩니다..
(물론 아래에 소개할 이모의 배려심 깊은 충고도 한몫 하지만요.)

이 애니에서 호감가는 스타일의 인물을 있습니다... 바로 이분!!
시간을 달리는 소녀
시간을 달리는 소녀

마코토가 마녀아줌마라고 부르는 요시야마상 .. 목소리와 말투가 너무 마음에 들고, 차분하며 상대의 감정을 잘 헤아리는 점에 홀랑 빠져버렸습니다..
목소리를 딱 듣는순간 2000년 작 Love Song 에 출연한 하라 사치에 상이 아닐까 하는 생각이
들 정도로 목소리가 비슷합니다.(정말로 그녀가 목소리 연기를 했을 수도 있구요..
-- 자료를 찾아보니 역시 그녀가 맞군요 ^^ )
어쨌든 매력적인 보이스입니다.


이미 보신분도 계실거고 원작이나 코믹스로 접하신 분들도 계실겁니다. 내용을 말해버리면 스포일러가 될것이고..

몇장의 스틸컷을 보는걸로 정리 하도록 하겠습니다.

시간을 달리는 소녀
시간을 달리는 소녀
시간을 달리는 소녀
시간을 달리는 소녀
시간을 달리는 소녀
시간을 달리는 소녀
시간을 달리는 소녀
시간을 달리는 소녀
시간을 달리는 소녀
시간을 달리는 소녀
시간을 달리는 소녀
시간을 달리는 소녀
시간을 달리는 소녀
시간을 달리는 소녀
시간을 달리는 소녀
시간을 달리는 소녀
시간을 달리는 소녀
시간을 달리는 소녀

정말 오랜만에 가슴한 구석이 아련해지는 애니를 접해서 기분이 좋습니다.

참고로 이 작품의 제작진이나 간략 스토리, 등장인물등이 궁금하시면
http://www.tojapan.co.kr/culture/ani/pds_content.asp?number=941
요기를 보시면 됩니다.
2007/04/28 20:32 2007/04/28 20:32
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다
  1. 2007/05/04 12:55
  2. 2007/06/04 18:10
  3. 2008/02/11 15:42
    시간을 달리는 소녀 Tracked from bada's style

Developing a Blog in < 10 Minutes with NetBeans

원문 출처 : http://www.netbeans.org/kb/samples/rapid-ruby-weblog.html?me=1
입니다. 원문에 대한 저작권자는 제가 아니며 이글은 위 아티클에대한 2차 가공물임을
알려드립니다.



한 때 (지금도 여전하지만 ) 루비온 레일로 10여분만에 뚝딱하고 블로그를 생성하던
스크린캐스팅을 보고 경악을 금치 못했던 기억이 새록새록하군요.
(비록, 실제개발에서 얼마나 유용할지에 대한  그런 보여주기식의 스크린캐스팅에 심기가 불편하신 분들도 분명 계시겠지만요.)

netbeans.org 아티클 중에 넷빈즈와 jdk6.0상에서 루비를 이용하여 이와같은 작업을 해내는 기사가 있어 포스팅 합니다.

준비물은 JDK 6NetBeans IDE 6.0 Milestone 8 그리고 Ruby Pack(넷빈즈에 포함) 입니다.

[Flash] http://www.yunsobi.com/tt/subby/attachment/1219129927.swf

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

넷빈즈(NetBeans) 실행하기 - Option 둘러보기 v1.0


사용자 삽입 이미지
 
 
넷빈즈에 프로젝트를 생성하고 java소스를 편집하면 처음 모습은 이렇다..
뭔가 좀 불편해 보인다. 라인넘버도 없고 글자체도 뚜렸하지 않아 무슨 글잔지 모르겠고..
 
개발자에 따라선 편리한 수많은 기능보다는 항상 접하고 눈으로 코드를 보게되는
에디터의 폰트하나, 색상하나에 호불호를 결정하는 사람도 꽤 있으리라 생각한다.
( 본인 역시 그렇지 않다곤 못하겠다.. ^^;; )
 
이번 강좌에선 Option 설정을 통해 이런 부분을 본인 취향에 맞게 수정 해 보자.

넷빈즈를 기동하고 메뉴에서 Tools -> Options 를 선택하면 아래와 같은 대화창이 뜬다.
 
사용자 삽입 이미지

항목들 참 많기도 하다...

큰 카테고리별로 보면

Building : Ant 설정 항목이다. 넷빈즈 4.1은 Ant 1.6.* 대를 번들 하고 있으며 이곳에서
              다른 버전의 Ant를 설정 한다. 참고로 Ant 스크립트까지 여기서 설정 하진 않는다.
              구체적인 Ant 스크립트는 프로젝트를 생성 한 후 각 프로젝트 별로 설정 한다.
Collaboration : 넷빈즈 4.1 부터 번들되기 시작한 모듈로 넷빈즈에 채팅 기능이 들어가 있다고
               생각 하면 된다.. 하지만 IDE에 단순 채팅 기능이 들어가 있다면 큰 의미가 없을 것이다.
               Collaboration 은 다른 넷빈즈 개발자와 함께 같은 소스를 공유하고 함께 수정,컴파일,
               실행 해 볼 수 있다.. 자리를 바꿔가며 개발하는 XP가 아닌 자신의 PC에서 원격의
               상대방과 함께 진행하는 XP가 가능하다.
Editing : 말 그대로 IDE에 있는 편집기에 대한 각종 설정을 할 수 있다.
IDE Configuration : IDE메뉴와 메뉴아이콘에 대한 설정이 들어있으며 메뉴의 이동 삭제 추가 등을
                설정 한다.
Source Creation and Managemenrt : 각종 소스 타입에 따른 템플릿과 버전관리 시스템을
                관리한다.  기본적으로 등록되어 있는 템플릿만 100여개 남짓하며, 물론 기존 템플릿을
                수정 하거나 자신만의 템플릿을 등록 하는것도 가능하다.
                버전관리 시스템은 기본적으로 CVS, PVCS, Visual Source Safe 를 사용 할 수 있도록
                준비 되어 있다.
Testing : 넷빈즈에는 JUnit이 번들되어 있어 별다른 설정없이 유닛 테스트가 가능하며
               Update Center ( http://www.yunsobi.com/tt/subby/37 )를 통해
               NetBeans Extention JUnit 이나 Jellytools, Jemmy Module 같은
               3rd-party 테스트 모듈을 추가 할 수 있다.

위 에서 각 옵션 항목에 대해 간략 히 소개 했다.. 이번 강좌에서 저 몹션들을 모두 다루는건
무리일 것이다. 이번 강좌에는 넷빈즈를 처음열고 꼭 수정해야만 한다고 생각되고, 개발자들이
IDE에서 가장 많이 접하는 Editing 항목만 다루려한다.
나머지 부분은 강좌를 진행하면서 필요할 경우 그때그때 언급하기로 하겠다.

사용자 삽입 이미지


Editing - Editor Settings 항목을 펼치면 각 파일 타입에 대한 항목을 볼 수 있다.

사용자 삽입 이미지


오른편의 Global Key Bindings 항목을 연 화면이다.
소스를 편집하는 데 필요한 기능과 그에대한 단축키를 설정 할 수 있다.

사용자 삽입 이미지


파일 타입에 해당하는 Editor 항목을 열면 오른편 메뉴에서 Abbreviations 항목을 설정 할 수 있다.
말그대로 약어를 등록 해둘 수 있다. 위 화면을 예로들자면  
CSS파일 편집시 에디터에  bg 라고 타이핑 하면 background: 로 대치된다.

사용자 삽입 이미지

 
자..  우리가 손봐야할 자바 소스 에티터 항목을 열었다. 참 많이도 설정 가능하다..
하나하나 다 소개 하고 싶지만 항목을 선택하면 아래쪽에 간략한 소개글이 나오니 필요한 부분을
취향에 맞게 고치면 되겠다.
여기서는 글 서두에서 밝힌대로 폰트 설정과 줄번호 항목에 대해서만 짚고 넘어가겠다.
줄번호 항복은  오른편 메뉴에서 위에서 아홉번째 Line Numbers 항목에 있다.
디폴트로 체크 해제된 상태이다. 체크하면 에디터에서 라인 번호가 표시된다.
그 다음, 위에서 네번째 Font & Colors 항목 을 클릭하면 아래와 같은 대화 상자가 뜬다.
사용자 삽입 이미지

여기서 취향에 맞는 폰트와 색상을 지정하면 된다.  기본적으로 Monospaced 12 Plain

폰트를 사용하고 있다. Monospaced 폰트가 마음에 들지 않는 사람이라면 왼편 신택스 항목의
첫번째 Default 항목에서 Font를 수정하면 모든 신택스에 대해 일괄적으로 변경이 적용되며
각 신택스에 대한 고유한 설정은 신택스 항목을 선택하고 따로 변경 해 주면 된다.
위 화면에서 예시한 Java Keyword의 경우 bold의 Monospaced 라 글자를 알아보기 힘들다.
오른편 폰트 에어리어 아래쪽의 Inherit 항목을 체크하면 Default 항목으로 선택되어 있는
Font 항목이 적용 된다.
Background color 나 Foreground color 역시 각각 설정 가능하며 Inherit 항목을 체크 해
Default 값을 적용 할 수도 있다.

사용자 삽입 이미지


Java Keyword의 Font를 Default font인 Monospaced plain 을 inherit 했다.폰트가 깔끔해 졌다.
HTML,JSP,XML 역시 위와 같은 방법으로 원하는 형태로 에디터를 설정 하면 된다.

자.. 여기서 끝이 아니다. 한가지 더 짚고 넘어갈게 있다.
이 상태에서 프로젝트를 생성해서 에디터를  열고 소스를 편집하면 잘 눈 치채지 못하지만
사용하다보면 '어, 이거 왜 이렇게 해놨지?' 하고 생각 하게되는 부분이 있다.

보통 다른 편집기에서 tab 키를 일반 공백문자 4칸 혹은 8칸 크기로 설정해서 사용 할것이다.
넷빈즈의 경우도 다르지않다. 디폴트로 4칸의 공백문자 크기를 갖는데 문제는 에디터에서
tab 키를 누르면 공백문자 크기만큼 커서가 전진 하지만 tab문자로 전진하지 않고
space bar 를 네번 눌러 전진 한것처럼 동작한다.

혼자 개발 할때는 별 문제 될게 없다. 넷빈즈 에디터에서 열면 들여쓰기가 잘 된걸로 표현
될테니까..  하지만 보통은 협업으로 이루어지며, 다른 개발자도 넷빈즈를 사용한다고 볼 순 없다.
넷빈즈에서 에디팅한 소스를 다른 개발자가 다른 편집기에서 열어보면 짜증을 낼거다.
code indent는 잘 맞추어져있는데 탭을쓰면되는 곳에 왜 스페이스로 들여쓰기를 했냐고..
이 부분은 Editing - Indentation Engines 항목을 통해 교정이 가능하다.

사용자 삽입 이미지


사용자 삽입 이미지


Editing - Indentation Engines - Java Indentation Engine 항목을 클릭하여 오른편 Properties 항목을 보자.
첫번째 항목으로 Expand Tabs to Spaces 항목에 체크 되어 있다. 이 체크를 해제하면 비로소
tab 이 여타의 편집기에서 tab 키를 누른것처럼 기록 될 것이다.
항목 맨 아래쪽의 Statement Continuation Indent 는 여러줄에걸친 코드에서 다음줄로넘어간
경우 처음 탭 크기를 설정하는 부분이며
Number of Spaces per Indent 는 우리가 일반적으로 알고있는 tab에대한 space사이즈 설정부분이다.

사용자 삽입 이미지


마지막으로 짚고 넘어갈게 개발하다보면 자바소스를 특별히 인코딩 방식을 주어 개발해야하는 상황이 종종 발생한다.

Editing - Java Sources 에서 오른편 Default Encoding 항목에서 설정 할 수 있지만 특별한 경우가 아니라면 이곳에 인코딩 설정을 하는것은 추천하지 않는다.
지금까지 살펴본 옵션사항은 각각의 프로젝트에 따르게 적용되는부분이 아닌 넷빈즈 전체에 관한
설정이기 때문이다. 특별히 java 소스에 대한 인코딩이 필요한 프로젝트라면 프로젝트 생성 후
각 프로젝트에 대한 컴파일 인코딩옵션을 설정하는( -encoding UTF-8 , 이 방법 또한 이후 강좌에서 언급하겠다. ) 방식을 추천한다.

---------------------------------------------------------------------------

넷빈즈로 코드 한번 끄적여보기까지 많은 과정을 거쳐왔다...
여기까지가 준비 되었다면 프로젝트를 생성하고 코드를 작성 할 기본적인 준비가 되었다고 할 수 있다.
다음번 강좌부터는 본격적으로 코드와 함께 프로젝트 생성을 다루어 볼까 한다.

ps. 개인적인 지식에는 한계가 있기 마련입니다. 제가 잘못 생각하고 있거나 다른점이 있다면
바로바로 알려주세요.

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

넷빈즈(NetBeans) 실행하기 - ClassPath 설정 v1.0

교육의 목적으로 JAVA 코드를 작성해 보는게 아니라면(그렇다고 해도 역시 마찬가지지만)JAVA 개발에는 JDK외에 많은 외부 라이브러리를 가지고 개발을 진행한다.
외부 라이브러리의 클래스를 사용한 자바소스를 컴파일 하기 위해 환경변수 설정에 classpath 를 등록 하게 되는데..(너무 기본적인 내용이라 굳이 더 이상 언급하지 않겠다.)IDE를 사용 하게 되면 굳이 환경변수를 바꾸거나, 혹은 classpath 를 설정하는 배치 파일을 작성 할 필요가 없다.(심지어 환경변수에 classpath를 등록 할 필요조자 없다.)

이번 강좌에서는 넷빈즈에 외부라이브러리들을 등록하는 방법을 알아보자.
물론 이전 포스트에서 여러버전의 jdk를 등록하는게 가능했던것처럼 동일라이브러리라도
버전별로 혹은, 프로젝트에 필요한 라이브러리 단위등으로 관리 할 수 있음은 당연하다.

넷빈즈는 JDK를 플래폼 매니저가 관리한다면 외부라이브러리는 Library Manager 가 담당한다.
 

넷빈즈 netbeans

 Tool -> Library Manager 매니저를 선택하여 라이브러리 매니저로 이동한다.

넷빈즈 netbeans


  기본적으로 래이아웃, JSTL, JUnit 관련 라이브러리가 등록 되어 있다. 화면 하단의 New Library... 버튼을 클릭하여 라이브러리 등록 창을 연다.
 
 
넷빈즈 netbeans

 
넷빈즈 netbeans

라이브러리 매니저에서 관리할 라이브러리의 대표이름을 적는다.

넷빈즈 netbeans

새로 등록 한 라이브러리 이름을 선택하고 좌측의 classpath탭에서 Add JAR/Folder... 를 선택한다.

넷빈즈 netbeans

앞서 설정한 랑브러리 명칭에 포함해야 하는 jar 혹은 디렉토리를 하나 혹은 복수개를 선택하여 등록한다.

넷빈즈 netbeans

JAKARTA_COMMONS 라는 이름으로  자카르타 커먼스 프로젝트의 라이브러리 10개를 등록 했다.

넷빈즈 netbeans

JDK설정 편( http://www.yunsobi.com/tt/subby/38 )에서 했던것과 마찬가지로 해당 라이브러리에 대한 javadoc들을 등록한다.


넷빈즈 netbeans
 
위에서 설명한  New Library.. 설정 과정을 반복하여 몇개의 라이브러리를 더 등록 했다.
 
 
자.. 이전 강좌와 이번 강좌를 통해 JDK와 외부 라이브러리 등록 방법을 알아보았다.
이렇게 등록 했다고 해서 프로젝트를 생성하면 바로 적용 등록한 jdk와 라이브러리가
바로 적용 되는건 아니다.
 
앞서도 밝혔듯이 동일 jdk 혹은 라이브러리라도 다른버전을 한번에 관리 할 수 있기 때문에
프로젝트를 만들게 되면 어떤 jdk 를 쓸지, 어떤 라이브러리들을 사용할지 선택해 주는 과정을
거쳐야 한다.
( 강좌를 진행 해 나가면서 하나씩 짚고 넘어갈 것이다. )
 
한번에 하나의 프로젝트만 하고 끝낼거라면 굳이 이렇게 번거로운 등록 작업은 필요 없을것이다.
하지만 한번에 둘, 그 이상의 프로젝트를 진행하거나.. 참여한 프로젝트 수가 늘어갈 수록 이런
관리 방식은 IDE 안에서 많은것을 해결해 주는 좋은 솔루션이 될것이다.
 
 
 
ps. 개인적인 지식에는 한계가 있기 마련입니다. 제가 잘못 생각하고 있거나 다른점이 있다면
바로바로 알려주세요.
2007/04/27 10:12 2007/04/27 10:12
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

かくれんぼ - kakurenbo

카쿠렌보

숨바꼭질이라는 뜻의 카쿠렌보..
2004년 6월경에 출시한 24분짜리 단편 애닌데 이제야 감상하게 됐다.

특이한 점은 모든 화면구성을 3D로 처리한 후 카툰렌더링을 하여 2D 느낌이 나도록 구성 했다는 점이다.

(지금이야  카툰렌더링이 광고, 게임, PV등 다방면에서 쓰이고 있으니 뭐 그다지 새로운 기법은 아니다.)

제목은 숨바꼭질지만.. 장르는 어울리지 않게 호러물이다..
호러라고 해도 정말 오싹한 호러물은 아니다.

일본인에겐 익숙한 카미카쿠시를 숨바꼭질이란 소재에 적용하였고 등장하는 오니(우리말에 딱 들어맞는 대상이 없다. 도깨비 정도가 가장 어울릴까 )
들을 멋들어지게 표현하고 있어서 보는 내내 지겹지 않다.

다 보고나면 결말에 약간 아쉬움이 남을수도 있지만 독특한 소재의 애니를 찾는 사람이라면한번 볼만 할 듯,

자료를 찾다보니 작년 7월 21일 [kbs 독립영화관] 이란 프로그램에서 별의 목소리와 함께 카쿠렌보를 방영 했더랬다.
(관련 url : http://www.kbs.co.kr/1tv/enter/shortfilm/preview/index.html )

카쿠렌보

카쿠렌보

카쿠렌보



카쿠렌보
간을 뽑는 키모토리





카쿠렌보

기름을 뽑는 아부라토리




 

카쿠렌보
피를 뽑는 치토리






카쿠렌보

아이를 뺐는 코토리





카쿠렌보


카쿠렌보

카쿠렌보

카쿠렌보



카쿠렌보

이 아이의 운명은.. 그리고 남은 다섯번째 오니는 누구?
2007/04/26 17:08 2007/04/26 17:08
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

스즈미야 하루히12화 넘 멋짐.

스즈미야 하루히..
 
이번화는 감동 그자체.
 
하루히의 大팬서비스이자 하루히 스토리 전개상의 중심. 콘서트씬.
작화 퀄리티, 화면 구성, 음악. 너무멋짐.
 
하루히를 첫화부터 봐왔고 이번화를 큰 화면으로 본다면 콘서트씬의
박력에 온몸에 전율이 일 정도.
 
가이낙스의 뒤를이은 쿄토아니메의 오타쿠정신에 원츄를~

스즈미야 하루히

스즈미야 하루히

스즈미야 하루히

스즈미야 하루히

스즈미야 하루히

스즈미야 하루히

스즈미야 하루히

스즈미야 하루히





God knows
歌 : 스즈미야 하루히 (히라노 아야)
Lost my music
歌 : 스즈미야 하루히 (히라노 아야)
恋のミクル伝説 (사랑의 미쿠루 전설)
歌 : 아사히나 미쿠루 (고토 유코)

2007/04/26 16:12 2007/04/26 16:12
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다
  1. 확실히 이때의 장면은 멋졌죠. 하루히가 부른 God knows가 한때 국내에서도 트랜드를 형성할 정도였으니까요.

  2. 예 저역시 한동안 God knows 와 Lost my music을
    귀에 달고 살았더랬습니다. ^^

いっべん,死んでみる. :: 지옥소녀

지옥소녀 엔마아이 의 기억에 남는 せりふ.
15편까지 밖에 보진 못했지만... 짬 내서 끝까지 한번 봐줘야지..

지옥소녀

지옥소녀

지옥소녀

지옥소녀


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

태터데스크 베타테스터 응모

태터데스크 베타테스트 이벤트
"태터데스크와 함께라면 나도 편집장"


태터데스크 베타테스터에 응모하세요~  
응모자 중 100분을 추첨해 태터데스크를 2주간 우선적으로 사용해 보실 수 있는 기회를 드립니다.  베타테스터 전원에게 태터툴즈 기념품을, 우수 테스터 33명을 선정해 닌텐도 DSLite, 몰스킨 다이어리 등 푸짐한 상품을 드립니다~

<응모방법>아래의 빈 칸에 들어갈 문구를 채워서 완성된 문장을 여러분의 블로그에 올리신 후, 이 글에 트랙백 보내주세요. 태그는 '태터데스크' 입니다.

<정답> 태터데스크는 내 블로그 첫페이지를 꾸밀 수 있는 가장 간단하고 예쁜 방법 입니다.

정답 힌트는 여기에..  :-)

2007/04/25 17:39 2007/04/25 17:39
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

Ajax와 Java EE의 통합

2007/04/24 17:33

서비 JAVA , ,

원문 출처 : http://www.ibm.com/developerworks/kr/library/j-ajaxee/index.html

비동기식 통신 모델과 동기식 통신 모델을 효과적으로 혼합하기

IT 전문가 Patrick Gan이 Ajax 기술을 Java EE 웹 애플리케이션에 적용할 때 전체적인 개발 과정 속에서 발생할 수 있는 문제들을 점검합니다. 패턴에 기반하고 있는 Ajax의 비동기식 통신을 채택할 때의 문제들을 파악하는 것이 효과적인 Ajax 통합의 지름길입니다.

Asynchronous JavaScript + XML (Ajax)은 매우 새로운 기술이다. Java EE 커뮤니티를 비롯한 많은 웹 개발 커뮤니티에서 이에 대한 많은 소문들이 만들어지고 있다. Ajax 기술은 과도한 웹 페이지 리프레쉬를 줄임으로서 애플리케이션 가용성을 향상시키고 있다. 그리고 Ajax의 best-of-both-worlds 접근 방식은 클라이언트 측 코드와 서버 측 코드를 활용하여 웹 사용자에게 거의 완벽한 UI를 제공하고자 한다. Ajax는 웹의 부활(Web 2.0)에 있어 핵심 인에이블러로서 간주되고 있다.

부지런한 Java EE 개발자라면 아마도 Ajax에 대한 많은 하우투 문서를 섭렵하고 이것이 여러분의 애플리케이션에 가져올 향상에 대해서도 기대했을지 모른다. 하지만 어떻게 Ajax의 비동기식 통신 기반 패턴이 Java EE 애플리케이션에 맞을까? 이 글에서는 Java EE 애플리케이션의 디자인, 개발, 퍼포먼스, 테스팅에 Ajax를 채택했을 때 미치는 영향을 검토하여 해결책을 모색하고자 한다. 이렇게 하는 이유는 Ajax 사용을 금하려는 것이 아니라, 오히려 Ajax를 효과적으로 사용할 수 있도록 문제들을 해결하려는 것이다.

디자인 문제점

자바 커뮤니티는 좋은 디자인 패턴들을 웹 관련 애플리케이션 개발에 적용하려고 부단히도 애썼다. 가장 광범위하게 사용되는 패턴들 중 하나가 Model-View-Controller (MVC)이다. Apache Struts 같은 여러 오픈 소스 프레임웍들은 이러한 디자인 패턴/아키텍처에 기반하고 있다. (참고자료) MVC의 많은 장점들 중에는 관심의 분리(separation of concerns)와 과잉 코드의 감소를 들 수 있다.

관심의 분리를 통해, 애플리케이션 아키텍처에서 사전에 협상된 인터페이스를 사용하면서 각 개발자는 애플리케이션 개발 프로젝트에서 지정된 역할에만 집중할 수 있다. 예를 들어, 모델-레이어 개발자들은 JDBC, Enterprise JavaBeans (EJB), 데이터 영속성 기술과 관련 있는 자바 클래스 같은 기술에 초점을 맞춘다. 뷰-레이어 개발자들은 JavaServer Pages (JSP), 태그 라이브러리, 기타 표현 관련 기술에 초점을 맞춘다. 컨트롤러 레이어는 모델과 뷰 사이를 구분 및 중재하고 인커밍 요청들을 백엔드 호출로 라우팅 하면서 관심들을 깨끗하게 분리한다. 그림 1은 MVC 아키텍처 모습이다.


그림 1. MVC 아키텍처
MVC architecture

Ajax를 Java EE 웹 애플리케이션에 도입하는 것에는 관심의 분리라는 의미가 내포되어 있다. (따라서 개발자 역할도 분리된다.) 어떤 경우, Ajax는 많은 양의 JavaScript 코드를 뷰-레이어(JSP) 페이지에 도입한다. 표 1은 Ajax가 적용되지 않은 MVC 뷰 레이어와 필요한 코드를 설명한다. 컨트롤러 레이어는 서블릿으로 구현되고 뷰 레이어는 JSP로 구현된 것으로 간주된다. (다음 개발 딜레마 처리하기 섹션에서는 동기식 요청과 비동기식 요청간 차이점을 설명하겠다.)


표 1. Ajax가 적용되지 않은 MVC: 전형적인 뷰-레이어 시퀀스와 관련된 코드 분량

시퀀스 설명 필요한 코드?
동기식 요청을 실행하기 전 폼(form) 제출을 준비할 때 스크립틀릿 코드가 필요하다. 없음.
동기식 요청 실행 폼 제출은 버튼이나 링크를 통해 실행된다. DOM 엘리먼트 값은 ( GET 또는 POST를 통해) HttpRequest로 자동 설정된다. 없음: 필요한 것은 페이지를 제출하는 방식이다.
동기식 요청에 대한 응답 처리하기 서버 측 코드가 실행을 완료하면 객체는 (HttpRequest를 통해서나 HttpSession에 저장되어) JSP로 보내진다. 이 시점에서 객체들은 HttpRequest 또는 HttpSession을 통해 JSP에 액세스 되고(스크립틀릿이나 태그 라이브러리 사용), 객체 콘텐츠를 디스플레이 하는데 최소한의 스크립팅이 요구된다. 있음: 최소한의 스크립틀릿

Ajax를 이용한 MVC 뷰 레이어를 나타내는 표 2와 표 1을 비교해보자. 여기에서도 마찬가지로 컨트롤러 레이어는 서블릿에 의해 구현되고 뷰 레이어는 JSP로 구현된다.


표 2. Ajax를 이용한 MVC: 전형적인 뷰-레이어 시퀀스와 관련된 코드

시퀀스 설명 필요한 코드?
비동기식 요청을 실행하기 전 Ajax 호출에 필요한 DOM 엘리먼트의 값을 가져오는데 JavaScript 코드가 필요하다. 있음
비동기식 요청 실행 XMLHTTPRequest를 만들고 (이전에 모은) DOM 엘리먼트의 값을 연결시키고 보내는데 (XMLHTTPRequest.send()) JavaScript 코드가 필요하다. 있음
비동기식 요청에 대한 응답 처리하기 서버 측 코드가 실행을 끝낸 후에 JavaScript 코드는 (XML 응답 스트림에서) 결과를 가져와서 해당 DOM 엘리먼트에 따라서 값을 전파한다. 있음

Ajax를 사용하면서 뷰 레이어에서의 스크립팅 코드의 양이 증가하는 것을 볼 수 있다. 세 가지 큰 단점이 있다.

  • JSP는 많은 JavaScript 코드를 필요로 한다.
  • 디자인은 역할 영역의 분리를 무시한다.
  • 디자인이 통합된 monolithic JSP (Model 1 접근 방식: 많은 HTML, CSS 코드, 이미지, 스크립팅 코드)를 사용한다. 이는 읽고 관리하기가 매우 까다로운 반패턴이다. (참고자료)

이러한 디자인 상의 단점을 피하거나 최소한 완화시킬 수 있는 여러 옵션들이 있다:

  • 재사용을 고려한 디자인: Ajax의 스크립팅 코드는 피하기 힘들다. 스크립팅 코드를 기획 및 설계하여 최대한 재사용할 수 있도록 한다.

  • 클라이언트 측에 MVC 방식 채택: 클라이언트 측에 MVC 방식 (Ajax in Action - 참고자료)을 사용할 수 있다. 이 방식은 관심의 분리 측면에서는 효과를 거둘 수 있지만 복잡해 질 수 있기 때문에 충분히 고려해야 한다.

  • Ajax 프레임웍 사용: Direct Web Remoting (DWR)(참고자료) 같은 여러 오픈 소스 Ajax 프레임웍들은 최소한의 코딩으로도 Ajax 패턴을 Java EE 애플리케이션으로 잘 통합한다.

  • 디자인의 유효성에 대한 재평가: Ajax는 웹 애플리케이션에 데스크탑 애플리케이션 애트리뷰트를 제공한다. 주어진 웹 애플리케이션에서 클라이언트 측 인터랙션 대부분이 Ajax를 활용한다. 애플리케이션은 데스크탑 애플리케이션으로서 보다 더 잘 설계될 것이다.




위로


개발 딜레마 처리하기

자바 웹 개발에 Ajax를 사용할 때 동기식(synchronous) 통신 모델과 비동기식(asynchronous) 통신 모델의 차이를 완전히 이해하는 것이 중요하다. (참고자료) 비동기식 통신 모델의 지원 부족은 클라이언트 측 개발, 웹 프레임웍과의 통합, 태그 라이브러리의 사용, IDE 사용, 쓰레딩 작동에 영향을 미칠 수 있다.

동기식 요청/응답 통신 모델에서 브라우저(웹 서버, 애플리케이션 서버, 웹 애플리케이션에 반(反)하는 개념)는 언제나 요청을 초기화 한다. 한편, 웹 서버, 애플리케이션 서버, 웹 애플리케이션은 인커밍 요청에 대응한다. 동기식 요청/응답 쌍이 처리되는 동안 사용자는 브라우저를 사용할 수 없다.

그림 2는 전통적인 웹 애플리케이션의 동기식 통신 모델을 나타내는 시퀀스 다이어그램이다. 서버의 생명 주기에서 클리어언트의 데이터 제출과 서버 측 프로세싱은 강결합 된다.


그림 2. 동기식 통신 시퀀스
Synchronous Communication sequence

비동기식 요청/응답 통신 모델에서, 웹 서버, 애플리케이션 서버, 웹 애플리케이션에 대한 브라우저 간 통신은 결합력이 약하다(decouple). 비동기식 요청/응답이 처리되는 동안 웹 사용자는 브라우저를 계속 사용할 수 있고 동시에 비동기식 요청이 처리된다. 비동기식 요청 프로세싱이 완료되면 비동기식 응답이 (웹 서버, 애플리케이션 서버, 웹 애플리케이션 에서) 클라이언트 페이지로 간다. 일반적으로 이 프로세스 동안에 실행은 웹 사용자들에게는 어떤 영향력도 없다. 응답을 기다릴 필요가 없다.

그림 3의 시퀀스 다이어그램은 비동기식 통신 모델을 묘사한 것이다. 첫 번째 dataSubmission(서버 측 프로세싱)과 리턴된 dataSubmission 모두 빨간색 원이 그려져 있다. 이 시퀀스들은 분리되어 있다. 이 그림에서는 중요한 요소들을 강조하고 있다. (쓰레딩 문제 참조) 다시 말해서 이 모드에서 다중 제출(쓰레드)가 빈번히 일어날 것 같다.


그림 3. 비동기식 통신 시퀀스
Asynchronous communication sequence

클라이언트 측에 미치는 영향

Ajax를 웹 애플리케이션에 도입할 때 개발 팀은 여러 가지 함정을 조심해야 한다. 대개는 생성된 HTML 페이지와 이것이 브라우저와 인터랙팅 하는 방식과 관련되어 있다. 이러한 문제들은 Chris Laffra의 Considering Ajax 시리즈에 잘 설명되어 있다. (참고자료)

  • 스크립팅이 실행되지 않을 수 있다: 여러 가지 다양한 이유로 인해, JavaScript는 많은 사용자 브라우저에서는 실행되지 않는다.

  • 크로스 브라우저 지원 때문에 많은 코드가 필요하다: 여러 브라우저들과 브라우저 버전들을 지원하는 애플리케이션은 스크립팅 코드가 많아져야 한다. 브라우저가 DOM 엘리먼트(그리고 그러한 엘리먼트를 연산하는 자바 스크립트 코드)를 인터프리팅 하는 방식에 미묘한 변수들이 존재하기 때문이다.

  • JavaScript는 안전하지 않다: 대부분의 브라우저에서, HTML 페이지와 제휴된 JavaScript 소스 코드는 뷰 소스 옵션을 선택하면 볼 수 있다. Ajax 패턴을 사용할 때 스크립팅 코드의 로직이 민감하지 않은지를 확인해야 한다.

웹 프레임웍과의 통합

Ajax 개발을 자신의 Java EE 웹 프레임웍과 통합하려는 시도는 자연스러운 현상이다. 하지만 몇몇 Java EE 웹 프레임웍은 비동기식 통신 모델을 지원하지 않는다. 서블릿이 동기식 통신과 비동기식 통신을 처리하는 방법을 이해해야 한다. 그림 4는 전통적인 서블릿이 동기식 요청을 처리하는 모습이다.


그림 4. 동기식 요청을 처리하는 서블릿 시퀀스
Traditional Servlet sequence (synchronous)

그림 4는 Java EE 웹 개발자에게는 익숙할 것이다. 브라우저에서 온 요청이 처음에는 컨트롤러 서블릿의 service()에 의해 처리된다. 서블릿은 필요한 값을 HttpRequest (매개변수 또는 애트리뷰트로서)를 가져올 수 있다. 컨트롤러 프로세싱이 처리되면 결과는 HttpRequest (또는 HttpSession)로 보내지고 RequestDispatcher는 컨트롤을 페이지로 전달한다.

그림 5는 비동기식 요청을 처리하는 서블릿 시퀀스이다:


그림 5. 비동기식 요청을 처리하는 서블릿 시퀀스
Servlet sequence (asynchronous)

그림 5의 시퀀스는 동기식 시퀀스와는 약간 다르다. 브라우저에서 온 요청은 처음에는 컨트롤러 서블릿의 service()에 의해 처리된다. 이 서블릿은 필요한 모든 값을 HttpRequest (매개변수 또는 애트리뷰트로서)에서 가져올 수 있다. 일단 컨트롤러 프로세싱이 끝나면 HttpServletResponse의 콘텐트 유형이 XML로 설정되어야 한다. 또한 컨트롤러 로직의 결과는 PrintWriter로 작성된다. 이 시점에서 RequestDispatcher의 사용이 바이패스(bypass)된다.

이것은 대부분의 Java EE 웹 프레임웍이 지원하지 않는 정확한 (비동기식) 시퀀스이다. 이것 때문에 Ajax와의 통합이 어렵게 된다. 비동기식 통신 모델을 지원하지 않는 포틀릿과 JavaServer Faces (JSF) 프레임웍도 같은 상황에 처해있다.

이러한 문제를 해결할 수 있는 몇 가지 옵션이 있다:

  • 웹 프레임웍과의 공존: 빌트인 Ajax 지원을 기다리거나 자신의 프레임웍에 Ajax를 강제적으로 지원하는 대신 개별 서블릿으로 모든 비동기식 요청들을 처리할 수 있다. DWR이 이 방법을 사용한다. 이 방식의 단점은 Ajax 요청이 프레임웍의 기능들을 쉽게 활용할 수 없다는 점이다.

  • 웹 프레임웍과 통합하기: 확장을 사용하거나 커스텀 확장을 작성하여 웹 프레임웍과 통합할 수 있다.

  • Ajax를 지원하는 프레임웍으로 마이그레이션: 새로운 프레임웍이 비동기식 통신 모델을 지원하기 시작했다. 이중 하나가 Apache Shale 이다. (참고자료)

태그 라이브러리

자바 웹 애플리케이션 개발 시 일반적으로 태그 라이브러리(taglibs)를 많이 사용한다. 많은 Java EE 웹 프레임웍과 마찬가지로 taglibs는 비동기식 통신 모델을 지원하지 않는다. XMLHttpRequest를 통해서 제출된 데이터를 HttpServletRequest로 트랜슬레이트 할 방법이 없다. 본질적으로 비동기식 통신을 지원하지 않는 taglibs는 Ajax XMLHttpRequest 호출이 실행되는 동안 기능을 하지 않는다. 여러분에게 주어진 옵션은 다음과 같다.

  • 비동기식 모델을 지원하지 않는 taglibs를 사용하지 않는다: taglibs로 만든 코드를 HTML/JavaScript 코드로 마이그레이션 한다. (웹 애플리케이션이 taglibs에 많이 의존하는 경우 이 방법을 사용하면 뷰-레이어의 페이지 크기만 늘어난다.)

  • 문제를 해결한다: 이 문제에 대한 해결책을 갖고 있는 Ajax 프레임웍을 사용한다. 그 한 가지 예가 DWR이다. (ExecutionContext.forwardToString() 참조) 이 경우 여러분이 사용했던 taglibs를 계속 사용할 수 있다.

  • Ajax 지원 taglibs를 사용한다: Ajax JSP Tag Library (AjaxTags) 같은 비동기식 모델을 지원하는 taglibs를 사용한다. (참고자료)

IDE를 이용한 개발과 디버깅

많은 JavaScript 디버깅 툴은 JavaScript 솔루션을 개발할 때 도움이 된다. 하지만 전통적인 자바 개발 환경에서는 XMLHTTPRequest의 가치와 Ajax와 관련된 특징을 확인할 수 없다.

한 가지 방법은 AJAX Toolkit Framework (ATF) (참고자료)을 사용하는 것이다. ATF는 강화된 JavaScript 에디팅 기능을 갖춘 Eclipse 플러그인이다. 편집 시 신택스 검사를 할 수 있고, Mozilla 웹 브라우저, DOM 브라우저, JavaScript 디버거 등이 내장되어 있다. ATF에는 Personality Builder가 있는데 이것은 임의의 Ajax 런타임 프레임웍용 IDE 기능의 구현에 도움이 되고 ATF에 있는 런타임 환경에 추가된다.

쓰레딩 문제

전형적인 동기식 웹 애플리케이션에서 버튼이나 링크 클릭에 다소 긴 처리 시간이 필요하다. 인내심이 없거나 경험이 없는 웹 사용자들은 버튼과 링크를 한 번 이상 클릭하여 여러 개의 폼 제출을 실행하곤 한다. 이것이 프로세싱 속도를 높일 것이라고 생각하면서 말이다. 사용자들은 (데스크탑 애플리케이션 처럼) 더블 클릭이 필요하다고 생각한다. 웹 애플리케이션에서의 여러 폼 제출은 어떤 경우에는 무해하다. 하지만 어떤 경우에는 심각한 쓰레딩 문제나 경쟁 조건(여러 쓰레드가 코드 블록의 실행을 위해 경쟁하는 것)을 야기할 수 있다. 예를 들어, 뱅킹 애플리케이션에서 Transfer Funds 버튼을 여러 번 클릭하면 원치 않는 다중 이체 결과를 초래할 수 있다.

동기식 통신 모델과 비동기식 통신 모델 모두를 지원하는 웹 애플리케이션은, 기능이 올바르게 분석 및 기획되지 않으면, 비슷한 문제에 봉착한다. 두 개의 통신 모델을 지원하는 애플리케이션은 해당 페이지에서 서버 측 호출을 혼합한다. (완전한 동기식, 완전한 비동기식, 동기식과 비동기식의 혼합). 여러 번 클릭되는 상황에서 비동기식 호출은 보다 느리게 처리된다. 애플리케이션이 이를 방지하지 않는다면 사용자는 비동기식 쓰레드가 처리되고 있는 동안 동기식 호출을 처리한다. 이 페이지는 리프레시 되지 않아 페이지가 더 이상 작동하지 않기 때문이다. 웹 페이지상의 같은 버튼이나 링크에서 나오지 않았더라도 같은 상황이 서버 측 코드에 쓰레딩 문제를 야기할 수 있다. (다중 클릭 문제와 비슷함)

뱅킹 애플리케이션의 자금 이체 페이지 예를 들어보자. (그림 6)


그림 6. 자금 이체 예제
Transfer funds example

빨간색 Transfer Funds 버튼은 Ajax 호출을 실행한다. Logout 링크(노란색)는 동기식 호출을 실행한다. 성급하거나 경험이 없는 사용자는 빨간색 버튼과 노란색 링크를 연속적으로 클릭하면 (그리고 두 링크 모두 공통 경로를 갖고 있다고 생각한다면) 경쟁 조건이 발생한다.

일반적으로 이러한 상황을 방지할 수 있는 두 가지 방법이 있다. 첫 번째는 클라이언트 측 솔루션이다. 링크나 버튼이 실행되면 JavaScript를 사용하여 추가의 페이지 제출이 현재 쓰레드가 실행을 종료할 때까지 금지되었는지를 확인한다. 두 번째 솔루션은 서버 측 코드의 동기화에 의존하여 경쟁 조건을 지키면서 멀티 쓰레드 제출을 허용하는 것이다. 이 문제를 해결할 때 동기화를 적용한다면 Java EE 웹 컴포넌트(서블릿, 포틀릿, JSF)가 멀티 쓰레딩 된다. 코드의 큰 섹션을 동기화 할 때 주의하라. (특히 요청/응답 프로세싱과 관련된 코드) 실제로, 동기화를 잘못 사용하면 애플리케이션이 싱글-쓰레드 애플리케이션으로 변하고 쓰루풋도 줄어든다.




위로


퍼포먼스 함정 피하기

Ajax를 사용하면 Java EE 웹 기반 애플리케이션의 퍼포먼스에도 영향을 미친다. 요청 당 추가 쓰레드를 허용하게 되면 두 가지 리소스가 영향을 받는다.

우선, 서블릿 컨테이너에 있는 쓰레드 풀(thread pool))이 영향을 받는다. 쓰레드 풀은 웹 컨테이너에서 동시에 실행할 수 있는 최대 쓰레드의 수를 지정한다. 클라이언트 요청에 쓰레드가 필요하다. 하지만 클라이언트 요청이 사용자 요청과 언제나 같은 것은 아니다. 브라우저는 사용자 요청 당 여러 클라이언트 요청을 필요로 할 수 있다. 예를 들어, 사용자가 제출한 폼에 여러 클라이언트 요청이 필요하다. (폼 값 제출, GIF 파일 가져오기, JavaScript 파일 가져오기, CSS 파일 가져오기) 동기식/비동기식 요청이 동시에 제출될 수 있다면 사용자 요청당 (Ajax 요청에 대해) 적어도 한 개 이상의 쓰레드 소비를 지원할 수 있다는 의미이다. 사용자 요청당 한 개 이상의 쓰레드를 추가하는 것이 가능하지만 애플리케이션이 로딩중이면 결과는 자명하다. (사용자 요청 당 추가 쓰레드가 평균 사용자 카운트 만큼 배가될 것이다.) 분명 서블릿 컨테이너의 퍼포먼스에 영향을 미칠 것이다.

또 한가지 리소스는 데이터베이스 커넥션 풀(database connection pool)이다. 전형적인 Java EE 웹 애플리케이션은 사용자 요청에 대해 두 가지 유형의 시퀀스를 실행한다. 가벼운(shallow) 요청과 무거운(deep) 요청이다. 가벼운 요청은 서버 측 코드를 실행하는 웹 페이지에서 기원한 요청이지만 요청을 완료하기 위해 (데이터베이스 같은) 영속 스토어에 액세스 하지 않는다. 무거운 요청은 서버 측 코드를 실행하는 웹 페이지에서 기원한 요청이고 요청을 완료할 때 영속 스토어에 액세스 한다.

무거운 요청 시퀀스(데이터베이스 연결이 필요함)에서, 더 많은 쓰레드를 허용하면 데이터베이스 커넥션 풀링에는 다음과 같은 요소들이 영향을 받는다.

  • 커넥션을 기다리는 쓰레드의 평균 수
  • 커넥션을 기다리는 평균 시간 (밀리초 단위)
  • 커넥션을 사용하는 평균 시간

결국, 커넥션 풀의 크기나 커넥션 수를 늘려야 한다.




위로


테스팅

자바 개발자들은 Java SE와 Java EE 코드에 단위 테스트를 수행하는 것을 중요하게 생각하고 있다. Ajax 때문에 브라우저에 내장된 JavaScript의 양이 많아지면서 견고한 단위 테스팅 프레임웍이 절실히 요구된다. JsUnit, Selenium, HttpUnit 등을 사용할 수 있다. (참고자료)

이러한 프레임웍들은 웹 페이지 상에서 DOM 엘리먼트를 조작하는 JavaScript 함수에 대한 단위 테스트를 개발하는 장치를 제공한다. 또한 단위 테스트를 테스트 슈트로 그룹핑 할 수 있다. Selenium의 브라우저 호환성 테스팅 기능으로 다양한 브라우저와 운영 체계에서 JavaScript 함수를 테스트 할 수 있다. 이것은 JavaScript와 Iframes를 사용하여 테스트 자동화 엔진을 브라우저에 삽입한다. 이 기술은 JavaScript가 작동되는 브라우저에 적용해야 하고 다중 브라우저와 브라우저 버전들을 지원하는 애플리케이션에 특히 유용하다. Selenium과 JsUnit 모두 연속 통합(continuous integration)을 지원한다. JavaScript 단위 테스트와 테스트 슈트를 자동화 구현 프로세스에 통합할 수 있다.




위로


결론

다른 기술이나 패턴과 마찬가지로 Ajax를 Java EE 애플리케이션에 적용할 때 장단점이 있다. 이 글에서는 Ajax를 Java EE 웹 애플리케이션으로 통합하는 것에 대한 큰 그림을 보여주었다. Ajax의 비동기식 통신 모델은 전통적인 Java EE 웹 애플리케이션의 동기식 모델과는 매우 다르다. 따라서 Ajax를 채택하기 전에 문제가 되는 부분에 대한 충분한 고려가 있어야 한다.

Java EE 프레임웍과 유틸리티 지원은 계속 발전한다. Ajax가 지원되는 프레임웍을 활용하여 통합 시 생기는 복잡함을 줄여야 할 것이다. JSF 기반 Apache Shale과 서블릿 기반 DWR을 계속 주목하기 바란다.

기사의 원문보기



참고자료

교육


제품 및 기술 얻기


토론


2007/04/24 17:33 2007/04/24 17:33
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

해외 무료(계정) 호스팅 소개

2007.6.28. 갱신 : 현재 1111mb.com 사이트가 열리지 않고 있습니다.
대안으로 www.freeweb7.com 을 이용하실 수 있습니다.
가입 절차는 1111mb 와 유사하기때문에 아래 글 대로 진행 하시면 됩니다.

오늘 소개하고자 하는건 무료로 웹계정과 트래픽을 제공하는 괜찮은 호스팅 사이트입니다.

제가 처음 이곳을 알게된건 촬영한 사진을 웹상에 게시하는데 사용중인 계정에서 상당한 트래픽 압박을 받고 있어서 입니다.

국내의 모 호스팅 서비스를 이용하고 있는데..( 지금 보시는 서비의 다락방과 서비의 photo gallery 는 해외 유료 계정입니다.^^ )
 그 당시 일트래픽 1.5gb를 신청한 상태였고(지금은 재 신청을 통해 500mb짜리로 돌려 놓았습니다만..)
평소에는 과분할 정도의 트래픽이지만 특정일 혹은 특정 게시물이 있거나 회원수가 꽤 되는 동호회에 이미지를 게시 할 경우 트래픽이 모자란 경우를 자주
당하게 됩니다.
트래픽을 늘이면 되지만 그때까지도 상당히 트래픽을 늘인 상태였고 단지 하루 ,이틀 폭주하는 트래픽을 감당하기위해 트래픽을 더 늘이는건
돈낭비 라는 생각이 들었습니다.

그런때에 이 호스팅을 찾게 된 겁니다.

사이트 주소는 http://www.1111mb.com http://www.freeweb7.com 입니다.
사이트명이 1111mb 이건 이 서비스가 처음 생겼을때는 무료로 1111mb의 계정을 주었던 듯합니다.

1111mb.com


사이트에서 밝히고 있는 특징은

  • 5000mb 용량제공(무려 5gb).
  • 월 50000mb 트래픽( 50gb ).
  • 광고 없음.
  • 계정id.1111mb.com 도메인 제공.
  • FTP 이용 가능.
  • PHP 4 지원.
  • 10mb MySql. 10개의 MySQL DB( 용량제한 없음 )
  • 99.9% 업타임 지원.
  • 등등..


입니다.

제가 처음 가입할 당시에는 계정은 2gb를 제공 했으며 html파일을 업로드하고 브라우저에서
열어보면 위아래로 광고가 붙어 있었는데 지금은 용량도 늘고, 광고도 사라졌습니다.

무료계정치곤 꽤 괜찮다는 생각이 들어 가입절차를 밟았습니다.

가입에 필요한 정보는 id, password 그리고 계정 활성알림 메일을 받을
email 주소가 다입니다.

가입 페이지


간단한 가입절차를 끝내면 등록한 메일주소로 안내 메일이 오게되는데
그거 확인 하시고 로그인 하면 아래와 같은 화면을 보실 수 있습니다.

로그인 후


우측에 전체 용량중에 사용중인 용량과 당월에 사용한 트래픽을 그래프로
보여 줍니다.


계정 생성이 끝난 후 신청id.1111mb.com ( 전 http://cucme.1111mb.com ) 으로 접속 하시면
아래와 같은 화면을 보실 수 습니다. 이제 html, 이미지파일등을 올리셔서 링크를 거셔도 되고 그냥 자료실로만 사용 하셔도 됩니다. ^^;;

첫화면


파일 관리는 웹상의 파일매니저를 통해서도 가능하고 ftp클라이언트를 통해서도 가능합니다.

ftp클라이언트를 통한 접속화면


단점이라면 업로드 가능한 최대 단일파일 크기가 5mb(웹의 파일매니저,ftp클라이언트 모두) 로 제한 되어 있다는점
( 한번에 올릴수 있는 용량은 무제한 입니다. 단지 파일 하나크기제한이 5mb 란거지요. ) 과 스트리밍파일은 업로드 할 수 없다는점 정도입니다.


이미지나 html파일을  올릴 마땅한 공간은 필요하지만 유료 호스팅 서비스를 받기엔 비용때문에
고민이셨던 분들이라면 한번쯤 이용 해도 괜찮은 서비스인듯 합니다.
그래도 무료 계정이니.. 백업은 선택이 아닌 필수!! 임도 명심 하셔야 겠죠?

2007/04/23 13:28 2007/04/23 13:28
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다
  1. 와~ 좋은 정보네요. 고맙습니다^^

  2. 우담아빠님 산모와 뱃속의 아기모두 건강 하시지요?
    도움이 되셨다니 저도 기쁩니다. ^^

  3. Blog Icon
    승혁아빠

    가입까지는 성공을 했는데...화일이 업로드가 안됩니다...다른 분들은 이상이 없나요?

  4. 미디어 파일류나 zip파일등 업로드 파일 확장자에
    제한이 있습니다.
    txt,html,php 나 이미지 파일등이 가능합니다.

    꼼수라면 올리시고자 하는 파일 확장자를 jpg등으로 바꾸어
    올리는 방법이 있겠지만 불편한건 사실 입니다.

    요즘은 일반적인 zip이나 문서파일 업로드가 가능한
    무료 계정을 찾아보고 있습니다.

    좋은 소식 기대 해 주세요.

  5. 음 이 소개하신 사이트....웹 메니저로는 파일 업로드가 되는데, FTP로는 모든 파일이 디스크풀 에러가 나더군요. 그 문제로 몇달째 포럼에 원성이 자자..

  6. 그런가요? 지금 확인 해 보니 정말 파일이 안올라 가는군요..
    제가 ftp 클라이언트로 마지막으로 파일 업로드 한게 6월 3일이니
    그 이후에 문제가 생겼군요.. 꽤 오래 전에도 용량이랑 트래픽 늘이는
    작업 중에 접속이 안되고 그랬는데 이번엔 뭔지..
    석달정도 잘 돌아가는거 확인하고 쓴 글인데.. 그래도 문제가 생기는 군요..

    지금은 freeweb7쪽 계정으로 2달째 테스트 중에 있습니다.
    (지난달엔 11.89G, 이번달은 오늘까지 39.44G의 트래픽을 소모하고 있습니다.)
    freeweb7 측은 아시아문자(특히 중국)를 사용하면 계정 없애겠다고
    메인화면에 공지하고 있는데.. 포럼 쪽 보면 인도쪽이에서
    계정 쓸 수 있게 해달라고 하니까 허락 해 주곤 하더라구요..
    물론 저도 포럼을 통해 허락을 얻어 한글 사이트를 돌리면서 확인 해 보고 있습니다.

    적당한 때가 되면 이쪽 관련하여 글을 포스팅 하겠습니다.

  7. Blog Icon
    여기가짱이죠

    파일 저장 목적이 아닌, 배포 목적으로 4Gb까지 제공해 주는 사이트를 우연찬게 찾았네요.

    현재 베타 인 것 같기도 하지만, 파일 업로드되고 다운로드 되네요.

    제가 1기가 영화 파일 올려서 영국 친구들한테 보라고 하니깐 잘 나온다고 하네요.

    사이트 명은 www.ufreeus.com이고 가시면 그리드 방식으로 최대 4Gb까지 배포할 수 있다고 합니다.

    한번 방문해 보세요, 저도 올려서 친구들에게 파일 날려 주는데, 고화질 영화는 스트리밍으로도 되고, 일반 파일은 인터넷 다운로드 창으로 되고, 다운로드 받는 사람만 클라이언트를 까는데, 설명 보니깐, 이상한 것 같지는 않고요.

    해외 친구들이 매우 좋아합니다.

    가입도 간단하게 이메일 주소로 끝나고요.

    짱입니다 짱!

    이 사이트 운영자는 돈이 무지 많던가 아니면 제품 홍보를 하는건지, 하여간 고용량 파일 배포는 이 사이트가 현재까지 공짜로서는 최고네요.

    강추합니다.

    그리고 이 글은 절대 광고글 아닙니다.

    좋은 정보 있으시면, kokodon@naver.com으로 보내주세요. 꾸벅

  8. Blog Icon
    파도

    근데 생각보다
    웹사용자가 얼마 되지를 않나봅니다
    제가 만든 검색엔진으로 전세계를 조회 해보았지만
    1달가량 검색을 해도 대부분 죽은사이트 아니면 특정업체가 독점을 하고 있든데요
    1년 가량 모아야 다찾을려나
    계중에 혹시 telnet 도 되고 ftp 도 되는 그런사이트 찾을수도 있지 않을까요?