tag:blogger.com,1999:blog-68110627996064475282024-02-18T22:30:16.572-08:00Netbeans-Korean by 강여사http://cafe.naver.com/netbean강여사(J.Y.Kang)http://www.blogger.com/profile/17450510931308610527noreply@blogger.comBlogger101125tag:blogger.com,1999:blog-6811062799606447528.post-23520491550261530392010-07-05T04:36:00.000-07:002010-07-06T07:12:44.930-07:00넷빈(NetBeans)6.9에서 메이븐(Maven) 사용-01-Enterprise App 만들기이번 게시물에서는 넷빈즈 IDE와 Maven Archetype 을 사용하여 간단한 엔터프라이즈 어플리케이션을 만들어 보는 방법에 대해 알아 보겠습니다.<br /><br />이번 게시물의 결과는 EAR archive로 패키지된 엔터프라이즈 어플리케이션을 글래스피시 서버에 배포하게 됩니다. 그 과정에서 새 프로젝트 마법사에서 제공하는 메이븐 엔터프라이즈 어플리케이션 아키타입을 사용하여 어플리케이션을 만드는 방법을 학습하게 됩니다. 어플리케이션에는 EJB 프로젝트로 퍼시스턴스 엔티티 클래스, 메시지 드리븐 빈 및 세션 빈 퍼세이드 등이 포함되어 있습니다. 그리고 2개의 서블릿을 웹 프로젝트로 가지게 됩니다.<br /><br />이번 게시물에 필요한 작업 환경은 다음과 같습니다.<br /><br />넷빈즈 6.9<br />JDK 6<br />글래스피시 v3.0.1<br /><br />메이븐 프레임워크를 사용하여 프로젝트를 개발하는 것은 ANT 로 프로젝트를 개발하는 것과 거의 유사합니다. 그러나 프로젝트를 빌드하는 방식과 의존성을 가지고 작업된다는 점에서 차이가 있습니다.<br /><br />우선 메이븐 프로젝트를 만들기 전에, 로컬로 메이븐 설치 및 로컬 메이븐 저장소를 사용할 수 있도록 맞게 설정되어야 합니다. 만약 메이븐이 설치되어 있지 않다면, 메이븐 사이트는 다음과 같습니다. <a href="http://maven.apache.org/">http://maven.apache.org/</a> 경로에서 메이븐의 최신 버전을 다운로드 받아 적당한 곳에 압축을 풉니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1LR9rIimc1ogxQGUxBR9aREab2dhfvfwp-eeG0U5qGmOcyN13Dh_lhXgdFYUk-p05WpnxqyE8NXfRSp09MHSiMkp8XlkzUWFbf3oOZ-FUd9dJS52s3TD02Nft0qvhg8DDb7BOSCFf6SWd/s1600/nb69_plugin_05_maven_01.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 328px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490651101114924450" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1LR9rIimc1ogxQGUxBR9aREab2dhfvfwp-eeG0U5qGmOcyN13Dh_lhXgdFYUk-p05WpnxqyE8NXfRSp09MHSiMkp8XlkzUWFbf3oOZ-FUd9dJS52s3TD02Nft0qvhg8DDb7BOSCFf6SWd/s400/nb69_plugin_05_maven_01.jpg" /></a><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicWwcBVk4xYPK_mWuITLQx2M1MZJj4jjKnuj4G9G2c30js8_lcOCJrSbda0b7EuxJK3rNuC9_15YxCTKctHqgiBR8ltZVGJ33T-mNKR_fzApFxq2urLM3NmWSeOS0OdCfS_e5FtJZ7ylz7/s1600/nb69_plugin_05_maven_02.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 328px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490651095140415202" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicWwcBVk4xYPK_mWuITLQx2M1MZJj4jjKnuj4G9G2c30js8_lcOCJrSbda0b7EuxJK3rNuC9_15YxCTKctHqgiBR8ltZVGJ33T-mNKR_fzApFxq2urLM3NmWSeOS0OdCfS_e5FtJZ7ylz7/s400/nb69_plugin_05_maven_02.jpg" /></a><br />* IDE 에서 메이븐(Maven) 설정<br />메이븐 프로젝트를 만들기에 앞서 IDE에 메이븐에 대한 설정을 해야 합니다.<br />앞서 설치(다운로드-압축풀기)한 메이븐의 로컬 설치 폴더와 로컬 저장소와 IDE를 연결합니다.<br /><br />IDE의 도구-옵션<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggd1UBniPwuzrkV7OS2J9aEeXR4A7yMClXo4mJlfqauOpkuEvQGEbCnITuldRBMG8dYoXP9SnWBIeQeFVs-kIV4h8Ga0Gzsd1W9gFiDaYdzJVxVCI0lXdWcVuoqUmrFE3Gn-a36TfytlYe/s1600/nb69_plugin_05_maven_03.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 292px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490651076957688530" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggd1UBniPwuzrkV7OS2J9aEeXR4A7yMClXo4mJlfqauOpkuEvQGEbCnITuldRBMG8dYoXP9SnWBIeQeFVs-kIV4h8Ga0Gzsd1W9gFiDaYdzJVxVCI0lXdWcVuoqUmrFE3Gn-a36TfytlYe/s400/nb69_plugin_05_maven_03.jpg" /></a> 기타-Maven 에서 첫번째 외부 메이븐 홈은 다운로드 받아 압축을 푼 메이븐 폴더를,<br />두번째로 메이븐의 로컬 저장소는 보통 넷빈을 설치하면 저 경로가 있습니다.<br />찾아보기 버튼을 클릭하여 찾아서 지정해줍니다 - OK<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZz57jzUpqLjhbrBTAw-n6K-H6ecQAFSOQRO9VGW8doR5-TE_WTj7oj2nCvgQYEVE-rJ96Yi2LYWlvedmKOOZ1wqu10Wb0oFfU6gyFhTuOuwM6_0SzZgW7hjRrhcRaQQ6P159gXW1yFOyF/s1600/nb69_plugin_05_maven_04.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 343px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490651062818119890" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZz57jzUpqLjhbrBTAw-n6K-H6ecQAFSOQRO9VGW8doR5-TE_WTj7oj2nCvgQYEVE-rJ96Yi2LYWlvedmKOOZ1wqu10Wb0oFfU6gyFhTuOuwM6_0SzZgW7hjRrhcRaQQ6P159gXW1yFOyF/s400/nb69_plugin_05_maven_04.jpg" /></a> * 업데이트 메이븐 저장소<br /><br />프로젝트 빌드시 코드 완성을 위해 로컬 및 원격 메이븐 저장소가 사용됩니다. 프로젝트 개발시 사용 가능하도록 준비된, 필요로 하는 아티팩트를 확인하기 위해 메이븐 원격 저장소를 위한 인덱스를 업데이트 해야 합니다. 옵션 창의 메이븐 탭안에 업데이트를 위한 IDE 확인 추가를 설정할 수도 있습니다. 물론, 메이븐 저장소 브라우저에서 로컬 및 원격 메이븐 저장소를 업데이트 및 점검하기 위해 즉시 체크를 수행할 수도 있습니다.<br /><br />1. 창-기타-메이븐 저장소 브라우저<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqfo78lsogHl99i79VEhnwW2QHrfLhSCqqGnwMgXItH6rr5KH5KkjG1KG8WJ4G5T93wxAOtcniHmXh4drJVUgF-miFabZJVFDzVvK8gDkB84n5gD6lMH2VfHWiujvoSs4lLL9v-U9F-cyl/s1600/nb69_plugin_05_maven_05.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 289px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490651055308345138" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqfo78lsogHl99i79VEhnwW2QHrfLhSCqqGnwMgXItH6rr5KH5KkjG1KG8WJ4G5T93wxAOtcniHmXh4drJVUgF-miFabZJVFDzVvK8gDkB84n5gD6lMH2VfHWiujvoSs4lLL9v-U9F-cyl/s400/nb69_plugin_05_maven_05.jpg" /></a><br />2. 메이븐 저장소 브라우저 상단의 업데이트 인덱스 <img src="http://netbeans.org/images_www/articles/68/javaee/mavenentapp/maven-refreshrepo.png" /> 클릭<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3N5nA7yfIZjCFnie7KVKzBKRHy_yqthxZbK1mihMj1DTpgsBlDlfVs7WTusAnwuwFhs5rYG7tplOWrAJ5saOaP-9FKCHk5lZ3BM3kYYsSfs0XrU5drGf_DtyM4SFJ-ehu1N52Efwd1mNc/s1600/nb69_plugin_05_maven_06.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 292px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490652998336035122" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3N5nA7yfIZjCFnie7KVKzBKRHy_yqthxZbK1mihMj1DTpgsBlDlfVs7WTusAnwuwFhs5rYG7tplOWrAJ5saOaP-9FKCHk5lZ3BM3kYYsSfs0XrU5drGf_DtyM4SFJ-ehu1N52Efwd1mNc/s400/nb69_plugin_05_maven_06.jpg" /></a>*****************************************************************<br /><strong><span style="font-size:130%;">메이븐 엔터프라이즈 어플리케이션 프로젝트 만들기</span></strong><br />이제 IDE와 번들로 구성된 메이븐 엔터프라이즈 어플리케이션 아키타입을 사용한 엔터프라이즈 어플리케이션 프로젝트를 만들 예정입니다.<br />이 엔터프라이즈 어플리케이션 아키타입은 EJB 프로젝트와 웹앱 프로젝트를 만들게 됩니다.<br /><br />우선 새 프로젝트를 엽니다. 프로젝트 창에서 마우스 오른쪽 클릭 -새 프로젝트<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNcwXmiOUN4C5ZTEJ5qCgx4T_6Qfgor8dfXWtdGHgstQF8S1eHu-WvOQv0IdUyKobRIhmRFcopcskYbXz9AgbVmmB4BsbwqQi7-1SFpvx76FJmVElFjc5YtCv-iuFDgD0-YZ9nDAyF_L37/s1600/nb69_plugin_05_maven_07.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 304px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490652993791215762" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNcwXmiOUN4C5ZTEJ5qCgx4T_6Qfgor8dfXWtdGHgstQF8S1eHu-WvOQv0IdUyKobRIhmRFcopcskYbXz9AgbVmmB4BsbwqQi7-1SFpvx76FJmVElFjc5YtCv-iuFDgD0-YZ9nDAyF_L37/s400/nb69_plugin_05_maven_07.jpg" /></a> 카테고리에서 Maven 을 선택하고, 오른쪽 프로젝트에 Maven Enterprise Application 을 선택합니다. - 다음<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgybDEShvBwuQ8jsw1-0R4MQph-rzdeau_u8Q1BKDhR8afyJ3wQOgm0_bM0jr3yhgjOsIykRFm91SHqJSwlgKT1240wEYaH9b9yqIAza0pmf0-ViR3FqsFAfYWV6lrW6xZJOnzOe-80OYCy/s1600/nb69_plugin_05_maven_08.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490652985161299282" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgybDEShvBwuQ8jsw1-0R4MQph-rzdeau_u8Q1BKDhR8afyJ3wQOgm0_bM0jr3yhgjOsIykRFm91SHqJSwlgKT1240wEYaH9b9yqIAza0pmf0-ViR3FqsFAfYWV6lrW6xZJOnzOe-80OYCy/s400/nb69_plugin_05_maven_08.jpg" /></a> 프로젝트의 이름은 MavenEnterpriseApp ,<br />경로는 적당히 - 다음<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjV4p3KpLdfdAFK4vh8NzbLnBPYr7z5NixyYXEhRyVnTVmZk6DGw7gsnRMeo92wb7g_fmo3rl2AXSm_-IgTbb4lbjCu0gycz0SsE0cQMtTun6iRpgvhQy1CoQASHRwbN7_GR2qeNYnpcYwD/s1600/nb69_plugin_05_maven_09.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 262px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490652981207719266" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjV4p3KpLdfdAFK4vh8NzbLnBPYr7z5NixyYXEhRyVnTVmZk6DGw7gsnRMeo92wb7g_fmo3rl2AXSm_-IgTbb4lbjCu0gycz0SsE0cQMtTun6iRpgvhQy1CoQASHRwbN7_GR2qeNYnpcYwD/s400/nb69_plugin_05_maven_09.jpg" /></a><br />서버는 글래스피시 v3 (기본)<br />EE 버전 : Java EE6 (기본) - 마침<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUXMKIhe7Vw2_IFftsVl_HYeAuFYN6S8VmqGkc-t4aPIAKviSdLMo1ZdXsjQ2LnC8ssYDUzScRNFFW5sEPDih5VSuLkjFookH_r_SHJzCXpSWcvf-sdORdd8uSlKEsAHjOf2oq-oNzA8ZX/s1600/nb69_plugin_05_maven_10.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 262px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490652959223499986" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUXMKIhe7Vw2_IFftsVl_HYeAuFYN6S8VmqGkc-t4aPIAKviSdLMo1ZdXsjQ2LnC8ssYDUzScRNFFW5sEPDih5VSuLkjFookH_r_SHJzCXpSWcvf-sdORdd8uSlKEsAHjOf2oq-oNzA8ZX/s400/nb69_plugin_05_maven_10.jpg" /></a> 작업이 끝나면 IDE는 메이븐 엔터프라이즈 어플리케이션 아키타입으로부터 다음 프로젝트 들을 생성하게 됩니다.<br />* EJB: 일반적으로 EJB 프로젝트는 어플리케이션의 비즈니스 로직에 관련된 소스 코드를 포함합니다. EJB 프로젝트는 EJB Jar 아카이브로 패키지 됩니다.<br />* WebApp: 일반적으로 JSF ,JSP 페이지 및 서블릿과 같은 어플리케이션의 프리젠테이션 레이어를 포함합니다. WebApp 역시 비즈니스 로직에 관련된 소스 코드를 포함할 수 있습니다. WebApp 프로젝트는 WAR 아카이브로 패키지 됩니다.<br />* Assembly: Assembly 프로젝트는 EJB 와 WAR 아카이브로부터 EAR 아카이브를 어셈블하는데 사용됩니다. Assembly 프로젝트는 어떠한 소스도 포함하지 않습니다.<br />* Enterprise Application : 엔터프라이즈 어플리케이션 프로젝트 역시 어떠한 소스도 포함하지 않습니다. 엔터프라이즈 어플리케이션은 엔터프라이즈 어플리케이션에 포함된 모듈에 관한 자세한 내용을 가지고 있는 POM 파일 (pom.xml) 만을 포함하고 있습니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiK4GzFj5KtQ-uhaYtmlYr-4U0gzViBjQ297PakpUb7T962nl8MJenbWysQef6OQbquCX_JU-owPJNkYlDcDXODbjGpzarUKAL530hh3SOtUWuHk7TYV5wRlxrGFicA-t2PKzyhiGdLG2PR/s1600/nb69_plugin_05_maven_11.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 292px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490654554150178546" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiK4GzFj5KtQ-uhaYtmlYr-4U0gzViBjQ297PakpUb7T962nl8MJenbWysQef6OQbquCX_JU-owPJNkYlDcDXODbjGpzarUKAL530hh3SOtUWuHk7TYV5wRlxrGFicA-t2PKzyhiGdLG2PR/s400/nb69_plugin_05_maven_11.jpg" /></a> 엔터프라이즈 어플리케이션 프로젝트가 만들어진 후, 몇몇 의존성 오류(dependencies unavailable) 때문에 Assembly 프로젝트에 경고 아이콘(노란색 삼각형)가 뜹니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhR5oXsbR4x0_1ISzd8loBW_27blr7dpRRwbEBpFrSHuxMN7VcKPmHepKQoURgvfVtXKrBO0TVnLP3g-J9YhSM0faV2oxwPKF2E0JxY8FxRsdy_X9cWHg3MW3OuQZKNbf-FG7Yh0ZBhvHQA/s1600/nb69_plugin_05_maven_12.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 292px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490654541857040450" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhR5oXsbR4x0_1ISzd8loBW_27blr7dpRRwbEBpFrSHuxMN7VcKPmHepKQoURgvfVtXKrBO0TVnLP3g-J9YhSM0faV2oxwPKF2E0JxY8FxRsdy_X9cWHg3MW3OuQZKNbf-FG7Yh0ZBhvHQA/s400/nb69_plugin_05_maven_12.jpg" /></a> 프로젝트노드에서 마우스 오른쪽을 클릭하여 맨 아래에서 2번째 show and resolve problems 메뉴를 누르면 아래 그림처럼 non-classpath dependency or missing dependency 된 내용을 볼 수 있습니다.<br /><br />Assembly 프로젝트는 EJB 프로젝트와 WebApp 프로젝트를 컴파일한 후 패키지되고 사용가능해지는 JAR와 WAR 기반하에 의존성(dependencies)를 가집니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4KI9kBuILtgcp7J7QoDbbzN95LTrxSu8FMdaEMjldC2Ept4XhaAe6IxfaSWMDklTdOUPaVAvXziWZ6tcOU71ssuBFmx8nd5pqgeX8Ne7jv31kzA2SXMBunTnV7FmhhLQnMDg6y-TYy3P6/s1600/nb69_plugin_05_maven_13.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 266px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490654534284984466" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4KI9kBuILtgcp7J7QoDbbzN95LTrxSu8FMdaEMjldC2Ept4XhaAe6IxfaSWMDklTdOUPaVAvXziWZ6tcOU71ssuBFmx8nd5pqgeX8Ne7jv31kzA2SXMBunTnV7FmhhLQnMDg6y-TYy3P6/s400/nb69_plugin_05_maven_13.jpg" /></a>*********************************************************<br /><strong><span style="font-size:130%;">EJB 프로젝트 코딩하기</span></strong><br /><br />앞서 말한대로 EJB 프로젝트는 어플리케이션의 비즈니스 로직을 포함합니다.<br />이 어플리케이션에서는 글래스피시 컨테이너가 JTA(Java Transaction API)를 사용하여 트랜잭션을 관리하게 됩니다.<br /><br />이번 예제에서 EJB 프로젝트는 엔티티 클래스, 메시지-드리븐 빈 및 엔티티 클래스를 위한 세션 퍼세이드를 만들 예정입니다.<br /><br />우선 대상 서버를 설정합니다. 서비스 탭을 누른 후 서버를 확장하여 GlassFish v3 서버를 시작시킵니다. (서버에서 마우스 오른쪽 클릭 - 시작)<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6m-N7jm2u-7zDYuYXIvThWe9pIIGOtN0U_i6BhZ8aDFF1vnhtcduWOrREIq-1vfbDqUcQ4NUV9sZfX9lp8lZYteF8W_t4ljI2I0vhvvGcnPTsyGB8zc4CduFUH7lSWxVTniFYHdvkiv4x/s1600/nb69_plugin_05_maven_14.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 292px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490660130139829010" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6m-N7jm2u-7zDYuYXIvThWe9pIIGOtN0U_i6BhZ8aDFF1vnhtcduWOrREIq-1vfbDqUcQ4NUV9sZfX9lp8lZYteF8W_t4ljI2I0vhvvGcnPTsyGB8zc4CduFUH7lSWxVTniFYHdvkiv4x/s400/nb69_plugin_05_maven_14.jpg" /></a>다시 프로젝트 창으로 돌아가서 EJB 프로젝트에서 마우스 오른쪽을 클릭하고 맨 아래 등록정보 선택<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjweEkd_-HKn1S36fJgIrgx8i3GtNQ3Ub7M5JZl9ymgWtPeLaEC0zL06uAhIhJk563ChU0lz4dnd06A-XZY8XhYm8cz50ln9_JiBLrH4FXNV_SeygPznIgl9FDA2NZWb1yjwHbbWM6QDNcB/s1600/nb69_plugin_05_maven_15.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 327px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490660123873384754" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjweEkd_-HKn1S36fJgIrgx8i3GtNQ3Ub7M5JZl9ymgWtPeLaEC0zL06uAhIhJk563ChU0lz4dnd06A-XZY8XhYm8cz50ln9_JiBLrH4FXNV_SeygPznIgl9FDA2NZWb1yjwHbbWM6QDNcB/s400/nb69_plugin_05_maven_15.jpg" /></a>등록 정보 창에서 왼쪽 카테고리에서 실행(Run)을 누르고,<br />오른쪽의 서버에서 글래스피시 서버 v3.1 를 선택합니다. - 확인<br />코딩 전에 배포 서버로 글래스피시를 지정함으로써, IDE는 퍼시스턴스 유닛을 만들기 위한 마법사에서 JTA를 지정하는 옵션이 가능하게 됩니다.<br />또한 서버에 등록된 어떠한 데이터 소스도 선택 사용 가능하게 됩니다.<br /><br />주. 만약 글래스피스 서버 3 으로 설정하지 않으면, 퍼시스턴스 유닛에서 기본 트랜잭션 타입을 만들 때 RESOURCE_LOCAL 이 됩니다. 만약 트랜잭션을 컨테이너가 관리하기 원한다면 persistence.xml 파일을 열어 수동으로 JTA 라고 변경해야 합니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3i2I0t9IDq1TZBjX2Z27jJHQo10HjUTAdkQks6XjsTZpheTQE4qgyZ-t_ZJoZnaSBfn4duXmZyZbv_QOida0NWqK33_jH30iZ_OO2fD7kgQr3vdCJ-tp_RT-FEPJSspdDrc9_QnqK2gOY/s1600/nb69_plugin_05_maven_16.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 273px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490660500250757714" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3i2I0t9IDq1TZBjX2Z27jJHQo10HjUTAdkQks6XjsTZpheTQE4qgyZ-t_ZJoZnaSBfn4duXmZyZbv_QOida0NWqK33_jH30iZ_OO2fD7kgQr3vdCJ-tp_RT-FEPJSspdDrc9_QnqK2gOY/s400/nb69_plugin_05_maven_16.jpg" /></a><strong>퍼시스턴스 유닛 만들기</strong><br />EJB 프로젝트에서 퍼시스턴스 유닛을 만듭니다.<br />퍼시스턴스 유닛이란 데이터베이스 커넥션에 대한 상세와 트랜잭션 관리에 대한 방법을 지정합니다.<br />이번 예제에서는 글래스피시 서버가 트랜잭션을 관리하도록 하기 위해 새 퍼시스턴스 유닛 만들기 마법사에서 JTA를 지정할 예정입니다.<br /><br />우선, EJB 프로젝트에서 마우스 오른쪽을 클릭하여 새로만들기 - other<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEig75Tpfv5y9GxALxDRlGCAOa1ZCtC2U1z00EHkf-VQ6X1q68xkWLbv8iBAQOH7RqpwvurB_eG0cCYe4r6qTq-8EDPqmyRfBSeHnz9OC2LBT6WyqRLRZCkgxDKfErR6LQOGdz2w57NwJV9h/s1600/nb69_plugin_05_maven_17.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 327px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490660496598163730" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEig75Tpfv5y9GxALxDRlGCAOa1ZCtC2U1z00EHkf-VQ6X1q68xkWLbv8iBAQOH7RqpwvurB_eG0cCYe4r6qTq-8EDPqmyRfBSeHnz9OC2LBT6WyqRLRZCkgxDKfErR6LQOGdz2w57NwJV9h/s400/nb69_plugin_05_maven_17.jpg" /></a> 카테고리에서 정보보존(Persistence) - 퍼시스턴스 유닛 선택 - 다음<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYyzkJ9UmvZ9_6lbSHf96ZV-9Yl-Ydq8d0Y50d5ClkRf8EkYJhkUDZzNnUC0iawkrngo8kJPS2iu6Ola_ogbmwSWgCmXYMYIln9EzzW9oBZNUtC68ovOyK9QDRizr7Yceu6fgsy1pRb31C/s1600/nb69_plugin_05_maven_18.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490660489213735922" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYyzkJ9UmvZ9_6lbSHf96ZV-9Yl-Ydq8d0Y50d5ClkRf8EkYJhkUDZzNnUC0iawkrngo8kJPS2iu6Ola_ogbmwSWgCmXYMYIln9EzzW9oBZNUtC68ovOyK9QDRizr7Yceu6fgsy1pRb31C/s400/nb69_plugin_05_maven_18.jpg" /></a> 유닛 고유 이름이나 제공자(EclipseLinkJPA 2.0) 는 기본설정 대로 두고,<br />데이터 소스를 오른쪽 드롭다운 목록을 참고하여 jdbc/sample (JavaDB)로 맞춥니다.<br />데이터소스 jdbc/sample 은 IDE 번들 글래스피시 설치시 자동으로 작업되어 있는 데이터 소스 입니다. 만약 다른 데이터 베이스를 원한다면 다른 데이터 소스를 지정하여 사용할 수도 있습니다.<br />그리고 아래 Java Transaction APIs(JPA) 사용을 반드시 체크하고,<br />테이블 생성 전략은 create 를 체크 확인합니다.<br />마침<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgk64MdN_aQk1qlNrr8YZdCB56lSB2sDgsQJNAkYCn7TyrP4ybYiWoY5x7zilE35iXkHGnKKAi66i7LskM1E70r_vpQZCoJft0Z2ZgQsJOoGuJn9Bzwk6W1__eIPzLdESxbQ6eqX7V1iTvs/s1600/nb69_plugin_05_maven_19.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 267px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490660477189319314" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgk64MdN_aQk1qlNrr8YZdCB56lSB2sDgsQJNAkYCn7TyrP4ybYiWoY5x7zilE35iXkHGnKKAi66i7LskM1E70r_vpQZCoJft0Z2ZgQsJOoGuJn9Bzwk6W1__eIPzLdESxbQ6eqX7V1iTvs/s400/nb69_plugin_05_maven_19.jpg" /></a> 작업이 완료되면 IDE가 persistence.xml 을 만들고 편집창에서 엽니다.<br />아래 그림 처럼 디자인으로 볼 수도 있고,<br />옆의 탭을 눌러 XML 소스로(다음 그림) 확인할 수도 있습니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjT2NGAZsCpPVyopcLxsb-QyuFw3lHsO2c46b0NMolVBGBoAihoLeWiwDHLk-vl1xmRHkufBLE5El5Qxx33UrK0DSNqtFKPwiDkJs_oLBPuR1fWlXw7i1efe0HmybYF6GekyQ87eey4HwEz/s1600/nb69_plugin_05_maven_20.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 327px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490660470649646290" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjT2NGAZsCpPVyopcLxsb-QyuFw3lHsO2c46b0NMolVBGBoAihoLeWiwDHLk-vl1xmRHkufBLE5El5Qxx33UrK0DSNqtFKPwiDkJs_oLBPuR1fWlXw7i1efe0HmybYF6GekyQ87eey4HwEz/s400/nb69_plugin_05_maven_20.jpg" /></a>----------------------------------<br /><persistence-unit name="com.mycompany_MavenEnterpriseApp-ejb_ejb_1.0-SNAPSHOTPU" transaction-type="JTA"><br /><provider>org.eclipse.persistence.jpa.PersistenceProvider</provider><br /><jta-data-source>jdbc/sample</jta-data-source><br /><exclude-unlisted-classes>false</exclude-unlisted-classes><br /><properties><br /><property name="eclipselink.ddl-generation" value="create-tables"/><br /></properties><br /></persistence-unit><br />-----------------------------------------------------------------------------<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnn94sA7DUGQDiSiERr2CpmLWquNmMjCwZ21jYuexb38jCd5nIZ2-PaXISB3m-ez3M6CvrHyNmq6s9m-QZCcPc2DJsZ4eDh68Clx-73MeeCbnpWOid_wTyMgiZ4y6Yc16wERNcsLtJcb8M/s1600/nb69_plugin_05_maven_21.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 327px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490663661082849042" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnn94sA7DUGQDiSiERr2CpmLWquNmMjCwZ21jYuexb38jCd5nIZ2-PaXISB3m-ez3M6CvrHyNmq6s9m-QZCcPc2DJsZ4eDh68Clx-73MeeCbnpWOid_wTyMgiZ4y6Yc16wERNcsLtJcb8M/s400/nb69_plugin_05_maven_21.jpg" /></a> 이번에는 EJB 프로젝트에 엔티티 클래스를 만듭니다.<br />EJB 프로젝트에서 마우스 오른쪽을 클릭 , 새로 만들기 - Other<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgT6M-phduyfaPBZfYQ7X5SROBLEmWQXU4uiNMXjgC4ablhGSWKVCiqohfsXGI7KZUQbww70yISuYB6eqMl-Sum6nVfXZS9hzuYevW5NR0n7k2-8KhfmzitDmT1Abm0kFI4KWHNKLQHaeqr/s1600/nb69_plugin_05_maven_22.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 327px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490663651800996898" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgT6M-phduyfaPBZfYQ7X5SROBLEmWQXU4uiNMXjgC4ablhGSWKVCiqohfsXGI7KZUQbww70yISuYB6eqMl-Sum6nVfXZS9hzuYevW5NR0n7k2-8KhfmzitDmT1Abm0kFI4KWHNKLQHaeqr/s400/nb69_plugin_05_maven_22.jpg" /></a>카테고리에 정보보존(Persistence)를 파일 유형은 엔티티 클래스 (Entity Class) 선택 - 다음<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvWHfAvyYud929urIh2AJAhhTboUdx7OalIejdN_Vi5Zu9y_KUsuvrIPoQNsMRYeweoB0GyEo-91Wt3Bkg628pZRtoNoeFMxEpuRSAUZy3B7TWu5tDLBBNfukbg0Oi-qzDJexdC7_exX9i/s1600/nb69_plugin_05_maven_23.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490663647583241490" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvWHfAvyYud929urIh2AJAhhTboUdx7OalIejdN_Vi5Zu9y_KUsuvrIPoQNsMRYeweoB0GyEo-91Wt3Bkg628pZRtoNoeFMxEpuRSAUZy3B7TWu5tDLBBNfukbg0Oi-qzDJexdC7_exX9i/s400/nb69_plugin_05_maven_23.jpg" /></a>클래스 이름은 NewsEntity 라고 주고<br />아래 패키지에는 ejb<br />그리고 Long 으로 설정된 Primary key type 은 기본 그대로 두고 - 마침<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhICzdrijLZlCrfdDMxVic6owOTkNdycyomxKzONpJg3ODiHThpG787YlE-Q7SDSwbZH3Gvdqc6767JtcCJhSrctkBmn7-x_jxjLfqHQD8f87-mUjfTeVi23ac1-sNmcZufPWg2gmBCV6wy/s1600/nb69_plugin_05_maven_24.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490663639104617026" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhICzdrijLZlCrfdDMxVic6owOTkNdycyomxKzONpJg3ODiHThpG787YlE-Q7SDSwbZH3Gvdqc6767JtcCJhSrctkBmn7-x_jxjLfqHQD8f87-mUjfTeVi23ac1-sNmcZufPWg2gmBCV6wy/s400/nb69_plugin_05_maven_24.jpg" /></a> 작업이 완료되면 편집기 창에 NewsEntity.java 소스가 보이는데 클래스 아래 2개의 필드를 선언하고 거기서 마우스 오른쪽을 클릭하여 코드 삽입(Insert code)를 선택합니다.<br />========================================================<br /><strong>private String title;<br />private String body;</strong><br />========================================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1sORXWIPAXH1P2j8-yS3tVCN4ok0m1n69wTwB8suCtRK3bdnz7ZZdrUB1MYFkHNPyfLTVHdL0IRMvt_733lORMajMYilQ7kfGEfACLZhX9LVa0_cqy6JX7CmjCUhW7pgZgWLUirdPdFBX/s1600/nb69_plugin_05_maven_25.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 327px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490663633206228242" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1sORXWIPAXH1P2j8-yS3tVCN4ok0m1n69wTwB8suCtRK3bdnz7ZZdrUB1MYFkHNPyfLTVHdL0IRMvt_733lORMajMYilQ7kfGEfACLZhX9LVa0_cqy6JX7CmjCUhW7pgZgWLUirdPdFBX/s400/nb69_plugin_05_maven_25.jpg" /></a> 아래 그림과 같이 팝업창이 뜨는데 getter and setter 를 선택합니다<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0M9usH2U-KSY9lBCE2EPYA5v02Iq6KlaQWFUJbuuqZ9m2Z8UaS4fQFD2-Oqiu_blBC3z5ftvLo69p9HrczgDo7vwePQ6iq8r3GwIBX9Cy-yFCUU85wFyAqW_jfXipyNINDOLLKz6XGd0b/s1600/nb69_plugin_05_maven_26.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 327px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490688296489477474" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0M9usH2U-KSY9lBCE2EPYA5v02Iq6KlaQWFUJbuuqZ9m2Z8UaS4fQFD2-Oqiu_blBC3z5ftvLo69p9HrczgDo7vwePQ6iq8r3GwIBX9Cy-yFCUU85wFyAqW_jfXipyNINDOLLKz6XGd0b/s400/nb69_plugin_05_maven_26.jpg" /></a> 2개의 필드 모두를 선택하고 생성(generate) 클릭<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhn08uRcKK60rwktFRC24honjD9LwOckPjEKOaDOIMz71dEuZdlQLRYChUmRiZ6h-UBsOcMdD3Qz2w1bhKb5G3HeSpDFeQU5LQmLuPIcTo7wzOBFegfRs1VdA-eLbDoxtFP68cgrb-mYrDS/s1600/nb69_plugin_05_maven_27.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 181px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490688291587664722" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhn08uRcKK60rwktFRC24honjD9LwOckPjEKOaDOIMz71dEuZdlQLRYChUmRiZ6h-UBsOcMdD3Qz2w1bhKb5G3HeSpDFeQU5LQmLuPIcTo7wzOBFegfRs1VdA-eLbDoxtFP68cgrb-mYrDS/s400/nb69_plugin_05_maven_27.jpg" /></a>***********************************************<br /><strong>메시지 드리븐 빈 만들기</strong><br /><br />이번에는 EJB 프로젝트의 메시지-드리븐 빈을 만들도록 하겠습니다.<br />메시지-드리븐 빈(Message-Driven)은 메시지의 비동기 교환을 가능하게 해주는 엔터프라이즈 빈입니다. NewsApp 어플리케이션에서는 웹 모듈에서 서블릿에 의한 큐에 메시지를 주고 받기 위해 메시지-드리븐 빈을 사용합니다.<br /><br />어플리케이션에서 메시지-드리븐 빈을 사용하려면, 빈이 사용하는 커넥터 리소스를 서버에 등록해야 합니다. 글래스피시 서버에 배포시, 관리 콘솔을 통해 서버에 직접 리소스(자원)를 생성할 수도 있고 sun-resources.xml 파일에 상세를 지정함으로써 배포에 리소스(자원)을 생성할 수 있습니다. 어플리케이션이 서버에 배포시, 서버는 sun-resources.xml 에 정의된 리소스(자원)을 등록합니다. IDE에서는 새파일 마법사로 메시지-드리븐 빈을 만들게 되면, 여러분을 대신해서 sun-resources.xml 에 해당 엘리먼트를 자동 생성합니다.<br /><br />메이븐 프로젝트에서, sun-resources.xml 파일은 파일 탭 창에서 프로젝트 노드 아래 src/main/setup 디렉터리안에 있습니다.<br /><br />우선 메시지-드리븐 빈을 만드려면 프로젝트에서 마우스 오른쪽 클릭 , 새로 만들기-Message Driven Bean (만약 그림처럼 바로 제시되지 않으면 other 를 클릭한 후, 카테고리 Java EE 에서 파일 유형을 선택하면 됩니다)<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0vE_mEKZAkQo7mGJVh1k-b_uW1xlRoEQXWkEJSNGlv3EfTilEhRETL_7UnTHQsMKqgpFkWqymeAUKvkMfZPFTuynovfbGrZNjyrub37xhwcjMcxOM8yX_Hc-_PiLvcLibTdxEDoGlFhNb/s1600/nb69_plugin_05_maven_28.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 327px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490688286269791634" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0vE_mEKZAkQo7mGJVh1k-b_uW1xlRoEQXWkEJSNGlv3EfTilEhRETL_7UnTHQsMKqgpFkWqymeAUKvkMfZPFTuynovfbGrZNjyrub37xhwcjMcxOM8yX_Hc-_PiLvcLibTdxEDoGlFhNb/s400/nb69_plugin_05_maven_28.jpg" /></a>EJB 클래스 이름은 NewMessage<br />패키지는 ejb<br />그리고 아래 Add 버튼을 눌러 메시지 도달(Message Destination) 대화 상자를 엽니다.<br />메시지 도달 이름: jms/NewMessage<br />도달 유형: Queue (큐)<br />확인<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdOcl9zlA0AiAy2fbyhTI258PGUI7jsYhiSMHg9WEi6cuFQcKpgJjSERX98YG4nCaeKd5vTLg6IGeD5e89S8zo736EJNpOO0_w3YDmWHLqjOGjSZwmJ-j_z_kzpVW8Q36ScVmMVAb9hYki/s1600/nb69_plugin_05_maven_29.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490688280481923938" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdOcl9zlA0AiAy2fbyhTI258PGUI7jsYhiSMHg9WEi6cuFQcKpgJjSERX98YG4nCaeKd5vTLg6IGeD5e89S8zo736EJNpOO0_w3YDmWHLqjOGjSZwmJ-j_z_kzpVW8Q36ScVmMVAb9hYki/s400/nb69_plugin_05_maven_29.jpg" /></a> 내용 확인 - 마침<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhp-FvyXNG5hTKnwGxBrikN63kjHyNhUhcffz1qEAVsH4Y1UB_UJiHfXaR_cxbWyHACOOdONeXTFUMbI9yEfeBjOAXI-HvaDpbkOW9zKRkICkQ90xOdHRgOYhCEJ3YWs9s5tJ3P1IGnJk5V/s1600/nb69_plugin_05_maven_30.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490688274017656594" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhp-FvyXNG5hTKnwGxBrikN63kjHyNhUhcffz1qEAVsH4Y1UB_UJiHfXaR_cxbWyHACOOdONeXTFUMbI9yEfeBjOAXI-HvaDpbkOW9zKRkICkQ90xOdHRgOYhCEJ3YWs9s5tJ3P1IGnJk5V/s400/nb69_plugin_05_maven_30.jpg" /></a>기본적으로 IDE가 빈 클래스와 필요한 어노테이션 등을 설정하게 됩니다.<br />그럼 클래스에 다음 어노테이션 필드를 추가하여 클래스에다 MessageDrivenContext 리소스를 주입합니다.<br />그리고 마찬가지로 엔티티 매니저를 추가 주입합니다.<br />================================================================================<br />public class NewMessageBean implements MessageListener {<br /><br /><strong>@Resource<br />private MessageDrivenContext mdc;<br />@PersistenceContext(unitName="com.mycompany_MavenEnterpriseApp-ejb_ejb_1.0-SNAPSHOTPU")<br />private EntityManager em;<br /></strong><br />================================================================================<br />@PersistenceContext 어노테이션은 퍼시스턴스 유닛을 선언하여 context 를 지정합니다. 여기서 unitName 값은 퍼시스턴스 유닛 이름입니다<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAbrdnTfJ9d6wSh4X-kAwwsdapvbOiMZhel6yezmf_9bGqNvntk6olD3CY6QT85a1mvJ9Og0hu6Xmmh0SKMl6BJspOnYhC_9sO90ry1LGnL9A51BC3a_i3pzN4q6MGpPvHMqOYkAsgrU6S/s1600/nb69_plugin_05_maven_31.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 327px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490691658754200738" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAbrdnTfJ9d6wSh4X-kAwwsdapvbOiMZhel6yezmf_9bGqNvntk6olD3CY6QT85a1mvJ9Og0hu6Xmmh0SKMl6BJspOnYhC_9sO90ry1LGnL9A51BC3a_i3pzN4q6MGpPvHMqOYkAsgrU6S/s400/nb69_plugin_05_maven_31.jpg" /></a>그리고 아래 save 메소드를 추가합니다.<br />================================================================================<br />public void onMessage(Message message) {<br />}<br /><br /><strong>public void save(Object object) {<br />em.persist(object);<br />}</strong><br />================================================================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3QxrMoN5g_MjHAvvK0wi0HVY-f-bOgwR860tVS0NS2FL2-Fn0b5tcjqJIIvc7_3GFYkWkbAnZYSxqKKrYlkVudDKy70A5krf6yz-M3sckG324fxh0xvxtzaCDjJTZgCwk5jht4m3bPOzd/s1600/nb69_plugin_05_maven_32.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 327px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490691652600278226" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3QxrMoN5g_MjHAvvK0wi0HVY-f-bOgwR860tVS0NS2FL2-Fn0b5tcjqJIIvc7_3GFYkWkbAnZYSxqKKrYlkVudDKy70A5krf6yz-M3sckG324fxh0xvxtzaCDjJTZgCwk5jht4m3bPOzd/s400/nb69_plugin_05_maven_32.jpg" /></a>onMessage 메소드는 다음 내용으로 변경합니다.<br />================================================================================<br />public void onMessage(Message message) {<br /><strong>ObjectMessage msg = null;<br />try {<br />if (message instanceof ObjectMessage) {<br />msg = (ObjectMessage) message;<br />NewsEntity e = (NewsEntity) msg.getObject();<br />save(e);<br />}<br />} catch (JMSException e) {<br />e.printStackTrace();<br />mdc.setRollbackOnly();<br />} catch (Throwable te) {<br />te.printStackTrace();<br />}</strong><br />}<br />================================================================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2R9WRVusHahXC6Mc5vV4CEjfKa6K0Lq6wAjqyCOoz5rht0uAyu_F2OI6TTzYm1xUt5zGfIgmtmWtlMkVTpQcax0TRa-6tzhSPvI_3TKBLsGhny6W95dW41kRMXpYr2baB6Mub_8c-QSpE/s1600/nb69_plugin_05_maven_33.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 327px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490691637387322962" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2R9WRVusHahXC6Mc5vV4CEjfKa6K0Lq6wAjqyCOoz5rht0uAyu_F2OI6TTzYm1xUt5zGfIgmtmWtlMkVTpQcax0TRa-6tzhSPvI_3TKBLsGhny6W95dW41kRMXpYr2baB6Mub_8c-QSpE/s400/nb69_plugin_05_maven_33.jpg" /></a> 임포트 문제에 대한 해결은 여백에서 오른쪽 마우스를 클릭하여 가져오기 고정(fix import) 클릭<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzhpn_tqokHTd_QNNnqnw2u5X1g5sH-ICrGakuQuGdmCja43zwdo8cikIm0NSCHATH7Dy_8JGwiRRqHA6r3MUZSI-xYypBzkajdYzJAWSm8z_ajF78eOScvPpobfL7GAssZHqTvLOFQRvA/s1600/nb69_plugin_05_maven_34.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 327px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490691621466365538" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzhpn_tqokHTd_QNNnqnw2u5X1g5sH-ICrGakuQuGdmCja43zwdo8cikIm0NSCHATH7Dy_8JGwiRRqHA6r3MUZSI-xYypBzkajdYzJAWSm8z_ajF78eOScvPpobfL7GAssZHqTvLOFQRvA/s400/nb69_plugin_05_maven_34.jpg" /></a> 아래 그림처럼 javax.jms 관련 및 javax.annotation.Resource 확인 - OK<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirSOxMxqaXxGdWOZ9NNdaiqVB6FMafqs509VOHkT4tsyiQzsSzpmrA8pqe-y0P5PJK5NuO68o2oz_9T-6hw9uHWWTVfPQWWKRRtE2Pyw-1vHkhOExXnIvZFyCIuNdEyiexSjaGd8YO0HTt/s1600/nb69_plugin_05_maven_35.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 313px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490691612617552882" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirSOxMxqaXxGdWOZ9NNdaiqVB6FMafqs509VOHkT4tsyiQzsSzpmrA8pqe-y0P5PJK5NuO68o2oz_9T-6hw9uHWWTVfPQWWKRRtE2Pyw-1vHkhOExXnIvZFyCIuNdEyiexSjaGd8YO0HTt/s400/nb69_plugin_05_maven_35.jpg" /></a>***********************************************************************<br /><strong>세션 빈 만들기</strong><br /><br />이번에는 아까 만든 NewsEntity 엔티티 클래스를 위한 세션 빈 퍼세이드(facade)를 마법사를 통해 만들겠습니다.<br /><br />우선 EJB 모듈에서 마우스 오른쪽을 클릭하여 새로 만들기- other<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj695iQc7Lrr2dWwsucpvuUU3aFw_W3fWBLi2Jae72sWr7mRO6U5HxZKSiNnZBKZ_PMFBC8_RPy9HXReXGIr4_GkXGssoUBu3Zhely1EJgNVASBygmta2dt3LKH-lw6DcKlphyOK9jCvt98/s1600/nb69_plugin_05_maven_36.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 327px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490700503251730322" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj695iQc7Lrr2dWwsucpvuUU3aFw_W3fWBLi2Jae72sWr7mRO6U5HxZKSiNnZBKZ_PMFBC8_RPy9HXReXGIr4_GkXGssoUBu3Zhely1EJgNVASBygmta2dt3LKH-lw6DcKlphyOK9jCvt98/s400/nb69_plugin_05_maven_36.jpg" /></a>카테고리에서 정보보존(Persistence)를 선택하고, 오른쪽 유형에서 엔티티 클래스를 위한 세션 빈 (Session Beans for Entity Classes)를 선택- 다음<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3tqY8YzjvAH_7a548O49n_iYRY44GeB5qdWNjrN-yaWta45yQesZI0xKx3ce4RD6_xWjk40kty2ZhRbNftcjGFFGm05F4-0BVv8tsXrXZicif3xxB6xrY0POBNszIY1EUFwzoqlYUZaAD/s1600/nb69_plugin_05_maven_37.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490700500197404034" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3tqY8YzjvAH_7a548O49n_iYRY44GeB5qdWNjrN-yaWta45yQesZI0xKx3ce4RD6_xWjk40kty2ZhRbNftcjGFFGm05F4-0BVv8tsXrXZicif3xxB6xrY0POBNszIY1EUFwzoqlYUZaAD/s400/nb69_plugin_05_maven_37.jpg" /></a>왼쪽에 사용가능한 엔티티 클래스 목록에 ejb.NewsEntity 가 나타나는데 화살표 버튼을 사용해서 오른쪽에 selected entity classes 창으로 이동 - 다음<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsjOOIrxjC5uV1I-CSjmD6ItH4-hGsXM3ezTQoyL713GN2ZeIeDPawIbnXV6Jcyu4zjq0wCHEPjlsW8DhExgTHehNma-1HI2YGHF7dnN_eQ4oCAmIUo8Eh9Ki6SRkVqd5hucrbS3H_ecvd/s1600/nb69_plugin_05_maven_38.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 286px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490700489328418530" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsjOOIrxjC5uV1I-CSjmD6ItH4-hGsXM3ezTQoyL713GN2ZeIeDPawIbnXV6Jcyu4zjq0wCHEPjlsW8DhExgTHehNma-1HI2YGHF7dnN_eQ4oCAmIUo8Eh9Ki6SRkVqd5hucrbS3H_ecvd/s400/nb69_plugin_05_maven_38.jpg" /></a> 아래 그림처럼 제시되는데 여기 패키지를 ejb 로 설정하고 마침<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgF4r43Z6MB1SnGEbkJjxqCRFq4RWDdhVfRzE_NYKDsNHKW3DgxHNtOCI8zRLF6fuD4qU7kZcxj2xyRzDkaJPaWes42yLxhUjYPb5cZjYmIUPO88BUBbA_I4ELk6hRU-EaCgGTalPgTlcbH/s1600/nb69_plugin_05_maven_39.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 290px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490700475425250162" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgF4r43Z6MB1SnGEbkJjxqCRFq4RWDdhVfRzE_NYKDsNHKW3DgxHNtOCI8zRLF6fuD4qU7kZcxj2xyRzDkaJPaWes42yLxhUjYPb5cZjYmIUPO88BUBbA_I4ELk6hRU-EaCgGTalPgTlcbH/s400/nb69_plugin_05_maven_39.jpg" /></a><br /><strong>주. Java EE 6 에서의 인터페이스는 옵션입니다. 만약 Java EE 5 라면 세션 빈을 위한 로컬 인터페이스(local interface)를 반드시 생성하고 인터페이스를 통해 세션빈이 호출되게 됩니다만, Java EE 6 의 경우, 로컬 인터페이스는 옵션이며 웹 모듈안의 서블릿은 인터페이스 퍼세이드(facade) 를 통하지 않고 직접 세션빈에 접근 가능합니다.</strong><br /><br />********************************************************************<br /><strong>웹 어플리케이션 만들기</strong><br /><br />이번에는 웹 어플리케이션안에 2개의 서블릿을 만들도록 하겠습니다.<br /><br />포스트된 메시지 목록을 표시하기 위해 사용될 ListNews 서블릿을 만듭니다.<br /><br />포스트된 메시지를 찾거나 findAll 메소드에 액세스하거나 세션 퍼세이드에 주입하기 위해 어노테이션을 사용할 수 있습니다.<br /><br />우선 서블릿을 만들기 위해 웹 모듈 프로젝트에서 마우스 오른쪽을 클릭하여 새로 만들기 - 서블릿 을 선택합니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg13NyHG_vgTolpwUF6QaZlyRBwEabpi6i1IXMVPD1tHpUWayymbqTkl1oqFyDzYQ5VkQ6Z34o-3g2ZJiaHCjK09imevQB7N3q3S_tm_nU8qgsyc2V2BkjeZ9MkVzTcgf_BReWMa7iy7Mo-/s1600/nb69_plugin_05_maven_40.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 327px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490700467621937810" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg13NyHG_vgTolpwUF6QaZlyRBwEabpi6i1IXMVPD1tHpUWayymbqTkl1oqFyDzYQ5VkQ6Z34o-3g2ZJiaHCjK09imevQB7N3q3S_tm_nU8qgsyc2V2BkjeZ9MkVzTcgf_BReWMa7iy7Mo-/s400/nb69_plugin_05_maven_40.jpg" /></a> 서블릿 클래스 이름은 ListNews<br />패키지는 web<br />다음<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHAswJIg0AZGPj2S2A9-72G8BcL2vsVeHHRJ7PTH8T1iRmIO-6CINunrH1ULSi4J2_YikXlfoLwQ42vR4K8ZicjjSzc1Q_7Z5inYUdpiDMDHw6XzOIxvP7SRv0T6pf4kWD6wY7nsrAmr5w/s1600/nb69_plugin_05_maven_41.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490703564503688834" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHAswJIg0AZGPj2S2A9-72G8BcL2vsVeHHRJ7PTH8T1iRmIO-6CINunrH1ULSi4J2_YikXlfoLwQ42vR4K8ZicjjSzc1Q_7Z5inYUdpiDMDHw6XzOIxvP7SRv0T6pf4kWD6wY7nsrAmr5w/s400/nb69_plugin_05_maven_41.jpg" /></a>기본대로 그냥 두고 마침<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTVbxux4hS-RnDQS6snjBJCQBNsa7m9TRdaXVGK3qDyjDzYCJThc0BG9WHvq8KLJl43BbYhPsneOcUyszPs-n8H8goytlWGaASStMkpb-7g3O4aO-s0SL7X32tt9Mwm3g0Pm_Xz6q8pshS/s1600/nb69_plugin_05_maven_42.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490703561275165394" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTVbxux4hS-RnDQS6snjBJCQBNsa7m9TRdaXVGK3qDyjDzYCJThc0BG9WHvq8KLJl43BbYhPsneOcUyszPs-n8H8goytlWGaASStMkpb-7g3O4aO-s0SL7X32tt9Mwm3g0Pm_Xz6q8pshS/s400/nb69_plugin_05_maven_42.jpg" /></a>소스 코드에서 마우스 오른쪽을 눌러 코드 삽입(insert code) 선택합니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0tvE4l9E90JF5nYuclT8wOL3pViS_M_NSa5eOw4PUcDH8JexrvTP01nz9g_3I3ASwjC_kpJDZK7R6b9rjTpBd-QrOUHlmDSyZ0Or4QuhVIcPUG3Ue9j1kchkB4a0DdrqYqTFduxv9lyAJ/s1600/nb69_plugin_05_maven_43.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 327px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490703553166080562" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0tvE4l9E90JF5nYuclT8wOL3pViS_M_NSa5eOw4PUcDH8JexrvTP01nz9g_3I3ASwjC_kpJDZK7R6b9rjTpBd-QrOUHlmDSyZ0Or4QuhVIcPUG3Ue9j1kchkB4a0DdrqYqTFduxv9lyAJ/s400/nb69_plugin_05_maven_43.jpg" /></a>팝업창이 제시되는데 여기서 Call Enterprise Bean 을 선택합니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2yzvW9MYi4VQLSdtXF6gdEa3Ta9HRXD8FeNeZibNQ_OCVPriV3Qqn2MD9BkPrSORo9qS8eaR2DelMU1e9FK6MbqpcuTdalhNqz52Kp2A7HxMFGsfQzplZHA4-_5d5pFIsjP33dB-Fjf5W/s1600/nb69_plugin_05_maven_44.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 327px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490703535922436626" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2yzvW9MYi4VQLSdtXF6gdEa3Ta9HRXD8FeNeZibNQ_OCVPriV3Qqn2MD9BkPrSORo9qS8eaR2DelMU1e9FK6MbqpcuTdalhNqz52Kp2A7HxMFGsfQzplZHA4-_5d5pFIsjP33dB-Fjf5W/s400/nb69_plugin_05_maven_44.jpg" /></a> call enterprise bean 창에서, EJB 모듈을 확장하여 NewsEntityFacade 를 선택한 후 OK<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgajOXKOHXv1-MLp4s7-UnZTTTFqXCJqo6iTUOaUAq8fAZYDzCZBcAoWP84l_evlZm2g4QAKXEX-2sVXHBzTnLYYHPk8lmkjtUhcP17YIbADrWsogT4fMbdOVX9O0TltWulCuroG17Hin_g/s1600/nb69_plugin_05_maven_45.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 297px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490703531675342850" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgajOXKOHXv1-MLp4s7-UnZTTTFqXCJqo6iTUOaUAq8fAZYDzCZBcAoWP84l_evlZm2g4QAKXEX-2sVXHBzTnLYYHPk8lmkjtUhcP17YIbADrWsogT4fMbdOVX9O0TltWulCuroG17Hin_g/s400/nb69_plugin_05_maven_45.jpg" /></a> 그럼, EJB 자원에 대해 @EJB 어노테이션을 사용하여 서블릿에 주입됩니다.<br />--------------------------------------------------------------------------<br />@WebServlet(name = "ListNews", urlPatterns = {"/ListNews"})<br />public class ListNews extends HttpServlet {<br />@EJB<br />private NewsEntityFacade newsEntityFacade;<br />--------------------------------------------------------------------------<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAdGM-DWfkI_ntcMXzuaIAxPDQpjYJMjLr74mqxtR1WHuQZOMjgqZCfLazlzJ2UOL95QHyzqLVnshAMD2u_CihrK_LX8KliUg3GuFvcAKo_qTxi-iTWn_sBuPN7ZpuZgrjs9ifNs373eRg/s1600/nb69_plugin_05_maven_46.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 327px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490704602705240706" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAdGM-DWfkI_ntcMXzuaIAxPDQpjYJMjLr74mqxtR1WHuQZOMjgqZCfLazlzJ2UOL95QHyzqLVnshAMD2u_CihrK_LX8KliUg3GuFvcAKo_qTxi-iTWn_sBuPN7ZpuZgrjs9ifNs373eRg/s400/nb69_plugin_05_maven_46.jpg" /></a> processRequest 메소드에서, 아래 내용을 참고하여 작성합니다.<br />===========================================================================<br />out.println(" <h1>Servlet ListNews at " + request.getContextPath () + "</h1>");<br /><br /><strong>List news = newsEntityFacade.findAll();<br />for (Iterator it = news.iterator(); it.hasNext();) {<br />NewsEntity elem = (NewsEntity) it.next();<br />out.println(" <b>"+elem.getTitle()+" </b><br />");<br />out.println(elem.getBody()+"<br />");<br />}<br />out.println("<a href="http://www.blogger.com/PostMessage">Add new message</a>");</strong><br /><br />out.println("");<br />===========================================================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPWVJH2clUUvXhXRc-_VTaPG9Y4bsvqkAsmz1bAXsufU4_mlGBh_PikgmHHX5CsBmLEeZg1RidgvWxRq7HHYF0ErByCKw3e7BhFIAEndxryJ2mCzKh4MMOhhJDMDYwXHTw5GKm_VQnS0tS/s1600/nb69_plugin_05_maven_47.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 327px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490704592698364178" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPWVJH2clUUvXhXRc-_VTaPG9Y4bsvqkAsmz1bAXsufU4_mlGBh_PikgmHHX5CsBmLEeZg1RidgvWxRq7HHYF0ErByCKw3e7BhFIAEndxryJ2mCzKh4MMOhhJDMDYwXHTw5GKm_VQnS0tS/s400/nb69_plugin_05_maven_47.jpg" /></a>임포트 문제는 여백에서 마우스 오른쪽을 클릭하여 가져오기 고정(fix import)로 해결,<br />java.util.*<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtibVk-s4ekG7oLzUBDZT0G3KfCzw5cVrNXDzbmNQ3urB2Ttf2tlo3dKo9_KiS-_qxJ94hnqLfjgvSAKTW_8_-1JdRneqRlnHY1_rBUrKgFvsRjgwpDwFeEhmRZ1Rx3SbgbHqJCK0CAuRG/s1600/nb69_plugin_05_maven_48.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 327px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490704588340941906" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtibVk-s4ekG7oLzUBDZT0G3KfCzw5cVrNXDzbmNQ3urB2Ttf2tlo3dKo9_KiS-_qxJ94hnqLfjgvSAKTW_8_-1JdRneqRlnHY1_rBUrKgFvsRjgwpDwFeEhmRZ1Rx3SbgbHqJCK0CAuRG/s400/nb69_plugin_05_maven_48.jpg" /></a> 임포트 확인 - OK<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1SHvxh5dcd9t1GTQWOesgBMWl6ADOw6ou1F3-fZUpl89rKUdn16SXhB2N-BLgzJJcW0allwlUYrZuN0lmhrScfm769sjj2bjLTRPLTn-g2gKKW7jBdClNjQeZjTd_hVepBFWQVYvIqqsX/s1600/nb69_plugin_05_maven_49.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 213px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490704578865192530" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1SHvxh5dcd9t1GTQWOesgBMWl6ADOw6ou1F3-fZUpl89rKUdn16SXhB2N-BLgzJJcW0allwlUYrZuN0lmhrScfm769sjj2bjLTRPLTn-g2gKKW7jBdClNjQeZjTd_hVepBFWQVYvIqqsX/s400/nb69_plugin_05_maven_49.jpg" /></a>**********************************************************************<br /><strong>포스트메시지 서블릿 만들기</strong><br /><br />이번에는 메시지를 포스트하는데 사용할 PostMessage 서블릿을 만들도록 하겠습니다.<br />어노테이션을 사용하게 되면 변수 이름이나 매핑될 이름을 지정하는데 있어, 서블릿에 JMS 리소스를 직접 주입할 수 있습니다.<br /><br />우선 웹 모듈 프로젝트에서 마우스 오른쪽을 클릭하여 새로 만들기 - 서블릿<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYZHwMBdziUOz8ogsm5eizsn-RADF4kpHeYMntL0njwgfJjiS0BXLGAxdY6JMTm8ATpTHG7aRUYPQQ9frLN3cQ1JVNTqwj15fZvuPBCzInZCZMtd5FPrxKfilvNB_0UneHRug7zSVri-tJ/s1600/nb69_plugin_05_maven_50.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 327px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490704577762332658" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYZHwMBdziUOz8ogsm5eizsn-RADF4kpHeYMntL0njwgfJjiS0BXLGAxdY6JMTm8ATpTHG7aRUYPQQ9frLN3cQ1JVNTqwj15fZvuPBCzInZCZMtd5FPrxKfilvNB_0UneHRug7zSVri-tJ/s400/nb69_plugin_05_maven_50.jpg" /></a> 서블릿 클래스 이름은 PostMessage<br />패키지 web - 다음<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyxp3R9bzrnh579wLs6LKNAU2tuNcbDcaCR4HIC8b3RbLUF3kETjsv5g93OEkcndzBmspcxU4W3C09Eq3JMQmZKk01t6F00372bdh34vsWdWbSntsKynZUg0JG-qmXBCrqCwkVxLEvJSyx/s1600/nb69_plugin_05_maven_51.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490706625737491954" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyxp3R9bzrnh579wLs6LKNAU2tuNcbDcaCR4HIC8b3RbLUF3kETjsv5g93OEkcndzBmspcxU4W3C09Eq3JMQmZKk01t6F00372bdh34vsWdWbSntsKynZUg0JG-qmXBCrqCwkVxLEvJSyx/s400/nb69_plugin_05_maven_51.jpg" /></a>역시 기본사항대로 그대로 두고 마침<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKpSdysQZ-9XbSCoUAdrtGf2zN0t9b-xqLbsI3wO3G1E74bb0nuslmnn57g6HslKlM-qf7r-F_ZIB4ZvSHCk1T8zR9PkPX0T0UXGBzaPOt05hyEmYu1lqlcMy_qCTr936JufiSq96CqpkU/s1600/nb69_plugin_05_maven_52.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490706615309885218" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKpSdysQZ-9XbSCoUAdrtGf2zN0t9b-xqLbsI3wO3G1E74bb0nuslmnn57g6HslKlM-qf7r-F_ZIB4ZvSHCk1T8zR9PkPX0T0UXGBzaPOt05hyEmYu1lqlcMy_qCTr936JufiSq96CqpkU/s400/nb69_plugin_05_maven_52.jpg" /></a> ConnectionFactory 와 Queue 자원을 주입하기 위해 어노테이션을 사용한 다음 내용을 추가합니다.<br />==================================================================================<br />@WebServlet(name="PostMessage", urlPatterns={"/PostMessage"})<br />public class PostMessage extends HttpServlet {<br /><strong>@Resource(mappedName="jms/NewMessageFactory")<br />private ConnectionFactory connectionFactory;<br /><br />@Resource(mappedName="jms/NewMessage")<br />private Queue queue;</strong><br /><br />==================================================================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHM2ehzAw8oBygCREhbfN2t7OpX7g4aLnAtSkzTviPfNZHAEdjpTjLyHgbXDe0N3vuD4XC6wPYRUaVFahH9x1vSLoupB1BVWJtixTIwcL0CH1B0_LzxIR8mszRT6nc66FKvlqfS4aYbwma/s1600/nb69_plugin_05_maven_53.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 327px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490706607321595730" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHM2ehzAw8oBygCREhbfN2t7OpX7g4aLnAtSkzTviPfNZHAEdjpTjLyHgbXDe0N3vuD4XC6wPYRUaVFahH9x1vSLoupB1BVWJtixTIwcL0CH1B0_LzxIR8mszRT6nc66FKvlqfS4aYbwma/s400/nb69_plugin_05_maven_53.jpg" /></a> 임포트 문제를 해결하기 위해 마우스 오른쪽 클릭 - 가져오기 고정(fix import)<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhd-u4sKvG5YivEdAoWPH614wHN9SVfGdz2QAh3MfM2VnMevcEReJ4cLsK4_-MTP4rtMspktsnLbse4cVc0kC4IVK2eg040doMw9uHb3qZNWPKp5Vbr08CBY2cWx7OvJOCwO_K9PW2S8QwT/s1600/nb69_plugin_05_maven_54.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 327px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490706597825735730" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhd-u4sKvG5YivEdAoWPH614wHN9SVfGdz2QAh3MfM2VnMevcEReJ4cLsK4_-MTP4rtMspktsnLbse4cVc0kC4IVK2eg040doMw9uHb3qZNWPKp5Vbr08CBY2cWx7OvJOCwO_K9PW2S8QwT/s400/nb69_plugin_05_maven_54.jpg" /></a> javax.jms 라이브러리를 임포트 해야하는데 다음 그림처럼 지원되지 않습니다.<br />cancel 해서 빠져나옵니다<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0oKE8lgSncS6Zm7jxYvh7wsnryPgmrH4n05E1Wj6UPqURr_SigzJPSZ3LgHdhgcZz1PdBb74Fph8_ptg1xgNmooE5x54fbHoh69NS121owhtXEClcAwrfwLnB6g47aVsDSIX0nZ0qwMWD/s1600/nb69_plugin_05_maven_55.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 281px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490706596554544610" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0oKE8lgSncS6Zm7jxYvh7wsnryPgmrH4n05E1Wj6UPqURr_SigzJPSZ3LgHdhgcZz1PdBb74Fph8_ptg1xgNmooE5x54fbHoh69NS121owhtXEClcAwrfwLnB6g47aVsDSIX0nZ0qwMWD/s400/nb69_plugin_05_maven_55.jpg" /></a>ConnectionFactory 에서 앞에 아이콘을 누르면 팝업창으로 해결안이 제시되는데, 여기서 Search Dependency at Maven Repositories for ConnectionFactory 를 선택하여 누릅니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfFlMg51O23zPy8sZo9CL3aj-NkyR0F_Svbi8oV59CIScVcUO8ElwL3rNaavCQEnR3CmNuSCNqlswNwnjNsCBBfCSJIDbfNmNwFrpRnYVUKKFWlvuJ2wkoaa-9_huVtTt4_Aqr-xqe-7Ct/s1600/nb69_plugin_05_maven_56.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 327px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490707785912046546" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfFlMg51O23zPy8sZo9CL3aj-NkyR0F_Svbi8oV59CIScVcUO8ElwL3rNaavCQEnR3CmNuSCNqlswNwnjNsCBBfCSJIDbfNmNwFrpRnYVUKKFWlvuJ2wkoaa-9_huVtTt4_Aqr-xqe-7Ct/s400/nb69_plugin_05_maven_56.jpg" /></a> 그럼 메이븐 저장소에서 탐색 창이 뜨는데 여기 클래스 이름에 ConnectionFactory 를 적으면 ConnectionFactory를 포함하고 있는 artifacts 들이 제시됩니다.<br />여기서 javax: javaee-api 에 6.0[jar]-local 을 선택합니다.<br />추가<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpUSCKBzVuRfH0BPzg5RHBdvN4Y6ywz-idHXZh_BrvOKM6fuXPLCDlO7PrDZK_DpKClDso2UKG1_ENtXo1XzNhaBitsdwRUjfrr_4_VyTzPnxV4taW0gFZ6-n_zgvLxmCAhx997lt_YFYv/s1600/nb69_plugin_05_maven_57.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 340px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490707777428757154" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpUSCKBzVuRfH0BPzg5RHBdvN4Y6ywz-idHXZh_BrvOKM6fuXPLCDlO7PrDZK_DpKClDso2UKG1_ENtXo1XzNhaBitsdwRUjfrr_4_VyTzPnxV4taW0gFZ6-n_zgvLxmCAhx997lt_YFYv/s400/nb69_plugin_05_maven_57.jpg" /></a> 그런 다음 다시 가져오기 고정(fix import)<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgImeWudI2ACD2F6f9PeXg-YNva_Esiz88GmheoFDylLT4ZJNS0r-08VQUeM5B89tttfKfauKe_gl0gj46KOldyYHh13k0sN1NebSZb6oObuyzBcO6v_E558LmiveLtdptGak_gYbe5eWHM/s1600/nb69_plugin_05_maven_58.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 327px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490707769245183586" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgImeWudI2ACD2F6f9PeXg-YNva_Esiz88GmheoFDylLT4ZJNS0r-08VQUeM5B89tttfKfauKe_gl0gj46KOldyYHh13k0sN1NebSZb6oObuyzBcO6v_E558LmiveLtdptGak_gYbe5eWHM/s400/nb69_plugin_05_maven_58.jpg" /></a> 아래 그림을 참고하여 제대로 임포트를 수정합니다. (javax.jms.*) - OK<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiG0hDaUg_IhieASfwnwJy_moZzBsIDW0NjEcI_OU54dp-rFo7vL-Rn4BShmXGf3Xq5sFsd5OqlfI3oqS9JfSjQ5wSZKRHRViFiFVNMGhyGGzKzCnWJmhkMtPFFnX05oCfO7_dPL8zhp2Vh/s1600/nb69_plugin_05_maven_59.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 281px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490707765278442242" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiG0hDaUg_IhieASfwnwJy_moZzBsIDW0NjEcI_OU54dp-rFo7vL-Rn4BShmXGf3Xq5sFsd5OqlfI3oqS9JfSjQ5wSZKRHRViFiFVNMGhyGGzKzCnWJmhkMtPFFnX05oCfO7_dPL8zhp2Vh/s400/nb69_plugin_05_maven_59.jpg" /></a> 그리고 processRequest 메소드에 JMS 메시지를 보내기 위한 코드를 다음과 같이 작업합니다.<br />==============================================================================<br />response.setContentType("text/html;charset=UTF-8");<br /><br /><strong>// Add the following code to send the JMS message<br />String title=request.getParameter("title");<br />String body=request.getParameter("body");<br />if ((title!=null) && (body!=null)) {<br />try {<br />Connection connection = connectionFactory.createConnection();<br />Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);<br />MessageProducer messageProducer = session.createProducer(queue);<br /><br />ObjectMessage message = session.createObjectMessage();<br />// here we create NewsEntity, that will be sent in JMS message<br />NewsEntity e = new NewsEntity();<br />e.setTitle(title);<br />e.setBody(body);<br /><br />message.setObject(e);<br />messageProducer.send(message);<br />messageProducer.close();<br />connection.close();<br />response.sendRedirect("ListNews");<br /><br />} catch (JMSException ex) {<br />ex.printStackTrace();<br />}<br />}</strong><br />==============================================================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizHaWzAfcdS1QtsT3TCJFtzMTa-ZwRPmlg8mkoK-QT6EUxZ2dTX-_fcDsGaCrd9cjM-5K0j5_oGrqXVX_8e8w8lJWLdVA7Ewm6JrqpsoFaJ_t12uQrkfjXQPX4ssFVaHiW1BCreEr4ESyi/s1600/nb69_plugin_05_maven_60.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 327px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490707760156800690" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizHaWzAfcdS1QtsT3TCJFtzMTa-ZwRPmlg8mkoK-QT6EUxZ2dTX-_fcDsGaCrd9cjM-5K0j5_oGrqXVX_8e8w8lJWLdVA7Ewm6JrqpsoFaJ_t12uQrkfjXQPX4ssFVaHiW1BCreEr4ESyi/s400/nb69_plugin_05_maven_60.jpg" /></a> 그리고 아래 HTML 부분은 주석을 해제하고 다음 내용을 붙여 넣습니다.<br />==================================================================================<br />out.println("Servlet PostMessage at " + request.getContextPath() + "</h1>");<br /><br /><strong>// The following code adds the form to the web page<br />out.println("<form>");<br />out.println("Title: <input type='text' name='title'><br/>");<br />out.println("Message: <textarea name='body'></textarea><br/>");<br />out.println("<input type='submit'><br/>");<br />out.println("</form>");</strong><br /><br />out.println("</body>");<br />==================================================================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUOxPBVgsHpiYGvlaWxJZ5J9lF82THI5wM50NYxtLvl2c4gDmUBFJwh966YEdpCQ_nsGGRiHvFmx2v1jME0Exi8rEcYUcbxHTeI0x47FmbYJYUjFPaLtoIM4-MV_4Bo5GqnKuYlY0dHlbz/s1600/nb69_plugin_05_maven_61.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 327px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490709359211766402" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUOxPBVgsHpiYGvlaWxJZ5J9lF82THI5wM50NYxtLvl2c4gDmUBFJwh966YEdpCQ_nsGGRiHvFmx2v1jME0Exi8rEcYUcbxHTeI0x47FmbYJYUjFPaLtoIM4-MV_4Bo5GqnKuYlY0dHlbz/s400/nb69_plugin_05_maven_61.jpg" /></a> 임포트 수정 - 가져오기 고정(fix import)<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvRXyGSMiNqZyHAD4xtGtFDNwQQzp0u_Rx81hdRlis7UEXQqNi3CkeO_cWjjiNOiZHOmuLuKZKKKnK8ljXTpYPOSgz05HrE75CEWwZiSvrDNBUCBIXQx1JwsV9AFG2Zo90vaA0C7HIoXSZ/s1600/nb69_plugin_05_maven_62.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 327px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490709346810699442" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvRXyGSMiNqZyHAD4xtGtFDNwQQzp0u_Rx81hdRlis7UEXQqNi3CkeO_cWjjiNOiZHOmuLuKZKKKnK8ljXTpYPOSgz05HrE75CEWwZiSvrDNBUCBIXQx1JwsV9AFG2Zo90vaA0C7HIoXSZ/s400/nb69_plugin_05_maven_62.jpg" /></a> 확인후 OK<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVvlXccQ7eB-tkcOg-NE3Y1fFFi5h5a3jnKYUJ12Oo92-UaRTBf1QZQV-q9d2nwVCbwRFUNMuwHaqlNHTh68ERx6pJ5DAXX3wYQkwx0pfXlmaZLVvNgvkQ-swb3ImBnAk3qVI7DeF1oosM/s1600/nb69_plugin_05_maven_63.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 294px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490709340707565266" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVvlXccQ7eB-tkcOg-NE3Y1fFFi5h5a3jnKYUJ12Oo92-UaRTBf1QZQV-q9d2nwVCbwRFUNMuwHaqlNHTh68ERx6pJ5DAXX3wYQkwx0pfXlmaZLVvNgvkQ-swb3ImBnAk3qVI7DeF1oosM/s400/nb69_plugin_05_maven_63.jpg" /></a>***********************************************************************<br /><strong>메이븐으로 어플리케이션 빌드하기</strong><br /><br />이제 엔터프라이즈 어플리케이션을 빌드하기 위한 메이븐 사용에 대해 알아 보겠습니다.<br /><br />작업은 EAR 아카이브에 프로젝트를 빌드 및 패키지하게되며, 이 EAR 아카이브에는 EJB Jar 아카이브와 WAR 아카이브를 포함하게 됩니다. EAR 아카이브 생성이 완료되면 대상 서버에 이 아카이브를 배포하면 됩니다.<br /><br /><strong>프로젝트 의존성과의 작업</strong><br /><br />각 메이븐 프로젝트는 pom.xml 파일을 가지고 있는데 여기에는 아카이브에 대한 상세 내용을 포함하고 있습니다.<br /><br />프로젝트에서 필요로 하는 외부 라이브러리는 pom.xml 안에 dependencies 로 목록화 됩니다. 아카이브를 패키징 할 때 포함될 의존성(dependencies)를 지정할 수도 있습니다.<br /><br />이번 어플리케이션에서는 EAR 아카이브 안에 EJB JAR와 WAR 아카이브가 포합됩니다. 따라서 Assembly 프로젝트의 pom.xml 을 열러보면 dependencies 로 선언된 EJB와 WAR 내용을 볼 수 있습니다. 확인<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsd0FVi8lMCrw2ORusVpUibpXJQOMCAVxB5Z-1mW_AL8rOMTrvGmfASjcr6m_2RRXKG5j_vXW-AAkBQywBKZZt4Up3sa_9kl39ZrZzln1cJph2eRaxN8KoYCAE7dvLGcBWCN2nw_wP-PUW/s1600/nb69_plugin_05_maven_64.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 327px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490709321095607810" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsd0FVi8lMCrw2ORusVpUibpXJQOMCAVxB5Z-1mW_AL8rOMTrvGmfASjcr6m_2RRXKG5j_vXW-AAkBQywBKZZt4Up3sa_9kl39ZrZzln1cJph2eRaxN8KoYCAE7dvLGcBWCN2nw_wP-PUW/s400/nb69_plugin_05_maven_64.jpg" /></a> 웹(WebApp) 프로젝트의 pom.xml 에서는 dependency 로 선언된 EJB 아카이브를 확인할 수 있습니다. WebApp 프로젝트는 의존으로 EJB 아카이브가 필요하지, 패키징하는 동안 WAR 안에 EJB 아카이브가 포함되길 원하지는 않습니다. 즉, EJB 아카이브는 사용 가능하면 되고, EAR 아카이브의 일부로 WebApp 에 제공되게 하면 됩니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgazbT4hFcEYGk6EihHGYAghL68SOSsl-cLEDrf2DotyqBWI7wv08izt6sglIitv1K83ZyCkgAIRKwjaWKFj-rF1YJO8df18AAqarTsGqCmlhXY65ue_MNJoVmABPrffheJRDgRsk8RB0Po/s1600/nb69_plugin_05_maven_65.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 327px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490709312922181330" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgazbT4hFcEYGk6EihHGYAghL68SOSsl-cLEDrf2DotyqBWI7wv08izt6sglIitv1K83ZyCkgAIRKwjaWKFj-rF1YJO8df18AAqarTsGqCmlhXY65ue_MNJoVmABPrffheJRDgRsk8RB0Po/s400/nb69_plugin_05_maven_65.jpg" /></a>팁: pom.xml 에서 오른쪽 마우스를 클릭하면 종속성 그래프 보기(Show Dependency Graph) 가 있습니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmNCEEUCdaQPcuXlVlt-mQ4xuwkfoF4b-tEpyGhOohKy5wdPpZRPIDRtjq_JF9va35opScDHDanSmosCaiGBWS1-feBCTO22HPBNs_YZvbJqgTTI1VUBH_1kzLBPghey8mVnMJCld2BhqU/s1600/nb69_plugin_05_maven_66.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 327px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490721826486170226" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmNCEEUCdaQPcuXlVlt-mQ4xuwkfoF4b-tEpyGhOohKy5wdPpZRPIDRtjq_JF9va35opScDHDanSmosCaiGBWS1-feBCTO22HPBNs_YZvbJqgTTI1VUBH_1kzLBPghey8mVnMJCld2BhqU/s400/nb69_plugin_05_maven_66.jpg" /></a>이 메뉴는 프로젝트의 의존관계를 비주얼 적으로 표시 해 줍니다. 또한 아티팩트 위에 마우스 커서를 위치하면 해당 아티팩트의 상세 내용이 툴팁으로 나타납니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjj4XNvL0M7-gLfgHKKvt4MVsXdiHQPgITcjRFerDaR67Djnnc1sk_eYzCxLyacc0sPyXPOJBKqT2H3HL_1DcOtYC0AYORz_VJRcyn6W01LDMckHR-fK7WJLrYwkhI2KzOeTk0g-ibY3I6/s1600/nb69_plugin_05_maven_67.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 327px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490721816394142370" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjj4XNvL0M7-gLfgHKKvt4MVsXdiHQPgITcjRFerDaR67Djnnc1sk_eYzCxLyacc0sPyXPOJBKqT2H3HL_1DcOtYC0AYORz_VJRcyn6W01LDMckHR-fK7WJLrYwkhI2KzOeTk0g-ibY3I6/s400/nb69_plugin_05_maven_67.jpg" /></a>다시 계속하자면 아까 제공만 되고 포함되지 않도록 하려면 WebApp 프로젝트에서 프로젝트 파일을 확장하여 pom.xml 을 더블 클릭릭한 후<br />MavenEnterpriseApp-ejb 아티팩트 아래<br />다음 내용을 추가 합니다.<br />===================================================================<br /><dependency><br /><groupId>com.mycompany</groupId><br /><artifactId>MavenEnterpriseApp-ejb</artifactId><br /><strong><scope>provided</scope></strong><br /><version>1.0-SNAPSHOT</version><br /></dependency><br />===================================================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKDaXWt4_Hu93YNXImLh1ximEHM1VkXCa2Por0puMNm6s2MmX-rH0sD-ExL_h1hU-7Y5P48Do8E3CISVvmPlwz4VPy0-IUlbj2nW6xwP6tdYX6tR6mABHuGNxF5_Xhr1veCAB0KOFHneN5/s1600/nb69_plugin_05_maven_68.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 327px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490721812033903346" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKDaXWt4_Hu93YNXImLh1ximEHM1VkXCa2Por0puMNm6s2MmX-rH0sD-ExL_h1hU-7Y5P48Do8E3CISVvmPlwz4VPy0-IUlbj2nW6xwP6tdYX6tR6mABHuGNxF5_Xhr1veCAB0KOFHneN5/s400/nb69_plugin_05_maven_68.jpg" /></a>**********************************************************************<br /><strong>의존성을 가지고 빌드</strong><br /><br />메이븐 빌드 프레임워크는 특정 단계의 연속을 통해 진행되며, 하나나 그 이상의 목표로 구성된 각 단계는 다양한 메이븐 플러그인을 사용하여 구성될 수 있습니다.<br /><br />'의존성을 가지고 빌드(Build with Dependencies)' 메뉴는 메이븐 빌드 생명주기의 install 단계에 매핑되며 Reactor 플러그인을 사용하여 구성됩니다.<br /><br />팝업창에서 Build with Dependencies 메뉴를 선택하면 메이븐은 어플리케이션과 필요한 종속성(dependencies)을 빌드하고 로컬 저장소에 빌드 아티팩트를 복사합니다.<br /><br />EAR 아카이브를 빌드하려면 Assembly 프로젝트에서 마우스 오른쪽 클릭 - 종속성을 가지고 빌드(Build with Dependencies) 클릭<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPfDXxJqS-V2IXF3vHwqon3zPB-hYPuY_x-q_B-KCk0tOpd8zc4Z7EvBjsE0mKfWOEBO2GOIaklMGqHkq_SyMPBhLTVicKKTkn-aqssENyOPyqM9n837vG975dS70Lt2Jl0vkhvmLaoira/s1600/nb69_plugin_05_maven_69.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 327px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490721797828294034" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPfDXxJqS-V2IXF3vHwqon3zPB-hYPuY_x-q_B-KCk0tOpd8zc4Z7EvBjsE0mKfWOEBO2GOIaklMGqHkq_SyMPBhLTVicKKTkn-aqssENyOPyqM9n837vG975dS70Lt2Jl0vkhvmLaoira/s400/nb69_plugin_05_maven_69.jpg" /></a> Reactor 플러그인을 사용하여 Assembly 프로젝트를 빌드하면, Assembly 프로젝트가 빌드되기전 서브 프로젝트의 종속성이 빌드됩니다.<br />출력창에 빌드 순서가 표시됩니다. (EJB-Webapp-Assembly)<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglsdRLYUjhw9AEmhUrifTiT3R2aCtKwmYrnl7a3vqLxTLau_u9Ma8W_qrNZsoFl3GXSLAowZ9t_nERmQJkcNxAOPxMLmXxkxMeiAADpH9j69N4Psd5qUz1imfUC2By27Gv2pbdWyNQQBXG/s1600/nb69_plugin_05_maven_70.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 327px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490721788264849170" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglsdRLYUjhw9AEmhUrifTiT3R2aCtKwmYrnl7a3vqLxTLau_u9Ma8W_qrNZsoFl3GXSLAowZ9t_nERmQJkcNxAOPxMLmXxkxMeiAADpH9j69N4Psd5qUz1imfUC2By27Gv2pbdWyNQQBXG/s400/nb69_plugin_05_maven_70.jpg" /></a>출력창에 빌드 결과가 나타납니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiABhv1Isu84xoiJ0cHQK1SosolVfiEf5OvoXJVc5-HQU8CVRVAdjkPhg9g5g8nG_lq6Tv528DSjTGSPCRxNdFTed-MhkhHDTVFJMjcG9oGk76ph2T3PFHV9dh3Zb9EjnJAN54STdf-97GY/s1600/nb69_plugin_05_maven_71.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 327px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490725158591645170" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiABhv1Isu84xoiJ0cHQK1SosolVfiEf5OvoXJVc5-HQU8CVRVAdjkPhg9g5g8nG_lq6Tv528DSjTGSPCRxNdFTed-MhkhHDTVFJMjcG9oGk76ph2T3PFHV9dh3Zb9EjnJAN54STdf-97GY/s400/nb69_plugin_05_maven_71.jpg" /></a> 메이븐 브라우저 창에 로컬 저장소에 보면 지금 작업된 아카이브가 com.mycompany 에 올라와 있는 걸 확인할 수 있습니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiKR7B7OBg2aw1hFgAsnEFaHdVlCyMFj7YkL_Wj-2MjB6owSw6DHXjhB2LpKzRCfjYqYr_MG0KsZKFUcpSESelCvPle_Kpu_l69q8w1v95mRcQj592GgvKGQUWC3FiDIyI5hLHP6RLUZOY/s1600/nb69_plugin_05_maven_72.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 327px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490725150424730194" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiKR7B7OBg2aw1hFgAsnEFaHdVlCyMFj7YkL_Wj-2MjB6owSw6DHXjhB2LpKzRCfjYqYr_MG0KsZKFUcpSESelCvPle_Kpu_l69q8w1v95mRcQj592GgvKGQUWC3FiDIyI5hLHP6RLUZOY/s400/nb69_plugin_05_maven_72.jpg" /></a>*******************************************************************<br /><strong><span style="font-size:130%;">EAR 아카이브 배포하기</span></strong><br /><br />이번에는 서버에 EAR 아카이브를 배포할 수 있는 2가지 방법에 대해서 알아 보겠습니다.<br /><br />하나는 IDE에 메뉴 작업을 사용하여 글래스 피시 서버에 어플리케이션을 배포(deploy)할 수도 있고,<br />다른 하나는 글래스피시 관리 콘솔 안에 배포툴(deploy tool)을 사용할 수도 있습니다.<br /><br /><strong>IDE 에서 배포하기</strong><br /><br />Run 작업에 매핑된 Maven 목표를 수정하여 배포합니다.<br />우선, Assembly 프로젝트에서 마우스 오른쪽을 클릭하여 맨 아래 등록정보를 누릅니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEoMIxuh2fitTYGEIeXeSaW2WwJWRJSwrNewp800t1Y-TLWQUG4ASsm5pGNp5b1q82uFcJJvXL95VGGWqfwZIjoZbKxa0jR8_-VRNE2ma5Bz1Snj4wdc-iZhBfK76wrkFq2KPvCwSkqI3b/s1600/nb69_plugin_05_maven_73.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 327px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490725141780254594" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEoMIxuh2fitTYGEIeXeSaW2WwJWRJSwrNewp800t1Y-TLWQUG4ASsm5pGNp5b1q82uFcJJvXL95VGGWqfwZIjoZbKxa0jR8_-VRNE2ma5Bz1Snj4wdc-iZhBfK76wrkFq2KPvCwSkqI3b/s400/nb69_plugin_05_maven_73.jpg" /></a> 카테고리에 작업을 선택한 뒤, 오른쪽의 작업 중에 프로젝트 실행 (Run project) 를 선택하고<br />아래 execute goal 을 기존의 package 를 지우고 install 로 바꿉니다.<br />OK<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj26BSvFwZfcXJL2dXBcSStQSseznCYd8z2DtiptisMoLLATG2acJroxAc39pcZi47AiOxYzqtnei3jpTKxeK0I-UXKBWgzSZ7RZt1ItzcoE2iJ8YuT-X0Zc5ZRURe2Y-f8fH7hi6ns_acl/s1600/nb69_plugin_05_maven_74.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 273px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490725123396599026" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj26BSvFwZfcXJL2dXBcSStQSseznCYd8z2DtiptisMoLLATG2acJroxAc39pcZi47AiOxYzqtnei3jpTKxeK0I-UXKBWgzSZ7RZt1ItzcoE2iJ8YuT-X0Zc5ZRURe2Y-f8fH7hi6ns_acl/s400/nb69_plugin_05_maven_74.jpg" /></a>Assembly 프로젝트에서 마우스 오른쪽을 클릭하고 실행<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9e56cIb8bk8Cq3TVyMIqEMmqtnvmyC-W8MmnAq3rO3qeQiMJCi9gNHJzBtsgsyRWTqsKyvIFvG8Zk9mbfvvi4z3wCg8HgpCaznBgX9nZeQa5B4tKJhxiq4_jGXepBEy_HYdYDIQTeJ9LO/s1600/nb69_plugin_05_maven_75.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 327px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490725104784528322" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9e56cIb8bk8Cq3TVyMIqEMmqtnvmyC-W8MmnAq3rO3qeQiMJCi9gNHJzBtsgsyRWTqsKyvIFvG8Zk9mbfvvi4z3wCg8HgpCaznBgX9nZeQa5B4tKJhxiq4_jGXepBEy_HYdYDIQTeJ9LO/s400/nb69_plugin_05_maven_75.jpg" /></a> 아래그림과 같이 배포 서버 선택 창이 뜨는데 서버를 글래스피시 서버 3.1 선택 - OK<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2bQAVeL4kPCX-3h_2oj-BM5Wzs4wAHlVo237ykZPAjmXLW9T6Pg0vcuZfcPyoxoj8MKLvgTK17jS8WhdoSOLBwfp4F3eXFnZdrghUpbRsMVGGR9jo_SLe9SBrQiAPsGNdTdamSfGYiAyn/s1600/nb69_plugin_05_maven_76.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 238px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490725975794771666" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2bQAVeL4kPCX-3h_2oj-BM5Wzs4wAHlVo237ykZPAjmXLW9T6Pg0vcuZfcPyoxoj8MKLvgTK17jS8WhdoSOLBwfp4F3eXFnZdrghUpbRsMVGGR9jo_SLe9SBrQiAPsGNdTdamSfGYiAyn/s400/nb69_plugin_05_maven_76.jpg" /></a> 배포 서버가 선택되면 IDE 가 서버에 JMS 리소스를 만들고 EAR 아카이브를 배포합니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-i4LgUK8NgFo-FKDFw2qrLd-xBysF9Ma9W6rh-2dGizj4ELDMiD5OWZhs3W8vT2Ss0wqLCPclDeCoed4PXKJV1wi3bV5tFD22cvVsojV2BmMehWFedIF_trquIXCPxp6L41_30zvDQ89o/s1600/nb69_plugin_05_maven_77.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 327px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490725972969311698" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-i4LgUK8NgFo-FKDFw2qrLd-xBysF9Ma9W6rh-2dGizj4ELDMiD5OWZhs3W8vT2Ss0wqLCPclDeCoed4PXKJV1wi3bV5tFD22cvVsojV2BmMehWFedIF_trquIXCPxp6L41_30zvDQ89o/s400/nb69_plugin_05_maven_77.jpg" /></a>***************************************************************<br />2번째 방법: 글래스피시 관리 콘솔에서 배포하기<br />글래스피시 관리 콘솔의 배포 툴(Deploy tool)을 사용하여 EAR 아카이브를 배포하는 방법에 대해 알아 보겠습니다.<br />우선, 서비스 탭의 서버를 확장한 뒤, 글래스피시 서버에서 마우스 오른쪽 클릭 - 관리 콘솔 보기(view admin console) 선택<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwVztdz8yQDN8JcmpeaKO8tlFgqKHauqj7TkzoXA6wbPcl_Fk5sF4NkPFQNV7Vr_AgazjjDRKYsR9cGoKs28i8AZFQvKl6E8t2-LVNXPfQbKDfC3fAhzArhaxshQz-O_TlO7Nlj6_rYg8Z/s1600/nb69_plugin_05_maven_78.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 327px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490725969601631682" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwVztdz8yQDN8JcmpeaKO8tlFgqKHauqj7TkzoXA6wbPcl_Fk5sF4NkPFQNV7Vr_AgazjjDRKYsR9cGoKs28i8AZFQvKl6E8t2-LVNXPfQbKDfC3fAhzArhaxshQz-O_TlO7Nlj6_rYg8Z/s400/nb69_plugin_05_maven_78.jpg" /></a> 브라우저에 관리 콘솔이 나타나면 왼쪽 창에서 응용 프로그램을 선택하면 오른쪽에 아래 그림과 같이 나타납니다.<br />여기서 배포 버튼 클릭<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8vVxatX_45v78UktfQIsDuGQ_yaiMr6Vx2HM-wuM5qKtEqaa4zBotA1BIzJku3kJfcSKVTX3J3YTBmikNlPPn4i6NHq43xOoVo_q0borj4O_qnIgrglvmaFGjy8Q79g_DQhXANeI2M7iF/s1600/nb69_plugin_05_maven_79.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 339px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490725962105425218" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8vVxatX_45v78UktfQIsDuGQ_yaiMr6Vx2HM-wuM5qKtEqaa4zBotA1BIzJku3kJfcSKVTX3J3YTBmikNlPPn4i6NHq43xOoVo_q0borj4O_qnIgrglvmaFGjy8Q79g_DQhXANeI2M7iF/s400/nb69_plugin_05_maven_79.jpg" /></a> 배포할 EAR 아카이브를 선택하기 위해 찾아보기 버튼을 클릭한 후,<br />엔터프라이즈 어플리케이션 프로젝트안에 target 디렉터리 안에 있는 EAR 아카이브를 찾아 연결해줍니다 - 저장<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9vZmBsldjpHIZyExrFJbh_pfSYYtnN7bHjVE-kjybuTC2u446gpUgOXh7Y3IYb2Ur6n1drxuy17hxLhyocyOoiK5R6N52oxbFR3Vj-Ue9OdLDgraJxHff6XprO2HJvCeXBXTWqPpK0nox/s1600/nb69_plugin_05_maven_80.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 339px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490725942881080498" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9vZmBsldjpHIZyExrFJbh_pfSYYtnN7bHjVE-kjybuTC2u446gpUgOXh7Y3IYb2Ur6n1drxuy17hxLhyocyOoiK5R6N52oxbFR3Vj-Ue9OdLDgraJxHff6XprO2HJvCeXBXTWqPpK0nox/s400/nb69_plugin_05_maven_80.jpg" /></a> 배포된 엔터프라이즈 응용 프로그램을 선택하면 다음과 같은 내용을 확인해 볼수 있습니다. 참고<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPK29r2RG7jQ5pDR5paBS0JtI5usQ4Bev5WDPnOW4XC5VyH2v8XPh02uzrzyr4WkWue-Yiniotj-VbcYX4GrNDiOZL9RvMkJLGOsXOc90tmxZNmUOiW0MvxAnIdr1HTpMGOTeYGPZODjHT/s1600/nb69_plugin_05_maven_81.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 339px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490726947477226994" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPK29r2RG7jQ5pDR5paBS0JtI5usQ4Bev5WDPnOW4XC5VyH2v8XPh02uzrzyr4WkWue-Yiniotj-VbcYX4GrNDiOZL9RvMkJLGOsXOc90tmxZNmUOiW0MvxAnIdr1HTpMGOTeYGPZODjHT/s400/nb69_plugin_05_maven_81.jpg" /></a>ListNews 페이지를 표시하기 위해 브라우저에서 다음 링크를 입력합니다. <a href="http://localhost:8080/MavenEnterpriseApp-web/ListNews">http://localhost:8080/MavenEnterpriseApp-web/ListNews</a> 처음 프로젝트를 실행하면 데이터베이스가 비어 있기 때문에 아무 메시지도 나타나지 않습니다. 그럼 여기 Add new message 링크를 클릭합니다<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIXUuIcBzlLs3_a4jhBow41MmmjWY3Ty9-46M11qSPtNgH5TY98CqZ5ORMxXs2IU767SkvwebayTRDCxfENFoRUFMW97vkW2Ix6sWRsROn5TGzG8s-YhpTY7nLkfAG5YXoiQ_8njABScV6/s1600/nb69_plugin_05_maven_82.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 295px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490726935401365186" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIXUuIcBzlLs3_a4jhBow41MmmjWY3Ty9-46M11qSPtNgH5TY98CqZ5ORMxXs2IU767SkvwebayTRDCxfENFoRUFMW97vkW2Ix6sWRsROn5TGzG8s-YhpTY7nLkfAG5YXoiQ_8njABScV6/s400/nb69_plugin_05_maven_82.jpg" /></a> 그럼 PostMessage 서블릿에 있는 폼안에 메시지를 입력합니다. 다 입력한 뒤 Submit 을 누릅니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4qFvahVo80SCc3VWDcLntOD7z9GBS9vNVThMXAPWKk0L0J_dTtaTcONFNcr2lV4HJnrhXiXOCoJXDNbLtUpZ6Rb07x8jjM-DMSP868gma86VVfK-4fjWmojqvK2Kog4Lbu4hap8YV3Z8H/s1600/nb69_plugin_05_maven_83.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 295px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490726932149208354" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4qFvahVo80SCc3VWDcLntOD7z9GBS9vNVThMXAPWKk0L0J_dTtaTcONFNcr2lV4HJnrhXiXOCoJXDNbLtUpZ6Rb07x8jjM-DMSP868gma86VVfK-4fjWmojqvK2Kog4Lbu4hap8YV3Z8H/s400/nb69_plugin_05_maven_83.jpg" /></a>PostMessage 서블릿으로 메시지를 추가하게 되면, 메시지는 영구 저장(데이터베이스)에 쓰여지기 위해 메시지-드리븐 빈에 보내집니다. 그리고 데이터베이스에 있는 메시지는 ListNews 서블릿에 의해 표시 됩니다. <br />보낸 내용에 대해 데이터베이스에서 확인하기. 서비스 탭 안에 데이터베이스 커넥션에서 데이터를 확인<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgspNNs0kN47mmcO5iheIGyOcU-NXrFgKiGFUJoq2Nv_4shEWkx1xCemoeibOM0eYoLR1sss3hG_z-DHwtG_S_NqmU1nLLcIIJMH88Vg8sX__KlDCeKh28IRAXWLGkW_DHopaP-kvhgX06G/s1600/nb69_plugin_05_maven_84.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 327px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490726922686756594" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgspNNs0kN47mmcO5iheIGyOcU-NXrFgKiGFUJoq2Nv_4shEWkx1xCemoeibOM0eYoLR1sss3hG_z-DHwtG_S_NqmU1nLLcIIJMH88Vg8sX__KlDCeKh28IRAXWLGkW_DHopaP-kvhgX06G/s400/nb69_plugin_05_maven_84.jpg" /></a><br /><br />이상 메이븐을 이용한 엔터프라이즈 어플리케이션에 대해 살펴 봤습니다.<br />수고하셨습니다.<br />*^^*강여사(J.Y.Kang)http://www.blogger.com/profile/17450510931308610527noreply@blogger.com0tag:blogger.com,1999:blog-6811062799606447528.post-70370613139338494462010-07-04T07:10:00.000-07:002010-07-06T07:12:44.931-07:00넷빈(NetBeans)6.9에서 모듈(설치 프로그램 XX.exe 포함) 만들기-02-WordApp이번 게시물 역시 넷빈즈 플랫폼에 대한 프로젝트 입니다.<br /><br />이번에는 좀더 확장하여 4개의 모듈을 사용하는 모듈 어플리케이션을 작성하고 이 어플리케이션에 대한 브랜딩(아이콘, 스플래시스크린 및 기타 정보 설정)과 빌드 인스톨러(.exe 만들기)를 통해 넷빈 6.9에서 새롭게 선보이는 편리한 기능들에 대해서도 알아보겠습니다.<br /><br />작업환경은 다음과 같습니다.<br /><br />넷빈 6.9<br />JDK 5 이상 (저는 JDK6update20 사용중입니다)<br /><br />우선 새 프로젝트를 만듭니다. 프로젝트 창에서 마우스 오른쪽 클릭 - 새 프로젝트<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjy7ljFemxHCTJSWHuDYB2jEpJHzGqFaDKApuo8KL1B_nBn7riNomZRJyQRzSix5vk-a1Y1YweDryfk6fNXLiIUXWaeyTMF4S6EOdNWsxkSkJHr_jZ8bmduStgGCEnVtRgcdiKEtyuX-O2h/s1600/nb69_plugin_wordApp_01.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 336px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490054437857431250" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjy7ljFemxHCTJSWHuDYB2jEpJHzGqFaDKApuo8KL1B_nBn7riNomZRJyQRzSix5vk-a1Y1YweDryfk6fNXLiIUXWaeyTMF4S6EOdNWsxkSkJHr_jZ8bmduStgGCEnVtRgcdiKEtyuX-O2h/s400/nb69_plugin_wordApp_01.jpg" /></a> 카테고리에서 넷빈즈 모듈을 선택한 후 이번에는 넷빈즈 플랫폼 어플리케이션(NetBeans Platform Application )을 선택합니다 - 다음<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEic0_ThyEGHm-h3pBeMRzA-lyMANwZvgrieEzwC96tfyowQhJNQJ4KYnTLm4RXZEbIu0bU6_cEkb8qfbjJLSEXtCwOe-TKm03tzGKV6EBG3hHP2BDuii8mC0ex0x0RtK_sIrBP3zneKIKlv/s1600/nb69_plugin_wordApp_02.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490054434434782002" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEic0_ThyEGHm-h3pBeMRzA-lyMANwZvgrieEzwC96tfyowQhJNQJ4KYnTLm4RXZEbIu0bU6_cEkb8qfbjJLSEXtCwOe-TKm03tzGKV6EBG3hHP2BDuii8mC0ex0x0RtK_sIrBP3zneKIKlv/s400/nb69_plugin_wordApp_02.jpg" /></a> 프로젝트 이름은 WordApp<br />경로는 적당히<br />프로젝트 플랫폼을 선택할 수 있는데, 플랫폼을 미리 여러개 등록해 놓으면(플랫폼 등록은 상단의 도구 메뉴에서 넷빈즈 플랫폼을 선택한 후 팝업창에서 본인 컴퓨터에 설치되어 있는 여러 넷빈즈 플랫폼을 선택하시면 됩니다. 저는 그림처럼 여러개가 선택되어 있어 해당 사항이 뜬거고, 게시물을 위해서는 그냥 넷빈 6.9를 선택하여 진행하겠습니다) - 다음<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCJbxjBKR2lzNPAhmCy-cDxZuUsdqNP5YKD6235mIW_pnEdQX53_CzCDs6M-wXyL78poan1l1ECmUehNu-KvWOBgLYVAsLQgOeiGwch6JezuuK8bY9sxPUxk75f2rsYkAVpr8SvDMpYd1_/s1600/nb69_plugin_wordApp_03.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 262px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490054423196695842" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCJbxjBKR2lzNPAhmCy-cDxZuUsdqNP5YKD6235mIW_pnEdQX53_CzCDs6M-wXyL78poan1l1ECmUehNu-KvWOBgLYVAsLQgOeiGwch6JezuuK8bY9sxPUxk75f2rsYkAVpr8SvDMpYd1_/s400/nb69_plugin_wordApp_03.jpg" /></a> 만들어진 모듈 어플리케이션의 모듈 노드에서 오른쪽 마우스를 클릭하면 새로 추가가 뜹니다. 클릭<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYVt-26U_GJzuecRepYk0RAE2wXBEcDng4QzvyGHP3KFGmFlu6k54oR5uPgCx0T1BRujt6CiCWvrnw-EsMmtpwA4y53GKtbh2Wjmx9rbBu_evpPv2NK5blWUlj5EcS09RoLVxUk56DXrpQ/s1600/nb69_plugin_wordApp_04.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 336px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490054414928746642" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYVt-26U_GJzuecRepYk0RAE2wXBEcDng4QzvyGHP3KFGmFlu6k54oR5uPgCx0T1BRujt6CiCWvrnw-EsMmtpwA4y53GKtbh2Wjmx9rbBu_evpPv2NK5blWUlj5EcS09RoLVxUk56DXrpQ/s400/nb69_plugin_wordApp_04.jpg" /></a> 새 모듈 프로젝트창이 팝업으로 뜨는데,<br />첫번째 모듈 프로젝트 이름은 WordEngine<br />경로는 기본사항대로 - 다음<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6HOWPym4yGy13qpPXEBtxNO0a3ivK6WySo6pT4sBFS4XX64tEe-gui28g5gbzYMeTyGKmTV8lxQXNeth2D47N4BTeeYXxBQI9F-K233pyWj5Fzbm_J2L5ObXRPWIGX72GIkRbGVKVrDIv/s1600/nb69_plugin_wordApp_05.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 261px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490054409612140866" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6HOWPym4yGy13qpPXEBtxNO0a3ivK6WySo6pT4sBFS4XX64tEe-gui28g5gbzYMeTyGKmTV8lxQXNeth2D47N4BTeeYXxBQI9F-K233pyWj5Fzbm_J2L5ObXRPWIGX72GIkRbGVKVrDIv/s400/nb69_plugin_wordApp_05.jpg" /></a> 모듈에 대한 고유 이름을 지정해야 하는데 이걸 코드 이름 베이스 라고 합니다.<br />이 모듈의 코드 이름 베이스는 org.demo.wordengine 으로 줬습니다.<br />나머지 사항은 기본대로 - 마침<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIvEkKwit57o8w9SL3Vmc_bW5dBzesvJfu75uY5XJWtaoumgMdgRE4rldPmh8WWbqxXmIQWFVndbZJXgDp28RTln7MIVgS06q7V5TAouDDbfWyYbvE7akHRXyQ3804FuaZKwrPB3p1lBsK/s1600/nb69_plugin_wordApp_06.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 261px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490056047512693554" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIvEkKwit57o8w9SL3Vmc_bW5dBzesvJfu75uY5XJWtaoumgMdgRE4rldPmh8WWbqxXmIQWFVndbZJXgDp28RTln7MIVgS06q7V5TAouDDbfWyYbvE7akHRXyQ3804FuaZKwrPB3p1lBsK/s400/nb69_plugin_wordApp_06.jpg" /></a> 만들어진 모듈 (WordEngine) 에서 마우스 오른쪽을 클릭하여 새로 만들기 - other<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqztPgXPhOW9Ygjsm0Ig3_QVJZ-NHKxf-3117mTJVRbsMMpnCZBazgnTrxu9ZUtiU6N-6rH7L-2i-xMJeoBYdfYaqADJWhQMauBHLrr4yy6H60lK0mDxPd5yM9ViQyZ_E_G0nfNq4BOPJz/s1600/nb69_plugin_wordApp_07.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 336px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490056039862498290" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqztPgXPhOW9Ygjsm0Ig3_QVJZ-NHKxf-3117mTJVRbsMMpnCZBazgnTrxu9ZUtiU6N-6rH7L-2i-xMJeoBYdfYaqADJWhQMauBHLrr4yy6H60lK0mDxPd5yM9ViQyZ_E_G0nfNq4BOPJz/s400/nb69_plugin_wordApp_07.jpg" /></a> 카테고리에서 모듈 개발을 선택한 후 창(Window Component) 를 새 파일 유형으로 선택합니다 - 다음<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJ3ZeF3srG0XDWePnW-gN2T5Q8j4_8bIZAr8hZAFRCMu4X_iankChmBqt6NY3hbjhLSJ6BhVDo8AQveTg6wWx1BN0I_418CM45tb4Rh94srhNNEgI1KAqYfg5wMGh8EiqUgCo5tnFEVPe1/s1600/nb69_plugin_wordApp_08.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490056033659089202" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJ3ZeF3srG0XDWePnW-gN2T5Q8j4_8bIZAr8hZAFRCMu4X_iankChmBqt6NY3hbjhLSJ6BhVDo8AQveTg6wWx1BN0I_418CM45tb4Rh94srhNNEgI1KAqYfg5wMGh8EiqUgCo5tnFEVPe1/s400/nb69_plugin_wordApp_08.jpg" /></a> 기본 설정이 뜨는데 output 으로 설정하고 다음<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirWM7WQyjjASQauRUvBgzGWD_cu90txKH2umrJEQolfL5Mjxkmo0TnT5_qQRVM9_vzyZNx7xKH3a8uQJTD2HGQTQVdhwJLXPXMe1Dz6XdFU8ytk6QZno0alDUL4NtRj-rMO2rz3hxA_0rr/s1600/nb69_plugin_wordApp_09.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490056024220555202" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirWM7WQyjjASQauRUvBgzGWD_cu90txKH2umrJEQolfL5Mjxkmo0TnT5_qQRVM9_vzyZNx7xKH3a8uQJTD2HGQTQVdhwJLXPXMe1Dz6XdFU8ytk6QZno0alDUL4NtRj-rMO2rz3hxA_0rr/s400/nb69_plugin_wordApp_09.jpg" /></a> 클래스의 접두사 이름을 "Text" 로,<br />패키지 이름은 "org.demo.wordengine" 으로 줍니다.<br />이 설정으로 마법사가 아래 만들어지는 폼과 자바 파일, 그리고 XML 파일들을 자동 생성되는 걸 확인할수 있습니다.<br />마침<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbHf-kvCZCq7mzTIECzWG7jwSSabs4DWxGWA1RLRy5tDHueZdV-Im0p2a4-sLKNcRfoYs8AF8071YRzE15yTe0sQBMMII89ONVmyipBG3hxpuWm0IyHpm8j4wK-gsPAT-tdxUzLSQbiEqg/s1600/nb69_plugin_wordApp_10.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490056020511184978" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbHf-kvCZCq7mzTIECzWG7jwSSabs4DWxGWA1RLRy5tDHueZdV-Im0p2a4-sLKNcRfoYs8AF8071YRzE15yTe0sQBMMII89ONVmyipBG3hxpuWm0IyHpm8j4wK-gsPAT-tdxUzLSQbiEqg/s400/nb69_plugin_wordApp_10.jpg" /></a> 그럼 가운데 편집기에 디자인 편집창이 나타납니다. 오른쪽 파레트에서 버튼 하나와 텍스트영역(TextArea) 하나를 각각 드래그 해서 아래 그림 처럼 놓습니다. 버튼 이름은 Filter! 로 변경하고(오른쪽 파레트 아래 속성에서 text 항목을 편집하면 됩니다).<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg97Xsh343B6WAb9FptGFJJMci_5CjD_HEr2xzbSxeSUTTV4BL7XyoAQXBsNEuSXU5u8rpozzzlo0B_FSIfzcsyEa4KVcDWC172MWGzS4xYf8drZSc7NiUqG1_x_VW2IYVP9RFcNqZkXxML/s1600/nb69_plugin_wordApp_11.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 336px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490057638003629858" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg97Xsh343B6WAb9FptGFJJMci_5CjD_HEr2xzbSxeSUTTV4BL7XyoAQXBsNEuSXU5u8rpozzzlo0B_FSIfzcsyEa4KVcDWC172MWGzS4xYf8drZSc7NiUqG1_x_VW2IYVP9RFcNqZkXxML/s400/nb69_plugin_wordApp_11.jpg" /></a> 텍스트영역을 마우스로 클릭한 후 오른쪽 마우스를 열면 변수 이름 변경 메뉴가 있습니다. 클릭<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEha8vKbJolLPTZHEHjRJAS0fObY-W_zC2yd-pag6ulQ49PwOJiULaQ-fczK23tOmUXZmpCLXR0Y-VQ_C9UYEWR6GRHUUaiNWLFQnS7JmEinjtutIJmD8913OLknULRcqX0DU_jLOkAsS2vp/s1600/nb69_plugin_wordApp_12.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 336px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490057631246590994" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEha8vKbJolLPTZHEHjRJAS0fObY-W_zC2yd-pag6ulQ49PwOJiULaQ-fczK23tOmUXZmpCLXR0Y-VQ_C9UYEWR6GRHUUaiNWLFQnS7JmEinjtutIJmD8913OLknULRcqX0DU_jLOkAsS2vp/s400/nb69_plugin_wordApp_12.jpg" /></a> 변수 이름을 text 라고 변경합니다. (텍스트영역의 id 를 바꾸는 작업입니다)<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8m4fvnzSGFfz0fHrutKmIVvgg2avc1ATEdj0CyB8pWH2EmgpLU7mwuKcd2-4GewoC4fvxi5MefCTFasvXzhHHjZNxj-lmcMJxW0n_We0QaYcv73x4fj0wg00z4h7K6i8GGVvNLCJy8uxn/s1600/nb69_plugin_wordApp_13.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 315px; DISPLAY: block; HEIGHT: 128px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490057625096117218" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8m4fvnzSGFfz0fHrutKmIVvgg2avc1ATEdj0CyB8pWH2EmgpLU7mwuKcd2-4GewoC4fvxi5MefCTFasvXzhHHjZNxj-lmcMJxW0n_We0QaYcv73x4fj0wg00z4h7K6i8GGVvNLCJy8uxn/s400/nb69_plugin_wordApp_13.jpg" /></a> 그런 다음 버튼을 더블 클릭하면 아래 그림처럼 소스 창으로 자동 전환됩니다. 그럼 해당 메소드에 다음 코드를 작업합니다. (굵은 글씨 참고)<br />=================================================================<br />private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {<br /><strong>String s = text.getText();<br />s = s.toUpperCase();<br />text.setText(s);</strong><br />}<br />=================================================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuJx5hGSgcQF1dETU-aa_iQ5gkjX7AnpwOX4lukvoWsfdnoBxt-ygnuXzdlku9dhngTSjekhtT4MGdhy6bSw3WYI_y3X0lAxYwJ66gAC4T66IuTar5Ods8aKyrSOpC0-15zh8EXgu2L0nx/s1600/nb69_plugin_wordApp_14.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 336px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490057620985336226" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuJx5hGSgcQF1dETU-aa_iQ5gkjX7AnpwOX4lukvoWsfdnoBxt-ygnuXzdlku9dhngTSjekhtT4MGdhy6bSw3WYI_y3X0lAxYwJ66gAC4T66IuTar5Ods8aKyrSOpC0-15zh8EXgu2L0nx/s400/nb69_plugin_wordApp_14.jpg" /></a> 이제 어플리케이션에서 마우스 오른쪽을 클릭하여 실행합니다. 모듈이 설치되어 있는 넷빈즈 플랫폼 어플리케이션 WordApp 가 시작됩니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCLpNSCoWuvI3Yfv92wjdfGP8p1W6gwlz8JU4dXMIufwQl1-1Pj5JGuGGT-ZhRNzzPKsG2Jyi3UIWUzqDzCSnjnNrabMDDBZ8BigllOeYyks3vnCxa2zPgdHiz4blgsQydxdfkb8jYlI0V/s1600/nb69_plugin_wordApp_15.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 336px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490057611908760690" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCLpNSCoWuvI3Yfv92wjdfGP8p1W6gwlz8JU4dXMIufwQl1-1Pj5JGuGGT-ZhRNzzPKsG2Jyi3UIWUzqDzCSnjnNrabMDDBZ8BigllOeYyks3vnCxa2zPgdHiz4blgsQydxdfkb8jYlI0V/s400/nb69_plugin_wordApp_15.jpg" /></a> 아래 그림 처럼 넷빈즈 플랫폼 기반 어플리케이션 WordApp 가 뜨는데 이 때 창을 클릭하면 좀전에 만든 창 컴포넌트 Text 가 보입니다. 클릭<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2BouNiLnobaynxVkOoTPeRpmqYBx-duNSr5EPMJEdKXlf-5dJDgtisjh0qTUC2E5ZyfTFHiwqZFtVLIVcCqt454-E7bYTx0POmUHi4GmexGm2feJivR3t_H5Cvzlw5PLj_poNxvy7xYHh/s1600/nb69_plugin_wordApp_16.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 344px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490059452962180914" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2BouNiLnobaynxVkOoTPeRpmqYBx-duNSr5EPMJEdKXlf-5dJDgtisjh0qTUC2E5ZyfTFHiwqZFtVLIVcCqt454-E7bYTx0POmUHi4GmexGm2feJivR3t_H5Cvzlw5PLj_poNxvy7xYHh/s400/nb69_plugin_wordApp_16.jpg" /></a> 그럼 아래쪽에 Text Window 가 나타나고 아래 텍스트 영역과 버튼이 제시됩니다. 그림처럼 hello world 라고 적고 Filter! 버튼을 클릭하면,<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnUSzHvFwIyXy313i_ds95Vxrs7u77J_hxYEmo6065AmoswAfCKUnFZQxHCsMimly5xY5PCUcyqGUhHN2Wnv4ymB1N2AT660JxCqT8vTC1sGBX2_k1u_xpRqchER6z9aQdVqjS0Jm6aI-m/s1600/nb69_plugin_wordApp_17.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 344px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490059451767053522" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnUSzHvFwIyXy313i_ds95Vxrs7u77J_hxYEmo6065AmoswAfCKUnFZQxHCsMimly5xY5PCUcyqGUhHN2Wnv4ymB1N2AT660JxCqT8vTC1sGBX2_k1u_xpRqchER6z9aQdVqjS0Jm6aI-m/s400/nb69_plugin_wordApp_17.jpg" /></a> 작성한 글씨가 모두 대문자로 바뀌어 텍스트 영역에 나타납니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYqMzJ2p8ChZmkukeXtwTr_4dUaR8e9KP6W7PIQWoKb4bdLWh_iC5gSDN8wOhtRIZl7qNX_MZr3z6L9UFPo58WiPmNNkKulbsvYIzDf5iidKms9Y5DqHLrX5tmHX38DGO6Hml_Az6gOzev/s1600/nb69_plugin_wordApp_18.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 344px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490059443630629730" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYqMzJ2p8ChZmkukeXtwTr_4dUaR8e9KP6W7PIQWoKb4bdLWh_iC5gSDN8wOhtRIZl7qNX_MZr3z6L9UFPo58WiPmNNkKulbsvYIzDf5iidKms9Y5DqHLrX5tmHX38DGO6Hml_Az6gOzev/s400/nb69_plugin_wordApp_18.jpg" /></a> ***********************************************************************<br />이제 2개의 부가 모듈을 만들어 보도록 하겠습니다. 처음 만들 모듈은 서비스로, 그리고 다음 모듈은 앞서 정의한 모듈을 제공하는 모듈입니다.<br />다시 WordApp 의 모듈 노드에서 마우스 오른쪽을 클릭하고 새로 추가를 선택합니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOf3HqSqsK_VMC59Fn7WxaGAc0ESNmdT4f41lVcplz_peUpWtl75l6uXwAhmdH_KoVkLDtEK7c_-I5JM-awlUoVeOvoBq__qTIm8D3YDkhX8wzEAweng6CiZqzc0LajkJZ2AYKIFR2CAE0/s1600/nb69_plugin_wordApp_19.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 336px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490059437867045330" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOf3HqSqsK_VMC59Fn7WxaGAc0ESNmdT4f41lVcplz_peUpWtl75l6uXwAhmdH_KoVkLDtEK7c_-I5JM-awlUoVeOvoBq__qTIm8D3YDkhX8wzEAweng6CiZqzc0LajkJZ2AYKIFR2CAE0/s400/nb69_plugin_wordApp_19.jpg" /></a> 새 모듈 프로젝트 이름을 TextFilter 라고 줍니다. 경로는 기본대로 - 다음<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJ3s5MjuLptjMp3wKPuDd_CHS18pbiLeNV3uh1p5Y-4992PIblXZ-JompzhoMNE1rMspsOuy_tI25nsJ8LKUjKA6N6TY8xb_vzxxNiOifwqosvjNrKJ5mj5t4J3nBVg7CVrLrmEkuF7CWs/s1600/nb69_plugin_wordApp_20.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 261px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490059427886707058" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJ3s5MjuLptjMp3wKPuDd_CHS18pbiLeNV3uh1p5Y-4992PIblXZ-JompzhoMNE1rMspsOuy_tI25nsJ8LKUjKA6N6TY8xb_vzxxNiOifwqosvjNrKJ5mj5t4J3nBVg7CVrLrmEkuF7CWs/s400/nb69_plugin_wordApp_20.jpg" /></a> 코드 이름 기본(code name base):는 org.demo.textfilter 로 나머지는 기본 사항대로 - 마침<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPrj2g_y_KwGlwyxm6h296duFC9DvrRwcKPbBOl4jdkj7-IYQBVgJ9BsMeVrVXfrpYuKEqVrzLjUI_gU29WdVObryzO74hGKJDFP9wg-sQxi2zMGZWbXKnWO7nIXhrGKUrHw7tcD_ICtpd/s1600/nb69_plugin_wordApp_21.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 261px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490061487035499410" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPrj2g_y_KwGlwyxm6h296duFC9DvrRwcKPbBOl4jdkj7-IYQBVgJ9BsMeVrVXfrpYuKEqVrzLjUI_gU29WdVObryzO74hGKJDFP9wg-sQxi2zMGZWbXKnWO7nIXhrGKUrHw7tcD_ICtpd/s400/nb69_plugin_wordApp_21.jpg" /></a> 그런 다음 TextFilter 모듈에서 마우스 오른쪽을 클릭하여 자바 인터페이스를 새로 만듭니다. 새로 만들기-자바 인터페이스 클릭<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbStWWiRUKHaTg4x7ggIh4_anYxhzOp719PhR-C4MqNmFUPkEh3_YTdljYXXeRe53lHbyuyeHOd3jtNfPRV4WQaZB9Wn8w7cm0GHasP1tgXBuUEJQnolGUweEM4jAbGRnrORlioQeGebd8/s1600/nb69_plugin_wordApp_22.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 336px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490061479050346530" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbStWWiRUKHaTg4x7ggIh4_anYxhzOp719PhR-C4MqNmFUPkEh3_YTdljYXXeRe53lHbyuyeHOd3jtNfPRV4WQaZB9Wn8w7cm0GHasP1tgXBuUEJQnolGUweEM4jAbGRnrORlioQeGebd8/s400/nb69_plugin_wordApp_22.jpg" /></a> 인터페이스 이름은 TextFilter , 패키지는 org.demo.textfilter 마침<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnQ_c8TPTt9YUF9z7xZVEwk3zswP36iCBO2UCcOhw50ooo4PRKOea1Z00S3r7GCulI1mUIQc2OvgYJtCMpH4MwK3ZdXkPDXyKuJl0l8rehAqhC8p1rQzQ1MWzorS_K1pxAIUfzD9DQqIP2/s1600/nb69_plugin_wordApp_23.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490061473205291554" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnQ_c8TPTt9YUF9z7xZVEwk3zswP36iCBO2UCcOhw50ooo4PRKOea1Z00S3r7GCulI1mUIQc2OvgYJtCMpH4MwK3ZdXkPDXyKuJl0l8rehAqhC8p1rQzQ1MWzorS_K1pxAIUfzD9DQqIP2/s400/nb69_plugin_wordApp_23.jpg" /></a>다음 메소드 선언을 추가합니다.<br />==========================================================<br />package org.demo.textfilter;<br /><br />public interface TextFilter {<br /><br /><strong>String process(String s);</strong><br />}<br />==========================================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiEyVrPI-AeMJSUeZWlDFvtAlJdr5WsDS1SYWXoLXUEFeVIQxRFUnxvR1GqdpTdyVG8q1dF71rcoBsigErEBtsnsqbsm7o1qGDhp2aS5AZcLJDR4yzgNbgweXjGpmVNfBg8EYzS8y2afBM/s1600/nb69_plugin_wordApp_24.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 336px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490061466146773746" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiEyVrPI-AeMJSUeZWlDFvtAlJdr5WsDS1SYWXoLXUEFeVIQxRFUnxvR1GqdpTdyVG8q1dF71rcoBsigErEBtsnsqbsm7o1qGDhp2aS5AZcLJDR4yzgNbgweXjGpmVNfBg8EYzS8y2afBM/s400/nb69_plugin_wordApp_24.jpg" /></a> TextFilter 모듈에서 마우스 오른쪽을 클릭하고, 맨 아래 등록정보를 선택합니다<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbLHz17b9Lx5UEu6vnzBDR3zve_Y1fmYQOC0pOwW-ZlU8s846uiCDpasg7Rd-FQD63XQXHWk1NG_AvYcT1VGXRoevJaSM7g2wSCpbZeBWcwe2zluhGWXK8f8UXOW2i6sxU3dC1oz5DsQSD/s1600/nb69_plugin_wordApp_25.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 336px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490061447188589506" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbLHz17b9Lx5UEu6vnzBDR3zve_Y1fmYQOC0pOwW-ZlU8s846uiCDpasg7Rd-FQD63XQXHWk1NG_AvYcT1VGXRoevJaSM7g2wSCpbZeBWcwe2zluhGWXK8f8UXOW2i6sxU3dC1oz5DsQSD/s400/nb69_plugin_wordApp_25.jpg" /></a> 등록정보의 카테고리에서 API 버전제어를 선택하고 아래 그림처럼 공개 패키지에 체크합니다. OK<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghn7q_WQnk0paXwIiOJ3zWwnPqKOvBvLTe8hDxSwMhBVmcUk-VqcpIF6iCrp5mFXGajEck_45O8wx-tDqjjwV_DVdyzc_ROCUS2_z04vZPc1Yq4qER0TV94C37lw4mYDC6anWztIZ3eYlu/s1600/nb69_plugin_wordApp_26.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 288px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490062727040716018" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghn7q_WQnk0paXwIiOJ3zWwnPqKOvBvLTe8hDxSwMhBVmcUk-VqcpIF6iCrp5mFXGajEck_45O8wx-tDqjjwV_DVdyzc_ROCUS2_z04vZPc1Yq4qER0TV94C37lw4mYDC6anWztIZ3eYlu/s400/nb69_plugin_wordApp_26.jpg" /></a> 3번째 모듈을 새로 만듭니다. 모듈에서 마우스 오른쪽 클릭 - 새로 추가<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6UJQx04iJEZCO2U3jjET5p5IsnyXxXDC5rDSP16DCtSVWdVUST-LQg0cyr451t3k6MxDDJY5jcH0wruhqNcxTvotHdE8yeszBzW1KWZYBeFzrfY0ZTs1-7rysq3_BbZryXQJHkrN8f_bg/s1600/nb69_plugin_wordApp_27.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 336px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490062718112270818" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6UJQx04iJEZCO2U3jjET5p5IsnyXxXDC5rDSP16DCtSVWdVUST-LQg0cyr451t3k6MxDDJY5jcH0wruhqNcxTvotHdE8yeszBzW1KWZYBeFzrfY0ZTs1-7rysq3_BbZryXQJHkrN8f_bg/s400/nb69_plugin_wordApp_27.jpg" /></a> 프로젝트 이름: MyFilter 기본대로 - 다음<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4U3WadgDi5w3lGHJhBtmTzlEJ-z5xxOKG5h6arhUQD3xcdAneOOLvkaKCZnUAGaAVR0R2GbtCzF19PnldaX5OsFnMvVsBfv7qrfF9uhaQDSdiF9gYUO2j3HO0LozrOAW7RogP54VgTJ3w/s1600/nb69_plugin_wordApp_28.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 261px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490062713292108546" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4U3WadgDi5w3lGHJhBtmTzlEJ-z5xxOKG5h6arhUQD3xcdAneOOLvkaKCZnUAGaAVR0R2GbtCzF19PnldaX5OsFnMvVsBfv7qrfF9uhaQDSdiF9gYUO2j3HO0LozrOAW7RogP54VgTJ3w/s400/nb69_plugin_wordApp_28.jpg" /></a> 코드 이름 기본에 "org.demo.myfilter" 라고 줍니다. 나머지는 기본 사항대로 - 마침<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjT97u2vt6qBaBIg2w1FeOI7ZVDVlu6-SmAhj1BB3qzJcIQb8nYcKgOc5fEUhdE5ssiRV0BGUjgHoM3v2GoBLNfZoJyGSXdrx6qiIoqWX3zXKg0o2NSrdx-gFHlqDulCfdbmTm82EEVO8v5/s1600/nb69_plugin_wordApp_29.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 261px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490062706038058530" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjT97u2vt6qBaBIg2w1FeOI7ZVDVlu6-SmAhj1BB3qzJcIQb8nYcKgOc5fEUhdE5ssiRV0BGUjgHoM3v2GoBLNfZoJyGSXdrx6qiIoqWX3zXKg0o2NSrdx-gFHlqDulCfdbmTm82EEVO8v5/s400/nb69_plugin_wordApp_29.jpg" /></a> 만들어진 MyFilter 모듈에서 다시 마우스 오른쪽을 클릭하여 등록정보를 누릅니다<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdnbWFlxSGw-0ViMl9x65BVgGM6zVoKACaf8o3pcbyRlZWWC2bF71GeT_KJ9uLctuJs2Kv2aT2nGFaWNWH_6ayVtayoCH_KQ08BblqNF8wN4l2IjoRBgNzO1-m0YfXRj-B6ZX52L5LwoPm/s1600/nb69_plugin_wordApp_30.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 336px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490062703275979986" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdnbWFlxSGw-0ViMl9x65BVgGM6zVoKACaf8o3pcbyRlZWWC2bF71GeT_KJ9uLctuJs2Kv2aT2nGFaWNWH_6ayVtayoCH_KQ08BblqNF8wN4l2IjoRBgNzO1-m0YfXRj-B6ZX52L5LwoPm/s400/nb69_plugin_wordApp_30.jpg" /></a> 프로젝트 창의 라이브러리에 새로 만들어진 MyFilter 모듈에 TextFilter 모듈을 추가하기 위해 다음과 같이 작업합니다.<br />우선 라이브러리를 클릭하고, 모듈 의존성탭에서 새 의존성 추가(Add Dependency...) 클릭하고,<br />팝업창이 뜨면 맨위 필터에서 TextFilter 를 입력합니다.<br />그럼 아래에 모듈이 찾아지는데 이걸 OK<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7fpS1d1fWz3dxOOnqdgIcJGy4rz7BtatsPns5qN9WuHER-Fig9SjMG3-jiTkF5HdINODypnBPfWA3oTvNwOlNZdZyRUHYrTdKB2BLdCJ7si3jEkm57fAm_ZKF-m6TWJBgikjZt1gRk_tt/s1600/nb69_plugin_wordApp_31.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 336px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490064065275558482" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7fpS1d1fWz3dxOOnqdgIcJGy4rz7BtatsPns5qN9WuHER-Fig9SjMG3-jiTkF5HdINODypnBPfWA3oTvNwOlNZdZyRUHYrTdKB2BLdCJ7si3jEkm57fAm_ZKF-m6TWJBgikjZt1gRk_tt/s400/nb69_plugin_wordApp_31.jpg" /></a> 확인<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigDsppYltTMhE4S_HeGhWFrmYzsIxFaSrD9mM-7ggrCLD94dl7uM9TTjL5jDvEeu4zovg-NrJvczlRvJKanW-BulY1Jsvn-grPsVqJ_Y8dpz5XOc4QLX2ESEBOuspX0tV3O_N_5XYwEER0/s1600/nb69_plugin_wordApp_32.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 288px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490064052728843682" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigDsppYltTMhE4S_HeGhWFrmYzsIxFaSrD9mM-7ggrCLD94dl7uM9TTjL5jDvEeu4zovg-NrJvczlRvJKanW-BulY1Jsvn-grPsVqJ_Y8dpz5XOc4QLX2ESEBOuspX0tV3O_N_5XYwEER0/s400/nb69_plugin_wordApp_32.jpg" /></a> 같은 방법으로 이번에는 Lookup 을 입력하여 찾아보기(Lookup API) 모듈을 추가합니다. ok<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-WPdVnkc1f0yEL-QydzkuJZNGB6o0eHLpI1Qm63-POK2x0rPKiNqx65rNf5X-0eCjr7wQN9If5pu0lWfrhYBrUZR71zRNw6xukHxeS8_80J2U3Z0M8U-yl20gesQWWWsDMH05Y134flQQ/s1600/nb69_plugin_wordApp_33.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 336px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490064039720049394" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-WPdVnkc1f0yEL-QydzkuJZNGB6o0eHLpI1Qm63-POK2x0rPKiNqx65rNf5X-0eCjr7wQN9If5pu0lWfrhYBrUZR71zRNw6xukHxeS8_80J2U3Z0M8U-yl20gesQWWWsDMH05Y134flQQ/s400/nb69_plugin_wordApp_33.jpg" /></a>그럼 아래 그림처럼 표시 됩니다. 확인<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuEsVCk9iC1EGdJVhMzwhtb0b3KL01QVfBp9f3GoJFNIywHrLUGfx7JGR6F-JuLqN7GE_HHNedyKOZfjOXBEOW1ICtr7GEtIPSFCmEt77y4jOgRYzICbJgo7j3RhL9GgNoJzUq4dhZYS9f/s1600/nb69_plugin_wordApp_34.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 288px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490064029846320866" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuEsVCk9iC1EGdJVhMzwhtb0b3KL01QVfBp9f3GoJFNIywHrLUGfx7JGR6F-JuLqN7GE_HHNedyKOZfjOXBEOW1ICtr7GEtIPSFCmEt77y4jOgRYzICbJgo7j3RhL9GgNoJzUq4dhZYS9f/s400/nb69_plugin_wordApp_34.jpg" /></a> 이제 2번째 모듈의 인터페이스에서 정의했던 메소드를 구현하기 위한 클래스 작업을 합니다.<br />마우스 오른쪽 클릭 - 새로 만들기 - 자바 클래스<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIeKzD3MfeKpRx8bee6L7o36zT9zFL4V9GLqjUUyUPLbX8vOUWluaF12THeJIET3q912ald-gBL8oAXX3bdAuzFi3qQj6nwJpRtIS2wC2mIOv1oFk8L_qeiPemPyzBUZxPTvFU4E1LlpJR/s1600/nb69_plugin_wordApp_35.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 336px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490064018664360178" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIeKzD3MfeKpRx8bee6L7o36zT9zFL4V9GLqjUUyUPLbX8vOUWluaF12THeJIET3q912ald-gBL8oAXX3bdAuzFi3qQj6nwJpRtIS2wC2mIOv1oFk8L_qeiPemPyzBUZxPTvFU4E1LlpJR/s400/nb69_plugin_wordApp_35.jpg" /></a> 클래스 이름: UpperCaseFilter<br />패키지: org.demo.myfilter<br />마침<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiE3lodNOy7FMeGpxfU0lzQd9G4NUm0_eFKGhg1DKwmaOn3hlRnpgf37mPzsixKl8qKf1NNH2S-btaxV_VZB086peGwx8jNx0oFtPj5dvznJGfhY5DOqge3DuN95R9VEqJsqHeWyeF_UMIG/s1600/nb69_plugin_wordApp_36.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490066118118444210" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiE3lodNOy7FMeGpxfU0lzQd9G4NUm0_eFKGhg1DKwmaOn3hlRnpgf37mPzsixKl8qKf1NNH2S-btaxV_VZB086peGwx8jNx0oFtPj5dvznJGfhY5DOqge3DuN95R9VEqJsqHeWyeF_UMIG/s400/nb69_plugin_wordApp_36.jpg" /></a>클래스를 아래 내용으로 작성합니다.<br />============================================================<br />package org.demo.myfilter;<br /><br /><strong>import org.demo.textfilter.TextFilter;<br /><br />@ServiceProvider(service=TextFilter.class)</strong><br />public class UpperCaseFilter <strong>implements TextFilter </strong>{<br /><br /><strong>public String process(String s) {<br />return s.toUpperCase();<br />}</strong><br />}<br />============================================================<br />@ServiceProvider 어노테이션은 컴파일시,TextFilter 인터페이스의 구현을 등록하는 파일과 함께 META-INF/services 폴더를 만들게 됩니다. 보다 자세한 내용은 JDK 6 ServiceLoader 메카니즘을 살펴보시기 바랍니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZM5eZgWVIiu0OHbuqB2THX65lhzBLvs07RXrVxvApLK4nn86CMBD4-jfqW5u-PzIo6sJ0K_S06woTzURYkcadLQXuE9pcWSoszX_HRxwkNYyLGq0p-p2nxtcseYRp37mp2ZLzgfe7hq2P/s1600/nb69_plugin_wordApp_37.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 336px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490066110700574018" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZM5eZgWVIiu0OHbuqB2THX65lhzBLvs07RXrVxvApLK4nn86CMBD4-jfqW5u-PzIo6sJ0K_S06woTzURYkcadLQXuE9pcWSoszX_HRxwkNYyLGq0p-p2nxtcseYRp37mp2ZLzgfe7hq2P/s400/nb69_plugin_wordApp_37.jpg" /></a> 임포트 문제는 여백에서 마우스 오른쪽을 클릭 - 가져오기 고정(fix import)<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2JjIGwXi_OUkv71MnTnSWLg9iyBgRS2AVQ8hxjH3RJBxm47H6409ZGgPClafeXmOQ3AFlTbqSM_lN4PBPo92zsBr6Xu9DIHn3io4vHKwveygn3HiylHAYDJ6q9ENENSwdi15iHPTDsn2E/s1600/nb69_plugin_wordApp_38.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 336px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490066104378881042" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2JjIGwXi_OUkv71MnTnSWLg9iyBgRS2AVQ8hxjH3RJBxm47H6409ZGgPClafeXmOQ3AFlTbqSM_lN4PBPo92zsBr6Xu9DIHn3io4vHKwveygn3HiylHAYDJ6q9ENENSwdi15iHPTDsn2E/s400/nb69_plugin_wordApp_38.jpg" /></a>임포트 및 코드 확인<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimuGvYUl_3ENNH7Sl9nThSypas1NlcPbTHgpL4JTK93N38lYSyd8K14UJowcuJxkkuxB6Zqv-uoZZqzG1iKoqW-PCm9P38f2R6nSppwD6dIBOQhvAEajLjJsgpaakKbCKUQT6JnGYShyQS/s1600/nb69_plugin_wordApp_39.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 336px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490066099895386258" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimuGvYUl_3ENNH7Sl9nThSypas1NlcPbTHgpL4JTK93N38lYSyd8K14UJowcuJxkkuxB6Zqv-uoZZqzG1iKoqW-PCm9P38f2R6nSppwD6dIBOQhvAEajLjJsgpaakKbCKUQT6JnGYShyQS/s400/nb69_plugin_wordApp_39.jpg" /></a> 이번엔 WordEngine 에 TextFilter 작업을 하기 위해 다음과 같이 합니다. 우선 WordEngine 에서 마우스 오른쪽 클릭 - 등록 정보 선택<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMGgdrX0JEJ92qh0Q5ZdFSg6qaQb2M2Gw1C3o_L6d2QZLmKyHr6uHDgcr4uaZMw1Xu6sTh-vgDVzTnQBrbNjEkRtXWiYb6lLih65S8i90fpJlFbKMiOSc5iZTZAtIp6tLb9KUS0I3xxuKQ/s1600/nb69_plugin_wordApp_40.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 336px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490066091484061858" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMGgdrX0JEJ92qh0Q5ZdFSg6qaQb2M2Gw1C3o_L6d2QZLmKyHr6uHDgcr4uaZMw1Xu6sTh-vgDVzTnQBrbNjEkRtXWiYb6lLih65S8i90fpJlFbKMiOSc5iZTZAtIp6tLb9KUS0I3xxuKQ/s400/nb69_plugin_wordApp_40.jpg" /></a> WordEngine 등록정보 창에서 카테고리에 라이브러리를 선택 후 모듈 의존성에 새 종속성 추가 버튼을 클릭한 후 팝업창에서 TextFilter 를 입력하여 모듈을 찾은 후 ok<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-ylT4tord0uhgohxElNiw74Xem_oMufGh_4xRQJuYMtf9Hkm4ono3-vLzv8igsVfwbzqZIxuGNcXJ2YGruoPr4nE7v0ewvuQz2Qnf7dJC1IaNwL_0Y8UidknpwmYzySY10DmOtDZmFGok/s1600/nb69_plugin_wordApp_41.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 336px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490069457081707906" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-ylT4tord0uhgohxElNiw74Xem_oMufGh_4xRQJuYMtf9Hkm4ono3-vLzv8igsVfwbzqZIxuGNcXJ2YGruoPr4nE7v0ewvuQz2Qnf7dJC1IaNwL_0Y8UidknpwmYzySY10DmOtDZmFGok/s400/nb69_plugin_wordApp_41.jpg" /></a> 아래 그림처럼 TextFilter 가 라이브러리에 추가되었음을 확인합니다. ok<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2VzRcRA7uYs8j9eIW73ecqkMn-AK04MpTmNj3fGp5b58sruSZHGXTZw4K-Z-O3pUJ7VeqmT3CNsnZYJYvWABBSPyG86Lamq6Q1owg7GNNy39o0ctKTGIALD9-bByeAJZGx8eP6XxO-hlT/s1600/nb69_plugin_wordApp_42.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 288px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490069448941352626" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2VzRcRA7uYs8j9eIW73ecqkMn-AK04MpTmNj3fGp5b58sruSZHGXTZw4K-Z-O3pUJ7VeqmT3CNsnZYJYvWABBSPyG86Lamq6Q1owg7GNNy39o0ctKTGIALD9-bByeAJZGx8eP6XxO-hlT/s400/nb69_plugin_wordApp_42.jpg" /></a> 아까 버튼의 메소드 부분을 다음과 같이 변경합니다. (굵은 글씨 참고)<br />================================================================<br />private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {<br />String s = text.getText();<br /><strong>TextFilter filter = Lookup.getDefault().lookup(TextFilter.class);</strong><br />if (filter != null) {<br />s = filter.process(s);<br />}<br />text.setText(s);<br />}<br />================================================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAs-tSkvEeL4vXZIzE4UfoAFR1sSRO9rovakZs9oamsVYTixVCeQkn3T_S3xXnoJEhUzySm-iW3QZPy9sZdh2ZhTM6ZmTTZSABaAeqLWVHhHa1IOFsxFcKKXQstZHmSR1fGqaTO-PniyDl/s1600/nb69_plugin_wordApp_43.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 336px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490069443514059426" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAs-tSkvEeL4vXZIzE4UfoAFR1sSRO9rovakZs9oamsVYTixVCeQkn3T_S3xXnoJEhUzySm-iW3QZPy9sZdh2ZhTM6ZmTTZSABaAeqLWVHhHa1IOFsxFcKKXQstZHmSR1fGqaTO-PniyDl/s400/nb69_plugin_wordApp_43.jpg" /></a> 임포트 문제는 역시 여백에서 마우스 오른쪽 클릭 가져오기 고정(fix import) 클릭<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpbkckNi3UIa4712q8dWfXqQnAY2IQNHLQMI7hxxHrSck4Ijm4DfuOJkStl-raJ7jA71dCyStjNailhqgPjzoYSCs7f275t4iNi1YkHDIA8bingemmDgFjTRexXwUpv5RuwWrq_axEF84a/s1600/nb69_plugin_wordApp_44.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 336px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490069438294331346" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpbkckNi3UIa4712q8dWfXqQnAY2IQNHLQMI7hxxHrSck4Ijm4DfuOJkStl-raJ7jA71dCyStjNailhqgPjzoYSCs7f275t4iNi1YkHDIA8bingemmDgFjTRexXwUpv5RuwWrq_axEF84a/s400/nb69_plugin_wordApp_44.jpg" /></a> 이로써, 버튼의 기능은 같지만, 새 모듈 디자인을 추가함으로써 필터 구현과 그래픽 유저 인터페이스 간의 분리를 제공하게 됩니다.<br />이제 4번째 모듈을 만듭니다. 이 모듈은 첫번 째 모듈에서 만든 "Filter!" 버튼을 클릭할 때 마다 동적으로 텍스트를 받습니다.<br />우선 첫번째 모듈(TextTopComponent.java) 생성자 부분에서 아래 코드 내용(굵은 글씨)을 추가합니다.<br />======================================================================= <strong>private InstanceContent content;</strong><br /><br />private TextTopComponent() {<br />initComponents();<br />setName(NbBundle.getMessage(TextTopComponent.class, "CTL_TextTopComponent"));<br />setToolTipText(NbBundle.getMessage(TextTopComponent.class, "HINT_TextTopComponent"));<br />// setIcon(Utilities.loadImage(ICON_PATH, true));<br /><br /><strong>content = new InstanceContent();<br />associateLookup(new AbstractLookup(content));</strong><br />}<br />=======================================================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8yGDb7T0FBrfYQMMhFsxZJpsHKcFHzN4zXScyvYJ9UKrCx-3gNjsMsp3NL8HoqKi8_py5AwO63fMCDL8Ss2iEcJzZTk8Y23xZbJhikxRetJ4mVLltbGhXLM_EOj6ThLazF4i4lOOIbCth/s1600/nb69_plugin_wordApp_45.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 336px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490069433437426050" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8yGDb7T0FBrfYQMMhFsxZJpsHKcFHzN4zXScyvYJ9UKrCx-3gNjsMsp3NL8HoqKi8_py5AwO63fMCDL8Ss2iEcJzZTk8Y23xZbJhikxRetJ4mVLltbGhXLM_EOj6ThLazF4i4lOOIbCth/s400/nb69_plugin_wordApp_45.jpg" /></a> 임포트 문제는 마우스 오른쪽 클릭 - 가져오기 고정(fix import) 클릭<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhz_ay7IJuy7kgUdO7OB7rZhOtT-7UlscM_Obt8XE72uBVn1D_O750azBsQTDAJvkj8SpCMSk04BhHY_mummvdgpgQfRhQrNt6BRsLwOmLskTi08RTC7IiEDWLyamE3DMv4enIK8ywRsLxK/s1600/nb69_plugin_wordApp_46.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 336px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490072260168279890" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhz_ay7IJuy7kgUdO7OB7rZhOtT-7UlscM_Obt8XE72uBVn1D_O750azBsQTDAJvkj8SpCMSk04BhHY_mummvdgpgQfRhQrNt6BRsLwOmLskTi08RTC7IiEDWLyamE3DMv4enIK8ywRsLxK/s400/nb69_plugin_wordApp_46.jpg" /></a> 그런 다음, 버튼 클릭시마다 InstanceContent 객체가 추가될 수 있도록 소스를 변경합니다(굵은 글씨)<br />================================================================<br />private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {<br />String s = text.getText();<br />TextFilter filter = Lookup.getDefault().lookup(TextFilter.class);<br />if (filter != null) {<br /><strong>content.add(s);</strong><br />s = filter.process(s);<br />}<br />text.setText(s);<br />}<br />================================================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvU1255i_NlOohhzgWYfhya3m3Fa9eBNHIkne_M6uJ7J4VQe6kRwTEllBQlxZ8PoLVjqQi23L1XM-jPFFJe4UTOOCSvmAoOiUjwwmhA9wNNYaOqfoy9trtOltkFywqFe7RuQuCp7wrW4rU/s1600/nb69_plugin_wordApp_47.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 336px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490072253412013154" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvU1255i_NlOohhzgWYfhya3m3Fa9eBNHIkne_M6uJ7J4VQe6kRwTEllBQlxZ8PoLVjqQi23L1XM-jPFFJe4UTOOCSvmAoOiUjwwmhA9wNNYaOqfoy9trtOltkFywqFe7RuQuCp7wrW4rU/s400/nb69_plugin_wordApp_47.jpg" /></a> 이번에는 히스토리를 관리하는 모듈을 새로 만듭니다.<br />역시 모듈 노드에서 마우스 오른쪽 클릭 - 새로 추가<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj54Ul5lY-4FjEKDRKCKWJ6QLB1ew_LdjPTWfhmchMblcaOsRTAnhYReXejSdCJCjkVW35RknJfQ6II3AcrYaeyMczf4SgkDd3ZPYAeW1DRaDzUvTfzk7kfl2C4yuBV8Y56olRV724be-wp/s1600/nb69_plugin_wordApp_48.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 336px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490072243543885810" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj54Ul5lY-4FjEKDRKCKWJ6QLB1ew_LdjPTWfhmchMblcaOsRTAnhYReXejSdCJCjkVW35RknJfQ6II3AcrYaeyMczf4SgkDd3ZPYAeW1DRaDzUvTfzk7kfl2C4yuBV8Y56olRV724be-wp/s400/nb69_plugin_wordApp_48.jpg" /></a> 모듈 프로젝트 이름은 History<br />나머지는 기본 사항대로 - 다음<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqrr7smqlywfgAbuwz82HNxEBvcLqNn_AdZumfLHVCAQp6ISmkFRTGnboZxiUmDVIGikxVRYUM43CYotyl6ky6RoIqcjRWIxN8CQCt4tYhXODoyNRJ-lyXgu06vt0ZCC08uKn-j6QbJVp5/s1600/nb69_plugin_wordApp_49.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 261px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490072240648491234" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqrr7smqlywfgAbuwz82HNxEBvcLqNn_AdZumfLHVCAQp6ISmkFRTGnboZxiUmDVIGikxVRYUM43CYotyl6ky6RoIqcjRWIxN8CQCt4tYhXODoyNRJ-lyXgu06vt0ZCC08uKn-j6QbJVp5/s400/nb69_plugin_wordApp_49.jpg" /></a> 코드 이름 기본: com.demo.history<br />나머지는 기본 사항대로 - 마침<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWrQLxAeyQKutziWif2Zh0Ojb_VwHnABecNaDJ9Dp-JkzwkH7dxkJajQ3Au9zqkg7IkLT1y3qVhG1LOkrwg98VFvOgcrxB9PIAoLxvvmyNj1e2vY6l7Rl2ulzlU8qDYkEqdk_etlwNadYZ/s1600/nb69_plugin_wordApp_50.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 261px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490072236623990626" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWrQLxAeyQKutziWif2Zh0Ojb_VwHnABecNaDJ9Dp-JkzwkH7dxkJajQ3Au9zqkg7IkLT1y3qVhG1LOkrwg98VFvOgcrxB9PIAoLxvvmyNj1e2vY6l7Rl2ulzlU8qDYkEqdk_etlwNadYZ/s400/nb69_plugin_wordApp_50.jpg" /></a> 이 히스토리 모듈 역시 윈도우 컴포넌트를 만듭니다.<br />History 모듈에서 마우스 오른쪽 클릭 - 새로 만들기 - 창 (window component ) 선택<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhk-XIwuWV7q4CPUmeGRwFRcabcUDJ1t-09i-igHHMEF1M85qfTTM6ziNkKhS_4z85dVlm4l5UtJHPD5GrQib9S5PhOCc3T6q_HoWhrbstBZ9NPTUC0gAbEuh4anZ3LwMEKsGbB5_7P-LPF/s1600/nb69_plugin_wordApp_51.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 336px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490073695305164834" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhk-XIwuWV7q4CPUmeGRwFRcabcUDJ1t-09i-igHHMEF1M85qfTTM6ziNkKhS_4z85dVlm4l5UtJHPD5GrQib9S5PhOCc3T6q_HoWhrbstBZ9NPTUC0gAbEuh4anZ3LwMEKsGbB5_7P-LPF/s400/nb69_plugin_wordApp_51.jpg" /></a> 기본 설정은 output 나머지 그대로 - 다음<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjushLjr0ISYkSxRYFEzxXjDNre5jKhkrP8T8YS-lQCvr2WnQnbGXyakOYCdjesA9LDb-BgttXNUD4QmEXhWSt3c2ea2fZtDvTTwwosORDa2C2BIBrmgj_ASVwulVhhvSzNe1og8sqorqih/s1600/nb69_plugin_wordApp_52.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 294px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490073680910325634" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjushLjr0ISYkSxRYFEzxXjDNre5jKhkrP8T8YS-lQCvr2WnQnbGXyakOYCdjesA9LDb-BgttXNUD4QmEXhWSt3c2ea2fZtDvTTwwosORDa2C2BIBrmgj_ASVwulVhhvSzNe1og8sqorqih/s400/nb69_plugin_wordApp_52.jpg" /></a> 클래스 이름 접두사는 History<br />패키지는 com.demo.history 를 선택<br />마침<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYYsVjMRVJr0s6y-te_dP-Pke-TUMQAkWGgxNsV-te9LATXrcTHYAnwInio2E1kCB7BZXfEQvderYnyKjGqpCgxIGl-Bz2XeSormpvsaIq-3lQ4-7hQkINmbouG2lAPGiWDcuDHHXpQ9Qy/s1600/nb69_plugin_wordApp_53.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 260px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490073666154471362" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYYsVjMRVJr0s6y-te_dP-Pke-TUMQAkWGgxNsV-te9LATXrcTHYAnwInio2E1kCB7BZXfEQvderYnyKjGqpCgxIGl-Bz2XeSormpvsaIq-3lQ4-7hQkINmbouG2lAPGiWDcuDHHXpQ9Qy/s400/nb69_plugin_wordApp_53.jpg" /></a> 디자인 편집창이 뜨면 역시 파레트에서 텍스트 영역(TextArea)를 드래그해서 그림처럼 적당히 크기를 조절하고, 거기서 마우스 오른쪽을 클릭하여 변수 이름을 변경합니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEil7MgeIwK37sPePh2lNqThRrR_omu7dz4PncPfn1ZJ_-PV6XRcRyq3-yk8ruYkRZqhbCJxjPxwmR7-j_kLuF3kWJ5cVbJCPhlxLAQlCn9B7RI0_Etd2cbyzcccrxxqyz30BMBnrxcOLm8C/s1600/nb69_plugin_wordApp_54.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 336px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490073656523283698" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEil7MgeIwK37sPePh2lNqThRrR_omu7dz4PncPfn1ZJ_-PV6XRcRyq3-yk8ruYkRZqhbCJxjPxwmR7-j_kLuF3kWJ5cVbJCPhlxLAQlCn9B7RI0_Etd2cbyzcccrxxqyz30BMBnrxcOLm8C/s400/nb69_plugin_wordApp_54.jpg" /></a> 새 변수 이름은 historyText - OK<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZeQ7QxhcX9T09yYKobRSMW-VDm_492S_zQyVfNMSaZsK7DrS-qw5pF5SFdq0_wCeXuvzAca7Gxg-pSONKWpiy37NPZxn0jsa8V-c0ewCMwnJuOhSBkkatNJigb438HvUG_8sDH3dBkAlM/s1600/nb69_plugin_wordApp_55.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 315px; DISPLAY: block; HEIGHT: 128px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490073651796607650" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZeQ7QxhcX9T09yYKobRSMW-VDm_492S_zQyVfNMSaZsK7DrS-qw5pF5SFdq0_wCeXuvzAca7Gxg-pSONKWpiy37NPZxn0jsa8V-c0ewCMwnJuOhSBkkatNJigb438HvUG_8sDH3dBkAlM/s400/nb69_plugin_wordApp_55.jpg" /></a> 이제 HistoryTopComponent 클래스의 생성자 부분에 다음 코드를 추가합니다.(굵은 글씨 참고)<br />===================================================================<br /><strong>private Lookup.Result result;</strong><br /><br />private HistoryTopComponent() {<br /><br />...<br /><br /><strong>result = org.openide.util.Utilities.actionsGlobalContext().lookupResult(String.class);<br />result.addLookupListener(new LookupListener() {<br />public void resultChanged(LookupEvent e) {<br />historyText.setText(result.allInstances().toString());<br />}<br />});</strong><br />}<br />===================================================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnC5FpStdntTbRisT2IhCWTOXg799wlL2XUphvG8J0XcIX7hlTjhCGMyXcL5Usq1YRwi22PcUM7C9wEOH6g7cZnUGOPBdlEbsFEhyphenhyphen4AyYEZgcaCjxY65Nmxsu1-bDLz3arqtimvFg9KiCR/s1600/nb69_plugin_wordApp_56.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 336px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490076084394243074" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnC5FpStdntTbRisT2IhCWTOXg799wlL2XUphvG8J0XcIX7hlTjhCGMyXcL5Usq1YRwi22PcUM7C9wEOH6g7cZnUGOPBdlEbsFEhyphenhyphen4AyYEZgcaCjxY65Nmxsu1-bDLz3arqtimvFg9KiCR/s400/nb69_plugin_wordApp_56.jpg" /></a> 임포트 문제는 fix import (가져오기 고정)로<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGC5X_YO64OAtdOxgWYuN93v9eY5Np-GcYxsqP-E5SVJFr68eEwVyGMg1t676v-wOTdjj_E5PeOFhyR941pU3P1DYBT5wlsrQNSX503nhSjA_y2MLgapE2E3SwE2ZnWKZnoynsuS3_BfHA/s1600/nb69_plugin_wordApp_57.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 336px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490076075789943474" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGC5X_YO64OAtdOxgWYuN93v9eY5Np-GcYxsqP-E5SVJFr68eEwVyGMg1t676v-wOTdjj_E5PeOFhyR941pU3P1DYBT5wlsrQNSX503nhSjA_y2MLgapE2E3SwE2ZnWKZnoynsuS3_BfHA/s400/nb69_plugin_wordApp_57.jpg" /></a>소스 코드 확인<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVxOZqQkBQGHGqKhpRy1sW2yNm6rviTOK2lCvEwu3JcIThi17cXAJCukEqlo9tdmOWnjKFKxgCif4Kx4-CPZBv5CSxyk5Spgncb340QNAXHpeyvH9BSPyPElXzBXt5Zu52KNWFYvT5g0m0/s1600/nb69_plugin_wordApp_58.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 336px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490076071632346226" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVxOZqQkBQGHGqKhpRy1sW2yNm6rviTOK2lCvEwu3JcIThi17cXAJCukEqlo9tdmOWnjKFKxgCif4Kx4-CPZBv5CSxyk5Spgncb340QNAXHpeyvH9BSPyPElXzBXt5Zu52KNWFYvT5g0m0/s400/nb69_plugin_wordApp_58.jpg" /></a> 이제 프로젝트(WordApp)를 실행합니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZlBmjDg_OAebORu3AxTiM670HUquDVNUNIzhxG0P6RAs9-6u1JBAmwNYEfaTzrcupp-QXxCLsy3dK1si29NukmpmzGqhVZ_x4wTDXjEF5Rrm8MLjVXWnANbSw6SZ1xXzZ9ZFYFGSQa59D/s1600/nb69_plugin_wordApp_59.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 336px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490076064362970178" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZlBmjDg_OAebORu3AxTiM670HUquDVNUNIzhxG0P6RAs9-6u1JBAmwNYEfaTzrcupp-QXxCLsy3dK1si29NukmpmzGqhVZ_x4wTDXjEF5Rrm8MLjVXWnANbSw6SZ1xXzZ9ZFYFGSQa59D/s400/nb69_plugin_wordApp_59.jpg" /></a> 아까와 마찬가지로 창을 누르면 이번에는 History 창이 추가 작업되어 있음을 알 수 있습니다. 클릭<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCEpCpbSGB2uH5wk6CqWQv8ytb0_DSGu1vmfgG7D1ybTMRMA63I3hEAkjohIBueCi531I1zB263WdGDO3RTWPZBKckIwbnKRwHDO3k4fgBbIBQosGTZzuf_e8olm-QdTWNHLCnOf3cvwA1/s1600/nb69_plugin_wordApp_60.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 344px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490076057862078338" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCEpCpbSGB2uH5wk6CqWQv8ytb0_DSGu1vmfgG7D1ybTMRMA63I3hEAkjohIBueCi531I1zB263WdGDO3RTWPZBKckIwbnKRwHDO3k4fgBbIBQosGTZzuf_e8olm-QdTWNHLCnOf3cvwA1/s400/nb69_plugin_wordApp_60.jpg" /></a> 히스토리 창은 말그래도 작업한 내용에 대한 히스토리가 나타나는 창입니다.<br />아래 filter 된 내용이 순서대로, hello, netbeans 6.9 cool 이렇게 2개 작업했고 그 내용이 히스토리 창에 나타나 있습니다<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSXMB5Hw1Jj9Qhu69zG6ud0HGC2KSZepuUe3-ttIosAVH9fEHXM9YT_s82lgR_RIenD9bRYNjirC3yEbnz14Sehn-PFgGsYHQqmDbyp0TMZpqn0V1e84b1BOLmhtpD-T-z3uh9ZQK_NmaK/s1600/nb69_plugin_wordApp_61.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 344px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490077474740513714" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSXMB5Hw1Jj9Qhu69zG6ud0HGC2KSZepuUe3-ttIosAVH9fEHXM9YT_s82lgR_RIenD9bRYNjirC3yEbnz14Sehn-PFgGsYHQqmDbyp0TMZpqn0V1e84b1BOLmhtpD-T-z3uh9ZQK_NmaK/s400/nb69_plugin_wordApp_61.jpg" /></a><br />********************************************************************************<br />그럼 이제 넷빈 6.9에 새로 추가된 내용인 브랜딩(branding)에 대해 알아 보겠습니다.<br />프로젝트 WordApp 에서 마우스 오른쪽 클릭 - 브랜딩(branding) 클릭<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeJ3KEtLQOOrP7HNNIbHiIfq83HG_orHY6YnrE3LESWbYbhnwRtlRMpPwbrkuRiASMqmE1TAumgXZPvJDF9EcrZndRp7of5cjvsUJ4R8qoSyow8j4QBkR7oaSjGvcyFLLxsJ0einPvUtkI/s1600/nb69_plugin_wordApp_62.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 328px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490077467356804386" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeJ3KEtLQOOrP7HNNIbHiIfq83HG_orHY6YnrE3LESWbYbhnwRtlRMpPwbrkuRiASMqmE1TAumgXZPvJDF9EcrZndRp7of5cjvsUJ4R8qoSyow8j4QBkR7oaSjGvcyFLLxsJ0einPvUtkI/s400/nb69_plugin_wordApp_62.jpg" /></a> 해당 모듈 어플리케이션에 대한 브랜딩 작업으로 제목이나 아이콘 등을 작업하는 기본 화면,<br />어플리케이션이 시작되기 전에 표시되는 스플래시 스크린 등 기타 여러 내용이 보다 손쉽게 작업되도록 구성되어 있습니다.<br />기본으로는 넷빈 아이콘이 사이즈 별로 제시되어 있는데 적당히 인터넷에서 해당 사이즈의 아이콘 등을 찾아 연결해 줬습니다. ^^;<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3-UdRHTckgP_07Ate1QtT5UGg4MybQyF-NLSXEQ1BOojelEBcEUpD15HvCPxZRKL7OdcB_pjYeN41P7iBHwChHidOrjmfyaQss5aoXsuTJuhDpfokerH7651mVj9FT-CPL24huu4e9TLU/s1600/nb69_plugin_wordApp_63.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 341px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490077446321418338" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3-UdRHTckgP_07Ate1QtT5UGg4MybQyF-NLSXEQ1BOojelEBcEUpD15HvCPxZRKL7OdcB_pjYeN41P7iBHwChHidOrjmfyaQss5aoXsuTJuhDpfokerH7651mVj9FT-CPL24huu4e9TLU/s400/nb69_plugin_wordApp_63.jpg" /></a> 두번째 탭은 스플래시 화면에서는 현재 맥 OS 10인 스노우 레오퍼드 이미지를..ㅋㅋ 원래는 역시 넷빈 6.9 이미지가 되어 있습니다. 원하는 이미지를 찾아보기 버튼을 눌러 바꿔주시면 됩니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhE84HgjB24XiocPo2pDyrTOK00tgVGwGtRMR-BL19aLxJsboOWKE2ajLjiZfDYNFZU8_dLBCU3lMDYHRamrYzqniU1Q5g24n_H7-hacQgpScCahWYiu0jtoYNTWL1HIxA9ytTRZzKwi32u/s1600/nb69_plugin_wordApp_64.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 341px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490077428705960786" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhE84HgjB24XiocPo2pDyrTOK00tgVGwGtRMR-BL19aLxJsboOWKE2ajLjiZfDYNFZU8_dLBCU3lMDYHRamrYzqniU1Q5g24n_H7-hacQgpScCahWYiu0jtoYNTWL1HIxA9ytTRZzKwi32u/s400/nb69_plugin_wordApp_64.jpg" /></a> 윈도우 시스템 탭의 내용입니다<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOX0TiPaK1iV42m_KoYUh8XqQFg004BSumXfg2tRbs48fJKG21zReL5a4rr1BoPJcg5WX7J2kXm_TM3d7tcXo1VaRAoFlbBx1msMO3tHv6pSgP2hGQ4_oI_DWTWBOuAmDgliCzZ2H0L1PC/s1600/nb69_plugin_wordApp_65.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 341px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490077414848749362" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOX0TiPaK1iV42m_KoYUh8XqQFg004BSumXfg2tRbs48fJKG21zReL5a4rr1BoPJcg5WX7J2kXm_TM3d7tcXo1VaRAoFlbBx1msMO3tHv6pSgP2hGQ4_oI_DWTWBOuAmDgliCzZ2H0L1PC/s400/nb69_plugin_wordApp_65.jpg" /></a> 자원 번들 탭의 내용입니다. 확인 후 - OK<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlnFUHReXb4_IDtCCWdr-xBMrT_9NH-Qjh-7sWsvf7rIELYrhDz5Lxlusmg39UNNqowyeRxN0xmn9gaHHmPfsM4mDsunEeXcL7Gfja_gg7pJ4elue27R50cm3o9ifXdL91PAVDUX_Wh_u-/s1600/nb69_plugin_wordApp_66.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 342px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490081599260005314" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlnFUHReXb4_IDtCCWdr-xBMrT_9NH-Qjh-7sWsvf7rIELYrhDz5Lxlusmg39UNNqowyeRxN0xmn9gaHHmPfsM4mDsunEeXcL7Gfja_gg7pJ4elue27R50cm3o9ifXdL91PAVDUX_Wh_u-/s400/nb69_plugin_wordApp_66.jpg" /></a> 이제 새로 브랜딩 된 내용을 반영하기 위해 프로젝트를 모두 지우고 빌드(clean and build) 합니다<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtgG-HrMz97mawKgQ5PEpc3V8yw-_H5999O4cOXb1m7lY8WT04U-eMYJbxuEF_SnZ5ehZXmWKMLB09QX9ri8ji9cxLY_W8NptdQizpKU7IZB5GtjZbXmmXqzQAscrgcmee0_55Tj3Hrac9/s1600/nb69_plugin_wordApp_67.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 332px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490081589567294450" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtgG-HrMz97mawKgQ5PEpc3V8yw-_H5999O4cOXb1m7lY8WT04U-eMYJbxuEF_SnZ5ehZXmWKMLB09QX9ri8ji9cxLY_W8NptdQizpKU7IZB5GtjZbXmmXqzQAscrgcmee0_55Tj3Hrac9/s400/nb69_plugin_wordApp_67.jpg" /></a> 그리고 이 브랜딩 된 내용의 프로젝트를 .exe 로 만들기 위해 WordApp 프로젝트에서 마우스 오른쪽 클릭 - 빌드 인스톨러(build installer)를 선택합니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZZ5EAk9RUXLj1J5QWVGrAag8BJr0zoL7nZ8ww4N4BQVMhuUV4SDEbK_1_KTCbP0Bocyn69vSHj9RMDvLIbrKbTTImg1ND3dFfbqH4lYqWhsuyFiM3UzSSGKVI73dcFvXLMLWBzC6hFbqu/s1600/nb69_plugin_wordApp_68.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 332px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490081577987564258" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZZ5EAk9RUXLj1J5QWVGrAag8BJr0zoL7nZ8ww4N4BQVMhuUV4SDEbK_1_KTCbP0Bocyn69vSHj9RMDvLIbrKbTTImg1ND3dFfbqH4lYqWhsuyFiM3UzSSGKVI73dcFvXLMLWBzC6hFbqu/s400/nb69_plugin_wordApp_68.jpg" /></a> 출력창으로 모든 작업이 완료되면(build successfully) 파일 탭을 열고 dist 를 확장하면 안에 프로젝트의 설치 exe 프로그램이 들어 있습니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgttNHhN50xFpibLvwvYOVqDFDftbP81NlK9FFTDWKZVOklkWXFObBWSBPZfs7ECvpG2pMVzVRRloUdFQHuzgtSZJQengY2pRvmZAENbzClIrlYmOuVA0Mqn4L8dEEPkmiGQFeJZPxaxxX1/s1600/nb69_plugin_wordApp_69.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 332px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490081568634642354" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgttNHhN50xFpibLvwvYOVqDFDftbP81NlK9FFTDWKZVOklkWXFObBWSBPZfs7ECvpG2pMVzVRRloUdFQHuzgtSZJQengY2pRvmZAENbzClIrlYmOuVA0Mqn4L8dEEPkmiGQFeJZPxaxxX1/s400/nb69_plugin_wordApp_69.jpg" /></a> 이제 윈도우 탐색기를 열어 좀전의 해당 XXX.exe 를 더블클릭하면 아래 그림처럼 설치 마법사가 시작됩니다. - Next<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEdxNv93qcKffng_UCzH3c9GFGfIP_paRdZsfo1ggVFfMAaZ5O9efXIbf_iSbg68PP92mimB5OetsQtQabDoDML87xPNCp8JVLZimGpjhakP2HfzK94rckHB4eJt6fRSB3NxgPZ0gK6hEU/s1600/nb69_plugin_wordApp_70.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 300px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490081562642839746" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEdxNv93qcKffng_UCzH3c9GFGfIP_paRdZsfo1ggVFfMAaZ5O9efXIbf_iSbg68PP92mimB5OetsQtQabDoDML87xPNCp8JVLZimGpjhakP2HfzK94rckHB4eJt6fRSB3NxgPZ0gK6hEU/s400/nb69_plugin_wordApp_70.jpg" /></a> 설치될 경로 확인하고 next<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvg03PI-12oyNRGn4PmvSX-Z_GJ8xUUH5c0nfi0F2mNTLKWitYVsLlPy1o-gtLSptI21tZAe1JQDWTLCSZ7KRNzKCg3osDq1bXEosVUREo3x_26-jcDYhoADtxbecGlwQvxyTA8TgxJs-g/s1600/nb69_plugin_wordApp_71.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 300px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490082939943079234" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvg03PI-12oyNRGn4PmvSX-Z_GJ8xUUH5c0nfi0F2mNTLKWitYVsLlPy1o-gtLSptI21tZAe1JQDWTLCSZ7KRNzKCg3osDq1bXEosVUREo3x_26-jcDYhoADtxbecGlwQvxyTA8TgxJs-g/s400/nb69_plugin_wordApp_71.jpg" /></a> 설치 시작 - install<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxNE7-9GvTPUD-372HxMta2vPKa6FcoQN5cGlvTmYIx7lXzYYUfInCJD1qZT76HdSgcypj3mPtjLIq6Uc2Hj_bRRksHEjEZAqaD59OqpIWaoYN3YgerlG6o7c-hJwaIF6B2ITiY4SOtnBe/s1600/nb69_plugin_wordApp_72.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 300px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490082935886709154" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxNE7-9GvTPUD-372HxMta2vPKa6FcoQN5cGlvTmYIx7lXzYYUfInCJD1qZT76HdSgcypj3mPtjLIq6Uc2Hj_bRRksHEjEZAqaD59OqpIWaoYN3YgerlG6o7c-hJwaIF6B2ITiY4SOtnBe/s400/nb69_plugin_wordApp_72.jpg" /></a> 성공적으로 설치가 완료되었습니다. finish<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9AckmVO07viWjwFFI9NYlssgXDKAueFBiBSBOYj7U61ImaG2JwePUUmI9ONVcLgLBaILgAnAygfRni2pYpuZF7bkP71HcPSgG0lCYRwc2xDJE3MBEPETdBwE0mMtegNw_ux7p7r33bBun/s1600/nb69_plugin_wordApp_73.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 300px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490082932906927426" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9AckmVO07viWjwFFI9NYlssgXDKAueFBiBSBOYj7U61ImaG2JwePUUmI9ONVcLgLBaILgAnAygfRni2pYpuZF7bkP71HcPSgG0lCYRwc2xDJE3MBEPETdBwE0mMtegNw_ux7p7r33bBun/s400/nb69_plugin_wordApp_73.jpg" /></a> 바탕화면에 새로이 WordApp 단축키가 만들어집니다. 더블 클릭하면 아까 설정한 스플래시 화면(아래 그림)과 함께 프로그램이 시작됩니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLJoOuIY5YkGs1LPo_99DQhO8L2P-WSJhtFPoulGKqAVbT1lZDiBGMW0dhO_vB_5QH-IUi6Z6RTUthCotQwo1f-9WJy523uWDM7H6Avu93w4hfLT_JSnVPlI3JjJijWmuhKBy8A5GvdhIV/s1600/nb69_plugin_wordApp_74.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 254px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490082923446426866" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLJoOuIY5YkGs1LPo_99DQhO8L2P-WSJhtFPoulGKqAVbT1lZDiBGMW0dhO_vB_5QH-IUi6Z6RTUthCotQwo1f-9WJy523uWDM7H6Avu93w4hfLT_JSnVPlI3JjJijWmuhKBy8A5GvdhIV/s400/nb69_plugin_wordApp_74.jpg" /></a> 역시 브랜딩에서 작업했던 아이콘(구글 안드로이드 보이)이 프로그램 화면 왼쪽 상단에 그리고 , 작업표시줄에도 나타납니다. 내용은 아까 실행해서 본 대로 윈도우에 histroy, text 등을 선택하여 테스트 해볼 수 있습니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjm_r-pT3kD7A1tMt89jmvsHEgsnEfIF-I5-wJX9hjOIutSk0RtVqBYSpxQRPcssls5jiCj6_aMg1f2sVQKRvh22QvvA53oWijkokK4aHQVDUZStmc2sech9sod9s3q-bU0vTIk34wiog5/s1600/nb69_plugin_wordApp_75.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 384px; DISPLAY: block; HEIGHT: 400px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490082912702071954" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjm_r-pT3kD7A1tMt89jmvsHEgsnEfIF-I5-wJX9hjOIutSk0RtVqBYSpxQRPcssls5jiCj6_aMg1f2sVQKRvh22QvvA53oWijkokK4aHQVDUZStmc2sech9sod9s3q-bU0vTIk34wiog5/s400/nb69_plugin_wordApp_75.jpg" /></a> Help의 about 을 클릭하면 아래처럼 스플래시 화면과 함께 정보 내용이 표시됩니다. 음..눈표범..이뽀요..ㅎㅎ<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzdIjVB5G0afbWGMLHG3b6yRoqMXNX1gV0D3QBeRFwhshtbR4KFwL1Cyjekg-nMrs6h4l3DZawz2ntoF_LxWHyk-DbeQy2xE7H73XMdmg2fFNeegYa3RyCZXkxyqXKk_PXQLzi2iiZj1J1/s1600/nb69_plugin_wordApp_76.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 326px; DISPLAY: block; HEIGHT: 400px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5490084092449649458" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzdIjVB5G0afbWGMLHG3b6yRoqMXNX1gV0D3QBeRFwhshtbR4KFwL1Cyjekg-nMrs6h4l3DZawz2ntoF_LxWHyk-DbeQy2xE7H73XMdmg2fFNeegYa3RyCZXkxyqXKk_PXQLzi2iiZj1J1/s400/nb69_plugin_wordApp_76.jpg" /></a><br />이상이 2번째로 만들어본 넷빈즈 플랫폼 프로그램입니다.<br />특히나 플러그인 생성 및 인스톨러의 강화는 앞으로 이쪽을 활성화할수 있는 좋은 기능들 인 거 같습니다. 넷빈에도 드뎌 돈되는 플러그인이??? 쿄쿄쿄 <br />다음엔 OSGi 번들 및 메이븐과의 작업등도 천천히 함 살펴 보겠습니다.<br />긴 글에 수고하셨습니다. *^^*강여사(J.Y.Kang)http://www.blogger.com/profile/17450510931308610527noreply@blogger.com0tag:blogger.com,1999:blog-6811062799606447528.post-73681209201172967352010-07-03T05:00:00.000-07:002010-07-03T06:39:28.800-07:00넷빈(NetBeans)6.9에서 모듈(.exe 나 플러그인) 만들기-01-googletoolbar넷빈 플랫폼은 아시다시피 모듈 아키텍처 입니다. 더욱이 넷빈즈 플랫폼은 자바로 사용자 인터페이스를 만들어주는 공식 툴킷인 Swing UI 툴킷에 기반한 "Matisse' GUI 빌더와 결합되어 있습니다.<br /><br />넷빈에서 모듈을 만들게 되면 독립적인 실행 프로그램으로(넷빈 기반의 Swing UI)가능하고, 또 넷빈의 플러그인 형태를 만들어 낼 수도 있습니다.<br /><br />따라서 이번에는 넷빈 플랫폼을 기반으로 하는 넷빈 모듈 프로젝트를 만드는 방법에 대해 알아보고, 보다 쉽게 나만의 넷빈 플러그인을 만들어 봅시다.이번 게시물에서는 아니지만 특히나 넷빈 6.9에서 제공되는 설치 프로그램 브랜딩에 대해서도 살펴보도록 하겠습니다.<br /><br />우선 작업환경은 다음과 같습니다.<br /><br />넷빈 6.7 이상 (저는 넷빈 6.9에서 작업했습니다)<br />JDK 5이상 (저는 JDK6up20입니다)<br /><br />그럼 이제 간단한 넷빈 모듈 플랫폼 어플리케이션을 만들어 보도록 하겠습니다.<br />프로젝트 창에서 마우스 오른쪽 클릭 - 새 프로젝트<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUABg356CLbb63ZgJpfgODUY1wQiZ6A6daqiIUWSNzZ3PhBNz6zb24ax5P6QPApD7FiUFFIYnlsjjm1z3oJljkYR9YOuwO8Jaktu1O5YUvu4T7zdPy6WtF_ae_TIataKnK9IZ6OvRw3Ie2/s1600/nb69_plugin_01.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 328px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489650695341078098" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUABg356CLbb63ZgJpfgODUY1wQiZ6A6daqiIUWSNzZ3PhBNz6zb24ax5P6QPApD7FiUFFIYnlsjjm1z3oJljkYR9YOuwO8Jaktu1O5YUvu4T7zdPy6WtF_ae_TIataKnK9IZ6OvRw3Ie2/s400/nb69_plugin_01.jpg" /></a> 카테고리에서 넷빈즈 모듈을, 프로젝트에서 Module 을 선택합니다. - 다음<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkJgC9fvUrBWuUdUysLmI3SwP8v9AYvapc8zInPfcxDib7mDL8oduYK9sa4WETgPJxL9ySltMKDs9S56I274j9W1auLLiLWGx_fI1IZetzmBtjHmdqkTwLJioeJazS9nCIdWgdWG0mhSRE/s1600/nb69_plugin_02.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489650688707928850" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkJgC9fvUrBWuUdUysLmI3SwP8v9AYvapc8zInPfcxDib7mDL8oduYK9sa4WETgPJxL9ySltMKDs9S56I274j9W1auLLiLWGx_fI1IZetzmBtjHmdqkTwLJioeJazS9nCIdWgdWG0mhSRE/s400/nb69_plugin_02.jpg" /></a> 프로젝트 이름은 GoogleToolbar ,(앞으로 구글 검색 바 만듭니다 ^^;)<br />경로는 적당히<br />독립실행형(standalone 프로그램) 등 기본 설정 그대로 - 플랫폼 옆에 관리 버튼을 누르면 다른 플랫폼도 추가 ,선택 가능합니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-UwknBcOkS-Wy91mhmadoZAJFRG6JSsj_4NUB8Wy6lYgZFB_9Wy4F90ihPd3xSAn2qwIQ1Kac1vZiHRog_J5f8mQS4FnMR-RxpXHj3jHl1-nUyqc0F6_5a3Re4liGiIq-LtmhnoGKE3tU/s1600/nb69_plugin_03.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 255px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489650681781727266" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-UwknBcOkS-Wy91mhmadoZAJFRG6JSsj_4NUB8Wy6lYgZFB_9Wy4F90ihPd3xSAn2qwIQ1Kac1vZiHRog_J5f8mQS4FnMR-RxpXHj3jHl1-nUyqc0F6_5a3Re4liGiIq-LtmhnoGKE3tU/s400/nb69_plugin_03.jpg" /></a> 플랫폼 이름 및 폴더 이름 확인 후 그냥 닫기<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBMvo3PDb2Y_rk27MjDM35PGr3pcIPfGIj-sge5DReNstSKaJTQkNNUsGzB0am_j8CAnVl1hrNgPTXuUBOlQCvg2a6UOLeoqvf9b7wkXjjaZTmZYa8WieosvGB_51eBoybJVNnOOfywu8Q/s1600/nb69_plugin_04.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 271px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489650673682551490" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBMvo3PDb2Y_rk27MjDM35PGr3pcIPfGIj-sge5DReNstSKaJTQkNNUsGzB0am_j8CAnVl1hrNgPTXuUBOlQCvg2a6UOLeoqvf9b7wkXjjaZTmZYa8WieosvGB_51eBoybJVNnOOfywu8Q/s400/nb69_plugin_04.jpg" /></a> 원래 창으로 돌아와서 다음을 누르면 아래 그림과 같이 뜨는데 여기서는 기본 모듈 구성에 관한 내용을 설정합니다.<br />코드 이름 기본: org.myorg.googletoolbar 로,<br />"Generate XML Layer" 선택, org/myorg/googletoolbar 패키지안에 저장될 로컬화된 번들 및 XML 레이어 파일들의 위치를 확인후 마침<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJygFjmb5iSRYZKWeHJH19BCMf8kcsc8MQ8ecvD4a5K2s_jlMINQNKw2xloCimivnWkX0L3iaonWwGam5AJ8lsGUNjjKGO-krvCqhDJ-jd_Bifvp17EJpxLWR_3O9x8TbJiGnaIcKxgWCm/s1600/nb69_plugin_05.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 255px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489650665255542274" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJygFjmb5iSRYZKWeHJH19BCMf8kcsc8MQ8ecvD4a5K2s_jlMINQNKw2xloCimivnWkX0L3iaonWwGam5AJ8lsGUNjjKGO-krvCqhDJ-jd_Bifvp17EJpxLWR_3O9x8TbJiGnaIcKxgWCm/s400/nb69_plugin_05.jpg" /></a> 그럼 아래 그림과 같이 모듈에 관련된 일련의 파일이 만들어집니다. 프로젝트는 소스코드와 프로젝트 메타데이터 등으로 구성되어 있습니다. 해당 파일을 열어 논리적 파일을 살펴본 후 Ctrl+2 키를 누르면 파일 윈도우창으로 변경됩니다. 파일 탭창에 나타나는 파일은 실제 물리적인 파일 및 구조들 입니다. 확인<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZVvNIqQhRTYoVRpv_Zf5S8jo6uQoaza9TtthJ75oiisAN5IN_e0Tp7DnrbzbYnbzEstTjutQcBh_M_c90oTYqWE_ln5WSRsyfzKTQemoNGjWZNjFopyNbP84GmJlungrMBx9pJrkSXHUw/s1600/nb69_plugin_06.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 328px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489654162465803842" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZVvNIqQhRTYoVRpv_Zf5S8jo6uQoaza9TtthJ75oiisAN5IN_e0Tp7DnrbzbYnbzEstTjutQcBh_M_c90oTYqWE_ln5WSRsyfzKTQemoNGjWZNjFopyNbP84GmJlungrMBx9pJrkSXHUw/s400/nb69_plugin_06.jpg" /></a> 프로젝트 창으로 와서 중요한 파일(Important Files) 노드에서 Module Manifest(모듈 매니페스트)를 열어 다음 내용을 확인합니다.<br />------------------------------------------------------<br />Manifest-Version: 1.0<br />OpenIDE-Module: org.myorg.googletoolbar<br />OpenIDE-Module-Layer: org/myorg/googletoolbar/layer.xml<br />OpenIDE-Module-Localizing-Bundle: org/myorg/googletoolbar/Bundle.properties<br />OpenIDE-Module-Specification-Version: 1.0<br />------------------------------------------------------<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgk9ozOi3N62X0jQspjChCO3UmG5jKZENu_9TBpXbTfuiUKip_RN3EidnhQl1V3tJEg20vp7_Lp79FPZ1zxZl4BZZOnGtz0uFonCiuo8eaBmYRP6jRgH4Up3Vk1qL_NWIkisgi3TxzmvCI1/s1600/nb69_plugin_07.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 328px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489654157436747106" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgk9ozOi3N62X0jQspjChCO3UmG5jKZENu_9TBpXbTfuiUKip_RN3EidnhQl1V3tJEg20vp7_Lp79FPZ1zxZl4BZZOnGtz0uFonCiuo8eaBmYRP6jRgH4Up3Vk1qL_NWIkisgi3TxzmvCI1/s400/nb69_plugin_07.jpg" /></a> 이제 모듈에 코드작업을 하기 위해 다음을 진행합니다. 우선 프로젝트에서 오른쪽 마우스를 클릭하여 새로 만들기(new File)- action (만약 액션(작업) 메뉴가 보이지 않으면 other 를 선택한 후, module development 를 선택하면 action 이 있습니다)<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEFN-7FNNRswUuizzkFlF1bsx0LAhrIe8rTK-lGVX2FkfClA74uszI500UFNvmDc7mWTQImDSoow5SVRakqk9gQX8WqkOpYHIr4HsMevPRwm6Bd-iyWFy7o5ccDQXkDJOfkD9MJdVdY948/s1600/nb69_plugin_08.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 328px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489654146142363074" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEFN-7FNNRswUuizzkFlF1bsx0LAhrIe8rTK-lGVX2FkfClA74uszI500UFNvmDc7mWTQImDSoow5SVRakqk9gQX8WqkOpYHIr4HsMevPRwm6Bd-iyWFy7o5ccDQXkDJOfkD9MJdVdY948/s400/nb69_plugin_08.jpg" /></a> Action Type 창에서 기본 설정대로 항상 활성화를 그대로 확인하고 다음을 진행합니다. 이렇게 되면 자동 ActionListener 가 서브클래스로 만들어집니다<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1WNwJDDir8ZyL86pNBPPWgqQe-4bNEPvVifBAmRXBitY4Wo9orI_GSkYwYnqJLFqyz0Q0wl2DnMBfgsu5-69NHWfa2de9qKqGLP0AmstzUNUmBAvwnzxHHL_X0suAdQzDDJcliAXQIiff/s1600/nb69_plugin_09.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 294px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489659767991624306" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1WNwJDDir8ZyL86pNBPPWgqQe-4bNEPvVifBAmRXBitY4Wo9orI_GSkYwYnqJLFqyz0Q0wl2DnMBfgsu5-69NHWfa2de9qKqGLP0AmstzUNUmBAvwnzxHHL_X0suAdQzDDJcliAXQIiff/s400/nb69_plugin_09.jpg" /></a> GUI 등록 패널에서 아래 그림처럼 범주 기타 등등을 설치하는데, 이 대목에 시간이 꽤 걸릴 수 있습니다..느긋하게..--; 범주는 파일로, 전역메뉴아이템 체크는 해제하고, 아래 전역 툴바 버튼은 체크합니다. (그림 참고)<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibEI571UoNYLdXRJeXXS-iPYPdhbbbNAUnENARwxzXExrOdAvSUnq8kKpLKeRnX5uJhXkAbUaYwTHHF2bxUFEsytxFvV6IFJ7dXtf-dl_2Gj0xk5Lm_PyYKZTCVuSMvJuDsX5w-kMkmh2w/s1600/nb69_plugin_10.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 280px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489654131203550962" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibEI571UoNYLdXRJeXXS-iPYPdhbbbNAUnENARwxzXExrOdAvSUnq8kKpLKeRnX5uJhXkAbUaYwTHHF2bxUFEsytxFvV6IFJ7dXtf-dl_2Gj0xk5Lm_PyYKZTCVuSMvJuDsX5w-kMkmh2w/s400/nb69_plugin_10.jpg" /></a> 아래 그림처럼 설정하고 다음<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghfI9oeSZb1l-dw56WpB2RLct_jD3z-kn5PJNBb_8nxz0Zx-Tpz14NKbYGugvRiYfeMIGd-CZ-zhFPa9uglIHldaB9YhdLdSR7HPB1AlygiacysNWauzek-U3xGEwkL8xxmec4wsYrrXJf/s1600/nb69_plugin_11.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 280px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489660485645874034" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghfI9oeSZb1l-dw56WpB2RLct_jD3z-kn5PJNBb_8nxz0Zx-Tpz14NKbYGugvRiYfeMIGd-CZ-zhFPa9uglIHldaB9YhdLdSR7HPB1AlygiacysNWauzek-U3xGEwkL8xxmec4wsYrrXJf/s400/nb69_plugin_11.jpg" /></a> 이름, 아이콘 및 위치를 설정합니다. 클래스 이름은 GoogleAction 으로 주고 , 아이콘 작업은 할 수도 안할 수도 있는데, 만약 하게 되면 16x16, 24x24 픽셀 사이즈의 아이콘이 2개 필요하며 해당 이미지 파일을 찾아보기를 통해 연결하면 됩니다. 모든 작업이 정상적으로 진행되면 아래 그림처럼 생성되는 파일과 수정 파일에 내용이 표시됩니다. - 마침<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6qrApTq5ci80hNpR8dX9y8sx5L2IHquP6b5CIueqDC1b6zYtC7otn-HwtFraXbT57GcNlYnAV39VfZFgLeTSmLUUIrCzQMLVx1N5FT57AUqe8w5Xd_6Q3TWy-Y3agdLihExD5uCFQtMw2/s1600/nb69_plugin_12.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 280px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489660481795221122" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6qrApTq5ci80hNpR8dX9y8sx5L2IHquP6b5CIueqDC1b6zYtC7otn-HwtFraXbT57GcNlYnAV39VfZFgLeTSmLUUIrCzQMLVx1N5FT57AUqe8w5Xd_6Q3TWy-Y3agdLihExD5uCFQtMw2/s400/nb69_plugin_12.jpg" /></a> 이번에는 디자인 작업을 위해 JPanel 을 만듭니다. 프로젝트에서 마우스 오른쪽 클릭 - 새로만들기 - Other<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2v7xdBW0y0dHbw9jb05UXGEWJNymdt-1f9GrqFSsXBsZ9BEDnxIFZoXg0t8unBYR2lm-H2UbPpzaj4fNCcXfKUCW6DcHkhCQnumf3f6tN4lNMMGPL9eCB6hYyUwsVn0HdjiSGknh7s_a7/s1600/nb69_plugin_13.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 314px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489660471529566610" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2v7xdBW0y0dHbw9jb05UXGEWJNymdt-1f9GrqFSsXBsZ9BEDnxIFZoXg0t8unBYR2lm-H2UbPpzaj4fNCcXfKUCW6DcHkhCQnumf3f6tN4lNMMGPL9eCB6hYyUwsVn0HdjiSGknh7s_a7/s400/nb69_plugin_13.jpg" /></a> 팝업창이 뜨면 카테고리에서 Swing GUI 폼 , 파일 유형은 JPanel 폼 을 선택합니다 - 다음<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqlGdr-UqNFp27x-fdIIBeuNSanK3DofoZJhSIf45arok63JdtE60kyftxqk7TYQxEswL-FvdZpYtnW6GQ88gUf4VgaGjrezga6IDVaIcZtXDLnsqMIvSlKnOJqPOmbyAe0hAA_xW9CGsA/s1600/nb69_plugin_14.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489660466749146386" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqlGdr-UqNFp27x-fdIIBeuNSanK3DofoZJhSIf45arok63JdtE60kyftxqk7TYQxEswL-FvdZpYtnW6GQ88gUf4VgaGjrezga6IDVaIcZtXDLnsqMIvSlKnOJqPOmbyAe0hAA_xW9CGsA/s400/nb69_plugin_14.jpg" /></a> 패널 클래스 이름은 GooglePanel 로 주고 패키지는 같은 패키지를 드롭다운 리스트에서 찾아 선택해 줬습니다 - 마침<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsh061wCX1HI9slgXDoVjpK_j59986zSr53ZKIt78Wn9Axrk0lb2UjAmJtl_1s7H6ZHnXhhlcogoS2uAYw-POXpsUacN3IA-rK8pSKK1Wim2TeJjI7OoqdaEHWrSCIq66lCTNaJvnCVNoG/s1600/nb69_plugin_15.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489660460157129922" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsh061wCX1HI9slgXDoVjpK_j59986zSr53ZKIt78Wn9Axrk0lb2UjAmJtl_1s7H6ZHnXhhlcogoS2uAYw-POXpsUacN3IA-rK8pSKK1Wim2TeJjI7OoqdaEHWrSCIq66lCTNaJvnCVNoG/s400/nb69_plugin_15.jpg" /></a> 가운데 디자인 창에 JPanel 이 나타나는데 아래 그림처럼 마우스 커서로 드래그해서 적당히 사이즈를 줄입니다<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-8zunB0QiLGy3JQk9Qe0VqPU01MponVluJyit_heggIJ77Fum-xuxKLQwRWiZeDWN-f2erAV0AYP4nQE97jK66FtIRnWVqbGy-mmXvRTdmOJF7Uzl6iM7Ir_FRFTbbaigZzEUL6m0QMGC/s1600/nb69_plugin_16.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 314px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489661810277245810" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-8zunB0QiLGy3JQk9Qe0VqPU01MponVluJyit_heggIJ77Fum-xuxKLQwRWiZeDWN-f2erAV0AYP4nQE97jK66FtIRnWVqbGy-mmXvRTdmOJF7Uzl6iM7Ir_FRFTbbaigZzEUL6m0QMGC/s400/nb69_plugin_16.jpg" /></a> 그런 다음 오른쪽 팔레트에서 JLabel 하나를 끌어 Google: 이라고 입력하고 왼쪽에, 그리고 오른쪽에는 JTextField 를 하나 끌어다가 역시 드래그해서 적당히 사이즈를 맞춰줍니다. 그리고 안의 내용은 오른쪽에 등록정보 창에 text 내용을 지우고 엔터키를 치면 내용이 지워집니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmveY9eccJa9bd2nTHj9CPtz1SsA9rauYDRlkBXzA_B44vYj5BOhMYqT7XL4Ocb7kBn4N_Z2bnY9TeTAqoch79m4AhPiKHmtBGvywsiy5g8VTtVlpFq7bfgjTKrW9LxOojCq_nf2bHZyFr/s1600/nb69_plugin_17.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 314px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489661798761261074" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmveY9eccJa9bd2nTHj9CPtz1SsA9rauYDRlkBXzA_B44vYj5BOhMYqT7XL4Ocb7kBn4N_Z2bnY9TeTAqoch79m4AhPiKHmtBGvywsiy5g8VTtVlpFq7bfgjTKrW9LxOojCq_nf2bHZyFr/s400/nb69_plugin_17.jpg" /></a> 이제 텍스트 필드에 코드를 입력해야 하는데 왼쪽 인스펙터(검사기?-만약 안보이면 상단의 창 메뉴에서 - 네비게이션-인스펙터를 클릭)에서 JTextField 에서 마우스 오른쪽을 클릭하면 Events - key- keytypes 를 차례로 선택하여 클릭하면 자동으로 소스 코드로 전환됩니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTqRiQspw2qXRsGAw5rL8Kv6438dlaoUG3pGS-Lx0hqnk0ZnP-Bj3H63jnv1ht-D4Oxp1pSg-EUlb3De22OvUJ3eKLV8htHUoMDnTrgj6FtvfrvmbqAWFevvHFOnCHVt_akoqTfmG36JvW/s1600/nb69_plugin_18.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 314px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489661796064582290" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTqRiQspw2qXRsGAw5rL8Kv6438dlaoUG3pGS-Lx0hqnk0ZnP-Bj3H63jnv1ht-D4Oxp1pSg-EUlb3De22OvUJ3eKLV8htHUoMDnTrgj6FtvfrvmbqAWFevvHFOnCHVt_akoqTfmG36JvW/s400/nb69_plugin_18.jpg" /></a> 전환된 메소드에 다음 내용(굵은 글씨)를 작업합니다.<br />==================================================================<br />private void jTextField1KeyTyped(java.awt.event.KeyEvent evt) {<br /><strong>int i = evt.getKeyChar();<br />if (i==10){//The ENTER KEY<br />// we display the google url.<br />try{<br />URLDisplayer.getDefault().showURL<br />(new URL("http://www.google.com/search?hl=en&q="+jTextField1.getText()+"&btnG=Google+Search"));<br />} catch (Exception eee){<br />return;//nothing much to do<br />}<br />}</strong><br />}<br />==================================================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcTSz3ChPteGMcLgsPOE6OfTvPHJelLyqd51dbbb4GymfIgn0Ycydox2BQe-5NHxLb0QN28Nyd6U5wM7F3Y3bqG4UZ7OF8ukCoEMPwjJHH4n3tHajYoyLZx2f4MZok-elI9-lGi2z54X2o/s1600/nb69_plugin_19.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 314px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489661788734624786" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcTSz3ChPteGMcLgsPOE6OfTvPHJelLyqd51dbbb4GymfIgn0Ycydox2BQe-5NHxLb0QN28Nyd6U5wM7F3Y3bqG4UZ7OF8ukCoEMPwjJHH4n3tHajYoyLZx2f4MZok-elI9-lGi2z54X2o/s400/nb69_plugin_19.jpg" /></a> 임포트 문제 해결은 여백에서 마우스 오른쪽을 클릭하여 가져오기 고정(fix import)를 선택합니다<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg24aRAIvvFDvQnXK-oWVXBsweFPzbtFWKOpFgCDGHx8MYbI8Hpd6jCgxlqiMKuRqO9u-z12zkRGp5bi6GwmZmX3b6SebmXk579TAl7rh0TlBF-rIHdERAPpar3vqnWtgnW8sdsbNfwElvi/s1600/nb69_plugin_20.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 314px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489661782470196834" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg24aRAIvvFDvQnXK-oWVXBsweFPzbtFWKOpFgCDGHx8MYbI8Hpd6jCgxlqiMKuRqO9u-z12zkRGp5bi6GwmZmX3b6SebmXk579TAl7rh0TlBF-rIHdERAPpar3vqnWtgnW8sdsbNfwElvi/s400/nb69_plugin_20.jpg" /></a> 임포트 클래스 확인 - OK<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfhv1jLFXQpTHpPX-kHHVgAMQkIrh7ZuII3hQjxs0GUHadsWIkA4j60kWdBZM02U5BGoi7bdwwnHYS1E5s1BZdPrAVVaxS0DEReIsiycwnQVaiktWnNJiRhWbmnOfbMBjL8ZBPM3ya_ZM4/s1600/nb69_plugin_21.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 256px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489663352755999890" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfhv1jLFXQpTHpPX-kHHVgAMQkIrh7ZuII3hQjxs0GUHadsWIkA4j60kWdBZM02U5BGoi7bdwwnHYS1E5s1BZdPrAVVaxS0DEReIsiycwnQVaiktWnNJiRhWbmnOfbMBjL8ZBPM3ya_ZM4/s400/nb69_plugin_21.jpg" /></a>플러스: 만약 URLDisplayer 가 작업되지 않으면 org.openide.awt 패키지에 문제가 있습니다. 따라서 이 경우 다음과 같이 해결할 수도 있습니다. 우선 프로젝트에서 오른쪽 마우스를 클릭한 후 등록정보를 선택합니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSn0kj32xn52x7BCQOfIH3HN71mbOcKxdCZ_ReiEarKaDGk4QsITDpOVSPN9Sa2CynqXvfBPOHBnZTT1K8IGLrYdtPKUh-LC9o56e117yvJoG4OP-HfN-2_nmDkSQSo-Fc6w1Rtu6LDRZe/s1600/nb69_plugin_22.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 314px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489663348562908338" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSn0kj32xn52x7BCQOfIH3HN71mbOcKxdCZ_ReiEarKaDGk4QsITDpOVSPN9Sa2CynqXvfBPOHBnZTT1K8IGLrYdtPKUh-LC9o56e117yvJoG4OP-HfN-2_nmDkSQSo-Fc6w1Rtu6LDRZe/s400/nb69_plugin_22.jpg" /></a> 라이브러리를 누르고 모듈 종속성에서 UI 유틸리티 API를 추가해주면 됩니다. 오른쪽의 추가 버튼을 누르고 팝업창이 뜨면 필터에 URLDisplayer 를 입력하면 관련 모듈이 제시됩니다. - OK<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXN3HFd-oYmaebK9JLnDXCh_X34cfQmDpLqzgqqFzyOrrVGsfUgyjLFZh6lndDS8cctX98wzoH-QPogCYlFzRfMRkiGYhj_zQ7Ovgnu2icbjLJE60KWRWMcAH3hf_0bv2NsouuZPDI7Vex/s1600/nb69_plugin_23.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 288px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489663329463992498" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXN3HFd-oYmaebK9JLnDXCh_X34cfQmDpLqzgqqFzyOrrVGsfUgyjLFZh6lndDS8cctX98wzoH-QPogCYlFzRfMRkiGYhj_zQ7Ovgnu2icbjLJE60KWRWMcAH3hf_0bv2NsouuZPDI7Vex/s400/nb69_plugin_23.jpg" /></a>이렇게 진행 완성된 임포트를 보면 아래 그림과 같습니다<br />---------------------------------------------------------<br />import java.net.URL;<br />import org.openide.awt.HtmlBrowser.URLDisplayer;<br />---------------------------------------------------------<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhp0StXOYswHnbf_2QbNM1AhOtv5ByZcUjZtf4uNpbueg0BhxxHLNVH5iGFHHeFTGZeR9IVCdB_PmrZqabpH8pMZhlYksmkskHd9fVcCDfqUzqUsUj0llGZmEXbCu0XXnJuS6w9ChyoOspA/s1600/nb69_plugin_24.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 314px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489663327402236898" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhp0StXOYswHnbf_2QbNM1AhOtv5ByZcUjZtf4uNpbueg0BhxxHLNVH5iGFHHeFTGZeR9IVCdB_PmrZqabpH8pMZhlYksmkskHd9fVcCDfqUzqUsUj0llGZmEXbCu0XXnJuS6w9ChyoOspA/s400/nb69_plugin_24.jpg" /></a> 이제 Presenter.Toolbar 를 구현해보도록 하겠습니다. JPanel에 구글 툴바가 표시될 실제 컴포넌트를 만들려면 Presenter.Toolbar 를 구현해야 합니다. 작업은 GoogleAction.java 에서 다음 코드를 작성합니다. 굵은 글씨 참고<br />========================================================<br />package org.myorg.googletoolbar;<br /><br />import java.awt.event.ActionEvent;<br />import java.awt.event.ActionListener;<br /><br />public final class GoogleAction implements <strong>Presenter.Toolbar,</strong> ActionListener {<br /><br /><strong>Component comp = new GooglePanel();<br /><br />@Override<br />public void actionPerformed(ActionEvent e) {<br />// TODO implement action body<br />}<br /><br />@Override<br />public Component getToolbarPresenter() {<br />return comp;<br />}</strong><br />}<br />========================================================<br />역시 임포트 문제는 마찬가지로 fix import(가져오기 고정)으로 해결합니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrfQgnO-XqOy7_cms-wJ0LW2q-DCd9bnKl7PSHFfAfXmW7OVkPo6ACJsjpBhWcdoo9VsUh7lahf6d9gAqfh7wCr446GY1oABnl_u4KevfG3XWPycUJMRdYcpYg2vgGwE-GSfZFbMt0TUH-/s1600/nb69_plugin_25.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 314px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489663315291216642" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrfQgnO-XqOy7_cms-wJ0LW2q-DCd9bnKl7PSHFfAfXmW7OVkPo6ACJsjpBhWcdoo9VsUh7lahf6d9gAqfh7wCr446GY1oABnl_u4KevfG3XWPycUJMRdYcpYg2vgGwE-GSfZFbMt0TUH-/s400/nb69_plugin_25.jpg" /></a> layer.xml 을 열어 내용을 확인합니다. 여기서는 Action 클래스의 인스턴스를 만들 필요가 없기 때문에 "instanceCreate" 속성은 제거합니다. (주석처리).<br />JPanel 에 JTextField 에서 엔터키를 입력하면 Google Search 로 내용이 보내집니다. HTML 브라우저에 열리고 Google Search 의 결과가 나타나게됩니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxZfXHxdsvDMy2SjiNbDi6xkVHoAKKbVMn49FVerAmxarNi_jAhDvRHIMb5fMGwY-3RxHzRz4s6_LFpLjzZf8IRwSOTQNo0xfOa7wvYxNLNksv_04k5TNmlLQvpof9M51ScbkTpbgB7zA-/s1600/nb69_plugin_26.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 314px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489665824342137762" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxZfXHxdsvDMy2SjiNbDi6xkVHoAKKbVMn49FVerAmxarNi_jAhDvRHIMb5fMGwY-3RxHzRz4s6_LFpLjzZf8IRwSOTQNo0xfOa7wvYxNLNksv_04k5TNmlLQvpof9M51ScbkTpbgB7zA-/s400/nb69_plugin_26.jpg" /></a> 프로젝트를 저장하고, 실행합니다. 프로젝트에서 마우스 오른쪽 클릭 - 실행<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQ7qBoz8UTN8OwKyUGMoGlqgEmFX83okYbOcAmFbekIW9plTeMs34rRFwHAdZo4twlIsDpxgmJJOd8CWslMXDIdtnrdEs3isJrD3RgdzTyx4ODKIAxiYhBLcYXqekeHgz3G6d7fyd1pr1_/s1600/nb69_plugin_27.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 314px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489665814412193698" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQ7qBoz8UTN8OwKyUGMoGlqgEmFX83okYbOcAmFbekIW9plTeMs34rRFwHAdZo4twlIsDpxgmJJOd8CWslMXDIdtnrdEs3isJrD3RgdzTyx4ODKIAxiYhBLcYXqekeHgz3G6d7fyd1pr1_/s400/nb69_plugin_27.jpg" /></a> 모듈이 빌트되고 IDE에 새 인스턴스가 설치된 넷빈이 시작되면서 아래 그림 처럼 구글패널이 나타납니다. 텍스트필드에 " netbeans ruby on rails" 를 입력하고 엔터키를 누릅니다<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCVnjd2_du59mU4a00LEXuueYfKsLW6r3lbWdZSfroQOO0_dE1ODjLMEtLYTMWDuIh6UAyFPUk2aD07pLroiAzUurQ2vDPhXFMgVWFZBWqEcykB6pX49QbSraRof5IFT0JjW2xFxWudB2q/s1600/nb69_plugin_28.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 151px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489665812820020674" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCVnjd2_du59mU4a00LEXuueYfKsLW6r3lbWdZSfroQOO0_dE1ODjLMEtLYTMWDuIh6UAyFPUk2aD07pLroiAzUurQ2vDPhXFMgVWFZBWqEcykB6pX49QbSraRof5IFT0JjW2xFxWudB2q/s400/nb69_plugin_28.jpg" /></a> 브라우저 창에 해당 내용의 구글 서치가 표시됩니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXK_J8NUQ967KiEAyiwqEvfaFngHW481nVYvVjn9Bgt_ecl1t0HT27nnprL8WUqfy4bI_QT82NB7K0QDtntXoJEVHQidPhjtpCz2ce-o83Sdxz5WjHeIBl0luvy9i-jnToJ9Agl2HxD4OZ/s1600/nb69_plugin_29.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 329px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489665804159022242" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXK_J8NUQ967KiEAyiwqEvfaFngHW481nVYvVjn9Bgt_ecl1t0HT27nnprL8WUqfy4bI_QT82NB7K0QDtntXoJEVHQidPhjtpCz2ce-o83Sdxz5WjHeIBl0luvy9i-jnToJ9Agl2HxD4OZ/s400/nb69_plugin_29.jpg" /></a> 그럼 이제 이 모듈을 넷빈 플러그인 형태로 만들어 보겠습니다. 프로젝트에서 마우스 오른쪽을 클릭하여 NBM 모듈을 선택합니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0nwFBI3k6I8GyVINi3hev5dOGl1f6w1G5udoKatwgwGr9-PqNSYgmb3Bne9voAzRXML5gbsMW65nFYLykYXDNjHNfQzrqoQ_zGQe-DWI5zS3ndbDBeYjHtAzc66QzaOKrPPlWaKCZuPPH/s1600/nb69_plugin_30.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 314px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489665797019602834" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0nwFBI3k6I8GyVINi3hev5dOGl1f6w1G5udoKatwgwGr9-PqNSYgmb3Bne9voAzRXML5gbsMW65nFYLykYXDNjHNfQzrqoQ_zGQe-DWI5zS3ndbDBeYjHtAzc66QzaOKrPPlWaKCZuPPH/s400/nb69_plugin_30.jpg" /></a> 작업이 성공적으로 마쳐지면(출력창에서 build successfully.) 파일 탭을 눌러 파일 창에 보면 해당 모듈이 만들어진 걸 확인할 수 있습니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZN_DZDhyphenhyphenUjMR7hMnw6OBcPOHU7NlzRRe6kRqtSX7zKHx2PWQ5kQtsX-3qLQAvxcnl6vbE3aCUW8SZ0VXtZ2Tjquvx9L_c67_Xy4Vv1bHB4V4w2VhX69V2U1_Ka-xw8X4Ym-cFfxhx4nGY/s1600/nb69_plugin_31.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 314px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489669849730161554" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZN_DZDhyphenhyphenUjMR7hMnw6OBcPOHU7NlzRRe6kRqtSX7zKHx2PWQ5kQtsX-3qLQAvxcnl6vbE3aCUW8SZ0VXtZ2Tjquvx9L_c67_Xy4Vv1bHB4V4w2VhX69V2U1_Ka-xw8X4Ym-cFfxhx4nGY/s400/nb69_plugin_31.jpg" /></a> 이 모듈을 지금 넷빈에 설치해보도록 하겠습니다. 도구-플러그인<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmpD1ox9eC_EkISuTlk4irZebM0zR-L_98gMqywNmw8iByEluwV0y7dDms4CKqYE5c0FkkY4JKXzNfXN3PRd7QJ-BEgdC6_U66ESvSPw80k44jjqsj2K02VRCHuiiGBlMIfa9OX4_9myEz/s1600/nb69_plugin_32.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 314px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489669841980174642" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmpD1ox9eC_EkISuTlk4irZebM0zR-L_98gMqywNmw8iByEluwV0y7dDms4CKqYE5c0FkkY4JKXzNfXN3PRd7QJ-BEgdC6_U66ESvSPw80k44jjqsj2K02VRCHuiiGBlMIfa9OX4_9myEz/s400/nb69_plugin_32.jpg" /></a> 다운로드 탭을 선택하고 플러그인 추가 버튼을 눌러 GoogleToolbar 프로젝트의 build 폴더 안에 XX.nbm 을 선택하여 엽니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSogSsTPapS_c6Whdzjw8AVMYYHilZBFqDpXOtGNcxBcI0gZjBgJM6l8LEUQd9rar1-T-7q1M_A3FIN3-tgcgky9WBp_FYy5-3R_N_1k9tB2Mqv-gMzFHbjcCXD8dtZj0LrNEGKlnTb962/s1600/nb69_plugin_33.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 241px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489669836424059266" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSogSsTPapS_c6Whdzjw8AVMYYHilZBFqDpXOtGNcxBcI0gZjBgJM6l8LEUQd9rar1-T-7q1M_A3FIN3-tgcgky9WBp_FYy5-3R_N_1k9tB2Mqv-gMzFHbjcCXD8dtZj0LrNEGKlnTb962/s400/nb69_plugin_33.jpg" /></a> 플러그인 내용이 표시됩니다. 확인후 왼쪽 아래 설치 버튼을 눌러 진행합니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilc4E_-Z4VjA5sJxqJMxw2d-WEqexQTOSsqc0IDfJ7mzMDYVGTW6hSnXaxsqji4XNk_1EskxiAySZhI2K_FAogfUWXzUw1J_7VuoDSn38P1zpPlSE9BDUAsDGbybvxGgvokrnADQoX6eTX/s1600/nb69_plugin_34.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 322px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489669826197544786" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilc4E_-Z4VjA5sJxqJMxw2d-WEqexQTOSsqc0IDfJ7mzMDYVGTW6hSnXaxsqji4XNk_1EskxiAySZhI2K_FAogfUWXzUw1J_7VuoDSn38P1zpPlSE9BDUAsDGbybvxGgvokrnADQoX6eTX/s400/nb69_plugin_34.jpg" /></a> 설치 프로그램이 요구하는 대로 진행합니다. - 다음<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiC-gbMIB-oumZ0_-vaDUJNuyu2DH9iv1cZsqaQ308o53JUl5zfD0slPgkBOxZ-qBP3IlE4sDnXfx5HigPoHAobfXTR2dVvKsoFjOK2B-dVFV87K9Z30RfQWiZ521JAEVMnkNJ9VtruLdOs/s1600/nb69_plugin_35.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 357px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489669825199140018" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiC-gbMIB-oumZ0_-vaDUJNuyu2DH9iv1cZsqaQ308o53JUl5zfD0slPgkBOxZ-qBP3IlE4sDnXfx5HigPoHAobfXTR2dVvKsoFjOK2B-dVFV87K9Z30RfQWiZ521JAEVMnkNJ9VtruLdOs/s400/nb69_plugin_35.jpg" /></a> 라이센스에 동의(체크)후 설치 클릭<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0XAOPXcqeGoSchPRm88MZWfIn2PKJKS3C-9m7Y_j5lD8irq7xTJPSGkxmU05DKWKZmPO87EWoXk0kIyXDCzTZv3IXuW1cqWD2h3DIcIEDvK1tTViIeSUrY0azdc0G3ukIEiKxLw_EgpB5/s1600/nb69_plugin_36.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 357px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489670827978102434" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0XAOPXcqeGoSchPRm88MZWfIn2PKJKS3C-9m7Y_j5lD8irq7xTJPSGkxmU05DKWKZmPO87EWoXk0kIyXDCzTZv3IXuW1cqWD2h3DIcIEDvK1tTViIeSUrY0azdc0G3ukIEiKxLw_EgpB5/s400/nb69_plugin_36.jpg" /></a> 서명 경고 무시하고 계속<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpcDjsyo8A9xm5fp7cUiNR54H2xjxvMZSHdUSBYefhJuVdVNkNYSy8Yy1mUN18YHehvQtXBzekdYYwgHiaN8t_A3O_NnGNr_qTOlFEGIybaTFNQAWTc5LSrypgLxhGOGk0mFbFQM-p9A5U/s1600/nb69_plugin_37.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 360px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489670821524156706" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpcDjsyo8A9xm5fp7cUiNR54H2xjxvMZSHdUSBYefhJuVdVNkNYSy8Yy1mUN18YHehvQtXBzekdYYwgHiaN8t_A3O_NnGNr_qTOlFEGIybaTFNQAWTc5LSrypgLxhGOGk0mFbFQM-p9A5U/s400/nb69_plugin_37.jpg" /></a> 설치가 완료되면 마침<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3f_8ZuIPyNQzfv0MCOJgNAvO90jCFOCUardffHkED4rShnt4s90FWSXqWv-gFKW2KYhLP6v8T8Xw3_C3EIC-rJIboXSEpbnPqT2SG3wJHd0WLvpGFGzEKSeEgEiD8fVP1Cdq9VnDG9uXf/s1600/nb69_plugin_38.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 357px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489670810343590306" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3f_8ZuIPyNQzfv0MCOJgNAvO90jCFOCUardffHkED4rShnt4s90FWSXqWv-gFKW2KYhLP6v8T8Xw3_C3EIC-rJIboXSEpbnPqT2SG3wJHd0WLvpGFGzEKSeEgEiD8fVP1Cdq9VnDG9uXf/s400/nb69_plugin_38.jpg" /></a> 이제 좀전에 만든 모듈이 플러그인 설치로 왼쪽 상단에 보면 구글서치툴바가 설치된 걸 확인할 수 있습니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhc7UWBg4c4EzB4MkMTYYYiP2knf4TJJ4PU3G_kOPy4JZgfKXe9L3vvG2fR3GW0kpIRxuDW9DKwr2rFzqYhgLlQn3lcSkQ93gOo0FLM8AADF5_corFBsfEMJCh11ecVifUB-bVBneDMJcHh/s1600/nb69_plugin_39.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 314px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489670809321979234" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhc7UWBg4c4EzB4MkMTYYYiP2knf4TJJ4PU3G_kOPy4JZgfKXe9L3vvG2fR3GW0kpIRxuDW9DKwr2rFzqYhgLlQn3lcSkQ93gOo0FLM8AADF5_corFBsfEMJCh11ecVifUB-bVBneDMJcHh/s400/nb69_plugin_39.jpg" /></a> 팁. 설치한 모듈을 해제 및 비활성화하려면 도구-플러그인-설치됨(installed)에서 해당 플러그인을 찾아서 해제나 비활성하면 됩니다. <br />이상이 간단히 넷빈 모듈 프로젝트를 만들어 본 예제입니다. <br />앞으로 다양한 넷빈 모듈 프로젝트에 대해 올려보겠습니다. <br />특히나 넷빈 6.9에는 이 대목을 적극 홍보하는 거 보면 넷빈의 플러그인 개발을 유도하는 듯 하는 느낌이..ㅋㅋ<br />아무튼 수고하셨습니다. ^^강여사(J.Y.Kang)http://www.blogger.com/profile/17450510931308610527noreply@blogger.com0tag:blogger.com,1999:blog-6811062799606447528.post-66128378693447654482010-07-02T04:38:00.000-07:002010-07-03T06:39:48.773-07:00넷빈(NetBeans)6.8에서 Wicket 사용하기-01-설치 및 샘플프로그램이번에는 Wicket 프레임워크를 사용하는 방법에 대해 알아 보고자 합니다.<br /><br />Wicket은 Apache 프로젝트로, 마크업/로직 분리, POJO 데이터 모델,그리고 XML 을 최소로 함으로써,<br />웹 어플리케이션을 보다 단순화, 계층화 시켜주는 프레임워크입니다.<br /><br />Wicket은 개념적으로 JavaServer Faces 나 Tapestry 와 비슷하게 자바 프로그래밍 언어를 위해 경량급의 콤포넌트 기반 웹 어플리케이션 프레임워크입니다.<br /><br />각 컴포넌트들은 하나의 자바 클래스와 하나의 HTML 파일로 구성됩니다. 이러한 컴포넌트 기반 방식의 Wicket은 스트러츠, 스트링과 같은 XML 구성 파일에 의존하는 프레임워크와 달리, XML 구성 파일 대신 홈페이지 식별과 같은 어플리케이션-범위 설정을 위한 자바 클래스를 사용합니다.<br /><br />웹 어플리케이션의 각 위젯은 하나의 자바 클래스에서 만들어지고 HTML 페이지에서 렌더됩니다. 따라서 자바 클래스와 HTML 페이지는 반드시 같은 이름을 가지고,또 같은 소스 구조에 존재해야 합니다.<br /><br />현재 Apacke Wicket 은 1.4.9 가 릴리즈 되어 있고,(<a href="http://www.apache.org/dyn/closer.cgi/wicket/1.4.9">http://www.apache.org/dyn/closer.cgi/wicket/1.4.9</a> ) 새 버전은 메이븐 폼(pom)에 다음과 같이 업그레이드 해서 사용될 수도 있습니다.<br />================================================<br /><dependency><br /><groupId>org.apache.wicket</groupId><br /><artifactId>wicket</artifactId><br /><version>1.4.9</version><br /></dependency><br />================================================<br />보다 자세한 내용은 아파치 Wicket 홈페이지에서 확인하시고, 이제 넷빈에서 Wicket을 사용하는 방법에 대해 본격적으로 알아 보겠습니다.<br /><br />현재(이글 쓰는 시점)로 Wicket 플러그인이 넷빈 6.9에서는 정상 설치가 안되고 있습니다.<br />해서 넷빈 6.7에서 만들어지고 6.8까지 설치 가능한 플러그인으로 진행, 제목에서도 명시했다시피 넷빈 6.8에서 진행합니다.<br /><br />본 게시물의 작업환경은 다음과 같습니다.<br />넷빈 6.8 (또는 6.7)<br />JDK 6 (저는 6up20 입니다. 그러나 JDK5에서도 돌아갑니다)<br />글래스피시 2.1 이상 (넷빈 6.8에 기본 설치되는 글래스피시로 작업했습니다) 혹은 톰캣 6.x<br />Wicket 플러그인 (<a href="http://plugins.netbeans.org/PluginPortal/faces/PluginDetailPage.jsp?pluginid=3586">최신버전다운로드</a> )<br /><br />우선 바로 위 플러그인 링크에서 최신 버전을 다운로드 받습니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjF10lpqZ0OGZnyS8U0CcziwMLgnCmw_44cqPB-YRz0qFC0YyNXADcDNLqrQBgXlk021xhvJHciaBguNR5KUh7HdyCgThQu1MgpTW8rDRle7rD6dYNBcqc1boJzA-RcBAhnbSdnFugC5Nu/s1600/nb69_wicket_01.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 396px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489277786849911458" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjF10lpqZ0OGZnyS8U0CcziwMLgnCmw_44cqPB-YRz0qFC0YyNXADcDNLqrQBgXlk021xhvJHciaBguNR5KUh7HdyCgThQu1MgpTW8rDRle7rD6dYNBcqc1boJzA-RcBAhnbSdnFugC5Nu/s400/nb69_wicket_01.jpg" /></a> 플러그인 설치를 위해 도구-플러그인 선택<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEho7TduiYXRYKhjMMFig4o2dZa3T8W6jfP5ISljdtRpJE5GPhB2JRtsowY-JO6C0Gfr3zYAW5VjskMIz3RETUpMGN4VeNb9HaI22gHtcqumzQxrTqRtIoWSBnsqVKR37395sA4c2JjCD8oO/s1600/nb69_wicket_02.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 321px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489277784077227106" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEho7TduiYXRYKhjMMFig4o2dZa3T8W6jfP5ISljdtRpJE5GPhB2JRtsowY-JO6C0Gfr3zYAW5VjskMIz3RETUpMGN4VeNb9HaI22gHtcqumzQxrTqRtIoWSBnsqVKR37395sA4c2JjCD8oO/s400/nb69_wicket_02.jpg" /></a> 다운로드 받은 플러그인 설치를 위해서는 다운로드 탭을 누르고 아래 플러그인 추가 버튼을 누릅니다.<br />그럼 팝업창이 뜨고 위에서 다운로드 받은 파일(3개)을 모두 선택하여 열기를 누릅니다<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdy9S2RmdZkipOr2eZ-MeHJXJ59aeR69eeVHWN4igSXUime8QKOvqVUrghwnF_R_fZ8uS_rnfSYXV6N39xZT47CVlxlJ3wUU7m8SvMWGQe0S4GdQzM0aUEQP23Fa9g-LlSF77m7Mn-bGtY/s1600/nb69_wicket_03.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 321px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489277776980632370" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdy9S2RmdZkipOr2eZ-MeHJXJ59aeR69eeVHWN4igSXUime8QKOvqVUrghwnF_R_fZ8uS_rnfSYXV6N39xZT47CVlxlJ3wUU7m8SvMWGQe0S4GdQzM0aUEQP23Fa9g-LlSF77m7Mn-bGtY/s400/nb69_wicket_03.jpg" /></a> 3개의 Wicket 모듈이 올라옵니다. 왼쪽 아래 설치를 눌러 설치를 진행합니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOVnzTFFgobxR_v7GTYqzBT3K_5XOedjnPS03EtXXy3aFMk0d8GmLVPg5SSVC6Bj41I5irvq4TPIYwbnjNvW8b0t0GThXEiv2F-MEae6pKeJ7M2788NK058jruv8foebfdlYLQCBROT9cB/s1600/nb69_wicket_04.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 267px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489277769243279090" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOVnzTFFgobxR_v7GTYqzBT3K_5XOedjnPS03EtXXy3aFMk0d8GmLVPg5SSVC6Bj41I5irvq4TPIYwbnjNvW8b0t0GThXEiv2F-MEae6pKeJ7M2788NK058jruv8foebfdlYLQCBROT9cB/s400/nb69_wicket_04.jpg" /></a> 설치 진행은 지시사항에 따라 계속합니다. 다음<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYxzPL8nY8v4o1A0C6usVqYiDuja4NDBGhHAMgpmZSc1dwwi6JoRTR4QcO_PSqKOKRQCqAxOUTy-tT1Rh9OGOVJBQGYLnkMHP46pch30WKDJKlurHmQQP8dn9M1aCAJY-nAMRTHVQzq8G9/s1600/nb69_wicket_05.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 357px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489277764260029266" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYxzPL8nY8v4o1A0C6usVqYiDuja4NDBGhHAMgpmZSc1dwwi6JoRTR4QcO_PSqKOKRQCqAxOUTy-tT1Rh9OGOVJBQGYLnkMHP46pch30WKDJKlurHmQQP8dn9M1aCAJY-nAMRTHVQzq8G9/s400/nb69_wicket_05.jpg" /></a> 동의를 체크하고 설치<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhw_jVMMWg3wNvIuAxOTqnhGFzrURcYLmp5UR7pMocR4WLDErX8DoBJxH_4gwy8uZbgLlG_eh3-2csq9bm2-9ZZPd6OBtx46iNOu-ti6L0cR2CKz_1Y_Iw4T3o0_VDTJhH4pLGmdV5rIsaf/s1600/nb69_wicket_06.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 357px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489278868108661506" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhw_jVMMWg3wNvIuAxOTqnhGFzrURcYLmp5UR7pMocR4WLDErX8DoBJxH_4gwy8uZbgLlG_eh3-2csq9bm2-9ZZPd6OBtx46iNOu-ti6L0cR2CKz_1Y_Iw4T3o0_VDTJhH4pLGmdV5rIsaf/s400/nb69_wicket_06.jpg" /></a> 서명경고가 뜨지만 무시하고 계속<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMtXJoFKguupVDnS4X_UTgjn6TrFTcQlyUAq6QQdRUk2kwtXQuY9vOuGs8ftRuTBs6c998fnyoSLfzIlVnURII_OlptAvPenHCzjtDuvJ1JybSxW58e9TgEfKECUJeeyczFqG43WxQafth/s1600/nb69_wicket_07.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 360px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489278862352975170" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMtXJoFKguupVDnS4X_UTgjn6TrFTcQlyUAq6QQdRUk2kwtXQuY9vOuGs8ftRuTBs6c998fnyoSLfzIlVnURII_OlptAvPenHCzjtDuvJ1JybSxW58e9TgEfKECUJeeyczFqG43WxQafth/s400/nb69_wicket_07.jpg" /></a> IDE 재시작 - 마침<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiopXDSPsNWGudQKXgbMxRWSKPwhOrq8MoRUB0baQ8WF6CdyO1al8Q0Dx8hBY8XW-Q8KGIMUlCxXZqUCH8SamgRj_Qe_2j_fb2BGJTd_4gnrh4vzXgJgMbqR72lXOEg61xpmyUEOZSuuMeJ/s1600/nb69_wicket_08.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 357px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489278856362916690" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiopXDSPsNWGudQKXgbMxRWSKPwhOrq8MoRUB0baQ8WF6CdyO1al8Q0Dx8hBY8XW-Q8KGIMUlCxXZqUCH8SamgRj_Qe_2j_fb2BGJTd_4gnrh4vzXgJgMbqR72lXOEg61xpmyUEOZSuuMeJ/s400/nb69_wicket_08.jpg" /></a> IDE가 다시 시작되면 이제 컴포넌트 기반 Wicket 프로그램을 만듭니다. 프로젝트 창에서 마우스 오른쪽 클릭, 새 프로젝트<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_UHBtfWK4kNpDhzFUy1nxG_wOU8rTrJKNwZD0SvYoR6JjglcL84FG1xA9IyDgxC9GkX_wzr3E6olUTZzDwfb2GX4baH1HYM0fuxawCxlKDK69w-MD7PNF6PDutY32Ov6HjVw1JN0foijQ/s1600/nb69_wicket_09.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 321px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489278835759182002" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_UHBtfWK4kNpDhzFUy1nxG_wOU8rTrJKNwZD0SvYoR6JjglcL84FG1xA9IyDgxC9GkX_wzr3E6olUTZzDwfb2GX4baH1HYM0fuxawCxlKDK69w-MD7PNF6PDutY32Ov6HjVw1JN0foijQ/s400/nb69_wicket_09.jpg" /></a> 카테고리에서 Java Web, 프로젝트는 Web Application - 다음<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidl0gQd5DGLf3Ak1VHIloZf-aa8DlWDJ-qpmgG3R2VMc0MvKKcmiLH3vD55ksqj7RUwq7aUzh6fL2vZNth3LryP6gdYBUKwveZHfi4_fPZg4E0m4UK41t1xQxixXXEXwBzlicHZIH6Hk8e/s1600/nb69_wicket_10.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489278826087643250" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidl0gQd5DGLf3Ak1VHIloZf-aa8DlWDJ-qpmgG3R2VMc0MvKKcmiLH3vD55ksqj7RUwq7aUzh6fL2vZNth3LryP6gdYBUKwveZHfi4_fPZg4E0m4UK41t1xQxixXXEXwBzlicHZIH6Hk8e/s400/nb69_wicket_10.jpg" /></a> 프로젝트 이름은 HelloWicket , 경로는 적당히 - 다음<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEht2XrPE64nMDCib1i7Q8uHMxekcLNCujH2OV3fAxjeCkone22mePa1p7K-n0I62we8CumUESjJnxR95n7ZzTsn9aFBfXtUIZCC8gudsL1o0CzBdgKFlusoGLNCdfnd8jAnUSYIYoWY40gj/s1600/nb69_wicket_11.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489280149325198066" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEht2XrPE64nMDCib1i7Q8uHMxekcLNCujH2OV3fAxjeCkone22mePa1p7K-n0I62we8CumUESjJnxR95n7ZzTsn9aFBfXtUIZCC8gudsL1o0CzBdgKFlusoGLNCdfnd8jAnUSYIYoWY40gj/s400/nb69_wicket_11.jpg" /></a> 서버설정인데, 저는 그냥 기본설정으로 진행했습니다.<br />사실 Wicket 은 J2EE 1.4 , EE5 모두 지원하므로 어느 버전이나 그리고 톰캣이건 글래스피시건 아무거나 하셔도 됩니다. - 다음<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitjQHgVyGCxdS5rLy2GLGZLOeylMo_3bCBZWHVfR9rLETFj2JUV2P0pjjm2HvcepaEDMe4W1grnOSDZrqsQGI2wGdWVQ8gR63oBhwl23BDSPUWWbAq3OxkVUnZQX4TY6MJmFRPl0pOYM-O/s1600/nb69_wicket_12.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 266px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489280143799716946" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitjQHgVyGCxdS5rLy2GLGZLOeylMo_3bCBZWHVfR9rLETFj2JUV2P0pjjm2HvcepaEDMe4W1grnOSDZrqsQGI2wGdWVQ8gR63oBhwl23BDSPUWWbAq3OxkVUnZQX4TY6MJmFRPl0pOYM-O/s400/nb69_wicket_12.jpg" /></a> 프레임워크 설정인데 Wicket 1.4 를 체크합니다.<br />그럼 Wicket 1.4 구성 내용이 그림과 같이 설정됩니다.<br />참고로 Wicket Filter name 은 web.xml 에 정의된 필터 이름이고,<br />Wicket URL Pattern 은 web.xml 에 URL 패턴으로 정의된 서블릿 매핑이고,<br />Wicket Application Class 는 홈페이지처럼, 어플리케이션-범위 설정이 있는 클래스 이름을 지정합니다.<br />Wicket Home Page 는 홈페이지 이름을 지정하는데, 해당 이름의 파일은 XXX.java 와 XXX.html 2개로 구성되게 됩니다.<br />Main Package 는 위 사항들이 들어갈 자바 패키지 설정입니다 - 마침<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJmh1sbsgHLphUYh5N0oYMedThoCORe7KdsgDUU2O0zcvUyZOY7iMgMe3WEfjJm1htC3iz7BmXwyS2j1tPuGztFJ24zffQkv0etd-iphG2oMyLgVBCtbmdlXGq7zRPKgnPtyR1PxerEGaX/s1600/nb69_wicket_13.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 266px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489280137550785602" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJmh1sbsgHLphUYh5N0oYMedThoCORe7KdsgDUU2O0zcvUyZOY7iMgMe3WEfjJm1htC3iz7BmXwyS2j1tPuGztFJ24zffQkv0etd-iphG2oMyLgVBCtbmdlXGq7zRPKgnPtyR1PxerEGaX/s400/nb69_wicket_13.jpg" /></a> IDE가 자동으로 만들어주는 파일들을 모두 자세히 살펴 보도록 합니다. 우선 HomePage.html 이 편집기 창에 제시됩니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEia3oQQ2LAeQIli5K040742qnsL75MRxRHel7izJylNkXDUIo4sERpUnddg1rR8AT8vU19I2J0tCW2ZWM93ldTrAs-6uIO7e6Resz49NctJzJ4yJu5tf-e4azeYh8EzOlXweVIKs7s6Wnh5/s1600/nb69_wicket_14.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 321px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489280132193751602" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEia3oQQ2LAeQIli5K040742qnsL75MRxRHel7izJylNkXDUIo4sERpUnddg1rR8AT8vU19I2J0tCW2ZWM93ldTrAs-6uIO7e6Resz49NctJzJ4yJu5tf-e4azeYh8EzOlXweVIKs7s6Wnh5/s400/nb69_wicket_14.jpg" /></a> 이 Wicket 이 읽혀지기 위해서는 Wicket 의 유일한 xml 관련 파일인 web.xml 에 해당 설정이 있습니다. 프로젝트의 web.xml 을 열어 다음 내용을 확인합니다<br />-------------------------------------------------------<br /><filter><br /><filter-name>WicketApplication</filter-name><br /><filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class><br /><init-param><br /><param-name>applicationClassName</param-name><br /><param-value>com.myapp.wicket.Application</param-value><br /></init-param><br /><init-param><br /><param-name>debug</param-name><br /><param-value>2</param-value><br /></init-param><br /></filter><br /><filter-mapping><br /><filter-name>WicketApplication</filter-name><br /><url-pattern>/wicket/*</url-pattern><br /></filter-mapping><br />-------------------------------------------------------<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3DMc7dErU-k8kJSOC5kfEmBi9mj3Z6NGSNJfMaKn2-sL2fKD93ciHgo07gOZAE_g0jzoeRyKpG6B1FXioYWmNfSpP-eGlg8N8gLM-H9tXuSBYBllx_2ecs8OfBvVCoaUqT9nhWMwooHAf/s1600/nb69_wicket_15.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 321px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489280116320222018" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3DMc7dErU-k8kJSOC5kfEmBi9mj3Z6NGSNJfMaKn2-sL2fKD93ciHgo07gOZAE_g0jzoeRyKpG6B1FXioYWmNfSpP-eGlg8N8gLM-H9tXuSBYBllx_2ecs8OfBvVCoaUqT9nhWMwooHAf/s400/nb69_wicket_15.jpg" /></a> 위의 XML 에 보면 Wicket 필터가 com.myapp.wicket.Applciation 클래스를 파라미터 값으로 초기화하도록 되어 있습니다. 필터 매핑은 /wicket/* 이구요.<br />즉 이 자바 파일, Application.java 에 스트러츠의 struts-config.xml 나 JSF의 faces-config.xml 처럼 어플리케이션-wide 설정이 제공되게 됩니다.<br />파일을 보면 getHomePage() 메소드가 정의되어 있는데, 이 메소드가 어플리케이션-범위의 최고단위(필수)입니다. 간단히 말하자면 어플리케이션이 배포될 때 홈페이지(즉, 최초 페이지)를 지정하는 거죠.<br />그럼 다음으로 여기 return 되는 HomePage.java를 열어 봅시다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPlf-d8rRAJ8tY83pZpaxIXgiEQ86vLCQTkbFxmhGPm8qimPsdvjOW2uuS5N7MjrOSyzzGx7HLRN77UKQzQuZ6eGJLzD5KyRDOWiGsYzNahY5LPaYiPnOnGuIUnGMN9lH_ZpUhuf6bfHL7/s1600/nb69_wicket_16.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 321px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489285755864975634" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPlf-d8rRAJ8tY83pZpaxIXgiEQ86vLCQTkbFxmhGPm8qimPsdvjOW2uuS5N7MjrOSyzzGx7HLRN77UKQzQuZ6eGJLzD5KyRDOWiGsYzNahY5LPaYiPnOnGuIUnGMN9lH_ZpUhuf6bfHL7/s400/nb69_wicket_16.jpg" /></a> HomePage.java 는 현재 비어 있습니다(기본).<br />나중에 이 파일의 생성자에 컴포넌트들을 추가하게 됩니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5EPSioveUWccwYh0d4OF5_12NsiMetwWT58gfIMqVDCiGBZ3nEc4redhSXa8n_Ee5rDEh88lF2Pt0rsvqO0drKt9QhCjCGBkzsgtHffigjole8MhGi2JpUxz9Ilzslr04agU0aYIWRQgv/s1600/nb69_wicket_17.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 321px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489285744434636306" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5EPSioveUWccwYh0d4OF5_12NsiMetwWT58gfIMqVDCiGBZ3nEc4redhSXa8n_Ee5rDEh88lF2Pt0rsvqO0drKt9QhCjCGBkzsgtHffigjole8MhGi2JpUxz9Ilzslr04agU0aYIWRQgv/s400/nb69_wicket_17.jpg" /></a>HomePage.java 와 같은 소스 구조에 같은 이름,즉 HomePage.html 파일에서 Wicket 위젯의 렌더링을 합니다.<br />HomePage.java는 BasePage를 상속받는데, HomePage.html 에서 wicket:id 속성은, 자바 파일에 의해 뭔가 만들어졌다는 걸 알려주는 표시자 입니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRtUuJ1nsVjiQwsHg8yQyL_H_O-m2g3p-daOb2x_vX1v9O79_1iY6zg8sHEjq3lenvXUTLBW3bXGDpAn8CLw4BXws8AoegBME0bjiuvUMpp4Jygu54mcY9_AexdTA0K8XsANEFoFDxdg0c/s1600/nb69_wicket_18.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 321px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489285743179590194" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRtUuJ1nsVjiQwsHg8yQyL_H_O-m2g3p-daOb2x_vX1v9O79_1iY6zg8sHEjq3lenvXUTLBW3bXGDpAn8CLw4BXws8AoegBME0bjiuvUMpp4Jygu54mcY9_AexdTA0K8XsANEFoFDxdg0c/s400/nb69_wicket_18.jpg" /></a>IDE에 의해 자동 생성된 CSS는 BasePage.java 에 참조(StyleSheetReference)되어 있습니다.<br />여기에 보면 아까 wicket:id 로 설정된 "mainNavigation" 이 헤더 패널로, 모든 웹 페이지에 동일한 헤더가 추가됨을 알 수 있습니다. 그럼 다음으로 HeaderPagel.java 에 대해 살펴봅시다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVgxOva9BCl2EP0cnCpBkFX8Um5j2r_sDfl-phUISEPipsKG9xln4e5ORXwCCayHPbvJh1jldGl6-38n63cI6YpKNJPWefUHtiDqzFq8Ng1vqNKin_tsSj2I6CONWTNTVTRWus2r4VFtlm/s1600/nb69_wicket_19.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 321px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489285736155446754" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVgxOva9BCl2EP0cnCpBkFX8Um5j2r_sDfl-phUISEPipsKG9xln4e5ORXwCCayHPbvJh1jldGl6-38n63cI6YpKNJPWefUHtiDqzFq8Ng1vqNKin_tsSj2I6CONWTNTVTRWus2r4VFtlm/s400/nb69_wicket_19.jpg" /></a>HeaderPanel.java 를 열면 다음과 같이 되어 있습니다. 여기에 보면 Wicket Label 위젯이 추가되어 있습니다.<br />이렇게 자바에서 만들어진 위젯은, HTML 사이드에서 렌더됩니다. HeaderPanel.java 짝인 HeaderPanel.html 에 해당 내용이 나타나게 되는 거죠.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnh5J8FcaOkvrYuvsDML94aYF3zEu8lsf1bmLoY5DIc46pc6SlrgbP17QdK84X2Yx9RThgCUDzoGksfuohVnhYtKkRZ-0-cw_cSK_kTPHkBI5zo4T3jmDHqhb9fK6ZhKzAQDmyD7sDgt3s/s1600/nb69_wicket_20.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 321px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489285723939131826" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnh5J8FcaOkvrYuvsDML94aYF3zEu8lsf1bmLoY5DIc46pc6SlrgbP17QdK84X2Yx9RThgCUDzoGksfuohVnhYtKkRZ-0-cw_cSK_kTPHkBI5zo4T3jmDHqhb9fK6ZhKzAQDmyD7sDgt3s/s400/nb69_wicket_20.jpg" /></a>그럼 제시된 기본 내용을 조금 바꿔 보겠습니다. 기본으로 작성된 exampleTitle 대신 아래 내용으로 고칩니다.<br />=================================================<br />add(new Label("exampleTitle", <strong>"My Very First Component Based Application"</strong>));<br />=================================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8pF9sAboTbnTTwWSar8K2SN8EBNAaJW9ePnVf_4N_ZpR685Iy1-on6Fe7eVFqQoAsCe8FrEVg8AelntqvEQRvwtvXfRNZR5wgftwK5Ga3Ad7wz7PtpCgNEor-qBwmhSkCQOWPaNvbtaa-/s1600/nb69_wicket_21.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 321px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489306067421870754" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8pF9sAboTbnTTwWSar8K2SN8EBNAaJW9ePnVf_4N_ZpR685Iy1-on6Fe7eVFqQoAsCe8FrEVg8AelntqvEQRvwtvXfRNZR5wgftwK5Ga3Ad7wz7PtpCgNEor-qBwmhSkCQOWPaNvbtaa-/s400/nb69_wicket_21.jpg" /></a> HeaderPanel.html 을 엽니다. 안의 내용을 보면 웹페이지의 HTML 로 렌더될 위젯이 지정되어 있음을 알 수 있습니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhv98_Kgu9ShhR5E81gqPxpQs-FR6L3n1KCiv7ACs92T_6xCCnQFqwVrpZOwgZ3pfZR0azVs0ypopNnwa9ZT7rg2wiWoUPJReI9YLDDmuN5tCIxTY9G3hm_R4XctTDsZ0rMshAfgllVn8ou/s1600/nb69_wicket_22.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 321px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489306052500494018" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhv98_Kgu9ShhR5E81gqPxpQs-FR6L3n1KCiv7ACs92T_6xCCnQFqwVrpZOwgZ3pfZR0azVs0ypopNnwa9ZT7rg2wiWoUPJReI9YLDDmuN5tCIxTY9G3hm_R4XctTDsZ0rMshAfgllVn8ou/s400/nb69_wicket_22.jpg" /></a>팁(Tip): 여기 <span wicket:id="exampleTitle"... 의 exampleTitle에 Ctrl 키를 누른채 마우스를 대면 하이퍼 링크 아이콘을 바뀝니다.(파란색으로), 이걸 클릭하면 해당 자바(HeaderPanel.java)로 페이지가 이동되고, 반대로 소스코드에서 HTML 페이지로 이동하려면 Alt+왼쪽화살표를 누르면 빠르게 이동할 수 있습니다 ^^;<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioS9Z9hYscBY_4OD_lhSiKqMmx107_P-xdwopSiGnRs5Uw1VEeE19RW8dnCEaNQjmOKYzyjlbGcTsCIpb6TidOPpJlYrxAgg0AML9gj9jQmREX6s8UlMQtky9F2j1m_mKsJGBsSrpefuQ3/s1600/nb69_wicket_23.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 321px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489306043810311506" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioS9Z9hYscBY_4OD_lhSiKqMmx107_P-xdwopSiGnRs5Uw1VEeE19RW8dnCEaNQjmOKYzyjlbGcTsCIpb6TidOPpJlYrxAgg0AML9gj9jQmREX6s8UlMQtky9F2j1m_mKsJGBsSrpefuQ3/s400/nb69_wicket_23.jpg" /></a> 파일을 저장하고, 프로젝트를 실행합니다. 프로젝트에서 마우스 오른쪽 클릭-실행<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEid7uMZk_vKsqBU8SjRubc6CpxbfZ4fkWvgX829_Q2RRJLCd5bJIVE7uHQCg4GGEA7oNUqNwx62eCyJpCaCvI0dKn_93kO1BV2N60VKsmGmDkD7fe-SxlUhXU25chWzJxmkp3scsveCGb2Y/s1600/nb69_wicket_24.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 321px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489306034276782162" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEid7uMZk_vKsqBU8SjRubc6CpxbfZ4fkWvgX829_Q2RRJLCd5bJIVE7uHQCg4GGEA7oNUqNwx62eCyJpCaCvI0dKn_93kO1BV2N60VKsmGmDkD7fe-SxlUhXU25chWzJxmkp3scsveCGb2Y/s400/nb69_wicket_24.jpg" /></a> 브라우저에 다음과 같은 내용이 표시됩니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBS8vk6r0iAVF3ABCNzV-VcCo2I1F1i3tEuu5WEbGcCpJ6xCZbulfO5PctnNlz9lfP8Pb7qj_8D-p0yqhn1C9FzROhxISOqpipZeHHpxhC5iaHQxjw464Wm_791gGiBlgmce2g_9Pk5wSK/s1600/nb69_wicket_25.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 184px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489306025566444450" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBS8vk6r0iAVF3ABCNzV-VcCo2I1F1i3tEuu5WEbGcCpJ6xCZbulfO5PctnNlz9lfP8Pb7qj_8D-p0yqhn1C9FzROhxISOqpipZeHHpxhC5iaHQxjw464Wm_791gGiBlgmce2g_9Pk5wSK/s400/nb69_wicket_25.jpg" /></a>********************************************************<br />이제 이번에는 여기에 새 위젯을 추가해보도록 하겠습니다.<br />하나의 위젯은 하나의 자바파일과 같은 이름, 같은 경로에 HTML 파일로 구성됩니다.<br />자바에서 위젯을 만들고, HTML 에서 위젯을 렌더합니다.<br />위의 팁에서 살펴봤듯이 이 둘 사이는 하이퍼링크 및 단축키 등으로 둘 사이를 빠르게 이동할 수 있구요 ^^;<br />HomePage.html 을 열어 다음 내용(굵은 글씨)를 추가합니다.<br />================================================================<br /><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><br /><br /><html><br /><head><br /><title></title><br /><link wicket:id='stylesheet'/><br /></head><br /><body><br /><span wicket:id='mainNavigation'/><br /><strong><span wicket:id="message1">this text will be replaced</span></strong><br /></body><br /></html><br />================================================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZ7CKnC3s7vkAhvYCw-oRpb1fArqR1pZ196trFa2zJ8DWIcCfuSDvfScwPfs0UwShzFYkGkeSdudnlu1YkW5n4TU-WCyv2ir9gNSrkgusl9I5ELRurWpS5fO0XyjRxQVeqSpcy1pEpv4Qd/s1600/nb69_wicket_26.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 321px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489309394701671122" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZ7CKnC3s7vkAhvYCw-oRpb1fArqR1pZ196trFa2zJ8DWIcCfuSDvfScwPfs0UwShzFYkGkeSdudnlu1YkW5n4TU-WCyv2ir9gNSrkgusl9I5ELRurWpS5fO0XyjRxQVeqSpcy1pEpv4Qd/s400/nb69_wicket_26.jpg" /></a> 왼쪽 아래 네비게이터에서 Wicket Tag 목록을 누르면 아래 그림 처럼 태그 개요를 볼 수 있습니다. (3개)<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsXOCglYxdN-piYRh15LNBH-llhkFhRXVqZBtvT4T8KzcmWJolGt0VBPj3NfDurtO5gc4YW6RcsywSNurzmfQahpJRokAilTndUJ0tz8V_VK01CKdrwyPfMdhLZrVbihdu_9cZL9xQvD19/s1600/nb69_wicket_27.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 321px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489309384810548706" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsXOCglYxdN-piYRh15LNBH-llhkFhRXVqZBtvT4T8KzcmWJolGt0VBPj3NfDurtO5gc4YW6RcsywSNurzmfQahpJRokAilTndUJ0tz8V_VK01CKdrwyPfMdhLZrVbihdu_9cZL9xQvD19/s400/nb69_wicket_27.jpg" /></a> 이제 HomePage.java 를 열어, HTML 에 추가한 이름의(message1)의 라벨을 추가합니다. (굵은 글씨 참조)<br />==========================================================<br />public HomePage() {<br /><br />setModel(new CompoundPropertyModel(this));<br /><strong>add(new Label("message1","Hello world!"));</strong><br />}<br /><br />==========================================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgICFL186LC9Rj4fqfpd9OFKps7_0HUYva6HClNFPhBUuniuCZERrpjSTQX9NDOs4CZpK2bWv-lcaxHkWEAB-3tMF0iGVL0__8Oxteb-mDEilSHZjK9ThLzCdkOIDOvxccZl1mHou42lFvU/s1600/nb69_wicket_28.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 321px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489309380430095906" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgICFL186LC9Rj4fqfpd9OFKps7_0HUYva6HClNFPhBUuniuCZERrpjSTQX9NDOs4CZpK2bWv-lcaxHkWEAB-3tMF0iGVL0__8Oxteb-mDEilSHZjK9ThLzCdkOIDOvxccZl1mHou42lFvU/s400/nb69_wicket_28.jpg" /></a> 그럼 새로 추가한 Label 의 임포트 문제때문에 오류가 뜨는데 해결 방법은 왼쪽 아이콘 모양을 누르면 제시안이 나옵니다. 여기서 org.apache.wicket.markup.html.basic.Label 을 임포트(가져오기 추가)를 클릭합니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2oBA4lHT0gp25_E0R8x420x0q79w8_LqgFzpzcWWqLTmiFKaq_NgSgDv8itYj7X_JfxWphSi0ur5KvXay52qDF5Td2tqwewilTtAK_LiZafy724WsuY_GINnmTDw566KxsCsEbwVTS37H/s1600/nb69_wicket_29.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 321px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489309372442066322" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2oBA4lHT0gp25_E0R8x420x0q79w8_LqgFzpzcWWqLTmiFKaq_NgSgDv8itYj7X_JfxWphSi0ur5KvXay52qDF5Td2tqwewilTtAK_LiZafy724WsuY_GINnmTDw566KxsCsEbwVTS37H/s400/nb69_wicket_29.jpg" /></a> 그런 다음 프로젝트를 실행합니다. 프로젝트에서 마우스 오른쪽 클릭 - 실행(run)<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4vb0zYPyHQpjUKeyHpQMhjLHqIsFL2Un2yqZvqTJkrXUkYP0vJTxdf1HDV3ef8uCsOyy97YSZiuErFwqhnddfYKl5dAG6qHG8EXIqvp_LnXLd0q8Av-RbJA7OMB_kN-xLISXC6VMZEAl1/s1600/nb69_wicket_30.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 321px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489309370599486802" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4vb0zYPyHQpjUKeyHpQMhjLHqIsFL2Un2yqZvqTJkrXUkYP0vJTxdf1HDV3ef8uCsOyy97YSZiuErFwqhnddfYKl5dAG6qHG8EXIqvp_LnXLd0q8Av-RbJA7OMB_kN-xLISXC6VMZEAl1/s400/nb69_wicket_30.jpg" /></a>브라우저에 Wicket Label인 Hello world! 가 나타납니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwr5C7fo8tl1yI96zKVjv-l1mHanv1hAOScjdkXj-UmHlYXE-q0nvvs4jwrzrzW6RA_PQNeGdRB-Gf5w5NedFDSkydYFRtZlQ9vn-ADB7mtVLDupr0pcjnwl-mhLuVaPUXsescdXlw-yYl/s1600/nb69_wicket_31.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 184px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489311064317281186" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwr5C7fo8tl1yI96zKVjv-l1mHanv1hAOScjdkXj-UmHlYXE-q0nvvs4jwrzrzW6RA_PQNeGdRB-Gf5w5NedFDSkydYFRtZlQ9vn-ADB7mtVLDupr0pcjnwl-mhLuVaPUXsescdXlw-yYl/s400/nb69_wicket_31.jpg" /></a> 이 Hello world! 에 H2 태그를 적용하려면 HomePage.html 에 span 을 h2 태그로 감싸 프로젝트를 다시 배포하면 됩니다.<br />==================================================<br /><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><br /><br /><html><br /><head><br /><title></title><br /><link wicket:id='stylesheet'/><br /></head><br /><body><br /><span wicket:id='mainNavigation'/><br /><H2><br /><span wicket:id="message1">this text will be replaced</span><br /></H2><br /></body><br /></html><br />=================================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVi_Z3SvdsLvAqFY6RPMM7CV_BHu3KXLHyX4J6cXi-OQ2umq98BOX-iIHFkzvrziASBGFdVXzf2Jo7pEmNa9ctKxRd2c5rSdCGTMk7dMJg4p7JskNtmdTnpdxxvou7OI2p504QQgwiw92i/s1600/nb69_wicket_32.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 321px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489311060365796242" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVi_Z3SvdsLvAqFY6RPMM7CV_BHu3KXLHyX4J6cXi-OQ2umq98BOX-iIHFkzvrziASBGFdVXzf2Jo7pEmNa9ctKxRd2c5rSdCGTMk7dMJg4p7JskNtmdTnpdxxvou7OI2p504QQgwiw92i/s400/nb69_wicket_32.jpg" /></a> 프로젝트를 다시 실행시키면 아래 그림처럼 h2 태그가 적용되었음을 확인할 수 있습니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyYHg7WbBGU8w-NRdAlJMZA-XsihoHhyibM4DYfHW9Obj7hGBxpEHxlgGiLLuVAid0fYdmuCI1A6ptEOPNQutxmhS75dhP27K7NctDqJN9wDV6rkV9UNSG07BsoQf_ohaO1xKvVgTOowd7/s1600/nb69_wicket_33.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 184px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489311050588935794" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyYHg7WbBGU8w-NRdAlJMZA-XsihoHhyibM4DYfHW9Obj7hGBxpEHxlgGiLLuVAid0fYdmuCI1A6ptEOPNQutxmhS75dhP27K7NctDqJN9wDV6rkV9UNSG07BsoQf_ohaO1xKvVgTOowd7/s400/nb69_wicket_33.jpg" /></a>이와 같은 작업방식은 SPAN 태그와 같은 placeholder를 만들어, 이 HTML 파일을 웹 디자이너에게 넘기고, 여러분은 자바 사이드에서 해당 위젯을 독립적으로 만들면 된다는 뜻입니다. 이로써 Wicket의 철저한 "관심사 분리:separation of concerns" 라는 핵심 포커스가 이루어지는 거죠.<br />이번에는 Wicket 의 또다른 강점이라고 할 수 있는 "재사용 가능한 컴포넌트" 컨셉에 대해 살펴 보겠습니다.<br />이 작업에서는 Wicket 패널을 하나 만들어(하나라고는 하지만 해당 자바와 HTML 한 쌍이 만들어집니다) 헤더패널과 짝이 될 수 있는 풋터(FootPanel)을 만들어 헤더처럼 웹 사이트에 재사용될 수 있도록 페이지에 추가해보도록 하겠습니다.<br />우선 작업을 위해 새 파일을 만듭니다. 이때 패키지에서 마우스 오른쪽을 클릭해서 새파일을 만들게 되면 해당 경로가 자동 작업이 되기 때문에 경로 선택에 대한 수고를 덜 수 있죠.<br />패키지(com.myapp.wicket)에서 마우스 오른쪽 클릭 - 새파일<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAuwK-tF3sww7dNdUPBUqyBITFOGI5yaU3qG5vtvVkNGBg6haYdzVm54PIntxjYXRs7vFEyszAic4zR244PQHs4MErLWKvrJdaBVWFdEeylBXUOoH-I99U7rXP0_dhtGSsfWi0snHo0lA_/s1600/nb69_wicket_34.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 321px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489311050047581730" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAuwK-tF3sww7dNdUPBUqyBITFOGI5yaU3qG5vtvVkNGBg6haYdzVm54PIntxjYXRs7vFEyszAic4zR244PQHs4MErLWKvrJdaBVWFdEeylBXUOoH-I99U7rXP0_dhtGSsfWi0snHo0lA_/s400/nb69_wicket_34.jpg" /></a> 카테고리는 web, 파일 유형은 Wicket Panel 선택 - 다음<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhP_PaKPPTXSndqwc4K8xKjSnxkgTPNS_EhC_B4jThHAtMLFSLSy9h3ro5oJp0mQOrk9H3-HZMze4f5pyeyz-HJKiKdVGdJ8bXAvxGnCdS89l9A16JoLiDdEbiWHPu95gqCD2-DeAKAvdNS/s1600/nb69_wicket_35.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489311044627987586" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhP_PaKPPTXSndqwc4K8xKjSnxkgTPNS_EhC_B4jThHAtMLFSLSy9h3ro5oJp0mQOrk9H3-HZMze4f5pyeyz-HJKiKdVGdJ8bXAvxGnCdS89l9A16JoLiDdEbiWHPu95gqCD2-DeAKAvdNS/s400/nb69_wicket_35.jpg" /></a> 파일 이름을 FooterPanel 이라고 줍니다.<br />그럼 아래 그림에서 처럼 2개의 파일(FooterPanel.java 와 FooterPanel.html) 파일이 생성됩니다. - 마침<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijmE_zbaRMLROEyxOjUwcHwyt_XzTvEDAFJtRW7EkpIH7f8pFbL5cz1F8i8EzYxM4E-S4ewaf9Bw9LklKqgrFChKzgLC10umwquNIYdYMYq14eb_UsmKStQw0CsLN2HCeZdeNcjbgdjkGB/s1600/nb69_wicket_36.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489315294834883618" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijmE_zbaRMLROEyxOjUwcHwyt_XzTvEDAFJtRW7EkpIH7f8pFbL5cz1F8i8EzYxM4E-S4ewaf9Bw9LklKqgrFChKzgLC10umwquNIYdYMYq14eb_UsmKStQw0CsLN2HCeZdeNcjbgdjkGB/s400/nb69_wicket_36.jpg" /></a> 우선 FooterPanel.html 파일을 열어 기본 내용을 살펴 봅니다. 기본에는 span 태그가 주석을 감싸여 있는데, 이 주석을 제거 합니다.<br />그리고 FotterPanel.java로 이동하는데, 프로젝트 창에서 해당 파일을 직접 열거나, 아니면 아까 위에 팁에서 처럼 Wicket id 값(title)에서 Ctrl 버튼을 누른채 마우스를 대면 하이퍼링크가 나타나는데 그때 클릭하면 바로 자바 파일로 이동합니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjggPJLQ8ABRf0K1ahURpQG1Q7ia4GKnhhVOIEUUsRr30A3qaRRRnKT-GJOShMVR04zUEy2KBCM7VKCFDDfA5f3Hw53q4vXTFmmIklZ-kE6eeiLCNVjlJRsQ8bfr0WMMtF-PQA4dEIPE2Vp/s1600/nb69_wicket_37.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 321px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489315291262374946" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjggPJLQ8ABRf0K1ahURpQG1Q7ia4GKnhhVOIEUUsRr30A3qaRRRnKT-GJOShMVR04zUEy2KBCM7VKCFDDfA5f3Hw53q4vXTFmmIklZ-kE6eeiLCNVjlJRsQ8bfr0WMMtF-PQA4dEIPE2Vp/s400/nb69_wicket_37.jpg" /></a> FooterPanel.java 파일 기본 내용은 다음과 같습니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7NPQvJfHvor0-E7E_ZL_YrLwpxuBuh8rPUkdJbWfvUhOQI66K7ihHlWkiUkYlhnygiJRxjdWXPO7J81peqcmS7ACV0LUPTi6jILt9owWjkIm4aJtjGUHkzctNEleDXsND5ydJGNM9MePO/s1600/nb69_wicket_38.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 321px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489315282976603618" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7NPQvJfHvor0-E7E_ZL_YrLwpxuBuh8rPUkdJbWfvUhOQI66K7ihHlWkiUkYlhnygiJRxjdWXPO7J81peqcmS7ACV0LUPTi6jILt9owWjkIm4aJtjGUHkzctNEleDXsND5ydJGNM9MePO/s400/nb69_wicket_38.jpg" /></a> 여기에 (super(id);) 아래 다음 내용(굵을 글씨)을 작성합니다.<br />=====================================================<br />package com.myapp.wicket;<br />import org.apache.wicket.markup.html.basic.Label;<br />import org.apache.wicket.markup.html.panel.Panel;<br /><br />final class FooterPanel extends Panel {<br />FooterPanel(String id) {<br />super (id);<br /><strong>add(new Label("title","I am a reusable component!"));</strong><br />}<br />}<br />=====================================================<br />아까와 마찬가지로 Label의 임포트 문제는 앞의 아이콘을 눌러 org.apache.wicket.markup.html.basic.Label 를 가져오기 추가를 선택합니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDtRXj-PPNCIEA1rOL_NnqYdcZo41U2ZXd8nGvyLq1JpawUYG5Oj43arGtpORa_Z0hJe4LKy8gozvaLoVrdgAjZgOEmZb9NkxvzUll1U2FoKNjkA1xgljUM3F0NzBQu5mydUVu1Tr-ihgv/s1600/nb69_wicket_39.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 321px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489315277490634994" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDtRXj-PPNCIEA1rOL_NnqYdcZo41U2ZXd8nGvyLq1JpawUYG5Oj43arGtpORa_Z0hJe4LKy8gozvaLoVrdgAjZgOEmZb9NkxvzUll1U2FoKNjkA1xgljUM3F0NzBQu5mydUVu1Tr-ihgv/s400/nb69_wicket_39.jpg" /></a> 임포트 확인<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQF9Zm2mzuFP0o_Fhirrz9-UiR8PsGfZMx1UNx_xuHDyL9Sv3nO5EMmynCTJZUqkpDZD6acvSMu6590fnLGflYa7lcYuvpjIq_mcaaOBRXJ18z4DQjgLdEZ-ppUdjYklFsyvkEpM3vLBgm/s1600/nb69_wicket_40.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 321px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489315271018503586" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQF9Zm2mzuFP0o_Fhirrz9-UiR8PsGfZMx1UNx_xuHDyL9Sv3nO5EMmynCTJZUqkpDZD6acvSMu6590fnLGflYa7lcYuvpjIq_mcaaOBRXJ18z4DQjgLdEZ-ppUdjYklFsyvkEpM3vLBgm/s400/nb69_wicket_40.jpg" /></a> 이제 이 패널을 홈페이지에 추가하면 됩니다. 방법은 HomePage.java 를 열어 FooterPanel의 새 인스턴스를 추가해줍니다. 굵은 글씨 내용을 추가합니다.<br />============================================<br />...<br />public class HomePage extends BasePage {<br /><br />public HomePage() {<br />add(new Label("message1", "Hello world!"));<br /><strong>add(new FooterPanel("footerPanel"));</strong><br /><br />}<br />}<br />============================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4vOxXDVB7QoeFvsJZwWDk8A7EO2Lvo0ACpbIZqxBEccXyM4hr24SLv0Gk1yH9Arn3eS4aVzKyEZ2ibkoRoYme6w_8Rpqm981TtqY6ppUOgfpIScOAxGqUqxZO4T6xiPbIuaG6nR7dH9HH/s1600/nb69_wicket_41.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 321px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489317164115290050" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4vOxXDVB7QoeFvsJZwWDk8A7EO2Lvo0ACpbIZqxBEccXyM4hr24SLv0Gk1yH9Arn3eS4aVzKyEZ2ibkoRoYme6w_8Rpqm981TtqY6ppUOgfpIScOAxGqUqxZO4T6xiPbIuaG6nR7dH9HH/s400/nb69_wicket_41.jpg" /></a> 자바에서 추가된 패널을 이번엔 HTML 에서 렌더해야 합니다. HomePage.html 을 열어 footerPanel에 대한 placeholder 를 추가합니다. (굵은 글씨 참고)<br />=================================================================<br />...<br /><body><br /><span wicket:id='mainNavigation'/><br /><h2><br /><span wicket:id="message1">this text will be replaced</span><br /></h2><br /><strong><span wicket:id='footerPanel'/></strong><br /></body><br />...<br />=================================================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_Td8eDVu-6ZIV0XS_Ly_tv6TCds0FD6If4Fwmbbhsv_xAsBCrSRs6YxnMnxlD5Xn52FiWjfceqSy1d2V2_2Q3IZkVMBdRyKwpsyf1Khst1DLLDlfw-LxQMpqNOJ8xyNe-xFkNTGt3x-L-/s1600/nb69_wicket_42.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 321px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489317160168254866" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_Td8eDVu-6ZIV0XS_Ly_tv6TCds0FD6If4Fwmbbhsv_xAsBCrSRs6YxnMnxlD5Xn52FiWjfceqSy1d2V2_2Q3IZkVMBdRyKwpsyf1Khst1DLLDlfw-LxQMpqNOJ8xyNe-xFkNTGt3x-L-/s400/nb69_wicket_42.jpg" /></a> 파일을 저장하고 프로젝트를 실행합니다. 프로젝트에서 마우스 오른쪽 클릭 - 실행(run)<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1adP7yXnshD-qfmdrkBzWg88YpHEmD2uqeDT-6cONjmY-EVX244lSzp2wZjxXD1YgjEYpnwuqzHCiV59T5UGtI9FBfPDxgdb0nnY1ATSmE22287Xdq3dESs5muZG3Swp5Ax8P_N18341m/s1600/nb69_wicket_43.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 321px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489317151807672690" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1adP7yXnshD-qfmdrkBzWg88YpHEmD2uqeDT-6cONjmY-EVX244lSzp2wZjxXD1YgjEYpnwuqzHCiV59T5UGtI9FBfPDxgdb0nnY1ATSmE22287Xdq3dESs5muZG3Swp5Ax8P_N18341m/s400/nb69_wicket_43.jpg" /></a> 아래 그림 처럼 footerPanel의 내용이 잘 나타나는 걸 보실 수 있습니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOP8N036UOIGx_D9ECf3LGNpXXQpaXCWB9gDMc4HfaM_9BHqIQNrrZ46UXpWqJbzu4pUeZN3zIzC31RMKXyDuEq95_T7ActyY8yFJ_cjHdsJAVT2gS_eliwHv5m_n1AmW1zwvuoiALJtb0/s1600/nb69_wicket_44.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 208px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489317146258976898" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOP8N036UOIGx_D9ECf3LGNpXXQpaXCWB9gDMc4HfaM_9BHqIQNrrZ46UXpWqJbzu4pUeZN3zIzC31RMKXyDuEq95_T7ActyY8yFJ_cjHdsJAVT2gS_eliwHv5m_n1AmW1zwvuoiALJtb0/s400/nb69_wicket_44.jpg" /></a> 주: Wicket 용어에서, 패널은 재사용가능한 컴포넌트입니다. 이러한 패널을 활용한다면 원하는 만큼의 웹 페이지를 원하는 곳에 재사용 가능하게 만들 수 있습니다.<br />************************************************************<br />이제 이 게시물의 마지막으로 AJAX 기능에 대해 만들어 보겠습니다.<br />Wicket 에서는 AJAX 기능을 추가하기 위해 자바스크립트를 사용하는 대신, AJAX 를 캡슐화한 자바 컴포넌트 모델을 만들어 사용합니다. 이번 게시물에서는 위의 FooterPanel에 AJAX 의 autocomplete 위젯을 추가하도록 하겠습니다.<br />autocomplete 위젯은 플러그인 설치 jar 에 포함되어 있지 않은 extension jar 이므로 따로 다운로드 받아 사용시 프로젝트 라이브러리에 추가해줘야 합니다.<br />우선 이 extension jar 파일을 <a href="http://grepcode.com/snapshot/repo1.maven.org$maven2@org.apache.wicket$wicket-extensions@1.4.0">grepcode.com</a>에서 다운로드 합니다. 아래 그림의 사이트에서 binary download 를 선택하면 됩니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGy5Ur5vTIb7y_e_DXdFMkkmWuzo5gph3JHS-DZkqATZ6KpMj5UqM8MEQA_dLdU6g9Z7S20D4D-qEm3V6pnM-OtIT7X2RRCLPof33_dHuiGrlyeYv_L8sRyzpT4d_7c7lSJQNs5iEycfpN/s1600/nb69_wicket_45.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 380px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489317128407797170" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGy5Ur5vTIb7y_e_DXdFMkkmWuzo5gph3JHS-DZkqATZ6KpMj5UqM8MEQA_dLdU6g9Z7S20D4D-qEm3V6pnM-OtIT7X2RRCLPof33_dHuiGrlyeYv_L8sRyzpT4d_7c7lSJQNs5iEycfpN/s400/nb69_wicket_45.jpg" /></a> 그런 다음 프로젝트의 library 에서 마우스 오른쪽을 클릭하여 JAR/폴더 추가를 클릭합니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiuCh0lLxubKFVx_9V-5a9IhbQ2Nn4xMMvxBxD6e4mARrOELB9GZrFFonlyufbSzQ43Bnol-ZuUudA1ZY2ILzYGqxjaUx2uo6GxP6uvUQxmmnGg3hGhHnxCZpU4zYlop3e2ZnLr0wOF_bC/s1600/nb69_wicket_46.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 321px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489320698019625762" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiuCh0lLxubKFVx_9V-5a9IhbQ2Nn4xMMvxBxD6e4mARrOELB9GZrFFonlyufbSzQ43Bnol-ZuUudA1ZY2ILzYGqxjaUx2uo6GxP6uvUQxmmnGg3hGhHnxCZpU4zYlop3e2ZnLr0wOF_bC/s400/nb69_wicket_46.jpg" /></a> 팝업창이 뜨면 아까 받은 jar (wicket-extensions-1.4.0.jar 파일을 선택하고, 열기를 클릭합니다)<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiU2cZRUxTNJz1zf_G9rLBU-5aTOi5jOUfizizHF-aB85oT8MD1V0A7l4stiC_KBnCjfqstLfYp5pJcy_tNRJtKq_Rf_rSS2jVoMt-s7Ho8FKVuX_vsIW8yqCidKaEO26Cq34IeKaUMVW2/s1600/nb69_wicket_47.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 224px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489320696534349426" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiU2cZRUxTNJz1zf_G9rLBU-5aTOi5jOUfizizHF-aB85oT8MD1V0A7l4stiC_KBnCjfqstLfYp5pJcy_tNRJtKq_Rf_rSS2jVoMt-s7Ho8FKVuX_vsIW8yqCidKaEO26Cq34IeKaUMVW2/s400/nb69_wicket_47.jpg" /></a> 이제 FooterPanel.java 파일을 열어 생성자 아래 다음 내용(굵은 글씨)을 작성합니다.<br />=======================================================<br />...<br />public final class FooterPanel extends Panel {<br />FooterPanel(String id) {<br />super(id);<br />add(new Label("title", "I am a reusable component!"));<br />}<br /><strong>final AutoCompleteTextField field = new AutoCompleteTextField("countries", new Model("")) {<br />@Override<br />protected Iterator getChoices(String input) {<br />if (Strings.isEmpty(input)) {<br />return Collections.EMPTY_LIST.iterator();<br />}<br />List choices = new ArrayList(10);<br />Locale[] locales = Locale.getAvailableLocales();<br />for (int i = 0; i < locales.length; i++) {<br />final Locale locale = locales[i];<br />final String country = locale.getDisplayCountry();<br />if (country.toUpperCase().startsWith(input.toUpperCase())) {<br />choices.add(country);<br />if (choices.size() == 10) {<br />break;<br />}<br />}<br />}<br />return choices.iterator();<br />}<br />};</strong><br />}<br />========================================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPbII6xxAJ9VqSpigSV6fecTj_91FroVH_hfxbeQbLaKT14T6KyslL9rZl5E08cSEqsvwwbn4qofA6nw31GST1LfzQVINLity7CQhf3D_JrpcT-8R77dDNcg-fI5n_TcxC5E1a5DQWIpEP/s1600/nb69_wicket_48.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 321px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489320689779448018" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPbII6xxAJ9VqSpigSV6fecTj_91FroVH_hfxbeQbLaKT14T6KyslL9rZl5E08cSEqsvwwbn4qofA6nw31GST1LfzQVINLity7CQhf3D_JrpcT-8R77dDNcg-fI5n_TcxC5E1a5DQWIpEP/s400/nb69_wicket_48.jpg" /></a> 그런 다음 생성자 부분에서 라벨 대신 field 변수를 추가합니다<br />=======================================================<br />...<br />public FooterPanel(String id) {<br />super(id);<br />//add(new Label("title", "I am a reusable component!"));<br /><strong>add(field);</strong><br />}<br />...<br />=======================================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFo64-TZOKT6RqIloqBCWWat5HJOSb4hO_Wf4P4cLKzKXX0q6-hb2zJ4_z6Q2I5xcRnOzO9MC_OS3GO8XLzCTe16KbVfMcMW4rQQWEpqu5OKZ-wnHgltU51rpic1A9Ed9BkkPokaEwtffS/s1600/nb69_wicket_49.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 321px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489320680982544962" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFo64-TZOKT6RqIloqBCWWat5HJOSb4hO_Wf4P4cLKzKXX0q6-hb2zJ4_z6Q2I5xcRnOzO9MC_OS3GO8XLzCTe16KbVfMcMW4rQQWEpqu5OKZ-wnHgltU51rpic1A9Ed9BkkPokaEwtffS/s400/nb69_wicket_49.jpg" /></a> 임포트 문제를 해결하기 위해 편집기 여백에서 마우스 오른쪽 클릭 - 가져오기 수정(fix import)<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLgSyD_29Mi26UaKr0GpKZPyiK7fIWTxMm0Slhp3LDGNZitzKZwH3iSYJ8N8dcH6xXEWUFnByXhPlDPw3M975b1y_05tNkBspwR1GcuY1NmxBHYbVRARhlBpJgEOsF4_5dPw6Ai0OmPzaY/s1600/nb69_wicket_50.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 321px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489320674986452770" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLgSyD_29Mi26UaKr0GpKZPyiK7fIWTxMm0Slhp3LDGNZitzKZwH3iSYJ8N8dcH6xXEWUFnByXhPlDPw3M975b1y_05tNkBspwR1GcuY1NmxBHYbVRARhlBpJgEOsF4_5dPw6Ai0OmPzaY/s400/nb69_wicket_50.jpg" /></a> 아래 그림을 참고하여 임포트 할 클래스를 선택합니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_x3G1k2qXJ46kQNBYdiUFBotu51-WNMCcrKX43a3itnjXp7qDake1GVI6lvZ5qjgVyaADN3hn-E4so9LusL5fQgKQPi34ilosJpJqMntWoTej9nonZp8EtwG8YJazuwG6MZUKfZLgS4bJ/s1600/nb69_wicket_51.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 247px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489325147649868466" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_x3G1k2qXJ46kQNBYdiUFBotu51-WNMCcrKX43a3itnjXp7qDake1GVI6lvZ5qjgVyaADN3hn-E4so9LusL5fQgKQPi34ilosJpJqMntWoTej9nonZp8EtwG8YJazuwG6MZUKfZLgS4bJ/s400/nb69_wicket_51.jpg" /></a><br />임포트 확인<br />----------------------------------------------------<br />import java.util.ArrayList;<br />import java.util.Collections;<br />import java.util.Iterator;<br />import java.util.List;<br />import java.util.Locale;<br />import org.apache.wicket.extensions.ajax.markup.html.autocomplete.AutoCompleteTextField;<br />import org.apache.wicket.markup.html.basic.Label;<br />import org.apache.wicket.markup.html.panel.Panel;<br />import org.apache.wicket.model.Model;<br />import org.apache.wicket.util.string.Strings;<br />----------------------------------------------------<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyCT2yWR9QdzLP3Zvka0pWrRZ57YAvhKcCR03TLUgOVfzR8dh892jPjeKGruJ88CzAKagF_SqlJbpiRMw5anXYCaAD4eJ6PSP62fDE0AXucVlhYsmNYbx63mIYr7iVsrhyZ6gPtXoYE22r/s1600/nb69_wicket_52.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 321px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489325145897624162" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyCT2yWR9QdzLP3Zvka0pWrRZ57YAvhKcCR03TLUgOVfzR8dh892jPjeKGruJ88CzAKagF_SqlJbpiRMw5anXYCaAD4eJ6PSP62fDE0AXucVlhYsmNYbx63mIYr7iVsrhyZ6gPtXoYE22r/s400/nb69_wicket_52.jpg" /></a> 이제 FooterPanel HTML 에서 자바 클래스에서 만든 위켓을 연결합니다.<br />Wicket id는 "countries" 를 사용하여 입력 텍스트 필드를 추가합니다.<br />==============================================<br /><?xml version="1.0" encoding="UTF-8"?><br /><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><br /><html xmlns:wicket><br /><head><br /><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/><br /><title>FooterPanel</title><br /></head><br /><body><br /><wicket:panel><br /><br /><!--<span wicket:id="title">title here</span>--><br /><input type="text" wicket:id="countries" size="50"/><br /><br /></wicket:panel><br /></body><br /></html<br />==============================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguz9AdKLom8OD7BtLCxs9Yg5tNg0EYkUP_xTHdoFrljpYTjCwLB7oc5WeYHZaMytRVC1EjJsbgRhcBvsjsOvqb33EN-WjrhRqTNOCqsaBmP4YF4z0J2VfhZlkf0xVwaz3oUR47pVWKVy_s/s1600/nb69_wicket_53.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 321px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489331300450192482" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguz9AdKLom8OD7BtLCxs9Yg5tNg0EYkUP_xTHdoFrljpYTjCwLB7oc5WeYHZaMytRVC1EjJsbgRhcBvsjsOvqb33EN-WjrhRqTNOCqsaBmP4YF4z0J2VfhZlkf0xVwaz3oUR47pVWKVy_s/s400/nb69_wicket_53.jpg" /></a>자바 파일을 수정했기 때문에 원칙적으로 다시 빌드를 해야 합니다. (다만 여기서 예전 파일이 deploy 되어 있는 상태에서 clean and build 가 정상 동작하지 않을 수도 있기 때문에 그런 경우 해당 서버를 중지시키고, file 탭으로 가서 build와 dist 폴더를 삭제하거나, 아니면 아예 넷빈을 다시 껐다가 켜서 해당 프로젝트를 clean and build 하는 게 좋습니다)<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfqy7ROn7fO8kH20uA_8PbOYfB55lXbbAvEoDjA-LOqKw4LJOKmuiaAaZVoPNkCvpDUYvG86yuavC5bzs00bIULmEA3JnSEazg-prFPUXuPhIvUX05VgjlgrVq0Pm6dJODm4sR8Llitt0C/s1600/nb69_wicket_54.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 321px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489330822018161330" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfqy7ROn7fO8kH20uA_8PbOYfB55lXbbAvEoDjA-LOqKw4LJOKmuiaAaZVoPNkCvpDUYvG86yuavC5bzs00bIULmEA3JnSEazg-prFPUXuPhIvUX05VgjlgrVq0Pm6dJODm4sR8Llitt0C/s400/nb69_wicket_54.jpg" /></a>프로젝트를 실행합니다. 프로젝트에서 마우스 오른쪽 클릭 - 실행(run)<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBVPx1vIv0-9V4uAc9RCxQQpit_nXo1hhNKXLJClDBpITiSUZd3dWTYZ2xWrZDsm3KR9eBzinTYJfu7M7W3Pvp3-RWF4PseCTgzBGqBsgsO151wv3FhNKI65-EvoxvPAplgF6k7rm3QXMd/s1600/nb69_wicket_55.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 321px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489331762133777250" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBVPx1vIv0-9V4uAc9RCxQQpit_nXo1hhNKXLJClDBpITiSUZd3dWTYZ2xWrZDsm3KR9eBzinTYJfu7M7W3Pvp3-RWF4PseCTgzBGqBsgsO151wv3FhNKI65-EvoxvPAplgF6k7rm3QXMd/s400/nb69_wicket_55.jpg" /></a>브라우저에 텍스트 필드가 나타나면 "대"라고 입력합니다.<br />그럼 그림과 같이 아래 대만,대한민국이 제시됩니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivB-jE_5d2f5I3x-CVHWzQEr_z7_COHjNe9qDuNJQJrLoBegX6fxkTK0pRr6FoMukl7LqrnAYAsKOiB_75zXihXLzxwwhKg7Pua-VQVkgb31NX4RbkLJdSpI3rYAODHj0GIqQH4EDYU3dH/s1600/nb69_wicket_56.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 286px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489329698429725746" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivB-jE_5d2f5I3x-CVHWzQEr_z7_COHjNe9qDuNJQJrLoBegX6fxkTK0pRr6FoMukl7LqrnAYAsKOiB_75zXihXLzxwwhKg7Pua-VQVkgb31NX4RbkLJdSpI3rYAODHj0GIqQH4EDYU3dH/s400/nb69_wicket_56.jpg" /></a><br />*************************************************************<br />추가분: (문제상황점검)<br />현재 나라에 대한 설정을 잘 살펴보면 우선 10개씩만 나타나도록 되어 있습니다. 이 문제도 수정을 해야 하고.. 또 하나, 로케일에 관한 사항인데 현재 소스로는 한글로 입력시에 해당 로케일에 대해 나옵니다만 영어로 하는 경우에는 영문 로케일을 반영하지 않기 때문에 아무 제시어도 나타나지 않습니다.<br />그럼 영어로 나라이름을 적었을 때 나타나게 하려면 어떻게 소스를 수정해야 할까요? 또하나 10개의 제한을 없애려면?<br />-------------------------------------------------------------<br />해답: 아까의 FooterPanel.java 의 코드 부분을 다음과 같이 수정합니다.<br />===================================================<br />public final class FooterPanel extends Panel {<br /><br />...<br /><br />final AutoCompleteTextField field = new AutoCompleteTextField("countries", new Model("")) {<br />@Override<br />protected Iterator getChoices(String input) {<br />if (Strings.isEmpty(input)) {<br />return Collections.EMPTY_LIST.iterator();<br />}<br />List choices = new ArrayList(10);<br />Locale[] locales = Locale.getAvailableLocales();<br />for (int i = 0; i < locales.length; i++) {<br />final Locale locale = locales[i];<br /><strong>locale.setDefault(Locale.ENGLISH);</strong><br />final String country = locale.getDisplayCountry();<br />if (country.toUpperCase().startsWith(input.toUpperCase())) {<br />choices.add(country);<br /><strong>/*<br />if (choices.size() == 10) {<br />break;<br />}<br />*<br />*/</strong><br />}<br />}<br />return choices.iterator();<br />}<br />};<br />...<br />=================================================================<br />파일을 저장하고 프로젝트를 다시 clean and build 한 후 실행시키면 아래 그림처럼 영어로 입력시 나라이름이 제시됩니다. a 로 시작되는 나라들<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7rMGb3KWHaMOXGijs556MO9PZELO-UApGb31Gy5rR6-mO7gtneF5EI-Fru5UtBYm5ly5B6u56IxFhlZrK7xY8309Pg7tnaHpgtOaSAyZ_KDDOxwL5_JrwQxDjLSv-Ai-nJCZ3HugIaGRx/s1600/nb69_wicket_57.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 328px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489334184063027570" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7rMGb3KWHaMOXGijs556MO9PZELO-UApGb31Gy5rR6-mO7gtneF5EI-Fru5UtBYm5ly5B6u56IxFhlZrK7xY8309Pg7tnaHpgtOaSAyZ_KDDOxwL5_JrwQxDjLSv-Ai-nJCZ3HugIaGRx/s400/nb69_wicket_57.jpg" /></a>s 로 시작되는 나라들..(south korea ㅋㅋㅋ)<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjszDIBgpmowjryQ608LYaUSccptLXLbEOkLywGuq_n1OZQMvsaJTdZJPWiiCbsOTG8ZbTv-1VDT77s7sDOhnznJ2knIg_Lf5wRx2_zNnhYr15ii8R1ccF15Q9YHlBJYn4vhskNquj1MOSY/s1600/nb69_wicket_58.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 380px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5489334458331527602" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjszDIBgpmowjryQ608LYaUSccptLXLbEOkLywGuq_n1OZQMvsaJTdZJPWiiCbsOTG8ZbTv-1VDT77s7sDOhnznJ2knIg_Lf5wRx2_zNnhYr15ii8R1ccF15Q9YHlBJYn4vhskNquj1MOSY/s400/nb69_wicket_58.jpg" /></a><br />이상 간단히 알아본 Wicket 이었습니다.<br />나중에 좀더 다양한 형태의 Wicket 위젯들에 대해 알아보도록 하겠습니다.<br />수고하셨습니다. *^^*강여사(J.Y.Kang)http://www.blogger.com/profile/17450510931308610527noreply@blogger.com0tag:blogger.com,1999:blog-6811062799606447528.post-58524479691714462102010-07-01T03:41:00.001-07:002010-07-01T04:03:02.153-07:00넷빈(NetBeans)6.9에서 Vaadin 웹 프레임워크 사용하기-01-설치 및 기본이번엔 Vaadin 에 대해 소개해 보고자 합니다.<br /><br />Vaadin...ㅋㅋ 이건 원래 영어가 아닙니다. 핀란드말로 female reindeer(암순록)를 뜻하죠.. 그래서인지 Vaadin의 기본 스타일시트 이름이 바로 reindeer 입니다.<br />역시 이 동네(IT)네이밍 센스는 언제봐도 놀랍습니다. 쿄쿄<br /><br />아무튼~<br />Vaadin은 한마디로 RIA(Rich Internet Application)을 위한 오픈 소스 웹 어플리케이션 프레임워크입니다.<br /><br />자바스크립트 라이브러리와 브라우저 플러그인 기반 솔루션과 대조적으로, Vaadin은 서버-사이드 아키텍처로, 따라서 로직의 대다수는 서버에서 실행된다는 걸 의미합니다. AJAX 테크롤로지는 사용자의 경험을 풍부하고 인터랙티브하게 만들어주는 브라우저-사이드에서의 사용입니다. Vaadin의 클라이언트-사이드는 GWT위에 빌트인되며 확장 가능합니다.<br /><br />Vaadin의 코어는 자바 라이브러리로, 웹-기반 사용자 인터페이스의 하이 퀄리티를 쉽게 생성하고 유지보수할 수 있도록 설계되었습니다. Vaadin의 서버-주도 프로그래밍 모델의 주요 아이디어는 웹이 아닌, 마치 AWT,Swing 또는 SWT과 같은 보편적인 툴킷을 가진 자바 데스크탑 어플리케이션을 프로그래밍 하듯 사용자 인터페이스를 쉽게 만들어줍니다. 이 서버-주도 프로그램 모델로, Vaadin은 브라우저와 서버사이에 브라우저 및 AJAX 커뮤니테이션에 있어 UI 관리를 케어합니다. Vaadin 방식을 사용하게 되면 더이상 HTML 이나 자바스크립트와 같은 브라우저 기술을 배우거나 디버그 할 필요가 없습니다. ^^;<br /><br />Vaadin 라이브러리는 사용자 인터페이스 프리젠테이션과 로직을 명확히 분리하여 각각 독립적으로 개발할 수 있도록 해줍니다. 어플리케이션의 비주얼 외양은 themes 를 사용하여 접근하고 있습니다. Themes는 CSS 와 HTML 페이지 템플릿을 사용하여 사용자 인터페이스 외양을 관리합니다. Vaadin은 기본 테마(reindeer) 뿐 아니라, 사용자 지정 테마를 만들수도 있습니다. 백엔드에서는, GWT(Google Web Toolkt)를 사용하여, 브라우저에서 사용자 인터페이스를 렌더링하고 있습니다. GWT 프로그램은 자바로 만들어, 자바스크립트로 컴파일됩니다. Vaadin이 실제 어플리케이션 로직을 서버에서 핸들링하는 동안, GWT는 향상된 사용자 인터페이스 컴포넌트(GWT 용어로 위젯)와 브라우저에서의 인터랙션 로직을 구현에 이상적입니다. Vaadin은 확장 가능하도록 설계되어있는제, 실제 써드파티 GWT 컴포넌트들과 쉽게 사용되며, Vaadin 에서 제공된 컴포넌트 레파토리에 추가할 수도 있습니다. GWT의 사용은 필요로 하는 모든 코드를 순수 자바로 쓸 수 있다는 걸 의미합니다.<br /><br />좀더 자세한 Vaadin의 기능들은 다음을 참고 <a href="http://vaadin.com/features">Vaadin features page</a> 하시기 바랍니다.<br /><br />이제 Vaadin 플러그인을 넷빈에 설치하고 간단한 어플리케이션을 만들어 보도록 하겠습니다.<br /><br />작업환경은 다음과 같습니다.<br /><br />넷빈(NetBeans 6.9)<br />JDK 6<br />Vaadin Plugin for NetBeans IDE 현재 최신 버전 (0.1.1): 아래 다운로드 참조<br />글래스 피시 v 3.0.1 (또는 톰캣 서버 6.x 이상)<br /><br />우선 Vaadin 플러그인을 다운로드 받습니다.<br />다운로드 링크는 다음입니다.<br /><a href="http://plugins.netbeans.org/PluginPortal/faces/PluginDetailPage.jsp?pluginid=21965">http://plugins.netbeans.org/PluginPortal/faces/PluginDetailPage.jsp?pluginid=21965</a><br />넷빈즈 IDE를 위한 Vaadin 플러그인은 Kenai 에서 액세스가능한 오픈소스, 플러그인 프로젝트 입니다.<br />위 해당 사이트로 이동하여 Download 버튼 클릭후 저장<br /><br /><br /><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzm5fVTByqoIkubAXZ4iegqe3xegm10SNBFxmgbEh5WFNBQfqnv6Yjtm1M1Lb1rivAkpacJJqUnzVm9bIaxySoAXARKGiOAlMjgTtXcLIfrQfap1KmUl89a50sI8TklSnD-DT8sumEFDg/s1600/nb69_vaadin_02.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 367px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488840296283038498" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzm5fVTByqoIkubAXZ4iegqe3xegm10SNBFxmgbEh5WFNBQfqnv6Yjtm1M1Lb1rivAkpacJJqUnzVm9bIaxySoAXARKGiOAlMjgTtXcLIfrQfap1KmUl89a50sI8TklSnD-DT8sumEFDg/s400/nb69_vaadin_02.jpg" /></a> 넷빈-도구-플러그인 선택<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRPXEj-Bd2w8o2CzKl8JESa34TXe1RKxylERDW-OV2MVD2fn0hVlXMSNDnAWHN4R1_vLoz3DNqxB3Kh_wRVUZpAPLVgzlK1gGLC1jW4ltxjx2Jv0bMZF1qaqDwOI6i1zG5sX5MojhMw1s/s1600/nb69_vaadin_01.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488840304879083202" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRPXEj-Bd2w8o2CzKl8JESa34TXe1RKxylERDW-OV2MVD2fn0hVlXMSNDnAWHN4R1_vLoz3DNqxB3Kh_wRVUZpAPLVgzlK1gGLC1jW4ltxjx2Jv0bMZF1qaqDwOI6i1zG5sX5MojhMw1s/s400/nb69_vaadin_01.jpg" /></a> 다운로드 받은 플러그인 설치시에는 탭의 다운로드를 클릭한 후,<br />아래 플러그인추가 버튼을 눌러 해당 다운로드 받은 nbm 파일을 열어 줍니다 - 열기<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6qopI3D4sl3V-XDuIexqUcYDOp2jNZiUNjEOMv6TFE8vyMTN24KNY8pYDCJGIDZtwM3wesIbaCG6j9_rVnqX8XrjPkKzLlseGGrZlfpTNJJqNB_Oda79WKNQIhkRLDingzFvxSfc-jUQ/s1600/nb69_vaadin_03.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488840295410914274" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6qopI3D4sl3V-XDuIexqUcYDOp2jNZiUNjEOMv6TFE8vyMTN24KNY8pYDCJGIDZtwM3wesIbaCG6j9_rVnqX8XrjPkKzLlseGGrZlfpTNJJqNB_Oda79WKNQIhkRLDingzFvxSfc-jUQ/s400/nb69_vaadin_03.jpg" /></a> Vaadin 플러그인에 대한 내용이 올라옵니다. 왼쪽 아래 설치를 눌러 진행합니다<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3aT96EGCW2IE7fmkTDG7BXNCMQ9ozQyBvuLexsT6WytzjqIbwTQGh1hkhc1SjBV8fjvSKSc1uuU0pnkGvWu-gsbZkta30NcRLW2JUhu-KLGkZd-V8LD0kpxdCEhlW16Vpt5W1lbQTCqY/s1600/nb69_vaadin_04.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 264px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488840286350684610" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3aT96EGCW2IE7fmkTDG7BXNCMQ9ozQyBvuLexsT6WytzjqIbwTQGh1hkhc1SjBV8fjvSKSc1uuU0pnkGvWu-gsbZkta30NcRLW2JUhu-KLGkZd-V8LD0kpxdCEhlW16Vpt5W1lbQTCqY/s400/nb69_vaadin_04.jpg" /></a> 설치 프로그램의 지시사항에 따라 진행- 다음<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzbuGsLpkZpZJQzVqp3WEj_RXMiQlq70IyLtIwBxCcv1i72p2EG2A-4FZJM97bI1_Lx293gY4oFV6IPLbQJQFVXi8ECb11s4P4FBRgBIU348lrVtQoxP9krBDji1oICQRuP6EY5KFA6co/s1600/nb69_vaadin_05.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 357px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488840281795369282" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzbuGsLpkZpZJQzVqp3WEj_RXMiQlq70IyLtIwBxCcv1i72p2EG2A-4FZJM97bI1_Lx293gY4oFV6IPLbQJQFVXi8ECb11s4P4FBRgBIU348lrVtQoxP9krBDji1oICQRuP6EY5KFA6co/s400/nb69_vaadin_05.jpg" /></a> 약관에 동의(체크)- 설치<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRSRo6G-jUR2QXiHkiudZP5e-ALEWDwBGd-Ef-DXV04dL86vkkBL83vFaBDalX3AfAdGmKy7tKzRp_EhsotUnCvk4t1Hi_mQjpY6KCtFWMQ4Z08bKIaKSJhNqwyNNEqAHxRxze-quAkEg/s1600/nb69_vaadin_06.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 357px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488841147273731266" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRSRo6G-jUR2QXiHkiudZP5e-ALEWDwBGd-Ef-DXV04dL86vkkBL83vFaBDalX3AfAdGmKy7tKzRp_EhsotUnCvk4t1Hi_mQjpY6KCtFWMQ4Z08bKIaKSJhNqwyNNEqAHxRxze-quAkEg/s400/nb69_vaadin_06.jpg" /></a> 서명에 대한 경고가 뜨는데 무시하고 계속<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuEUtkz8wCOAMVNigQ2UWV9Rw4ZBKDqI94SW2U_GgboCcDGiZ0U5Ap3BPjz-46OeIbumI-fEP5BDOBVcJb-F2dlZoWLnsbIYCN5gLRRJss6ZS6xWKaRL4ZDaCK4_NKuRxBOBfI6iIvsq8/s1600/nb69_vaadin_07.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 360px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488841139866088290" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuEUtkz8wCOAMVNigQ2UWV9Rw4ZBKDqI94SW2U_GgboCcDGiZ0U5Ap3BPjz-46OeIbumI-fEP5BDOBVcJb-F2dlZoWLnsbIYCN5gLRRJss6ZS6xWKaRL4ZDaCK4_NKuRxBOBfI6iIvsq8/s400/nb69_vaadin_07.jpg" /></a> 마침<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh13bqOLd2pipKrs-CxwKeYRx6IeLPFqA_Lo8DtJmfEHNres6zpW-yr16tbzltV0unuKD2pfsB7RA16QWrvzD-R0TE6_tjllt1hlojfOsNMpQqJjVlEFqi5HcjFMcnpUabwqbAaiG7eivQ/s1600/nb69_vaadin_08.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 357px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488841134198636610" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh13bqOLd2pipKrs-CxwKeYRx6IeLPFqA_Lo8DtJmfEHNres6zpW-yr16tbzltV0unuKD2pfsB7RA16QWrvzD-R0TE6_tjllt1hlojfOsNMpQqJjVlEFqi5HcjFMcnpUabwqbAaiG7eivQ/s400/nb69_vaadin_08.jpg" /></a> 이제 Vaadin 자바 웹 어플리케이션 프로젝트를 만들도록 하겠습니다<br />프로젝트창에서 마우스 오른쪽 클릭 - 새 프로젝트<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaGBXVMJPsIoMDHtQ4H9TWlNdb3iy_x_JtDONDNvSOgdPQkZCMXqvVRD4SNApVxgdERHChrkBYs19yrZGAQixT4TP6hQIHPLxZBkZsWSUbNVmImZnsvIYWNsugiIyB2LopX1EfSWm9FCk/s1600/nb69_vaadin_09.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488841127061050802" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaGBXVMJPsIoMDHtQ4H9TWlNdb3iy_x_JtDONDNvSOgdPQkZCMXqvVRD4SNApVxgdERHChrkBYs19yrZGAQixT4TP6hQIHPLxZBkZsWSUbNVmImZnsvIYWNsugiIyB2LopX1EfSWm9FCk/s400/nb69_vaadin_09.jpg" /></a>카테고리에서 Java 웹 - Web Application - 선택 후 다음<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgw_0J4-TQ3RVOpekxn9bQJTqikQp8gBd2s2I2ht5wclhS6JcM3l7M0sNWQRzvGxuKFtvhw5BPS1XbBsrM0PCGHBerus5ByaH0R6EuEJZOgiqUowcSaHsZCoCqQrMt6UlCINHB5eE24cYw/s1600/nb69_vaadin_10.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488841118642777058" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgw_0J4-TQ3RVOpekxn9bQJTqikQp8gBd2s2I2ht5wclhS6JcM3l7M0sNWQRzvGxuKFtvhw5BPS1XbBsrM0PCGHBerus5ByaH0R6EuEJZOgiqUowcSaHsZCoCqQrMt6UlCINHB5eE24cYw/s400/nb69_vaadin_10.jpg" /></a> 프로젝트 이름은 적당히...HelloVaadin 으로 줬습니다<br />경로도 적당히..<br />다음<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBYMpR1vujLGtxcUIuqFicY2292HhOREnVkTOA17ZHNrbFJKytGxiiWFaM-lnYY1Qkfbk0sk5zJFb4-5izPA8BcTThGMOFr0DqgaY4AzuohWOQvM5TLkMuE7awi6fAaZ6NBPoVeNHDKf0/s1600/nb69_vaadin_11.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488841892155116482" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBYMpR1vujLGtxcUIuqFicY2292HhOREnVkTOA17ZHNrbFJKytGxiiWFaM-lnYY1Qkfbk0sk5zJFb4-5izPA8BcTThGMOFr0DqgaY4AzuohWOQvM5TLkMuE7awi6fAaZ6NBPoVeNHDKf0/s400/nb69_vaadin_11.jpg" /></a> 서버설정인데 사실 지금 프로젝트는 글래스피시, 톰캣 상관없고 버전 역시 EE6, EE5 상관없습니다.<br />해서 그냥 기본으로 잡히는 글래스피스 v3.0.1 에, EE6 Web 그대로 잡아줬습니다 - 다음<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZPz6mKTfuCkSclshfSkiiFmHtxT__R_PFATexCkkyUFMK_BmkEkLZ8u86JouiZWh-2MMhiHtPEoE544HrqoglE2i7CjcR64KEUCL9zNEc_lp11nVCo7uWXI_5fl-u-LJxm_VXpwSUil8/s1600/nb69_vaadin_12.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 251px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488841886485439138" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZPz6mKTfuCkSclshfSkiiFmHtxT__R_PFATexCkkyUFMK_BmkEkLZ8u86JouiZWh-2MMhiHtPEoE544HrqoglE2i7CjcR64KEUCL9zNEc_lp11nVCo7uWXI_5fl-u-LJxm_VXpwSUil8/s400/nb69_vaadin_12.jpg" /></a> 프레임워크 설정 페이지에서 Vaadin 6.1.3 을 선택합니다<br />선택체크후 아래 구성 내용이 제시됩니다. (기본내용확인)<br />Vaadin Servlet Name: VaadinApplication<br />Vaadin URL 패턴: /Vaadin/*<br />Vaadin Applicatoin Class: MyApplication<br />Main Package : com.example.vaadin<br />마침<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWKIIgMFsonuGxNiBCFQ2uHwhGY6-m2Z-ARCK2InyrgrD5JhO4luxDsZOcek-2bwoeI4JJRUMAFMBxHdei0O5dmMrJjEgNQhApNpvZMRfNTqP76tJoyQRLVcCYbUGj0HA9CLbRP1J-zeA/s1600/nb69_vaadin_13.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 251px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488841880250759458" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWKIIgMFsonuGxNiBCFQ2uHwhGY6-m2Z-ARCK2InyrgrD5JhO4luxDsZOcek-2bwoeI4JJRUMAFMBxHdei0O5dmMrJjEgNQhApNpvZMRfNTqP76tJoyQRLVcCYbUGj0HA9CLbRP1J-zeA/s400/nb69_vaadin_13.jpg" /></a> 이제 심플한 Vaadin Web Application 이 만들어집니다. 프로젝트 창에서 프로젝트의 구조를 보면 일반 웹 어플리케이션 프로젝트와 Vaadin Web Application 과 차이점을 발견할 수 있습니다.<br />* Vaadin 프로젝트에는 기본 JSP 파일이 없습니다.<br />* 그대신, Vaadin 프로젝트는 기본 자바 파일이 있습니다.<br />* Vaadin 프로젝트는 당연 Vaadin 라이브러리가 잡혀 있습니다.<br />* 어떤 자바스크립트나 기타 XML 파일들이 추가되어 있지 않습니다.<br />그럼 src 에 있는 MyApplication.java 파일을 열어 내용을 확인합니다.<br />맨 위 import 를 보면 Vaadin에 대한 application 과 ui 패키지가 임포트 되어 있는 걸 볼 수 있습니다. 이 내용이 전형적인 JSP 등의 페이지 사용을 대신하게 됩니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzWI5hOusx_YPDGYQEOHeZcjZ402N8ugMpViA7rRJK4xrnFNaGuGp1rMcIaZNIPCp8zQryTpfhYbjjdmUDRMq5fyz_hyphenhyphenk4_e5dUWVSYOSInG_UjYcD1uO0TMAxJmVTEjJZ7Cly3s66FV0/s1600/nb69_vaadin_14.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488841870599717554" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzWI5hOusx_YPDGYQEOHeZcjZ402N8ugMpViA7rRJK4xrnFNaGuGp1rMcIaZNIPCp8zQryTpfhYbjjdmUDRMq5fyz_hyphenhyphenk4_e5dUWVSYOSInG_UjYcD1uO0TMAxJmVTEjJZ7Cly3s66FV0/s400/nb69_vaadin_14.jpg" /></a>이 내용을 확인하기 위해 프로젝트를 바로 실행시킵니다. 프로젝트 창에서 마우스 오른쪽 클릭 - 실행.<br />글래스피시 서버가 구동되고 프로젝트가 컴파일, 배포 과정을 거친후 브라우저에 내용이 표시됩니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_9LE4AnBgGLUyqKLKzZ_BhfZLzFH1wkibCZC_1FB1147aAX0RKAS-IhpLL6bTEUKlmH3U1f7I7C8zhIKj72CRfel3f0JmMro-0fH6U0Vh6Gjef-NjuiH3i5aQ-a847MyxOASvzE3vtkw/s1600/nb69_vaadin_15.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488841866882799122" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_9LE4AnBgGLUyqKLKzZ_BhfZLzFH1wkibCZC_1FB1147aAX0RKAS-IhpLL6bTEUKlmH3U1f7I7C8zhIKj72CRfel3f0JmMro-0fH6U0Vh6Gjef-NjuiH3i5aQ-a847MyxOASvzE3vtkw/s400/nb69_vaadin_15.jpg" /></a> 브라우저에 표시된 내용은 다음과 같습니다. (주소표시줄의 의미나 텍스트, 아이콘 등에 대해 좀더 자세히 살펴 보시기 바랍니다 ^^)<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYKWIw-0nGe8xHpdLzJ85acwJqE8kTTmqc-EX1WC9lcY2tQp5_KhqtaJ9WBavCJe5CTatBx6r79RftNqCOuo636_EB8SYsrlCWolrn4tLCor-jPn4DoNtxR0SXj8-ZrTZJeusYjTRU0nc/s1600/nb69_vaadin_16.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 181px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488844542005453746" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYKWIw-0nGe8xHpdLzJ85acwJqE8kTTmqc-EX1WC9lcY2tQp5_KhqtaJ9WBavCJe5CTatBx6r79RftNqCOuo636_EB8SYsrlCWolrn4tLCor-jPn4DoNtxR0SXj8-ZrTZJeusYjTRU0nc/s400/nb69_vaadin_16.jpg" /></a> 우선 여기에 스타일시트를 작업하기 위해 간단히 버튼을 하나 추가 하겠습니다.<br />MyApplication.java 에 init()메소드에서 다음 내용(굵은 글씨)를 추가합니다.<br />======================================================<br />...<br />public class MyApplication extends Application {<br />@Override<br />public void init() {<br />Window mainWindow = new Window("MyApplication");<br />Label label = new Label("Hello Vaadin user");<br />mainWindow.addComponent(label);<br /><strong>Button button = new Button("My Button");<br />mainWindow .addComponent(button );</strong><br />setMainWindow(mainWindow);<br />}<br />======================================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidYZIGT165DLraaWUJabXtXkscssUX99vwmhsqsASdhsIEkakc6lWc12YMezExG6Aw25GeakRQ6quwgQITY8dzZQ5nFh74iTih7_7WhjvuTz2sh1mEWpPUFdEo10Kd-RssRQ8jL4xPZ2M/s1600/nb69_vaadin_17.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488844531100654642" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidYZIGT165DLraaWUJabXtXkscssUX99vwmhsqsASdhsIEkakc6lWc12YMezExG6Aw25GeakRQ6quwgQITY8dzZQ5nFh74iTih7_7WhjvuTz2sh1mEWpPUFdEo10Kd-RssRQ8jL4xPZ2M/s400/nb69_vaadin_17.jpg" /></a> 저장후 프로젝트를 다시 빌드하고 실행합니다. 프로젝트에서 마우스 오른쪽 클릭 - 지우고 빌드<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0b4xTIzi3lk_5OWtpwKB-wzcK71Tk6DtjqPm_THT5H1rsJWF4Vo8Mfn-f6l5P-th3q0lKyYDTslSSZHez2kdZe5AITcmfbCcR16-CjWr-zw5qtt449ykFuMOWS-J07dwqrB4VwedioU4/s1600/nb69_vaadin_18.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488844527954818674" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0b4xTIzi3lk_5OWtpwKB-wzcK71Tk6DtjqPm_THT5H1rsJWF4Vo8Mfn-f6l5P-th3q0lKyYDTslSSZHez2kdZe5AITcmfbCcR16-CjWr-zw5qtt449ykFuMOWS-J07dwqrB4VwedioU4/s400/nb69_vaadin_18.jpg" /></a> 프로젝트를 실행합니다. 프로젝트에서 마우스 오른쪽 클릭 - 실행<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEip4nA9pZGzp6aZIf5divtqpy9RZVETb2UjaTfoAyvdUReAFHcQtaJTApxRwk0cUs0CealIO__iR6PcBsIha2PtXWSjuuyXDYUKfoRvJSpGdLHNjjxjthe3PUOk0MF_04CGS24_koC0IF8/s1600/nb69_vaadin_19.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488844525724930066" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEip4nA9pZGzp6aZIf5divtqpy9RZVETb2UjaTfoAyvdUReAFHcQtaJTApxRwk0cUs0CealIO__iR6PcBsIha2PtXWSjuuyXDYUKfoRvJSpGdLHNjjxjthe3PUOk0MF_04CGS24_koC0IF8/s400/nb69_vaadin_19.jpg" /></a> 브라우저에 텍스트 아래 버튼이 나타납니다.<br />바로 아래에서 스타일시트를 변경해보면 알지만 버튼에 대한 기본적인 스타일시트가 이미 설정되어 있고, 이 스타일시트가 바로 reindeer 입니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjF5SgMc-B9GZWprHIuAjxDKeDCJXHqhPXYVcfaa2R4A64I1uc-zioSvzWe3zR3M5fSs8CAt2KOscyjJIjhOMrUdTwmSFTPL-klHDEkEbdLxEAesE7YABWM0NuVZf62xKtizaDlNiI02lI/s1600/nb69_vaadin_20.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 181px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488844514397793234" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjF5SgMc-B9GZWprHIuAjxDKeDCJXHqhPXYVcfaa2R4A64I1uc-zioSvzWe3zR3M5fSs8CAt2KOscyjJIjhOMrUdTwmSFTPL-klHDEkEbdLxEAesE7YABWM0NuVZf62xKtizaDlNiI02lI/s400/nb69_vaadin_20.jpg" /></a> 그럼 이제 스타일시트를 바꿔보도록 하겠습니다.<br />MyApplication.java 의 init() 메소드에서 Ctrl+Space 키를 누른후 철자(sett...)를 치면 그림처럼 API 가 올라옵니다.<br />선택할 메소드는 setTheme(String theme)입니다.<br />Vaadin에서는 themes 를 이용하여 로직과 UI 외형을 분리하는데, Themes 는 CSS 스타일시트, 커스텀 HTML 레이아웃 뿐만 아니라 필요로 하는 각종 그래픽 등을 포함할 수 있습니다.<br />Vaadin 프레임워크 6.1.3 에는 기본적으로 2개의 빌트인 테마가 들어있는데, 하나는 reindeer 와 runo 가 그것이고, 넷빈즈 IDE Vaadin 플러그인이 vaadin jar 파일로부터 이러한 테마를 동적으로 로드합니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhF20bk_n0x2tnjFZnPGuwgz9gRSeS-xDXA-HGyJDxtwVWnolIpI_ihot-yJp-Q9AenX0a-FK1wiVwSdFID6p7C9suGYJ9FLtHyWN8dPv47jDY9VGb4oMr7YxuaH3AhjUiNdoi_vkPt9gM/s1600/nb69_vaadin_21.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488847823470528322" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhF20bk_n0x2tnjFZnPGuwgz9gRSeS-xDXA-HGyJDxtwVWnolIpI_ihot-yJp-Q9AenX0a-FK1wiVwSdFID6p7C9suGYJ9FLtHyWN8dPv47jDY9VGb4oMr7YxuaH3AhjUiNdoi_vkPt9gM/s400/nb69_vaadin_21.jpg" /></a> 어찌됐던 코드부분은 다음과 같습니다.<br />====================================<br /><strong>setTheme("runo");</strong><br />====================================<br />팁: 나중에 reindeer 로 바꿔보면 원래 적용됐던 기본 테마와 같은 모양인 걸 알 수 있습니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3Wwri7Ww19nfoeVHmFl9AWh3rcO6SdW5PmUizilCUdlJKoYy3BdlrFOWDDBhuFQS2IuysaMXSCC2br7QSJSNqxkOWpKUdALwnbKaUEwDlstVPBxroGmYy9L5QJ5COxM9UfvTUaDXyq-k/s1600/nb69_vaadin_22.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488847805129844546" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3Wwri7Ww19nfoeVHmFl9AWh3rcO6SdW5PmUizilCUdlJKoYy3BdlrFOWDDBhuFQS2IuysaMXSCC2br7QSJSNqxkOWpKUdALwnbKaUEwDlstVPBxroGmYy9L5QJ5COxM9UfvTUaDXyq-k/s400/nb69_vaadin_22.jpg" /></a> 프로젝트에서 마우스 오른쪽 클릭 - 지우고 빌드(clean and build)<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQOjBZn1CTh1q1URwewPAQRqmBWM-lPbqOZdOX4Qmcsr2yBW94l4FB7fLbbpPqlZ0A1EFO23dNLU0FBHAa8oAPGXo7yz5JF8dD1Zd5T3sUOhcHRXSBuOQSW8wnWLO48KhkWAtSGOpPbYc/s1600/nb69_vaadin_23.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488847792011888578" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQOjBZn1CTh1q1URwewPAQRqmBWM-lPbqOZdOX4Qmcsr2yBW94l4FB7fLbbpPqlZ0A1EFO23dNLU0FBHAa8oAPGXo7yz5JF8dD1Zd5T3sUOhcHRXSBuOQSW8wnWLO48KhkWAtSGOpPbYc/s400/nb69_vaadin_23.jpg" /></a> 프로젝트에서 마우스 오른쪽 클릭 - 실행<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6HRwjaD23rHJIp_-z87cx03YI03na1z28nGPVO4tbeyDWqnHpuiBuxfQCKyttqqkOv6CXkk3Vfpdcsw_K0jjgv_CBr9loNtHGAQScX946xGXzzYrwB0Ei56ZoNcBelgNQUfxnukL4Orc/s1600/nb69_vaadin_24.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488847763923577090" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6HRwjaD23rHJIp_-z87cx03YI03na1z28nGPVO4tbeyDWqnHpuiBuxfQCKyttqqkOv6CXkk3Vfpdcsw_K0jjgv_CBr9loNtHGAQScX946xGXzzYrwB0Ei56ZoNcBelgNQUfxnukL4Orc/s400/nb69_vaadin_24.jpg" /></a> 그럼 아까와 다른 모양의 버튼 및 배경 등이 나타나는 걸 확인할 수 있습니다. (runo 적용)<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZK9-lnlJp2KKEakwcnfs1ow9LJChXEciEzyNlcHgBxlJ7gQZ8ffjFEPrEXiXvIeWsoDW4WBk5xADwa8MakXAjpKRv8GKKtpGB_Su4nj7KYc7g9F0IEZ9LRCIVLilzvsx7vWfx0koIhGA/s1600/nb69_vaadin_25.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 181px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488847746703710402" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZK9-lnlJp2KKEakwcnfs1ow9LJChXEciEzyNlcHgBxlJ7gQZ8ffjFEPrEXiXvIeWsoDW4WBk5xADwa8MakXAjpKRv8GKKtpGB_Su4nj7KYc7g9F0IEZ9LRCIVLilzvsx7vWfx0koIhGA/s400/nb69_vaadin_25.jpg" /></a> 이제 커스텀, 사용자 정의 Vaadin Theme를 만들어 보도록 하겠습니다.<br />사용자 정의 테마는 반드시 웹폴더(Web Pages)아래 VAADIN/themes 구조아래 폴더를 만들어야 합니다.<br />따라서 이 규칙으로 만약 angel 이라는 사용자 정의 테마를 만든다면 web/VAADIN/themes/angel 로 경로가 만들어져야 합니다.<br />그리고 모든 테마는 반드시 styles.css(철자 주의) 라는 이름의 스타일시트 파일을 포함해야 합니다.<br />이 두 가지(path와 stylesheer)를 제외하고 기타 다른 내용은 적절히 알아서 작업하면 됩니다.<br />참고로 보통 이미지에 관한 사항은 imgs, 레이아웃 관련해서는 layouts , 그리고 추가 스타일시트는 css로 보통 서브폴더 작업을 하는게 네이밍 컨벤션이라고 할 수 있겠습니다.<br />우선 하나씩 폴더를 만듭니다. 일단 프로젝트의 Web Pages에서 마우스 오른쪽 클릭, 새로만들기 - other<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRuXjzRZIssGRuB1aFUGk1sQm5OJh9VuQBIA3NmqWUZOzJMeY7ypNuGlXFH-aC22Bb6b5A1kRxzud2uRAttDmrbSRXu1Ga4D5UHNkCHBeKNgD6o6YitRWttTxwqDTXuBZ9FPGxaeKYTuc/s1600/nb69_vaadin_26.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488851738060114386" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRuXjzRZIssGRuB1aFUGk1sQm5OJh9VuQBIA3NmqWUZOzJMeY7ypNuGlXFH-aC22Bb6b5A1kRxzud2uRAttDmrbSRXu1Ga4D5UHNkCHBeKNgD6o6YitRWttTxwqDTXuBZ9FPGxaeKYTuc/s400/nb69_vaadin_26.jpg" /></a> 카테고리에서 기타, file types 에 보면 맨아래 폴더가 있습니다. 다음<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhag-2V4L7coJn1xI_zLIltrCl-kDikPn9QbXC8n-h581A6S9f4hJ0ZLIBUiAuzjqwq4e0rkrH8IQruQO7W5I7Gcrs0pIvdx2rxi-7ljcK-F-ePGrNf1gitmDXSCLBd38xJbLe2iXY7_us/s1600/nb69_vaadin_27.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488851729945758594" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhag-2V4L7coJn1xI_zLIltrCl-kDikPn9QbXC8n-h581A6S9f4hJ0ZLIBUiAuzjqwq4e0rkrH8IQruQO7W5I7Gcrs0pIvdx2rxi-7ljcK-F-ePGrNf1gitmDXSCLBd38xJbLe2iXY7_us/s400/nb69_vaadin_27.jpg" /></a> 폴더 이름은 VAADIN 으로, 그리고 경로는 web 으로 지정합니다. 마침<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgibIZ3t0ohVKXH5QwFyXPvtmWg_T6N3enWJDShOYkzwgHAV-JhhXqdgygiMcamS2OrDLkX8_kSxS-lkPYAFEaPAhdWORMBcxdst2GSLjkeU3iRUxBRUP0gS7ZEgKdMiXgszAEBn-plcg8/s1600/nb69_vaadin_28.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488851728667619186" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgibIZ3t0ohVKXH5QwFyXPvtmWg_T6N3enWJDShOYkzwgHAV-JhhXqdgygiMcamS2OrDLkX8_kSxS-lkPYAFEaPAhdWORMBcxdst2GSLjkeU3iRUxBRUP0gS7ZEgKdMiXgszAEBn-plcg8/s400/nb69_vaadin_28.jpg" /></a> 그리고 다시 VAADIN 폴더 아래 themes 폴더를 또 만들어야 하므로 같은 절차로 진행합니다.<br />프로젝트 창의 좀전에 만든 VAADIN 폴더에서 마우스 오른쪽 클릭, 새로만들기-폴더<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLlNoBzMUtda1cr-X5-JqYV18xvpmb_KUfw9n2layy2ok8uW9uXR0CaXlays6jlF5JoPeU8VMSeFBYgrZtehlinfcZ4hV-ksfW3DW3ipkCGop0cQxou2_Wi6uaW7ZP9OINwn21BH3jOz8/s1600/nb69_vaadin_29.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488851717279544482" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLlNoBzMUtda1cr-X5-JqYV18xvpmb_KUfw9n2layy2ok8uW9uXR0CaXlays6jlF5JoPeU8VMSeFBYgrZtehlinfcZ4hV-ksfW3DW3ipkCGop0cQxou2_Wi6uaW7ZP9OINwn21BH3jOz8/s400/nb69_vaadin_29.jpg" /></a> 폴더 이름은 themes , 경로는 web/VAADIN 으로 맞춥니다. 마침<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCGqMQQxwzKQjnRwjrxb6y5MzceD0y1xIosBhmb8QpzzyiaujPEM61N06fk6kDUBU_YPKfafX3IdcFkVYvLnkMGqd_BpHiQCZh1sAg4zsGhrlZUiC3FLV39Y4n4qp-s6ukmKuW00tKJ88/s1600/nb69_vaadin_30.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488851709533361298" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCGqMQQxwzKQjnRwjrxb6y5MzceD0y1xIosBhmb8QpzzyiaujPEM61N06fk6kDUBU_YPKfafX3IdcFkVYvLnkMGqd_BpHiQCZh1sAg4zsGhrlZUiC3FLV39Y4n4qp-s6ukmKuW00tKJ88/s400/nb69_vaadin_30.jpg" /></a> 이제 마지막으로 본인 테마 폴더를 만듭니다. 역시 좀전에 만든 themes 에서 마우스 오른쪽 클릭, 새로만들기 - 폴더<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWUwIPijJZJDNkChI4Y8jI9GlTghl0A48tT46n-xCeBH5TktgWPvChmy9SHw8Z1spgP0JFz7VzMMN-WDiWkeEXZlRQiPhu48GAuY_G_QF5BUaFUl8BejmN6uYQU-fxjlFyFKDMbKp2KOo/s1600/nb69_vaadin_31.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488859568233331826" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWUwIPijJZJDNkChI4Y8jI9GlTghl0A48tT46n-xCeBH5TktgWPvChmy9SHw8Z1spgP0JFz7VzMMN-WDiWkeEXZlRQiPhu48GAuY_G_QF5BUaFUl8BejmN6uYQU-fxjlFyFKDMbKp2KOo/s400/nb69_vaadin_31.jpg" /></a> 폴더 이름을 mytheme 라고 줬습니다. 경로는 web/VAADIN/themes 로 설정되어 있습니다.<br />마침<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRQi14iLKz-0UkU9jP_Wq4F_DdcIWkhp7tSXXnXPo_p9VW7PWLl_zThU6wvPZJyUourkDwOT11muQZGO8rOA_TqDiwZ0Ezt5tyaq4E64WbcRZ-cg4ryb_6l7UyU6OckuLYOcdMuqUvTpk/s1600/nb69_vaadin_32.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488859561204880946" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRQi14iLKz-0UkU9jP_Wq4F_DdcIWkhp7tSXXnXPo_p9VW7PWLl_zThU6wvPZJyUourkDwOT11muQZGO8rOA_TqDiwZ0Ezt5tyaq4E64WbcRZ-cg4ryb_6l7UyU6OckuLYOcdMuqUvTpk/s400/nb69_vaadin_32.jpg" /></a> 그럼 이제 이 mytheme에서 이번엔 스타일시트 파일을 만듭니다.<br />마우스 오른쪽을 클릭하여 새로 만들기 - 종속형 파일(CSS)<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhw7j3mv8WM8YLiirNIgznSRz7mjeeHu5j7HbMpo3baYbsZ9HR1WbTSC-yHm9Lusvk5Qy27kgLeLpy151mnugxbNGkV4SQ_g1XpTFP_xv96h4NZZJno-SxqqFEF85PR0srebq21U6adoT0/s1600/nb69_vaadin_33.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488859557363757522" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhw7j3mv8WM8YLiirNIgznSRz7mjeeHu5j7HbMpo3baYbsZ9HR1WbTSC-yHm9Lusvk5Qy27kgLeLpy151mnugxbNGkV4SQ_g1XpTFP_xv96h4NZZJno-SxqqFEF85PR0srebq21U6adoT0/s400/nb69_vaadin_33.jpg" /></a> 파일이름은 반드시 styles 라고 줍니다.<br />해당 파일의 경로를 확인하면 다음과 같습니다.<br />web/VAADIN/themes/mytheme<br />마침<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRJdSXZzb9xHsWLUTENqMY7-gojWihF4GdzLng5iiJWDub3tof0nt147_bEekeGIEQ3sNc7qv6BOk5-HWOJx12qe2bGNfNPwwJNNXoA0xfXv1RB531O0SkqC-T8XS8MevQoHwIa4JwGKw/s1600/nb69_vaadin_34.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488859548497883010" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRJdSXZzb9xHsWLUTENqMY7-gojWihF4GdzLng5iiJWDub3tof0nt147_bEekeGIEQ3sNc7qv6BOk5-HWOJx12qe2bGNfNPwwJNNXoA0xfXv1RB531O0SkqC-T8XS8MevQoHwIa4JwGKw/s400/nb69_vaadin_34.jpg" /></a> 그럼 안에 내용을 작성합니다.<br />==============================================================<br />@import "../runo/styles.css";<br />/* Import the runo theme for components not described in your CSS files*/<br />.v-button {<br />display: inline-block;<br />zoom: 1;<br />text-align: center;<br />text-decoration: none;<br />border: 2px outset #fff;<br />background: #f00;<br />cursor: pointer;<br />white-space: nowrap;<br />margin: 0;<br />padding: .2em 1em;<br />color: inherit;<br />font: inherit;<br />line-height: normal;<br />-khtml-user-select: none;<br />-moz-user-select: none;<br />-ie-user-select: none;<br />user-select: none;<br />-webkit-box-sizing: border-box;<br />-moz-box-sizing: border-box;<br />-ms-box-sizing: border-box;<br />box-sizing: border-box;<br />}<br />/* this is the Vaadin CSS class for a button client */<br />==============================================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzxAVPvqROQSyYScV_MZrGamqBA5CXnN1BNSSDGuFf3HMscxKguy3_SJQKCRs7vSN1KILPi3-S4UdXdXvYef-kYAHR-fpd9JquF3DPesNNVJaDBYQfJgA4bmwzP1mHiTxWWynwLe1-_aY/s1600/nb69_vaadin_35.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488859543157775442" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzxAVPvqROQSyYScV_MZrGamqBA5CXnN1BNSSDGuFf3HMscxKguy3_SJQKCRs7vSN1KILPi3-S4UdXdXvYef-kYAHR-fpd9JquF3DPesNNVJaDBYQfJgA4bmwzP1mHiTxWWynwLe1-_aY/s400/nb69_vaadin_35.jpg" /></a> 그럼 작성된 테마를 설정하기 위해 MyApplication.java 파일을 열어 runo 대신 mytheme 라고 바꿔줍니다. (그림 참고)<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxKcgbQzYn1zWzYvCdvyLzdJm0dRyaD3qwqVKH4Cvo-TJqEPWabkh4dcWYt6m50ZNVc0ZJ7eQ3oia9kmGp16787NdfAHu2jzADmQtp_fBuuruwf8ecWibJmd7As1kAmKTRxg3y37qnyjM/s1600/nb69_vaadin_36.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488861022034307298" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxKcgbQzYn1zWzYvCdvyLzdJm0dRyaD3qwqVKH4Cvo-TJqEPWabkh4dcWYt6m50ZNVc0ZJ7eQ3oia9kmGp16787NdfAHu2jzADmQtp_fBuuruwf8ecWibJmd7As1kAmKTRxg3y37qnyjM/s400/nb69_vaadin_36.jpg" /></a> 그리고 다시 프로젝트를 빌드 합니다. 프로젝트에서 마우스 오른쪽 지우고 빌드<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVeVvrAsL6yOqwYZkNEuKYTFrWKPWj1mUsoFFMU33fh0Uc95EnQ2x0F5pV3BJQO0wG6aVUjj2u-IVgBjw-Xodc_u7jBM_LwzbDZEJ4Gp8fGhUE1rKrpeEta0tamhCjLKR75YdZFoHhZNo/s1600/nb69_vaadin_37.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488861011591361714" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVeVvrAsL6yOqwYZkNEuKYTFrWKPWj1mUsoFFMU33fh0Uc95EnQ2x0F5pV3BJQO0wG6aVUjj2u-IVgBjw-Xodc_u7jBM_LwzbDZEJ4Gp8fGhUE1rKrpeEta0tamhCjLKR75YdZFoHhZNo/s400/nb69_vaadin_37.jpg" /></a> 해당 프로젝트를 실행합니다<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKpguLqX9Tw6LtCsv0VirOdH2msBWsTLDwVD1v4xm-xPJgz6HBXWL0Nnz4SCN4Zk1adVAI-OEa0MCOg2SfommX-lxFZp9dWRxgRi1Ro9nJNglvs2KVaCunhHK_E8wfGAMxLTUgCzl6hyphenhyphenI/s1600/nb69_vaadin_38.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488861010182010722" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKpguLqX9Tw6LtCsv0VirOdH2msBWsTLDwVD1v4xm-xPJgz6HBXWL0Nnz4SCN4Zk1adVAI-OEa0MCOg2SfommX-lxFZp9dWRxgRi1Ro9nJNglvs2KVaCunhHK_E8wfGAMxLTUgCzl6hyphenhyphenI/s400/nb69_vaadin_38.jpg" /></a> 스타일시트에 제공된 대로 버튼의 배경(background)가 빨강색으로 바꿔져 있는걸 확인할 수 있습니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsk5MCPSwic9NABAd1Z58Eg2SZHigZ2FRKizR8-MtFAjbhMwNO1oE0FidEIoaUUpRb4bTjWkIAHAvlhh6o8yXkefvKIHCib4F-pQmT6Iw9a6iNiFsGIyfcGVRA5AY_xPq6hBic29wPet0/s1600/nb69_vaadin_39.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 181px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488861000534084050" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsk5MCPSwic9NABAd1Z58Eg2SZHigZ2FRKizR8-MtFAjbhMwNO1oE0FidEIoaUUpRb4bTjWkIAHAvlhh6o8yXkefvKIHCib4F-pQmT6Iw9a6iNiFsGIyfcGVRA5AY_xPq6hBic29wPet0/s400/nb69_vaadin_39.jpg" /></a> 그럼 이제 여기서 좀더 Vaadin UI 컴포넌트와 리스터를 결부시켜 복잡한 어플리케이션을 만들어 보도록 하겠습니다.<br />우선 새창에 관한 클래스 설계를 위해 자바클래스를 추가합니다.<br />프로젝트의 src 아래 com.example.vaadin 패키지에서 오른쪽 마우스 클릭 (이렇게 하면 해당 위치가 경로로 자동으로 들어가기 때문에 이렇게 하는 거고, 그냥 하면 나중에 드래그 메뉴등으로 경로를 선택해주면 됩니다), 새로 만들기-자바 클래스<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWp22AaRpd81hrkvVF2YFgxIs5ro1dgUTQWK6AF5psr3e0QnvijLjVvfdiL-DOsaFHiVeczOuUnk60PwGBtpxnh817BonbREtxAvUoXfVQpBsaiYS2g3sicsvfGFABfkPKoKDhkdo72Qo/s1600/nb69_vaadin_40.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488860992126302418" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWp22AaRpd81hrkvVF2YFgxIs5ro1dgUTQWK6AF5psr3e0QnvijLjVvfdiL-DOsaFHiVeczOuUnk60PwGBtpxnh817BonbREtxAvUoXfVQpBsaiYS2g3sicsvfGFABfkPKoKDhkdo72Qo/s400/nb69_vaadin_40.jpg" /></a> 클래스 이름은 MyFirstWindow,<br />패키지 이름은 com.example.vaadin 으로 선택합니다. - 마침<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSRu4JvnVNO_pK2HVLj7k_jGjusPejoilLWlVTcsHxazbb-SQf_cTvCjbLNcW6WpCky_HCDWg9u029sSYu0ml3H3qWD2Xyr538SiTng6NVKTuasbnAewxwPgjNl4Vq5m0xqQ0s6fBYlcI/s1600/nb69_vaadin_41.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488862449392250178" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSRu4JvnVNO_pK2HVLj7k_jGjusPejoilLWlVTcsHxazbb-SQf_cTvCjbLNcW6WpCky_HCDWg9u029sSYu0ml3H3qWD2Xyr538SiTng6NVKTuasbnAewxwPgjNl4Vq5m0xqQ0s6fBYlcI/s400/nb69_vaadin_41.jpg" /></a> 아래 내용을 작성합니다. 굵은 글씨<br />==============================================================<br />package com.example.vaadin;<br />public class MyFirstWindow <strong>extends Window</strong>{<br /><strong>public MyFirstWindow(String windowName){<br />this.setCaption(windowName);<br />this.setPositionX(100);<br />this.setPositionY(100);<br />this.setWidth(500, Window.UNITS_PIXELS);<br />this.setHeight(500, Window.UNITS_PIXELS);<br />this.addComponent(new Button("Button 1"));<br />this.addComponent(new Button("Button 2"));<br />}</strong><br />}<br />==============================================================<br />그리고 임포트 오류문제는 fix import(가져오기 고정, 단축키 Ctrl+Shift+I)로 해결합니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkyW8xosRPRZcNb4IdOcc6OXV0zn1RlA21pJD8nOinogo4Mr-WEZcUt5THOy9mIIZO1hDuOHlzH0Ye8ObQAVqqhvzXpSJBu_bX57_27Rzc1YqyVE0YGf6ypXgGDKEFfPDgQeTY6rb9QJg/s1600/nb69_vaadin_42.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488862446573251474" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkyW8xosRPRZcNb4IdOcc6OXV0zn1RlA21pJD8nOinogo4Mr-WEZcUt5THOy9mIIZO1hDuOHlzH0Ye8ObQAVqqhvzXpSJBu_bX57_27Rzc1YqyVE0YGf6ypXgGDKEFfPDgQeTY6rb9QJg/s400/nb69_vaadin_42.jpg" /></a> 버튼과 라벨에 대해 임포트 클래스를 묻는데 모두 vaadin 것으로 선택합니다. OK<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivIRxkhb74acf7_GSWjHYsc1MEX38StG1jq6GQnDumrC4LYl_YC-HUULBzu4aBoMFznR6pbuHT5ZRVo76rilpKJcgODZx5VIWX30wL1SlxQsWo5LSL6CJlS4Trd0B_4RkNTiALW6MoV64/s1600/nb69_vaadin_43.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 386px; DISPLAY: block; HEIGHT: 240px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488862440070327602" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivIRxkhb74acf7_GSWjHYsc1MEX38StG1jq6GQnDumrC4LYl_YC-HUULBzu4aBoMFznR6pbuHT5ZRVo76rilpKJcgODZx5VIWX30wL1SlxQsWo5LSL6CJlS4Trd0B_4RkNTiALW6MoV64/s400/nb69_vaadin_43.jpg" /></a>코드 확인<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlLKZtqEOryDNRjPhyphenhyphenr_sMPOrik3Op837bFr-F71jFOTxLU1NLXuCQ9SM340lLhVeSpVh8NRIkQ5ZajZYN2On1AjDyKz2TYuSCLBBYKA58tvenRuYdLGnqlL9ZDePQwLivzQBKRNJCHv8/s1600/nb69_vaadin_44.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488862434944713538" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlLKZtqEOryDNRjPhyphenhyphenr_sMPOrik3Op837bFr-F71jFOTxLU1NLXuCQ9SM340lLhVeSpVh8NRIkQ5ZajZYN2On1AjDyKz2TYuSCLBBYKA58tvenRuYdLGnqlL9ZDePQwLivzQBKRNJCHv8/s400/nb69_vaadin_44.jpg" /></a> 다시 MyApplication.java 파일로 돌아가서(Ctrl+tab키를 이용하면 편합니다). 아래 내용으로 바꿉니다.<br />=======================================================================</p><p>...<br />public class MyApplication extends com.vaadin.Application implements Button.ClickListener{<br />private Button b;<br />public void init() {<br />setTheme("mytheme");<br />Window main = new Window("Hello NetBeans ");<br />setMainWindow(main);<br />main.addComponent(new Label("Hello World!"));<br />b=new Button("My Button");<br />main.addComponent(b);<br />b.addListener(this);<br />}<br /><br />//When the client clicks button b, the browser shows a window in the client zone<br />public void buttonClick(ClickEvent event) {<br />if(event.getButton()==this.b){<br />this.getMainWindow().addWindow(new MyFirstWindow("This is my first window!"));<br />}<br />}<br />}<br />========================================================================<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYnCkRThfJ4AgWQAWCXtjB8iA1LnrrGQXFyLHKPuGMdZhP2HCuVKDSZBfInah6oAsxORWPvcpgZPEtv9HFkLtHvxSvRhAgWTra5h4HFaz24YcS5hZ_QavFEd0iDH9MDMfI9RfEHq8e24U/s1600/nb69_vaadin_45.jpg"></p></a><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488862427531854338" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYnCkRThfJ4AgWQAWCXtjB8iA1LnrrGQXFyLHKPuGMdZhP2HCuVKDSZBfInah6oAsxORWPvcpgZPEtv9HFkLtHvxSvRhAgWTra5h4HFaz24YcS5hZ_QavFEd0iDH9MDMfI9RfEHq8e24U/s400/nb69_vaadin_45.jpg" /> ClickEvent 의 임포트 문제를 해결하려면 앞의 전구모양의 아이콘을 마우스로 클릭하면 해결에 대한 팝업창이 나타납니다. 첫번째에 있는 com.vaadin.ui.Button.ClickEvent 에 대해 가져오기 추가를 클릭하면 임포트가 자동 작성됩니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidJcqwW9iz99CaUUauUzmEqlezJrhMhhNAC7QXvi8nIocLFYefyWqVmfUOUPkTKTEjPwL8YRNIjItuP5rLjypddalz4w9M0rptvPVVnjL7HTdjrMCJ8EFBCH_YwRsnxb2NthD4pMGpPBk/s1600/nb69_vaadin_46.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488863988485809858" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidJcqwW9iz99CaUUauUzmEqlezJrhMhhNAC7QXvi8nIocLFYefyWqVmfUOUPkTKTEjPwL8YRNIjItuP5rLjypddalz4w9M0rptvPVVnjL7HTdjrMCJ8EFBCH_YwRsnxb2NthD4pMGpPBk/s400/nb69_vaadin_46.jpg" /></a> 저장하고, 프로젝트를 다시 빌드(지우고 다시 빌드) 한 후, 실행합니다<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQONloUWD6rWKOJwLXMXxRgIOohUx4yXhn8LKrInZqUnK5JARmANAU9FpxqxTQb-MIyx98SatZIxnI8cblhBgaoOz8BnOyL-xg7IBpy52GGbogOXTGq-UTYbJotLNrvN-ILFnbReZzC7o/s1600/nb69_vaadin_47.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488863983591330418" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQONloUWD6rWKOJwLXMXxRgIOohUx4yXhn8LKrInZqUnK5JARmANAU9FpxqxTQb-MIyx98SatZIxnI8cblhBgaoOz8BnOyL-xg7IBpy52GGbogOXTGq-UTYbJotLNrvN-ILFnbReZzC7o/s400/nb69_vaadin_47.jpg" /></a> 왼쪽 상단의 버튼을 클릭하면 가운데 새로운 창이 나타납니다. (버튼 클릭시 마다 창이 계속 겹쳐지고, 이 창들은 마우스로 옮기거나 크기를 변경할 수도 있습니다. 각자 해보십시오 ^^;)<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwRsOuha4R4kNOQj4CxbVxxQ1DuxEYAgVYCH7or-q_KY_RnCCLkcRuE-UrJk05H0mIbB76jIKxOMPKk_omEtwsdQDObHN2vGKyKyCODSraXZj7p0cdiF7ijtkxQoR2uE59lTpp9q_teEs/s1600/nb69_vaadin_48.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 284px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488863976258265266" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwRsOuha4R4kNOQj4CxbVxxQ1DuxEYAgVYCH7or-q_KY_RnCCLkcRuE-UrJk05H0mIbB76jIKxOMPKk_omEtwsdQDObHN2vGKyKyCODSraXZj7p0cdiF7ijtkxQoR2uE59lTpp9q_teEs/s400/nb69_vaadin_48.jpg" /></a> ************************************************************<br />그럼 마지막으로 디버깅 작업을 해보도록 하겠습니다. 뭐 방법은 다른 디버깅과 별 차이가 없습니다.<br />MyApplication 클래스에서 Window main = new Window("Hello Netbeans");<br />에서 Ctrl+F8를 누르거나 왼쪽 라인표시 있는 곳에 마우스를 클릭하면 디버깅 브레이크포인트(중단점)이 핑크색 줄로 표시됩니다.<br />역시 마찬가지 방법으로 아래 if(event.getButton() == this.b) { 이곳에도 중단점을 표시합니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi61jE9KDeJc9Bq5gjCZAW_j__HA2P6Af0oxuTNxA9JS-1dEt_ylaem3mKycBh7AQAehqYWOdcDgvNr94qLQW9LJMoLDmnpsOP1PcDLpiEC7c7IU7zoL3H1fWNegxj2BTsu-flVlCSaUU8/s1600/nb69_vaadin_49.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488863966303222002" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi61jE9KDeJc9Bq5gjCZAW_j__HA2P6Af0oxuTNxA9JS-1dEt_ylaem3mKycBh7AQAehqYWOdcDgvNr94qLQW9LJMoLDmnpsOP1PcDLpiEC7c7IU7zoL3H1fWNegxj2BTsu-flVlCSaUU8/s400/nb69_vaadin_49.jpg" /></a>그런 다음 프로젝트 디버깅을 하는데 만약 이 프로젝트가 메인 프로젝트면 Ctrl+F5 키, 위의 메뉴에 디버그 아이콘 등을 사용하시거나, 메인 프로젝트가 아니라면 프로젝트에서 마우스 오른쪽 클릭해서 디버그 메뉴를 서낵합니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6e-mV50FUtQxSx5Yof5Vi6mav7EwZqfQgQj6c2ZWmUq7QcyvcW0PzSNRYmtyCgi_Z_S8jgwpRxMqGX7FO70tT2j-zBEY1F7jrwE1OWFTbC5UWUr9a_Ve9_Beqj-XtCMuixlX-taKQ_QQ/s1600/nb69_vaadin_50.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488863960023802418" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6e-mV50FUtQxSx5Yof5Vi6mav7EwZqfQgQj6c2ZWmUq7QcyvcW0PzSNRYmtyCgi_Z_S8jgwpRxMqGX7FO70tT2j-zBEY1F7jrwE1OWFTbC5UWUr9a_Ve9_Beqj-XtCMuixlX-taKQ_QQ/s400/nb69_vaadin_50.jpg" /></a> 디버그 창이 열리고 디버그 콘솔등이 출력됩니다. 중단점에서 정지되며 녹색으로 표시됩니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPjpzFHAfFbz2XieS8y1vZ4y-LoyMOTPJwgZqJQyO59pni-aEsS1fX3Ez-yrZBl5sFiO8KpEnGooFJHK-U7En-P7kkVlVnTPHfCJ3tORaCD2piMy2Cki_kYnT8mU5sMQJ8_favw7N789k/s1600/nb69_vaadin_51.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488872372270394146" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPjpzFHAfFbz2XieS8y1vZ4y-LoyMOTPJwgZqJQyO59pni-aEsS1fX3Ez-yrZBl5sFiO8KpEnGooFJHK-U7En-P7kkVlVnTPHfCJ3tORaCD2piMy2Cki_kYnT8mU5sMQJ8_favw7N789k/s400/nb69_vaadin_51.jpg" /></a> 아래 Debugger Console 을 보면 해당 내용이 제시되고, 계속 진행하려면 F5키나 continue 아이콘을 누르면 다음으로 진행됩니다.<br />그런 다음 브라우저에서 버튼을 누르면 다시 2차 중단점으로 이동하고 buttonClick 메소드의 중단점이 녹색으로 나타납니다. <br />기타 step over, into, out 등은 아이콘을 적절히 사용하시면 됩니다. <br />디버그 세션 종료 단축키는 Shift+F5 입니다. <br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAATmT7Rpki5rQ6y4Chp9p6FYAy2xxU3cS3tQVU3N10pNpd3FdbAvmROveIC-JTce6_jQTYx1tuYeZ-T8p90mcECJ-1rf007nknIdiI1hJzFEIYzvSI5waoMBDSZrvWA0kD6f4Vf-mZ-A/s1600/nb69_vaadin_52.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488872366706013522" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAATmT7Rpki5rQ6y4Chp9p6FYAy2xxU3cS3tQVU3N10pNpd3FdbAvmROveIC-JTce6_jQTYx1tuYeZ-T8p90mcECJ-1rf007nknIdiI1hJzFEIYzvSI5waoMBDSZrvWA0kD6f4Vf-mZ-A/s400/nb69_vaadin_52.jpg" /></a><br />이상 간단하게 Vaadin 프레임워크 설치 및 기본 사용법을 알아봤습니다.<br />추후 시간되는 대로 여러 편리한 컴포넌트 사용이나 JSON 메시지 사용 등에 대해서도 올려드리겠습니다. ^^;<br />수고하셨습니다.강여사(J.Y.Kang)http://www.blogger.com/profile/17450510931308610527noreply@blogger.com0tag:blogger.com,1999:blog-6811062799606447528.post-37058856817689097362010-06-29T17:37:00.000-07:002010-07-01T04:03:02.153-07:00넷빈(NetBeans)6.9에서 스프링3.0 사용하기-01-소개이번 게시물에서는 스프링 프레임워크를 사용해 간단한 웹 MVC 어플리케이션을 만들어보도록 하겠씁니다.<br /><br />어플리케이션은 이름을 받아서 ok를 하면 2번째 페이지에 인사메시지와 함께 내용이 표시되는 샘플예제입니다.<br /><br />예전에도 이 내용의 게시물은 올려놨었습니다.<br /><br />다만 이번에 또 소개하는 이유는 넷빈 6.9에서 기본적으로 탑재되는 스프링 3.0 때문이죠. ^^;<br /><br />현재 IDE에는 스프링 프레임워크 3.0과 2.5가 둘다 기본으로 빌트인 되어 있습니다.<br /><br />프로젝트에서 프레임워크를 선택하면 자동으로 여러 필요 설정들이 기본적으로 구축되구요.(이런 마법사 기능이 없다면 노가다 --; 로 하면 됩니다. 안될건 없죠.)<br /><br />구성설정은 스프링 웹 MVC DispatcherServlet 의 이름 및 매핑 등을 제공합니다. JSTL 라이브러리가 옵션으로 등록될 수 있고, 스프링 XML 빈 설정 파일들이, 다음 기능들도 포함해서 함께 제공됩니다.<br /><br />* 코드 완성. 스프링 XML 설정 파일에서 빈 참조뿐만 아니라 자바 클래스를 위한 호출<br />* 내비게이션. 기타 스프링 빈 참조에 하이퍼링크뿐만 아니라, 스프링 빈 정의에서 언급된 자바 클래스나 속성에도 하이퍼링크 제공<br />* 리팩토링. 스프링 XML 설정 파일에서 자바 클래스 참조 이름 바꾸기 제공.<br /><br />뭐 자세한 내용은 항상 스프링 홈페이지 (<a href="http://www.springsource.org/">http://www.springsource.org/</a>) 및 <a href="http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/">Spring Framework Reference Documentation</a> 나 <a href="http://static.springsource.org/spring/docs/3.0.x/javadoc-api/">Spring Framework API documentation</a> 를 참고하시기 바랍니다.<br /><br />그럼 다시 주제로 돌아가서 넷빈 6.9에서 간단한 스프링 웹 MVC 지원에 대해 알아보겠습니다.<br /><br />환경은 다음과 같습니다.<br /><br />넷빈즈 6.9<br />JDK 6 (현재 저는 JDK6update20 입니다)<br />글래스피시 v 3.0.1 (넷빈 6.9에 기본)<br /><br />우선 새 프로젝트를 만듭니다. 프로젝트 창에서 마우스 오른쪽 클릭 - 새 프로젝트<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhs5IMbN2cmvkWpxcAOXJRhVdUqrnjdYwIxXgq8FEvjXkkFryJ0NhcTQKB5cTWcb8dP0JlmAlm17VtqceeeiF6tRKtJatHi0MDhe8B10PFxO_yxH83HjxtdgNajoJrtLVUaITisainteCuW/s1600/nb69_spring_basic_01.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488362621986877026" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhs5IMbN2cmvkWpxcAOXJRhVdUqrnjdYwIxXgq8FEvjXkkFryJ0NhcTQKB5cTWcb8dP0JlmAlm17VtqceeeiF6tRKtJatHi0MDhe8B10PFxO_yxH83HjxtdgNajoJrtLVUaITisainteCuW/s400/nb69_spring_basic_01.jpg" /></a> 카테고리에서 Java Web, 프로젝트는 Web Application - 다음<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiv9RkGFSZO5cmOn6K-Bh-7t8xsTciKLBRrLzZ-ZTG7Tb-TAzgo3OYHgvZAgzPHyTo5W5Aw_y6jEuk7xTHJlbPIPpyGJ-tPjTn4j0y1wmw7p4h8nmWCbwC22_zXS_mTxawMkw6OMJysyx-v/s1600/nb69_spring_basic_02.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 279px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488362617881708226" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiv9RkGFSZO5cmOn6K-Bh-7t8xsTciKLBRrLzZ-ZTG7Tb-TAzgo3OYHgvZAgzPHyTo5W5Aw_y6jEuk7xTHJlbPIPpyGJ-tPjTn4j0y1wmw7p4h8nmWCbwC22_zXS_mTxawMkw6OMJysyx-v/s400/nb69_spring_basic_02.jpg" /></a> 프로젝트 이름은 적당히.. 저는 HelloSpring 으로 줬습니다.<br />경로 역시 적당히..<br />다음<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEic46m_0m0wvwfMJnBYuRp8se6Od18mY0TtmC8d2Apc6GHtsMtFozQ8VEC2FmN23Z70WhT3QpXAkfTraXBu0Ruvj4w1QSFSjCnKnIe3xLYQxO5UCh7yiIeAJ2IzcrcWTABxka_Z0N-k_VKH/s1600/nb69_spring_basic_03.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488362613310954722" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEic46m_0m0wvwfMJnBYuRp8se6Od18mY0TtmC8d2Apc6GHtsMtFozQ8VEC2FmN23Z70WhT3QpXAkfTraXBu0Ruvj4w1QSFSjCnKnIe3xLYQxO5UCh7yiIeAJ2IzcrcWTABxka_Z0N-k_VKH/s400/nb69_spring_basic_03.jpg" /></a> 서버는 기본 설정대로 진행합니다.<br />글래스피시 3.0.1<br />버전 EE6 Web<br />다음<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgo03rfmxvUB0YBvCjAXDAalwvtOxlxop0TcMudhLprSwoLVHuw3n1jawXOzghQrhqPQhYwE1BI2hslrx3diKedzviIyaeUuBaOM2HjdUdirLNPKk6Y72S0Kbz3aLEOfBZi16SryZCouJPw/s1600/nb69_spring_basic_04.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 251px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488362605004010626" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgo03rfmxvUB0YBvCjAXDAalwvtOxlxop0TcMudhLprSwoLVHuw3n1jawXOzghQrhqPQhYwE1BI2hslrx3diKedzviIyaeUuBaOM2HjdUdirLNPKk6Y72S0Kbz3aLEOfBZi16SryZCouJPw/s400/nb69_spring_basic_04.jpg" /></a> 프레임워크 선택에서 Spring Web MVC 를 선택합니다.<br />그럼 아래 스프링 프레임워크 라이브러리 버전 선택이 있습니다.<br />현재 빌트인으로 들어있는 버전은 그림과 같이 2종류 입니다. (3.0과 2.5)<br />그림처럼 Spring Framework 3.0.2 Release 를 선택하도록 하겠습니다.<br />아래 보면 JSTL(JavaServer Pages Standard Tag Library) 라이브러리가 기본적으로 포함되도록 되어 있습니다. 사실 이 예제에서는 JSTL 을 쓸 일이 없기 때문에 해제 하셔도 됩니다.<br />또한 예전게시물처럼 Spring 2.5를 선택해서 진행해도 이 샘플 예제는 문제 없이 돌아갑니다.<br />그렇게되면 당연지사 Spring 3.0.x 의 새 기능들은 못 쓰겠죠 ^^; (이번 게시물을 작업한 이유는 스프링의 3.X 새 기능들을 프로젝트에서 어떻게 작업하느냐의 환경 구축이 의의라 그점을 중점으로 보시면 됩니다. 아무튼~)<br />마침.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfXXATG-izjoihttI7GWf6n_JIjzonnueYIZh2KAitLV-6DRH6jFusBgr__fnIXA6kGWGILcNYav_WZS89TivVngKnjzYD072FuG5uuKGgbDyEGQrJCxzH3hY-n1jQ89eWhE8tCJsINEr3/s1600/nb69_spring_basic_05.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 251px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488362600757804562" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfXXATG-izjoihttI7GWf6n_JIjzonnueYIZh2KAitLV-6DRH6jFusBgr__fnIXA6kGWGILcNYav_WZS89TivVngKnjzYD072FuG5uuKGgbDyEGQrJCxzH3hY-n1jQ89eWhE8tCJsINEr3/s400/nb69_spring_basic_05.jpg" /></a> 옆에 탭을 눌러 스프링 Web MVC 구성에 대해 확인합니다.<br />기본적으로 스프링 디스패처 서블릿의 이름과 매핑은 그림과 같이 작업되어 있습니다. 이 내용은 프로젝트의 여러 xml의 설정 등에 자동으로 작업되어 들어갑니다.<br />마침<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1m4LT4zL1I8DECee04izRjAuqo2Ph09XqCspf04PgQ2CzmN0-k0Lq7dPAbPRSxC6WGb4NEdS4oKhFDNQeEN45MjDX5MKXu5wcaVhRQkNy_XXg92sGyzJWW6V9b4lzNKiSMHZ__1vzmDdw/s1600/nb69_spring_basic_06.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 251px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488364844135203842" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1m4LT4zL1I8DECee04izRjAuqo2Ph09XqCspf04PgQ2CzmN0-k0Lq7dPAbPRSxC6WGb4NEdS4oKhFDNQeEN45MjDX5MKXu5wcaVhRQkNy_XXg92sGyzJWW6V9b4lzNKiSMHZ__1vzmDdw/s400/nb69_spring_basic_06.jpg" /></a>완료후, IDE 가 마법사(프로젝트의 ant 빌드 스크립트)에 의해 여러가지 내용을 작업하게 됩니다.<br />우선적으로 프로젝트의 Library 를 살펴보면 선택한 스프링 프레임워크 버전 라이브러리가 자동으로 클래스패스에 포함되어 있습니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPkuNlFiQrFPduhwAl3HN3G1v1wKsLzMCoZ_QeVJ_tUM_kCz0DU05Wsx1DoC5kmcv0gyS5keqU2xHlRkjS8bKdOwlxVdLgXPFARSSOMOYiObmZTvMDgQ-7Ijw7YvqU1xfxTDXQhHjasDWp/s1600/nb69_spring_basic_07.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488364835379547330" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPkuNlFiQrFPduhwAl3HN3G1v1wKsLzMCoZ_QeVJ_tUM_kCz0DU05Wsx1DoC5kmcv0gyS5keqU2xHlRkjS8bKdOwlxVdLgXPFARSSOMOYiObmZTvMDgQ-7Ijw7YvqU1xfxTDXQhHjasDWp/s400/nb69_spring_basic_07.jpg" /></a> 그럼 이렇게 작업된 기본 샘플 스프링 프로젝트가 어떤 내용인지 우선 실행시켜 보겠습니다.<br />프로젝트에서 오른쪽 마우스 클릭 - 실행<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPStEPtcX_yfnQJNlGeoRQnOYKBemTJ-YZT_BHs_LAe8VNgTa7rWMcA1sws2Qk5f7tOBeH_Q5tYtWbSk-53xUCf6wFzSON355rhdVKGgE7bY2baXFeXKgsJATFCy7Z9XUpondsLIRle0_d/s1600/nb69_spring_basic_08.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488364827071085186" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPStEPtcX_yfnQJNlGeoRQnOYKBemTJ-YZT_BHs_LAe8VNgTa7rWMcA1sws2Qk5f7tOBeH_Q5tYtWbSk-53xUCf6wFzSON355rhdVKGgE7bY2baXFeXKgsJATFCy7Z9XUpondsLIRle0_d/s400/nb69_spring_basic_08.jpg" /></a> 서버가 자동으로 시작 실행되고, 프로젝트 컴파일 후 서버에 배포된 다음, 브라우저가 자동으로 호출되어 프로젝트의 홈페이지가 나타나게 됩니다.<br />아래 그림으로 보이는 내용은 스프링의 웰컴 페이지로 경로는 (/WEB-INF/jsp/index.jsp) 입니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiooHAag71BiFvMpwyN54PKrgPpacjRZrjTLqZEJDZ4TnpOb8cQ2NBaejiECQs-pq-NEhIptYOQsS1YxFSdFE0jtyjGeeCJEoTUKpxA9EYVbbPcC9oHPKgyIOfs4YzS-h33U6RLdExnGKFO/s1600/nb69_spring_basic_09.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 195px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488364818967841746" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiooHAag71BiFvMpwyN54PKrgPpacjRZrjTLqZEJDZ4TnpOb8cQ2NBaejiECQs-pq-NEhIptYOQsS1YxFSdFE0jtyjGeeCJEoTUKpxA9EYVbbPcC9oHPKgyIOfs4YzS-h33U6RLdExnGKFO/s400/nb69_spring_basic_09.jpg" /></a> 여기서 약간 이상한건 해당 내용이 적혀 있는 페이지는 위의 경로에 있지만 정작, 주소 표시줄에는 *.htm 으로 되어 있습니다.<br />이 내용은 스프링의 디스패처 서블릿에 대한 모든 요청에 대한 URL 매핑 패턴에 의한 것으로 해당 내용 확인은 프로젝트의 web.xml 에 서블릿 부분을 살펴 보시면 됩니다.<br />--------------------------------------------------------------<br /><servlet><br /><servlet-name>dispatcher</servlet-name><br /><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><br /><load-on-startup>2</load-on-startup><br /></servlet><br /><br /><servlet-mapping><br /><servlet-name>dispatcher</servlet-name><br /><url-pattern>*.htm</url-pattern><br /></servlet-mapping><br />--------------------------------------------------------------<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQS8EFvJuLdRX_RhLhgsXI7O3CPPuNJhBXa7T1B_GDLuADQVjjYEmE56FmiEwPY3rffwI87iy_UQ7TUfzQPo-gE-Lzetilp4R0u93ymHbhs71_Zs-VT9G9He18-z5uRMEhgTbXD5PVGsH7/s1600/nb69_spring_basic_10.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488364813650362386" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQS8EFvJuLdRX_RhLhgsXI7O3CPPuNJhBXa7T1B_GDLuADQVjjYEmE56FmiEwPY3rffwI87iy_UQ7TUfzQPo-gE-Lzetilp4R0u93ymHbhs71_Zs-VT9G9He18-z5uRMEhgTbXD5PVGsH7/s400/nb69_spring_basic_10.jpg" /></a><br />그리고 index.htm 에 대한 요청은 redirect.jsp 페이지에 다음으로 리다이렉트 되구요.<br />--------------------------------------------------------------<br /><% response.sendRedirect("index.htm"); %><br />--------------------------------------------------------------<br />여기서 숙제(또는 질문) 이 스프링 디스패처서블릿의 패키지 포함 풀 네임 및 소속 패키지는 어디일까요? ㅎㅎㅎ (힌트 : 그림 참조)<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipHDzqhjyYNXQPnWtb8QcC3NlZZQl5U-pgKDn2bNFv7Dk8b9UHHjGx8v2aEXyGZi1UVdxQRl11HxMdDYJEXqcROhzQ_MO8EL6bny5Ph5U-VaDka6Rb9jNOD_0f9lZFREb4kLfelbn3urVr/s1600/nb69_spring_basic_11.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488367064803955346" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipHDzqhjyYNXQPnWtb8QcC3NlZZQl5U-pgKDn2bNFv7Dk8b9UHHjGx8v2aEXyGZi1UVdxQRl11HxMdDYJEXqcROhzQ_MO8EL6bny5Ph5U-VaDka6Rb9jNOD_0f9lZFREb4kLfelbn3urVr/s400/nb69_spring_basic_11.jpg" /></a><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjc7M9_c3EWwgFmrmyoyuoskbCDQBXq2a5LMPetGGQnRKSFXCN-saheuhR84gq31ctqIyWotx7ZMIIS1SIox2w-aYyyrHcQpFMZ41JPAvKWvj_8N5f4xAJWA_uNdO0uD6T-WRNXaJ82wMvJ/s1600/nb69_spring_basic_13.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488367044746064642" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjc7M9_c3EWwgFmrmyoyuoskbCDQBXq2a5LMPetGGQnRKSFXCN-saheuhR84gq31ctqIyWotx7ZMIIS1SIox2w-aYyyrHcQpFMZ41JPAvKWvj_8N5f4xAJWA_uNdO0uD6T-WRNXaJ82wMvJ/s400/nb69_spring_basic_13.jpg" /></a>이 디스패처서블릿은 dispatcher-servlet.xml 에 구성 설정을 기반으로 요청을 처리합니다.<br />아래 그림 처럼 어느 위치에서 어떤 식으로 부르면 어떻게 매핑하겠다의 내용을 구성할 수 있고, 아래 그림이나 코드에 보이는 내용은 기본으로 설정되어 있는 사항입니다.<br />---------------------------------------------------------------<br /><bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"><br /><property name="mappings"><br /><props><br /><prop key="/index.htm">indexController</prop><br /></props><br /></property><br /></bean><br /><bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" /><br /><bean name="indexController" class="org.springframework.web.servlet.mvc.ParameterizableViewController" p:viewName="index" /><br />---------------------------------------------------------------<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZK2P8EM_57-CXIhpArMnoXm3nHbBfc-IH_MsA9KiRUmEMalATyRyFX_aULhi7ZzrlW4_iWVDtPvhVI7M9DiNhkC-j7Exa3nzI2icnAXUy3QCsy8tPv0GFyPr4oXjj7Q1t5sKvXvJBEOgz/s1600/nb69_spring_basic_12.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488367057828989474" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZK2P8EM_57-CXIhpArMnoXm3nHbBfc-IH_MsA9KiRUmEMalATyRyFX_aULhi7ZzrlW4_iWVDtPvhVI7M9DiNhkC-j7Exa3nzI2icnAXUy3QCsy8tPv0GFyPr4oXjj7Q1t5sKvXvJBEOgz/s400/nb69_spring_basic_12.jpg" /></a> 이 파일에는 3개의 빈이 정의되어 있습니다 : indexController, viewResolver, urlMapping.<br />디스패처서블릿이 index.htm 와 같은 *.htm 과 일치하는 요청을 받게 되면, 요청을 처리하는 urlMapping안의 controller 를 따라가게 되어 있습니다.<br />기본 설정은 SimpleUrlHandlerMapping 이어서 /index.htm 으로 요청이 오게되면 indexController 로 매핑 되죠. 그리고 아래 indexController는 ParameterizableViewController를 상속하구요.<br />그리고 viewResolver 에 의해 앞에 /WEB-INF/jsp/ 를 접두사로, 뒤에 .jsp를 접미사로 갖는, 논리적 뷰 이름 p:viewName="index" 으로 지정된 파일이 뷰로 리턴되게 됩니다. 해서 /WEB-INF/jsp/index.jsp 가 웰컴페이지 뷰와 응답하게 되는 거죠.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiatkN9LMVYkMCtxtXWcivS6RlH3nyTRPMD5McIHM4SLlEbyimxL_zceLd_6O7WGK7Le9jrU4piTg0UWrxerX8Zpxjw5sX83cDMZWm2rV5KaaH-kmZTCZyWbPC8gQD8Sk7r9v_EljP2pEnc/s1600/nb69_spring_basic_14.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488367041327631810" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiatkN9LMVYkMCtxtXWcivS6RlH3nyTRPMD5McIHM4SLlEbyimxL_zceLd_6O7WGK7Le9jrU4piTg0UWrxerX8Zpxjw5sX83cDMZWm2rV5KaaH-kmZTCZyWbPC8gQD8Sk7r9v_EljP2pEnc/s400/nb69_spring_basic_14.jpg" /></a><br />*****************************************************************************<br />그럼 이번엔 여기에 2개의 JSP 페이지를 만들어 하나는 HTML 폼에서 이름을 입력하는 텍스트 필드를, 다른 페이지에서는 앞서 입력값을 헬로우 메시지와 함께 전달 표시하는 뷰를 만들어 보도록 하겠습니다.<br /><br />뷰는 controller에 의해 관리되고, 이 컨트롤러는 어플리케이션에서 요청을 받아 다시 리턴해주는 일을 처리합니다. 또한 뷰에 표시될 정보(소위 모델이라고 하는)를 전달합니다. 이 어플리케이션의 컨트롤러는 HelloController 입니다.<br /><br />그리고 비즈니스 로직 핸들링에 있어서, 복잡한 웹 어플리케이션에서는 비즈니스 로직을 컨트롤러에 직접 포함한다기 보다, 필요시 컨트롤러에 의해 사용되는 또다른 엔티티, 소위 서비스(service)를 사용합니다. 해서 이런 취지로 이번 어플리케이션에서는, HelloService 를 만들어 비즈니스 로직은 헬로우 메시지를 전달하는 내용으로 작성해 보도록 하겠습니다.<br /><br />뭐 뭐가 됐건간에 일단 자바 클래스니 프로젝트에서 자바 클래스를 새로 만듭니다.<br />프로젝트에서 오른쪽 마우스 클릭-새 파일-자바 클래스<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNZEpS1lC4g5AOf1ceQ4WKJJ4kA8rRDHx6QMTIvY4azUkBKY-71_DsYDAuWOuj9swPoIeBq0NN41YHTpY_CEEJc76ME01Bm1KglhpFHS3a31Wmt7VihHVUQfI8iriYLgmfwsIx-HWr2Co1/s1600/nb69_spring_basic_15.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488367028147215666" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNZEpS1lC4g5AOf1ceQ4WKJJ4kA8rRDHx6QMTIvY4azUkBKY-71_DsYDAuWOuj9swPoIeBq0NN41YHTpY_CEEJc76ME01Bm1KglhpFHS3a31Wmt7VihHVUQfI8iriYLgmfwsIx-HWr2Co1/s400/nb69_spring_basic_15.jpg" /></a> 클래스 이름은 HelloService<br />패키지 이름은 service<br />마침<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfDsjGMSi5QP7_Aoxx68giWuVcYZCiqHf2133YQMDJD6ZfAgMO-MC8i55R2DUMsEbDPuWf3UO9suAZv2U_S0ydN3QoLzQE1VpouZsFD9PdBe7b20AeH3qsnNsO4txv2l5P4ZOuyo5c_4Nf/s1600/nb69_spring_basic_16.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488378683904976658" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfDsjGMSi5QP7_Aoxx68giWuVcYZCiqHf2133YQMDJD6ZfAgMO-MC8i55R2DUMsEbDPuWf3UO9suAZv2U_S0ydN3QoLzQE1VpouZsFD9PdBe7b20AeH3qsnNsO4txv2l5P4ZOuyo5c_4Nf/s400/nb69_spring_basic_16.jpg" /></a><br />HelloService 는 매우 간단한 서비스로, 이름 스트링을 인자로 받아, 적절한 메시지 문자열과 함께 다시 스트링으로 리턴하는 sayHello() 메소드가 다입니다.<br />굵은 글씨를 복사해서 붙여 넣습니다.<br />================================================<br />public class HelloService {<br /><strong>public String sayHello(String name) {<br />return "Hello " + name + "!";<br />}</strong><br />}<br />================================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLffSEr1pVFSAIUreRlOPPy0KHDj0xtaGTl7O_U0MN3nxntwqJ1bbjzsZKRS4BYjy_IwssprH7iOlJQG4IWYMkf3FC9L4_MzTFhMTKijiKXf-YmFSkaJ14RqoBHrmziaorrbhazw0gCZoj/s1600/nb69_spring_basic_17.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488378673931974642" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLffSEr1pVFSAIUreRlOPPy0KHDj0xtaGTl7O_U0MN3nxntwqJ1bbjzsZKRS4BYjy_IwssprH7iOlJQG4IWYMkf3FC9L4_MzTFhMTKijiKXf-YmFSkaJ14RqoBHrmziaorrbhazw0gCZoj/s400/nb69_spring_basic_17.jpg" /></a> 이제 페이지에서, 사용자 데이터를 핸들링하고 리턴될 뷰를 결정하기 위해 컨트롤러와 모델을 구현해보도록 하겠습니다.<br />이번에 사용할 컨트롤러는 SimpleFormController 입니다.<br />프로젝트에서 오른쪽 마우스 클릭 새파일 - other<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9Xm0UAor4l_acTGg7vhuT1JKbjFHBeDUgWhVs-uXcBmdARfqnO_xdFYAYKu6kdroAuiSahCGJ_KLi2OsvFAnlgYdoaoSBTK9ptKyiECPHgo07_AzpO2fGceHdhBCWHBW3CBf5XUfmFY0X/s1600/nb69_spring_basic_18.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488378665077001026" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9Xm0UAor4l_acTGg7vhuT1JKbjFHBeDUgWhVs-uXcBmdARfqnO_xdFYAYKu6kdroAuiSahCGJ_KLi2OsvFAnlgYdoaoSBTK9ptKyiECPHgo07_AzpO2fGceHdhBCWHBW3CBf5XUfmFY0X/s400/nb69_spring_basic_18.jpg" /></a><br />카테고리 Spring Framework<br />파일 유형은 Simple Form Controller 선택<br />다음<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAaNt4mpZ3Ej7A8OKMmznlI0Swg7p6wLymf0Yrqt79quHkR8OIH7kQIDadhQYcwdEalK5BDVjuzS6U2HJL_7dbcChq6AxS9BNCiw2BbmPq96jPoeC1AXXzBar4gretprXQfdfzk5i9_d9T/s1600/nb69_spring_basic_19.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488378656528967618" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAaNt4mpZ3Ej7A8OKMmznlI0Swg7p6wLymf0Yrqt79quHkR8OIH7kQIDadhQYcwdEalK5BDVjuzS6U2HJL_7dbcChq6AxS9BNCiw2BbmPq96jPoeC1AXXzBar4gretprXQfdfzk5i9_d9T/s400/nb69_spring_basic_19.jpg" /></a><br />클래스 이름은 HelloController 로,<br />패키지는 controller 로 입력합니다.<br />마침.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijnmmTEHG_PfD8CVKGb_ZxrnxRI0i8cN9kAW2l3YBIMGULdmPu1q2IMiBVAGPARRG_iCb5xXJypWK9xEVnnQL9biwwBSy3fvyIQciLEx9JowbrWmlmPynYRCiYR7sH11HXeeroWwYBsea1/s1600/nb69_spring_basic_20.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488378650202208194" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijnmmTEHG_PfD8CVKGb_ZxrnxRI0i8cN9kAW2l3YBIMGULdmPu1q2IMiBVAGPARRG_iCb5xXJypWK9xEVnnQL9biwwBSy3fvyIQciLEx9JowbrWmlmPynYRCiYR7sH11HXeeroWwYBsea1/s400/nb69_spring_basic_20.jpg" /></a> 클래스 템플릿에 의해 기본적으로 내용이 작업됩니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisN3YcuCLrLsASb7_BBS_TJ3_bW1i8mqOUt3eyEMiWnOqJ4a0cpUe5_wLyI1d87hkuoyJXpnGBtrEqv9xCDdmx9vghygxGZ3VmWaznHqWKCtwl5X_3UWoyPyps9r0JLcC57O1gB9-3HCsx/s1600/nb69_spring_basic_21.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488382635368537170" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisN3YcuCLrLsASb7_BBS_TJ3_bW1i8mqOUt3eyEMiWnOqJ4a0cpUe5_wLyI1d87hkuoyJXpnGBtrEqv9xCDdmx9vghygxGZ3VmWaznHqWKCtwl5X_3UWoyPyps9r0JLcC57O1gB9-3HCsx/s400/nb69_spring_basic_21.jpg" /></a>여기서 setXXX 부분의 4줄을 모두 주석 해제를 하고 클래스명이나 이름등에 대해 다음 내용을 바꿔 넣습니다.<br />=================================================<br />public HelloController() {<br /><strong>setCommandClass(Name.class);<br />setCommandName("name");<br />setSuccessView("helloView");<br />setFormView("nameView");</strong><br />}<br />=================================================<br /><a href="http://2.bp.blogspot.com/_fNtFXU_t3Yc/TCqm7Ds5DNI/AAAAAAAAC1Y/GSeZRweM"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488382629440457938" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtjgAVA4ufbsfAXG2GibIvlBxU0xuW_tIEQGuMpPtp6wSnP3-Eoy_6YLnQouCCNub6Q2O08MZGrqlFH2-PT-H5OAsWcRH5oY0Y_7vadAwcuYund5fwmElikPX2b0aq4ka_3WiQSb8RF0qv/s400/nb69_spring_basic_22.jpg" /></a>FormView 를 설정하는 건 폼을 표시하는데 있어 사용될 이름을 설정하는 내용입니다. 이 내용에는 이름을 입력할 텍스트 필드가 포함될 페이지구요.<br />마찬가지로 SuccessView를 설정하는 건 성공적으로 서브밋(제출)되었을 떄 나타나는 뷰 이름을 설정하는 내용입니다.<br />CommandName 은 모델에서 명령의 이름을 지정하는 것으로, 요청 파라미터를 가진 폼 객체와 바인딩되는 command 이름을 설정하는 내용이고,<br />마지막으로 CommandClass 는 command 클래스 이름을 설정하는 내용입니다.<br />클래스들이 없으니 오류뜨는 건 당연하고..앞으로 만들어야죠 --;<br />프로젝트에서 마우스 오른쪽 클릭 , 새파일 - 자바 클래스<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQ9JKkPW3BPkc4Z6sUn_HzgAVGzdTda2kW1FyQtoRi1HenSU6jLKrQFCs33_PVNgoIvWtpL4m_7UlnKnHc1J0CDJG6zfynXjuOJN4sMynWv3A4-mj1yIKga702jG8Ro4DBT8iT4OXoRamY/s1600/nb69_spring_basic_23.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488382620115813234" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQ9JKkPW3BPkc4Z6sUn_HzgAVGzdTda2kW1FyQtoRi1HenSU6jLKrQFCs33_PVNgoIvWtpL4m_7UlnKnHc1J0CDJG6zfynXjuOJN4sMynWv3A4-mj1yIKga702jG8Ro4DBT8iT4OXoRamY/s400/nb69_spring_basic_23.jpg" /></a> 클래스 이름에 Name<br />패키지는 controller (드랍다운메뉴에 있습니다. 선택)<br />마침<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2HSfXBS0USanV4RgW6h1BxQhMXU0F0a1BUOWLqx_hu069dqMwP1b_CjqeI3_xqEn5eJ5uFmLdK572zPPPmC882M14wE4bwBapcs23XUJa0wV2ec-Fdbb3ILnJi19eHzuCmAzhZB5GcW7-/s1600/nb69_spring_basic_24.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488382613564076594" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2HSfXBS0USanV4RgW6h1BxQhMXU0F0a1BUOWLqx_hu069dqMwP1b_CjqeI3_xqEn5eJ5uFmLdK572zPPPmC882M14wE4bwBapcs23XUJa0wV2ec-Fdbb3ILnJi19eHzuCmAzhZB5GcW7-/s400/nb69_spring_basic_24.jpg" /></a> 그런 다음 아래 굵은 글씨 내용을 작성합니다<br />==============================================<br />public class Name {<br /><strong>private String value;</strong><br />}<br />=============================================<br />팁: pr 하고 tab 키를 누르면 private 이 자동 작성됩니다. 이러한 내용은 편집기의 코드 템플릿 기능인데, 이러한 내용을 편집하거나, 보려면 도구-옵션-편집기-코드 템플릿으로 이동하시면 됩니다.<br />편집은 아니고 그냥 전체 리스트만 보고자 하면 도움말-키보드 shortcut 카드 를 이용하실수도 있습니다.<br />그리고 이 value 변수를 이용해서 getter 와 setter 메소드도 작업하기 위해 value 에 마우스를 놓고 마우스 오른쪽을 클릭하여 Insert Code 메뉴를 (혹은 단축키로는 Alt+Insert) 하면 아래 그림처럼 팝업창이 뜹니다.<br />거기서 Getter 와 Setter 선택<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5Kt0FOQxY3F8kfZ-w8DtJN8k0ZHu-KhK6rl7RDGwRp597unqOtDq_QJKTi3kEaO2Y8EqgIikUlgCILOOAqpC-HyC3BXMANdlGEoB_QUUi16PJnSLVX_JWcnRnIcFrdgdD_Wk3Uj68_ihX/s1600/nb69_spring_basic_25.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488382610826485010" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5Kt0FOQxY3F8kfZ-w8DtJN8k0ZHu-KhK6rl7RDGwRp597unqOtDq_QJKTi3kEaO2Y8EqgIikUlgCILOOAqpC-HyC3BXMANdlGEoB_QUUi16PJnSLVX_JWcnRnIcFrdgdD_Wk3Uj68_ihX/s400/nb69_spring_basic_25.jpg" /></a> 팝업창이 뜨면 value 앞을 체크하여 ok<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi17fQz9jLPZKafGc1D6yOCmevJZQ4Ige3-3qbjjXLhVZ8djusIwKLaiJd-V2HDzU_AMgGLxxEjbE5krBnDhgUXEq_ui61D_dY_Z3HWEw4B8LdRgHU_RWo8fxZgzoUX3KpM1vB5PYl_pavZ/s1600/nb69_spring_basic_26.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 200px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488437744883876674" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi17fQz9jLPZKafGc1D6yOCmevJZQ4Ige3-3qbjjXLhVZ8djusIwKLaiJd-V2HDzU_AMgGLxxEjbE5krBnDhgUXEq_ui61D_dY_Z3HWEw4B8LdRgHU_RWo8fxZgzoUX3KpM1vB5PYl_pavZ/s400/nb69_spring_basic_26.jpg" /></a> 그러면 아래 그림 처럼 setValue() 와 getValue() 메소드가 작성됩니다.<br />=======================================================<br />public String getValue() {<br />return value;<br />}<br /><br />public void setValue(String value) {<br />this.value = value;<br />}<br />=======================================================<br />그런 다음 Ctrl+Tab 키를 눌러 HelloController 로 전환합니다.<br />이전에 Name 클래스때문에 떳던 오류는 이제 없어져 있을 겁니다.<br />아래 doSubmitAction() 메소드를 지우고(주석처리거나),<br />다음 onSumbit() 메소드를 작성합니다. (주석을 해제하고 쓰거나 바로 작성하시면 됩니다)<br />=======================================================<br /><strong>@Override<br />protected ModelAndView onSubmit(Object command) throws Exception {<br />Name name = (Name)command;<br />ModelAndView mv = new ModelAndView(getSuccessView());<br />mv.addObject("helloMessage", helloService.sayHello(name.getValue()));<br />return mv;<br />}</strong><br />=======================================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxwIuLb8VOB_g7mxABVkm1UzpZYy5-jNjtfsrCyA4IQRg_Ffkytl22qvebd7auVl2DgE-hovBVP60PMx9-DZa4A6jIii0MV3HQDF_6HuyOgWj_js-M3UcnUqdaB3IfWFRL4zlC-RiXFjAf/s1600/nb69_spring_basic_27.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488437734371840066" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxwIuLb8VOB_g7mxABVkm1UzpZYy5-jNjtfsrCyA4IQRg_Ffkytl22qvebd7auVl2DgE-hovBVP60PMx9-DZa4A6jIii0MV3HQDF_6HuyOgWj_js-M3UcnUqdaB3IfWFRL4zlC-RiXFjAf/s400/nb69_spring_basic_27.jpg" /></a> 이 onSubmit() 메소드는 여러분의 ModelAndView 를 만드는데 사용됩니다.<br />command 가 Name 객체로 다시 캐스트해놓고<br />ModelAndView 인스턴스를 만들어, SimpleFormController 에서 getter를 사용하여 얻어지는 성공시 뷰를 가져와 저장합니다.<br />addObject() 메소드로 헬로우 메시지라는 글과 헬로우서비스의 sayHello 메소드를 더해서 모델뷰 객체에 저장합니다.<br />임포트 오류는 적당한 편집기 여백에서 마우스 오른쪽을 클릭하여 Fix import(가져오기 고정)메뉴를 클릭합니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIgHFnUfl7oUyCrnMC7QgKxRFfsorvmd2bcnosPDdMNcFWldBTDxDUPsbFddkzsqMmnKI0OJQJ1wxn6uCkmbKwkYSJGhaayKYVBzTTdk12z6rBphFiaDT6ChDKlZoXiVq58UoDrwQenCuh/s1600/nb69_spring_basic_28.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488437727030905234" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIgHFnUfl7oUyCrnMC7QgKxRFfsorvmd2bcnosPDdMNcFWldBTDxDUPsbFddkzsqMmnKI0OJQJ1wxn6uCkmbKwkYSJGhaayKYVBzTTdk12z6rBphFiaDT6ChDKlZoXiVq58UoDrwQenCuh/s400/nb69_spring_basic_28.jpg" /></a> 여기서 ModelAndView에 스프링 클래스, org.springframework.web.servlet.ModelAndView 를 선택합니다<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwihspjXX4KSj4k6ETWMGaSfXfNKzO74nXZt19r28YdbGbYvnY6P2uI-5WKvgShy7spXwFWaZB1URRFTukVRTbQ0nkJawWVNwviuP-nzL5sK34rXNItw_bJazckW_rp3mX_WeUrshiuSkS/s1600/nb69_spring_basic_29.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 214px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488437719034426450" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwihspjXX4KSj4k6ETWMGaSfXfNKzO74nXZt19r28YdbGbYvnY6P2uI-5WKvgShy7spXwFWaZB1URRFTukVRTbQ0nkJawWVNwviuP-nzL5sK34rXNItw_bJazckW_rp3mX_WeUrshiuSkS/s400/nb69_spring_basic_29.jpg" /></a> 그리고 HelloController 안에, HelloService 변수를 선언합니다.<br />===========================================<br />private HelloService helloService;<br />===========================================<br />역시 아까와 같은 방법으로 helloService에서 마우스 오른쪽을 클릭하여 insert code 메뉴를 선택하고<br />이번엔 setter 를 선택하여 setXXX 메소드를 만듭니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvriahN9yEYeI7BCN0OQWpRFTNCvZhfpmAssGDs9upyyWHEqnUUlGvI8sMItCnkGFG8K1em8MW1K5lIiPXTcZtF2eEFIC8BNQj7rGPP5YiqatHel63ibWL74xklf2WVIvOR0MNXvY0ibuc/s1600/nb69_spring_basic_30.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488437709020069682" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvriahN9yEYeI7BCN0OQWpRFTNCvZhfpmAssGDs9upyyWHEqnUUlGvI8sMItCnkGFG8K1em8MW1K5lIiPXTcZtF2eEFIC8BNQj7rGPP5YiqatHel63ibWL74xklf2WVIvOR0MNXvY0ibuc/s400/nb69_spring_basic_30.jpg" /></a> 팝업창에서 그림과 같이 체크(확인)<br />----------------------------------------------<br />public void setHelloService(HelloService helloService) {<br /><strong>this.helloService = helloService;</strong><br />}<br />---------------------------------------------<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhShJW0Tk0HDeWgGUHxhoSw0gK0xVsAC8pvAZZvGrH17ge3lvSQRpT7CtiVlfLk3KS329gVZHo3xO1GyDRV3_e1JwDlqti1KZY7jhsma5LLEUX7clLEYsATnKcW6zlTzYlRMXVGoAtwUERW/s1600/nb69_spring_basic_31.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 187px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488523089550372802" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhShJW0Tk0HDeWgGUHxhoSw0gK0xVsAC8pvAZZvGrH17ge3lvSQRpT7CtiVlfLk3KS329gVZHo3xO1GyDRV3_e1JwDlqti1KZY7jhsma5LLEUX7clLEYsATnKcW6zlTzYlRMXVGoAtwUERW/s400/nb69_spring_basic_31.jpg" /></a> 임포트 문제 에러는 마우스 오른쪽 클릭으로 fix import(가져오기 고정) 수정.<br />위에 자동으로 import service.HelloService; 추가됨<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivKBM3M98cNBftRRIpHcomChjibcckFmtm23aQY4TzawLcwN3ikuSaasIFxucRJ2UysJhCRar-noFun4hLYue_ImtfiVQoM8q7MLNq7vc3kuBAHzFWVCzc3QhmTZs3mcxymR5dgvFAai5H/s1600/nb69_spring_basic_32.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488523078151234258" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivKBM3M98cNBftRRIpHcomChjibcckFmtm23aQY4TzawLcwN3ikuSaasIFxucRJ2UysJhCRar-noFun4hLYue_ImtfiVQoM8q7MLNq7vc3kuBAHzFWVCzc3QhmTZs3mcxymR5dgvFAai5H/s400/nb69_spring_basic_32.jpg" /></a>그리고 헬로우서비스를 xml 에 등록합니다.<br />applicationContext.xml 파일에서 HelloService 를 등록.<br />방법은 다음 내용을 복사해서 붙여넣습니다.<br />==================================================<br /><bean name="helloService" class="service.HelloService" /><br />==================================================<br />팁: IDE는 xml 구성파일에서 스프링의 코드 완성 기능을 제공합니다. 따라서 작성중에 Ctrl+Space 를 적절히 이용하면 해당 여러 패키지, 클래스 및 속성들을 보다 손쉽게 작업할 수 있습니다.)<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNEQc7tKf7LvUaIUvgA0TFrn55x8KB2iV7a_uYDoJcqU0X_JTB9UmJNJMDsLTGGCvG8P7w4Qu5dHbdbl48rdLb8xEyrrSmLIXA-xjYpTQK6bMNNn0Iaf6mFfDYuFTVrKBkKRaswkETup37/s1600/nb69_spring_basic_33.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488523066169956306" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNEQc7tKf7LvUaIUvgA0TFrn55x8KB2iV7a_uYDoJcqU0X_JTB9UmJNJMDsLTGGCvG8P7w4Qu5dHbdbl48rdLb8xEyrrSmLIXA-xjYpTQK6bMNNn0Iaf6mFfDYuFTVrKBkKRaswkETup37/s400/nb69_spring_basic_33.jpg" /></a> 이제 dispatcher-servlet.xml 에서 HelloController 를 등록합니다.<br />dispatcher-servlet.xml 파일을 편집기에서 열러 다음 빈 선언을 작성해 붙여넣습니다.<br />==================================================================<br /><bean class="controller.HelloController" p:helloService-ref="helloService"/><br />==================================================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-_k_vC7Wz_-LjnrZSUR2bhivgtewSnhqcLBQL3Uvdf9DX6Gx8Sh4P40lv1lPyvbCIaFCiV-6qJjbXOzSZicW7uPp53nDq9kCh4e3XrMjsjPr7I_G6rkiPgqe0Hf6ikF1DxZJjglRLkdkM/s1600/nb69_spring_basic_34.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488523059136997090" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-_k_vC7Wz_-LjnrZSUR2bhivgtewSnhqcLBQL3Uvdf9DX6Gx8Sh4P40lv1lPyvbCIaFCiV-6qJjbXOzSZicW7uPp53nDq9kCh4e3XrMjsjPr7I_G6rkiPgqe0Hf6ikF1DxZJjglRLkdkM/s400/nb69_spring_basic_34.jpg" /></a> ***************************************<br />이제 2개의 뷰 페이지를 만들어 보도록 하겠습니다.<br />하나는 nameView.jsp 로 웰컴과 함께 이름을 입력받도록 하는 페이지이고,<br />다른 하나는 helloView.jsp 로, 인사 메시지와 함께 입력받은 파라미터 값이 메소드를 호출해 표시되는 페이지 입니다.<br />우선 프로젝트에서 특히 WEB-INF/jsp 노드에서 오른쪽 마우스를 클릭하여 새 파일-JSP 를 선택합니다.<br />(만약 그냥 프로젝트에서 새패일-JSP로 하면 경로를 WEB-INF/jsp 로 찾아가면 됩니다)<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2OdfiNBOr_gBFiTXbzVu10i90FIpQwKbSiK4-MfajtvzhCAk12nZjDZGUkHwxXEhfon-EHUQb1LjqLNz_9tHyFeIu8Lsd2P9a3Lpy1lsSWw19h_TWR-M3xZpxLoys_BG4vHYzCy5KdllP/s1600/nb69_spring_basic_35.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488523052361293602" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2OdfiNBOr_gBFiTXbzVu10i90FIpQwKbSiK4-MfajtvzhCAk12nZjDZGUkHwxXEhfon-EHUQb1LjqLNz_9tHyFeIu8Lsd2P9a3Lpy1lsSWw19h_TWR-M3xZpxLoys_BG4vHYzCy5KdllP/s400/nb69_spring_basic_35.jpg" /></a> 파일 이름은 helloView<br />폴더는 WEB-INF/jsp - 마침<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDfgEIP2Duc4y58_6B6yGtd1v71wD7LVvEnAMZgcO5oYGpPrAXfYmJxosmuTAex-Hbk4n9DK74Cx7I0sLHF3Cfvdn0KC9xH5zRKn4sglabFSfwWDWZ3grc5Xfi7HJ6HKsdBzII_FKyhone/s1600/nb69_spring_basic_36.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 266px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488525928710593378" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDfgEIP2Duc4y58_6B6yGtd1v71wD7LVvEnAMZgcO5oYGpPrAXfYmJxosmuTAex-Hbk4n9DK74Cx7I0sLHF3Cfvdn0KC9xH5zRKn4sglabFSfwWDWZ3grc5Xfi7HJ6HKsdBzII_FKyhone/s400/nb69_spring_basic_36.jpg" /></a> 자동으로 편집된 내용에서 다음 굵은 글씨를 참고로 타이틀과 본문의 제목으로 헬로우컨트롤러에서 만들어진 ModelandView 객체의 헬로우 메시지를 바인딩하도록 코드를 수정합니다.<br />=============================================================<br /><head><br /><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><br /><strong><title>Hello</title></strong></head><br /><body><br /><strong><h1>${helloMessage}</h1></strong><br /></body><br />=============================================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjczBVRT6itbpbAdv_J1NTKphAih_581_QuZRj0QgJPKyP4BQwgHugA3DBAEMsuelO8WCeCr0GL5i8BwJNAFwZy5QME7Cnsgrvk_tu8ZiWD1NL_MUPVs4DOCf8T_9sH_81kYIVvafLa80RB/s1600/nb69_spring_basic_37.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488525920056384866" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjczBVRT6itbpbAdv_J1NTKphAih_581_QuZRj0QgJPKyP4BQwgHugA3DBAEMsuelO8WCeCr0GL5i8BwJNAFwZy5QME7Cnsgrvk_tu8ZiWD1NL_MUPVs4DOCf8T_9sH_81kYIVvafLa80RB/s400/nb69_spring_basic_37.jpg" /></a> 다른 페이지는 nameView 를 만듭니다. 방법은 아까와 마찬가지로 해당 위치에서 새파일-jsp<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiE_5wPawAg6YH38YbJeTLO7WY7oBk3Se8DjQI4aF5m8y8WBHGOjSjl0uLILEi3lJSBxwrVJAyj_TaLWhbZpBYqRIWkGbSxp9rbxouVsRyMzDZvVbrr_dZl11jFPSwdjWX4hyphenhyphenW-VJ4ghyphenhyphenPm/s1600/nb69_spring_basic_38.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488525916074325842" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiE_5wPawAg6YH38YbJeTLO7WY7oBk3Se8DjQI4aF5m8y8WBHGOjSjl0uLILEi3lJSBxwrVJAyj_TaLWhbZpBYqRIWkGbSxp9rbxouVsRyMzDZvVbrr_dZl11jFPSwdjWX4hyphenhyphenW-VJ4ghyphenhyphenPm/s400/nb69_spring_basic_38.jpg" /></a> 2번째 JSP 파일 이름은 nameView<br />경로는 WEB-INF/jsp 아래<br />마침<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNJqA53WlkuT33i0KNxvsUqlHhx8rK7mHW5HgHbCCX3k9V7s2_avnoLYuiRdfXJl_pNf85k1RRhKvfjWdf6jYYcpdeTEMFsEPaGLEFIKl7zJ2gPFk4DFUQ2utUHn6d0nV4Apm_rKhYvtt5/s1600/nb69_spring_basic_39.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 266px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488525908032130306" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNJqA53WlkuT33i0KNxvsUqlHhx8rK7mHW5HgHbCCX3k9V7s2_avnoLYuiRdfXJl_pNf85k1RRhKvfjWdf6jYYcpdeTEMFsEPaGLEFIKl7zJ2gPFk4DFUQ2utUHn6d0nV4Apm_rKhYvtt5/s400/nb69_spring_basic_39.jpg" /></a> nameView.jsp 에서는 스프링 태그 라이브러리 선언을 위에 추가합니다<br />============================================================<br /><%@taglib uri="http://www.springframework.org/tags" prefix="spring" %><br />============================================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw_4TrEhhxbELuD6UDwGVu7gHjZMXh00Y4rAFsKRdlA3PGsuN3IPJ8G6acV6WC88ZvdAK1ehd7q3Ki0ZDD-DVTuw9tWxA28XPa96ZiB6OYv-n6h3EvMbkNK80wEordWzV2s8sfnecr0mT1/s1600/nb69_spring_basic_40.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488525897472796402" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw_4TrEhhxbELuD6UDwGVu7gHjZMXh00Y4rAFsKRdlA3PGsuN3IPJ8G6acV6WC88ZvdAK1ehd7q3Ki0ZDD-DVTuw9tWxA28XPa96ZiB6OYv-n6h3EvMbkNK80wEordWzV2s8sfnecr0mT1/s400/nb69_spring_basic_40.jpg" /></a> h1 제목태그 아래 다음 내용을 복사해 넣습니다.<br />=============================================================<br /><spring:nestedPath path="name"><br /><form action="" method="post"><br />Name:<br /><spring:bind path="value"><br /><input type="text" name="${status.expression}" value="${status.value}"><br /></spring:bind><br /><input type="submit" value="OK"><br /></form><br /></spring:nestedPath><br />=============================================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_563ohBjpMRl_UUK7PoO9ejCT6S4skOLQJLVaU2nDRFmdgfEd7A-fmAoW0SYyY9XKs_9f3zQERHY0W_rW6kUHTRhXxMBTb4LUtCBC1L-IuCjAAccCaHcxpq1CxvDni7AJuD1l6OcIjbZJ/s1600/nb69_spring_basic_41.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488527786613527122" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_563ohBjpMRl_UUK7PoO9ejCT6S4skOLQJLVaU2nDRFmdgfEd7A-fmAoW0SYyY9XKs_9f3zQERHY0W_rW6kUHTRhXxMBTb4LUtCBC1L-IuCjAAccCaHcxpq1CxvDni7AJuD1l6OcIjbZJ/s400/nb69_spring_basic_41.jpg" /></a> 이제 프로젝트를 실행합니다. 프로젝트에서 마우스 오른쪽 클릭 - 실행<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGazii7A_2iodh_O4vsH9O05Ip8Kg9bC1JEPW2mxfGisOvW5OSoEfN_K7pRvNNQF3wapvQd7eiywk3H_zk8P05xsI35XJcG5NnVKNbFfyTvBdUZtJMmnWY7cZXMFB01ZgyvwT-_rSg4baN/s1600/nb69_spring_basic_42.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488527780414140402" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGazii7A_2iodh_O4vsH9O05Ip8Kg9bC1JEPW2mxfGisOvW5OSoEfN_K7pRvNNQF3wapvQd7eiywk3H_zk8P05xsI35XJcG5NnVKNbFfyTvBdUZtJMmnWY7cZXMFB01ZgyvwT-_rSg4baN/s400/nb69_spring_basic_42.jpg" /></a> 이름에 jin 이라고 입력하고 OK 버튼을 눌렀습니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhA4pq4N4_KrFrwzfIoMKNt0uqzbltsO-HkRbdRRLiYTY7CfOEMpa1ty-1SNE4YCUrOUZwgP6kADFmUoiowiMoVeoLM3GQMwsOlcF02tL0KulLkipRJFVJjgFGH5gO9tYEH7fRuDPFLuIAQ/s1600/nb69_spring_basic_43.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 277px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488527776359949058" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhA4pq4N4_KrFrwzfIoMKNt0uqzbltsO-HkRbdRRLiYTY7CfOEMpa1ty-1SNE4YCUrOUZwgP6kADFmUoiowiMoVeoLM3GQMwsOlcF02tL0KulLkipRJFVJjgFGH5gO9tYEH7fRuDPFLuIAQ/s400/nb69_spring_basic_43.jpg" /></a> 헬로우라는 메시지와 함께 파라미터로 넘겨받은 이름이 성공적으로 출력됩니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-NYREwbFMBAyAzGwrHBUWpMAd7itkhOc7shVJ0dlsgwCp_Po2EvDvQXDDsfMa5vv7-D3isyk7PYxBHbkAT5sOA_J7xCEBPRb52W1lW9DIORd12KBfi8EOjt4PN4tEjReB28bq7WxcGMs4/s1600/nb69_spring_basic_44.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 277px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488527764564887698" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-NYREwbFMBAyAzGwrHBUWpMAd7itkhOc7shVJ0dlsgwCp_Po2EvDvQXDDsfMa5vv7-D3isyk7PYxBHbkAT5sOA_J7xCEBPRb52W1lW9DIORd12KBfi8EOjt4PN4tEjReB28bq7WxcGMs4/s400/nb69_spring_basic_44.jpg" /></a> 자, 그럼 여기서 숙제~ 한글을 이름으로 입력하면 어떻게 될까요?<br />물론 깨집니다. 그럼 이 한글문제를 또 어떻게 해결하면 될까요? <br />예전에 게시물로 올려드린적 있습니다만 정답 보기전에 최대한 본인이 한번 천천히 고민해보시기를~<br /><br />수고하셨습니다. ^^강여사(J.Y.Kang)http://www.blogger.com/profile/17450510931308610527noreply@blogger.com0tag:blogger.com,1999:blog-6811062799606447528.post-26259250139287505932010-06-29T00:57:00.000-07:002010-07-01T04:03:02.154-07:00넷빈(NetBeans)6.9에서 Google Web Toolkit 사용하기 04 - css로 외형 커스터마이즈하기이번 게시물에서는 HTML 호스트 페이지에 스타일시트를 첨부해보도록 하겠습니다.<br /><br />당연 엔트리 포인트 클래스에 이 css 가 참조되어야 하며,<br />스타일시트에 스타일 이름에,<br />엔트리 포인트 클래스에 라벨의 스타일 이름이 설정되어야 합니다.<br /><br />실행시, GWT는 라벨에 스타일을 연결하여 커스터마이즈된 라벨을 표시합니다.<br /><br />일단, CSS 파일을 만들어야 합니다.<br /><br />프로젝트에서 마우스 오른쪽 클릭<br />새파일 - other<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhf4-U2mOyk-5G_iKfJxD_nmAOj-rjzzoP9Ovw-8sJ8Pl_4VDQNfk8HHXZF3gLECJ9XdBf7MtZEDjK5brfbWzRYlCCN_2l7ZZ2Uk5ETRqP6eAeNlraxil1ZGeYMgZ91IBzHlVn4tZdh0spM/s1600/nb69_GWT_46.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488102854349992402" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhf4-U2mOyk-5G_iKfJxD_nmAOj-rjzzoP9Ovw-8sJ8Pl_4VDQNfk8HHXZF3gLECJ9XdBf7MtZEDjK5brfbWzRYlCCN_2l7ZZ2Uk5ETRqP6eAeNlraxil1ZGeYMgZ91IBzHlVn4tZdh0spM/s400/nb69_GWT_46.jpg" /></a><br />카테고리의 기타에서 CSS(종속형시트? --;)파일 선택 - 다음<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuD1WNMmkrb-16bQsHUEHxvQC8S2emwWe15mlkqiTlR7C-wbK4X4xTbMnBLjXl-j7eT0mzYqNge3qzJ3hwqAQ81z8B-k-hfBpFnDrOvwcATPJ_42F6EUNsPGFccwulGxY_7mpc0Y9UxV-B/s1600/nb69_GWT_47.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488102850293865154" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuD1WNMmkrb-16bQsHUEHxvQC8S2emwWe15mlkqiTlR7C-wbK4X4xTbMnBLjXl-j7eT0mzYqNge3qzJ3hwqAQ81z8B-k-hfBpFnDrOvwcATPJ_42F6EUNsPGFccwulGxY_7mpc0Y9UxV-B/s400/nb69_GWT_47.jpg" /></a> CSS 파일 이름을 줍니다. welcomeGWT 라고 줬습니다.<br />폴더에 옆의 brose 버튼을 클릭하여 web 을 설정합니다.(아니면 직접 적어도 됩니다)<br />마침<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAQO6X8HCc4GTlVf1Rp2LxeeBZqH-6rpOWLZTmkffQ_P5u6JBIWCOPVyxXJ2-bC1AMfpnnSQuWtZh8UU5bwCqNzX5Y6FsHCMcBLrON01qg5VsfEFl9QBULdTMmMJj2BykI62RcfUXyHr-u/s1600/nb69_GWT_48.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488102845980212466" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAQO6X8HCc4GTlVf1Rp2LxeeBZqH-6rpOWLZTmkffQ_P5u6JBIWCOPVyxXJ2-bC1AMfpnnSQuWtZh8UU5bwCqNzX5Y6FsHCMcBLrON01qg5VsfEFl9QBULdTMmMJj2BykI62RcfUXyHr-u/s400/nb69_GWT_48.jpg" /></a><br />내용을 복사해서 붙여넣습니다.<br />====================================================<br />.quoteLabel {<br />color: white;<br />display: block;<br />width: 450px;<br />padding: 2px 4px;<br />text-decoration: none;<br />text-align: center;<br />font-family: Arial, Helvetica, sans-serif;<br />font-weight: bold;<br />border: 1px solid;<br />border-color: black;<br />background-color: #704968;<br />text-decoration: none;<br />}<br />====================================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyn_vFPp8sADSWQf0iHsPjPLA41JKdGv6kDnPeaT6T3FbEShtaeJQVQi_QBmGXLR3CjblalAvlle4haaGwyN_rDflDEjvlvQvujEF79AEBHs9doTSp6RAnOtneGwEg9OPQEFlzB5kq7HgT/s1600/nb69_GWT_49.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488102837966873570" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyn_vFPp8sADSWQf0iHsPjPLA41JKdGv6kDnPeaT6T3FbEShtaeJQVQi_QBmGXLR3CjblalAvlle4haaGwyN_rDflDEjvlvQvujEF79AEBHs9doTSp6RAnOtneGwEg9OPQEFlzB5kq7HgT/s400/nb69_GWT_49.jpg" /></a> 이제 이 스타일시트를 미리보기 및 빌더를 하려면 다음과 같이 하시면 됩니다.<br />위의 메뉴에서 창- other 를 따라가면 CSS 미리보기와 CSS 스타일 Builder 가 있습니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNZkTnxZXmxJX1HYX6zf1Jgs1KxJGUFC9SPqahEvmy9zf2VDPc1jIxwBMW_mDqN7DbMXjxT2G70a2DVZSNVXWFkhjScNUhlMCZv8EpEeYdeR2dVyfX4MvWs0n0XZUIjjKdlpWfuJWFe9Xn/s1600/nb69_GWT_50.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488102824845515602" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNZkTnxZXmxJX1HYX6zf1Jgs1KxJGUFC9SPqahEvmy9zf2VDPc1jIxwBMW_mDqN7DbMXjxT2G70a2DVZSNVXWFkhjScNUhlMCZv8EpEeYdeR2dVyfX4MvWs0n0XZUIjjKdlpWfuJWFe9Xn/s400/nb69_GWT_50.jpg" /></a><br />이 2개를 각각 열어주시면 편집기창에 CSS 아래쪽에 스타일 빌더와 오른쪽에 미리보기가 나타납니다.<br />현재 지정된 색으로 오른쪽에 미리보기가 보여집니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8lmk-79melevd9o4HiFylXwPobEhJjbZQHROYJIg1nUfU7dbGxzZXjgD_oAdxU-Tjec-0lBh1_MbG_YaekD6QGLnc_U5bg00rByFIZejXPG7VC4cBpKk2NQA74lSFlaDSNqrTRUShkM8_/s1600/nb69_GWT_51.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488104360343237634" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8lmk-79melevd9o4HiFylXwPobEhJjbZQHROYJIg1nUfU7dbGxzZXjgD_oAdxU-Tjec-0lBh1_MbG_YaekD6QGLnc_U5bg00rByFIZejXPG7VC4cBpKk2NQA74lSFlaDSNqrTRUShkM8_/s400/nb69_GWT_51.jpg" /></a> 이제 welcomeGWT.html 로가서 스타일시트를 연결시키면됩니다. 그림을 참고하여 굵은 글씨 부분을 추가합니다.<br />======================================================================<br /><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><br /><br /><html><br /><head><br /><meta name='gwt:module' content='org.yournamehere.Main=org.yournamehere.Main'><br /><strong><link rel="stylesheet" type="text/css" href="welcomeGWT.css"></strong><br /><title>Main</title><br /></head><br /><br /><body><br /><script language="javascript" src="org.yournamehere.Main/org.yournamehere.Main.nocache.js"></script><br /><br /><strong><p>This is an AJAX application that retrieves a random quote from<br />the Random Quote service every second. The data is retrieved<br />and the quote updated without refreshing the page!</p></strong><br /></body><br /></html><br />======================================================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKC9NG7ChjmSCs6cmuKrzAbAJi4OJHxWKTFMX2xiigzuUCXnK2tb_iEWyMDxthz93kIyu7tKE9LQXRZyMKTm1Nbx13b6L3Q4jEW4Z1lvKqpFc8ygo6BQkBQtBnET1_kPY0AVdIgWMvWVA9/s1600/nb69_GWT_52.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488104351652308386" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKC9NG7ChjmSCs6cmuKrzAbAJi4OJHxWKTFMX2xiigzuUCXnK2tb_iEWyMDxthz93kIyu7tKE9LQXRZyMKTm1Nbx13b6L3Q4jEW4Z1lvKqpFc8ygo6BQkBQtBnET1_kPY0AVdIgWMvWVA9/s400/nb69_GWT_52.jpg" /></a> 그리고 MainEntryPoint.java (엔트리 포인트 클래스)의 onModuleLoad() 메소드에 성공시에 라벨에 적용할 스타일을 다음과 같이 지정해줍니다.<br />=======================================================<br />public void onSuccess(Object result) {<br />//display the retrieved quote in the label:<br />quoteText.setText((String) result);<br /><strong>quoteText.setStyleName("quoteLabel");</strong>}<br />=======================================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2a9ozDNZFalBlTY1RvN3yE6fXkMoZq_H2xU5wUCzMVCchOgNrRl-XyBR-x5nsO6Yaj6SnxUzDsM0yVHlE6j_wFYKt1PwFIHL0PwRUrpgwpIdLNa68EhF15K-BG7hrIm2tkXWQMuAbnHBi/s1600/nb69_GWT_53.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488104338952507394" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2a9ozDNZFalBlTY1RvN3yE6fXkMoZq_H2xU5wUCzMVCchOgNrRl-XyBR-x5nsO6Yaj6SnxUzDsM0yVHlE6j_wFYKt1PwFIHL0PwRUrpgwpIdLNa68EhF15K-BG7hrIm2tkXWQMuAbnHBi/s400/nb69_GWT_53.jpg" /></a> 이제 다시 프로젝트를 실행합니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHXJzyjaJdkDy7g58glzaimxYCoHVC_ttkTyHI9STMfqq8vdfeuX25o0zQBgwsE8_IQoDHNmQ4wSQktAQfd86m2mXbgVVtbPQIrJnSskyT4-7e8Uhh0G7zyTtYE6GuBOer9fV9f0lHhREJ/s1600/nb69_GWT_54.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488104330323806706" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHXJzyjaJdkDy7g58glzaimxYCoHVC_ttkTyHI9STMfqq8vdfeuX25o0zQBgwsE8_IQoDHNmQ4wSQktAQfd86m2mXbgVVtbPQIrJnSskyT4-7e8Uhh0G7zyTtYE6GuBOer9fV9f0lHhREJ/s400/nb69_GWT_54.jpg" /></a> 그럼 아래 그림처럼 이번에는 라벨에 커스텀 스타일(위에서 만든 스타일시트 사용)이 보여집니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAV2juYAAc6lhPl6c_HFy_oK6B3QAHTX9yP3FPw7rJMyIG7m49v6BYQXniU2PuQG7jfieSTlWVgqyOKr-JQGSkzwcVKDDV6piQdiesidU7xPxI4Qw4IiHXQmHCiKfY_6UcgfOud5MS9UQy/s1600/nb69_GWT_55.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 244px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488104321543920866" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAV2juYAAc6lhPl6c_HFy_oK6B3QAHTX9yP3FPw7rJMyIG7m49v6BYQXniU2PuQG7jfieSTlWVgqyOKr-JQGSkzwcVKDDV6piQdiesidU7xPxI4Qw4IiHXQmHCiKfY_6UcgfOud5MS9UQy/s400/nb69_GWT_55.jpg" /></a> 다음 게시물에서는 GWT의 컴파일과 디버깅에 대해 자세히 살펴보도록 하겠습니다.<br />to be continued...강여사(J.Y.Kang)http://www.blogger.com/profile/17450510931308610527noreply@blogger.com0tag:blogger.com,1999:blog-6811062799606447528.post-92125339789739248572010-06-28T23:47:00.000-07:002010-07-01T04:03:02.154-07:00넷빈(NetBeans)6.9에서 Google Web Toolkit 사용하기 03 - AJAX 랜덤 격언 생성기이번에는, 웹 페이지에서 AJAX 로 랜덤하게 격언이 표시되는 프로그램을 만들어보겠습니다.<br />이 랜덤 격언은 서버에 저장된 일련의 격언들이 선택되어, 매초마다 탐색되어, 페이지 리로딩 없이 AJAX 스타일로 웹 페이지에 나타나게 됩니다.<br /><br />이 기능을 생성하는게 GWT RPC(Remote Procedure Call) 서비스를 사용합니다.<br /><br />우선 서비스 스텁을 생성합니다.<br /><br />넷빈즈 GWT 플러그인에 이 RPC 서비스 생성 마법사가 들어 있습니다. 따라서 새 파일에서 항목을 선택하여 마법사를 진행하면 됩니다. (그림 참조)<br />프로젝트에서 마우스 오른쪽 클릭 - 새파일 - Other<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNvrzIs2Oa3AojgtqnsEZuP-uGfMKscI9TiZnFUFSXVeuGHH_qz2YZa1vuk-G5jCSBKMEEGmcBt51Ky_GhPmibzIlaStP-0pjSr4ZFQ4JqZy-bw7qtfF-0S8KF_eHxYDDomIxNUhIQKAwj/s1600/nb69_GWT_21.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488084939349752850" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNvrzIs2Oa3AojgtqnsEZuP-uGfMKscI9TiZnFUFSXVeuGHH_qz2YZa1vuk-G5jCSBKMEEGmcBt51Ky_GhPmibzIlaStP-0pjSr4ZFQ4JqZy-bw7qtfF-0S8KF_eHxYDDomIxNUhIQKAwj/s400/nb69_GWT_21.jpg" /></a><br />카테고리 Google Web Toolkit 에서 GWT RPC 서비스 선택 - 다음<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgD1iLpo0dyoDs-HW29OtxEMackrpyaz3dgchuEYpp23OB__PXKigU6soBFV-i3yb8zorGHPdAK2NY2abndYsNggCKX9G9Bvz3xXmRsKUsFtT406_TVEzt52fZMFrBiMKwb2T6AsA2cEvDc/s1600/nb69_GWT_22.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488084927347850290" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgD1iLpo0dyoDs-HW29OtxEMackrpyaz3dgchuEYpp23OB__PXKigU6soBFV-i3yb8zorGHPdAK2NY2abndYsNggCKX9G9Bvz3xXmRsKUsFtT406_TVEzt52fZMFrBiMKwb2T6AsA2cEvDc/s400/nb69_GWT_22.jpg" /></a> 제시된 기본 내용에 서브패키지만 sampleservice 라고 채워줍니다 - 마침<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjT838F52GCi4KBXk4ofErPqwh2eJVEgAtM9fWGOhlQcpXw7Ujx0mOA8okS79yst3YM2Y9YmQcm5BkBcclG9PiEzRYo8HGFivBvA7tJw8Y0XumqeJyITYyBtOZL4MpVyIKI0gLIDPj8hR0-/s1600/nb69_GWT_23.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 263px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488084921765247506" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjT838F52GCi4KBXk4ofErPqwh2eJVEgAtM9fWGOhlQcpXw7Ujx0mOA8okS79yst3YM2Y9YmQcm5BkBcclG9PiEzRYo8HGFivBvA7tJw8Y0XumqeJyITYyBtOZL4MpVyIKI0gLIDPj8hR0-/s400/nb69_GWT_23.jpg" /></a> 그럼 관련 스텁들이 자동으로 생성됩니다. (그림 참조)<br />이제 이 자동생성된 클래스들에 대해 좀더 자세히 살펴보도록 하겠습니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJcQmKzdDeOhC-vhxwBz_4zp_CHw0Ab05jnrm89W7nbvfRD8B0mlm5ZgxlMsxusLAD2InG9Mpa23ARgGZCtBPnJz6qFe6kYpDys1H9knDL3pDLTgT5EdA75CvTZ2Mk2wWUm0lcGV-kFqD6/s1600/nb69_GWT_24.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488084916769744018" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJcQmKzdDeOhC-vhxwBz_4zp_CHw0Ab05jnrm89W7nbvfRD8B0mlm5ZgxlMsxusLAD2InG9Mpa23ARgGZCtBPnJz6qFe6kYpDys1H9knDL3pDLTgT5EdA75CvTZ2Mk2wWUm0lcGV-kFqD6/s400/nb69_GWT_24.jpg" /></a><br />GWTService: 서비스의 클라이언트사이드 정의입니다. 이 인터페이스는 RemoteService 를 상속받아 처리합니다(RPC)<br />-------------------------------------------------------<br />package org.yournamehere.client.sampleservice;<br /><br />import com.google.gwt.user.client.rpc.RemoteService;<br />import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;<br /><br />@RemoteServiceRelativePath("sampleservice/gwtservice")<br />public interface GWTService extends RemoteService {<br />public String myMethod(String s);<br />}<br />-------------------------------------------------------<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGnwZNSfSwzGxtXbEdXTWuCvNHOHLbpPU92o6dIoAt20XDflW7mz4mR8FYplfYsJkHqxD8jKuCH06J0nPSUyDLYELrleKuLcS5xIbBx5g1UYyOQMgdcXYEg9soAwKXmvtbbx9kSj7R-KSb/s1600/nb69_GWT_25.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488084908494629522" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGnwZNSfSwzGxtXbEdXTWuCvNHOHLbpPU92o6dIoAt20XDflW7mz4mR8FYplfYsJkHqxD8jKuCH06J0nPSUyDLYELrleKuLcS5xIbBx5g1UYyOQMgdcXYEg9soAwKXmvtbbx9kSj7R-KSb/s400/nb69_GWT_25.jpg" /></a> GWTServiceImpl: GWTService 인터페이스를 구현받는 서블릿 클래스로, RPC를 통해 랜덤으로 격언문장들을 탐색하기 위한 기능을 제공하는 myMethod(XX)가 구현되어 있습니다.<br />==========================================================<br />package org.yournamehere.server.sampleservice;<br /><br />import com.google.gwt.user.server.rpc.RemoteServiceServlet;<br /><br />import org.yournamehere.client.sampleservice.GWTService;<br /><br />public class GWTServiceImpl extends RemoteServiceServlet implements GWTService {<br /><br />public String myMethod(String s) {<br />// Do something interesting with 's' here on the server.<br />return "Server says: " + s;<br />}<br /><br />}<br />==========================================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLqIpbdqS6IgFmxXTJ8dIVkuqHUpVicbSS4b_bLIGzExfwb0VM1HKac7WMJ3qx8yKdPhD7rBa2BbgFDu9x5Z4kCbJ1uARs4xO8Sx2oQT73BniRakhaf2SVm4a-iZrRWd2ZWJrl-RrY2gTd/s1600/nb69_GWT_26.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488092263870545586" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLqIpbdqS6IgFmxXTJ8dIVkuqHUpVicbSS4b_bLIGzExfwb0VM1HKac7WMJ3qx8yKdPhD7rBa2BbgFDu9x5Z4kCbJ1uARs4xO8Sx2oQT73BniRakhaf2SVm4a-iZrRWd2ZWJrl-RrY2gTd/s400/nb69_GWT_26.jpg" /></a> GWTServiceAsync : 비동기 인터페이스로 GWTService 인터페이스 기반에 서버와 클라이언트간 비동기 통신을 가능케 하는 콜백 객체가 제공됩니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDtwzsN6NmvZn6QiufemtRmUvJF3N6zfpNEzCSBbD9QUFG0HjYWLmx_uMi5tXrU8m1sFNGRCTZjVGOnW-EIBKa2saVCopGY-0c9Y0laKqocZcY2LwzRrT0d4LBctUA3m_VfSinIeXfeALa/s1600/nb69_GWT_27.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488092256788931874" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDtwzsN6NmvZn6QiufemtRmUvJF3N6zfpNEzCSBbD9QUFG0HjYWLmx_uMi5tXrU8m1sFNGRCTZjVGOnW-EIBKa2saVCopGY-0c9Y0laKqocZcY2LwzRrT0d4LBctUA3m_VfSinIeXfeALa/s400/nb69_GWT_27.jpg" /></a><br />GWTServiceUsageExample : 테스트 클라이언트로 자동생성된 샘플 유저 인터페이스입니다.<br />서비스 호출에 사용되죠.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiC9McU2WN3KAhD7RUyzZ9Cn-XjcDzsP_nDSkkOorP8cMbGjLVLRuMwZj8WQOrURt4OATWrJfsJtGHdFUMtLzF2Ze7-dAcwRp1Aaq0yWz7uZkD-E-2zWAFviQkIzqaPHcxWYSKu1ttbbaEl/s1600/nb69_GWT_28.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488092246761377506" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiC9McU2WN3KAhD7RUyzZ9Cn-XjcDzsP_nDSkkOorP8cMbGjLVLRuMwZj8WQOrURt4OATWrJfsJtGHdFUMtLzF2Ze7-dAcwRp1Aaq0yWz7uZkD-E-2zWAFviQkIzqaPHcxWYSKu1ttbbaEl/s400/nb69_GWT_28.jpg" /></a><br />이제, GWTServiceUsageSample 객체를 초기화하여 서비스를 호출하기 위한 엔트리 포인트 클래스를 수정하도록 하겠습니다.<br />MainEntryPoing.java 의 메인 엔트리 포인트의 onModulLoad() 메소드를 수정합니다.<br />기존의 기본 샘플의 GWT 라벨 및 버튼 작업을 모두 지우고(주석처리), GWTServiceUsageExample 인스턴스를 추가합니다.<br />-----------------------------------------------<br />public void onModuleLoad() {<br />RootPanel.get().add(new GWTServiceUsageExample());<br />}<br />-----------------------------------------------<br />참고 : sampleservice.GWTServiceUsageExample 임포트 문제가 생깁니다. 이러한 임포트 문제 해결은 왼쪽 칼럼에 작게 나타나는 HINT(전구모양아이콘)을 눌러 add import... 등을 사용하시거나 아니면 편집기 창 여백에서 마우스오른쪽을 클릭하여 fix import 메뉴를 사용하셔도 됩니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihEI086QoXwUVyOp5dsajtmhd7pmXPFW6mNlQkgNfbiDVp0oiwKcapzHfvA7tu8YN99XE6wkKWW2iGbpzSU2S2bM7MXB5T63OFmSDp0_Zsl1NjH4ICJCBGU0isePmof7jntI_5zp8zbY_T/s1600/nb69_GWT_29.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488092241849421522" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihEI086QoXwUVyOp5dsajtmhd7pmXPFW6mNlQkgNfbiDVp0oiwKcapzHfvA7tu8YN99XE6wkKWW2iGbpzSU2S2bM7MXB5T63OFmSDp0_Zsl1NjH4ICJCBGU0isePmof7jntI_5zp8zbY_T/s400/nb69_GWT_29.jpg" /></a> 프로젝트에서 마우스 오른쪽을 클릭하여 실행<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjq325cXHoaC-jgKmoCQBW0Hh59IWwwGlvKVx3eAqQzbDHGOi3zjr91N2-vfWYIqBgl8yUR2wuueYETxCP2mnWg6f0sYkgT7FUey3oPwjB6qiYMNcd5lRmQrTV4YBK2qwrOJMNOcQQMW1F5/s1600/nb69_GWT_30.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488092234110594034" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjq325cXHoaC-jgKmoCQBW0Hh59IWwwGlvKVx3eAqQzbDHGOi3zjr91N2-vfWYIqBgl8yUR2wuueYETxCP2mnWg6f0sYkgT7FUey3oPwjB6qiYMNcd5lRmQrTV4YBK2qwrOJMNOcQQMW1F5/s400/nb69_GWT_30.jpg" /></a> 브라우저에 아래 그림처럼 텍스트 입력박스와 버튼이 제시됩니다.<br />메시지를 넣고(예, Why not? )버튼을 누르면 아래 Server says: Why not? 이 보여집니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGChcPpNlka9KeYcLpmEaPUG-XjBGGNyeDBRKCio-L-B2-OO2wN2jP5QhI9n04zawWvjn_krA7-P9N2Bt3HR17JHtF088Lij4uWXIaIBxQicTmEXaaK-wNeSsxIPzRvfXQ23iJubPU1Ezz/s1600/nb69_GWT_31.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 209px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488094572141574498" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGChcPpNlka9KeYcLpmEaPUG-XjBGGNyeDBRKCio-L-B2-OO2wN2jP5QhI9n04zawWvjn_krA7-P9N2Bt3HR17JHtF088Lij4uWXIaIBxQicTmEXaaK-wNeSsxIPzRvfXQ23iJubPU1Ezz/s400/nb69_GWT_31.jpg" /></a> 이제 GWT RPC 마법사를 사용하여 GWT RPC 서비스를 만드는 방법에 대해 살펴봤습니다.<br /><br />*************************************************************************<br /><br />이제 다음 세션에서는 이 자동생성된 클래스를 확장하여 서비스를 커스텀하는 작업과 호스트 페이지에 스타일시트를 덧붙이는 방법등에 대해 알아 보겠습니다.<br /><br />자동 생성된 클래스 확장하기 위해 현재 작업된 서블릿 내용에 대해 다시 한번 점검해보도록 합시다.<br />web.xml 에 가면 서블릿과 서블릿 매핑 내용이 나옵니다. 확인<br />-------------------------------------------------------<br /><servlet><br /><servlet-name>GWTService</servlet-name><br /><servlet-class>org.yournamehere.server.sampleservice.GWTServiceImpl</servlet-class><br /></servlet><br /><servlet-mapping><br /><servlet-name>GWTService</servlet-name><br /><url-pattern>/org.yournamehere.Main/sampleservice/gwtservice</url-pattern><br /></servlet-mapping><br />-------------------------------------------------------<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimpRpfSXhe7HsxKgZgZ0CgwWQUEqZxSBKjKt7rdb00fE0n7_8hAn4w-P9M7I76eC2BD_iha7G92n6GbbpbxNAbz8g9TWTYe2wAemcdJuxvB4AVMuHfEi1hj36o3OSniDba7DN-ujIv_wV7/s1600/nb69_GWT_32.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488094566826126178" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimpRpfSXhe7HsxKgZgZ0CgwWQUEqZxSBKjKt7rdb00fE0n7_8hAn4w-P9M7I76eC2BD_iha7G92n6GbbpbxNAbz8g9TWTYe2wAemcdJuxvB4AVMuHfEi1hj36o3OSniDba7DN-ujIv_wV7/s400/nb69_GWT_32.jpg" /></a><br />이 클래스에서 랜덤 격언 생성자를 만들기 위해, GWTServiceImpl 인터페이스에 다음 내용을 작성합니다.<br />=======================================================<br />public class GWTServiceImpl extends RemoteServiceServlet implements GWTService {<br /><br />private Random randomizer = new Random();<br />private static final long serialVersionUID = -15020842597334403L;<br />private static List quotes = new ArrayList();<br /><br />static {<br />quotes.add("No great thing is created suddenly - Epictetus");<br />quotes.add("Well done is better than well said - Ben Franklin");<br />quotes.add("No wind favors he who has no destined port - Montaigne");<br />quotes.add("Sometimes even to live is an act of courage - Seneca");<br />quotes.add("Know thyself - Socrates");<br />}<br /><br />public String myMethod() {<br />return (String) quotes.get(randomizer.nextInt(5));<br />}<br /><br />}<br />=======================================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVdGQQpBn8ayjBm3jcfRwHT51DieuTEtbmJAHl_dcjDqJ43fp0ll8X7ajTzFXDMjloWrrrup7MgICY_LkqOWSdDbg4Tl_R5RHwBSTkRqTkGMgzijE4iyqE8ISjMTZz-qeo1_Tm80LOkQPQ/s1600/nb69_GWT_33.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488094557962531858" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVdGQQpBn8ayjBm3jcfRwHT51DieuTEtbmJAHl_dcjDqJ43fp0ll8X7ajTzFXDMjloWrrrup7MgICY_LkqOWSdDbg4Tl_R5RHwBSTkRqTkGMgzijE4iyqE8ISjMTZz-qeo1_Tm80LOkQPQ/s400/nb69_GWT_33.jpg" /></a> 임포트 관련 문제가 오류로 나타나니 해결방법은 편집기 여백에서 마우스 오른쪽을 클릭하고<br />fix import (가져오기 고정 --;)을 선택합니다. 그럼 2개 이상의 임포트 선택권이 있는 경우<br />팝업창이 제시됩니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhk0oOHmGsj1zAetnQc9Y3HII3U9n7FPFIFkpgcfyTk4ssUKH847V_mO-TD1j-2UHxFC3sVf6eijXxdc7EpYFbUf0zTd0c639uEKF9lwReKwD-AlbotTO2gSsqHSc23T1YELU72Q1JXyFln/s1600/nb69_GWT_34.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488094548488185874" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhk0oOHmGsj1zAetnQc9Y3HII3U9n7FPFIFkpgcfyTk4ssUKH847V_mO-TD1j-2UHxFC3sVf6eijXxdc7EpYFbUf0zTd0c639uEKF9lwReKwD-AlbotTO2gSsqHSc23T1YELU72Q1JXyFln/s400/nb69_GWT_34.jpg" /></a>그림을 참고하여 맞는 클래스를 선택합니다.<br />List - java.util.List<br />ArrayList - java.util.ArrayList<br />Random - java.util.Random - OK<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwak3B3GdtYefhiNvneXdWfCaZMbDP9BSNGSCJLmnX4-j_HjfmwdNQRgpVO29pKv2IQQYTz55ivzu8WcePWWNUYrv846cv4kkIHY1qsuafninr66kOszJTTKXqXVJ5BmtTAH6CJg5P5Vfv/s1600/nb69_GWT_35.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 224px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488094542000366370" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwak3B3GdtYefhiNvneXdWfCaZMbDP9BSNGSCJLmnX4-j_HjfmwdNQRgpVO29pKv2IQQYTz55ivzu8WcePWWNUYrv846cv4kkIHY1qsuafninr66kOszJTTKXqXVJ5BmtTAH6CJg5P5Vfv/s400/nb69_GWT_35.jpg" /></a> MainEntryPoint 클래스, 어플리케이션의 엔트리 포인트 클래스로부터 직접 서비스를 호출하도록 다음과 같이 소스 작업을 추가합니다. (getService() 메소드)<br />=====================================================<br />public class MainEntryPoint implements EntryPoint {<br /><br />/**<br />* Creates a new instance of MainEntryPoint<br />*/<br />public MainEntryPoint() {<br />}<br /><br /><strong>public static GWTServiceAsync getService() {<br />// Create the client proxy. Note that although you are creating the<br />// service interface proper, you cast the result to the asynchronous<br />// version of the interface. The cast is always safe because the<br />// generated proxy implements the asynchronous interface automatically.<br /><br />return GWT.create(GWTService.class);<br />}</strong><br />...<br />=====================================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmfBxgkOJkbSRUICroqLX_Q9_oKwMrBLPMIzqQ7f38hPYtgPz7SMjIqzaJDiDZSSjQqdR8tcE5LUBzZRkoWZBuBl7Zg9FGqFRZ75D6MWfMQdDfPiW-w8MFa0hxVj0e3pzr0ooHS6ZrsUQ-/s1600/nb69_GWT_36.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488097223985792274" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmfBxgkOJkbSRUICroqLX_Q9_oKwMrBLPMIzqQ7f38hPYtgPz7SMjIqzaJDiDZSSjQqdR8tcE5LUBzZRkoWZBuBl7Zg9FGqFRZ75D6MWfMQdDfPiW-w8MFa0hxVj0e3pzr0ooHS6ZrsUQ-/s400/nb69_GWT_36.jpg" /></a> 역시 임포트문제는 fix import (가져오기 고정)으로 해결 (확인)<br />import com.google.gwt.core.client.GWT;<br />import org.yournamehere.client.sampleservice.GWTService;<br />import org.yournamehere.client.sampleservice.GWTServiceAsync;<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRvYiuvcujsZ_heELWUgxGBWQuPxkP7FMhlIIAiFoHP37fAoYBMvHyu_rD_piqDQSU8qbol-4PzWc5GtuVxvWsrdTGv6ybuV30JEBsU1Yp6X1RadBmlnD0JI0zXUUE8sID__0viztSzqgY/s1600/nb69_GWT_37.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488097216469495890" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRvYiuvcujsZ_heELWUgxGBWQuPxkP7FMhlIIAiFoHP37fAoYBMvHyu_rD_piqDQSU8qbol-4PzWc5GtuVxvWsrdTGv6ybuV30JEBsU1Yp6X1RadBmlnD0JI0zXUUE8sID__0viztSzqgY/s400/nb69_GWT_37.jpg" /></a><br />onModulLoad() 메소드를 다음과 같이 변경합니다.<br />================================================<br />public void onModuleLoad() {<br /><br />final Label quoteText = new Label();<br /><br />Timer timer = new Timer() {<br /><br />public void run() {<br />//create an async callback to handle the result:<br />AsyncCallback callback = new AsyncCallback() {<br /><br />public void onFailure(Throwable arg0) {<br />//display error text if we can't get the quote:<br />quoteText.setText("Failed to get a quote");<br />}<br /><br />public void onSuccess(Object result) {<br />//display the retrieved quote in the label:<br />quoteText.setText((String) result);<br />}<br />};<br />getService().myMethod(callback);<br />}<br />};<br /><br />timer.scheduleRepeating(1000);<br />RootPanel.get().add(quoteText);<br /><br />}<br />================================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnSlQF1MObXBbhJWdrGA2PReuaityoWXrDLEe6DYyMrtDmbDM4W7CSjXunyjoyX9ZRGQzoH2n3Xo4r72A84tqAt_nPUPF5peoN_OSeNf6R2jIvb1NLlkk37i19hLJ6B7-ZYLuiMZHAnn83/s1600/nb69_GWT_38.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488097214050759490" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnSlQF1MObXBbhJWdrGA2PReuaityoWXrDLEe6DYyMrtDmbDM4W7CSjXunyjoyX9ZRGQzoH2n3Xo4r72A84tqAt_nPUPF5peoN_OSeNf6R2jIvb1NLlkk37i19hLJ6B7-ZYLuiMZHAnn83/s400/nb69_GWT_38.jpg" /></a> 역시 임포트 문제는 fix import (가져오기 고정)으로 해결<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0UjWtAXPnSIYvPn-jRmnx3ppXrBjNfuleWRProHJ1kx6uJZ19h9ClZM21S9D-M9oP5OSn0dNCu0SjcKF_YR3-CKqZ1vgJekbbvrqBjn0xz2k9NF1d3GNcUjr123xq7ca1w-DkXZfFnWYl/s1600/nb69_GWT_39.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488097210424614754" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0UjWtAXPnSIYvPn-jRmnx3ppXrBjNfuleWRProHJ1kx6uJZ19h9ClZM21S9D-M9oP5OSn0dNCu0SjcKF_YR3-CKqZ1vgJekbbvrqBjn0xz2k9NF1d3GNcUjr123xq7ca1w-DkXZfFnWYl/s400/nb69_GWT_39.jpg" /></a>Timer - com.google.gwt.user.client.Timer<br />AsyncCallBack - com.google.gwt.user.client.rpc.AsyncCallback<br />Label - com.google.gwt.user.client.ui.Label (확인)<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhks5OhY3ZEGUp9sk2G5yum_XDLxsSyigski5mMM6kj4gR35JbObbrTm1IVxX5JnZaYfrIY1zdSgw7e7t613Yv37HEq_bjAqdHGsNykq90sQVZYd4gUFXSe0bYyriUYDKoqmsJ_stb5DbkD/s1600/nb69_GWT_40.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 196px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488097199800603682" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhks5OhY3ZEGUp9sk2G5yum_XDLxsSyigski5mMM6kj4gR35JbObbrTm1IVxX5JnZaYfrIY1zdSgw7e7t613Yv37HEq_bjAqdHGsNykq90sQVZYd4gUFXSe0bYyriUYDKoqmsJ_stb5DbkD/s400/nb69_GWT_40.jpg" /></a> String 매개변수를 받는 기존 myMethod 을 변경합니다.<br />GWTService 에서는<br />========================================================<br />public interface GWTService extends RemoteService {<br /><strong>public String myMethod();</strong><br />}<br />========================================================<br />GWTServiceAsync 클래스에서는,<br />========================================================<br />public interface GWTServiceAsync {<br /><strong>public void myMethod(AsyncCallback callback);</strong><br />}<br />========================================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDnU0xjaXJnNW29Ht-Ns8Bzhz099gjYkROo0ft4wcVRbZLPOtRP4rYE1rOw63dM7ah-A7zvWu06swqpxNAx01L7yr-ipSQ0ayxwPvApkECaeIBmbdBmjHuRID_UJZ0MCk2cltimLXs25iQ/s1600/nb69_GWT_42.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488098735018972786" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDnU0xjaXJnNW29Ht-Ns8Bzhz099gjYkROo0ft4wcVRbZLPOtRP4rYE1rOw63dM7ah-A7zvWu06swqpxNAx01L7yr-ipSQ0ayxwPvApkECaeIBmbdBmjHuRID_UJZ0MCk2cltimLXs25iQ/s400/nb69_GWT_42.jpg" /></a> 그런 다음 GWTServiceUsageExample 클래스에서 onClick(XXX) 메소드를 수정합니다 (그림 참조)<br />========================================================<br />기존의 54라인을 주석처리하고 55라인 추가<br />//getService().myMethod(txtUserInput.getText(),callback);<br />getService().myMethod(callback);<br />...<br />========================================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsiqxh67Iut6wGeZMMSpx8HXvR2dkAoKk2Y2N-YOTIKZxFSpjE_lXkBX9b19-VB0hh8Iz40mOxFnTMZGFkb4YXy7rkWXV1ZLrGbOBJMw8FM6NtQu8KsQ2I8W1mxfKTInaanRVJuFwkhiOt/s1600/nb69_GWT_43.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488098724793124130" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsiqxh67Iut6wGeZMMSpx8HXvR2dkAoKk2Y2N-YOTIKZxFSpjE_lXkBX9b19-VB0hh8Iz40mOxFnTMZGFkb4YXy7rkWXV1ZLrGbOBJMw8FM6NtQu8KsQ2I8W1mxfKTInaanRVJuFwkhiOt/s400/nb69_GWT_43.jpg" /></a> 프로젝트 - 실행<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEht45RdHgahnr8OZGQPNgPln0j814o2YS_UmmnwzyTE8kIjo9IKP69MEVgSlaxAzLDCAsUJaBTADLZ9jTztJs67JbNqVqlVPVimwLyYfyXKID1u1Slkkmbt3J_EpRkuup9UfmUhiMMyjHvC/s1600/nb69_GWT_44.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488098718596188786" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEht45RdHgahnr8OZGQPNgPln0j814o2YS_UmmnwzyTE8kIjo9IKP69MEVgSlaxAzLDCAsUJaBTADLZ9jTztJs67JbNqVqlVPVimwLyYfyXKID1u1Slkkmbt3J_EpRkuup9UfmUhiMMyjHvC/s400/nb69_GWT_44.jpg" /></a> 브라우저가 열리고 서버에서 매초마다 보내진 격언(인용) 문장이 랜덤으로 제시됩니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEFKw00fU_RHUc6Xbt_POrib8ZWumNwioArC4zi0yvJFrghfomSCGBuK6iETU7wsK1WQCU9A5PxWh58KpW-5zx6Ev-rpWiHUsu3vRUYivH1SFpY4RTuy6OJRyIyGLTGzwDQnj_kgrYF-4p/s1600/nb69_GWT_45.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 244px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488098709794667618" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEFKw00fU_RHUc6Xbt_POrib8ZWumNwioArC4zi0yvJFrghfomSCGBuK6iETU7wsK1WQCU9A5PxWh58KpW-5zx6Ev-rpWiHUsu3vRUYivH1SFpY4RTuy6OJRyIyGLTGzwDQnj_kgrYF-4p/s400/nb69_GWT_45.jpg" /></a>이제 다음 게시물에서는 여기에 스타일 시트를 추가하여 인용 문장의 외관모양을 좀더 좋게 바꿔보도록 하겠습니다.<br />to be continued...강여사(J.Y.Kang)http://www.blogger.com/profile/17450510931308610527noreply@blogger.com0tag:blogger.com,1999:blog-6811062799606447528.post-33612047658744292852010-06-28T22:55:00.000-07:002010-07-01T04:03:02.155-07:00넷빈(NetBeans)6.9에서 Google Web Toolkit 사용하기 02 - 소스 구조 살펴보기앞서 게시물에 이어 기본으로 만들어진 GWT 어플리케이션의 소스 구조에 대해 살펴보도록 하겠습니다.<br /><br />일단..<br /><br />Main.gwt.xml : 프로젝트 모듈 파일로, 프로젝트 루트 패키지에 있습니다. GWT 프로젝트의 필수 어플리케이션 구성이 들어있죠. <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKC4qz-dvNNcJSLATGfvwe5yx6AQdAEUCNg9HbiRvT_Z3BJhjqN6KA5-uTIWjGGXaAZaPI_bW-JrOslpAmODKh-FzuxKTj41LEHRXdVJBeXaBuZr6Ghh1A0ypshQmJGnbMjU9ChMD0COdX/s1600/nb69_GWT_17.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488079155286415922" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKC4qz-dvNNcJSLATGfvwe5yx6AQdAEUCNg9HbiRvT_Z3BJhjqN6KA5-uTIWjGGXaAZaPI_bW-JrOslpAmODKh-FzuxKTj41LEHRXdVJBeXaBuZr6Ghh1A0ypshQmJGnbMjU9ChMD0COdX/s400/nb69_GWT_17.jpg" /></a><br />기본 내용은 다음과 같습니다.<br />=================================================<br /><?xml version="1.0" encoding="UTF-8"?><br /><module><br /><inherits name="com.google.gwt.user.User"/><br /><entry-point class="org.yournamehere.client.MainEntryPoint"/><br /><!-- Do not define servlets here, use web.xml --><br /></module><br />=================================================<br />inherits: 이 모듈이 상속받은 모듈, 여기서는 GWT 프레임워크에 내장된 User 모듈을 제공받고 있습니다. 이러한 모듈 상속은 프로젝트가 복잡해질수록 더욱 재사용성이 좋죠.<br />entry-point: 모듈이 로드될 떄 GWT프레임워크에 의해 초기화되는 클래스 참조 (보다 자세한 내용은 <a href="http://code.google.com/webtoolkit/doc/1.6/DevGuideOrganizingProjects.html#DevGuideModuleXml">http://code.google.com/webtoolkit/doc/1.6/DevGuideOrganizingProjects.html#DevGuideModuleXml</a> 참고 )<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSVUNPBn0z36Lo6-8i9Mc6S-Wg9SA77Q-_RqzFQsu59-l6XR2Phopnt8Gs6vzh1-60eP1Lj3ZfGI81ueXOH7ZqJNYJS6NNrjA8i40YBe_rrCe_qRuJhbvWe0ytaHjgT9khJErr8QwHJqg8/s1600/nb69_GWT_18.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488079148978240818" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSVUNPBn0z36Lo6-8i9Mc6S-Wg9SA77Q-_RqzFQsu59-l6XR2Phopnt8Gs6vzh1-60eP1Lj3ZfGI81ueXOH7ZqJNYJS6NNrjA8i40YBe_rrCe_qRuJhbvWe0ytaHjgT9khJErr8QwHJqg8/s400/nb69_GWT_18.jpg" /></a><br />이번엔 MainEntryPoint.java : 어플리케이션의 메인 엔트리 포인트로 , Main.gwt.xml 에 지정됩니다. EntryPoing 클래스를 상속받아, GWT 모듈이 프레임워크에 의해 로드될 때, 이 클래스가 초기화되고, onModuleLoad() 메소드가 자동으로 호출됩니다.<br />기본 내용은 다음과 같습니다.<br />=================================================<br />package org.yournamehere.client;<br /><br />import com.google.gwt.core.client.EntryPoint;<br />import com.google.gwt.user.client.ui.Button;<br />import com.google.gwt.user.client.ui.ClickListener;<br />import com.google.gwt.user.client.ui.Label;<br />import com.google.gwt.user.client.ui.RootPanel;<br />import com.google.gwt.user.client.ui.Widget;<br /><br />public class MainEntryPoint implements EntryPoint {<br /><br />/** Creates a new instance of MainEntryPoint */<br />public MainEntryPoint() {<br />}<br /><br />/**<br />The entry point method, called automatically by loading a module<br />that declares an implementing class as an entry-point<br />*/<br />public void onModuleLoad() {<br />final Label label = new Label("Hello, GWT!!!");<br />final Button button = new Button("Click me!");<br /><br />button.addClickListener(new ClickListener(){<br />public void onClick(Widget w) {<br />label.setVisible(!label.isVisible());<br />}<br />});<br /><br />RootPanel.get().add(button);<br />RootPanel.get().add(label);<br />}<br /><br />}<br />=================================================<br />넷빈이 제공하는 기본 샘플에는 onModuleLoad() 메소드에 다음 2개의 컴포넌트가 추가되어 있습니다.<br />Label: GWT 라벨이 만들어지고, 'Hello, GWT!!' 라고 표시됩니다. 이 라벨은 RootPanel 에서 추가됩니다. RootPanel.get().add(label).<br />Button: GWT 버튼이 만들어지고, 역시 'Click me!' 라고 문자가 표시됩니다. 이 버튼에는 버튼 리스너가 동작하는데 ClickListner 에 의해 구현되어 있습니다. 아래 소스처럼 버튼 클릭시 라벨이 숨겨지는 동작을 처리하도록 되어 있습니다. 버튼 역시 RootPanel 에서 추가되었습니다.<br />================================================<br />public void onClick(Widget w) {<br />label.setVisible(!label.isVisible());<br />}<br />================================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5PgygWEbe5H69akGH4nRdaRHh5D41XsiAAeZQhoLBDv7R_1AR_V8hAT8NTFAm0JOcGpBqMYjneFAJU0uisIArsdCT9w-m3Sin5HsIj-wjlhLEHtA3CXfPVHoI4rtK4Dhte2KBJnXraAFw/s1600/nb69_GWT_19.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488079140467738994" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5PgygWEbe5H69akGH4nRdaRHh5D41XsiAAeZQhoLBDv7R_1AR_V8hAT8NTFAm0JOcGpBqMYjneFAJU0uisIArsdCT9w-m3Sin5HsIj-wjlhLEHtA3CXfPVHoI4rtK4Dhte2KBJnXraAFw/s400/nb69_GWT_19.jpg" /></a><br />이번에는 welcomeGWT.html 입니다 : 자동생성된 HTML 호스트 페이지는 어플리케이션의 welcome 페이지로 설계되어 있습니다. 당연 web.xml 에 해당 파일이 welcome-file 엘리먼트에 지정되어 있겠구요.<br />이 호스트 페이지는 자바스크립트 소스 코드를 참조하고 어플리케이션의 스타일 시트를 참조할 수 있습니다.<br />기본 내용은 다음과 같습니다.<br />================================================<br /><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><br /><html><br /><head><br /><meta name='gwt:module' content='org.yournamehere.Main=org.yournamehere.Main'><br /><title>Main</title><br /></head><br /><body><br /><script language="javascript" src="org.yournamehere.Main/org.yournamehere.Main.nocache.js"></script><br /></body><br /></html><br />================================================<br />meta : 어플리케이션 프로젝트 경로를, 이 태그가 HTML 페이지와 어플리케이션 간의 링크를 제공합니다.<br />script: GWT 프레임워크의 자바스크립트 파일로부터 코드 임포트(불러오기). 이 파일은 GWT 프레임워크를 부트스트립하는데 필수 코드를 포함하고 있습니다. 프로젝트 모듈안의 구성을 사용하여 동적으로 어플리케이션을 나타내는 엔트리 포인트를 컴파일하여 만든 자바 스크립트를 로드하게 됩니다.<br />따라서 어플리케이션이 호스트된 모드로 실행되거나 어플리케이션을 컴파일 할때, GWT 프레임워크에 의해서 자바스크립트 파일이 자동생성됩니다.<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifNtPR2pYomIYtLm79Fggj3etIcoxSJMZPHAlfouUmrf93hKuYTU0pmX0E5dJKAyvnRHHs4rDDyLjYefdEQOxCYOYh7FvBu9hUSOq-qM3oizarXSdACXvz3tSP_Qww_IE8ih9vZEFdj6GJ/s1600/nb69_GWT_20.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488079131846313378" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifNtPR2pYomIYtLm79Fggj3etIcoxSJMZPHAlfouUmrf93hKuYTU0pmX0E5dJKAyvnRHHs4rDDyLjYefdEQOxCYOYh7FvBu9hUSOq-qM3oizarXSdACXvz3tSP_Qww_IE8ih9vZEFdj6GJ/s400/nb69_GWT_20.jpg" /></a> 이상이 간단하게나마 살펴본 GWT 조사내용입니다.<br /><br />이제 다음 예제에서는 여기서 AJAX random 글을 표시하는 어플리케이션을 붙여보도록 하겠습니다.<br /><br />to be continued...강여사(J.Y.Kang)http://www.blogger.com/profile/17450510931308610527noreply@blogger.com0tag:blogger.com,1999:blog-6811062799606447528.post-70151545287378230082010-06-28T16:52:00.000-07:002010-07-01T04:03:02.155-07:00넷빈(NetBeans)6.9에서 Google Web Toolkit 사용하기 01 - 설치이번에는 GWT를 설치 사용해보도록 하겠습니다.<br /><br />GWT는 Google Web Toolkit 의 첫글자로 자바를 사용, 높은 성능의 AJAX 어플리케이션을 쉽게 만들어내도록 해주는 오픈 소스 웹 개발 프레임워크입니다. (자세한 내용은 역시 GWT 홈페이지에서 ^^;; <a href="http://code.google.com/webtoolkit/">http://code.google.com/webtoolkit/</a> )<br /><br />GWT를 사용하면, 여러분은 자바로 앞단을, 그리고 여러분의 소스 코드는 최적화된, 브라우저 호환 자바스크립트 및 HTML로 컴파일됩니다. GWT 홈페이지에 가면 어쩌구 저쩌구 더 잘 써있습니다. 꼬옥 가서 보시길 ^^;<br /><br />이번에는 넷빈즈 IDE에 GWT를 어떻게 설치 연결하여 사용하는 지와 기타 여러가지를 살펴볼 예정입니다.<br /><br />우선 필요환경에 대해서 살펴보면,<br /><br />넷빈즈 6.9 (6.9로 진행했습니다만 6.5/7/8/9) 다 됩니다. (뭐 약간 내용상 틀릴수는 있지만 ^^;)<br /><br />물론 JDK 5 이상이 설치되어 있어야 하구요 (저는 JDK 6update20 입니다)<br /><br />서버:글래스피시 2.1 ~ 3.0.1 까지 다 됩니다 (저는 glassfish 3.0.1 로 진행했습니다), 또는 톰캣으로 진행하서도 됩니다. 톰캣 버전은 6.x 이상<br /><br />그리고 GWT SDK 가 있어야 합니다. GWT 홈페이지에 가서 다운로드 받아 압축을 푸는 게 설치의 다 입니다. 따로 인스톨러는 없습니다. (게시물 중간에 나옵니다. 버전은 1.5 이상이시면 됩니다. 오늘 시점의 가장 최신 버전으로 받았습니다)<br /><br />그리고 넷빈즈 GWT 플러그인. 위의 SDK 말고 넷빈즈 연결 플러그인이 필요합니다. 이건 넷빈즈 GWT 프로젝트홈페이지에서 받아 설치합니다. 게시물에 바로 아래 나옵니다)<br /><br />위에서 설명한 대로 플러그인이 필요합니다. 그거부텀 시작해보겠습니다.<br /><br /><a href="https://gwt4nb.dev.java.net/">https://gwt4nb.dev.java.net/</a><br /><br />GWT 플러그인을 제공하는 사이트 입니다.<br />물론 원래 플러그인은 넷빈즈 IDE의 플러그인 매니저에서도 다운로드 받을 수 있도록 되어 있지만 현재 넷빈즈 6.9 에서 돌아가기 위한 버전은 아직 업데이트 센터에 안 올라와서(조만간 올라올겁니다) 직접 받도록 하겠습니다.<br />(오늘 시점에 플러그인 매니저로 설치되는 버전은 직접 다운로드 받는 거의 하위 버전입니다)<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGJ2sVj8gm2jnMOWvhoNfAYoK-FV1Rj6ZRR36jOhLyAq-FqvT9XRFyVTSify-j5PocsBIb7M1A5xfXBGtL1BBr_KYdQ8YRk6DB_OxjlI52Mgyk_OiZK9yCrnkwgRZ4fMAoc-aGm5lk-b7z/s1600/nb69_GWT_001.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 357px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5487980980060458338" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGJ2sVj8gm2jnMOWvhoNfAYoK-FV1Rj6ZRR36jOhLyAq-FqvT9XRFyVTSify-j5PocsBIb7M1A5xfXBGtL1BBr_KYdQ8YRk6DB_OxjlI52Mgyk_OiZK9yCrnkwgRZ4fMAoc-aGm5lk-b7z/s400/nb69_GWT_001.jpg" /></a><br />downloads를 누릅니다.<br />그럼 release 들이 제시되는데 맨 아래 2.8.0 버전을 선택하여 다운로드 받습니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXf5mtKBM00jhUvhH9l5CTFYtu3PWyuSrdWIHp5mmDH-y7iYzvnluOTuQhL6wqwsJ06SgqRrs954oYLKv8i6X4AiBptH2l6BSVOcG4wTMq8AFABfSA1yHEuoBZheVvVl42XesLpGxh7KXv/s1600/nb69_GWT_002.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 269px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5487980969852939362" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXf5mtKBM00jhUvhH9l5CTFYtu3PWyuSrdWIHp5mmDH-y7iYzvnluOTuQhL6wqwsJ06SgqRrs954oYLKv8i6X4AiBptH2l6BSVOcG4wTMq8AFABfSA1yHEuoBZheVvVl42XesLpGxh7KXv/s400/nb69_GWT_002.jpg" /></a> 이제 IDE를 시작하여 도구- 플러그인 을 클릭합니다<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTzOk1iU9FGXjE2-WSW00L5RrJnDLyP3CXW6ti_2boZWZW17p6NxK0BPmvHMWJunq8-oCURYuLO16KuasNLeiV8TFQs9XyuC0v5bhbaqxyYzibdhfA4H_QdJy0P6YHGoFyWPBjXdMiIj39/s1600/nb69_GWT_01.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5487982208649383058" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTzOk1iU9FGXjE2-WSW00L5RrJnDLyP3CXW6ti_2boZWZW17p6NxK0BPmvHMWJunq8-oCURYuLO16KuasNLeiV8TFQs9XyuC0v5bhbaqxyYzibdhfA4H_QdJy0P6YHGoFyWPBjXdMiIj39/s400/nb69_GWT_01.jpg" /></a><br />다운로드 받은 플러그인을 설치하려면 다운로드 탭을 누르고 아래 플러그인 추가 버튼을 클릭하면 그림과 같이 팝업창이 제시됩니다.<br />그럼 팝업창에서 다운로드 받은 nbm 파일을 찾아 엽니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhJ_EgbTfrS3jKS5SPST_Iibp_kcXQhChgMsNv2EyQ7lC-iN84rQ_nOWSdw7vWkMNtrde-RhgZ_tJkG-gtnYtedyi0Hhh44EAuLe5Oy8Qr64yyenHyvs_y1VModBu3hUQ6t_OIeZt8FUT4/s1600/nb69_GWT_02.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5487982201205820370" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhJ_EgbTfrS3jKS5SPST_Iibp_kcXQhChgMsNv2EyQ7lC-iN84rQ_nOWSdw7vWkMNtrde-RhgZ_tJkG-gtnYtedyi0Hhh44EAuLe5Oy8Qr64yyenHyvs_y1VModBu3hUQ6t_OIeZt8FUT4/s400/nb69_GWT_02.jpg" /></a> 아래 그림처럼 제시되면 왼쪽 아래에 설치 버튼을 누릅니다<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUsouRtZZXD1lEECgcz5h-hrXFyAbxOYSXCogRcr1k9tPOQ8Gh9B3iXta7pNzE2Uk7-YtAq3a5l74YHVI4HT_U04WtdQQNZaf0r0aVQVpW0gvzsyK9wPb_NPERt8tmLJ3XyVzuj8TFqrgp/s1600/nb69_GWT_03.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 251px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5487982195200976018" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUsouRtZZXD1lEECgcz5h-hrXFyAbxOYSXCogRcr1k9tPOQ8Gh9B3iXta7pNzE2Uk7-YtAq3a5l74YHVI4HT_U04WtdQQNZaf0r0aVQVpW0gvzsyK9wPb_NPERt8tmLJ3XyVzuj8TFqrgp/s400/nb69_GWT_03.jpg" /></a> 설치 프로그램에 따라 계속 실행하시면 됩니다. - 다음<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWu22Hc80z7As7aYNwdT_UXpqyjm2VlGtYQQfKT5Z2EycISWJ572tni2KfHG1TFDfrKhIsueBr3HkAfhVUS7MLZi59Dvh4qbUT9-kttfooKdvcaft43QrF9GnhK_mapOkrcTp0Wd8F1RVc/s1600/nb69_GWT_04.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 357px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5487982179443488866" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWu22Hc80z7As7aYNwdT_UXpqyjm2VlGtYQQfKT5Z2EycISWJ572tni2KfHG1TFDfrKhIsueBr3HkAfhVUS7MLZi59Dvh4qbUT9-kttfooKdvcaft43QrF9GnhK_mapOkrcTp0Wd8F1RVc/s400/nb69_GWT_04.jpg" /></a> 인증 서명 경고가 뜨지만 무시하고 계속<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCflEhDJyqsPAKjiZkGIhlnKXtZuJiNKjlUVQ6bPgzsbNEmVkyqa62uTgZ6GjS_ob4sxPB82uYDGs9mUh0X8iC6nxef7XQpnJjQ2Nhd6F9ypDzzTx1OcwlTAcAb_RlEpsBo1BVEgvaZ0Ef/s1600/nb69_GWT_05.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 360px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5487982175619606434" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCflEhDJyqsPAKjiZkGIhlnKXtZuJiNKjlUVQ6bPgzsbNEmVkyqa62uTgZ6GjS_ob4sxPB82uYDGs9mUh0X8iC6nxef7XQpnJjQ2Nhd6F9ypDzzTx1OcwlTAcAb_RlEpsBo1BVEgvaZ0Ef/s400/nb69_GWT_05.jpg" /></a> 성공적으로 설치되면 마침<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2NTews4kgBdd4do0oVYw-8UWOCk7Xy1QTljwZBhX2SQeidai7HJizbWXb19gY_7_UyEvo_FlSnzYccuzArmhorWcMKM-LB0dUuD_TqcHh160UU_VABWnfsH_W-sUViBsOb8_pQ2JgLJgv/s1600/nb69_GWT_06.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 357px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5487983116754234898" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2NTews4kgBdd4do0oVYw-8UWOCk7Xy1QTljwZBhX2SQeidai7HJizbWXb19gY_7_UyEvo_FlSnzYccuzArmhorWcMKM-LB0dUuD_TqcHh160UU_VABWnfsH_W-sUViBsOb8_pQ2JgLJgv/s400/nb69_GWT_06.jpg" /></a> 이제 샘플 프로젝트를 만들어 보도록 하겠습니다.<br />프로젝트 창에서 마우스 오른쪽을 클릭하여 새 프로젝트<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrRUubC6qC0kscpFux6qqasbIbw02qvOHectANXIunGtZze_SQBj3W8x_cOb_pVOVp8IOqx2NeZRficiVqHo2adF9yOvq4ppjgMDfWgvoUETkzqrDIdmZlmZhIHeRsALpVUGViwFVt0kHm/s1600/nb69_GWT_07.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5487983111061071186" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrRUubC6qC0kscpFux6qqasbIbw02qvOHectANXIunGtZze_SQBj3W8x_cOb_pVOVp8IOqx2NeZRficiVqHo2adF9yOvq4ppjgMDfWgvoUETkzqrDIdmZlmZhIHeRsALpVUGViwFVt0kHm/s400/nb69_GWT_07.jpg" /></a><br />카테고리에서 Java Web - 프로젝트는 Web Application 선택<br />다음<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinveHONauYor8yLwL8MG2kHQipB4ZT55JjJbZJYGNIoU2qL71QBCtpbe65ErJ70ZaPZ0hpaswSKaVevDB3i9A7G6ZlUou5THpGY5T3JoQLaZ0_ELBQf6T3ZIyKZFZLYRXqMXHOdwWXV9fr/s1600/nb69_GWT_08.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5487983106403806610" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinveHONauYor8yLwL8MG2kHQipB4ZT55JjJbZJYGNIoU2qL71QBCtpbe65ErJ70ZaPZ0hpaswSKaVevDB3i9A7G6ZlUou5THpGY5T3JoQLaZ0_ELBQf6T3ZIyKZFZLYRXqMXHOdwWXV9fr/s400/nb69_GWT_08.jpg" /></a><br />프로젝트의 이름은 HelloGWT 로<br />경로는 적당히<br />다음<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjb2YM9BGdc6DeiI0X4Q1o3i_Ov54RA9UxJNOzS6z3VwydB7xCioaG_8apqK3cYaPqi1S5F9j5UGMK3j0w56pD3Em58M0ilDrdNJSc0CG_oWH9GzzhwKgN2MyC_rQR5eAiZsMbNZXuxuWWY/s1600/nb69_GWT_09.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5487983095839128882" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjb2YM9BGdc6DeiI0X4Q1o3i_Ov54RA9UxJNOzS6z3VwydB7xCioaG_8apqK3cYaPqi1S5F9j5UGMK3j0w56pD3Em58M0ilDrdNJSc0CG_oWH9GzzhwKgN2MyC_rQR5eAiZsMbNZXuxuWWY/s400/nb69_GWT_09.jpg" /></a> 서버 설정인데 이번 예제는 뭐 꼭 굳이 Glassfish 3.1 에서 할 필요는 없습니다, EE 6도.<br />저야 그냥 기본적으로 잡혀있는 이 2개로 진행했습니다.<br />다음<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioEqf2oxB3iznzqyYaYx4H-0C2iwoO11QMKojkZ6Fxepb4WuuKYh3JHXQs4o0s5pat6A8pi-2hf4oN2btcrTVorfR3Wq0WIpMdoOO6lif74QsajbWjhKdRnDdjf5JeFb76MQ1mTCgCJjIK/s1600/nb69_GWT_10.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 251px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5487983089314955682" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioEqf2oxB3iznzqyYaYx4H-0C2iwoO11QMKojkZ6Fxepb4WuuKYh3JHXQs4o0s5pat6A8pi-2hf4oN2btcrTVorfR3Wq0WIpMdoOO6lif74QsajbWjhKdRnDdjf5JeFb76MQ1mTCgCJjIK/s400/nb69_GWT_10.jpg" /></a><br />프레임워크 설정이 뜨는데 여기서 GWT(Google Web Toolkit)을 선택합니다.<br />그럼 원래는 SDK를 설치한 적이 없어 SDK 위치를 찾아 적으라고 나옵니다.<br />물론 경로(here)도 서비스되죠. here의 하이퍼 링크를 따라갑니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9MkYX5MVP5APIqWs-Nj5AYT_hiGKwHyv2lRIV3atuAwZ0tT65E9THVUF3JtpvVwHMLUVn9XnDNHzczdHSJ-zb92M9jjuoB1pL5j-4tQaYwnYP6JjnWtvWXdYUY2OpgVmmmTS_wN44MG7e/s1600/nb69_GWT_12.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 251px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5487984175396665586" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9MkYX5MVP5APIqWs-Nj5AYT_hiGKwHyv2lRIV3atuAwZ0tT65E9THVUF3JtpvVwHMLUVn9XnDNHzczdHSJ-zb92M9jjuoB1pL5j-4tQaYwnYP6JjnWtvWXdYUY2OpgVmmmTS_wN44MG7e/s400/nb69_GWT_12.jpg" /></a><br /><a href="http://code.google.com/intl/ko-KR/webtoolkit/">http://code.google.com/intl/ko-KR/webtoolkit/</a><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqe9CCXzwrY2cJ2sC52ZcZ_xN2jzGC_2CpJL5SZ2ri8MQoa1hxq14McbNUQarlUilRqMVGJs4_yA2BQz4QdXck9Brz2V6tOW-RI_dUFFzRUoiDQWAu6Ag26z02a-ClEcBboNX-PrJV4GIj/s1600/nb69_GWT_101.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 329px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5487985681468287586" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqe9CCXzwrY2cJ2sC52ZcZ_xN2jzGC_2CpJL5SZ2ri8MQoa1hxq14McbNUQarlUilRqMVGJs4_yA2BQz4QdXck9Brz2V6tOW-RI_dUFFzRUoiDQWAu6Ag26z02a-ClEcBboNX-PrJV4GIj/s400/nb69_GWT_101.jpg" /></a><br /><a href="http://code.google.com/intl/ko-KR/webtoolkit/download.html">http://code.google.com/intl/ko-KR/webtoolkit/download.html</a><br />위의 SDK를 받아 적당한 곳에 저장후 압축을 풉니다. (오늘 시점의 최신 버전은 GWT-2.0.3.zip 이네요)<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgH8V9aLcwT5B9frzjuXrCVmPBsGEF_TdHwEs_uVBVaXDQxMwLb3rqQWZ19FDJp7JbRhe_wEdfHGuvjTPtSNz9xkxY4v3opDWZ8R_r48QPIb-PqZP_xM8sTFaXYl-RokoHniNMeCZ6g87yv/s1600/nb69_GWT_11.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 341px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5487984181410002178" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgH8V9aLcwT5B9frzjuXrCVmPBsGEF_TdHwEs_uVBVaXDQxMwLb3rqQWZ19FDJp7JbRhe_wEdfHGuvjTPtSNz9xkxY4v3opDWZ8R_r48QPIb-PqZP_xM8sTFaXYl-RokoHniNMeCZ6g87yv/s400/nb69_GWT_11.jpg" /></a> 그럼 압축을 해제한 경로를 SDK로 맞춰줍니다. (저는 c 드라이브에 downdloads 경로에 풀어 아래 그림 처럼이 경로입니다. 아래 그림 참조) - 마침<br />참고로 GWT 프레임워크 선택시에는 2가지 필드 설정이 있습니다.<br />GWT 설치 폴더: GWT 가 설치되어 있는 워크스테이션의 경로. (없으면 빨강색의 에러메시지가 뜨죠)<br />GWT 모듈: 프로젝트 이름과 위치 설정입니다. 프로젝트 모듈은 GWT 어플리케이션을 구성하는 XML 파일입니다. 기본적으로 패키지 이름과 프로젝트 모듈 이름이 제시되어 나타나는데 기본으로는 org.yournamehere 이 패키지, Main 이 프로젝트 모듈 이름으로 잡혀 있습니다. 나중에는 알아서 변경하시면 됩니다.<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9MkYX5MVP5APIqWs-Nj5AYT_hiGKwHyv2lRIV3atuAwZ0tT65E9THVUF3JtpvVwHMLUVn9XnDNHzczdHSJ-zb92M9jjuoB1pL5j-4tQaYwnYP6JjnWtvWXdYUY2OpgVmmmTS_wN44MG7e/s1600/nb69_GWT_12.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 251px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5487984175396665586" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9MkYX5MVP5APIqWs-Nj5AYT_hiGKwHyv2lRIV3atuAwZ0tT65E9THVUF3JtpvVwHMLUVn9XnDNHzczdHSJ-zb92M9jjuoB1pL5j-4tQaYwnYP6JjnWtvWXdYUY2OpgVmmmTS_wN44MG7e/s400/nb69_GWT_12.jpg" /></a> 그럼 잠시 후 일련의 소스 구조 GWT 어플리케이션이 만들어집니다. 전 이래서 넷빈이 좋습니다. ㅋㅋ 뭘 공부해야할 지를 한눈에 알려준다는..--;<br /><br />나중에 하나씩도 살펴보겠지만 일단 GWT 관련 JAR 파일들이 포함되고, GWT 모듈 프로젝트 구성 파일, 자바 entry point 와 같은 표준 아티팩트들도 포함되어 있습니다. 플러그인이 없다면 수동으로 하나씩 하면 됩니다. 노가다로.. --;<br />플러그인 설치가 괜히 필요한 게 아닙니다. 마법사..좋아요..쿄쿄쿄<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBgl5XPWV4ylWuwQ7JNFDf9Va2roX8tHJKqA3VLZ3-JtqsbBdL_5W0FWJjJFRtiExE1IqcqUVjmHBX0ocgj0VmZl2Tw4MbNb3g_sFSvPy5xS8sqAP0Gy69LpY62ZmJnkXPL1m6EDDhz4oE/s1600/nb69_GWT_13.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5487984167541038162" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBgl5XPWV4ylWuwQ7JNFDf9Va2roX8tHJKqA3VLZ3-JtqsbBdL_5W0FWJjJFRtiExE1IqcqUVjmHBX0ocgj0VmZl2Tw4MbNb3g_sFSvPy5xS8sqAP0Gy69LpY62ZmJnkXPL1m6EDDhz4oE/s400/nb69_GWT_13.jpg" /></a><br />그럼 자동생성된 내용이 어떤 건지 보기위해 프로젝트를 바로 실행합니다.<br />프로젝트에서 마우스 오른쪽 클릭 - 실행<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_hyqrC9K1ZObsbpwZTTUF3YctMskGA44eUoWTb_fRir6GRBmMkPPoc5KgFI9Ye_y6jE-kThiA63I5Gk8hENdQL_1KpznIwHtQ2kamFs7QDZSAhyphenhyphenxdfyRrqXbwD00s1oj7uNkNl6X4HIbU/s1600/nb69_GWT_14.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 325px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5487984159442680578" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_hyqrC9K1ZObsbpwZTTUF3YctMskGA44eUoWTb_fRir6GRBmMkPPoc5KgFI9Ye_y6jE-kThiA63I5Gk8hENdQL_1KpznIwHtQ2kamFs7QDZSAhyphenhyphenxdfyRrqXbwD00s1oj7uNkNl6X4HIbU/s400/nb69_GWT_14.jpg" /></a> 브라우저에 아래 그림처럼 나타납니다. 버튼을 클릭하면 Hello, GWT 라는 텍스트가 사라집니다.<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgK8ORraaS8XWYCC_ykyeAjQkLJo7l8YWpogc2oiLuBwDx6FCbXSR85WE7DNzwecNZ4eYShGkSJVLBPSrk1N3RB5P9xrXkrz2av5J6-gtQ5syx7cJ0cNoMOewnneXP2pQvjD4Cs56-ciaKp/s1600/nb69_GWT_15.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 244px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5487984145489030978" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgK8ORraaS8XWYCC_ykyeAjQkLJo7l8YWpogc2oiLuBwDx6FCbXSR85WE7DNzwecNZ4eYShGkSJVLBPSrk1N3RB5P9xrXkrz2av5J6-gtQ5syx7cJ0cNoMOewnneXP2pQvjD4Cs56-ciaKp/s400/nb69_GWT_15.jpg" /></a> 일단, 여기서 끊죠.. 여기까지가 GWT 설치 및 기본 이었습니다.<br />이어서 GWT 어플리케이션의 소스 구조를 살펴보고 AJAX 어플리케이션도 만들어보겠습니다.<br />to be continued...강여사(J.Y.Kang)http://www.blogger.com/profile/17450510931308610527noreply@blogger.com0tag:blogger.com,1999:blog-6811062799606447528.post-7695943115046648092010-06-27T20:04:00.000-07:002010-07-01T03:51:16.094-07:00넷빈(NetBeans)6.9에서 ICEfaces-01-dataTable 사용하기넷빈(6.9)에서 ICEfaces-01-dataTable 사용하기 <br /><br />이번 게시물에서는 이번에 새로 나온 넷빈즈(NetBeans 6.9)에서 ICEfaces를 설치 및 활용하여 dataTable 를 사용해보도록 하겠습니다. <br /><br />ICEfaces 는 간단히 웹 프레임워크 중 하나로, JSF 기반 자바 테크롤로지를 사용하여 RIA를 구축해주는 포괄적인 개발 프레임워크라 할 수 있습니다. 또한 Ajax Push 를 사용하여 실시간 적 협업이 가능한 것도 장점으로 뽑을 수 있구요. <br /><br />예전 넷빈즈 6.5.1 버전때 기본으로 들어있던 Visual Web JSF 와 연결 Visual Web ICEfaces 는 그야말로 비주얼로 웹페이지를 디자인 해주는 좋은 기능이었죠. (이 VW ICEfaces는 넷빈즈 6.5.1 까지 지원되며 그 이상 넷빈즈에서 프로젝트를 이관(Migration)할 수는 있습니다만..<br /><br />일단 현재 ICEfaces에서 공급하는 넷빈즈 플러그인에서는 VW ICEFaces 플러그인은 공급하고 있지 않습니다. <br /><br />우선 작업환경은 다음과 같습니다. 넷빈즈 6.9 ICEfaces NetBeans 6.9 플러그인 (<a href="http://www.icefaces.org/">http://www.icefaces.org/</a>) 에서 다운로드 (ICEfaces 계정 필요)<br />서버는 넷빈즈 6.9에 있는 GlassFish v3 로 진행합니다.<br /><br />우선 가장 먼저 ICEfaces 에서 넷빈즈 6.9 플러그인을 다운로드 받고 넷빈즈 IDE 와 통합해야 합니다.<br />ICEfaces 홈페이지로 이동합니다.<br /><a href="http://www.icefaces.org/">http://www.icefaces.org/</a><br />음..좋군요. ^^<br />그럼 위에 메뉴에서 두번째 Downloads 를 누른 후 아래 제시된 조그만 팝업창에 Download Index를 클릭합니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiX_P1UH_q43sjbS251ZH_LFVfW4m0OJzc3-pDUxSSKRrzslVQLwPFN5TZxuLuILfCtvxnErquMDyHb_MJXGU80TgMUuYNzdeS6V0IDAJFQaeUnbB5Ok5XZLou5wFnbGGbNPIjPB8vIuaMf/s1600/nb69_icefaces_01.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 334px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5487657889648385122" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiX_P1UH_q43sjbS251ZH_LFVfW4m0OJzc3-pDUxSSKRrzslVQLwPFN5TZxuLuILfCtvxnErquMDyHb_MJXGU80TgMUuYNzdeS6V0IDAJFQaeUnbB5Ok5XZLou5wFnbGGbNPIjPB8vIuaMf/s400/nb69_icefaces_01.jpg" /></a><br />ICEfaces 의 각종 다운로드가 있습니다. <br />현재 ICEfaces 버전은 1.8.2 와 2.0.0 으로 되어 있습니다. <br /><br />이는 JSF의 1.2 버전과 2.0 버전의 차이점 때문이기도 합니다. 당연 지원되는 서버도 차이가 있습니다. 자세한 내용은 각자..^^;; <br /><br />그럼 2번째 진한 파랑색 줄의 Tools Support 에서 NetBeans 앞의 주황색 삼각형을 클릭하여 아래를 확장 한 후 NetBeans-6.9 모듈(ICEfaces-2.0.0.Alpha3-Netbeans-6.9-modules.zip)을 다운로드 받습니다. <br /><br />이때 다운로드 받으려면 ICEfaces 에 가입되어 있어야 합니다. <br />가입 절차는 생략하겠습니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzQt_bp_w9KT7YszBCo4Hb8tBp_SWfeGnRNi1ZzZQOoFmOGmJFB6JAFfQN4B30GVs9dRQvHWho8_v2SFWoj7aPlaKlIIoWxa0MisJEud2XkgAaqpVI4JZPVlaa5a7dDl6HLWZO2YpPgEbF/s1600/nb69_icefaces_02.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 334px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5487657884458210370" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzQt_bp_w9KT7YszBCo4Hb8tBp_SWfeGnRNi1ZzZQOoFmOGmJFB6JAFfQN4B30GVs9dRQvHWho8_v2SFWoj7aPlaKlIIoWxa0MisJEud2XkgAaqpVI4JZPVlaa5a7dDl6HLWZO2YpPgEbF/s400/nb69_icefaces_02.jpg" /></a> 적당한 곳에 다운로드 받은 압축파일을 풀고 넷빈에서 플러그인 추가를 진행합니다.<br /><br />넷빈을 시작하고 위의 도구에서 플러그인을 선택 클릭합니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjroWdn6XXpEKMtJNszOesoy4MzuDUAxMX222g5wEYEgPHz9mopZTyv5pSZi3J7QJCmyv_0LeQN8zMD3FHFcrhLD2vPp6ALZko45Pqfr8Fbfg0JjSqI0uF0YVvSxcglhn2LFZLqHHEE1WVt/s1600/nb69_icefaces_03.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 323px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5487657874565942434" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjroWdn6XXpEKMtJNszOesoy4MzuDUAxMX222g5wEYEgPHz9mopZTyv5pSZi3J7QJCmyv_0LeQN8zMD3FHFcrhLD2vPp6ALZko45Pqfr8Fbfg0JjSqI0uF0YVvSxcglhn2LFZLqHHEE1WVt/s400/nb69_icefaces_03.jpg" /></a> <br />앞서 다운로드 받은 넷빈 플러그인 파일이 있기 때문에 탭의 다운로드를 선택한 후 아래 플러그인 추가 버튼을 클릭하여 아까 압축을 푼 (nbm 경로) 아래 넷빈 플러그 인 파일을 선택합니다. <br />2개의 파일 선택 후 열기 클릭<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_15v3E9Gc_cjlH6LqxZkak3I4vwTqqZAxQwMUq-QwzfEMT4CfegnXrbKbR6yKr0fD7w4106raXkTaVylZjQBc2IBZelHpWtn2jCOmKWM7-smomT3RR_hmzzx7YMb9zn865IANpK8DPwWp/s1600/nb69_icefaces_04.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 241px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5487657872413266498" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_15v3E9Gc_cjlH6LqxZkak3I4vwTqqZAxQwMUq-QwzfEMT4CfegnXrbKbR6yKr0fD7w4106raXkTaVylZjQBc2IBZelHpWtn2jCOmKWM7-smomT3RR_hmzzx7YMb9zn865IANpK8DPwWp/s400/nb69_icefaces_04.jpg" /></a> <br />2개의 플러그인이 창으로 올라옵니다. <br />그럼 왼쪽 아래 설치를 눌러 진행합니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwi2OgOQjijfKRQyPADHeZJ4m1g4EvFc5DtdWLzX06LC2lf23haU5s_wX1jUMNZevUtHrESW8TWd_VB91Isu8ZHcSovLs-IEjAfwdtlDCTeKkQYcsFE_MU6gd9Viq55-WZ-OxFAcKESzyQ/s1600/nb69_icefaces_05.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 241px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5487657864930653938" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwi2OgOQjijfKRQyPADHeZJ4m1g4EvFc5DtdWLzX06LC2lf23haU5s_wX1jUMNZevUtHrESW8TWd_VB91Isu8ZHcSovLs-IEjAfwdtlDCTeKkQYcsFE_MU6gd9Viq55-WZ-OxFAcKESzyQ/s400/nb69_icefaces_05.jpg" /></a> <br />플러그인 설치 진행화면에 따라 계속합니다. 다음<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiuj_Bjkh7lXDmhUmnpbkVxLfDJKNQuYXa82PEuc-ANYfbdhiBDSvMR3zMyIYXwordr6Pfcn3zieQ_Bte3uYCa_250Z7X2LlvEKeyrvZAMt676PPoho_j0qJ0CW3QTvvINn9UmpmbSIQLQ/s1600/nb69_icefaces_06.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 357px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5487660227343550210" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiuj_Bjkh7lXDmhUmnpbkVxLfDJKNQuYXa82PEuc-ANYfbdhiBDSvMR3zMyIYXwordr6Pfcn3zieQ_Bte3uYCa_250Z7X2LlvEKeyrvZAMt676PPoho_j0qJ0CW3QTvvINn9UmpmbSIQLQ/s400/nb69_icefaces_06.jpg" /></a> <br />동의 체크후 설치<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhg0-muxoRcXf_mOBObKIihHYCeKTpOIytlstKCKSh7RAefgvmJ_1FWAc1ZMpZ4FPM2dAIJ0o4dcPPAFmTL_VeJntn_eQl-ePPO4Rx40a6qmobZ_EYd_bGstZO4NL68zGDpRrGHuCwQMTcm/s1600/nb69_icefaces_07.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 357px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5487660222287878274" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhg0-muxoRcXf_mOBObKIihHYCeKTpOIytlstKCKSh7RAefgvmJ_1FWAc1ZMpZ4FPM2dAIJ0o4dcPPAFmTL_VeJntn_eQl-ePPO4Rx40a6qmobZ_EYd_bGstZO4NL68zGDpRrGHuCwQMTcm/s400/nb69_icefaces_07.jpg" /></a> <br />인증서 서명 신뢰 경고가 뜨지만 무시하고 계속<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihiqsjLA6MupW9craa5pqpdB5h6hQOPeYu-MJEBQhcrcJbDyBn_q0GhDBrJ3f2yVhxRT3Z6l1kpUrloETrAa-iNh-RnF-qG5UHdbdH5ofuDleh2UwS28kmqw9Fy2YbIwj9Fzu9fikdM5ly/s1600/nb69_icefaces_08.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 360px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5487660211990665122" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihiqsjLA6MupW9craa5pqpdB5h6hQOPeYu-MJEBQhcrcJbDyBn_q0GhDBrJ3f2yVhxRT3Z6l1kpUrloETrAa-iNh-RnF-qG5UHdbdH5ofuDleh2UwS28kmqw9Fy2YbIwj9Fzu9fikdM5ly/s400/nb69_icefaces_08.jpg" /></a> <br />마침<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheVl6xJ2vOSr-R53xTjULVnQPKZttnGkSkg5v5AFJabUlvd5DnAQMX4lxfhucbG98we7V_Ys5bIUiAHeGToATgHdDALH9ndGzPPUrHpOxVAX3XJimsHv1-Ldm1fEtiBPDoNJVXfDtqM0bs/s1600/nb69_icefaces_09.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 357px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5487660207671501442" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheVl6xJ2vOSr-R53xTjULVnQPKZttnGkSkg5v5AFJabUlvd5DnAQMX4lxfhucbG98we7V_Ys5bIUiAHeGToATgHdDALH9ndGzPPUrHpOxVAX3XJimsHv1-Ldm1fEtiBPDoNJVXfDtqM0bs/s400/nb69_icefaces_09.jpg" /></a> <br />이제 ICEfaces 프로젝트를 만들어 보도록 하겠습니다.<br />프로젝트 창에서 마우스 오른쪽을 클릭하여 새 프로젝트 선택<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzONR2x_Thn-ZkWnoIi6ehvZ6DwkMOAeO_A3I-zQO4HvPExD1xhN0Kc-71EuvLD2q_EHmfENOALU-5iJ1gf5s6esUZTA46pW9pehOX1DkozV8AqlPK6oJnAwmmYaefPFD0CpyV5-G45G6k/s1600/nb69_icefaces_10.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 323px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5487660199386953970" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzONR2x_Thn-ZkWnoIi6ehvZ6DwkMOAeO_A3I-zQO4HvPExD1xhN0Kc-71EuvLD2q_EHmfENOALU-5iJ1gf5s6esUZTA46pW9pehOX1DkozV8AqlPK6oJnAwmmYaefPFD0CpyV5-G45G6k/s400/nb69_icefaces_10.jpg" /></a> <br />카테고리에서 Java Web 을 프로젝트는 Web Application 선택 - 다음<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-m-gIcAVqBpIrxLI3B3ejebCFOJg4wMpqu9WbNpKf55dGzhBl3gkXy3xlJJTl1inoBgi-Z5bsSzHgIpjLI-j-TCpFRH1y-5GQl-dWGKjGb5Kp7M-owKsURcid29tpLICQy5j_ZA2ZE094/s1600/nb69_icefaces_11.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5487661551334781138" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-m-gIcAVqBpIrxLI3B3ejebCFOJg4wMpqu9WbNpKf55dGzhBl3gkXy3xlJJTl1inoBgi-Z5bsSzHgIpjLI-j-TCpFRH1y-5GQl-dWGKjGb5Kp7M-owKsURcid29tpLICQy5j_ZA2ZE094/s400/nb69_icefaces_11.jpg" /></a> <br />프로젝트 이름은 적당히 저는 prjIceFaces 라고 줬습니다.역시 경로도 적당히..다음<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwwNsOWlN6GBPu7Hrv1HhNIauwk8ISExdCrXrIFLU2_44Uk4M_92rXSKhZ8A-olf50aFmwzyRQ26gWbpU2zZEyhnt-TiswBIoWbVdOEVEcsWJY700WVoo_faOwFQorI-kYh5H9I5UfBc7k/s1600/nb69_icefaces_12.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5487661548232032018" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwwNsOWlN6GBPu7Hrv1HhNIauwk8ISExdCrXrIFLU2_44Uk4M_92rXSKhZ8A-olf50aFmwzyRQ26gWbpU2zZEyhnt-TiswBIoWbVdOEVEcsWJY700WVoo_faOwFQorI-kYh5H9I5UfBc7k/s400/nb69_icefaces_12.jpg" /></a> <br />서버는 넷빈 6.9 를 설치하면 GlassFish Server 3 이 설치됩니다. <br />그냥 그거에 JavaEE Version은 EE5로 맞췄습니다. <br />지금은 굳이 EE6 으로 할 필요는 없어서리. - 다음<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6DX6cvWTZq_wKdjDPfSANRiH-ZC21an_3ZfsKc98KJRgNdPdylL73lEtrTlzX0HPlCSo0T-1t3P6meakxDrQssil-23B2ugSinE-lXCgxYzbTFpQDZMysSw7Q9glHjHIkKWpbqQMO5DEH/s1600/nb69_icefaces_13.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 251px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5487661543920011986" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6DX6cvWTZq_wKdjDPfSANRiH-ZC21an_3ZfsKc98KJRgNdPdylL73lEtrTlzX0HPlCSo0T-1t3P6meakxDrQssil-23B2ugSinE-lXCgxYzbTFpQDZMysSw7Q9glHjHIkKWpbqQMO5DEH/s400/nb69_icefaces_13.jpg" /></a> <br />프레임워크에서 ICEFaes 를 선택합니다. <br />페이지 설명 언어는 2가지 유형이 있는데 JSPX로 지정했습니다. <br />나머지 Libraries 탭을 눌러 추가되는 라이브러리 버전도 확인 - 마침<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhD6XZmgfjTGW8ypxwmJj9EcyR3i0iobLQOa1vllcfOs-RM0KhThJIyaA0qLLzHAsjPtyR2OP94SuoUfffCQk-etfGA2PR4vDQTTdSavg-1zFuOJezzo4ewN4WzAtOtWmFOUTGxYF0UFdUo/s1600/nb69_icefaces_14.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 251px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5487661539794426002" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhD6XZmgfjTGW8ypxwmJj9EcyR3i0iobLQOa1vllcfOs-RM0KhThJIyaA0qLLzHAsjPtyR2OP94SuoUfffCQk-etfGA2PR4vDQTTdSavg-1zFuOJezzo4ewN4WzAtOtWmFOUTGxYF0UFdUo/s400/nb69_icefaces_14.jpg" /></a> <br />그럼 스켈레톤 페이지라고 할 수 있는 웰컴페이지가 자동으로 만들어집니다. welcomeICEFaces.jspx 그리고 오른쪽 파레트(파레트가 자동으로 보이지 않으면 창에서 Palette를 선택하시면 됩니다) 에 ICEfaces 관련 컴포넌트들이 제시됩니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOz-dmlF8SypZzJdf6zGt3sPDBYfdX2ymMx_u88YWL1xVlZwjuehsiG6nDci6HIOH9J47_a01MN3jMLq9V7ceANKOYYAD7W3N5b4peI_MFlZuw-BpOWqNkyvgJCtTSb0LMP6xRmiuhQBRp/s1600/nb69_icefaces_15.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 290px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5487661530063682226" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOz-dmlF8SypZzJdf6zGt3sPDBYfdX2ymMx_u88YWL1xVlZwjuehsiG6nDci6HIOH9J47_a01MN3jMLq9V7ceANKOYYAD7W3N5b4peI_MFlZuw-BpOWqNkyvgJCtTSb0LMP6xRmiuhQBRp/s400/nb69_icefaces_15.jpg" /></a> <br />기본적으로 만들어지는 페이지가 어떤지 바로 실행해보도록 하겠습니다.<br />프로젝트에서 오른쪽 마우스 클릭 - 실행<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjg5OYD-uXCBJ4blewYLIXKPg79xN54ngJhBdTX0M4Y1d24uqLNvVSKO9Ke3VGpMjujGBy6dhhDEmYPT9MEXOP2JSg_mPUks8pJTLbv5-5D0Meh2MPlqSA0FsJcgkI8VzZIsbbQ7PNhYNtL/s1600/nb69_icefaces_16.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 290px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5487665673192369442" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjg5OYD-uXCBJ4blewYLIXKPg79xN54ngJhBdTX0M4Y1d24uqLNvVSKO9Ke3VGpMjujGBy6dhhDEmYPT9MEXOP2JSg_mPUks8pJTLbv5-5D0Meh2MPlqSA0FsJcgkI8VzZIsbbQ7PNhYNtL/s400/nb69_icefaces_16.jpg" /></a> <br />서버가 시작되고 웹 브라우저에 다음과 같은 내용이 보입니다. <br />주소표시줄에 표시된 호출법도 잘 살펴보시기 바랍니다. <a href="http://localhost:8080/prjIceFaces/welcomeICEfaces.iface">http://localhost:8080/prjIceFaces/welcomeICEfaces.iface</a><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgw_VdUcVasIgBnqtlmTDNcUq-zNADZJqhtTN03f1NFRlgwc-d_numscJOA_PjLH82920T_dJXTj_nWaEiFFdn9-6FtF0Dmywt7gdmvW0Zun9JKnzT6Ffghky_7TkYM8cRVdUI13lJavEvO/s1600/nb69_icefaces_17.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 157px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5487665666348211474" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgw_VdUcVasIgBnqtlmTDNcUq-zNADZJqhtTN03f1NFRlgwc-d_numscJOA_PjLH82920T_dJXTj_nWaEiFFdn9-6FtF0Dmywt7gdmvW0Zun9JKnzT6Ffghky_7TkYM8cRVdUI13lJavEvO/s400/nb69_icefaces_17.jpg" /></a> <br />다시 툴로 돌아와서 이번엔 JSF 백킹 빈(Managed Bean)을 만들도록 하겠습니다.프로젝트에서 마우스 오른쪽 클릭 - 새로만들기 - Other<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrRy8N6AcSsEfljUvhmd7n3tWaQZUuVLEc9xs92G1uiuJw0qiX2asJIHmzdS39TuTo9WskIO_-cVg5ehxMmpNeK3eYB20-25iKH_BOKy5KqQpgu1agQ9EjvZOqQwCfvEHY18CsU7BoJDak/s1600/nb69_icefaces_18.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 313px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5487665659357771330" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrRy8N6AcSsEfljUvhmd7n3tWaQZUuVLEc9xs92G1uiuJw0qiX2asJIHmzdS39TuTo9WskIO_-cVg5ehxMmpNeK3eYB20-25iKH_BOKy5KqQpgu1agQ9EjvZOqQwCfvEHY18CsU7BoJDak/s400/nb69_icefaces_18.jpg" /></a> <br />JavaServer Faces 카테고리에서 JSF Managed Bean 을 선택합니다. - 다음<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwVwzd4udbrNvvPP6ynMkBR31ZColC11nXEU78NIupocMXFcjCVsRDjjR9MOnhaVpvA2Qzhdh_c7QahYxEY1GrGesYB23-gewHpHQv7sHHlgPmL9Zzsj9Q9nAfmwniEUdtjbabLNirT92o/s1600/nb69_icefaces_19.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 308px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5487665650957366578" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwVwzd4udbrNvvPP6ynMkBR31ZColC11nXEU78NIupocMXFcjCVsRDjjR9MOnhaVpvA2Qzhdh_c7QahYxEY1GrGesYB23-gewHpHQv7sHHlgPmL9Zzsj9Q9nAfmwniEUdtjbabLNirT92o/s400/nb69_icefaces_19.jpg" /></a> <br />이번에 만들 내용은 테이블 예제 실습이므로 클래스 이름도 이렇게.. TableBean 으로 줬습니다.<br />아래 제시 이름은 inventoryList 로<br /> 패키지는 com.icesoft.icefaces.tutorial.component.table.basic<br />scope는 session , <br />설명은 Backing bean for tree example 이렇게 줬습니다.- 마침<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOoHsw8kigtYiS5EdubGpDqJ4DZtvzwNgH6GzTgdip1Z5h3Ru8NSRQ2vTBJdzQK3kEYM-dBhgrYkDxgvCfYFv31Rb4Qk6XuznF2QRd4XeLvD-meA5aadP13w-BRU8eljlIsQKX2qh8Dnyd/s1600/nb69_icefaces_20.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 308px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5487665645878899938" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOoHsw8kigtYiS5EdubGpDqJ4DZtvzwNgH6GzTgdip1Z5h3Ru8NSRQ2vTBJdzQK3kEYM-dBhgrYkDxgvCfYFv31Rb4Qk6XuznF2QRd4XeLvD-meA5aadP13w-BRU8eljlIsQKX2qh8Dnyd/s400/nb69_icefaces_20.jpg" /></a> <br />그럼 이제 Tablebean 의 내용을 복사해서 붙여넣습니다.<br />=================================================<br />package com.icesoft.icefaces.tutorial.component.table.basic;<br />/**<br />* A basic backing bean for a ice:dataTable component. This bean contains a<br />* Collection of IventoryItem objects which is used as the dataset for a<br />* dataTable component. Each instance variable in the InventoryItem obejct<br />* is represented as a column in the dataTable component.<br />*/<br />public class TableBean {<br />// List of sample inventory data.<br />private InventoryItem[] carInventory = new InventoryItem[]{<br />new InventoryItem(58285, "Dodge Grand Caravan", " Sto&Go/Keyless", 43500, 21695),<br />new InventoryItem(57605, "Dodge SX 2.0", "Loaded/Keyless", 28000 ,14495),<br />new InventoryItem(57805, "Chrysler Sebring Touring", "Keyless/Trac Cont", 31500, 15995),<br />new InventoryItem(57965, "Chrysler PT Cruiser Convertible", "Touring/Loaded", 7000 , 22195),<br />new InventoryItem(58095, "Chrysler Pacifica AWD", "Heated Lthr/19' Alloy", 43500, 31995),<br />new InventoryItem(58165, "Jeep Liberty Sport", "Loaded/Keyless", 31000, 26995),<br />new InventoryItem(58205, "Dodge SX 2.0", "Loaded/Keyless", 19500, 15495),<br />new InventoryItem(58245, "Chrysler Pacifica AWD", "Moonroof/DVD", 15500, 35695),<br />new InventoryItem(58295, "Pontiac Montana SV6 Ext", "Loaded/Quads", 40000, 22695),<br />new InventoryItem(58355, "Jeep Grand Cherokee", "Laredo/Trailer", 26500, 27495),<br />new InventoryItem(58365, "Jeep Grand Cherokee", "Laredo/Trailer", 27000, 28595),<br />new InventoryItem(58375, "Chrysler PT Cruiser", "Cruise/KeylessD", 29500, 17795),<br />new InventoryItem(58425, "Dodge Durango SLT", "Leather/3rd row", 32500, 26695),<br />new InventoryItem(58475, "Dodge Grand Caravan", "Quads/Rear AC", 52000, 19895),<br />new InventoryItem(58455, "Chrysler Sebring Touring", "Keyless/Trac Cont", 34000, 16695),<br />new InventoryItem(58465, "Chrysler Sebring Touring", "Keyless/Trac Cont", 32500, 15995),<br />new InventoryItem(58495, "Chrysler Sebring Touring", "Keyless/Trac Cont", 22500, 16695),<br />new InventoryItem(58155, "GM G2500 Cargo Van", "Extended/Auto/Air", 34000, 27795),<br />new InventoryItem(58275, "Dodge Dakota Q.C. SLT", "4x4/Loaded/Alloys", 22500, 27995),<br />new InventoryItem(58265, "Chrysler 300 Touring", "Heated Leather", 40500, 26495)<br />};<br />/**<br />* Gets the inventoryItem array of car data.<br />* @return array of car inventory data.<br />*/<br />public InventoryItem[] getCarInventory() {<br />return carInventory;<br />}<br />/**<br />* Inventory Item subclass stores data about a cars inventory data. Properties<br />* such a stock, model, description, odometer and price are stored.<br />*/<br />public class InventoryItem {<br />// slock number<br />int stock;<br />// model or type of inventory<br />String model;<br />// description of item<br />String description;<br />// number of miles on odometer<br />int odometer;<br />// price of car in Canadian dollars<br />int price;<br />/**<br />* Creates a new instance of InventoryItem.<br />* @param stock stock number.<br />* @param model model or type of inventory.<br />* @param description description of item.<br />* @param odometer number of miles on odometer.<br />* @param price price of care in Canadian dollars.<br />*/<br />public InventoryItem(int stock, String model, String description, int odometer, int price) {<br />this.stock = stock;<br />this.model = model;<br />this.description = description;<br />this.odometer = odometer;<br />this.price = price;<br />}<br />/**<br />* Gets the stock number of this iventory item.<br />* @return stock number.<br />*/<br />public int getStock() {<br />return stock;<br />}<br />/**<br />* Gets the model number of this iventory item.<br />* @return model number.<br />*/<br />public String getModel() {<br />return model;<br />}<br />/**<br />* Gets the description of the this iventory item.<br />* @return description<br />*/<br />public String getDescription() {<br />return description;<br />}<br />/**<br />* Gets the odometer reading from this iventory item.<br />* @return odometer reading.<br />*/<br />public int getOdometer() {<br />return odometer;<br />}<br />/**<br />* Gets the price of this item in Canadian Dollars.<br />* @return price.<br />*/<br />public int getPrice() {<br />return price;<br />}<br />}<br />}<br />=================================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrwNqm_-P3Nzm-YgwCMz2pa7jlQCPqzDaRo0tjARQUJJASfmu-EIKyxKrPeF-pFed4ojwmf9SQ0XKfExU6yk0-kVqqp-a_8Fbz8ZrCXoAfGGBRm2q7jcfp5Hd4CbwxSxeqB4oN3wq08uLh/s1600/nb69_icefaces_21.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 313px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5487667098121634738" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrwNqm_-P3Nzm-YgwCMz2pa7jlQCPqzDaRo0tjARQUJJASfmu-EIKyxKrPeF-pFed4ojwmf9SQ0XKfExU6yk0-kVqqp-a_8Fbz8ZrCXoAfGGBRm2q7jcfp5Hd4CbwxSxeqB4oN3wq08uLh/s400/nb69_icefaces_21.jpg" /></a> <br />이제 이 빈을 사용하는 태그를 만들 차례인데 welcomeICEfaces.jspx 을 편집기로 엽니다.<br />그런다음 오른쪽 파레트의 ICEfaces 의 Data Table 을 편집기 창에 드래그하면 ice:dataTable 태그가 작성됩니다. <br />그럼 태그 안에서 스페이스바를 누를때마다 속성들이 올라옵니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjt9prBP9lP6aXfzUigdOgMEtZe7APbvqgwRiZ_88aBDdYictLfUnHBhjjcVddI1xtq0JeJ0FkScla56q8Bw-53LwWj6I5tYvxt8c0htU1W1B2T9FYuEiRtssfd3bP-XTxsfQHpRu17kOUU/s1600/nb69_icefaces_22.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 313px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5487667095186585746" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjt9prBP9lP6aXfzUigdOgMEtZe7APbvqgwRiZ_88aBDdYictLfUnHBhjjcVddI1xtq0JeJ0FkScla56q8Bw-53LwWj6I5tYvxt8c0htU1W1B2T9FYuEiRtssfd3bP-XTxsfQHpRu17kOUU/s400/nb69_icefaces_22.jpg" /></a><br />작성할 전체 내용은 다음과 같습니다.<br />=====================================================<br /><ice:dataTable value="#{inventoryList.carInventory}" var="item"><br /><!-- Stock number --><br /><ice:column><br /><f:facet name="header"><br /><ice:outputText value="Stock #"/><br /></f:facet><br /><ice:outputText value="#{item.stock}"/><br /></ice:column><br /></ice:dataTable><br />=======================================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi080zDj7_k0KCkPH-REr6GNBWvnbYwUAoX3ZN1VD-1KUA1Wo2VZh9RThiK7037VMEwyfYmSZbkupRytHSgPLW8KmQt4EUClNaAXwPHzOwBQiX7EA47nH-oLTu9u3e6hJVg_lukBTZS3DIL/s1600/nb69_icefaces_23.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 313px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5487667084374037378" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi080zDj7_k0KCkPH-REr6GNBWvnbYwUAoX3ZN1VD-1KUA1Wo2VZh9RThiK7037VMEwyfYmSZbkupRytHSgPLW8KmQt4EUClNaAXwPHzOwBQiX7EA47nH-oLTu9u3e6hJVg_lukBTZS3DIL/s400/nb69_icefaces_23.jpg" /></a> <br />확인 후 해당 프로젝트를 build 하고 run 합니다.<br />프로젝트에서 오른쪽 마우스 클릭하여 빌드 하고 난후 실행<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhk9qkC2qvn1r649TCzs8houNYK4ab5-o2-RNXaOEDOXkSWHnKy_TfJUHwaFwN4ybqwf5CN9EmjOdaM-H6OxqffFRLmhLFMn2SlueukyYScufaeko2F5AJseA2pbmalQjb939CDYAGE7VLf/s1600/nb69_icefaces_24.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 313px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5487667079359876226" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhk9qkC2qvn1r649TCzs8houNYK4ab5-o2-RNXaOEDOXkSWHnKy_TfJUHwaFwN4ybqwf5CN9EmjOdaM-H6OxqffFRLmhLFMn2SlueukyYScufaeko2F5AJseA2pbmalQjb939CDYAGE7VLf/s400/nb69_icefaces_24.jpg" /></a> <br />그럼 아래 그림처럼 브라우저에 해당 내용이 나옵니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBHk8jEwUR2eI2pa_uCL-7hGvODPPkXHq9nZUJ0oUDdr3Uzun1G1eHToiYrmMnUnXkyFh1Yx1SetJj9xWEjMxaj0HEtuOGufoykyMJcV-SqK0c9Zh6bXwMPcwU-K4UQU7wAIfijjdpC2yr/s1600/nb69_icefaces_25.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 266px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5487667070846889282" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBHk8jEwUR2eI2pa_uCL-7hGvODPPkXHq9nZUJ0oUDdr3Uzun1G1eHToiYrmMnUnXkyFh1Yx1SetJj9xWEjMxaj0HEtuOGufoykyMJcV-SqK0c9Zh6bXwMPcwU-K4UQU7wAIfijjdpC2yr/s400/nb69_icefaces_25.jpg" /></a> <br />음..뭔가 밋밋..--;; 이럴땐 스타일 시트입니다.<br />다시 넷빈으로 돌아와 헤드 부분에 다음 태그를 추가합니다.<br />------------------------------------------------------------------------------------<br /><link href="./xmlhttp/css/xp/xp.css" rel="stylesheet" type="text/css"/><br />------------------------------------------------------------------------------------<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6j6w9tDtCMIDW3hyphenhyphenFI2iEkPz-LhuT4CmKmup2FUYB6CyE5bszUMPAcjlVmqNHQ7OAVjumtJ3xOuiKA24k9CZdKa20bvWzrgGCwgbpOiiNO4H8YK_5TJ6JDTuLWskcedXs1au3bX-9ND4a/s1600/nb69_icefaces_26.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 313px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5487670082214578866" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6j6w9tDtCMIDW3hyphenhyphenFI2iEkPz-LhuT4CmKmup2FUYB6CyE5bszUMPAcjlVmqNHQ7OAVjumtJ3xOuiKA24k9CZdKa20bvWzrgGCwgbpOiiNO4H8YK_5TJ6JDTuLWskcedXs1au3bX-9ND4a/s400/nb69_icefaces_26.jpg" /></a><br />다시 실행시켜보면 아래 그림처럼 스타일시트가 적용됨을 알 수 있습니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQLtL2qmMfnEP7wn9_VgXwo6YUUiUy1yr14Jtvf81aIpD_FtUXoUEC62pdzH1e87KrHB2F6wmOI-0vhthP3s30mg0WA3cKeK6sXYKx6A2hvilnFOc7Q2Zn8d7UJIYChVF7XBgMNnc91PBo/s1600/nb69_icefaces_27.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 266px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5487670078973224610" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQLtL2qmMfnEP7wn9_VgXwo6YUUiUy1yr14Jtvf81aIpD_FtUXoUEC62pdzH1e87KrHB2F6wmOI-0vhthP3s30mg0WA3cKeK6sXYKx6A2hvilnFOc7Q2Zn8d7UJIYChVF7XBgMNnc91PBo/s400/nb69_icefaces_27.jpg" /></a> <br />이러한 스타일 시트는 프로젝트의 라이브러리에 보시면 몇몇 가지가 더 있습니다. (잘 찾아보십시오 ^^ ) 그 중 royale 로 바꿔보겠습니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmbjAiduxlnkY07Xd3liKJWaGkNr3RaR0D4shIS57qq5-4HR4I2bxCjriywMcA67Efjqr4tzQGm6bEdx5YmLiXExyLKWzdyhyjsKVGsZcZCWcEOQ6pIqtYE5P1JQEgTffV4ZUy4ofXVepg/s1600/nb69_icefaces_28.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 313px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5487670069802375746" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmbjAiduxlnkY07Xd3liKJWaGkNr3RaR0D4shIS57qq5-4HR4I2bxCjriywMcA67Efjqr4tzQGm6bEdx5YmLiXExyLKWzdyhyjsKVGsZcZCWcEOQ6pIqtYE5P1JQEgTffV4ZUy4ofXVepg/s400/nb69_icefaces_28.jpg" /></a><br />------------------------------------------------------------------------------------<br /><link href="./xmlhttp/css/royale/royale.css" rel="stylesheet" type="text/css"/><br />------------------------------------------------------------------------------------<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4RcBN0ctTDNpiWIGxTXGMqJd3qRt43krRb_9u7Ly9kd_yaZ7pUVisfjJ6G9Xyxd-CJhPW0Icc-qDi1VTmXi5ihE3hAiXc7azrQTRqZFngrgzeELbhCAdL4oOUvSRFsekwgFjH5ZopMI3P/s1600/nb69_icefaces_29.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 266px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5487670065642465986" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4RcBN0ctTDNpiWIGxTXGMqJd3qRt43krRb_9u7Ly9kd_yaZ7pUVisfjJ6G9Xyxd-CJhPW0Icc-qDi1VTmXi5ihE3hAiXc7azrQTRqZFngrgzeELbhCAdL4oOUvSRFsekwgFjH5ZopMI3P/s400/nb69_icefaces_29.jpg" /></a> <br />자 그럼 여기서 숙제 ^^;위의 Stock 을 참고로 아래 그림과 같이 다른 칼럼들도 출력해보시기 바랍니다.<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivKKoeGklGPX9vU2ZIXtD34Xy9b4StjiKIiW9wH_NvsidC2rbAjlNDZG7xuUOeT3RUccvYfGur-0nLAjMNi7fbZCMPX6JLWLvXGlpYecr6tbaaKVfKfC_8Oc5icbgJBTUc93rw8Z4NudR7/s1600/nb69_icefaces_30.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 266px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5487670054831142066" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivKKoeGklGPX9vU2ZIXtD34Xy9b4StjiKIiW9wH_NvsidC2rbAjlNDZG7xuUOeT3RUccvYfGur-0nLAjMNi7fbZCMPX6JLWLvXGlpYecr6tbaaKVfKfC_8Oc5icbgJBTUc93rw8Z4NudR7/s400/nb69_icefaces_30.jpg" /></a><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmF-nuHXAy-YAfp1a7LCw-l_75ST52Y3JVDQsLVvVL4Np3p2gaoF-CiJuOBhan0joEPLeiYlI2iLwp1Mn5rw_GOtpTrgFiDdsDdG5NehC89btIynBThkWPBurC4cZxLg0afmMBqq20iTZK/s1600/nb69_icefaces_31.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 313px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5487670208932268434" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmF-nuHXAy-YAfp1a7LCw-l_75ST52Y3JVDQsLVvVL4Np3p2gaoF-CiJuOBhan0joEPLeiYlI2iLwp1Mn5rw_GOtpTrgFiDdsDdG5NehC89btIynBThkWPBurC4cZxLg0afmMBqq20iTZK/s400/nb69_icefaces_31.jpg" /></a> <br />여기까지.. ^^ <br />수고하셨습니다.<br />다음엔 예전 넷빈 6.5.1 에서 VisualWeb ICEFaces 에 대해서도 알아보겠습니다.<br />to be continued...강여사(J.Y.Kang)http://www.blogger.com/profile/17450510931308610527noreply@blogger.com0tag:blogger.com,1999:blog-6811062799606447528.post-30999612208226451322010-05-05T07:24:00.000-07:002010-07-01T03:51:27.831-07:00넷빈(netbeans)6.8에서 HeapWalker 사용하기본 예제의 샘플 프로젝트는 다음 경로에서 다운받을 수 있습니다.<br /><br /><a href="http://docs.google.com/leaf?id=0B55-rdrBfsK5ODA2MzBmZTgtYzJiYS00NWQ4LWFiODAtMjUxMWI2MTg5NDNk&hl=ko">http://docs.google.com/leaf?id=0B55-rdrBfsK5ODA2MzBmZTgtYzJiYS00NWQ4LWFiODAtMjUxMWI2MTg5NDNk&hl=ko</a><br /><br />이번 예제에서는 프로파일링 시 OOM(Out Of Memory) 발생시 힙 덤프를 자동 생성하며, 해당 덤프에 대한 분석을 가능하게 해주는 HeapWalker 기능에 대해 알아 보겠습니다.<br /><br />이번 예제에서 사용할 프로젝트는 PrimeNumbers (SE) 입니다.<br /><br />우선 해당 프로젝트를 실행하여 어떤 내용의 프로젝트인지 살펴보겠습니다.<br /><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZQ7Gaq1KBs8sJYRBEK7LvQJkq2jJxHDKGp68MLkEUvz3p-m0HteiUXelZQ8Esq9PVIUd3dunm3DW2-5WO6k6yl5LVC1KFNJpz2hoRF0AhKN-yiBgN-Qtoer1-a54Yw9hvlTv5T62W8PRb/s1600/3_primeNumbers_01.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 347px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467801258706316802" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZQ7Gaq1KBs8sJYRBEK7LvQJkq2jJxHDKGp68MLkEUvz3p-m0HteiUXelZQ8Esq9PVIUd3dunm3DW2-5WO6k6yl5LVC1KFNJpz2hoRF0AhKN-yiBgN-Qtoer1-a54Yw9hvlTv5T62W8PRb/s400/3_primeNumbers_01.jpg" /></a> 프로젝트를 실행시키면 아래와 같은 프로그램이 제시되는데 입력한 값에 대한 소수를 구해줍니다. 그럼 다음과 같이 1000000 을 입력하고 아래 버튼을 누릅니다. 계산된 소수는 999983 입니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWuChYmv8yIMfpk3cEmaAf6m2CKovL6pDj_GDVKh3MyACOCew02GSj6i0MOzML-XtDQNKrmMbe3bpXsGvV2fcd5O3QdzAP5bS2jMuaGR49c3TTcTOhAun8rdfpUy24Epxs5vMh_lByFHJb/s1600/3_primeNumbers_02.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 399px; DISPLAY: block; HEIGHT: 136px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467801250701947250" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWuChYmv8yIMfpk3cEmaAf6m2CKovL6pDj_GDVKh3MyACOCew02GSj6i0MOzML-XtDQNKrmMbe3bpXsGvV2fcd5O3QdzAP5bS2jMuaGR49c3TTcTOhAun8rdfpUy24Epxs5vMh_lByFHJb/s400/3_primeNumbers_02.jpg" /></a> 다시 한번 Calculate Prime Numbers 버튼을 클릭하면 출력창에 OOM 이 떨어집니다. java heap size<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijbOWlLp6fuUDpooHLzxqEOHHaO0ztAuc96K5wZphfa00fvKuNhbFvO8ZNh5M8LnzqtH_ker33PtE5-fa09G1RAHv_rC7g7X3YuuA3EgZtidSvXf32b5B-fe5e4VWiPETrXhbORAA256MB/s1600/3_primeNumbers_03.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 347px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467801240036894434" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijbOWlLp6fuUDpooHLzxqEOHHaO0ztAuc96K5wZphfa00fvKuNhbFvO8ZNh5M8LnzqtH_ker33PtE5-fa09G1RAHv_rC7g7X3YuuA3EgZtidSvXf32b5B-fe5e4VWiPETrXhbORAA256MB/s400/3_primeNumbers_03.jpg" /></a> 그럼 이제 이 문제에 대해 프로파일을 해보도록 하겠습니다.</p><p>프로젝트 - 프로파일<br /></p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYESjzxd6uvqZ6VuskW-taWNsPA7dNJPJO20j5tOagOUa1yOH5VyqrBtjRQ99IaTcdRjtH5EB7-PrNHO8AqPQCEXnJMFKYVJVT7KWMa7dN10DABoG-alTchLjIz-Cc6dlRvEOwwlrANO3I/s1600/3_primeNumbers_04.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 347px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467801231589111202" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYESjzxd6uvqZ6VuskW-taWNsPA7dNJPJO20j5tOagOUa1yOH5VyqrBtjRQ99IaTcdRjtH5EB7-PrNHO8AqPQCEXnJMFKYVJVT7KWMa7dN10DABoG-alTchLjIz-Cc6dlRvEOwwlrANO3I/s400/3_primeNumbers_04.jpg" /></a> 메모리 프로파일을 선택하고 객체 생성과 가비지 컬렉션 모두 기록과 할당을 위한 스택 추적 기록을 체크 한 후 실행합니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLr_28WBLP3KDnX9DjlEkV4h9wNDHulbTGdUWBpOqq_F_4s7hhanIls50C39usfilyvBCeTdhT46o6XZifVec_S5icJ5xJStVO-bd4fAa5p1IFzQke8DozvB0F6yP9g5ullLyanN-0cNYW/s1600/3_primeNumbers_05.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 241px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467801223579584482" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLr_28WBLP3KDnX9DjlEkV4h9wNDHulbTGdUWBpOqq_F_4s7hhanIls50C39usfilyvBCeTdhT46o6XZifVec_S5icJ5xJStVO-bd4fAa5p1IFzQke8DozvB0F6yP9g5ullLyanN-0cNYW/s400/3_primeNumbers_05.jpg" /></a> 프로파일 컨트롤 패널에서(왼쪽) 라이브 결과를 누르고 프로그램을 아까와 같이 1000000 을 입력한 후 계산 버튼을 클릭합니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUDF1ySzwHrM4YKhKA4vPuRlF-FJYEtsgYeZJ2GbmnOwFP9JubSG9i0hmvHl5EfMsBHYWNn6GfsvmF1rnsbBWyKCmNK4Ma2-5nwqXkalfzPMLDkK-CoJSSw1m_9jUB2Z0D4SJiGaCCmskR/s1600/3_primeNumbers_06.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 347px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467801538961468274" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUDF1ySzwHrM4YKhKA4vPuRlF-FJYEtsgYeZJ2GbmnOwFP9JubSG9i0hmvHl5EfMsBHYWNn6GfsvmF1rnsbBWyKCmNK4Ma2-5nwqXkalfzPMLDkK-CoJSSw1m_9jUB2Z0D4SJiGaCCmskR/s400/3_primeNumbers_06.jpg" /></a> 아까와 마찬가지로 다시 한번 버튼을 클릭하면 아까처럼 OOM 이 떨어집니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivCLravtY6IGqaJtVf4Kse_aVuNzvKJkdxvWxHkSqG0CgEst6H_A0IuzEapSS3w-GF1Ad-BxOBAppaiJ0ZAfGU7-QdmIDsry1aadzI0NWE7x3_qr2ixIJOR7B7YqRz75l4c9bEjmYg9Dwv/s1600/3_primeNumbers_07.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 347px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467801532981712786" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivCLravtY6IGqaJtVf4Kse_aVuNzvKJkdxvWxHkSqG0CgEst6H_A0IuzEapSS3w-GF1Ad-BxOBAppaiJ0ZAfGU7-QdmIDsry1aadzI0NWE7x3_qr2ixIJOR7B7YqRz75l4c9bEjmYg9Dwv/s400/3_primeNumbers_07.jpg" /></a> 해당 프로그램을 종료하면 스냅샷 찍기 여부에 관한 팝업창이 뜹니다.</p><p>예 선택<br /></p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgv_05TsfNz7IW4QucqZof-6rGgkuyh96k2tk49vY4GHjtwTAOt71rSftbqFiRGOGbLWGc5AO6zviZkvKCIrC1t2gGwW-xNCfRFLqtFsh3qfyqfxbP_Bv65prn9e2kKOkNQaMkseyKrhocF/s1600/3_primeNumbers_08.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 347px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467801525005657170" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgv_05TsfNz7IW4QucqZof-6rGgkuyh96k2tk49vY4GHjtwTAOt71rSftbqFiRGOGbLWGc5AO6zviZkvKCIrC1t2gGwW-xNCfRFLqtFsh3qfyqfxbP_Bv65prn9e2kKOkNQaMkseyKrhocF/s400/3_primeNumbers_08.jpg" /></a> 프로파일링 도중 OOM 이 떨어져서 자동으로 힙 덤프가 생성되어 해당 덤프 분석을 위한 HeapWalker 동작 여부에 대한 확인창이 제시됩니다.</p><p>예 선택<br /></p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxP9Zmf-znAwejNf-lKLxeMs234eBB6mPxTQzo2uhlgTiZVq6cgd4PReQkobyYtuLxndE73aSesezFb1bkfvEc-9ppYu9eX-PieeG2y1TgiXaze2_m_YA_pQzqQ00Pj-Hg7NnEyWVPLr01/s1600/3_primeNumbers_09.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 347px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467801515844468290" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxP9Zmf-znAwejNf-lKLxeMs234eBB6mPxTQzo2uhlgTiZVq6cgd4PReQkobyYtuLxndE73aSesezFb1bkfvEc-9ppYu9eX-PieeG2y1TgiXaze2_m_YA_pQzqQ00Pj-Hg7NnEyWVPLr01/s400/3_primeNumbers_09.jpg" /></a> 아래 그림이 힙덤프에 대한 힙워커(heapwalker) 분석 내용입니다. </p><p>아래쪽에 보면 스레드 보기 링크가 있습니다. 클릭<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicFuf5vwLWbGiIWj791OEKMq36o5AhePL4G6j-Xycnni09L-KtS4mVzUuiuVKPeQP5qW9z7hd5TYOVDuQM0smCRxxAEmk2Ai2XbSEHUUbmeJFBcB25EBK7HsmQNpLCwjVfIEg8QYs5PAwj/s1600/3_primeNumbers_10.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 347px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467801506432284002" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicFuf5vwLWbGiIWj791OEKMq36o5AhePL4G6j-Xycnni09L-KtS4mVzUuiuVKPeQP5qW9z7hd5TYOVDuQM0smCRxxAEmk2Ai2XbSEHUUbmeJFBcB25EBK7HsmQNpLCwjVfIEg8QYs5PAwj/s400/3_primeNumbers_10.jpg" /></a> 클릭하면 관련 클래스에 대한 링크들이 제시됩니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTJRkH4TJRQXVDmTucfQzPzLEyNKQbI_3kYU2VuQvi0YSzkJaXYJnekldVDEmv8FtmmaJO7Yn6NUmiK39CZCcfspEPObDVFGi4bogVzHRjnJWH8YlyBofQso2m2LpSpzAumR3r6KTjySOo/s1600/3_primeNumbers_11.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 347px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467801817748122114" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTJRkH4TJRQXVDmTucfQzPzLEyNKQbI_3kYU2VuQvi0YSzkJaXYJnekldVDEmv8FtmmaJO7Yn6NUmiK39CZCcfspEPObDVFGi4bogVzHRjnJWH8YlyBofQso2m2LpSpzAumR3r6KTjySOo/s400/3_primeNumbers_11.jpg" /></a> HeapWalker의 클래스 탭을 누른 후 크기로 정렬 합니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixkt4XEwIhCbMd8gi19CXjXuxk8FMHQOsiEcH-1Z4uBRhu6Tlf0xFh5y-Od8GG6dSDQH27LfXp4ybZraBaXUnbzXQ-31Q2bRu497-SNpIhjSGcN3fWotXyXG5gB2ZG8WR6XDKU-4Tk3jZw/s1600/3_primeNumbers_12.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 347px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467801810353680594" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixkt4XEwIhCbMd8gi19CXjXuxk8FMHQOsiEcH-1Z4uBRhu6Tlf0xFh5y-Od8GG6dSDQH27LfXp4ybZraBaXUnbzXQ-31Q2bRu497-SNpIhjSGcN3fWotXyXG5gB2ZG8WR6XDKU-4Tk3jZw/s400/3_primeNumbers_12.jpg" /></a> 가장 큰 크기를 차지 하고 있는 int[] 에서 마우스 오른쪽을 클릭하여 인스턴스 뷰에서 보기를 선택합니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSvlh1S-YWS4gHpzwkSA6PwzH4qslwr9w7VdQNa_EeTJwlr90rvRXAYtNLY1Zu5OhrnN8dTtVHXIjNmw33Tw5Eh4na25dBUYVVhtPiSOaIJTEMOLaLs5P5sA_ngJZ63kj66o-m_PJ_2NK4/s1600/3_primeNumbers_13.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 347px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467801799330047778" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSvlh1S-YWS4gHpzwkSA6PwzH4qslwr9w7VdQNa_EeTJwlr90rvRXAYtNLY1Zu5OhrnN8dTtVHXIjNmw33Tw5Eh4na25dBUYVVhtPiSOaIJTEMOLaLs5P5sA_ngJZ63kj66o-m_PJ_2NK4/s400/3_primeNumbers_13.jpg" /></a> 아래 그림이 인스턴스 뷰인데 오른쪽 필드 부분을 확장하면 묶음 단위의 숫자가 진행되면서 소수가 아닌 수는 -1 로 소수는 소수대로 값이 나타납니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJGQq758pdupu7VwPgvo7D4GnbiR661SotmvN9z38wpIBszjncQnRNULhqmDtYHsl12B0ZwoZSSUXIr2eXEmNuXGYyXlscn5ulPq-nQYi1l58A4TPGeVOXK9mHF8j2eSZia0LFNdWZH-5A/s1600/3_primeNumbers_14.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 347px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467801793817812802" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJGQq758pdupu7VwPgvo7D4GnbiR661SotmvN9z38wpIBszjncQnRNULhqmDtYHsl12B0ZwoZSSUXIr2eXEmNuXGYyXlscn5ulPq-nQYi1l58A4TPGeVOXK9mHF8j2eSZia0LFNdWZH-5A/s400/3_primeNumbers_14.jpg" /></a> 아래 참조쪽에서 this 에서 오른쪽 마우스를 클릭하여 가장 근접한 GC루트 보기를 선택합니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6liRC5mivQRLgheh1t3ihs_mqyuhrB6UcHVuRiyKyhls326v4QcjCWHIH8Tw7SoBDGPjUgm0RO4NmXRjGhQ5jC29SuIwtxQCAQz3FSws84WTIo240ZxNd8p1ULrZTsWNkGYWC1v3F7fY0/s1600/3_primeNumbers_15.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 347px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467801784708144098" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6liRC5mivQRLgheh1t3ihs_mqyuhrB6UcHVuRiyKyhls326v4QcjCWHIH8Tw7SoBDGPjUgm0RO4NmXRjGhQ5jC29SuIwtxQCAQz3FSws84WTIo240ZxNd8p1ULrZTsWNkGYWC1v3F7fY0/s400/3_primeNumbers_15.jpg" /></a> 해당 내용에 가장 근접한 GC 루트는 complete_ ... 라고 되어 있습니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiX1-f89_ljDDYZFRVAJ-nqwKtSVSqh0i277AG8Yk_2e1eqHrXKTJ2AFZ1oNF7HoTfuQ2axrv8MJRFngtednloeLlfUBf7cfa1RrBhp6d-o1Zm44rMGWX6KKAWSwFfrDC31vMKkh1OIKXDL/s1600/3_primeNumbers_16.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 347px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467802070948770354" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiX1-f89_ljDDYZFRVAJ-nqwKtSVSqh0i277AG8Yk_2e1eqHrXKTJ2AFZ1oNF7HoTfuQ2axrv8MJRFngtednloeLlfUBf7cfa1RrBhp6d-o1Zm44rMGWX6KKAWSwFfrDC31vMKkh1OIKXDL/s400/3_primeNumbers_16.jpg" /></a> 그럼 그림과 같이 해당 위치에서 다시 마우스 오른쪽을 클릭하여 소스로 이동을 선택합니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivq3ZZq9IUVgpW6NuRXK0WBRq9WtfHetWvKfXjlgWYaMV8v0p0-lIcnCA8MpZ4-KdFvR__BJVuU3bAPTKMaPAXeeQh2tYBPuV2qjTsjvl3Kb5uc2dvHdldNFKUiI3BcxgDxzmJv7jv5diK/s1600/3_primeNumbers_17.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 347px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467802063686106930" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivq3ZZq9IUVgpW6NuRXK0WBRq9WtfHetWvKfXjlgWYaMV8v0p0-lIcnCA8MpZ4-KdFvR__BJVuU3bAPTKMaPAXeeQh2tYBPuV2qjTsjvl3Kb5uc2dvHdldNFKUiI3BcxgDxzmJv7jv5diK/s400/3_primeNumbers_17.jpg" /></a> 소스쪽에 오면 해당 complete_가 Map 으로 되어 있는데 이에 대한 사용을 찾으려면 다음과 같습니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPP7bNpxBEU7XkNNfJ9vw6240XpZlINI-kYluXQ7cEQTbrmA8R48hDqcOstxKrxje9HzWdCe2Z4oBCitqlWwTs1Z4wgKP27aMz__FqAPkB8da8_fEqibjGBIrpeVaGCwIQZHVRnvK6zr3x/s1600/3_primeNumbers_18.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 347px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467802054470846418" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPP7bNpxBEU7XkNNfJ9vw6240XpZlINI-kYluXQ7cEQTbrmA8R48hDqcOstxKrxje9HzWdCe2Z4oBCitqlWwTs1Z4wgKP27aMz__FqAPkB8da8_fEqibjGBIrpeVaGCwIQZHVRnvK6zr3x/s400/3_primeNumbers_18.jpg" /></a> complete_ 에서 마우스 오른쪽을 클릭하고 find usage (사용법 찾기)를 선택합니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxznTEzWNh_dUt1v3V3HwjFxl6ULF6IGO4qhaGhOvADrMA781hVUG6LFFDyH84FyRbdD1-KNutuxQUaSLwVhpIlmSUyZgqWOo2LGjuEGvynNSm3JiEvilVQHsw45oBNZ8EU1GEiTyn6f-v/s1600/3_primeNumbers_19.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 347px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467802049987307106" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxznTEzWNh_dUt1v3V3HwjFxl6ULF6IGO4qhaGhOvADrMA781hVUG6LFFDyH84FyRbdD1-KNutuxQUaSLwVhpIlmSUyZgqWOo2LGjuEGvynNSm3JiEvilVQHsw45oBNZ8EU1GEiTyn6f-v/s400/3_primeNumbers_19.jpg" /></a> 아래 그림과 같이 팝업창이 나타나는데 현재 프로젝트인 PrimeNumbers를 찾아 선택합니다.</p><p>찾기<br /></p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtvBapzSjxoCUJ5Am4kdS8cbDVOZgAqzGVIp0M4zUKC_yoGxXosrtlUBkHow_2GpTORFn0WPRS2lYXfLfXo3JnYCpAqLmuHtQ3mN9ed87eNUNir0Pl09fZbh4gIjXhLdHo43zVY8_Kd53p/s1600/3_primeNumbers_20.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 201px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467802043439344290" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtvBapzSjxoCUJ5Am4kdS8cbDVOZgAqzGVIp0M4zUKC_yoGxXosrtlUBkHow_2GpTORFn0WPRS2lYXfLfXo3JnYCpAqLmuHtQ3mN9ed87eNUNir0Pl09fZbh4gIjXhLdHo43zVY8_Kd53p/s400/3_primeNumbers_20.jpg" /></a> 그럼 아래창으로 caller와 callee 가 각각 왼쪽 아이콘에 따라 나타납니다.</p><p>아래 그림은 callee가 표현된 그림입니다.</p><p>....put(XX) 제시된 해당 메소드를 더블 클릭하면 소스로 이동됩니다.<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGe5uX2VFnWJaVuxUSwHYJxqVd1W01mVy66fmbDJN6FWNj4_oOhOO_znBGSOaiEKPFAaExW8eoQl69SWG1_l7TgLNmXepxLQF-LLsiaqVA_HfWtjhqY1k2SnbJjUEQAiv_uHHkqImF8pWi/s1600/3_primeNumbers_21.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 347px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467802261433691458" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGe5uX2VFnWJaVuxUSwHYJxqVd1W01mVy66fmbDJN6FWNj4_oOhOO_znBGSOaiEKPFAaExW8eoQl69SWG1_l7TgLNmXepxLQF-LLsiaqVA_HfWtjhqY1k2SnbJjUEQAiv_uHHkqImF8pWi/s400/3_primeNumbers_21.jpg" /></a> 바로 이 부분이 OOM 발생의 문제 부분입니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8YRH3yRNAwx-1E4zZJtYSEpegYabIKHjftOCr1CtWedgsc5ezeSspeJU9yk3L31U9JOQF2bJgmAs_1yS37TxjSXlAYXqKfaekjqTOHt2KOonqE122AN9EMEBP-3RVjijEFJOeGu11QnAD/s1600/3_primeNumbers_22.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 347px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467802256888574402" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8YRH3yRNAwx-1E4zZJtYSEpegYabIKHjftOCr1CtWedgsc5ezeSspeJU9yk3L31U9JOQF2bJgmAs_1yS37TxjSXlAYXqKfaekjqTOHt2KOonqE122AN9EMEBP-3RVjijEFJOeGu11QnAD/s400/3_primeNumbers_22.jpg" /></a> 넷빈에서는 프로파일시 OOM 이 발생하면 자동으로 힙덤프를 생성하고 HeapWalker가 동작합니다. </p><p>만약 기존에 작성된 힙 덤프가 있다면 profile - load heap dump 메뉴를 사용하면 됩니다.<br /></p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_4bhC9l14V81Biff3HAuhfKGKtYxYzrBNkPoRrOSg5lN4oufiGLGqPnc_Jc-U_qujh9KL8hJz6CkR4aDZgR_B9mxEjO5QFJBi7rhKB82WPKR12KuEa4PjZnUuSv_pmIVv1v6HAY_gl_vb/s1600/3_primeNumbers_23.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 347px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467802245161464018" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_4bhC9l14V81Biff3HAuhfKGKtYxYzrBNkPoRrOSg5lN4oufiGLGqPnc_Jc-U_qujh9KL8hJz6CkR4aDZgR_B9mxEjO5QFJBi7rhKB82WPKR12KuEa4PjZnUuSv_pmIVv1v6HAY_gl_vb/s400/3_primeNumbers_23.jpg" /></a> 이번 예제에서는 넷빈 6.X 의 새 기능인 HeapWalker에 대해서 알아 봤습니다.</p><p>그동안 힙 덤프 분석을 위해서 여러 툴 들이 제시됐지만 많이 불편했는데 이 HeapWalker는 나름 또 쓸만하네요. </p><p>계속...<br /><br /></p>강여사(J.Y.Kang)http://www.blogger.com/profile/17450510931308610527noreply@blogger.com0tag:blogger.com,1999:blog-6811062799606447528.post-55496421769007642612010-05-05T06:41:00.000-07:002010-05-08T08:04:18.595-07:00넷빈(netbeans)6.8에서 프로파일링 - 스레드 진단본 예제에서 제시된 샘플 프로젝트는 다음 경로에 있습니다.<br /><br /><a href="http://docs.google.com/leaf?id=0B55-rdrBfsK5YWUyNGQ3ZGUtYmE4Zi00ZWU3LTk2NDEtMTZjMzFmODM4NWUw&hl=ko">http://docs.google.com/leaf?id=0B55-rdrBfsK5YWUyNGQ3ZGUtYmE4Zi00ZWU3LTk2NDEtMTZjMzFmODM4NWUw&hl=ko</a><br /><br />이번에 할 작업은 UI 프로그램에서 스레드 상태를 진단하고 문제가 되는 지점을 찾아 내는 방법에 대해 알아보겠습니다.<br /><br />프로젝트 열기 (MonitoredThreads)<br /><br />실행<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEuKXCrK3WcilxTLy1JtkGvdoUWa6brnGEtDDZEe5cLAFfbVQ8eXMEF07ymsN5uAiyjvch4piLTOJRHC-Dl9XCJCQy5mQ0bpx1uJS64QmDOniIBGe-WJl3LcyiS4P9t-ndZ-M2QJdxNmLI/s1600/2_monitoredThread_01.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 347px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467781206694031746" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEuKXCrK3WcilxTLy1JtkGvdoUWa6brnGEtDDZEe5cLAFfbVQ8eXMEF07ymsN5uAiyjvch4piLTOJRHC-Dl9XCJCQy5mQ0bpx1uJS64QmDOniIBGe-WJl3LcyiS4P9t-ndZ-M2QJdxNmLI/s400/2_monitoredThread_01.jpg" /></a> 해당 프로그램은 버튼이 2개 있는 간단한 UI 프로그램입니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4LviFChPNhi7TIbnVWLNAr7fizBeZUkPhTKF8s96t-r2ExXTwNVLuFnkjGtbRBBFffIgrKI1lacy6GWfnTdlOj24iwqSUyIIx0Qd3xJxsrL_mhdRku44J3KXlpKVEiuM-ta82mrEvgcZd/s1600/2_monitoredThread_02.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 260px; DISPLAY: block; HEIGHT: 86px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467781201445059762" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4LviFChPNhi7TIbnVWLNAr7fizBeZUkPhTKF8s96t-r2ExXTwNVLuFnkjGtbRBBFffIgrKI1lacy6GWfnTdlOj24iwqSUyIIx0Qd3xJxsrL_mhdRku44J3KXlpKVEiuM-ta82mrEvgcZd/s400/2_monitoredThread_02.jpg" /></a> 그러나, 이때 Start! 버튼을 누르게 되면 일정 시간이 지날때까지 아무 것도 동작하지 않습니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzN9aO2wrcevtOE5O6vTT1VW8Dp7NkrKhxa4GmYI8BlImnRLCsHTncoNm9Rv5rzm5oQsihQg806TBY0LUOytfewS-Ax0B9K6aparWmPB7r3CS2wkUbpBOMOvSdpxxTNJ5iepGlQ7rq73A7/s1600/2_monitoredThread_03.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 260px; DISPLAY: block; HEIGHT: 86px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467781192706719330" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzN9aO2wrcevtOE5O6vTT1VW8Dp7NkrKhxa4GmYI8BlImnRLCsHTncoNm9Rv5rzm5oQsihQg806TBY0LUOytfewS-Ax0B9K6aparWmPB7r3CS2wkUbpBOMOvSdpxxTNJ5iepGlQ7rq73A7/s400/2_monitoredThread_03.jpg" /></a> 아래 그림 처럼 경과시간이(30초) 지나야만 기타 다른 버튼 (Exit 혹은 X) 등이 동작합니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-Xls2ZjahDED8V6J7X6KeifK5tIxm8tyj0peHLU7m5zIgOPlwb9X-b4dfGpg8a8QyNwjvVYt9IuArzofsEGhVxIIR_Z8fGwzK2fqEi0azPbJ1__9i5KU_HElQdaw2R5oKGLKIchrhtL8Y/s1600/2_monitoredThread_04.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 268px; DISPLAY: block; HEIGHT: 118px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467781188371502386" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-Xls2ZjahDED8V6J7X6KeifK5tIxm8tyj0peHLU7m5zIgOPlwb9X-b4dfGpg8a8QyNwjvVYt9IuArzofsEGhVxIIR_Z8fGwzK2fqEi0azPbJ1__9i5KU_HElQdaw2R5oKGLKIchrhtL8Y/s400/2_monitoredThread_04.jpg" /></a> 왜 이런일이 생긴 걸까요?<br /><br />이제 프로젝트를 프로파일링 해보겠습니다.<br /><br />프로젝트 - 프로파일<br /><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZ3MP8ooH-NcGltzpojXIaKEY71h3ewCIN0uZjNHGL-MHNLTfkAfDSJ9GBZMzUJnGE1uBDCz5xUnNhRE7i9gUmECNx_rpeIIACCHQB683cIwJX9nskEx-ClTFyMFDqyPujgNsYYr9LptLE/s1600/2_monitoredThread_05.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 347px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467781180551827474" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZ3MP8ooH-NcGltzpojXIaKEY71h3ewCIN0uZjNHGL-MHNLTfkAfDSJ9GBZMzUJnGE1uBDCz5xUnNhRE7i9gUmECNx_rpeIIACCHQB683cIwJX9nskEx-ClTFyMFDqyPujgNsYYr9LptLE/s400/2_monitoredThread_05.jpg" /></a> 우선 모니터를 선택하여 스레드 모니터링 활성화에 체크(확인)를 하고 실행합니다<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7V7iL6hxExLrKatPEDXp8QyBDwvPdZW1Egb6lfWrZViRIDHLy2mwIYFBwGIekbQ47p9YbPH9rK5Q-k1dhPIRoX-IFQlm_EzVmDjUnvOrv3Ylw6tdKEJRThT1k-5IVPkjoquqMOZ4sMFCs/s1600/2_monitoredThread_06.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 241px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467781429807624210" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7V7iL6hxExLrKatPEDXp8QyBDwvPdZW1Egb6lfWrZViRIDHLy2mwIYFBwGIekbQ47p9YbPH9rK5Q-k1dhPIRoX-IFQlm_EzVmDjUnvOrv3Ylw6tdKEJRThT1k-5IVPkjoquqMOZ4sMFCs/s400/2_monitoredThread_06.jpg" /></a> 프로그램이 시작되면서 뒤편으로 스레드가 상태별로 보여집니다. (각 색상은 해당 상태에 대한 내용입니다. 녹색-실행중, 보라-휴면, 노랑-대기, 빨강-모니터)<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2JRjiSRZNztjQC8hmHoOC0CE5YAnm5IyGEnDunYYxpPm4Y64hkMDqKE5WuWgMBdIVmY5_gSwrABQmIuZUEmHY0dF-i_XffupikvCoerh3Bqyjia6D9729qOFAZ_MaH0X3d4ojmjex7dGm/s1600/2_monitoredThread_07.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 347px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467781422933665874" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2JRjiSRZNztjQC8hmHoOC0CE5YAnm5IyGEnDunYYxpPm4Y64hkMDqKE5WuWgMBdIVmY5_gSwrABQmIuZUEmHY0dF-i_XffupikvCoerh3Bqyjia6D9729qOFAZ_MaH0X3d4ojmjex7dGm/s400/2_monitoredThread_07.jpg" /></a> 그러다 Start버튼을 누르면 이 중 변화하는 스레드가 있습니다.</p><p>AWT-EVENTQUEUE-0 입니다. 대기에서 실행으로 바뀌는 군요.<br /></p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEio_D6eivNRc3DBC7OaDh9D8onDaqp_moDs-Z5wojxDzhDbTYNhA-_zQ9rSvB1JOmNxYfWoAz0yauKEYWoWWTO6krdFtlgsvWYcWPJeUuaTkz9_E8I_B3QTxXRWkFxA8Zqpiz4xCaFlcBXT/s1600/2_monitoredThread_08.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 347px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467781420033291778" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEio_D6eivNRc3DBC7OaDh9D8onDaqp_moDs-Z5wojxDzhDbTYNhA-_zQ9rSvB1JOmNxYfWoAz0yauKEYWoWWTO6krdFtlgsvWYcWPJeUuaTkz9_E8I_B3QTxXRWkFxA8Zqpiz4xCaFlcBXT/s400/2_monitoredThread_08.jpg" /></a> 다시 30초가 경과되면 팝업창이 나타나고 그때 스레드 상태 역시 다시 대기상태로 빠집니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9EJqXGTNNBYU4icO4iEhMf0RdUAxLD0To0VkgumdmfLH0z-VfxcHBLshuvzlom1Pfw1Ffogi5OZfs0ARKU1k-QnIElyiScEAzaDkbOBywm3TAma8O37SQ1yraSiUxEBIaCmN8is0ZgQfx/s1600/2_monitoredThread_09.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 347px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467781413045802562" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9EJqXGTNNBYU4icO4iEhMf0RdUAxLD0To0VkgumdmfLH0z-VfxcHBLshuvzlom1Pfw1Ffogi5OZfs0ARKU1k-QnIElyiScEAzaDkbOBywm3TAma8O37SQ1yraSiUxEBIaCmN8is0ZgQfx/s400/2_monitoredThread_09.jpg" /></a> 해당 프로그램을 종료하면 아래 그림과 같은 정보 알림창이 뜹니다. OK<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUV22qOMtObfwp0eTvwEHJG7Jlqc_MmWXGyYxv7_JUOjBGmoaU7Oduyj0NXhEvN_0674BV3GG1cHs2QNQb8BegG8uiV6Aw0Ain3uP0XN9OVNS2sKavDoZfO-c_DT6jbGBgstmZLtkTtp0S/s1600/2_monitoredThread_10.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 347px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467781405363186242" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUV22qOMtObfwp0eTvwEHJG7Jlqc_MmWXGyYxv7_JUOjBGmoaU7Oduyj0NXhEvN_0674BV3GG1cHs2QNQb8BegG8uiV6Aw0Ain3uP0XN9OVNS2sKavDoZfO-c_DT6jbGBgstmZLtkTtp0S/s400/2_monitoredThread_10.jpg" /></a> AWT_EVENTQUEUE-0 를 더블클릭하면 해당 스레드에 대한 좀더 자세한 내용이 도식화됩니다.</p><p>AWT-EVENTQUERE-0 는 원래 이벤트 큐를 대기하는 일을 담당하는 스레드 입니다.</p><p>그럼에도 불구하고 Start! 버튼 클릭시 상태가 실행중으로 바뀌는 바람에 프로그램이 먹통이 된거지요.<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpY9a1r4eU8fj_-ZG4Alx1DMQH8T6J8jtWyyJjxhEYqw_9g9866lyTeBsADTzXKIxySQealXFz2X25-aZj7dBqX97wIAbwNV3zfv9lb9i8m-C27GsOKYxrsLkKdjZXXfIkfWDKkFV8ZbGF/s1600/2_monitoredThread_11.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 347px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467781676945973602" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpY9a1r4eU8fj_-ZG4Alx1DMQH8T6J8jtWyyJjxhEYqw_9g9866lyTeBsADTzXKIxySQealXFz2X25-aZj7dBqX97wIAbwNV3zfv9lb9i8m-C27GsOKYxrsLkKdjZXXfIkfWDKkFV8ZbGF/s400/2_monitoredThread_11.jpg" /></a> 이번에는 모니터링이 아니라 분석을 위해 다시 프로파일링을 시작합니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQNIZHgEw8d3ZPZheeqIXQV6p5VZJPrzYvo_BOxV9QiQOizpUEMryIFg__Y8k9YcB-aIvKiYTcsf5LCmQGTEPf5QpbU6ZygzLmknsU0tKG8uv1nyCjtoOjj-90v0PnGRvPymWQDzWfDBVH/s1600/2_monitoredThread_12.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 347px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467781675269027058" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQNIZHgEw8d3ZPZheeqIXQV6p5VZJPrzYvo_BOxV9QiQOizpUEMryIFg__Y8k9YcB-aIvKiYTcsf5LCmQGTEPf5QpbU6ZygzLmknsU0tKG8uv1nyCjtoOjj-90v0PnGRvPymWQDzWfDBVH/s400/2_monitoredThread_12.jpg" /></a> CPU 성능 분석을 실행합니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3MdTyHq80_u5oAeMFEfy38kERZi5x7iiolVXXb48Jm0lvniOE0ubk6FhuaTFZxfUDJB_1j85gLwcFK9024hextc-7zBv1m3i2CfwJ9YULY1lVhITdiYVfluIlPXwAh8ZX5eCwBgGRkS4H/s1600/2_monitoredThread_13.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 241px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467781665340878146" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3MdTyHq80_u5oAeMFEfy38kERZi5x7iiolVXXb48Jm0lvniOE0ubk6FhuaTFZxfUDJB_1j85gLwcFK9024hextc-7zBv1m3i2CfwJ9YULY1lVhITdiYVfluIlPXwAh8ZX5eCwBgGRkS4H/s400/2_monitoredThread_13.jpg" /></a> 스레드 화면이 뒤에 나타나면 아까와 마찬가지로 프로그램에서 Start! 버튼을 눌러 상태 변화를 확인합니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMcwyPXAu0v1GUHyX-D4bzoBhsR_62eeGf3Fxribvb_NYEFBp8RmQb3NgOuBH94G82W8Wf6_Hi7XU5oERG8H5muAh260PvYBtrGf-fak4l3MFq4hRoNsowVtpOniamcDRcI5zr8PqloHiN/s1600/2_monitoredThread_14.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 347px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467781659531571730" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMcwyPXAu0v1GUHyX-D4bzoBhsR_62eeGf3Fxribvb_NYEFBp8RmQb3NgOuBH94G82W8Wf6_Hi7XU5oERG8H5muAh260PvYBtrGf-fak4l3MFq4hRoNsowVtpOniamcDRcI5zr8PqloHiN/s400/2_monitoredThread_14.jpg" /></a><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6F4BGNUzZ9pzaRxRLnyLpgmzkuYMGnpP8Co_gT2fiN1oZSZG4LEdAqr1xX1jrzwo8aizi6xz3tDfY0x5gIcX-l1IuHlLY0K75l0yb3g-zuwCrvE6Qzn_wm3h8socvuKpDFG5OQHFQSS8O/s1600/2_monitoredThread_15.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 347px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467781650485978962" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6F4BGNUzZ9pzaRxRLnyLpgmzkuYMGnpP8Co_gT2fiN1oZSZG4LEdAqr1xX1jrzwo8aizi6xz3tDfY0x5gIcX-l1IuHlLY0K75l0yb3g-zuwCrvE6Qzn_wm3h8socvuKpDFG5OQHFQSS8O/s400/2_monitoredThread_15.jpg" /></a> 프로그램을 종료하면 수행된 결과의 스냅샷을 찍는 정보창이 나타납니다.</p><p>예 선택<br /></p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNZdUWodLlQDp9ixBBOQNmeuYuNQyHQB7J4ofTVaNwsfpoR3OXhIxHuxFF3sBaHbyokcEgmTwmMb-xutd5Lw4nmKAsGJXufA0pu5Bo4GH3OfEMGF-SahTZKonZdl6hKFdbnDpHatKYQ4rw/s1600/2_monitoredThread_16.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 347px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467781940461834530" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNZdUWodLlQDp9ixBBOQNmeuYuNQyHQB7J4ofTVaNwsfpoR3OXhIxHuxFF3sBaHbyokcEgmTwmMb-xutd5Lw4nmKAsGJXufA0pu5Bo4GH3OfEMGF-SahTZKonZdl6hKFdbnDpHatKYQ4rw/s400/2_monitoredThread_16.jpg" /></a> 스냅샷에 AWT-EVENTQUERE-0 에 jButton1ActionPerformed 메소드에서 마우스 오른쪽을 클릭하여 소스로 이동을 선택합니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgz4UWnk3NGT8hHUprSTuKxlK3tg-koxeF2LKukpIAElKaulAA32l3KtcrqtBOS3ig8B1DusxHwuIFWO_TTviNe4MTXhS8H0GbeOSpmC5KaX5aJrXEoMhyphenhyphen_1nwVmv_8ssOAatj1uXm07wLX/s1600/2_monitoredThread_17.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 347px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467781933928817762" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgz4UWnk3NGT8hHUprSTuKxlK3tg-koxeF2LKukpIAElKaulAA32l3KtcrqtBOS3ig8B1DusxHwuIFWO_TTviNe4MTXhS8H0GbeOSpmC5KaX5aJrXEoMhyphenhyphen_1nwVmv_8ssOAatj1uXm07wLX/s400/2_monitoredThread_17.jpg" /></a> jButton1ActionPerformed 아래 while 문을 살펴보면 잘못 작성되어 있음을 발견할 수 있습니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQcdNZ1mwclixA00KExnoSXXTJAtuqf5o7SEKtQaijcgVWLyH3M-PkgIvZ9YJUc6-5Clx97UHwrUUjy3S0qtgcxcz-nl3ISzD1cKrrtHp_2qcwvtznB4Z7K65_-VXBvcoBMysILsJkpwAG/s1600/2_monitoredThread_18.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 347px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467781926082202226" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQcdNZ1mwclixA00KExnoSXXTJAtuqf5o7SEKtQaijcgVWLyH3M-PkgIvZ9YJUc6-5Clx97UHwrUUjy3S0qtgcxcz-nl3ISzD1cKrrtHp_2qcwvtznB4Z7K65_-VXBvcoBMysILsJkpwAG/s400/2_monitoredThread_18.jpg" /></a> 위의 그림에 해당 내용을 주석처리합니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiO7yKEZvcuZs9eV77a17ldJRUjOrcBkJh0EDBtyaY4uY2gxloch4Hc1WT1K90MjtoKYzdEis1SEWNWBMGvc_ITMcuJ3O4A0i3xlUa-XyhdyS15wG3bxFo-MSi2AdJ0hkgkfkGG4Rs4D-D-/s1600/2_monitoredThread_19.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 347px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467781919751147266" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiO7yKEZvcuZs9eV77a17ldJRUjOrcBkJh0EDBtyaY4uY2gxloch4Hc1WT1K90MjtoKYzdEis1SEWNWBMGvc_ITMcuJ3O4A0i3xlUa-XyhdyS15wG3bxFo-MSi2AdJ0hkgkfkGG4Rs4D-D-/s400/2_monitoredThread_19.jpg" /></a> 프로파일링을 다시 시작합니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikhz8-N7ljPxU75WCTzeJ23rfbA3pE7LR5wk0xcGtFjWeZ1jQNlJ9-L9BSsxDhymLunXph6LUJlldYdFB6u5J1J2TKQkDVM2t-YFxK3I3T1SF3dHpU_3RCy2Gc8zEHjPR2jJcKHGSpmwju/s1600/2_monitoredThread_20.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 347px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467781909701479714" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikhz8-N7ljPxU75WCTzeJ23rfbA3pE7LR5wk0xcGtFjWeZ1jQNlJ9-L9BSsxDhymLunXph6LUJlldYdFB6u5J1J2TKQkDVM2t-YFxK3I3T1SF3dHpU_3RCy2Gc8zEHjPR2jJcKHGSpmwju/s400/2_monitoredThread_20.jpg" /></a> CPU 성능분석 - 실행<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicZvkJGqQFDK8NETrrdVc6qng8e-pM5zPcMqS_ylVvxB9bmmvnAbnPiqAQAVO6_u3lkaFrKVgB35Bs8TXgL2ND1XKerA3pHc03sBB6VuP_oPDp3QBqVVI2DHmBM1tZ6z9JtaZbVrlVCsxc/s1600/2_monitoredThread_21.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 241px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467782154698384642" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicZvkJGqQFDK8NETrrdVc6qng8e-pM5zPcMqS_ylVvxB9bmmvnAbnPiqAQAVO6_u3lkaFrKVgB35Bs8TXgL2ND1XKerA3pHc03sBB6VuP_oPDp3QBqVVI2DHmBM1tZ6z9JtaZbVrlVCsxc/s400/2_monitoredThread_21.jpg" /></a> 이번에는 Start! 버튼을 눌러도 AWT-EVENTQUEUE-0 상태에는 변화가 없습니다.<br />물론 다른 버튼을 누르면 바로 반영됩니다. (Exit 나 X)<br /><br /><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXOzx-NEV8u8idatrG4XmiSTcJoSXv3S6V-MSug2PKjzqohHtBwBrisnSVnrBhFloTir3HLkbPlUsRhxfMNnBLKwMM872qbHlDKnMCo10pZLEORKVX5OFiuA6ETOphmVZ6DDIGB_YzjNW0/s1600/2_monitoredThread_22.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 347px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467782152655544018" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXOzx-NEV8u8idatrG4XmiSTcJoSXv3S6V-MSug2PKjzqohHtBwBrisnSVnrBhFloTir3HLkbPlUsRhxfMNnBLKwMM872qbHlDKnMCo10pZLEORKVX5OFiuA6ETOphmVZ6DDIGB_YzjNW0/s400/2_monitoredThread_22.jpg" /></a> 다시 소스를 열어 아래 주석으로 되어 있는 SwingWorker 부분을 주석 해제를 합니다. (그림 참조)<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMWnJzsW57OL8UGVdqHopTpUSSl_WsMzaiVPFYG_z9Jc7HrnIVySTBkPiAXaKZi1Py5B0zYlhAth9PujFEdZCPf-XrXkiRBcvn84b5r7dAaR31vu5z1yTVcgCKyezg7bA4t0Ae8yDvtS98/s1600/2_monitoredThread_23.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 347px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467782140973163282" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMWnJzsW57OL8UGVdqHopTpUSSl_WsMzaiVPFYG_z9Jc7HrnIVySTBkPiAXaKZi1Py5B0zYlhAth9PujFEdZCPf-XrXkiRBcvn84b5r7dAaR31vu5z1yTVcgCKyezg7bA4t0Ae8yDvtS98/s400/2_monitoredThread_23.jpg" /></a> 작성된 SwingWorker.java 의 내용은 같은 패키지 안에 있습니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh15AzX3go6D-SznfHhlHifiGPajFkheU-264y6LpZxBqXzN-FnT_PsGal45KgpiBN3XRqWRQZf6PXWRScG4cyaAhiZzEdRNynMCa6PQW32ydLWb2ockl9GssFpXSPaA3r7-2XwhkHZicvV/s1600/2_monitoredThread_24.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 347px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467782133584955954" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh15AzX3go6D-SznfHhlHifiGPajFkheU-264y6LpZxBqXzN-FnT_PsGal45KgpiBN3XRqWRQZf6PXWRScG4cyaAhiZzEdRNynMCa6PQW32ydLWb2ockl9GssFpXSPaA3r7-2XwhkHZicvV/s400/2_monitoredThread_24.jpg" /></a> 다시 프로파일을 시작합니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiy5GRX_YgnD9aolTfkGGFvrChl257c7oqh6bfgx_gan6pXBAaWMoXPlXcPdqIHI_IPmd4pmgnCcX7CTVC6dCw7sZ2dEKkBH9-nBKJEs7LFw-PVT7blGzSQHsK6QaGgkn6ks4_9sJYc_tSX/s1600/2_monitoredThread_25.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 347px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467782123725371506" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiy5GRX_YgnD9aolTfkGGFvrChl257c7oqh6bfgx_gan6pXBAaWMoXPlXcPdqIHI_IPmd4pmgnCcX7CTVC6dCw7sZ2dEKkBH9-nBKJEs7LFw-PVT7blGzSQHsK6QaGgkn6ks4_9sJYc_tSX/s400/2_monitoredThread_25.jpg" /></a> CPU 성능분석 - 실행<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuLepAy1zbC6R-a5_tzbEvcJbowxBRwlwxWjNGIsJIgwT7LCECOrHkciD484Np2i0y89L_cla0ckppoH_q6fGd4KIz0i7-Eu1ZEUjaA_Jg9e_gB-FIpcA92CevOi2bMMg2cRW8CnRjxFm_/s1600/2_monitoredThread_26.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 241px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467782415930829314" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuLepAy1zbC6R-a5_tzbEvcJbowxBRwlwxWjNGIsJIgwT7LCECOrHkciD484Np2i0y89L_cla0ckppoH_q6fGd4KIz0i7-Eu1ZEUjaA_Jg9e_gB-FIpcA92CevOi2bMMg2cRW8CnRjxFm_/s400/2_monitoredThread_26.jpg" /></a> 프로그램을 시작했을 때 스레드는 다음과 같습니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBLqTPr-nGCdxBcIouUrPhIFjO-31KpU8pAsrSLkXdco2NuGi9ij5VHXgBdYvoXmxME9m6360ELRQgvqP4Mx8gPrPZQEupZMsvwIvFkNXvKAAReIZzfM9jQj5WBH8WTc6d6n76SyCVCsZN/s1600/2_monitoredThread_27.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 347px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467782409037277650" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBLqTPr-nGCdxBcIouUrPhIFjO-31KpU8pAsrSLkXdco2NuGi9ij5VHXgBdYvoXmxME9m6360ELRQgvqP4Mx8gPrPZQEupZMsvwIvFkNXvKAAReIZzfM9jQj5WBH8WTc6d6n76SyCVCsZN/s400/2_monitoredThread_27.jpg" /></a> 그러다 Start! 버튼을 누르면 AWT-EVENTQUEUE-0 는 여전히 대기상태로 진행되면서, SwingWorker 스레드가 새로 실행됩니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhpbtxUdI-8Qzt_mfAZNcq4Sc4vkf3GSijEYKI5xJofKqaZiIbWH-utTcaUGD24k-LSKN63SZsxjfpQ4UlD8Lk_ub8qrCYB7MU6gUNX_MajV_GqxUYD2vsYINr8Or_Gy-24nI-sP7J2EuO/s1600/2_monitoredThread_28.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 347px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467782400158865138" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhpbtxUdI-8Qzt_mfAZNcq4Sc4vkf3GSijEYKI5xJofKqaZiIbWH-utTcaUGD24k-LSKN63SZsxjfpQ4UlD8Lk_ub8qrCYB7MU6gUNX_MajV_GqxUYD2vsYINr8Or_Gy-24nI-sP7J2EuO/s400/2_monitoredThread_28.jpg" /></a> 프로그램을 종료하면 스냅샷 찍기에 대한 확인창이 뜹니다.</p><p>예 선택<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiPMRaHGWb35SGFXdbKWXjYsEkuSnAWsBwauRhZzypEkoUwgPp-hxuDQaFuUWJrH8VWMnmfmmtrPkTCQLsz6JsK62zYgqeIiWLCcUB48XLdoVvKJbutrOLzUQpqVOkjhfku3bDom25F7oo/s1600/2_monitoredThread_29.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 347px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467782390567307410" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiPMRaHGWb35SGFXdbKWXjYsEkuSnAWsBwauRhZzypEkoUwgPp-hxuDQaFuUWJrH8VWMnmfmmtrPkTCQLsz6JsK62zYgqeIiWLCcUB48XLdoVvKJbutrOLzUQpqVOkjhfku3bDom25F7oo/s400/2_monitoredThread_29.jpg" /></a> Call Tree 확인<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEir0URYQQY-WjKFWhXk8D7CpsY40tWnHOIwFqMMspFiL2c43-qsb3yh0uQ70AooBO6wwdeQlTMKmuDJX4BiqKL2FO52Bb1FMwsZgYyGXkQpixcadL1snZM04tk_rvjfiVeAFRh2W0xNiLNC/s1600/2_monitoredThread_30.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 347px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467782386348207570" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEir0URYQQY-WjKFWhXk8D7CpsY40tWnHOIwFqMMspFiL2c43-qsb3yh0uQ70AooBO6wwdeQlTMKmuDJX4BiqKL2FO52Bb1FMwsZgYyGXkQpixcadL1snZM04tk_rvjfiVeAFRh2W0xNiLNC/s400/2_monitoredThread_30.jpg" /></a> 이상 스레드 모니터링에 대한 간단한 예제 였습니다.</p><p>계속...</p><p></p>강여사(J.Y.Kang)http://www.blogger.com/profile/17450510931308610527noreply@blogger.com0tag:blogger.com,1999:blog-6811062799606447528.post-89296878099592126212010-05-04T19:21:00.000-07:002010-05-08T08:04:27.403-07:00넷빈(netbeans) 6.8에서 프로파일링(profiling) 사용법2 - Advanced프로파일링은 프로젝트의 규모가 클수록 발생하는 오버헤드가 많아지기 때문에 필요한 부분을 적절히 기획하여 실행하는 것이 중요합니다.<br /><br />앞서 넷빈에서의 프로파일링 기본 사용에 이어 이번에는 좀더 세분화된 방법에 대해 알아보고자 합니다.<br /><br />1. 이번에 알아볼 내용은 루트 메소드 추가 입니다.<br /><br />다시 프로파일링 선택<br /><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkX0493ohlxmJX1t0VjwA5O14COx5sm01fbiJvQ8kwwKVk9ECYbhDjmuYCk5sQCzkeZGsEJNRsUtVuPzA8_hzKULOVFcY0yGwhOQi7LrvI6tKoasIF0PatcGbVQH8uWN4nhairvYNlpNm-/s1600/1_overview_26.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 340px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467605995976706514" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkX0493ohlxmJX1t0VjwA5O14COx5sm01fbiJvQ8kwwKVk9ECYbhDjmuYCk5sQCzkeZGsEJNRsUtVuPzA8_hzKULOVFcY0yGwhOQi7LrvI6tKoasIF0PatcGbVQH8uWN4nhairvYNlpNm-/s400/1_overview_26.jpg" /></a> 이번에는 CPU 프로파일링에서 전체 어플리케이션이 아닌 부분(Part of application)을 선택하고, 프로파일링을 진행할 Root 메소드를 선택합니다. </p><p>루트메소드 선택은 define 링크를 누르면 나타나는 팝업창에 선택가능합니다.</p><p>팝업창에서 Add from Project 클릭<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPgpGYHCllfxjDXLGY9gSxDiFkcsvlywYBkMKjiT-L-CXgFGcN2hv8hnVC_7cN0IUa7Uuztr7wxxn1V4xwRf2wwtlEwOzG-RbK_jIRRWkSdmxP7B8Lp4i1RYIdeTp7g4pYEp8MqL8tyCsn/s1600/1_overview_27.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 340px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467605989290515522" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPgpGYHCllfxjDXLGY9gSxDiFkcsvlywYBkMKjiT-L-CXgFGcN2hv8hnVC_7cN0IUa7Uuztr7wxxn1V4xwRf2wwtlEwOzG-RbK_jIRRWkSdmxP7B8Lp4i1RYIdeTp7g4pYEp8MqL8tyCsn/s400/1_overview_27.jpg" /></a> 루트 메소드 선택</p><p>해당 프로젝트(AnagramGame)의 소스쪽의 com.toy.anagrams.lib.WordLibrary 를 체크하고 확인을 누릅니다<br /></p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwKNiKOEI8Vz8ZcawlnyT4cKA7mAKpRhy20llvDEEsvv58KdQCPA16c81aQWR7GEkm7xyV5sbu_gARdLaMuiZh5uQj8IWykch5D313mW2QspCQFyLXRTwwK3Ru0sL0BVCtVE1Rk_frY-bC/s1600/1_overview_28.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 290px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467605985093375346" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwKNiKOEI8Vz8ZcawlnyT4cKA7mAKpRhy20llvDEEsvv58KdQCPA16c81aQWR7GEkm7xyV5sbu_gARdLaMuiZh5uQj8IWykch5D313mW2QspCQFyLXRTwwK3Ru0sL0BVCtVE1Rk_frY-bC/s400/1_overview_28.jpg" /></a> 위에 선택한 내용이 표시됨을 확인할 수 있습니다. 이러한 루트 메소드의 지정은 아래 노트에도 나오듯이 소스 편집기에서 직접 추가할 수도 있습니다. (편집기에서 오른쪽 마우스 클릭 - 프로파일링- 루트 메소드 추가)<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRSU33ryWgzyV_DQ8bGU82mwIde3quV9txTiukTAegN92xC6zbWv6t_l0i4HnEnCWMqkyie21hS6c-AmEfskSxl1lwdUVeHNJ9MZodQYdXkPgnjiZAtntZ1sqG2ll-tu9_zlK8YlwGvgMR/s1600/1_overview_29.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 220px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467605981777013602" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRSU33ryWgzyV_DQ8bGU82mwIde3quV9txTiukTAegN92xC6zbWv6t_l0i4HnEnCWMqkyie21hS6c-AmEfskSxl1lwdUVeHNJ9MZodQYdXkPgnjiZAtntZ1sqG2ll-tu9_zlK8YlwGvgMR/s400/1_overview_29.jpg" /></a> 본 창으로 돌아오면 Part of application 버튼 옆에 1 root method ...edit 라고 표시됩니다.</p><p>실행<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCHhG4ottubzBBhqOErIjpTUY56hBYon9-YFQHv9S7Iy-W6DwMJaIq2zACd014VTRwUqtg7Imgku5LTVhHy4KxcF3pilAf5LIKiyh0zoh_w0YUTMJJ1K_JW-Jw7zNtbUQNmWzkHBcRwkG_/s1600/1_overview_30.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 241px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467605972658347474" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCHhG4ottubzBBhqOErIjpTUY56hBYon9-YFQHv9S7Iy-W6DwMJaIq2zACd014VTRwUqtg7Imgku5LTVhHy4KxcF3pilAf5LIKiyh0zoh_w0YUTMJJ1K_JW-Jw7zNtbUQNmWzkHBcRwkG_/s400/1_overview_30.jpg" /></a> CPU 프로파일링이 진행되면서 게임 프로그램이 시작되고 (뒤쪽의 프로파일링 패널에서 라이브 결과를 누르면 루트 메소드로 지정한 WordLibrary 에서의 프로파일링만 나타나는 걸 확인할 수 있습니다)<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkTBNWgpfdYP1Yyeii7YylQSIw5rRIiEy06wq52Lu8wlQG5hNGWYGENt0craYLE21THdLVuNRTgiPry6vaCgOOdRWfkIjYyhXQWX53mlyDsb6qnemheEQS2nXnNmOnz8c1kWy2yVXeSWtX/s1600/1_overview_31.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 340px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467606249574449618" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkTBNWgpfdYP1Yyeii7YylQSIw5rRIiEy06wq52Lu8wlQG5hNGWYGENt0craYLE21THdLVuNRTgiPry6vaCgOOdRWfkIjYyhXQWX53mlyDsb6qnemheEQS2nXnNmOnz8c1kWy2yVXeSWtX/s400/1_overview_31.jpg" /></a> 역시 게임 프로그램을 종료하면 스냅샷 여부에 대한 확인창이 뜹니다. </p><p>예 선택<br /></p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8p9GxJJ-ilTfOMguoozW1DLqk-Ovi97CLAIX8nFi9rvZpns2OIHu_NVomYHMEal0s5vuXFaDy7kPz1RWHF88PFkgwFgEbXvssHBTVSAERTMTZgwD7T2T5ufQJoV22VqvbhpOeUVYmmt_v/s1600/1_overview_32.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 340px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467606242056468530" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8p9GxJJ-ilTfOMguoozW1DLqk-Ovi97CLAIX8nFi9rvZpns2OIHu_NVomYHMEal0s5vuXFaDy7kPz1RWHF88PFkgwFgEbXvssHBTVSAERTMTZgwD7T2T5ufQJoV22VqvbhpOeUVYmmt_v/s400/1_overview_32.jpg" /></a> CPU 스냅샷 입니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh87w8qrdP8b3aDOej_3rFaZi7HFQc0HGuJSJJKYbGn-nBGp1xGF940UYsuFZCFVkKlsIc_WtTXm4RP4KBsOVMRtuzAWeWbA_EZ0iWo5VJ7p8_3kKQT_N-qaOQAdDcaoCIjDwR7HyqAgtS4/s1600/1_overview_33.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 340px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467606237079624978" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh87w8qrdP8b3aDOej_3rFaZi7HFQc0HGuJSJJKYbGn-nBGp1xGF940UYsuFZCFVkKlsIc_WtTXm4RP4KBsOVMRtuzAWeWbA_EZ0iWo5VJ7p8_3kKQT_N-qaOQAdDcaoCIjDwR7HyqAgtS4/s400/1_overview_33.jpg" /></a> 2. 이번에는 프로파일링 포인트 삽입에 대해 알아보겠습니다.</p><p>프로젝트창으로 와서 해당 프로젝트에서 UI를 담당하고 있는 Anagram.java의 소스를 엽니다.</p><p>소스의 line 55 에 가면 initComponent() 메소드가 있습니다. 해당 메소드에서 마우스 오른쪽을 클릭하고 profile - insert profiling point 를 선택합니다.<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAflKZAL0SXyVtHecVjgvuLgFpMC6wSIZ5ddn_nG1ojEJucbhJxaaqCx2RzkJI5EMDt5JhWBREhyCvzSNK-G-WiLN5TQ5u5Ep7hUgHxmvKk881fxr6v0Ujt1qI866QoGOs9e-AbaR-8V8c/s1600/1_overview_34.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 340px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467606231545002866" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAflKZAL0SXyVtHecVjgvuLgFpMC6wSIZ5ddn_nG1ojEJucbhJxaaqCx2RzkJI5EMDt5JhWBREhyCvzSNK-G-WiLN5TQ5u5Ep7hUgHxmvKk881fxr6v0Ujt1qI866QoGOs9e-AbaR-8V8c/s400/1_overview_34.jpg" /></a> 그럼 그림과 같은 새 프로파일링 창이 뜨는데 결과 초기화를 선택하고 다음을 누릅니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghhMr4d8EjkFly0375J6_SArfN3YMGONnAomTWiLBkpEreo32J7dWhWclOg_bJeQ9dipvSGW-twAAlEHg41j8cghPgJu2zAf05yA-132kHeUdm8lyVsVDxqKW2S1_qy7KrNLYtseydtyWh/s1600/1_overview_35.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 294px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467606223334837410" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghhMr4d8EjkFly0375J6_SArfN3YMGONnAomTWiLBkpEreo32J7dWhWclOg_bJeQ9dipvSGW-twAAlEHg41j8cghPgJu2zAf05yA-132kHeUdm8lyVsVDxqKW2S1_qy7KrNLYtseydtyWh/s400/1_overview_35.jpg" /></a> 프로파일링 포인트에 대한 지정 이름과 기타를 확인하고 마침을 누릅니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLLmVQJaZcrsCUi4d-VjbMZVHxeSnU-kKqUXfp8S1AW07-tz-nMmAJUsXcE0zh0KcaUt07PvZfJaCKFTSuUrLYSYhkv-SwZbg6Mhe2FCeqdcYwnjuda5hJNpprBFI-5OLmfX5tffEMc4WA/s1600/1_overview_36.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 294px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467606524695637586" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLLmVQJaZcrsCUi4d-VjbMZVHxeSnU-kKqUXfp8S1AW07-tz-nMmAJUsXcE0zh0KcaUt07PvZfJaCKFTSuUrLYSYhkv-SwZbg6Mhe2FCeqdcYwnjuda5hJNpprBFI-5OLmfX5tffEMc4WA/s400/1_overview_36.jpg" /></a> 다시 라인 64의 screensize.height 부분에서 위와 같은 방법으로 마우스 오른쪽을 클릭, profile- insert profiling point 를 선택합니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiv2K8XUE0Er3c-Pw1ig6knlYuiMTfpgo00GkQHrC4sVyz3wmHMcbGYddlOURc6TokZOuLctqEdSp1bB8EWu-JqekxmynEm9EuX8Sj9kNoi5_oigjXuCflsdyUc_33qysaSI0yH6IGfwIy7/s1600/1_overview_37.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 347px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467606516964421618" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiv2K8XUE0Er3c-Pw1ig6knlYuiMTfpgo00GkQHrC4sVyz3wmHMcbGYddlOURc6TokZOuLctqEdSp1bB8EWu-JqekxmynEm9EuX8Sj9kNoi5_oigjXuCflsdyUc_33qysaSI0yH6IGfwIy7/s400/1_overview_37.jpg" /></a> 이번에는 대상 스냅샷(스냅샷 찍기)를 선택하고 다음을 누릅니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpqBa2PiaQ3CwgIQaDhAHgbbZ4Y2hBOGk6o-ndqSUKNR23mc0mzH0TROE5ORUZNdkglVDJXmmMJFJYhgfJNPTTQK2XcmmO8rzKN1qCqLWIQ3KRh3dC3xai30aIIs18mDUyDoYWi07wD8y4/s1600/1_overview_38.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 294px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467606513669960082" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpqBa2PiaQ3CwgIQaDhAHgbbZ4Y2hBOGk6o-ndqSUKNR23mc0mzH0TROE5ORUZNdkglVDJXmmMJFJYhgfJNPTTQK2XcmmO8rzKN1qCqLWIQ3KRh3dC3xai30aIIs18mDUyDoYWi07wD8y4/s400/1_overview_38.jpg" /></a> 역시 해당 내용을 확인하고 마침을 선택합니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgB3PaEFF6wVTKYGrpOEcya0foO9hVsj0tupTFl5Y1aPu7C27qOhn_IODU6cQfGbkihKzAVBkBVWJSCSBlkRsOq3BDwpejXG8VBvjJduoMUHT4ib7dakt_8j0Z0y1UQouAtDImhRe3xPITg/s1600/1_overview_39.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 294px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467606510114461522" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgB3PaEFF6wVTKYGrpOEcya0foO9hVsj0tupTFl5Y1aPu7C27qOhn_IODU6cQfGbkihKzAVBkBVWJSCSBlkRsOq3BDwpejXG8VBvjJduoMUHT4ib7dakt_8j0Z0y1UQouAtDImhRe3xPITg/s400/1_overview_39.jpg" /></a> 소스코드로 돌아와보면 그림처럼 파란색으로 2부분이 프로파일링 포인트로 선택되었음을 알 수 있습니다. (이 2부분이 실행될 때 각각 해당 프로파일링(결과초기화/스냅샷 찍기)가 진행될 것입니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinQ7yVb-fFAMda27cipY781hMxJZijhCVXXVjYOTjvPXmT1QOhyXfmGbZ4-Rz6C5UGOQnlTxzbVFiRqEmVy6ZHsV2CcQ2EcGVmdfSDIpmAwX3tEt123vKDuJWo0cAN82lqf4pknvDac06q/s1600/1_overview_40.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 347px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467606499519356050" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinQ7yVb-fFAMda27cipY781hMxJZijhCVXXVjYOTjvPXmT1QOhyXfmGbZ4-Rz6C5UGOQnlTxzbVFiRqEmVy6ZHsV2CcQ2EcGVmdfSDIpmAwX3tEt123vKDuJWo0cAN82lqf4pknvDac06q/s400/1_overview_40.jpg" /></a> 다시 프로파일링 선택 (profile)<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvYzUVKaAtgNUi78hGQtdSKPuKjDSgXxojnKSE5X8WjCDF-r5aUbZPfrCYfgPKRrwKl7rlUKQWVIUK4aaMQEt0F53m8tPA7wLPsXrYOToWUMqLddeGEnSHNShoXAuBYApOihhR8im_Jn0r/s1600/1_overview_41.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 347px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467606806775891586" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvYzUVKaAtgNUi78hGQtdSKPuKjDSgXxojnKSE5X8WjCDF-r5aUbZPfrCYfgPKRrwKl7rlUKQWVIUK4aaMQEt0F53m8tPA7wLPsXrYOToWUMqLddeGEnSHNShoXAuBYApOihhR8im_Jn0r/s400/1_overview_41.jpg" /></a> CPU 프로파일링에서 Entire Application (전체 응용 프로그램)으로 바꾸고 아래쪽 프로파일링 포인트 사용을 체크한 후 이 내용을 다시 확인하려면 활동중인 프로파일링 포인트 보기를 클릭하면 아래 그림과 같이 작업된 2개의 포인트가 보입니다.</p><p>실행<br /></p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibw-HTUxCVBXOIZ78LgfSwICA64_EY_o1yxuXZ_tcmaQNEd1poE7fanzeZFxQOEQSLKHgT5zRrLktk93hcUT7KNiCQrFwQwhSwGDoQw0NCX3jc0iHgpVJVhQ7Hz_h7aQx0npiIcunhyphenhyphenlwS/s1600/1_overview_42.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 241px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467606801740892098" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibw-HTUxCVBXOIZ78LgfSwICA64_EY_o1yxuXZ_tcmaQNEd1poE7fanzeZFxQOEQSLKHgT5zRrLktk93hcUT7KNiCQrFwQwhSwGDoQw0NCX3jc0iHgpVJVhQ7Hz_h7aQx0npiIcunhyphenhyphenlwS/s400/1_overview_42.jpg" /></a> 역시 게임 프로그램이 시작되고 아래 프로파일링 포인트 창이 출력됩니다.</p><p>2개의 포인트에서 결과가 각각 오른쪽에 링크로 제공됩니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxWiBn-dwMy3_ZbJUSNCeJtErP5ccKU9njZCUj5Uwb2A_ifh0gkDkiVCEnFQkzgYW8rlETrtUD_PoXin3zAg_Xra-bpildHhGce4u4vbzohF_MPIrFiFL556d0KMRZuzfEhWst3oVqpa3U/s1600/1_overview_44.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 347px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467606785135457954" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxWiBn-dwMy3_ZbJUSNCeJtErP5ccKU9njZCUj5Uwb2A_ifh0gkDkiVCEnFQkzgYW8rlETrtUD_PoXin3zAg_Xra-bpildHhGce4u4vbzohF_MPIrFiFL556d0KMRZuzfEhWst3oVqpa3U/s400/1_overview_44.jpg" /></a> 첫번째 보고를 누르면 결과 초기화에 대한 내용이 표시됩니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifaMBva4hjlOjwUqf-qZua85CDcR3YmRp98zdaOUOnfYF_sEX65zTbyxMwaelePLU1_6YjfHdsM2J0EW3z5noih4tndR4uOqkD5AdbI0G4ivV-ucOW9QgZL4zQpGzEkRFzEt7kmDyP4GYb/s1600/1_overview_45.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 347px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467606779878535410" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifaMBva4hjlOjwUqf-qZua85CDcR3YmRp98zdaOUOnfYF_sEX65zTbyxMwaelePLU1_6YjfHdsM2J0EW3z5noih4tndR4uOqkD5AdbI0G4ivV-ucOW9QgZL4zQpGzEkRFzEt7kmDyP4GYb/s400/1_overview_45.jpg" /></a> 두번째 보고 링크를 누르면 대상 스냅샷에 대한 내용과 함께 스냅샷 바로가기 링크가 나타납니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjelBgPR09puf2TMXjIgg8Ve7NwIg-l2V-MUjsaxmiVjryyFZbuQKfbVao4Hk_toeJCDw0SLf7z9H8lgZmAlCm3nlTMFBhtw9sTi66S8iu60k2wquwa54ZH3s8oZSZzNMeCiqdxu_1z1OfD/s1600/1_overview_46.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 347px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467607037157350210" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjelBgPR09puf2TMXjIgg8Ve7NwIg-l2V-MUjsaxmiVjryyFZbuQKfbVao4Hk_toeJCDw0SLf7z9H8lgZmAlCm3nlTMFBhtw9sTi66S8iu60k2wquwa54ZH3s8oZSZzNMeCiqdxu_1z1OfD/s400/1_overview_46.jpg" /></a> 포인트에서 지정된 바에 따라 진행된 스냅샷입니다. (스냅샷 링크 클릭)<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPVqyfqOHcU5ykdr-YFIvOIwzErdVvPzMXp_zj2e28OqyBcNr85SOrhy1ukwqrHSlWKv591yRFOqA-qY0VeqDTv9cLu7B76nD-xJiaLaynXQ5wgJWLPwuQ45kvmTUGBXx9fAfVKrQaj-Vl/s1600/1_overview_47.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 347px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467607026158825762" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPVqyfqOHcU5ykdr-YFIvOIwzErdVvPzMXp_zj2e28OqyBcNr85SOrhy1ukwqrHSlWKv591yRFOqA-qY0VeqDTv9cLu7B76nD-xJiaLaynXQ5wgJWLPwuQ45kvmTUGBXx9fAfVKrQaj-Vl/s400/1_overview_47.jpg" /></a> 맨 위에 initComponent() 에서 마우스 오른쪽을 클릭하면 소스로 이동 메뉴가 있습니다. 클릭<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsYGUq5uZsomRV_jCbE5c45fTdUDht6vcCr0lkIj8JxFy7PNmnwr3WJOOGx6KjGki2YCydbtK_bx-Siho0TEnePxQLblA1Amoi6dkoK_LmKydW2xTkUIq7o6nfCmBllsevHqWRTlmI3-pc/s1600/1_overview_48.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 347px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467607018448879586" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsYGUq5uZsomRV_jCbE5c45fTdUDht6vcCr0lkIj8JxFy7PNmnwr3WJOOGx6KjGki2YCydbtK_bx-Siho0TEnePxQLblA1Amoi6dkoK_LmKydW2xTkUIq7o6nfCmBllsevHqWRTlmI3-pc/s400/1_overview_48.jpg" /></a> 소스편집기에 initComponent() 메소드가 바로 제시됩니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhywKQIBCgbGdPqK-VfBdyGeEYndckkIpmCbdCxtqnApWAyquPnH8SjtF5uiUhfq6ILEw1Wpwlc3WTj5vRszes2dnVm3ZvFZCgKy_9vBjRu6G4_A4hA3CrKwgAwtyVHYirI9HrZ4KExs9ei/s1600/1_overview_49.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 347px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467607014301355570" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhywKQIBCgbGdPqK-VfBdyGeEYndckkIpmCbdCxtqnApWAyquPnH8SjtF5uiUhfq6ILEw1Wpwlc3WTj5vRszes2dnVm3ZvFZCgKy_9vBjRu6G4_A4hA3CrKwgAwtyVHYirI9HrZ4KExs9ei/s400/1_overview_49.jpg" /></a> 이상 프로파일링에 대한 보다 세분화된 방법에 대해 알아봤습니다.</p><p>이후로 여러 문제 있는 프로젝트들을 통해 넷빈의 프로파일링이 어떻게 찾아내는 지 하나씩 살펴 보도록 하겠습니다. </p><p>계속...^^</p>강여사(J.Y.Kang)http://www.blogger.com/profile/17450510931308610527noreply@blogger.com0tag:blogger.com,1999:blog-6811062799606447528.post-18557523241759597322010-05-04T18:27:00.000-07:002010-07-01T03:51:35.803-07:00넷빈(netbeans)6.8에서 프로파일링(profiling) 사용법 - overview이번 예제는 넷빈에서 프로파일링 하는 방법에 대해 알아보겠습니다.<br /><br />우선 샘플 프로젝트 생성을 위해 다음과 같이 작업합니다.<br /><br />프로젝트창에서 - (마우스 오른쪽 클릭)- 새 프로젝트 선택<br /><br /><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8NYCZlWsz8AN3OHubAWGtRf4RjWS4fNXTQYDn_aWRDK6K7E2r5KRckdx5nAkw9WQVxW-OUPOZlKaDPnCqBbl8XtZNgTd4Tzy32fFMBRxv2D4Ty03tFI14-EFuFRw2l8XkmebNzEqtXYlQ/s1600/1_overview_01.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 340px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467598287186639874" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8NYCZlWsz8AN3OHubAWGtRf4RjWS4fNXTQYDn_aWRDK6K7E2r5KRckdx5nAkw9WQVxW-OUPOZlKaDPnCqBbl8XtZNgTd4Tzy32fFMBRxv2D4Ty03tFI14-EFuFRw2l8XkmebNzEqtXYlQ/s400/1_overview_01.jpg" /></a> 카테고리에서 샘플- 프로젝트에서 Anagram Game 을 선택합니다</p><p>다음<br /></p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRmlZinThsznA-wvimilXbeCLT-_HBv2lmmymlhboEuIZ2rjK0lwBFrO15xpwbXNSSFD41mKdiyUs8sYi1Ahk8vSbZmHC0g3GxVH8-O9H2Kw8upS1KC9fuVZXg-fpxaW1z4zulZLvqJhvx/s1600/1_overview_02.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467598276836209666" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRmlZinThsznA-wvimilXbeCLT-_HBv2lmmymlhboEuIZ2rjK0lwBFrO15xpwbXNSSFD41mKdiyUs8sYi1Ahk8vSbZmHC0g3GxVH8-O9H2Kw8upS1KC9fuVZXg-fpxaW1z4zulZLvqJhvx/s400/1_overview_02.jpg" /></a> 프로젝트 이름과 위치에 대한 지정을 합니다.</p><p>저는 프로젝트 이름은 그대로 위치는 c:\ 로 줬습니다.</p><p>마침<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmSc75qLQ0D3JEyMQwpCJHlO5V05I1BkTzvVylXjZACSO8QI5AgV56JGU2E34etAnJrF8ubsqO13dVoO-yNYJeKmrwX2jU0Lj4LlLIiFB6617IBjqE6esUu-hb8nk5F0hV7_yNB00Q2jk-/s1600/1_overview_03.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467598274136055506" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmSc75qLQ0D3JEyMQwpCJHlO5V05I1BkTzvVylXjZACSO8QI5AgV56JGU2E34etAnJrF8ubsqO13dVoO-yNYJeKmrwX2jU0Lj4LlLIiFB6617IBjqE6esUu-hb8nk5F0hV7_yNB00Q2jk-/s400/1_overview_03.jpg" /></a> 프로젝트가 만들어지면 바로 실행 합니다.</p><p>프로젝트에서 마우스 오른쪽 클릭 - 실행<br /></p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEin83xSnvlkLB9fqdVyLrVZK2OOs3BTgbif3lJQGPPJDUZUk3WJjVe6jgEKbHWtGA97fKJ9SnaylU-LhipWIK71u7nkDIjFbE5QX2l5a7kSgoUzXnsdGgDJFTZUNkzQSxw3l0uJbXcNxFT7/s1600/1_overview_04.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 340px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467598264882226658" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEin83xSnvlkLB9fqdVyLrVZK2OOs3BTgbif3lJQGPPJDUZUk3WJjVe6jgEKbHWtGA97fKJ9SnaylU-LhipWIK71u7nkDIjFbE5QX2l5a7kSgoUzXnsdGgDJFTZUNkzQSxw3l0uJbXcNxFT7/s400/1_overview_04.jpg" /></a> 이 샘플 프로젝트는 언어 맞추기 게임입니다. 위에 엉클어진(스크램블) 단어를 추측하여</p><p>아래 텍스트필드에 넣습니다. 아래 그림처럼 틀리면 저런 메시지가..--;<br /></p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRjt27suCslFhnhOP0ALQZ8OydIw7mJ9krtQ8u8w-fr1amlxngeGO1cqwqpR-phMBlUDxF34ZCUhGpax6BRUV3C9VgLy4gbm_g-I58jyblpP7kNh4ISngU-_uTMVlNHh2si0csLEOG4Nb5/s1600/1_overview_05.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 369px; DISPLAY: block; HEIGHT: 219px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467598261980928178" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRjt27suCslFhnhOP0ALQZ8OydIw7mJ9krtQ8u8w-fr1amlxngeGO1cqwqpR-phMBlUDxF34ZCUhGpax6BRUV3C9VgLy4gbm_g-I58jyblpP7kNh4ISngU-_uTMVlNHh2si0csLEOG4Nb5/s400/1_overview_05.jpg" /></a> 맞으면 이런 메시지가 나옵니다 ^^</p><p>new word 버튼을 누르면 새 단어가 나오구요.<br /></p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMczulHoEc6tCCQrp4SOUK50a4E0lgcoX4Xsgen5faDJwUhyJpubBh15JKuedSOKaGPVMvXenJsDLzgmDQXQNRqWCBQx46jMJ46cGkHqg4t-QL1w-0JEg7SavjzeKFvkZHjPU48Zz8FADA/s1600/1_overview_06.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 369px; DISPLAY: block; HEIGHT: 219px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467598610328509346" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMczulHoEc6tCCQrp4SOUK50a4E0lgcoX4Xsgen5faDJwUhyJpubBh15JKuedSOKaGPVMvXenJsDLzgmDQXQNRqWCBQx46jMJ46cGkHqg4t-QL1w-0JEg7SavjzeKFvkZHjPU48Zz8FADA/s400/1_overview_06.jpg" /></a><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihU9dlt7hHewaBIGLt_KaPGau2yNh_4WSJ_86gZwtDCxrXh7yYbB2MQgzKjLYlAIMG59Cn9YEpcN43r95SEcVge2wYbJ8X-B6h0UjGyqK4wrvhHO3L0NhUKnrE18XXYbMLFiFMkFc9MN2Q/s1600/1_overview_07.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 369px; DISPLAY: block; HEIGHT: 219px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467598602558647282" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihU9dlt7hHewaBIGLt_KaPGau2yNh_4WSJ_86gZwtDCxrXh7yYbB2MQgzKjLYlAIMG59Cn9YEpcN43r95SEcVge2wYbJ8X-B6h0UjGyqK4wrvhHO3L0NhUKnrE18XXYbMLFiFMkFc9MN2Q/s400/1_overview_07.jpg" /></a> 이제 이 프로젝트를 프로파일링 해보도록 하겠습니다.</p><p>상위 메뉴에서 profile - 그리고 첫번째 메뉴인 profile Main Project 를 선택합니다.</p><p>(아니면 그냥 프로젝트(왼쪽창의 Anagram)에서 마우스 오른쪽을 클릭하면 profile 메뉴가 있습니다. 그걸 눌러서 진행해도 지금은 같습니다 ).<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnZ2YeS8FC-urHqsiF6tV_48rNMkoonHy2ja8nmBvcsTaH2YwMcRCb6LZO6G7uy08f6FM09BGuJuriIUTkZS43t3lKCu-mQVAEDwpX-MAafwiXEOF7kA6v-9Djh2ciH3rWptCoHTWGHni6/s1600/1_overview_08.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 340px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467598594785619666" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnZ2YeS8FC-urHqsiF6tV_48rNMkoonHy2ja8nmBvcsTaH2YwMcRCb6LZO6G7uy08f6FM09BGuJuriIUTkZS43t3lKCu-mQVAEDwpX-MAafwiXEOF7kA6v-9Djh2ciH3rWptCoHTWGHni6/s400/1_overview_08.jpg" /></a> 프로파일링이 진행되면서 프로젝트와 시작/종료 등을 일치하고자 build 를 수정하게 됩니다. 이에 대한 알림 메시지고 나중에 원상태로 복귀하려면 프로파일의 Advanced commands - Unintegrate Profiler 메뉴를 선택하면 됩니다.</p><p>OK<br /></p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfvGjWGg05bLcJjoPYF2PEaOA-p3Jl14ZLNFe6DQJ1fjCIlPpgqe8CgFN_uYOSU7fBjzzGKDrKEdfUc6f5qC81IKRC2S5EXY-3kI5BlWcWvglvi6BrQaT9Vml7asirJDhRMdrabI5XYDlC/s1600/1_overview_09.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 206px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467598586117949698" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfvGjWGg05bLcJjoPYF2PEaOA-p3Jl14ZLNFe6DQJ1fjCIlPpgqe8CgFN_uYOSU7fBjzzGKDrKEdfUc6f5qC81IKRC2S5EXY-3kI5BlWcWvglvi6BrQaT9Vml7asirJDhRMdrabI5XYDlC/s400/1_overview_09.jpg" /></a> 그럼 맨처음 저렇게 창이 나옵니다. 왼쪽 3개의 큰 버튼이 각각 해당 프로파일링을 선택할 수 있습니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNzARRZjUre47PbPiKqgUf9uadAwqRgupHEez0OiHgPo_aH16L1k6SSt4GmgEKP2eV9d5N8I97i2oSD8JL8fJnF2Utc81uG1Yjnu7yUPwSAgAMm__m52vhVOthu5Au76D4Hi11TcT8W-Lg/s1600/1_overview_10.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 241px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467598585858800594" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNzARRZjUre47PbPiKqgUf9uadAwqRgupHEez0OiHgPo_aH16L1k6SSt4GmgEKP2eV9d5N8I97i2oSD8JL8fJnF2Utc81uG1Yjnu7yUPwSAgAMm__m52vhVOthu5Au76D4Hi11TcT8W-Lg/s400/1_overview_10.jpg" /></a> 모니터를 누르면 모니터 프로파일링을 위해 해당 버튼이 커지고 오른쪽 설정이 나타납니다<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzvrt8eRHqiDBHbAC102MX5A5RewQNUp85iqqYddmiHNMed1QncZhCge8c04dqx8HKQ-z-O7osUIB9_4m8wlThln_gSMjR7NcilkqEvlV7i5_CtuwDZ8bLZhqs51tawPvGObyWTJn5FKa3/s1600/1_overview_11.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 241px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467598848920033122" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzvrt8eRHqiDBHbAC102MX5A5RewQNUp85iqqYddmiHNMed1QncZhCge8c04dqx8HKQ-z-O7osUIB9_4m8wlThln_gSMjR7NcilkqEvlV7i5_CtuwDZ8bLZhqs51tawPvGObyWTJn5FKa3/s400/1_overview_11.jpg" /></a> 역시 아래 메모리 버튼을 누르면 메모리 프로파일링 옵션들이 제시됩니다<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjX3iLhnU3uxztlilaz9Z9OEPUFVp4c5WuUXocs54_Qq20Teo9DOrbtXX57aqjUidTEUushonuejT5xtiqp0lpCQcsljiJ2kq7buz5YkM3gj4grlCfUsTb7gyASec9vH9umYIrHb-mZ-H_O/s1600/1_overview_12.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 241px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467598840873080050" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjX3iLhnU3uxztlilaz9Z9OEPUFVp4c5WuUXocs54_Qq20Teo9DOrbtXX57aqjUidTEUushonuejT5xtiqp0lpCQcsljiJ2kq7buz5YkM3gj4grlCfUsTb7gyASec9vH9umYIrHb-mZ-H_O/s400/1_overview_12.jpg" /></a> 그럼 모니터 프로파일링부터 시작하겠습니다. 모니터 버튼을 누르고 오른쪽 설정에 스레드 모니터링 활성화를 체크합니다.</p><p>실행<br /></p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOf4uI2HozDaivFzlcPqpv4dSd-_OkQm0tf2soJZlD5qRsFHv4_6ifZYe8pZbgBZy5UrgLl2rgzJupUIstmhVx6rLpQUtUfjNddaPQo8Z-W38wM_t75WOeVyh5FQL8Vvg2GIUit9je8wGo/s1600/1_overview_13.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 241px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467598835026116978" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOf4uI2HozDaivFzlcPqpv4dSd-_OkQm0tf2soJZlD5qRsFHv4_6ifZYe8pZbgBZy5UrgLl2rgzJupUIstmhVx6rLpQUtUfjNddaPQo8Z-W38wM_t75WOeVyh5FQL8Vvg2GIUit9je8wGo/s400/1_overview_13.jpg" /></a> 프로파일링 통합으로 게임프로그램이 실행되면서 뒤쪽으로 프로파일러 컨트롤 패널과(왼쪽), 스레드 모니터링(오른쪽)이 나타납니다. 그리고 하단부에는 VM Telemetry 가 3개 overview로 보여집니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWzzlvRSZ1LJ6H2o5U4-OW06vIbGfY8WoOCm2nCpEH03iPe7_lZxKHVwq67mI4PcxDQr0G7W_kwQojQ9SOq-YC3qgOrZUHB8a5Xz7sm1jNW09gyE3MNT9DUXZPrTcBE9jmcinLZoPj3EFF/s1600/1_overview_14.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 340px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467598822840943074" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWzzlvRSZ1LJ6H2o5U4-OW06vIbGfY8WoOCm2nCpEH03iPe7_lZxKHVwq67mI4PcxDQr0G7W_kwQojQ9SOq-YC3qgOrZUHB8a5Xz7sm1jNW09gyE3MNT9DUXZPrTcBE9jmcinLZoPj3EFF/s400/1_overview_14.jpg" /></a> 이번엔 CPU 모니터링을 해보도록 하겠습니다.</p><p>다시 profile- profile main project (혹은 프로젝트에서 profile)을 선택합니다. (이 때 이전 프로파일링 세션이 종료되지 않았으면 확인 팝업창이 뜹니다. ok)<br /></p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPZfqVd7wAxbnM-OzmYbgkFKn5-wmhjrgACzxo7gG9xoDuGmPYfoft2drolV87FONN7dMamEhhzIrpyjmH6wJ2ViKT8GFUAhyphenhyphennSURZHebB83rGLPastX3mYmNh9cqbpCC6fI7mm-_966jp/s1600/1_overview_15.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 340px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467598821559047538" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPZfqVd7wAxbnM-OzmYbgkFKn5-wmhjrgACzxo7gG9xoDuGmPYfoft2drolV87FONN7dMamEhhzIrpyjmH6wJ2ViKT8GFUAhyphenhyphennSURZHebB83rGLPastX3mYmNh9cqbpCC6fI7mm-_966jp/s400/1_overview_15.jpg" /></a>이번에는 CPU 버튼을 눌러 CPU 프로파일링을 선택하고 성능 분석에 Entire Application 을 선택합니다.</p><p>실행<br /></p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghRtXYgsmOeK4PCmamlCxtMwAM6STnjcQl0J4lZ5YdKZE-bi33gbsX_Ymr2UtryVS7bGH4lebW4tvDOwzlXk7-14agWDi0R4nq8zT1K0bUy5eQbYoSbA3A3dCVlkQQwf3lDRBkvr0MojpZ/s1600/1_overview_16.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 241px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467599108370684402" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghRtXYgsmOeK4PCmamlCxtMwAM6STnjcQl0J4lZ5YdKZE-bi33gbsX_Ymr2UtryVS7bGH4lebW4tvDOwzlXk7-14agWDi0R4nq8zT1K0bUy5eQbYoSbA3A3dCVlkQQwf3lDRBkvr0MojpZ/s400/1_overview_16.jpg" /></a> 역시 게임 프로그램이 시작되고 프로파일러 컨트롤 패널(왼쪽)과 스레드 모니터링(오른쪽)이 나타납니다. 현재 비활성되어 있기때문에 작은 아이콘을 누르면 스레드 모니터링이 활성화됩니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheUbLic7LR8Ua_p_l36KHkvHvkKo0CGAqsm31efPoAvNbmtXZrFSBWeyR93LT-6lEtoGBT4NfK2tCds0VKMGfj500AnqFql_MJk134qgirCoobfYBWpwVx0tcMSh87wVoJvzg_n6Fn_3a7/s1600/1_overview_17.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 340px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467599101486610610" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheUbLic7LR8Ua_p_l36KHkvHvkKo0CGAqsm31efPoAvNbmtXZrFSBWeyR93LT-6lEtoGBT4NfK2tCds0VKMGfj500AnqFql_MJk134qgirCoobfYBWpwVx0tcMSh87wVoJvzg_n6Fn_3a7/s400/1_overview_17.jpg" /></a> 스레드 모니터링 활성화(뒤쪽)된 그림<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1JCzJhFFq6X0eeYvhB6QFLvcJkkjBb-y12tnJMiZIqtaPiMz0kDHRzb9uOM5ArHyFE4H_XoZ7bDamBQGzSUy4p1_-tiKzYrcsWE_AgiW7J3LP9ubKFvvZDUq_ay-L-aGKh3d7-4M0plLJ/s1600/1_overview_18.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 340px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467599095397621506" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1JCzJhFFq6X0eeYvhB6QFLvcJkkjBb-y12tnJMiZIqtaPiMz0kDHRzb9uOM5ArHyFE4H_XoZ7bDamBQGzSUy4p1_-tiKzYrcsWE_AgiW7J3LP9ubKFvvZDUq_ay-L-aGKh3d7-4M0plLJ/s400/1_overview_18.jpg" /></a> 프로그램을 종료하면 스냅샷을 찍을 것인지에 대한 확인창이 뜹니다.</p><p>예 선택<br /></p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgr-adzcbfaVquk70Y3ajsHGhmr3Pp_Y35z3nku4fog3b5USBDFNcY6dmbsFwiLxFYfK8vvwVA5lh8v_VTu0E9yXDumFd5adEaQJ-mWGj1lDL69sHrowpH1cXp_lK2wmwYfou_-CuH_Rotz/s1600/1_overview_19.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 340px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467599088504833970" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgr-adzcbfaVquk70Y3ajsHGhmr3Pp_Y35z3nku4fog3b5USBDFNcY6dmbsFwiLxFYfK8vvwVA5lh8v_VTu0E9yXDumFd5adEaQJ-mWGj1lDL69sHrowpH1cXp_lK2wmwYfou_-CuH_Rotz/s400/1_overview_19.jpg" /></a> 좀전 CPU 프로파일링에 대한 스냅샷입니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEharneYqAFpjZAqBeAfZ8Eav_NBQ1VquScupOhnyfjO-ni_5Ug9GegkvwOc5vnuoDjSuEAJD1tcMk-jHgNmCoir8V93Qo-xJoZuhowJNcE1vh2sMS1qYQByavJ0priUs1dMlFHEfyUJaAo_/s1600/1_overview_20.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 340px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467599083849537154" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEharneYqAFpjZAqBeAfZ8Eav_NBQ1VquScupOhnyfjO-ni_5Ug9GegkvwOc5vnuoDjSuEAJD1tcMk-jHgNmCoir8V93Qo-xJoZuhowJNcE1vh2sMS1qYQByavJ0priUs1dMlFHEfyUJaAo_/s400/1_overview_20.jpg" /></a> 마지막으로 메모리 프로파일링에 대해 알아보겠습니다.</p><p>profile - profile main project (혹은 프로젝트의 profile 선택)<br /></p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiu-uWwTzfMD0_5rIQsXwZr-MQwaoBqn1ESmrbu6uoylNE5lAXBZ7YzwdWzETeiVLwG6iHrWdb0jC-j6KGN6k96Fk5B4jxaOw_ilUiTrnEITj-6N-xNnqbp2Y2vbuQPcI7onFGTqu7pHbly/s1600/1_overview_21.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 340px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467599352465886290" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiu-uWwTzfMD0_5rIQsXwZr-MQwaoBqn1ESmrbu6uoylNE5lAXBZ7YzwdWzETeiVLwG6iHrWdb0jC-j6KGN6k96Fk5B4jxaOw_ilUiTrnEITj-6N-xNnqbp2Y2vbuQPcI7onFGTqu7pHbly/s400/1_overview_21.jpg" /></a> 메모리 모니터링을 누르고 오른쪽 설정에서 객체 생성과 가비지 컬렉션 모두 기록을 선택하고, 할당을 위한 스택 추적 기록을 역시 체크 합니다.</p><p>실행<br /></p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipQrxJICS1WpzQAaj5MNv4lxlOiMbF5Qr5W13ioJ9ZrH1xlK9Zjs0quD5AFWRbRfkzrLADwQrRb_j4qPzVOkb5CHmj_1iM0YUF9zjkCH9jqByZcFAoVy1WidNNWs7kgXsMHmsxntIgDBpf/s1600/1_overview_22.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 241px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467599342342888386" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipQrxJICS1WpzQAaj5MNv4lxlOiMbF5Qr5W13ioJ9ZrH1xlK9Zjs0quD5AFWRbRfkzrLADwQrRb_j4qPzVOkb5CHmj_1iM0YUF9zjkCH9jqByZcFAoVy1WidNNWs7kgXsMHmsxntIgDBpf/s400/1_overview_22.jpg" /></a> 마찬가지로 게임프로그램이 시작되고 뒤편으로 할당 객체들이 나타납니다. (안보이시면 라이브 결과(왼쪽 패널)를 누르시면 됩니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZnH1PJQGhRLEKgKSaFki5RWN4AsbNQWk6XRUrpSmu_sLzNfeQwWKL7mhAsEoTyMt4HwIQfuvRbKC2z7DsvIfNxqE3o0GHNAqjZdREeDvoqnmDJ3xJ-_-J4Sx2HqToFXQCVA807z8eDnpe/s1600/1_overview_23.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 340px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467599334544812754" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZnH1PJQGhRLEKgKSaFki5RWN4AsbNQWk6XRUrpSmu_sLzNfeQwWKL7mhAsEoTyMt4HwIQfuvRbKC2z7DsvIfNxqE3o0GHNAqjZdREeDvoqnmDJ3xJ-_-J4Sx2HqToFXQCVA807z8eDnpe/s400/1_overview_23.jpg" /></a> 프로그램을 종료하면 메모리 프로파일링에 대한 스냅샷 확인창이 뜹니다.</p><p>예 선택<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikMhBjyOotlyQ_xU2FBbvaTZJ4KHMvasMx69N5HRzbiHFebaDozXbMr8F_YtptQlrTxwtRkpgotXwxidS9OZ2qnWgZ3nW430VNngBl9NUBBctYz8SKOZ3Lkt0EZvk2xxZliSMEnnpZj2b5/s1600/1_overview_24.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 340px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467599323154728306" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikMhBjyOotlyQ_xU2FBbvaTZJ4KHMvasMx69N5HRzbiHFebaDozXbMr8F_YtptQlrTxwtRkpgotXwxidS9OZ2qnWgZ3nW430VNngBl9NUBBctYz8SKOZ3Lkt0EZvk2xxZliSMEnnpZj2b5/s400/1_overview_24.jpg" /></a> 스냅샷은 다음과 같습니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYoOa6V_vEtXCwlbvvYFGQn7annp-zaJuxjH19LbqNoXB47mzJjLbWE0R1ylgooC9jwRSK9FKX3VErA2cFDUKf9mu_E-ihK5G6gD2VfE7rE9gWDSkLyixkEHX1SbgKhNksRmchP3Sh___c/s1600/1_overview_25.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 340px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5467599316089406978" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYoOa6V_vEtXCwlbvvYFGQn7annp-zaJuxjH19LbqNoXB47mzJjLbWE0R1ylgooC9jwRSK9FKX3VErA2cFDUKf9mu_E-ihK5G6gD2VfE7rE9gWDSkLyixkEHX1SbgKhNksRmchP3Sh___c/s400/1_overview_25.jpg" /></a></p><br /><p>지금까지 넷빈즈 프로파일링에 대해 개략적으로 살펴 봤습니다.</p><p>다음 예제는 이 프로파일링에 대한 세부 설정과 여러 상황별 사용 방법에 대해 살펴보겠습니다.</p><p>계속...</p><p></p>강여사(J.Y.Kang)http://www.blogger.com/profile/17450510931308610527noreply@blogger.com0tag:blogger.com,1999:blog-6811062799606447528.post-46576648444485116972009-12-22T06:38:00.001-08:002009-12-22T07:22:54.389-08:00넷빈(Netbeans)6.8에서 stateless 세션과 servlet 3.0 연동하기 - basic이번 예제에서는 서블릿 3.0 에다 EJB 무상태 세션 빈(Stateless Session Bean)을 연결해보도록 하겠습니다.<br /><br />우선 작업환경은 다음과 같습니다.<br /><br />넷빈: 6.8<br />서버: 글래스피시 v3 도메인<br />버전: EE 6 Web<br /><br />그럼 프로젝트를 새로 만듭니다.<br /><br />파일 - 새 프로젝트<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGr83LUMKbna9oghoU3lmPzLzGcBbJ0CT4bUrKFpJiZ0RAScTDVAG4NHT93wXf02UQKUVvqYkAfIU2e2cDDoK3oqM5CoadBljXDMNbyc6f813FhpFY225PeOyVMKohgpNvWP2DPOJ3OS_E/s1600-h/statelesservlet_01.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 292px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5418070621358290354" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGr83LUMKbna9oghoU3lmPzLzGcBbJ0CT4bUrKFpJiZ0RAScTDVAG4NHT93wXf02UQKUVvqYkAfIU2e2cDDoK3oqM5CoadBljXDMNbyc6f813FhpFY225PeOyVMKohgpNvWP2DPOJ3OS_E/s400/statelesservlet_01.jpg" /></a><br />Java Web - Web Application 선택<br />다음 클릭<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-irni1AzXJ9yOgP_avG-fRd44fJCm1ABHJ3QgRLmgHkRhxjL4WrWLhjk4hLDTMRdqll7r7850PePncFYfjtDg9veETXY93SmYIsBPl2D9uKOvg9NAaYIOSiV-O8P6iCC9afBEGaqBCFBJ/s1600-h/statelessservlet_02.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5418070614928138290" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-irni1AzXJ9yOgP_avG-fRd44fJCm1ABHJ3QgRLmgHkRhxjL4WrWLhjk4hLDTMRdqll7r7850PePncFYfjtDg9veETXY93SmYIsBPl2D9uKOvg9NAaYIOSiV-O8P6iCC9afBEGaqBCFBJ/s400/statelessservlet_02.jpg" /></a><br />프로젝트 명은 StatelessServlet 이라고 줬습니다.<br />경로 적당히<br />다음 클릭<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7lWS5Zpjv0CDsOaOcffr0jG7Q_f6xR3LnWeMc2NC52tNSNvvN5-bfaJzlq313WCxlDQJcUabhUtD5F6nN4M1eouXHtR9QdEOnHDKmg3ONp9U7DNlV2cBup_W_4uL7DkTrICuUlgoVax_u/s1600-h/statelessservlet_03.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5418070610019336930" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7lWS5Zpjv0CDsOaOcffr0jG7Q_f6xR3LnWeMc2NC52tNSNvvN5-bfaJzlq313WCxlDQJcUabhUtD5F6nN4M1eouXHtR9QdEOnHDKmg3ONp9U7DNlV2cBup_W_4uL7DkTrICuUlgoVax_u/s400/statelessservlet_03.jpg" /></a><br />서버를 글래스피시 v3 도메인으로<br />버전은 EE 6 Web 으로 줍니다.<br />마침 클릭<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHA8VHd8doEstwhq32ahQLQoMbuH_06nzbrHY2W15jwa03hjbdyg74NWzCIAYCQ-XDyBKQLIumxcejpJATcgcnQI54hHcxTqWYoGfmC30pDdLVlRycNgo_3BkoZZboPyRggiBObNMTqCkN/s1600-h/statelessservlet_04.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 266px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5418070605139788946" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHA8VHd8doEstwhq32ahQLQoMbuH_06nzbrHY2W15jwa03hjbdyg74NWzCIAYCQ-XDyBKQLIumxcejpJATcgcnQI54hHcxTqWYoGfmC30pDdLVlRycNgo_3BkoZZboPyRggiBObNMTqCkN/s400/statelessservlet_04.jpg" /></a><br />그럼 기본 웹 어플리케이션이 만들어집니다.<br />여기에 서블릿을 새로 만들도록 하겠습니다.<br />프로젝트에서 오른쪽 마우스 클릭 - new - other<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEim3sMNiep9W9Ca3bwo7hIB-4tWZaFXn1o0zqvGqiCiKm4HxT4U83iQVXzmeqZt5QeIrIC6gfxXGidYEW6qnZX208EJDL2cb0hnwsZOCweJljWNBAf2uA1-vY1RLku3ZlLQlq5gmLv4Z6qe/s1600-h/statelessservlet_05.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 292px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5418070599188389282" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEim3sMNiep9W9Ca3bwo7hIB-4tWZaFXn1o0zqvGqiCiKm4HxT4U83iQVXzmeqZt5QeIrIC6gfxXGidYEW6qnZX208EJDL2cb0hnwsZOCweJljWNBAf2uA1-vY1RLku3ZlLQlq5gmLv4Z6qe/s400/statelessservlet_05.jpg" /></a><br />Web - Servlet 선택<br />다음 클릭<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWYDOgh6Ft9NoIc1dGPrSU7l_shxY0H_CpBowyBcsirnaDs76UENFOF7UybxqVbtnGFQ948p4uWNQbonTHBtUmHkQhAytSg5yqVPN_yEQEci_Q9Rs6gpKaVcOuy_5lKfOxD7KvJasYTPBb/s1600-h/statelessservlet_06.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 276px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWYDOgh6Ft9NoIc1dGPrSU7l_shxY0H_CpBowyBcsirnaDs76UENFOF7UybxqVbtnGFQ948p4uWNQbonTHBtUmHkQhAytSg5yqVPN_yEQEci_Q9Rs6gpKaVcOuy_5lKfOxD7KvJasYTPBb/s400/statelessservlet_06.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5418075715112931506" /></a><br />이름을 StatelessServlet 이라고 줬습니다.<br />패키지는 stateless 라고 줍니다.<br />다음 클릭<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoc5EVuzBY-tmYgp3HwiP9pfBlQHlKjJ156S7G0kuv9NLzDMugBjFW4m4nVIdr4pLq2crNALWw3rnh0mjnwR_yzlpr_NBIbbDIrYM75xhXqdEnaV6_GctofesovPmxB6cxEpUqBJtXVeq8/s1600-h/statelessservlet_07.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 276px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoc5EVuzBY-tmYgp3HwiP9pfBlQHlKjJ156S7G0kuv9NLzDMugBjFW4m4nVIdr4pLq2crNALWw3rnh0mjnwR_yzlpr_NBIbbDIrYM75xhXqdEnaV6_GctofesovPmxB6cxEpUqBJtXVeq8/s400/statelessservlet_07.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5418075712708495538" /></a><br />역시 자바 서블릿 3.0 에서는 web.xml 이 옵션가능이므로 체크가 해제되어 있습니다.<br />기본 그대로 <br />마침 클릭<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWH3gFZb7ErohcUfPtvYUAw_u2co35-sczhlwWAMhU_3-j8pCeqfv5ahaZIUd8o-wsp3JD4L9mEsnQ-cWTKm3q0uj7KWYs-Iu9ZgmEXDzh55R5w2dfJ20ZJjFX0wb0NSsbhAGAgm61tg3H/s1600-h/statelessservlet_08.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 276px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWH3gFZb7ErohcUfPtvYUAw_u2co35-sczhlwWAMhU_3-j8pCeqfv5ahaZIUd8o-wsp3JD4L9mEsnQ-cWTKm3q0uj7KWYs-Iu9ZgmEXDzh55R5w2dfJ20ZJjFX0wb0NSsbhAGAgm61tg3H/s400/statelessservlet_08.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5418075709888474514" /></a><br />만들어진 서블릿 소스에<br />@WebServlet 어노테이션과 함께 지정된 내용들이 작성되어 있는 것을 확인해볼 수 있습니다.<br />==================================================================<br /><blockquote>@WebServlet(name="NewServlet", urlPatterns={"/NewServlet"})<br />public class NewServlet extends HttpServlet {</blockquote><br />==================================================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlYbDdNxDnBW48emLmN2QGJcMvkowsv4D5RYLLkK2dGyzlTBWsimqhVVbceVxgwiW2Jk-kcEkr-gwvqGCjCC6mcjkyNqcneIHC4NsrUycXPZryQwgqUgmtbRayWOcCOXs9SZZIgxgVCXtn/s1600-h/statelessservlet_09.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 292px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlYbDdNxDnBW48emLmN2QGJcMvkowsv4D5RYLLkK2dGyzlTBWsimqhVVbceVxgwiW2Jk-kcEkr-gwvqGCjCC6mcjkyNqcneIHC4NsrUycXPZryQwgqUgmtbRayWOcCOXs9SZZIgxgVCXtn/s400/statelessservlet_09.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5418075699092933986" /></a><br />자 그럼 이 서블릿에서 호출할 무상태 세션빈을 만들도록 하겠습니다.<br />프로젝트에서 오른쪽 마우스 클릭 - new - other<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlCnR2BX1OJo5eqh7xZhM8w7rrskdRWELXCwsWNoeHdKUR4AZT5UJjwuhPIXmjy3HB8Bu-oCdGGzexcOgZHKjk5WXVncduVCxqpWu-sShdxF_GISi4XjAsn39Hz5U6kKOpsqlu9OHS1zeS/s1600-h/statelessservlet_10.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 292px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlCnR2BX1OJo5eqh7xZhM8w7rrskdRWELXCwsWNoeHdKUR4AZT5UJjwuhPIXmjy3HB8Bu-oCdGGzexcOgZHKjk5WXVncduVCxqpWu-sShdxF_GISi4XjAsn39Hz5U6kKOpsqlu9OHS1zeS/s400/statelessservlet_10.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5418075696875192322" /></a><br />Java EE - Session Bean 선택<br />다음 클릭<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiupBfXJHMBd2ZBJ0dEB91_3GkGWdrxXUd45B0lXurV6xU1z6ytbEzGw08JTDnpB5qZJuwq5riEnoCiKs4eGZ3C1LpYFZ8UT07Do7PsdxkfmCuDQAR-hnMS3eZs6d6gGRx624oqPL0i8C5O/s1600-h/statelessservlet_11.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 276px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiupBfXJHMBd2ZBJ0dEB91_3GkGWdrxXUd45B0lXurV6xU1z6ytbEzGw08JTDnpB5qZJuwq5riEnoCiKs4eGZ3C1LpYFZ8UT07Do7PsdxkfmCuDQAR-hnMS3eZs6d6gGRx624oqPL0i8C5O/s400/statelessservlet_11.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5418076841248625394" /></a><br />클래스 이름은 NewSessionBean <br />패키지 이름은 stateless<br />유형에 Stateless 를 선택합니다.<br />다음 클릭<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilCruwXvx1XROypZn4DFo9nIYZo3nMT9loxkxtlna-U6aD49kj9H0ssaetOxfVy4x0DCyr0RVNGUtIvGKpfKr1UWaTKxmd1MPP0qwybXUMSVjSxpCLVsAiC3XiTykaXaYbkeBCJ_D2K_Ef/s1600-h/statelessservlet_12.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 276px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilCruwXvx1XROypZn4DFo9nIYZo3nMT9loxkxtlna-U6aD49kj9H0ssaetOxfVy4x0DCyr0RVNGUtIvGKpfKr1UWaTKxmd1MPP0qwybXUMSVjSxpCLVsAiC3XiTykaXaYbkeBCJ_D2K_Ef/s400/statelessservlet_12.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5418076834641906546" /></a><br />만들어진 세션 빈 소스에서 주석에 나온대로 메소드를 추가하기 위해 소스 삽입(insert code: ALT+INSERT)를 선택합니다. 그럼 그림처럼 add business method 메뉴가 나타납니다.<br />클릭<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0E23NyNDejW3tVAPB_vxLb5G6yuQZggUZuNn6N892_BKx8D3pnDKGsSqvWtPZjKJJVm9pnYNm04IVkp9bod-VrxGhb94BIuD9Tcjy-HMBVmMp9IfoVWmoEAz5GUaHWFs22rLQR_-69P4E/s1600-h/statelessservlet_13.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 292px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0E23NyNDejW3tVAPB_vxLb5G6yuQZggUZuNn6N892_BKx8D3pnDKGsSqvWtPZjKJJVm9pnYNm04IVkp9bod-VrxGhb94BIuD9Tcjy-HMBVmMp9IfoVWmoEAz5GUaHWFs22rLQR_-69P4E/s400/statelessservlet_13.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5418076827737026178" /></a><br />팝업창이 뜨면 그림과 같이 작성합니다.<br />메소드 이름 sayHello<br />리턴유형 java.lang.String<br />파라미터 추가(add)버튼을 눌러<br />파라미터 변수 이름에 name (<-parameter대신) 바꿉니다.<br />OK<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQCrHyW7G1ItJ8bsGiIM3GE7zmaNAwIsIPgSGG3AF4RiFg0p756cMNCQNLZIFz4ixrSAmVBVxfO6y7rMrc85Foexolbpf4QIow06kJYbVBrkeqIoGwdnp9IOuimYzuIM5AmI7-U9LADIfE/s1600-h/statelessservlet_14.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 318px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQCrHyW7G1ItJ8bsGiIM3GE7zmaNAwIsIPgSGG3AF4RiFg0p756cMNCQNLZIFz4ixrSAmVBVxfO6y7rMrc85Foexolbpf4QIow06kJYbVBrkeqIoGwdnp9IOuimYzuIM5AmI7-U9LADIfE/s400/statelessservlet_14.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5418076824281489314" /></a><br />작성된 코드에서 return null; 부분을 다음과 같이 바꿉니다.<br />==========================================================<br /><blockquote>return "Hello, " + name + "!\n";</blockquote><br />==========================================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8d7g6aggxBdN4Ny0Ba0gXWdNsGe9A9sr58sT3Da8deLx1LcX8N0W95MmbcwWjO6VEH2GRKTwqoC2zdm7nL5hhle53eZ_PuZsv2PCgZo5INX9nju_FFkMpUofXvzGjJJFnoyUtHMQrXI6z/s1600-h/statelessservlet_15.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 292px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8d7g6aggxBdN4Ny0Ba0gXWdNsGe9A9sr58sT3Da8deLx1LcX8N0W95MmbcwWjO6VEH2GRKTwqoC2zdm7nL5hhle53eZ_PuZsv2PCgZo5INX9nju_FFkMpUofXvzGjJJFnoyUtHMQrXI6z/s400/statelessservlet_15.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5418076821866159202" /></a><br />이제 서블릿 소스로 다시 돌아와 좀전에 작성한 EJB 비즈니스를 호출하도록 하겠습니다.<br />서블릿 소스에서 소스 삽입(insert code:ALT+INSERT)를 선택하면 메뉴 중 call Enterprise Bean 메뉴가 있습니다. <br />클릭.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUqRsZda8pSn6AiW397eSjjUPkYtepJRcNS3ZF5SptLyAKNwqHEPdEhdeckTts-9JYDhJfmNrZichgQBt_oByFDRIEdYAC0fcNdqSHDYdq0nMIeKW51Es0wezkmlb4UgyVTEZjYhV0SWJg/s1600-h/statelessservlet_16.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 292px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUqRsZda8pSn6AiW397eSjjUPkYtepJRcNS3ZF5SptLyAKNwqHEPdEhdeckTts-9JYDhJfmNrZichgQBt_oByFDRIEdYAC0fcNdqSHDYdq0nMIeKW51Es0wezkmlb4UgyVTEZjYhV0SWJg/s400/statelessservlet_16.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5418078514380770994" /></a><br />팝업창에 EJB 빈이 나타나는데 확장해서 위에 작성한 NewSessionBean 을 선택합니다.<br />OK 클릭<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhV7KGD6mQRUwHJcyRLONRnal1IpjfD7lUC7Vg6f2AlhWcQ28eZGVQdrSJ7otQcMMoY93Y10ApV-xw3bjDKD0ZRH04NlR3AtBHEsvDlivKZRGDy59rbeLe6huQ9-RI_YdvRQahcQpp1kTOv/s1600-h/statelessservlet_17.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 319px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhV7KGD6mQRUwHJcyRLONRnal1IpjfD7lUC7Vg6f2AlhWcQ28eZGVQdrSJ7otQcMMoY93Y10ApV-xw3bjDKD0ZRH04NlR3AtBHEsvDlivKZRGDy59rbeLe6huQ9-RI_YdvRQahcQpp1kTOv/s400/statelessservlet_17.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5418078510098694994" /></a><br />그럼 다음 소스와 같이 작성됩니다.(확인)<br />--------------------------------------------------------------------------------<br /><blockquote>@EJB<br />private NewSessionBean newSessionBean;</blockquote>--------------------------------------------------------------------------------<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIQZkCqC-HWMRAm4NF0sZ_UGfhDi9x8Qx29YPtrtFPZFUnJKLUzi0JNwHF791yMqgBxJAAETq-mDtZU22MhEY40ZtheBCITMm7AeAg8WpV5sNovsyRXMqy5X5ol568Y-S_ze_8MfV6sWXO/s1600-h/statelessservlet_18.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 292px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIQZkCqC-HWMRAm4NF0sZ_UGfhDi9x8Qx29YPtrtFPZFUnJKLUzi0JNwHF791yMqgBxJAAETq-mDtZU22MhEY40ZtheBCITMm7AeAg8WpV5sNovsyRXMqy5X5ol568Y-S_ze_8MfV6sWXO/s400/statelessservlet_18.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5418078502080873650" /></a><br />이번에는 게시물의 try 안의 주석으로 되어 있는 부분 대신 다음 코드를 복사해서 붙여넣습니다. (직접 작성하셔도 됩니다. ^^)<br />================================================================================<br /><blockquote>out.println("<html>");<br /> out.println("<head>");<br /> out.println("<title>무상태 세션 빈 연동 서블릿 테스트</title>");<br /> out.println("</head>");<br /> out.println("<body>");<br /> out.println("<h1>이름을 넣어주십시오</h1>");<br /> out.println("<form method=\"POST\">");<br /> out.println("<TABLE>");<br /> out.println("<tr><td>Name: </td>");<br /> out.println("<td><input type=\"text\" name=\"name\"> </td>");<br /> out.println("</tr><tr><td></td>");<br /> out.println("<td><input type=\"submit\" name=\"sub\"> </td>");<br /> out.println("</tr>");<br /> out.println("</TABLE>");<br /> out.println("</form>");<br /> String val = request.getParameter("name");<br /> if ((val != null) && (val.trim().length() > 0)) {<br /> out.println("<FONT size=+1 color=red> Greeting from StatelessSessionBean: </FONT> "<br /> + newSessionBean.sayHello(val) + "<br>");<br /> }<br /> out.println("</body>");<br /> out.println("</html>");</blockquote><br />================================================================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2ChIO_6Px_ZVNBVL0y-FLmDLIsxBY28vXgEU791obMpnazwPCYvv-C5YZjY1we1jlNEo3JJX_QJv1vnbQrfOyaC_NKvSfKU1IMObgW7eNu4Ojp2xRLwPtrGbCsvMc_FwuE9MbLH1VFMHm/s1600-h/statelessservlet_19.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 292px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2ChIO_6Px_ZVNBVL0y-FLmDLIsxBY28vXgEU791obMpnazwPCYvv-C5YZjY1we1jlNEo3JJX_QJv1vnbQrfOyaC_NKvSfKU1IMObgW7eNu4Ojp2xRLwPtrGbCsvMc_FwuE9MbLH1VFMHm/s400/statelessservlet_19.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5418078501210808546" /></a><br />이제 이 서블릿을 실행해야 하는데 프로젝트에서 서블릿으로 바로 호출되도록 등록정보를 수정하겠습니다.<br />프로젝트에서 오른쪽 마우스 클릭 - 등록 정보(properties)<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHXzcMrtCUfX0TbP14sedvFB2xPQUefhaDg_kxt49OJuRDCNfM-0suTYqFeeIBocuQpNrksnbkRXAKleY9Is9Ir-3TZfz-vZyLVyGK8gd108KyqfvMPChvKcwXjUkutkU2RZRYiwusrpz0/s1600-h/statelessservlet_20.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 292px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHXzcMrtCUfX0TbP14sedvFB2xPQUefhaDg_kxt49OJuRDCNfM-0suTYqFeeIBocuQpNrksnbkRXAKleY9Is9Ir-3TZfz-vZyLVyGK8gd108KyqfvMPChvKcwXjUkutkU2RZRYiwusrpz0/s400/statelessservlet_20.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5418078494286853650" /></a><br />Run 부분에서 그림과 같이 relative URL 값에다 /NewServlet 를 적어줍니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggxtoQIlYCDPiwmtsOQ3rWgYFnzyfUpUYWMWqJ4B4fie1GdnOX2iM3SveFKQKwuwPDR41tGMXcpL4H0hSnJ1SI3aOivfxmYfhlC-LDl-qsMZAWEOBY8r-kTDM3lw1V9YSw4ZzzNIO5QuMU/s1600-h/statelessservlet_21.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 275px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggxtoQIlYCDPiwmtsOQ3rWgYFnzyfUpUYWMWqJ4B4fie1GdnOX2iM3SveFKQKwuwPDR41tGMXcpL4H0hSnJ1SI3aOivfxmYfhlC-LDl-qsMZAWEOBY8r-kTDM3lw1V9YSw4ZzzNIO5QuMU/s400/statelessservlet_21.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5418080458494769346" /></a><br />프로젝트 실행 (RUN)<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAqYo6n0iV-m9E-JuQbTDHDK0UB0RyHup6bGVqcd0iqF-JSC19yP9vq4FC7maAkcL9xkqanJLiU-JelOREmaUpwVSyh4Igs6MUAMxoG_h9moWrWSZo34m9vsuBBmGH4HtbEeYiZBQDRzDp/s1600-h/statelessservlet_22.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 292px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAqYo6n0iV-m9E-JuQbTDHDK0UB0RyHup6bGVqcd0iqF-JSC19yP9vq4FC7maAkcL9xkqanJLiU-JelOREmaUpwVSyh4Igs6MUAMxoG_h9moWrWSZo34m9vsuBBmGH4HtbEeYiZBQDRzDp/s400/statelessservlet_22.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5418080452502444418" /></a><br />그럼 브라우저에서 입력박스가 나타납니다.<br />적당히 abc 라고 줍니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhspACS848-ZkefKXJj7IoLns6upVo6GT4qB04NcNVuV_RP4dzS1xvwruRyER_w5TrfYMW9Mo8xPgfN70LbTyH_cGJV-NyAT-_Q0NNwvbzk_hmJG50VZ28rScqGMlUWbuHlkkSTy01VjmaT/s1600-h/statelessservlet_23.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 282px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhspACS848-ZkefKXJj7IoLns6upVo6GT4qB04NcNVuV_RP4dzS1xvwruRyER_w5TrfYMW9Mo8xPgfN70LbTyH_cGJV-NyAT-_Q0NNwvbzk_hmJG50VZ28rScqGMlUWbuHlkkSTy01VjmaT/s400/statelessservlet_23.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5418080449432859730" /></a><br />해당 내용이 무상태 세션 빈을 통해 다시 서블릿으로 출력됩니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPIYt2NW5wiUOYsKO2Znv1KByiCR57-t8tYvMn6jVTRvktCAcpj0pJ3W1F1jTHhXY-a13gEyJxb8D25-h_c-m3UhTOH3xSpJArGQlm7ingzDCsh1JNVZP25pbFCy5GQgENIS1vR1aBgCsb/s1600-h/statelessservlet_24.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 282px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPIYt2NW5wiUOYsKO2Znv1KByiCR57-t8tYvMn6jVTRvktCAcpj0pJ3W1F1jTHhXY-a13gEyJxb8D25-h_c-m3UhTOH3xSpJArGQlm7ingzDCsh1JNVZP25pbFCy5GQgENIS1vR1aBgCsb/s400/statelessservlet_24.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5418080443311291490" /></a><br /><br />수고하셨습니다.<br /><br />자 그럼 퀴즈~~<br /><br />여기서 값을 "가나다"로 온전히 출력하려면 어떻게 하면 될까요? ㅎㅎ<br /><br />아시는 분은 답글을..강여사(J.Y.Kang)http://www.blogger.com/profile/17450510931308610527noreply@blogger.com0tag:blogger.com,1999:blog-6811062799606447528.post-42714423571243985182009-12-19T22:08:00.001-08:002010-07-01T04:08:40.438-07:00넷빈(Netbeans)6.8에서 JSF 2.0 사용하기-소개-03이제 JSF 템플릿을 사용해보도록 하겠습니다.<br />우선 템플릿이 될 파일을 만듭니다.<br />프로젝트에서 마우스 오른쪽 클릭 - new - other<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVCFYHerjOLkGSkSqEllhX_DWlWkZc2OntDGdYfJPeORyC_7pL-Lc-yL7pWAJXzPWXY86-aXG1tAk-oN8TLqFqd-QDt1YjLvHzd0QQdNSX-231YibS5N6knHvpToqXATPn-ySor9wK-A6K/s1600-h/jsf20_38.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 308px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5417196738547944306" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVCFYHerjOLkGSkSqEllhX_DWlWkZc2OntDGdYfJPeORyC_7pL-Lc-yL7pWAJXzPWXY86-aXG1tAk-oN8TLqFqd-QDt1YjLvHzd0QQdNSX-231YibS5N6knHvpToqXATPn-ySor9wK-A6K/s400/jsf20_38.jpg" /></a><br />JavaServer Faces 에서 Facelet Templates 을 선택합니다.<br />다음 클릭<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxAxaYLEWgkF0Z7xRsoM-cZM3D2XquIuaR2txmQxz4xK3Kd4O8Pzn3azYoJWJAnjiydc48kE1LY8x0XRYFhTRTBPZJ4FEqCQyF0FwrSKCbzmpFlg2l7-LaM5FvtDEvkVtRMjIRxC4h44GE/s1600-h/jsf20_39.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5417196629705969442" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxAxaYLEWgkF0Z7xRsoM-cZM3D2XquIuaR2txmQxz4xK3Kd4O8Pzn3azYoJWJAnjiydc48kE1LY8x0XRYFhTRTBPZJ4FEqCQyF0FwrSKCbzmpFlg2l7-LaM5FvtDEvkVtRMjIRxC4h44GE/s400/jsf20_39.jpg" /></a><br />템플릿 이름은 template 으로 주고<br />아래 css 레이아웃에 아래쪽 3번째를 선택했습니다.<br />마침 클릭<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghk7n9UMXtQdnmtmTBYnIfJvA-JWghG-IpnYYDXh2GPVQaBJq5j2JcjGBOsDPUH6RwTEOergNlcZGsjrie_utIQe2pr8TP17CRmGTnSyiXWhAb4-4f1hoWfCpVVBoC2BxyVStcOIiUQM6B/s1600-h/jsf20_40.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 311px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5417196624738401026" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghk7n9UMXtQdnmtmTBYnIfJvA-JWghG-IpnYYDXh2GPVQaBJq5j2JcjGBOsDPUH6RwTEOergNlcZGsjrie_utIQe2pr8TP17CRmGTnSyiXWhAb4-4f1hoWfCpVVBoC2BxyVStcOIiUQM6B/s400/jsf20_40.jpg" /></a><br />기본 작업되어 있는 내용이 제시됩니다.<br />이번 예제에서는 계속 쓰던 css 를 이 템플릿을 이용하여 사용할 것이기 때문에 만들어진 내용을 다 지우고<br />아래 소스로 바꿔넣습니다.<br />=========================================================================<br /><?xml version='1.0' encoding='UTF-8' ?><br /><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><br /><html xmlns="http://www.w3.org/1999/xhtml"<br />xmlns:ui="http://java.sun.com/jsf/facelets"<br />xmlns:h="http://java.sun.com/jsf/html"><br /><br /><h:head><br /><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><br /><link href="css/stylesheet.css" rel="stylesheet" type="text/css" /><br /><title><ui:insert name="title">Facelets Template</ui:insert></title><br /></h:head><br /><h:body><br /><div id="mainContainer"><br /><div id="left" class="subContainer greyBox"><br /><ui:insert name="box">Box Content Here</ui:insert><br /></div><br /><div id="right" class="subContainer"><br /><img src="duke.png" alt="Duke waving" /><br /></div><br /></div><br /></h:body><br /></html><br />=========================================================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9KLo5CfTCsPrNzLBc6v7c4bMvGAxCikzMmNNkdilhJch1SdB5i1QHj5_sIuITAEX2yabSI001D02cU_R1LI5t4VEUcNewdA9JoLVbmJrU69zn6QxCGZpZxJRywqnBqLiHeUFdFEW237Cb/s1600-h/jsf20_41.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 308px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5417196620637917698" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9KLo5CfTCsPrNzLBc6v7c4bMvGAxCikzMmNNkdilhJch1SdB5i1QHj5_sIuITAEX2yabSI001D02cU_R1LI5t4VEUcNewdA9JoLVbmJrU69zn6QxCGZpZxJRywqnBqLiHeUFdFEW237Cb/s400/jsf20_41.jpg" /></a><br />그리고 이 파일을 실행해보면 (프로젝트를 다시 실행하고 주소 표시줄에 해당 파일 이름을 입력하면 됩니다)<br />다음 그림과 같이 css 가 잘 작업되어 나옵니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-ciPPx5DZNV4jHt4fxt4yjmaSRR6xh-9H-x1IcNtiTb4yTGiUBmV1lOCdm7dD0_v_XLFxl4cF20MAJnn9K0p0j8ZKxdUn3UquEcR7nB4GY3uVKT90PMQXh7yAnf_eMbO4gINBXCnHa7oF/s1600-h/jsf20_43.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 296px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5417196606720650674" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-ciPPx5DZNV4jHt4fxt4yjmaSRR6xh-9H-x1IcNtiTb4yTGiUBmV1lOCdm7dD0_v_XLFxl4cF20MAJnn9K0p0j8ZKxdUn3UquEcR7nB4GY3uVKT90PMQXh7yAnf_eMbO4gINBXCnHa7oF/s400/jsf20_43.jpg" /></a><br />이제 템플릿의 클라이언트 파일을 만들도록 하겠습니다.<br />프로젝트에서 마우스 오른쪽 클릭 - new - other<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJBal5POK8z5fzSNguKTBIErUX-WqOffK-jaQmazi76Z42qRqQfrLgpEbvhDcFpTwDo_vo0uMozAh_4MOQavn1ign6yzJFExF0oVQ1QfuG8mncy-xTHIRG5ORcSy5AWi_-Df4QhgyZUkGx/s1600-h/jsf20_44.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 308px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5417198236651670098" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJBal5POK8z5fzSNguKTBIErUX-WqOffK-jaQmazi76Z42qRqQfrLgpEbvhDcFpTwDo_vo0uMozAh_4MOQavn1ign6yzJFExF0oVQ1QfuG8mncy-xTHIRG5ORcSy5AWi_-Df4QhgyZUkGx/s400/jsf20_44.jpg" /></a><br />JavaServer Faces 에서 Facelets Template Client 를 선택<br />다음 클릭<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgD5qUEv-OemsoWbp43IWSCJtlUlCwdG1LgTkk3j-Kfr7uXEBWcaWXEB-Mn5dkKk7otJ9NYTzJIWNevrCfooMNz1VMVrQtmHkYN3Cg13PMmuFFI6SNIO69sUq9yijco6GG_IhfGHniTEJa6/s1600-h/jsf20_45.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5417198233875794834" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgD5qUEv-OemsoWbp43IWSCJtlUlCwdG1LgTkk3j-Kfr7uXEBWcaWXEB-Mn5dkKk7otJ9NYTzJIWNevrCfooMNz1VMVrQtmHkYN3Cg13PMmuFFI6SNIO69sUq9yijco6GG_IhfGHniTEJa6/s400/jsf20_45.jpg" /></a><br />파일 이름은 greeting 이라고 주고<br />아래쪽의 template 파일에서 browse... 버튼을 눌러 좀전에 작성한 template.xhtml 파일을 선택합니다(select file) 클릭.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRFBwyTVQUsoIkRKRJjQf-dabp4gNskRMAx_dTzevqrJ27KwJPYi1a_JS-gcOQ3zZ8nyRLyc9mOdNdAsZ6iKNy_BSbXkM0AWWOLYhINk30-lx9Jf-tGWyzoZcNAyXCyhh9tQpXeeU6UX_V/s1600-h/jsf20_46.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 308px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5417198227269714018" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRFBwyTVQUsoIkRKRJjQf-dabp4gNskRMAx_dTzevqrJ27KwJPYi1a_JS-gcOQ3zZ8nyRLyc9mOdNdAsZ6iKNy_BSbXkM0AWWOLYhINk30-lx9Jf-tGWyzoZcNAyXCyhh9tQpXeeU6UX_V/s400/jsf20_46.jpg" /></a><br />그런 다음 만들어진 greeting.xhtml 에서 <ui:define> 안의 내용을 title -> Greeting 으로 바꿉니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiaNUdm2GX-7-LjkyLORUOld4HkL4xDJ62odGNijJpjDdozKB3EQijIoHbvfiwYabVaLAGuP-nFGb1FXx6433mLaIo_8oLNF9o4Tnnfqkt5KLYk68R1FifgUOlwUYaBVeVzHtMi1pCiPDZ/s1600-h/jsf20_47.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 308px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5417198223505792962" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiaNUdm2GX-7-LjkyLORUOld4HkL4xDJ62odGNijJpjDdozKB3EQijIoHbvfiwYabVaLAGuP-nFGb1FXx6433mLaIo_8oLNF9o4Tnnfqkt5KLYk68R1FifgUOlwUYaBVeVzHtMi1pCiPDZ/s400/jsf20_47.jpg" /></a><br />그리고 body 부분에다가 다음 소스로 바꿔 넣습니다.<br />============================================================================<br /><ui:composition template="./template.xhtml"><br /><ui:define name="title"><br />Greeting<br /></ui:define><br /><ui:define name="box"><br /><h4>Hi, my name is Duke!</h4><br /><h5>I'm thinking of a number<br /><br/><br />between<br /><span class="highlight">0</span> and<br /><span class="highlight">10</span>.</h5><br /><h5>Can you guess it?</h5><br /><h:form><br /><h:inputText size="2" maxlength="2" value="#{UserNumberBean.userNumber}" /><br /><h:commandButton id="submit" value="submit" action="response" /><br /></h:form><br /></ui:define><br /></ui:composition><br />============================================================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-4h6HQb-KTwtAIoqF2ALotE5nJe0Bx1Ta4jawxe0k6qznzRC20XM_qQ-aKg6jbbVJMC63lQQ2kioDsJKIHOppmlcBTCooxU-Lpfkz3NDfM2nTdgI1ucsaXMo1SjP9PXrxc6nd8OzT5v8v/s1600-h/jsf20_48.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 308px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5417198216884469698" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-4h6HQb-KTwtAIoqF2ALotE5nJe0Bx1Ta4jawxe0k6qznzRC20XM_qQ-aKg6jbbVJMC63lQQ2kioDsJKIHOppmlcBTCooxU-Lpfkz3NDfM2nTdgI1ucsaXMo1SjP9PXrxc6nd8OzT5v8v/s400/jsf20_48.jpg" /></a><br />이제 response.xhtml 에서도 템플릿을 적용하도록 하겠습니다.<br />다음 내용으로 바디 부분을 변경합니다.<br />-----------------------------------------------------------------------------<br /><ui:composition template="./template.xhtml"><br /><ui:define name="title"><br />Response<br /></ui:define><br /><ui:define name="box"><br /><h4><h:outputText escape="false" value="#{UserNumberBean.response}"/></h4><br /><h:form prependId="false"><br /><h:commandButton id="backButton" value="Back" action="greeting" /><br /></h:form><br /></ui:define><br /></ui:composition><br />-----------------------------------------------------------------------------<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiM5O09Ec_qJNjuhGzvpjqOq4oDm7PtFhOPqT3TS02RL9vd3NUCRa_3Cac0QS_8k4MAtpgU8q6NivFPiyi6fPbwSkKqNoGuVSs_fcolC9v0NxvhsY3LfL7MHf2F9ev9PI0Zp3U81E01Lz56/s1600-h/jsf20_49.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 308px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5417199642188918418" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiM5O09Ec_qJNjuhGzvpjqOq4oDm7PtFhOPqT3TS02RL9vd3NUCRa_3Cac0QS_8k4MAtpgU8q6NivFPiyi6fPbwSkKqNoGuVSs_fcolC9v0NxvhsY3LfL7MHf2F9ev9PI0Zp3U81E01Lz56/s400/jsf20_49.jpg" /></a><br />이제 첫 화면을 greeting이 뜨도록 하기 위해 web.xml 에서 다음과 같이 수정합니다.<br />web.xml 을 열어 Pages 탭을 누르면 welcome files 이 index.xhtml 로 되어 있습니다. 이를 greeting.xhtml 으로 바꿉니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihbKYQe3fKScQXm25mUBFPr_3dfzX1zHxxQcYaK-YS_H8hcZIFMd-490v3mqL4CmsGyzuPLBucvl0oOkIRsr5UYIweL6QIWcko-tEHNyIsm6i_FfoYwgEkhiYkIFwpPZwmHZPfN8o50hTy/s1600-h/jsf20_50.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 300px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5417199636204784194" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihbKYQe3fKScQXm25mUBFPr_3dfzX1zHxxQcYaK-YS_H8hcZIFMd-490v3mqL4CmsGyzuPLBucvl0oOkIRsr5UYIweL6QIWcko-tEHNyIsm6i_FfoYwgEkhiYkIFwpPZwmHZPfN8o50hTy/s400/jsf20_50.jpg" /></a><br />그런 다음 프로젝트를 실행 (run) 합니다.(css 까지 잘 적용된 그림)<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhd5a8f35ajbWWqYRRSzdx1m01xkByPzQbE7EijMQCcbMtclDO5iGBePGdmNK1GvU2w24qa_uNdKdbGGyD_WQKvE2pWp-wfIsUSUbR-M9fnq5pldbpw4YWoCjsvyTBpPavMhcnDIh7a4KaX/s1600-h/jsf20_51.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 296px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5417199631787672242" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhd5a8f35ajbWWqYRRSzdx1m01xkByPzQbE7EijMQCcbMtclDO5iGBePGdmNK1GvU2w24qa_uNdKdbGGyD_WQKvE2pWp-wfIsUSUbR-M9fnq5pldbpw4YWoCjsvyTBpPavMhcnDIh7a4KaX/s400/jsf20_51.jpg" /></a><br />8을 주고 submit 버튼을 눌렀을 때 입니다. Yay~ 가 잘 나오는군요..<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2MsHNHPJnwJLMnPrtwAI1xjxH4Y5He8VwqS_PBJ-FTDm5SalR0Ccs60qNiIl6TV0JxRWwzp6pnZAoCFo5BHb6HdXh96o35aoU_IqZZP3t0zD4LalOFTyafPx0eqjOf_yqJ5IP23CGcZ5z/s1600-h/jsf20_52.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 296px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5417199626492588642" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2MsHNHPJnwJLMnPrtwAI1xjxH4Y5He8VwqS_PBJ-FTDm5SalR0Ccs60qNiIl6TV0JxRWwzp6pnZAoCFo5BHb6HdXh96o35aoU_IqZZP3t0zD4LalOFTyafPx0eqjOf_yqJ5IP23CGcZ5z/s400/jsf20_52.jpg" /></a><br />back 버튼도 잘 작동하는 지 확인해봅시다~<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0pgNMsQfXNs9svFEJUkwMNF8dUU-8l_18B43SQvVzXyMtaIZKBX2RMC5Rnq0rKHU7ve5FoKl0Nvl3MvsL63mwZEwcYHVLz_4q1CJ2v7zDWDmwfG1fTz6vjNU5dzgEt-l41uL0zABRlESW/s1600-h/jsf20_53.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 296px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5417199621647888450" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0pgNMsQfXNs9svFEJUkwMNF8dUU-8l_18B43SQvVzXyMtaIZKBX2RMC5Rnq0rKHU7ve5FoKl0Nvl3MvsL63mwZEwcYHVLz_4q1CJ2v7zDWDmwfG1fTz6vjNU5dzgEt-l41uL0zABRlESW/s400/jsf20_53.jpg" /></a><br /><br />수고하셨습니다. *^^*강여사(J.Y.Kang)http://www.blogger.com/profile/17450510931308610527noreply@blogger.com0tag:blogger.com,1999:blog-6811062799606447528.post-16886994066909962722009-12-19T18:38:00.000-08:002010-07-01T04:07:15.778-07:00넷빈(Netbeans)6.8에서 JSF 2.0 사용하기-소개-02이제 페이지에 좀전에 작성한 빈을 연결하도록 하겠습니다.<br /><br />우선 기본으로 만들어진 index.xhtml 을 엽니다.<br />바디부분에 다음과 같은 내용을 작성해서 넣습니다.<br />------------------------------------------------------------------<br /><h:body><br /><h5>Can you Guess It?</h5><br /><h:form><br /><h:inputText size="2" maxlength="15" ><br /></h:inputText><br /><h:commandButton id="submit" value="submit" ><br /></h:commandButton><br /></h:form><br /><br />------------------------------------------------------------------<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnadwGl6Ryi58KzytRTyLjhroOjCjZSk1-VEaqmoikLaUHtR1cxPpDC2xSj6wW-ueHcn7iOq7xrb88w35w-O8_RinEEihnCKZ4zHGMVbL6b5LiVw4hr1njS4ND5KYrNS7OZ6sJPgx-V_Ve/s1600-h/jsf20_19.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 308px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5417182644026257938" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnadwGl6Ryi58KzytRTyLjhroOjCjZSk1-VEaqmoikLaUHtR1cxPpDC2xSj6wW-ueHcn7iOq7xrb88w35w-O8_RinEEihnCKZ4zHGMVbL6b5LiVw4hr1njS4ND5KYrNS7OZ6sJPgx-V_Ve/s400/jsf20_19.jpg" /></a> 태그를 동적으로 만들어 놓고 빈과의 연결을 시도합니다.<br />-------------------------------------------------------------------<br /><h:body><br /><h5>Can you Guess It?</h5><br /><h:form><br /><h:inputText size="2" maxlength="15" <strong>value="#{UserNumberBean.userNumber}"</strong>><br /></h:inputText><br /><h:commandButton id="submit" value="submit" ><br /></h:commandButton><br /></h:form><br />-------------------------------------------------------------------<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZ90IkZVFsedlo9Idfprvngbq78dOsAuGsbpFIpwQEPioSgvithaOYoaCGG-GR_sgdnlDRJbzTjrfLa9lAU8hyRXqfHTkE1CcMsnb7R2SfltviMFe0sg1lbYqNbwHTLqmhyKTppdAp05CG/s1600-h/jsf20_20.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 308px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5417182636316402658" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZ90IkZVFsedlo9Idfprvngbq78dOsAuGsbpFIpwQEPioSgvithaOYoaCGG-GR_sgdnlDRJbzTjrfLa9lAU8hyRXqfHTkE1CcMsnb7R2SfltviMFe0sg1lbYqNbwHTLqmhyKTppdAp05CG/s400/jsf20_20.jpg" /></a><br />-------------------------------------------------------------------<br /><h:body><br /><h5>Can you Guess It?</h5><br /><h:form><br /><h:inputText size="2" maxlength="15" value="#{UserNumberBean.userNumber}"><br /></h:inputText><br /><h:commandButton id="submit" value="submit" <strong>action="response" </strong>><br /></h:commandButton><br /></h:form><br />-------------------------------------------------------------------<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCrN6E0kdYxAa1cJU8c_hw664UAyNJLwafB1iC6vzU2iAVBynaj_JGBPZbHkXPJvxhPhN0wNlkz7d5GNN9dORNftPRQ2K7KpOYHoW4j6sgx1BN3jjhZRtXLcEhOm8ugf1N3YItP37zGErN/s1600-h/jsf20_21.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 308px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5417182631241638498" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCrN6E0kdYxAa1cJU8c_hw664UAyNJLwafB1iC6vzU2iAVBynaj_JGBPZbHkXPJvxhPhN0wNlkz7d5GNN9dORNftPRQ2K7KpOYHoW4j6sgx1BN3jjhZRtXLcEhOm8ugf1N3YItP37zGErN/s400/jsf20_21.jpg" /></a><br />이제 페이지 네비게이션을 위한 구성파일을 만들도록 하겠습니다.<br /><br />이전과는 달리 JSF 프레임워크를 선택하였더라도 facelets를 선택했다면 face-config.xml 은 기본 작업되지 않습니다. 따라서 이 파일을 만들어야 합니다.<br /><br />프로젝트에서 마우스 오른쪽 클릭 - new - other<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgm4MgWSoATnAa_zZgOX899rDiIRxOYFTqI_xBuzeJofPVlyJRXKDF2mXcH6cYhM_HuCP4r0JIpuxRQAiPuz17CYayQYGV0gL1OYKst-5VPwrA-CMiM3B3PlRu5dJz_8NabvVZv9mWKntXs/s1600-h/jsf20_22.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 308px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5417182623905050418" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgm4MgWSoATnAa_zZgOX899rDiIRxOYFTqI_xBuzeJofPVlyJRXKDF2mXcH6cYhM_HuCP4r0JIpuxRQAiPuz17CYayQYGV0gL1OYKst-5VPwrA-CMiM3B3PlRu5dJz_8NabvVZv9mWKntXs/s400/jsf20_22.jpg" /></a><br />JavaServer Faces 를 선택하고 JSF Configuration File 을 선택합니다.<br />다음 클릭<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAJ9lQCphugFA3-9SYw8nEvu2uE0Hj6OkFuNySW_aAMpeChxkFVu6hSZUhnmgkcq9Pb36o7-0Y6g_PwsHvU2tas8JibMvqzbkBJwUmuDhip5Swg9ZtCClwx7lRZFz-3LAJWpDrmWdwzHzh/s1600-h/jsf20_23.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5417182620435334002" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAJ9lQCphugFA3-9SYw8nEvu2uE0Hj6OkFuNySW_aAMpeChxkFVu6hSZUhnmgkcq9Pb36o7-0Y6g_PwsHvU2tas8JibMvqzbkBJwUmuDhip5Swg9ZtCClwx7lRZFz-3LAJWpDrmWdwzHzh/s400/jsf20_23.jpg" /></a><br />파일 이름으로 faces-config 를 줍니다<br />마침 클릭<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdh35mqxwZVwgHUhkoxGpLyh8xTqwjU0lcBWPVJWBnRUkkBMJMCSXJhs60qAqKGx-iPJ10RKvYNl_PX-ihP-CUaC41cVW528GSQJcBW9IJDUA9ofXTEVWXEo6_qBBbDJYSHgyD75qt6ao9/s1600-h/jsf20_24.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5417184431862770146" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdh35mqxwZVwgHUhkoxGpLyh8xTqwjU0lcBWPVJWBnRUkkBMJMCSXJhs60qAqKGx-iPJ10RKvYNl_PX-ihP-CUaC41cVW528GSQJcBW9IJDUA9ofXTEVWXEo6_qBBbDJYSHgyD75qt6ao9/s400/jsf20_24.jpg" /></a><br />만들어진 구성파일에 네비게이션 룰을 다음과 같이 작성하여 넣습니다.<br />--------------------------------------------------------------------<br /><navigation-rule><br /><from-view-id>/index.xhtml</from-view-id><br /><br /><navigation-case><br /><from-outcome>response</from-outcome><br /><to-view-id>/response.xhtml</to-view-id><br /></navigation-case><br /></navigation-rule><br />--------------------------------------------------------------------<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbrdkWxlCSVv_SzbYA1JIn8HlN441zgOEjDQfkhlxaxhuwKb3CuaSjRBuF9Y19gqsy9Htytu98pAqpmfL6d4d_L4ZLlYEYibwinpI0y67gPWTeUW32Tu1-DFn6K-zqxC0oC3l0xeTn20v-/s1600-h/jsf20_25.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 308px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5417184441810691522" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbrdkWxlCSVv_SzbYA1JIn8HlN441zgOEjDQfkhlxaxhuwKb3CuaSjRBuF9Y19gqsy9Htytu98pAqpmfL6d4d_L4ZLlYEYibwinpI0y67gPWTeUW32Tu1-DFn6K-zqxC0oC3l0xeTn20v-/s400/jsf20_25.jpg" /></a><br />이제 response.xhtml 파일을 만들도록 하겠습니다.<br />프로젝트에서 오른쪽 마우스 클릭 - new - other<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoQPQdkAFx4n__xsA26uGnb6Q62UQ1fHr1ZYXbfrCJyw_6cW9K49UVK8lVQVRriouFjHxAiMWhyphenhyphenIPiMk7KMyHBEEh7mNNI_5CYPCvwNTTLED9vIfjHbBHN4_X87DPBAYz62cpTDb8MFBYN/s1600-h/jsf20_26.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 308px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5417185187634542210" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoQPQdkAFx4n__xsA26uGnb6Q62UQ1fHr1ZYXbfrCJyw_6cW9K49UVK8lVQVRriouFjHxAiMWhyphenhyphenIPiMk7KMyHBEEh7mNNI_5CYPCvwNTTLED9vIfjHbBHN4_X87DPBAYz62cpTDb8MFBYN/s400/jsf20_26.jpg" /></a><br />JavaServer Faces 에서 JSF Page 선택<br />다음 클릭<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-F1DNuK5HJ__mwXQc92QAn8hnaTcEeTGdD4zZTKj56yT7llXQzFZFhur4OqIVUhYeUgHQmdwiyKUeV5q0W0l3AYK4x8Dj7H4jzkTbPMG8iXBTAwpuyVG2yOzXE2f6x6znaJeltHLiWb0r/s1600-h/jsf20_27.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5417185181840409554" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-F1DNuK5HJ__mwXQc92QAn8hnaTcEeTGdD4zZTKj56yT7llXQzFZFhur4OqIVUhYeUgHQmdwiyKUeV5q0W0l3AYK4x8Dj7H4jzkTbPMG8iXBTAwpuyVG2yOzXE2f6x6znaJeltHLiWb0r/s400/jsf20_27.jpg" /></a><br />이름은 response 라고 줍니다.<br />마침 클릭<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9zybJGvJHJhEXFEiEy9Hg3JqGuug1XGfqQCY5Ktmw-sXUm3OqpVp_9Y2-LvnFJnfaR7ibDiymovGSH3DuAsMUpqjW7ULcunhnzHAlcf5NsBVCba66w83XDhr0ALmd_CwXjqnnSksM4Gal/s1600-h/jsf20_28.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5417185178534874306" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9zybJGvJHJhEXFEiEy9Hg3JqGuug1XGfqQCY5Ktmw-sXUm3OqpVp_9Y2-LvnFJnfaR7ibDiymovGSH3DuAsMUpqjW7ULcunhnzHAlcf5NsBVCba66w83XDhr0ALmd_CwXjqnnSksM4Gal/s400/jsf20_28.jpg" /></a><br />그리고 body 부분에 다음과 같이 작성해 넣습니다.<br />==================================================================<br /><body><br /><div id="mainContainer"><br /><div id="left" class="subContainer greyBox"><br /><h4><h:outputText value="#{UserNumberBean.response}"/></h4><br /><!--<form action="index.xhtml"><br /><input type="submit" id="backButton" value="Back" /><br /></form>--><br /><h:form><br /><h:commandButton id="backButton" value="Back" action="index" /><br /></h:form><br /></div><br /><div id="right" class="subContainer"><br /><img src="duke.png" alt="Duke waving" /><br /><!--<h:graphicImage url="/duke.png" alt="Duke waving" />--><br /></div><br /></div><br /></body><br />===================================================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9OLZblcm1CzKgmGvzJ9ju5onK4MZR7zsbJZDNlR_y9Jhjc5rVZfaRLWbotdQiM_F2t6viLs5L8AerMKOCOcDCtr_Wcm4yQqyiTqa98byJ8XazMQSi4uAuOUOXzstT9k17jZDYItih8qm-/s1600-h/jsf20_42.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 308px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5417192864570028658" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9OLZblcm1CzKgmGvzJ9ju5onK4MZR7zsbJZDNlR_y9Jhjc5rVZfaRLWbotdQiM_F2t6viLs5L8AerMKOCOcDCtr_Wcm4yQqyiTqa98byJ8XazMQSi4uAuOUOXzstT9k17jZDYItih8qm-/s400/jsf20_42.jpg" /></a><br />이번 예제에서 사용할 stylesheet.css 를 해당 폴더(css)에 넣습니다. - 첨부파일 참조<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3gN8mGf08asurY_DqLqA-Q1jl2Y0uCAxphW0ZsVibwpSr1T1OkNX_w6EQD2Jh4uF-vA9QM01xEHjBRLPO75UJdfsGrX5uwhDGckh9dlBtMtHOM4i-PQ75J3fL5OP8Rz8BtWhghDeq9Qhu/s1600-h/jsf20_31.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 308px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5417192859946747986" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3gN8mGf08asurY_DqLqA-Q1jl2Y0uCAxphW0ZsVibwpSr1T1OkNX_w6EQD2Jh4uF-vA9QM01xEHjBRLPO75UJdfsGrX5uwhDGckh9dlBtMtHOM4i-PQ75J3fL5OP8Rz8BtWhghDeq9Qhu/s400/jsf20_31.jpg" /></a><br />프로젝트를 실행합니다.<br />숫자를 입력할 수 있는 칸이 뜹니다.<br />3으로 입력하고 submit 버튼을 누릅니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEyVCzpvFJarhrUS195hFWrqRvHtr_81raqtmHRRUkC6ssynqfTwVh4h2Xgd2CHQihbhrv4EASh0Nlju1U64XX5mvTcOoizEMV9i7iYviwi9D6ieYEeQzNgSB11I_L0hVfHDTWByO80WUA/s1600-h/jsf20_32.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 297px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5417193451444750978" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEyVCzpvFJarhrUS195hFWrqRvHtr_81raqtmHRRUkC6ssynqfTwVh4h2Xgd2CHQihbhrv4EASh0Nlju1U64XX5mvTcOoizEMV9i7iYviwi9D6ieYEeQzNgSB11I_L0hVfHDTWByO80WUA/s400/jsf20_32.jpg" /></a><br />잘못된 추측이라고 나옵니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8VQhlgVctPbsBCJVW3JZOjEdYDtoAVRwkGqqiRq2Tj3XhUEC54h-3RDGEM07GeVv9-iJgXpFN6rOo3CRfNUeKMesKeM_J97vnEFCltOZBP9EtJUO_iPEs6rkgWB5QoyTd7SSGuVadmloS/s1600-h/untitled.bmp"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 332px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5417193704005830466" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8VQhlgVctPbsBCJVW3JZOjEdYDtoAVRwkGqqiRq2Tj3XhUEC54h-3RDGEM07GeVv9-iJgXpFN6rOo3CRfNUeKMesKeM_J97vnEFCltOZBP9EtJUO_iPEs6rkgWB5QoyTd7SSGuVadmloS/s400/untitled.bmp" /></a><br />현재 이 상태에는 약간의 오류가 있는데 첫번째는 <p> 태그가 그냥 나온다는 점이고, 두번째는 back 버튼이 정상 동작하지 않습니다.<br />따라서 아까의 부분에 다음의 내용을 추가합니다.<br />-----------------------------------------------------------------------------<br /><h4><h:outputText escape="false" value="#{UserNumberBean.response}"/></h4><br />-----------------------------------------------------------------------------<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilSDL2wlA7VhuYzVVL3eOcP6cxWrpluB9v111X2_F7l9IBeklA4xzg9e9DdKRL_sd1GvlDrRL8HxofAAac4mFQcf1KPmj1xF50n7u3nxPG3u2DMWYZoD_uqYxCoUpwpjvanJGnPyTEh8R_/s1600-h/jsf20_34.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 308px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5417194398092250338" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilSDL2wlA7VhuYzVVL3eOcP6cxWrpluB9v111X2_F7l9IBeklA4xzg9e9DdKRL_sd1GvlDrRL8HxofAAac4mFQcf1KPmj1xF50n7u3nxPG3u2DMWYZoD_uqYxCoUpwpjvanJGnPyTEh8R_/s400/jsf20_34.jpg" /></a><br />-----------------------------------------------------------------------------<br /><h:form prependId="false"><br />-----------------------------------------------------------------------------<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqXoK82Ahe89e5wrz_MIm-tV8ZMypUdAZlCL6NutZnBK-5ubXXTch8ate7mzSO5YHqTKEtptBo-4i17uX2tZaDyAPMl-rqy0wxdY64p6HR8uTLsmzytll6eZ70I_UbjUBCVFvozR7e_4NO/s1600-h/jsf20_36.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 308px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5417194507750313826" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqXoK82Ahe89e5wrz_MIm-tV8ZMypUdAZlCL6NutZnBK-5ubXXTch8ate7mzSO5YHqTKEtptBo-4i17uX2tZaDyAPMl-rqy0wxdY64p6HR8uTLsmzytll6eZ70I_UbjUBCVFvozR7e_4NO/s400/jsf20_36.jpg" /></a><br />이제 다시 프로젝트를 실행(run)한 후 서버(server.log)창에서 적혀있는 값을 확인하여 그 값을 넣어줍니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqem9PEW6ph6avixvAdSMF6TNHPqhVmmaZS2rYAIRFV3FBIKY5JhnU6CJcRbhSCsV9f2OpH4ogVT_aMXqf0boQ7kBqOjsXAzMp7L5Ftx43JP88KVR9xsY4obIYdGWYggyJswxrjnj1zuaM/s1600-h/jsf20_36.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 308px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5417195798698967586" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqem9PEW6ph6avixvAdSMF6TNHPqhVmmaZS2rYAIRFV3FBIKY5JhnU6CJcRbhSCsV9f2OpH4ogVT_aMXqf0boQ7kBqOjsXAzMp7L5Ftx43JP88KVR9xsY4obIYdGWYggyJswxrjnj1zuaM/s400/jsf20_36.jpg" /></a><br />그럼 다음 그림과 같이 맞다고 나옵니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBvWMJh_1ft1LlvOZ_TEjWSBTSY38VLpVhrbsRdawiwdsXMD5s2nOF_DhVR1QFTnm-vpTmgleqMmMiGXt5IwR5vsI5m4uZPFReE8UKlUEayYNpHs0uLN25QnsQwbSapoaDe2lFoOrf2oId/s1600-h/untitled3.bmp"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 332px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5417196214965117890" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBvWMJh_1ft1LlvOZ_TEjWSBTSY38VLpVhrbsRdawiwdsXMD5s2nOF_DhVR1QFTnm-vpTmgleqMmMiGXt5IwR5vsI5m4uZPFReE8UKlUEayYNpHs0uLN25QnsQwbSapoaDe2lFoOrf2oId/s400/untitled3.bmp" /></a><br />이제 다음에는 여기에 템플릿을 사용해보도록 하겠습니다. 계속...강여사(J.Y.Kang)http://www.blogger.com/profile/17450510931308610527noreply@blogger.com0tag:blogger.com,1999:blog-6811062799606447528.post-5880553329607896762009-12-19T16:56:00.000-08:002010-07-01T04:05:51.636-07:00넷빈(Netbeans)6.8에서 JSF 2.0 사용하기-소개-01<blockquote></blockquote>JavaServer Faces 2.0 소개<br /><br />JSF는 자바 웹 어플리케이션의 사용자 인터페이스(User Interface:UI) 프레임워크 입니다.<br /><br />서버사이드에서 대상 클라이언트에게 UI를 렌더해주는데 손쉬운 작성과 유지가 가능케하는데 디자인에 촛점을 두고 있습니다.<br /><br />* 재사용가능한 UI 컴포넌트로부터 UI를 구축하는데 쉽고<br />* UI에서 응용프로그램 데이터 이관(migration)이 심플화되며<br />* 서버 요청에 걸쳐 UI 상태를 관리를 지원하고,<br />* 서버사이트 어플리케이션 코드에 클라이언트-생성 이벤트를 연결하는데 심플 모델을 제공<br />* 커스텀 UI 컴포넌트 허용<br /><br />더 자세히는 튜토리얼 참조. <a href="http://java.sun.com/javaee/6/docs/tutorial/doc/bnaph.html">Java EE 6 Tutorial, Chapter 5: JavaServer Faces Technology.</a><br /><br />이번 게시물에서는 넷빈즈에서 JSF 2.0 지원에 대해 기본 웹 어플리케이션 작성을 통해 다음과 같은 내용들을 살펴보고자 합니다<br /><br />* 요청 데이터를 핸들링하기 위해 JSF 매니지드 빈 만들기<br />* 웹 페이지에 매니지드 빈 연결하기<br />* Facelet template file 에 웹 페이지 컨버팅하기<br /><br />이 작업을 위한 환경은<br /><br />넷빈 6.8<br />서버 글래스피시 v3 도메인<br />EE 6 버전입니다.<br /><br />우선 새 프로젝트를 만듭니다.<br />파일 - 새 프로젝트(new project)<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgY4kJj3G-7A1q32kUrXE1YOJpAPONt6UJ47ilunA0qYsjhIAwQsf_Js6z9TnKQqHDiTeFeGa73B0S8UzUEXNBCZxy69p-EqUfhs0wH23LIXEAxW6MwvG49Icd8XZbXSuIRKX9-MJq_al4S/s1600-h/jsf20_01.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 307px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5417125588422128354" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgY4kJj3G-7A1q32kUrXE1YOJpAPONt6UJ47ilunA0qYsjhIAwQsf_Js6z9TnKQqHDiTeFeGa73B0S8UzUEXNBCZxy69p-EqUfhs0wH23LIXEAxW6MwvG49Icd8XZbXSuIRKX9-MJq_al4S/s400/jsf20_01.jpg" /></a>Java Web - Web application<br /><br />다음 클릭<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIIZZRIviw1rOq_Wl2xWlvHu4cpSUwqNJMrcfc2ZOuusrGLBxTM5OvFswMSLfzw6BWG2SsIhyBs897xiLUOkZoH3p-jEwXAsCtuAXzGoWDlsaBFUpqIWRbdAoe_ZsAQwENvlSchh50-HlQ/s1600-h/jsf20_02.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5417125583959821538" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIIZZRIviw1rOq_Wl2xWlvHu4cpSUwqNJMrcfc2ZOuusrGLBxTM5OvFswMSLfzw6BWG2SsIhyBs897xiLUOkZoH3p-jEwXAsCtuAXzGoWDlsaBFUpqIWRbdAoe_ZsAQwENvlSchh50-HlQ/s400/jsf20_02.jpg" /></a> 프로젝트 명에 JSF20 이라고 줬습니다. <br />경로는 적당히<br />다음 클릭<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxOfoA_ANCU1dNVxlRGGalgF62Z9UDCv5Mal2mEjhjMbBV2YVfNuN69LjqTewvlXm7n0XCJ7u48vAzjVp-U-vY52CplG57wWpni2P1IUY7G1NyFxskEPR2z4PFU9FpKbMHTOdS9jiOC-E-/s1600-h/jsf20_03.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5417125575884639698" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxOfoA_ANCU1dNVxlRGGalgF62Z9UDCv5Mal2mEjhjMbBV2YVfNuN69LjqTewvlXm7n0XCJ7u48vAzjVp-U-vY52CplG57wWpni2P1IUY7G1NyFxskEPR2z4PFU9FpKbMHTOdS9jiOC-E-/s400/jsf20_03.jpg" /></a> 서버를 글래스피시 v3 도메인<br />EE 버전은: Java EE 6 Web <br />다음 클릭<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKfrOywCD1Tc16Y2r0YrrdQ6aXweoS78JX3J-oBXG7qlU5f2HngiwRDjMscG3P6zHfKkyl3xwqGb8agWpzwGxW_JBhqdGL147B5JRWLrSmAeeM-3oOnVmRgO4qK-qcvX_FSkrOSzhoJgGr/s1600-h/jsf20_04.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 266px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5417125569465210274" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKfrOywCD1Tc16Y2r0YrrdQ6aXweoS78JX3J-oBXG7qlU5f2HngiwRDjMscG3P6zHfKkyl3xwqGb8agWpzwGxW_JBhqdGL147B5JRWLrSmAeeM-3oOnVmRgO4qK-qcvX_FSkrOSzhoJgGr/s400/jsf20_04.jpg" /></a> 프레임워크에서 JavaServlet Faces 를 선택합니다.<br />라이브러리는 글래스피시 v3 도메인에 기본으로 사용<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJ1VRCfagHMEtSETCOH-2thYCeA5GMX1yxWnak0Rl5H_PI4_S8cryr8zdAEh3RtqsKnWP5OvofQr00UdbxusuHv9uiNNsjq21h38EXRJM2KfbQfDj0ecP-p1zhgy7qES7qdG4chjPxpHtE/s1600-h/jsf20_05.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 266px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5417125565978970066" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJ1VRCfagHMEtSETCOH-2thYCeA5GMX1yxWnak0Rl5H_PI4_S8cryr8zdAEh3RtqsKnWP5OvofQr00UdbxusuHv9uiNNsjq21h38EXRJM2KfbQfDj0ecP-p1zhgy7qES7qdG4chjPxpHtE/s400/jsf20_05.jpg" /></a> 오른쪽의 configuration 탭을 누르면 JSF 구성에 대해 나옵니다. <br />Preferred Pages에 Facelets 으로 할 건지, JSP로 할 건지 선택이 가능합니다. (기본은 Facelets으로 되어 있습니다)<br />마침 클릭<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxhZVwyXk2mf6Zfv0AQutaNd7KIMLt2b5W_g6zEfSTQ49QQYmMBEcp6f9r9NLmhyphenhyphen4pFEaB_blWYiQ1nXY4yc6m_m0pytQSKKfesTpdp3b8m47OGqCglyMyh61aFdhr6ganhnTY23UZ1V0N/s1600-h/jsf20_06.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 266px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5417126502623304930" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxhZVwyXk2mf6Zfv0AQutaNd7KIMLt2b5W_g6zEfSTQ49QQYmMBEcp6f9r9NLmhyphenhyphen4pFEaB_blWYiQ1nXY4yc6m_m0pytQSKKfesTpdp3b8m47OGqCglyMyh61aFdhr6ganhnTY23UZ1V0N/s400/jsf20_06.jpg" /></a> 이제 JSF Managed Bean 을 만들도록 하겠습니다.<br />작업을 위해 프로젝트 오른쪽에서 마우스 클릭 <br />new - other<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgopG0-Iion6s0JoKUPoGP4lIzNgYgNMsa6YSbeUJWNFw4N7M6N3DRACZfXQjkb3Vc6DNSH7zkioo_LYM-I98OSWkYoOXCshzYP26OJOQGbLShCM6C3yCqYOdc4UgfnqUalS1WaEffnd4BS/s1600-h/jsf20_07.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 307px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5417126496906538114" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgopG0-Iion6s0JoKUPoGP4lIzNgYgNMsa6YSbeUJWNFw4N7M6N3DRACZfXQjkb3Vc6DNSH7zkioo_LYM-I98OSWkYoOXCshzYP26OJOQGbLShCM6C3yCqYOdc4UgfnqUalS1WaEffnd4BS/s400/jsf20_07.jpg" /></a> JavaServer Faces 에서 JSF Managed Bean 을 선택합니다.<br />다음 클릭<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkO-x9mfiyVipHUwYGoHA8asjRAcEYhUAniOn_nFEd8Q9DQCRfIG1nx446Ptz-9BBkBRzGQMysuUWIZMOyCw40jydXJBONw0mbzWvoyqKQwyBSGWJBtD1GKGYVaMRLQqlrXOZKJiGvwNjy/s1600-h/jsf20_08.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5417126490272684402" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkO-x9mfiyVipHUwYGoHA8asjRAcEYhUAniOn_nFEd8Q9DQCRfIG1nx446Ptz-9BBkBRzGQMysuUWIZMOyCw40jydXJBONw0mbzWvoyqKQwyBSGWJBtD1GKGYVaMRLQqlrXOZKJiGvwNjy/s400/jsf20_08.jpg" /></a> 클래스 이름은 UserNumberBean<br />패키지 이름은 guessNumber<br />scope 는 session 으로 줬습니다.<br />마침 클릭<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIXDExtQHGHC6gtq0BTOuL4v38TZ8HB3-zXox3b3rAdN6ItBn9Z4Pr0k9qA-KIpaXcoLJbg7GWISRrDC0Di5U34ic5dfVv7nuic5Ph-a-DwHQW3yQpTqYHlF7ISsgpMJXda6u6y__fT1_V/s1600-h/jsf20_09.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 308px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5417126487717026882" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIXDExtQHGHC6gtq0BTOuL4v38TZ8HB3-zXox3b3rAdN6ItBn9Z4Pr0k9qA-KIpaXcoLJbg7GWISRrDC0Di5U34ic5dfVv7nuic5Ph-a-DwHQW3yQpTqYHlF7ISsgpMJXda6u6y__fT1_V/s400/jsf20_09.jpg" /></a><br />생성자 부분에 다음과 같은 내용을 추가하고, 임포트 관련 문제 해결은 편집기에서 오른쪽 마우스를 클릭하여 가져오기 고정(fix import)를 클릭하면 됩니다.<br />------------------------------------------------------------------------------------<br />public class UserNumberBean {<br /><strong>Integer randomInt;</strong><br />/** Creates a new instance of UserNumberBean */<br />public UserNumberBean() {<br /><strong>Random randomGR = new Random();<br />randomInt = new Integer(randomGR.nextInt(10));<br />System.out.println("Duke's number: " + randomInt);</strong> }<br />}<br />-------------------------------------------------------------------------------------<br />임포트 관련 참고: java.util.Random<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlQ1oOAhuipwg4B4OijzcOwwrlzY9MZkdGAMH9VfGlNWnkpm2EjSVAkDhq272KZEbUCWxY_BM_7PndkbHyqVWTefMA0vaRC8EP4oKzsHYMcKoyRp2CV7Wkv6nP4j0gglikb-W64kbqBcDX/s1600-h/jsf20_10.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 307px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5417126478728029666" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlQ1oOAhuipwg4B4OijzcOwwrlzY9MZkdGAMH9VfGlNWnkpm2EjSVAkDhq272KZEbUCWxY_BM_7PndkbHyqVWTefMA0vaRC8EP4oKzsHYMcKoyRp2CV7Wkv6nP4j0gglikb-W64kbqBcDX/s400/jsf20_10.jpg" /></a> 이 상태로 (SessionScope)로 수행(Run) 해보면 그림과 같이 배포(deploye)수행 시간이 나옵니다.<br />JSF는 기본적으로 lazy instantiation을 사용하므로 UserNumberBean 객체가 만들어지지 않습니다.<br /><br />즉, 특정 scope를 가진 빈은 어플리케이션에 의해 필요할 때 만들어지고 초기화된 다는 것을 의미합니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYABdgjgD8-3aOwtBPN4RjzYukRugf9AQffoWMrzNZFCEmIbuQYXuQXMfMW7kmKPC9HRj1lAtOj5ypQUv2xrvUe5NrD4AXmvb8Bp5oiy0OS-VD3TwkQNPHP5UfrGOOrcy3kL1G3wgT1xdA/s1600-h/jsf20_11.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 307px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5417128177735024322" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYABdgjgD8-3aOwtBPN4RjzYukRugf9AQffoWMrzNZFCEmIbuQYXuQXMfMW7kmKPC9HRj1lAtOj5ypQUv2xrvUe5NrD4AXmvb8Bp5oiy0OS-VD3TwkQNPHP5UfrGOOrcy3kL1G3wgT1xdA/s400/jsf20_11.jpg" /></a> 이 소스를 다른 건 그대로 두고 ApplicationScope로 바꾸면 어떻게 되는 지 살펴봅니다.<br />------------------------------------------------------------------------------<br />@ManagedBean(name="UserNumberBean", <strong>eager=true</strong>)<br /><strong>@ApplicationScoped</strong><br />public class UserNumberBean {<br />-----------------------------------------------------------------------------<br />임포트 관련 문제는 위와 같이 fix import(가져오기 고정)으로 해결합니다.<br /><br />임포트 참조: javax.faces.bean.ApplicationScoped<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdi5s89-2duJ9VJjTCSE7hXjAdo5rzKZbTs-EBx6h5CA9ksrHXvxzJcIEtcHmuou33eUhEEMwitDz6QOCOzOW-cWLxE57ejYjvVsW4hJZd_0T9mZ67PS-W-0F0We6vPXhBO771KMi2tmSe/s1600-h/jsf20_12.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 308px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5417128170820147906" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdi5s89-2duJ9VJjTCSE7hXjAdo5rzKZbTs-EBx6h5CA9ksrHXvxzJcIEtcHmuou33eUhEEMwitDz6QOCOzOW-cWLxE57ejYjvVsW4hJZd_0T9mZ67PS-W-0F0We6vPXhBO771KMi2tmSe/s400/jsf20_12.jpg" /></a> 이번에는 아까와는 달리 생성자가 호출되며 객체가 만들어진 걸 볼 수 있습니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNJMl3F7stGZgbcOjROJEOmBLS6Z6YRMGn2jw9k9MF-b9gF_ZQeQkuWTbcW037JyAI69fRXBfjFAIu7c1rHDlEnVDJ2Pw94US3miGiVY8pi6FUBcNp7O0vCP7otwCs75M1QzEL1KVVOPaO/s1600-h/jsf20_13.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 308px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5417128165339197890" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNJMl3F7stGZgbcOjROJEOmBLS6Z6YRMGn2jw9k9MF-b9gF_ZQeQkuWTbcW037JyAI69fRXBfjFAIu7c1rHDlEnVDJ2Pw94US3miGiVY8pi6FUBcNp7O0vCP7otwCs75M1QzEL1KVVOPaO/s400/jsf20_13.jpg" /></a><br />다시 아까와 같이 SessionScope로 원상태로 고칩니다.<br />----------------------------------------------------------------------------------<br />@ManagedBean(name="UserNumberBean")<br />@SessionScoped<br />public class UserNumberBean {<br />----------------------------------------------------------------------------------<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXn0f1sAyzxSo3aq__XVEu7N034fID8NYIhaR7QdE6I8LByAWPl5R7RxdEilu040pOO91EoqSc3FCPu_bYkjJOQH5F8VVQqpz2IF4eoVhJQUF1Jv0WDWkKiMrFjt3h5FQRZsjnJ_O_hCLa/s1600-h/jsf20_14.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 308px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5417128158585398482" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXn0f1sAyzxSo3aq__XVEu7N034fID8NYIhaR7QdE6I8LByAWPl5R7RxdEilu040pOO91EoqSc3FCPu_bYkjJOQH5F8VVQqpz2IF4eoVhJQUF1Jv0WDWkKiMrFjt3h5FQRZsjnJ_O_hCLa/s400/jsf20_14.jpg" /></a><br />세션 스코프를 가지기 위해 java.io.Serializable 인터페이스를 구현합니다.<br />---------------------------------------------------------------------------------<br />@ManagedBean(name = "UserNumberBean")<br />@SessionScoped<br />public class UserNumberBean <strong>implements Serializable </strong>{<br />---------------------------------------------------------------------------------<br />임포트 참고: java.io.Serializable<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNN3TxE1M5i4kbxhHJ347Lpqd6eQNzKnIaV3S1BuScFAZhcS9hvrfaw4vX-YKSZUUtnnzTDUKjWV8qgRo2MQ4Q-xwM_c0I1EqjbpP3-f-tuDxT-GoOmHytjhVdDSQ-dI5NfhBh8aqtME0K/s1600-h/jsf20_15.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 308px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5417128152590506818" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNN3TxE1M5i4kbxhHJ347Lpqd6eQNzKnIaV3S1BuScFAZhcS9hvrfaw4vX-YKSZUUtnnzTDUKjWV8qgRo2MQ4Q-xwM_c0I1EqjbpP3-f-tuDxT-GoOmHytjhVdDSQ-dI5NfhBh8aqtME0K/s400/jsf20_15.jpg" /></a> 변수를 하나 더 추가하고 이에 대한 getter/setter도 같이 작업합니다.(getter/setter는 편집기에서 오른쪽 마우스 클릭- 코드 삽입(insert code)을 선택하면 getter/setter 메뉴가 그림과 같이 제시됩니다. 클릭<br />------------------------------------------------------------------------------------<br /><strong>Integer userNumber;</strong><br />------------------------------------------------------------------------------------<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGzWmyQlIStMaEhnGNr_-cUH7ye2glLxghngY86ymq4mDDnJENtFcUinnpshnauAY0WhFP-X1JQuf3_ftCs2uKSZ-Wnu6B4Xv3Pyet1J78hlNi1jHJGSR7IyqUeD6iO3vimogzdbKaV1bu/s1600-h/jsf20_16.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 308px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5417131818241900306" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGzWmyQlIStMaEhnGNr_-cUH7ye2glLxghngY86ymq4mDDnJENtFcUinnpshnauAY0WhFP-X1JQuf3_ftCs2uKSZ-Wnu6B4Xv3Pyet1J78hlNi1jHJGSR7IyqUeD6iO3vimogzdbKaV1bu/s400/jsf20_16.jpg" /></a> getter/setter 에서 userNumber 를 체크 (그림 참조) 하고 생성 버튼 클릭<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6Jo3b001EWwm9qQmhWiYvs5RKVMAIsKaoViqhNbwum5VXfyCZCocUM3LaMZBd2AlQjH5rYymoa3TF-LB06MpvnXphWyWsiHVoLvKzMLTW9BevPkBwZIAHTesgw64dc1QbwxlO7MrM45Lw/s1600-h/jsf20_17.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 201px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5417131810821477442" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6Jo3b001EWwm9qQmhWiYvs5RKVMAIsKaoViqhNbwum5VXfyCZCocUM3LaMZBd2AlQjH5rYymoa3TF-LB06MpvnXphWyWsiHVoLvKzMLTW9BevPkBwZIAHTesgw64dc1QbwxlO7MrM45Lw/s400/jsf20_17.jpg" /></a> 문자열을 하나 추가하고 메소드를 작성합니다(아래 코드 및 그림 참조 )<br />------------------------------------------------------------------------------------<br />String response;<br /><br />public String getResponse() {<br />if ((userNumber != null) && (userNumber.compareTo(randomInt) == 0)) {<br /><br />//invalidate user session<br />FacesContext context = FacesContext.getCurrentInstance();<br />HttpSession session = (HttpSession) context.getExternalContext().getSession(false);<br />session.invalidate();<br /><br />return "Yay! You got it!";<br />} else {<br /><br />return " Sorry, " + userNumber + " isn't it."<br />+ " Guess again...";<br />}<br />}<br />------------------------------------------------------------------------------------<br />임포트 참고:<br />javax.servlet.http.HttpSession<br />javax.faces.context.FacesContext<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg26fQESG7wAAM0bZFZ_i1Fw_OyG8VQ30u9JF-o7BCJnD8SXPaHEUp0-cIAjRS_hNww22y9kqhNvcmkP9ePDzx0eBTnjnOx9v25-2TdLyIuR2Gsr3LfjxZPyB-Yb-MKM92l1mT3XSY4RAtq/s1600-h/jsf20_18.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 308px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5417131803929847426" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg26fQESG7wAAM0bZFZ_i1Fw_OyG8VQ30u9JF-o7BCJnD8SXPaHEUp0-cIAjRS_hNww22y9kqhNvcmkP9ePDzx0eBTnjnOx9v25-2TdLyIuR2Gsr3LfjxZPyB-Yb-MKM92l1mT3XSY4RAtq/s400/jsf20_18.jpg" /></a>이 다음은 page에 대해 알아보도록 하겠습니다. 계속...<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1zMCiBOZ-eIWtE6hQ7_rjEyh_vwq-zwOgo2NooeI5xMMW3gpywN3LqGLhESFe2Sa_QQfmbu_r1buAvpHLQ7etL1tXnq5Cib-RxgIjdKb8mKXjXfuH9N5zDDariByTTKwN695j0hw2NDPR/s1600-h/jsf20_20.jpg"></a>강여사(J.Y.Kang)http://www.blogger.com/profile/17450510931308610527noreply@blogger.com0tag:blogger.com,1999:blog-6811062799606447528.post-78069212378261861842009-12-17T19:02:00.000-08:002009-12-20T17:33:20.774-08:00넷빈(Netbeans)6.8에서 JSF 2.0 사용하기-basicIDE의 새 JSF 2.0은 이전의 JavaServer Faces는 물론, Facelets 페이지를 위한 향상된 편집 기능을 포함하며, 엔티티 클래스와 함께 작업 가능한 다양한 기능들 및 일반 개발 작업을 위한 JSF 마법사 슈트, 예를들어, JSF 매니지드 빈, Facelets 템플릿 및 콤포지트 컴포넌트 등을 제공합니다.<br /><br />이번 예제는 간단히 넷빈즈 IDE 6.8 에서 JSF 2.0 에 대해 알아보고자 합니다.<br /><br />환경은 넷빈즈 6.8<br />서버는 글래스피시 v3 도메인<br /><br />파일 - 새 프로젝트<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMHQCcrFNk5n1shWJoB8eBtJiu-JL47vyQUyfQrlknEQrlB8IaBsPp4b5bLLyhz6QGzftlmx2Yhb7-iEWIPOKyiXMJcKLSs-cablGGpe4fGSvyalFpbi2F1EXtuSXLqbjPDhMPcv4a61_w/s1600-h/ee6_new_01.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 338px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416413114682668802" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMHQCcrFNk5n1shWJoB8eBtJiu-JL47vyQUyfQrlknEQrlB8IaBsPp4b5bLLyhz6QGzftlmx2Yhb7-iEWIPOKyiXMJcKLSs-cablGGpe4fGSvyalFpbi2F1EXtuSXLqbjPDhMPcv4a61_w/s400/ee6_new_01.jpg" /></a> Java Web - Web application <p></p><p>다음 클릭<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9q0gE3RMxDIo7E5-hkQKieu4LT5Rmmom_K4ddDxzjAeFgx-NbViUSL_6uILOooOBdczxdx35H-kxwGXLdIkwg9_r52YLz1UzQdBH_Z3qSGpoANhS14sA9fsEYYr_NiQfVt_ysdlsJeGUL/s1600-h/ee6_new_02.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 276px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9q0gE3RMxDIo7E5-hkQKieu4LT5Rmmom_K4ddDxzjAeFgx-NbViUSL_6uILOooOBdczxdx35H-kxwGXLdIkwg9_r52YLz1UzQdBH_Z3qSGpoANhS14sA9fsEYYr_NiQfVt_ysdlsJeGUL/s400/ee6_new_02.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5417496418634923858" /></a><br /></p><p>프로젝트 명은 기본 설정에 EE6 을 붙여줬습니다. (적당히)</p><p>경로 적당히</p><p>다음 클릭<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9I744Wwdrq43MdtYxv9GliE_5poepqN7ylg7r77CXwAe5n4t5cVNZWUKEcEg2CB9FFTRw9pZXpABX1gvD0kRfeQenWIs01h0rAgz1xLCk8q1fzYDLgz0Uof2dX30iG6Lw0vaRc2NEwgUj/s1600-h/ee6_new_03.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416413100863505362" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9I744Wwdrq43MdtYxv9GliE_5poepqN7ylg7r77CXwAe5n4t5cVNZWUKEcEg2CB9FFTRw9pZXpABX1gvD0kRfeQenWIs01h0rAgz1xLCk8q1fzYDLgz0Uof2dX30iG6Lw0vaRc2NEwgUj/s400/ee6_new_03.jpg" /></a> 서버를 글래스피시 v3 도메인으로</p><p>자바 EE 버전은 EE6 Web 으로 </p><p>다음 클릭<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2XbvMVYll9KTD_zsy456MZfr1buiYiOXMKAno2ZdLbfB5Kytcf1KRAeyR_IO9JaKhuZwVo8MdVfL6QwcuXOIbGfb-GyYNOjfzRY2n1eV4Gr4FVCcGGHwLTqL7QAP6Lxin5OBbnihboJ8x/s1600-h/ee6_new_04.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 266px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416413095304244194" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2XbvMVYll9KTD_zsy456MZfr1buiYiOXMKAno2ZdLbfB5Kytcf1KRAeyR_IO9JaKhuZwVo8MdVfL6QwcuXOIbGfb-GyYNOjfzRY2n1eV4Gr4FVCcGGHwLTqL7QAP6Lxin5OBbnihboJ8x/s400/ee6_new_04.jpg" /></a> 여기서 JavaServer Faces 를 선택합니다(체크)</p><p>하면 아래 JSF 2.0 이 사용될 거라는 표시가 보입니다(기본) </p><p>확인후 마침 클릭<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiYYjGnreHibekR70DAdREhJz9kJK9blgcRluV_j6pLUeZGRvU2YdQ4BGapwggE5-eM6EzFONG2ZbLZ2jMj_vfnwFJF1Uk59VB6hyphenhyphen2ENc84uHy9KSjYLSQx7l7GR57WxZIabWuFRIVy8lX/s1600-h/ee6_new_05.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 266px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416413087982003826" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiYYjGnreHibekR70DAdREhJz9kJK9blgcRluV_j6pLUeZGRvU2YdQ4BGapwggE5-eM6EzFONG2ZbLZ2jMj_vfnwFJF1Uk59VB6hyphenhyphen2ENc84uHy9KSjYLSQx7l7GR57WxZIabWuFRIVy8lX/s400/ee6_new_05.jpg" /></a> </p><p>만들어진 파일을 살펴보면 예전 JSF 1.2 에서는 welcome.jsp가 만들어졌지만 </p><p>JSF 2.0 에서는 index.xhtml 이 만들어진 걸 볼 수 있습니다. 확인<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3aHtMS-uVbnuTF29fxQ2bFwiSguv-uo2oi_x2oyMPhGIHdMByKmYZNUTH73qNGFhAXSzisOAQkeQPtUt0FAlBAa0_Rg2xIla02SDGG3IbqlJ5VjD9M0oGbUI8Cv_yPZtFMD60iWXqs-cM/s1600-h/ee6_new_06.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 338px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416413877924539586" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3aHtMS-uVbnuTF29fxQ2bFwiSguv-uo2oi_x2oyMPhGIHdMByKmYZNUTH73qNGFhAXSzisOAQkeQPtUt0FAlBAa0_Rg2xIla02SDGG3IbqlJ5VjD9M0oGbUI8Cv_yPZtFMD60iWXqs-cM/s400/ee6_new_06.jpg" /></a> 그럼 이제 엔티티와 엔티티 클래스로부터 세션 퍼세이드(Session Facade)를 만들도록 하겠습니다. </p><p>우선 엔티티 클래스를 만듭니다.</p><p>프로젝트에서 오른쪽 마우스 클릭 - new - other<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh72vgr-jwpQP0xHP7c_9zwBUeBAzfjR1x1tO8c0_uhK4spBRCvEZv2HSJWDwfN1W7fSS2CccRJpcmNA-voyIaXNnzHovwilgR-Ks12HB_muZ_eVudXu6_p2yD0IjqzEKAuO1pjf6AMpS-v/s1600-h/ee6_new_07.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 338px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416413872160255042" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh72vgr-jwpQP0xHP7c_9zwBUeBAzfjR1x1tO8c0_uhK4spBRCvEZv2HSJWDwfN1W7fSS2CccRJpcmNA-voyIaXNnzHovwilgR-Ks12HB_muZ_eVudXu6_p2yD0IjqzEKAuO1pjf6AMpS-v/s400/ee6_new_07.jpg" /></a> 정보보존(Persistence) - 엔티티 클래스 (Entity classes)</p><p>다음 클릭 <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwqj1tEDIG59JY6B54Ur1F6ZJT7C7tY5RBJYbm-LHeclZt_rKO9cYzqTedHhkC0qL-5qKoYDzeX6h84x-6sg897zvB4KPRU3o4IeYN6ZkubrVOVYlnWmN47yde46dk7_TlRmar7pk6uaDD/s1600-h/ee6_new_08.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416413870116150802" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwqj1tEDIG59JY6B54Ur1F6ZJT7C7tY5RBJYbm-LHeclZt_rKO9cYzqTedHhkC0qL-5qKoYDzeX6h84x-6sg897zvB4KPRU3o4IeYN6ZkubrVOVYlnWmN47yde46dk7_TlRmar7pk6uaDD/s400/ee6_new_08.jpg" /></a> 클래스 이름은 Message 로</p><p>패키지는 entities 로 줬습니다</p><p>그리고 퍼시스턴스 유닛을 만들기 위해 아래 퍼시스턴스 유닛만들기 버튼을 클릭합니다<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVIQRIclRGtywZuK7PjA260XSsQsFJQNFPCFsd0RFQM2jDo3JEB3JN6hd2WxcSzReDyrPqEE67p5s6mBb20F3-K8nZjQNg49_-YH7fKQ9l9hzBH0WQyw8hltkwlRH7ucMp6ASWJw1o5lLJ/s1600-h/ee6_new_09.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416413865542114258" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVIQRIclRGtywZuK7PjA260XSsQsFJQNFPCFsd0RFQM2jDo3JEB3JN6hd2WxcSzReDyrPqEE67p5s6mBb20F3-K8nZjQNg49_-YH7fKQ9l9hzBH0WQyw8hltkwlRH7ucMp6ASWJw1o5lLJ/s400/ee6_new_09.jpg" /></a> 이름은 기본 그대로</p><p>데이터 소스에서 New Datasource 를 선택하고, 이름을 jdbc/mysample 라고 줍니다. (현재는 없습니다, 나중에 자동으로 만들어질 겁니다)</p><p>테이블 생성전략에 생성(create)를 선택합니다.</p><p>생성<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhajWdcXTeug3ET-4LbAjw6lmwlS5PSV7HX1ojoGLW8ABY77NfmD7q0NMTBhxmTcgvyhbnIghyN54q6ksWshizOYVKj-F85XMsXOQoDrVrxYIQrZyraf1ZaMrOK7_clvFGl81da9spCb8a4/s1600-h/ee6_new_10.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 257px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416453666499183122" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhajWdcXTeug3ET-4LbAjw6lmwlS5PSV7HX1ojoGLW8ABY77NfmD7q0NMTBhxmTcgvyhbnIghyN54q6ksWshizOYVKj-F85XMsXOQoDrVrxYIQrZyraf1ZaMrOK7_clvFGl81da9spCb8a4/s400/ee6_new_10.jpg" /></a>만들어진 Message 클래스에 private String message 를 추가하고 이에 대한 getter/setter 를 만듭니다(insert code: 코드 삽입 (Ctrl+I)을 사용하면 쉽게 만들수 있습니다)<br />-----------------------------------------------<br /><blockquote>private Long id;<br /><strong>private String message;</strong></blockquote>-----------------------------------------------<br />코드 부분은 그림을 참조 하십시오<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiytiDxM7YVryJp5owsUBmBTFUvw3fZOi9Qi7DctyQYzgRJVpK9v5_qkovzBcWFX0DFliIZZmoBHXLkvln_dnBHFH0koqsogScaRcQ9Bl_xR8GfrnjLH2ZE0SRCXM1KbwscfAXlQqbq_AWC/s1600-h/ee6_new_11.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 338px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416415788115189362" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiytiDxM7YVryJp5owsUBmBTFUvw3fZOi9Qi7DctyQYzgRJVpK9v5_qkovzBcWFX0DFliIZZmoBHXLkvln_dnBHFH0koqsogScaRcQ9Bl_xR8GfrnjLH2ZE0SRCXM1KbwscfAXlQqbq_AWC/s400/ee6_new_11.jpg" /></a> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHdOm9AWzbldPGTrVi3U-l9-VMgZhWqD2Hb-gFi_p9dfZBeHlvM8LbUT7UZiOEGAqSPRAo2LmYDUXhhlB3qRUtRQujSOuaZC719KZxGv_bsRBi4GajbvjVqz7nZIwfzizEBrxsbZ9m0Lwj/s1600-h/ee6_new_12.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 338px; DISPLAY: block; HEIGHT: 400px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416415785967563298" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHdOm9AWzbldPGTrVi3U-l9-VMgZhWqD2Hb-gFi_p9dfZBeHlvM8LbUT7UZiOEGAqSPRAo2LmYDUXhhlB3qRUtRQujSOuaZC719KZxGv_bsRBi4GajbvjVqz7nZIwfzizEBrxsbZ9m0Lwj/s400/ee6_new_12.jpg" /></a> 그리고 persistence.xml 을 열어서 JTA 로 잘 설정되어 있는 지도 확인합니다. <p></p>(transaction-type="JTA").<br />이는 엔티티 클래스의 생명 주기가 컨테이너에 의해 관리된다는 것을 의미합니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmhCILKAPgfc30gMRQWrVkghGOgCEg-hFL7q1_hklZN4Gy34QiGzVTlynvRST6_gPFF3CqC1EzGVYhXKOEiKjf-fLfCMfJvO8TcmJjVmWRYm4QrAFKaIQcGPHxIInTok-nx9wd7Nu8vg8H/s1600-h/ee6_new_13.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 338px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416415779509103330" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmhCILKAPgfc30gMRQWrVkghGOgCEg-hFL7q1_hklZN4Gy34QiGzVTlynvRST6_gPFF3CqC1EzGVYhXKOEiKjf-fLfCMfJvO8TcmJjVmWRYm4QrAFKaIQcGPHxIInTok-nx9wd7Nu8vg8H/s400/ee6_new_13.jpg" /></a> 이제 세션 퍼세이드(Session Facade)를 만들도록 하겠습니다. <p></p><p>프로젝트에서 오른쪽 마우스 클릭 - new - other <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZXjFUk-xypIsyRXFoVeUtqbgkNNJkxMTpLCKZGxQt_rL3X0erT2-X0hWkUDQ9lxCKWe0qvyiY_IlPDZXJfh82TmJBsbhBYJUaP-3e_CJkQ3cFYyae3Gk8hvmnfo-OSCwy70YS0OMn92YT/s1600-h/ee6_new_14.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 338px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416415775365829090" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZXjFUk-xypIsyRXFoVeUtqbgkNNJkxMTpLCKZGxQt_rL3X0erT2-X0hWkUDQ9lxCKWe0qvyiY_IlPDZXJfh82TmJBsbhBYJUaP-3e_CJkQ3cFYyae3Gk8hvmnfo-OSCwy70YS0OMn92YT/s400/ee6_new_14.jpg" /></a> Java EE 카테고리에서 - Session Beans for Entity Classes 를 선택합니다.</p><p>다음 클릭 </p><p>참고: 이번 예제에서는 메시지 엔티티를 위한 무상태 세션 퍼세이드(Stateless Session Facade) 생성 마법사를 사용할 예정입니다. EJB 3.1 스펙에서 세션 빈을 위한 비즈니스 인터페이스는 현재 옵션(optional)입니다.<br />빈에 접근하는 클라이언트가 로컬인 이번 응용 프로그램에서는,따라서 로컬 인터페이스를 사용하거나,아니면 인터페이스 뷰를 사용하지 않거나 여러분 맘입니다. --;; <img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416415764386352290" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNgbvipLEOtSiAEw6tBUWuLq_QVVCfWsWScFMpnAk5wqVBO2Jl2hCDfbTSIDXy4zBU6HrWA4gKYAAfFeExqjtF1WUdDhiwN4alvQqYQaMDN9ekGAvViGzHkxgWuKWJFcI66TS6oxvCcaW5/s400/ee6_new_15.jpg" /> 사용가능한 엔티티에 앞서 작성한 entities.Message 가 올라옵니다.<br /><br />그럼 추가를 선택해 오른쪽으로 옮깁니다<br /><br />다음 클릭<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4TlhjV6gTObOd7-LxTYIDqqGot-Wf8zaaaAunpTK3PHb55CxzGTIcV3fpz2ANo_I6S_Sv7nfQ5VtXCTdPWEwx6DDPNPyj3rWJme_ZqBfheALdnyLsaU1x_C4bzm21lB5JOvwXo4Po013a/s1600-h/ee6_new_16.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 274px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416418918875634530" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4TlhjV6gTObOd7-LxTYIDqqGot-Wf8zaaaAunpTK3PHb55CxzGTIcV3fpz2ANo_I6S_Sv7nfQ5VtXCTdPWEwx6DDPNPyj3rWJme_ZqBfheALdnyLsaU1x_C4bzm21lB5JOvwXo4Po013a/s400/ee6_new_16.jpg" /></a><br />패키지명을 boundary 로 줬습니다.<br /><br />마침 클릭<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDJBJuRcFroSX6paYppD7bACne_Ppr3e92jGuSJK9ZQeF-LMg-q-NAu4hxz6WdYGUWZf1fJZmDwlWUI_yAtLdYAByyUahyphenhyphencGc_xfv-6Cc4k0oVB1AJX8v40n9lpFK9WZ6zJxD9BAUz3pU7/s1600-h/ee6_new_17.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 249px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416418916777115330" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDJBJuRcFroSX6paYppD7bACne_Ppr3e92jGuSJK9ZQeF-LMg-q-NAu4hxz6WdYGUWZf1fJZmDwlWUI_yAtLdYAByyUahyphenhyphencGc_xfv-6Cc4k0oVB1AJX8v40n9lpFK9WZ6zJxD9BAUz3pU7/s400/ee6_new_17.jpg" /></a><br />만들어진 소스 부분을 확인하면<br />다음과 같은 Stateless 와 PersistenceContext 가 작업되어 있습니다.<br />===========================================================<br /><blockquote>@Stateless<br />public class MessageFacade {<br />@PersistenceContext(unitName = "WebApplicationEE6PU")<br />private EntityManager em;</blockquote>===========================================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj49UnFxsLxdCE4wrh3USanVQAMGCqrK2UmVWyMiX6J1EaP72-vyL5DjZWTizsP7Bxl6w9Y6SEtOKhymdh6T-PdHHtVyhBfcap4MxmFrK10hypi1R2mUrVknIC_O140bKQZENNvhIQ_KJlo/s1600-h/ee6_new_18.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 338px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416418906040387634" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj49UnFxsLxdCE4wrh3USanVQAMGCqrK2UmVWyMiX6J1EaP72-vyL5DjZWTizsP7Bxl6w9Y6SEtOKhymdh6T-PdHHtVyhBfcap4MxmFrK10hypi1R2mUrVknIC_O140bKQZENNvhIQ_KJlo/s400/ee6_new_18.jpg" /></a> IDE가 엔티티를 생성, 삭제, 변경, 및 찾기 등을 위한 일련의 메소드를 자동 작업해놓은 것을 확인할 수 있습니다.<br />=========================================================================<br /><blockquote>public List<message> findAll() {<br />CriteriaQuery cq = em.getCriteriaBuilder().createQuery();<br />cq.select(cq.from(Message.class));<br />return em.createQuery(cq).getResultList();<br />}<br /><br />public List<message> findRange(int[] range) {<br />CriteriaQuery cq = em.getCriteriaBuilder().createQuery();<br />cq.select(cq.from(Message.class));<br />Query q = em.createQuery(cq);<br />q.setMaxResults(range[1] - range[0]);<br />q.setFirstResult(range[0]);<br />return q.getResultList();<br />}<br /><br />public int count() {<br />CriteriaQuery cq = em.getCriteriaBuilder().createQuery();<br />Root<message> rt = cq.from(Message.class);<br />cq.select(em.getCriteriaBuilder().count(rt));<br />Query q = em.createQuery(cq);<br />return ((Long) q.getSingleResult()).intValue();<br />}</blockquote>======================================================================확인<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXSSiC54ge4Ak0IoM93zRYR12YOWhvE0LlIfFkZsKEQ85QF6vgVWeWYGrKp9REQmI8abcwSsI8ZLOvwLmLKQhNmDZ47vdDDs9d2hIjLw1X7wv_kGYKhQQ1RqMU5-cFdv445Lx-Su95DJR8/s1600-h/ee6_new_19.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 338px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416418902008753474" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXSSiC54ge4Ak0IoM93zRYR12YOWhvE0LlIfFkZsKEQ85QF6vgVWeWYGrKp9REQmI8abcwSsI8ZLOvwLmLKQhNmDZ47vdDDs9d2hIjLw1X7wv_kGYKhQQ1RqMU5-cFdv445Lx-Su95DJR8/s400/ee6_new_19.jpg" /></a> 그럼 이제 JSF 페이지들을 만들도록 하겠습니다. <p></p><p>프로젝트에서 오른쪽 마우스 클릭 - new - other<br /></p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8NMHVuu0Stcml8zS3AR-24TH7S2RIjYmhIVsENNpmg3Il5DrRwZhZiCw9Ydk_FIU2lFzAB-NphUJsUZaC_KkUmEk5lrvBO9ozpQuWwrhDzo2JS3rl_Fm0z9MxbAyZOhRt8Kobs-7rc_OL/s1600-h/ee6_new_20.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 338px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416418899625274258" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8NMHVuu0Stcml8zS3AR-24TH7S2RIjYmhIVsENNpmg3Il5DrRwZhZiCw9Ydk_FIU2lFzAB-NphUJsUZaC_KkUmEk5lrvBO9ozpQuWwrhDzo2JS3rl_Fm0z9MxbAyZOhRt8Kobs-7rc_OL/s400/ee6_new_20.jpg" /></a> JavaServer Faces 에 JSF Managed Bean 선택<br />다음 클릭<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhM2bKWd6F3XBxbR80HZU5d8sCP9TOJnfYKrwHUQImg6BJrN1OqkSuR1V00BSoGh0MpPfCSTtYEyuPW6Mw6zVTfuvzBTOkLrkU2x3SW8aY2_8E6xX3sfRG9sAqDlK-ZBZsfGwudCeYgi_5m/s1600-h/ee6_new_21.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416420923830736802" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhM2bKWd6F3XBxbR80HZU5d8sCP9TOJnfYKrwHUQImg6BJrN1OqkSuR1V00BSoGh0MpPfCSTtYEyuPW6Mw6zVTfuvzBTOkLrkU2x3SW8aY2_8E6xX3sfRG9sAqDlK-ZBZsfGwudCeYgi_5m/s400/ee6_new_21.jpg" /></a> 클래스 이름을 MessageView 로 주고 <p></p><p>패키지 명은 my.presentation 으로 줍니다</p><p>마침 클릭<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNmoXl_8dhCZUUzOC7LWrB-YyorCNPgsg6UT-6zbHSZbJAKeRrDum7OY_dpqkCvmVBe_HQtgUuvNIHbLVqLEC1szQSO2XOhCUgFosxNSG4gFotVtzWzINykUgKscJ4Q9WkQA800wZ2qf0L/s1600-h/ee6_new_22.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 308px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416420911894517122" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNmoXl_8dhCZUUzOC7LWrB-YyorCNPgsg6UT-6zbHSZbJAKeRrDum7OY_dpqkCvmVBe_HQtgUuvNIHbLVqLEC1szQSO2XOhCUgFosxNSG4gFotVtzWzINykUgKscJ4Q9WkQA800wZ2qf0L/s400/ee6_new_22.jpg" /></a><br />만들어진 클래스를 살펴보면 다음과 같이 되어 있습니다.<br />====================================================<br /><blockquote>@ManagedBean(name="MessageView")<br />@RequestScoped<br />public class MessageView {<br /><br />/** Creates a new instance of MessageView */<br />public MessageView() {<br />}<br />}</blockquote>====================================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdp0c7K6YI1RuL6eS7kEPxV02lkM-RCeoWX4occCLINdFhcbYK6ZBFplmvhWVLMiJH76ktXC2OAxrN1Qz_c2vvcl0mx8jBegPes-sZDDpnVPqmYk4igOnIfPJCXEdkc_M0wAOU1XzuBZjs/s1600-h/ee6_new_23.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 338px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416420906427625314" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdp0c7K6YI1RuL6eS7kEPxV02lkM-RCeoWX4occCLINdFhcbYK6ZBFplmvhWVLMiJH76ktXC2OAxrN1Qz_c2vvcl0mx8jBegPes-sZDDpnVPqmYk4igOnIfPJCXEdkc_M0wAOU1XzuBZjs/s400/ee6_new_23.jpg" /></a> 편집기의 적당한 공백에서 마우스 오른쪽을 클릭하여 코드 삽입(insert code: Ctrl+I) 을 선택합니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieikbIH7bOMNPQrG2txFr1URQ33Stf0z5icj7VE3XlSernYpIcSopLcX_5rUjnH5GfnnhOliyi8HWgzxVTHwiebsZVk31LLlC1W_GUD6KE4WWhchZtLq-Bfc5REFzm9XnQM3YTMsxH5xqc/s1600-h/ee6_new_24.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 338px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416420899813264114" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieikbIH7bOMNPQrG2txFr1URQ33Stf0z5icj7VE3XlSernYpIcSopLcX_5rUjnH5GfnnhOliyi8HWgzxVTHwiebsZVk31LLlC1W_GUD6KE4WWhchZtLq-Bfc5REFzm9XnQM3YTMsxH5xqc/s400/ee6_new_24.jpg" /></a> 그리고 Call Enterprise Bean 을 선택합니다.<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikbjB1igczrJU2_EBAlRfT_jA6HTuhTSunmGpEeAIfdEKJp_yD6kIOudUdq5m9pHyyRcPpqfMCdcBKxMCyzE0EXG2J_yh-NhOF-tSRfnA9KWtZv3_KA4uBtOKUBSJndy1hy5eGp2NhLn24/s1600-h/ee6_new_25.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 338px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416420897237946834" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikbjB1igczrJU2_EBAlRfT_jA6HTuhTSunmGpEeAIfdEKJp_yD6kIOudUdq5m9pHyyRcPpqfMCdcBKxMCyzE0EXG2J_yh-NhOF-tSRfnA9KWtZv3_KA4uBtOKUBSJndy1hy5eGp2NhLn24/s400/ee6_new_25.jpg" /></a> 프로젝트 아래 MessageFacade를 선택하고 <p></p><p>참조 인터페이스에서는 no 를 선택합니다</p><p>OK 클릭<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHXiOvr5xkfAtQs1_ga-2goDIkkJhJkKqkFpEkuRHURoeCCqQvrULLQiGglTskSi1GOe4uwdZ-nPiqnd5BeI_biz5L39kkYBYZZIwtl2to2yuz7r9i3xHBbN1LR9l8R7Om9PJB0D3XUs3R/s1600-h/ee6_new_26.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 273px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416421186135099698" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHXiOvr5xkfAtQs1_ga-2goDIkkJhJkKqkFpEkuRHURoeCCqQvrULLQiGglTskSi1GOe4uwdZ-nPiqnd5BeI_biz5L39kkYBYZZIwtl2to2yuz7r9i3xHBbN1LR9l8R7Om9PJB0D3XUs3R/s400/ee6_new_26.jpg" /></a><br />그럼 아래 그림과 같이 @EJB 가 작성됩니다.<br />=======================================<br /><blockquote>@EJB<br />MessageFacade messageFacade;</blockquote>=======================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_dXzS8TuTM4VMWeTygKFO0dDDHIMmMX_CHKfzTEEaw4HveQx0rsaufTKyOGs9LuwLRXgw77aJ84tEMeY9c05c0Ak5Y1QxTj3o_4zTY98cYMqfzX4lKzLMFPJamzuJ0L26PpfHspvdNZ1L/s1600-h/ee6_new_27.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 338px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416421177628901538" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_dXzS8TuTM4VMWeTygKFO0dDDHIMmMX_CHKfzTEEaw4HveQx0rsaufTKyOGs9LuwLRXgw77aJ84tEMeY9c05c0Ak5Y1QxTj3o_4zTY98cYMqfzX4lKzLMFPJamzuJ0L26PpfHspvdNZ1L/s400/ee6_new_27.jpg" /></a> 다음 코드를 붙여넣습니다.<br />===================================================================<br /><blockquote>// Creates a new field<br />private Message message;<br /><br />// Creates a new instance of Message<br />public MessageView() {<br />this.message = new Message();<br />}<br /><br />// Calls getMessage to retrieve the message<br />public Message getMessage() {<br />return message;<br />}<br /><br />// Returns the total number of messages<br />public int getNumberOfMessages(){<br />return messageFacade.findAll().size();<br />}<br /><br />// Saves the message and then returns the string "theend"<br />public String postMessage(){<br />this.messageFacade.create(message);<br />return "theend";<br />}</blockquote>===================================================================<br />임포트 관련 문제 발생은 마우스 오른쪽을 눌러 가져오기 고정(fix import)를 선택합니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6Z4ePxSPkqE23IrNdvSzHlhTn-edi5cQ1HzurzCPrkhnsEIMBPo07icM1b5ANkSw3cvbgwaRbANqABkfXbVg0oNjwnt9wtlX-_8E5p6402l4UutDYJDJTl6stQ4HcJjwUo9ALNkHp1vLn/s1600-h/ee6_new_28.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 338px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416421174933614338" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6Z4ePxSPkqE23IrNdvSzHlhTn-edi5cQ1HzurzCPrkhnsEIMBPo07icM1b5ANkSw3cvbgwaRbANqABkfXbVg0oNjwnt9wtlX-_8E5p6402l4UutDYJDJTl6stQ4HcJjwUo9ALNkHp1vLn/s400/ee6_new_28.jpg" /></a> Message 관련해서 팝업창이 뜨는데 그림과 같이 선택하고 OK 클릭<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiEGD-4a352oS5OBzzyvTpSY4lQ5rr7pg8NzXLOiRy3LUO-84pkBo-qfabpuQwnD1UmFMkpZ1gveRr_hul7mSpOD_bp7naDx0ecMQ0Ug8pbqQOKcc10LRSWakfu6J4lRkKCX09rFrCSA5T/s1600-h/ee6_new_29.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 177px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416421170874971058" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiEGD-4a352oS5OBzzyvTpSY4lQ5rr7pg8NzXLOiRy3LUO-84pkBo-qfabpuQwnD1UmFMkpZ1gveRr_hul7mSpOD_bp7naDx0ecMQ0Ug8pbqQOKcc10LRSWakfu6J4lRkKCX09rFrCSA5T/s400/ee6_new_29.jpg" /></a> 작성된 코드 확인<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHSZDwD06qJbqBVtjARq3KDpTjIvxihX9mj5AURLM6k9YZu1cJtsv0YwxHa9Z6c4afvqCpFq61Fj7fY4Hhyphenhyphenxyn8wdpds0w7hDn3SNuapHGD7I9BmD6oc54ShhCp2Z24lDDL692s2ENrbn7/s1600-h/ee6_new_30.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 338px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416421161397084706" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHSZDwD06qJbqBVtjARq3KDpTjIvxihX9mj5AURLM6k9YZu1cJtsv0YwxHa9Z6c4afvqCpFq61Fj7fY4Hhyphenhyphenxyn8wdpds0w7hDn3SNuapHGD7I9BmD6oc54ShhCp2Z24lDDL692s2ENrbn7/s400/ee6_new_30.jpg" /></a> 이제 페이지를 수정하도록 하겠습니다.<br />======================================================================<br /><blockquote><?xml version='1.0' encoding='UTF-8' ?><br /><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><br /><html xmlns="http://www.w3.org/1999/xhtml"<br />xmlns:h="http://java.sun.com/jsf/html"<br />xmlns:f="http://java.sun.com/jsf/core"><br /><h:head><br /><title>Facelet Title</title><br /></h:head><br /><h:body><br />Hello from Facelets<br /><f:view><br /><h:form><br /><h:outputLabel value="Message:"/><h:inputText value="#{MessageView.message.message}"/><br /><h:commandButton action="#{MessageView.postMessage}" value="Post Message"/><br /></h:form><br /></f:view><br /><br /></h:body><br /></html></blockquote>======================================================================= 그림 참조<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieAPd8YEY5w30BR18wxugXDhNe7AiFEF5DV4fZ6lKbKNJc-JB1NBVGzzAekI_ME-F-s2JFjgay6NGVYz_J8WV9hvOshznXuafXPsnAzPpbYLSyTtJd0fhs66B5l18028UlnQls-DTm0qTG/s1600-h/ee6_new_31.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 338px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416421458513726898" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieAPd8YEY5w30BR18wxugXDhNe7AiFEF5DV4fZ6lKbKNJc-JB1NBVGzzAekI_ME-F-s2JFjgay6NGVYz_J8WV9hvOshznXuafXPsnAzPpbYLSyTtJd0fhs66B5l18028UlnQls-DTm0qTG/s400/ee6_new_31.jpg" /></a> 이제 다른 JSF 파일을 만들도록 하겠습니다. <p></p><p>프로젝트에서 오른쪽 마우스 클릭 - new - other<br /></p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAq6NLgpclUC1_2X3MevemF1k0sfgEw5gl5XokqIZGWzoU7esAbYFkiybVhTnHTysvboMWTq6uo2uF5p7BIr9WRHwvOmpGddF6Xbifb8nuhXTothBT8wisoT6dh_D1yNnp61b3-uIS2UJt/s1600-h/ee6_new_32.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 338px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416421456259057842" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAq6NLgpclUC1_2X3MevemF1k0sfgEw5gl5XokqIZGWzoU7esAbYFkiybVhTnHTysvboMWTq6uo2uF5p7BIr9WRHwvOmpGddF6Xbifb8nuhXTothBT8wisoT6dh_D1yNnp61b3-uIS2UJt/s400/ee6_new_32.jpg" /></a> JavaServer Faces - JSF Page 선택<br />다음 클릭 <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnpJfz47cFiXRBH_E1oQTgyjKElOCMiK4-HRwDUomDc5dRFYYHbYY7nVVO0FMFSUMFn_Mb1A9wFfj8Jya6UIFST-3V_ugcZur_ZoxUR7aZdOtmx5zC_3nF_WT2q4gMOQnPOzlMtwzBBXJn/s1600-h/ee6_new_33.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416421451294899826" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnpJfz47cFiXRBH_E1oQTgyjKElOCMiK4-HRwDUomDc5dRFYYHbYY7nVVO0FMFSUMFn_Mb1A9wFfj8Jya6UIFST-3V_ugcZur_ZoxUR7aZdOtmx5zC_3nF_WT2q4gMOQnPOzlMtwzBBXJn/s400/ee6_new_33.jpg" /></a> 파일 이름에 theend 라고 줍니다. <p>마침 클릭<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjupoMyKe9AThCPxtyn4QE4hsFmRrvO5QcaQ1Bc11GpSf5zpXwG2fM_3VweEGrx_oM5PDFta4Wrru5f5zY-rW8SJUzYloK7vdgCckbPOpAN0xyFAF8gpmPDC5h2m8F-ogbVsACwySc1hezV/s1600-h/ee6_new_34.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 202px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416421444568422386" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjupoMyKe9AThCPxtyn4QE4hsFmRrvO5QcaQ1Bc11GpSf5zpXwG2fM_3VweEGrx_oM5PDFta4Wrru5f5zY-rW8SJUzYloK7vdgCckbPOpAN0xyFAF8gpmPDC5h2m8F-ogbVsACwySc1hezV/s400/ee6_new_34.jpg" /></a> 다음 내용을 작업합니다.<br />==================================================<br /><blockquote><?xml version='1.0' encoding='UTF-8' ?><br /><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><br /><html xmlns="http://www.w3.org/1999/xhtml"<br />xmlns:h="http://java.sun.com/jsf/html"><br /><h:head><br /><title>Facelet Title</title><br /></h:head><br /><h:body><br />Hello from Facelets : RESULTS<br /><h:outputLabel value="Thanks! There are "/><br /><h:outputText value="#{MessageView.numberOfMessages}"/><br /><h:outputLabel value=" messages!"/><br /></h:body><br /></html></blockquote>==================================================<br />그림 참조<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9xgNHd52N3YRFkbUOZZlkhe5nvaX_kANCN6_grbdw1F4Db18DxWGSuS5wHDtUY5TCLIpo9f5hCF0n-Z-TxNxyY5WblrJ8DNoEekWfBD3TI1mGvjnEyju6akCdxzvmY-FECPqgXwZ-6kI4/s1600-h/ee6_new_35.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 338px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416421439153966162" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9xgNHd52N3YRFkbUOZZlkhe5nvaX_kANCN6_grbdw1F4Db18DxWGSuS5wHDtUY5TCLIpo9f5hCF0n-Z-TxNxyY5WblrJ8DNoEekWfBD3TI1mGvjnEyju6akCdxzvmY-FECPqgXwZ-6kI4/s400/ee6_new_35.jpg" /></a> 실행하면 다음 그림과 같이 뜹니다. <p></p><p>그럼 메시지 부분에 적절히 단어를 입력합니다.</p><p>hi,nice 2 meet u 라고 주고 버튼을 클릭했습니다<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEho6gANGVMW5ozI5RdkwMKA2RB4FEo7nnwmWcooIQbTXcGSAbPbE7gm2DWMWIu8H2kgiUUKk125ZynkfSbouvH18uyJMd9aI3bcVdJdNVd3FHxzUI2Ci-ZfV5OghDqbW6U8-n8Mfm7PdotB/s1600-h/ee6_new_37.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 318px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416421697092457298" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEho6gANGVMW5ozI5RdkwMKA2RB4FEo7nnwmWcooIQbTXcGSAbPbE7gm2DWMWIu8H2kgiUUKk125ZynkfSbouvH18uyJMd9aI3bcVdJdNVd3FHxzUI2Ci-ZfV5OghDqbW6U8-n8Mfm7PdotB/s400/ee6_new_37.jpg" /></a> 결과가 1개 있다고 나오네요.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj95o07c7LmJ54dmNdKNYpRngTGTvC1_00_a6WQ3S6eZ4Cr8SdF3gf6yRh8OAy2Q6sL0dm9ugT2jFGJT_6YMOHKBqZJ0EbXbk-nJcx-gM5orCy7VjZ2UW50Md6po3qMN68Z5YUq56tm6AVw/s1600-h/ee6_new_38.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 318px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416421695302939890" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj95o07c7LmJ54dmNdKNYpRngTGTvC1_00_a6WQ3S6eZ4Cr8SdF3gf6yRh8OAy2Q6sL0dm9ugT2jFGJT_6YMOHKBqZJ0EbXbk-nJcx-gM5orCy7VjZ2UW50Md6po3qMN68Z5YUq56tm6AVw/s400/ee6_new_38.jpg" /></a> 해당 내용은 다시 데이터베이스에서 확인할 수 있습니다.</p><p>Services 탭으로 가서 sample 데이터베이스의 MESSAGE 에서 데이터를 조회해보면 나옵니다.<br /></p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjh1ELUPPy2u-fTzsj9lq2rNBkd_YKcqhgEjBCTx1N7PDvVnI8_237kBA4Vvo3cmynR0YqD8_pJ3DqGnwG_9wSqKm1d-inLyqn8e28yVeTzqmhbUq4pOkBHTdwq5WF0RnojL9jZztu_Q5J3/s1600-h/ee6_new_39.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 338px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416421689308789538" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjh1ELUPPy2u-fTzsj9lq2rNBkd_YKcqhgEjBCTx1N7PDvVnI8_237kBA4Vvo3cmynR0YqD8_pJ3DqGnwG_9wSqKm1d-inLyqn8e28yVeTzqmhbUq4pOkBHTdwq5WF0RnojL9jZztu_Q5J3/s400/ee6_new_39.jpg" /></a> 수고하셨습니다. *^^*강여사(J.Y.Kang)http://www.blogger.com/profile/17450510931308610527noreply@blogger.com0tag:blogger.com,1999:blog-6811062799606447528.post-39381715312667567752009-12-17T17:20:00.001-08:002010-07-01T03:51:46.334-07:00넷빈(Netbeans)6.8에서 EE6 (esp. JavaServlet 3.0) 웹 어플리케이션 만들기이번 게시물에서는 넷빈 6.8에서 EE6 그중에서도 특히 이번에 새로 추가된 자바 서블릿 3.0 에 대해 작성해보도록 하겠습니다.<br /><br />이 Java Servlet 3.0은 그동안의 기본 웹 개념을 왕창 흔들만큼 중요한 내용들을 담고 있어서 반드시 스펙을 꼼꼼히 살펴보셔야 합니다.<br /><br />일례로 그간 웹 프로젝트라면 반드시 있어야 하는 web.xml 역시 optional 입니다. 또한 web.xml 의 내용의 부분을 단편화한 fragment 들(web-fragment.xml)의 작성으로 보다 portable 한 작성이 가능하면, 뿐만 아니라 이 일을 가능케한 새로운 어노테이션 API 등 새롭고 흥미로운 게 많죠. ^^;; (좋은 쪽으로는..나쁜 쪽으로는 그만큼 공부할 게 왕창 늘어났다는..ㅠㅠ)<br /><br />아무튼 그럼 이 EE6 시리즈로 웹 어플리케이션을 만들어 봅시다.<br /><br />파일 - 새 프로젝트<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6DhZ-3mUsYITjq4vk6lRaQ-Ti3bAFaIkwYQD9BDlUPZzCiInL78U259n_hX5qHQSm0SU8mbs2rVA8_oeau4cNWveM-XTkaPqZtkRIL_yr54pa-YrnHNLDJ6ApIbDyAfxxRCj_kVILflZD/s1600-h/servlet3_01.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 298px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416380841517966802" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6DhZ-3mUsYITjq4vk6lRaQ-Ti3bAFaIkwYQD9BDlUPZzCiInL78U259n_hX5qHQSm0SU8mbs2rVA8_oeau4cNWveM-XTkaPqZtkRIL_yr54pa-YrnHNLDJ6ApIbDyAfxxRCj_kVILflZD/s400/servlet3_01.jpg" /></a> Java Web - Web Application<br /><p>다음 클릭 <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEia8xRm1KVxW26a1W2ZHhCi8wmiHKGlPeFkMb8GyLAYnYV6nC6wep6WT7uGFtksVCDbTbc1q4g7O9YPZbbOHedScrAOq7Ptu4cknlZtDmEvmnp9hZ3umkgkDk-WbVua-2El5flM7LILD_vq/s1600-h/servlet3_02.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416380835776658834" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEia8xRm1KVxW26a1W2ZHhCi8wmiHKGlPeFkMb8GyLAYnYV6nC6wep6WT7uGFtksVCDbTbc1q4g7O9YPZbbOHedScrAOq7Ptu4cknlZtDmEvmnp9hZ3umkgkDk-WbVua-2El5flM7LILD_vq/s400/servlet3_02.jpg" /></a> 프로젝트의 이름은 기본 제공되는 거 뒤에 Servlet3 이라고 붙여줬습니다.</p><p>경로는 적당히</p><p>다음 클릭<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdYKB6CSlBcyFQ-yXiKuKEeCY_sy29bmucaXd7VMVwLIIDJoHsz2aR0bkwLvGva0EnSx55aP2qTR0uD8PwTcjpJy0sYRzAHLZtwLVF0fFVnTOA38IFzJPqNXP5Y3b2DDKgq_9ictca2tiG/s1600-h/servlet3_03.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 266px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416380831461384242" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdYKB6CSlBcyFQ-yXiKuKEeCY_sy29bmucaXd7VMVwLIIDJoHsz2aR0bkwLvGva0EnSx55aP2qTR0uD8PwTcjpJy0sYRzAHLZtwLVF0fFVnTOA38IFzJPqNXP5Y3b2DDKgq_9ictca2tiG/s400/servlet3_03.jpg" /></a> 서버는 EE 6 Web 이 적용되는 글래스피시 v3 도메인으로</p><p>버전 역시 EE6 Web 으로 </p><p>마침 클릭<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjv4_D4R3_WsSvRAqyq9pri5dHPBWEYUhC42asDOVRZv2RVo4Amu9qvVPJ9OmtxGlExYeh6xjXnKO3VtAt5YURO34qRs7y1gLE1BRkW-pFotlMRjjxys2V82-344B5qhzHC1U6k5gC-oqa/s1600-h/servlet3_04.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 266px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416380826728865714" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjv4_D4R3_WsSvRAqyq9pri5dHPBWEYUhC42asDOVRZv2RVo4Amu9qvVPJ9OmtxGlExYeh6xjXnKO3VtAt5YURO34qRs7y1gLE1BRkW-pFotlMRjjxys2V82-344B5qhzHC1U6k5gC-oqa/s400/servlet3_04.jpg" /></a> 기본적으로 index.jsp 파일이 만들어집니다.</p><p>그러나~~ 자세히 보면 뭔가가 틀리다는..</p><p>Configuration Files 에 web.xml 이 없.습.니.다~~ (즉, optional 입니다. 만들어도 되고, 안 만들어도 되고.. )<br /></p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhj6465HZueiM9FtS8bvgMnT9lMdz0tmJxkauRRJtWo8iuclb98nEANz_gn-rIMC55yDUhdfhIJ20YKkR2P_2MRCEherIoPv9GG6xbVLOiOhGl9fwepBu8G3HtxykfeI5TQREv71EROK5ek/s1600-h/servlet3_05.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 298px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416380823858480498" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhj6465HZueiM9FtS8bvgMnT9lMdz0tmJxkauRRJtWo8iuclb98nEANz_gn-rIMC55yDUhdfhIJ20YKkR2P_2MRCEherIoPv9GG6xbVLOiOhGl9fwepBu8G3HtxykfeI5TQREv71EROK5ek/s400/servlet3_05.jpg" /></a><br />진짜 이것만으로 동작하는 지 실행해봅시다.<br /><br />프로젝트 오른쪽마우스 클릭 - run (실행)<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNi3ZKwXBZx5T2kmOUEol0bLpHtlQnJJhod2G8oBhhAjohUrUJB3g-3LdFemzdnzsKyGLjbRfMx1gdVjz8a-bXpI3MnSCkh5GWdM5NTZn9Ep8a1-D46sVclPbWq_4GuZwk0lt0A9Qq89PY/s1600-h/servlet3_06.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 298px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416382899700715570" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNi3ZKwXBZx5T2kmOUEol0bLpHtlQnJJhod2G8oBhhAjohUrUJB3g-3LdFemzdnzsKyGLjbRfMx1gdVjz8a-bXpI3MnSCkh5GWdM5NTZn9Ep8a1-D46sVclPbWq_4GuZwk0lt0A9Qq89PY/s400/servlet3_06.jpg" /></a> 서버가 시작되고</p><p>웹브라우저가 호출되면서 Hello World 가 잘 나옵니다. 확인<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfyfz91ORHgjlvnYzlbXl-JpMmymqKjB9-YhoD3RlA5chM2XODl9UOx28Py0GL7_1pFQYUa_s_pW5DTNQfMtY8Dd_pBS4pWDi51qL5u4LQWbnP_15l0Gi9ngc7D8e0A5KOSmrR4PY0KnAm/s1600-h/servlet3_07.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 298px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416382892700569394" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfyfz91ORHgjlvnYzlbXl-JpMmymqKjB9-YhoD3RlA5chM2XODl9UOx28Py0GL7_1pFQYUa_s_pW5DTNQfMtY8Dd_pBS4pWDi51qL5u4LQWbnP_15l0Gi9ngc7D8e0A5KOSmrR4PY0KnAm/s400/servlet3_07.jpg" /></a><br />그럼 이제 서블릿을 만들어 보도록 하겠습니다.<br /><br />여기서 만드는 서블릿은 Java Servlet 3.0으로 작업됩니다.<br /><br />프로젝트에서 오른쪽 마우스 클릭 - new - other<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5grvzpX93cU2PWHaDusHdmJcZHyGm77MebRTntf6Ie96GFiz8CCr0xD99HwTU9TGgJQw65tT_rq975UCKgBqmHkVZKw0KCTSAw0fw7-c13RmdkVM7soIjHefNHGW6zK0qc_jHnnprJawj/s1600-h/servlet3_08.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 298px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416382887667625218" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5grvzpX93cU2PWHaDusHdmJcZHyGm77MebRTntf6Ie96GFiz8CCr0xD99HwTU9TGgJQw65tT_rq975UCKgBqmHkVZKw0KCTSAw0fw7-c13RmdkVM7soIjHefNHGW6zK0qc_jHnnprJawj/s400/servlet3_08.jpg" /></a><br />Web 카테고리에서 Servlet 을 선택합니다.<br /><br />다음 클릭<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWaOpNl7D3wY6hhZI-92FNrw-IcJSgglng0tPzWfSxBmvVL_wskiXAcFRAa8Hvsl0PT8JCUXvW3Unba4EmQCmkg_EJNUcnGSEFZpJW6Hypg9xCZT-DI8ONh34VFh5TiqSahISeDi97S5o0/s1600-h/servlet3_10.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416386815250917154" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWaOpNl7D3wY6hhZI-92FNrw-IcJSgglng0tPzWfSxBmvVL_wskiXAcFRAa8Hvsl0PT8JCUXvW3Unba4EmQCmkg_EJNUcnGSEFZpJW6Hypg9xCZT-DI8ONh34VFh5TiqSahISeDi97S5o0/s400/servlet3_10.jpg" /></a><br />서블릿 이름은 기본대로 그냥..<br /><br />패키지 명은 a 로 줬습니다.<br /><br />다음 클릭 <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg19vU_yHrl3sR6iOefOcQy9WQUJ_jhstl0Vn7Nc8MoZU1Tp2vQ5wxWxNi0b30INcHuc6vkixwxu-BHqvBs3V5EXwQj3Ac1B_dqzTYu2qn8ypCNvz1KVKAC9e0feSuoTp-JY5tA1SbFvKqM/s1600-h/servlet3_09.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416386806042896962" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg19vU_yHrl3sR6iOefOcQy9WQUJ_jhstl0Vn7Nc8MoZU1Tp2vQ5wxWxNi0b30INcHuc6vkixwxu-BHqvBs3V5EXwQj3Ac1B_dqzTYu2qn8ypCNvz1KVKAC9e0feSuoTp-JY5tA1SbFvKqM/s400/servlet3_09.jpg" /></a><br />예전과는 달리 web.xml 에 설정내용 반영이 기본적으로는 체크되어 있지 않습니다(예전에는 기본이 체크상태 였음)<br /><br />클래스 이름과 서블릿 이름, URL Pattern 은 기본 내용 그대로 줬습니다.<br /><br />마침 클릭<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCIBqy-2djK4iGFzzo6zNm6XAc7bAXC6ykye8XvwzSN5yXH1AeObAGWN8xtpJuwsWmMF8sF357Sv6znV2ggm5gcU-iaV5muoqWvPh4tHh6rMVWalt5mp4-ISfiOmMaGqqR-R_SDuGpvDAe/s1600-h/servlet3_09.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416382883079786002" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCIBqy-2djK4iGFzzo6zNm6XAc7bAXC6ykye8XvwzSN5yXH1AeObAGWN8xtpJuwsWmMF8sF357Sv6znV2ggm5gcU-iaV5muoqWvPh4tHh6rMVWalt5mp4-ISfiOmMaGqqR-R_SDuGpvDAe/s400/servlet3_09.jpg" /></a><br />그럼 기본 서블릿이 만들어집니다.<br /><br />여기서 중요한 내용은 @WebServlet 입니다.<br /><br />web.xml 이 생략되는 대신 어노테이션이 그 자리를 대신하죠.<br /><br />좀전 서블릿의 설정은 @WebServlet 의 작성으로 서블릿쪽에서도 이제 POJO 기반으로 작업이 됨을 알 수 있습니다.<br />=======================================================<br /><blockquote>@WebServlet(name="NewServlet", urlPatterns={"/NewServlet"})</blockquote><br />=======================================================<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgF1C_-18fTHn1bKZ6w3ZnC_xW0_dnUjBPoTGQiY_nmLknBvWIhW0BmX5upZaSnhYsV1bRkHcX4qLp1Wv2GJ2b2x8LAIKE_xM7ozxMMRTguAFzjuv8nG0fEGbETiTg1n4x2UwvFucDFvKpN/s1600-h/servlet3_10.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 298px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416382875547389746" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgF1C_-18fTHn1bKZ6w3ZnC_xW0_dnUjBPoTGQiY_nmLknBvWIhW0BmX5upZaSnhYsV1bRkHcX4qLp1Wv2GJ2b2x8LAIKE_xM7ozxMMRTguAFzjuv8nG0fEGbETiTg1n4x2UwvFucDFvKpN/s400/servlet3_10.jpg" /></a> 나머지야 서블릿 기본 내용이므로 아래 주석부분을 해제합니다. <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJl9eg6Titl22yXT3s6l4yqzReaxNk2kSjsGW6xsmxcqrtxZK3ADm-AZcPxN44klFWEVXhlGcchCspxsIxv9oFBoAdXWh-6YSyqSi8rr_uxpTJRZAn4WKu-Szq8P6JNXkLiGmEAoLLXwKT/s1600-h/servlet3_11.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 298px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416385192879577218" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJl9eg6Titl22yXT3s6l4yqzReaxNk2kSjsGW6xsmxcqrtxZK3ADm-AZcPxN44klFWEVXhlGcchCspxsIxv9oFBoAdXWh-6YSyqSi8rr_uxpTJRZAn4WKu-Szq8P6JNXkLiGmEAoLLXwKT/s400/servlet3_11.jpg" /></a> 그리고 해당 서블릿을 실행합니다.</p><p>서블릿의 URL 패턴 확인창이 뜹니다.</p><p>그대로 OK <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRbrTnT4dbPSDR-g1Qc5wE81RHPdqnGB0Cd5hNcQsm5yxyipVqwVYIBn4PARbQrEsi0CV0s39LHF4rMnOw1dsruDbKmWRoxeO41sIcXC4b1p1tDpNAImgxpcoCvj_TOZEBwld37yaAA9yg/s1600-h/servlet3_12.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 298px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416385185733436130" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRbrTnT4dbPSDR-g1Qc5wE81RHPdqnGB0Cd5hNcQsm5yxyipVqwVYIBn4PARbQrEsi0CV0s39LHF4rMnOw1dsruDbKmWRoxeO41sIcXC4b1p1tDpNAImgxpcoCvj_TOZEBwld37yaAA9yg/s400/servlet3_12.jpg" /></a> 웹 브라우저에서 서블릿의 내용이 정상적으로 나옵니다.</p><p>주소표시줄에 URL 패턴 역시 지정한 그대로구요.<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNikQb_fcpA53hPr91eknWgFcys-DwwxIeEtfPlNk95idswZ_AeEXgL2OVHbWr6WCXHt9w5PlVv5BYKDm9mymtFmyNpm9DC6fNjDYvE8Utit73q4GuVGARDM792s2t9kQOz4MutfiRdTEy/s1600-h/servlet3_13.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 298px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416385180227263618" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNikQb_fcpA53hPr91eknWgFcys-DwwxIeEtfPlNk95idswZ_AeEXgL2OVHbWr6WCXHt9w5PlVv5BYKDm9mymtFmyNpm9DC6fNjDYvE8Utit73q4GuVGARDM792s2t9kQOz4MutfiRdTEy/s400/servlet3_13.jpg" /></a> 웹 서블릿 클래스의 위치를 library 에서도 찾아보시기 바랍니다. </p><p>(import 에 명시된 패키지 내용을 참조하시면 보다 쉽게 찾을 수 있습니다)<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4diSslMXbx8wy759he_t2GH_P02hJUD6IcZaoOZhqUt2CEhUoEWXS9WVtIIoyJvULM565eUDOOYYrVjkajEbVqyEDoRZznB5oGlxWhH94c_y_fWK2rFnj2H2uohYUVF1dLwbHsmocBAcB/s1600-h/servlet3_14.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 298px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416385172046906242" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4diSslMXbx8wy759he_t2GH_P02hJUD6IcZaoOZhqUt2CEhUoEWXS9WVtIIoyJvULM565eUDOOYYrVjkajEbVqyEDoRZznB5oGlxWhH94c_y_fWK2rFnj2H2uohYUVF1dLwbHsmocBAcB/s400/servlet3_14.jpg" /></a> 수고하셨습니다. *^^*<br /></p>강여사(J.Y.Kang)http://www.blogger.com/profile/17450510931308610527noreply@blogger.com0tag:blogger.com,1999:blog-6811062799606447528.post-15708938722603336882009-12-16T04:20:00.000-08:002009-12-19T21:02:04.765-08:00넷빈(Netbeans)6.8에서 jax-rs 서버와 클라이언트 작성하기 02 - 클라이언트이제 클라이언트 프로젝트를 작성하도록 하겠습니다.<br /><br />새로 프로젝트를 만듭니다.<br />파일 - 새 프로젝트<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgC4rb2icM1bcJqKSoPALRWzb4d2J09nUvSCVd6En44o3aS65c6FMUECvNbhnVr28WbxRto6iha2icIJBMcVF1Inl5JzK741H8tHqr_gQByTayXyQB3rW-kgCXvGnzEJMwC4SvRHa27ixbv/s1600-h/CustomerTestApp_01.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 299px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5415808044013067154" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgC4rb2icM1bcJqKSoPALRWzb4d2J09nUvSCVd6En44o3aS65c6FMUECvNbhnVr28WbxRto6iha2icIJBMcVF1Inl5JzK741H8tHqr_gQByTayXyQB3rW-kgCXvGnzEJMwC4SvRHa27ixbv/s400/CustomerTestApp_01.jpg" /></a> Java Web - Web application 선택<br /><br />다음 클릭<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTRAB16WBQqqbKdj-LBOcJVL3TMOceUOJfnWzAFdVD5yFoZkqqkYTaKIcmR5T80sHYaOvcqSPzQvrnev-yjA_WGA-GUE9A1sSCj6M-CXGV80pdJg17iuV8m-dNTjAvS-shFaPNodrb5u53/s1600-h/CustomerTestApp_02.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5415808037947604402" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTRAB16WBQqqbKdj-LBOcJVL3TMOceUOJfnWzAFdVD5yFoZkqqkYTaKIcmR5T80sHYaOvcqSPzQvrnev-yjA_WGA-GUE9A1sSCj6M-CXGV80pdJg17iuV8m-dNTjAvS-shFaPNodrb5u53/s400/CustomerTestApp_02.jpg" /></a> 프로젝트의 이름은 CustomerTestApp 라고 줬습니다.<br /><p>경로는 적당히</p><p>다음 클릭<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjS2Y7rTrSixbdphGdWRb9XIuVT2W4bKmi2TplxHiluuk_B1g5HzOQqum9gSdfc86bd8eEwhGlBeczaYCD9a-0obuyw8NDcj-7HCfIE4Y_NH4CXCMzCuXUtU1jkZeHNB9Lyx5kdEIVMHxji/s1600-h/CustomerTestApp_03.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5415808035504714578" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjS2Y7rTrSixbdphGdWRb9XIuVT2W4bKmi2TplxHiluuk_B1g5HzOQqum9gSdfc86bd8eEwhGlBeczaYCD9a-0obuyw8NDcj-7HCfIE4Y_NH4CXCMzCuXUtU1jkZeHNB9Lyx5kdEIVMHxji/s400/CustomerTestApp_03.jpg" /></a> 서버는 역시 글래스피시 v3 도메인</p><p>버전은 EE6 으로 줬습니다. (EE5 도 당연 가능합니다)</p><p>마침 클릭<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEn8ZfkCYKZKNrmlwI82bryEJhsZVHDUnWONk4rDDWq3dwsXBIyp_UL2mRyJS3TotIrj5TC32RQMNke9hRVo1YMkZuYbY8hoeQ-6niLU_QsBO6BFRg4S0hOeDJ64qb8IgJPgdYRC9pWw9j/s1600-h/CustomerTestApp_04.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 266px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5415808024287700034" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEn8ZfkCYKZKNrmlwI82bryEJhsZVHDUnWONk4rDDWq3dwsXBIyp_UL2mRyJS3TotIrj5TC32RQMNke9hRVo1YMkZuYbY8hoeQ-6niLU_QsBO6BFRg4S0hOeDJ64qb8IgJPgdYRC9pWw9j/s400/CustomerTestApp_04.jpg" /></a> 이제 REST 클라이언트 스텁을 만들도록 하겠습니다.</p><p>프로젝트에서 오른쪽 마우스 클릭 - new - other<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHu5rkmuv-Hre3OGaHj9j09FGBlZQIb7aiYeDyAs9bhQysFG3jQCg_gNzHOzuJdvMzlS98YvqkgLmiCf9rU9fNBF7PLwQI1MgQJu5C0F9ho2bad-MWonDywAvoEwJkN1ZidojZJsVcX9DG/s1600-h/CustomerTestApp_05.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 299px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5415808022748759042" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHu5rkmuv-Hre3OGaHj9j09FGBlZQIb7aiYeDyAs9bhQysFG3jQCg_gNzHOzuJdvMzlS98YvqkgLmiCf9rU9fNBF7PLwQI1MgQJu5C0F9ho2bad-MWonDywAvoEwJkN1ZidojZJsVcX9DG/s400/CustomerTestApp_05.jpg" /></a> Web Service - RESTful Web Service Client Stubs 선택<br />다음 클릭 <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguDs98IqexslLHSHgEI2VBwQACHVNySwM2Ib3PZqTQrC6hWoJdbXI0JjMXt3WigQKswP45t9LVP4FgYNtsCs_Eu6_zw7IBjoM6aDeKe1EPjalqyXQvpPT8c4X0oKGQ9WDZBObVmtokWGeY/s1600-h/CustomerTestApp_06.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5415808797511552210" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguDs98IqexslLHSHgEI2VBwQACHVNySwM2Ib3PZqTQrC6hWoJdbXI0JjMXt3WigQKswP45t9LVP4FgYNtsCs_Eu6_zw7IBjoM6aDeKe1EPjalqyXQvpPT8c4X0oKGQ9WDZBObVmtokWGeY/s400/CustomerTestApp_06.jpg" /></a> REST 웹 서비스 프로젝트를 선택합니다.</p><p>Add project 버튼을 눌러 좀전에 작성한 서버 프로젝트(CustomerDB)를 선택합니다.</p><p>그리고 원래 창으로 돌아오면 그림과 같이 되어 있습니다.</p><p>마침 클릭<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJqCZrrSQVmlkLQGlc79p9R16pTZrFolhOBBDDqtyYH_pqLfEJyBei93BDuh2RZQWc8OuAHJEty-xiJkTeCL3WwfWS4F_3ibDKtDShKLe7INNmqHQlS3Axl0rvsTlWkOwPAtyNbRPi6Y1I/s1600-h/CustomerTestApp_07.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 267px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5415808794158859938" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJqCZrrSQVmlkLQGlc79p9R16pTZrFolhOBBDDqtyYH_pqLfEJyBei93BDuh2RZQWc8OuAHJEty-xiJkTeCL3WwfWS4F_3ibDKtDShKLe7INNmqHQlS3Axl0rvsTlWkOwPAtyNbRPi6Y1I/s400/CustomerTestApp_07.jpg" /></a> 프로젝트의 web page 안에 rest 폴더 안에 보면 teststub.html 있습니다.</p><p>run file 로 이 파일을 실행합니다.<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEeSfs4DOzE6m25WvIlZT32lY-LQI2DKh_Nn2eyemVheafsvRPm7EqHBstoRB3PIAsTx6DI77Ct5JTQe5kuj6DY1JjlM55T98PDQY7wIHNNmLQzBoN0rFgK3BxHYSvz2L59gNOlpJxoTQG/s1600-h/CustomerTestApp_08.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 299px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5415808784351327378" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEeSfs4DOzE6m25WvIlZT32lY-LQI2DKh_Nn2eyemVheafsvRPm7EqHBstoRB3PIAsTx6DI77Ct5JTQe5kuj6DY1JjlM55T98PDQY7wIHNNmLQzBoN0rFgK3BxHYSvz2L59gNOlpJxoTQG/s400/CustomerTestApp_08.jpg" /></a> 아래 그림과 같이 정상적으로 나와야 다음 작업이 가능합니다.</p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhw2WRBVDHRRZLikQo5Wl0fRfV5RWtkKrqk43IVc3czjG1YwLM3uHusbvDZ5VcpzPa8brpAwN5qy6b7kshHQxzVPALFhLqc-CchIw2zYdrvBHK4GgDM_-I_bOKg72Sn0wm-Gw4yicK8J407/s1600-h/CustomerTestApp_09.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 289px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5415808779811447554" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhw2WRBVDHRRZLikQo5Wl0fRfV5RWtkKrqk43IVc3czjG1YwLM3uHusbvDZ5VcpzPa8brpAwN5qy6b7kshHQxzVPALFhLqc-CchIw2zYdrvBHK4GgDM_-I_bOKg72Sn0wm-Gw4yicK8J407/s400/CustomerTestApp_09.jpg" /></a> 이제 여기서부터는 노가다..--; 대충 만들었습니다. 각자 알아서 할것</p><p>저는 자바스크립트 하나를 추가하고 해당 함수 호출을 index.jsp 수정을 통해 진행했습니다.</p><p>프로젝트에서 오른쪽 마우스 클릭 - new - other<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBbBfJJCxspHQNMhd4bPKcsHXBzhWpj3fEVk-YTgclLUWu25FANMdowWHHxRv47YSW9RUCvss0IwP-dF9cjtOtCq4X6TvL-yBjGWdYZk-zpalj1fWAIc5WpohHPIBCcYr19XY-Jx_QoxE-/s1600-h/CustomerTestApp_10.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 299px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5415808772391307650" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBbBfJJCxspHQNMhd4bPKcsHXBzhWpj3fEVk-YTgclLUWu25FANMdowWHHxRv47YSW9RUCvss0IwP-dF9cjtOtCq4X6TvL-yBjGWdYZk-zpalj1fWAIc5WpohHPIBCcYr19XY-Jx_QoxE-/s400/CustomerTestApp_10.jpg" /></a> Web - javascript 선택</p><p>다음 클릭 <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhm3bpQ3TcxH6xkgojLWfI2kzoKcvKafc9qcL-JVNZiH_kNh-k4PGMod4FnFogKIre9DwPH82qsXKBPSkag81jAJAVfaenbdb3PGOeBIREejA8CQzysSpN7hmOq356Hmh4IWCXDSiX7RZ42/s1600-h/CustomerTestApp_11.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5415809952336718146" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhm3bpQ3TcxH6xkgojLWfI2kzoKcvKafc9qcL-JVNZiH_kNh-k4PGMod4FnFogKIre9DwPH82qsXKBPSkag81jAJAVfaenbdb3PGOeBIREejA8CQzysSpN7hmOq356Hmh4IWCXDSiX7RZ42/s400/CustomerTestApp_11.jpg" /></a> 파일 이름에 customerapp 라고 주고 </p><p>마침 클릭 <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLqEN1wHMFQDoRn36joVZ_QIo0ENPS8DVjHb-Nwc4Ki281M8WeWxz1DSbwWiXpgeVlSOQ5gjdEP-ZJGLUBpAPKTdNfUZhmm1wSn-vihhQiXqe1wzJ-l0YZ6PvzRf36NJj9wJ-vxSFgelNH/s1600-h/CustomerTestApp_12.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 271px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5415809946374124802" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLqEN1wHMFQDoRn36joVZ_QIo0ENPS8DVjHb-Nwc4Ki281M8WeWxz1DSbwWiXpgeVlSOQ5gjdEP-ZJGLUBpAPKTdNfUZhmm1wSn-vihhQiXqe1wzJ-l0YZ6PvzRf36NJj9wJ-vxSFgelNH/s400/CustomerTestApp_12.jpg" /></a> 해당 자바 스크립트 내용으로 다음을 붙여 넣습니다.</p><p>==============================================<br /></p><blockquote><br />/* <br /> * To change this template, choose Tools | Templates<br /> * and open the template in the editor.<br /> */<br /><br />//Change this url value if necessary<br />var baseUrl = 'http://localhost:8080/CustomerDB/resources/';<br />var customersObj;<br />var discountCodesObj;<br /><br />function getCustomers() {<br /> if(customersObj == null)<br /> customersObj = new Customers(baseUrl+'customers/');<br /> return customersObj;<br />}<br /><br />function getDiscountCodes() {<br /> if(discountCodesObj == null)<br /> discountCodesObj = new DiscountCodes(baseUrl+'discountCodes/');<br /> return discountCodesObj;<br />}<br /><br />//function to show all customers<br />function showCustomers() {<br /> var customersObj = getCustomers();<br /> var customers = customersObj.getItems();<br /> document.write("<table border=1>");<br /> for(i=0;i<customers.length;i++) {<br /> var customer = customers[i];<br /> document.write("<tr>");<br /> document.write("<td>"+customer.getName()+"</td>");<br /> document.write("<td>"+customer.getCustomerId()+"</td>");<br /> document.write("</tr>");<br /> }<br /> document.write("</table>");<br />}<br /></blockquote><br />==============================================<br />그림 참조<br /><br /><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjN0DBt_DSiA5fo-NaobFVCaeuBDf0oEiMYPgJWf97sQaPm7nmLk1Kzy3qq9-c5qUzNu33dsligtUPXer4U7SFM4wcOTiU-j_oJ7DoGdBUd8qO-41vw-eoZWCNoMoOVFjBbghJU7WPWP_rv/s1600-h/CustomerTestApp_13.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 299px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5415809942238797282" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjN0DBt_DSiA5fo-NaobFVCaeuBDf0oEiMYPgJWf97sQaPm7nmLk1Kzy3qq9-c5qUzNu33dsligtUPXer4U7SFM4wcOTiU-j_oJ7DoGdBUd8qO-41vw-eoZWCNoMoOVFjBbghJU7WPWP_rv/s400/CustomerTestApp_13.jpg" /></a> 그런 다음 index.jsp 파일을 수정합니다.</p>=======================================================<br /><blockquote><%--<br />Document : index<br />Created on : 2009. 12. 16, ?ㅽ썑 8:49:11<br />Author : Administrator<br />--%><br /><br /><%@page contentType="text/html" pageEncoding="UTF-8"%><br /><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"<br />"http://www.w3.org/TR/html4/loose.dtd"><br /><br /><html><br /><head><br /><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><br /><title>JSP Page</title><br /><!-- JS_DECLARE_START - DO NOT REMOVE--><br /><script type="text/javascript" src="./rest/Support.js"></script><br /><script type="text/javascript" src="./main.js"></script><br /><script type="text/javascript" src="./rest/customerdb/CustomerDB.js"></script><br /><script type="text/javascript" src="./rest/customerdb/Customers.js"></script><br /><script type="text/javascript" src="./rest/customerdb/Customer.js"></script><br /><script type="text/javascript" src="./rest/customerdb/DiscountCodes.js"></script><br /><script type="text/javascript" src="./rest/customerdb/DiscountCode.js"></script><br /><script type="text/javascript" src="./customerapp.js"></script><br /><!-- JS_DECLARE_END - DO NOT REMOVE--><br /></head><br /><body><br /><h1>Hello World!</h1><br /><script type="text/javascript"><br />showCustomers();<br /></script><br /><br /></body><br /></html></blockquote><br />======================================================<br />그림 참조<br /><br /><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigr-Lmm00KsJT09rqjqmWI7gwr6mqwOTNfukVGLEdjY1UXVqHj7d0GfTMyKmEZNpbLceIry7ewBgyyjLvQnoCnoOOAptQkDU06Hbvpmsc8VkCPadGePSW2yahXQWUNTfLTBp3ORwY9Xuix/s1600-h/CustomerTestApp_14.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 299px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5415809931131232562" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigr-Lmm00KsJT09rqjqmWI7gwr6mqwOTNfukVGLEdjY1UXVqHj7d0GfTMyKmEZNpbLceIry7ewBgyyjLvQnoCnoOOAptQkDU06Hbvpmsc8VkCPadGePSW2yahXQWUNTfLTBp3ORwY9Xuix/s400/CustomerTestApp_14.jpg" /></a> 프로젝트를 실행하여 다음과 같이 뜨면 정상 출력입니다.</p><br /><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggKuk4pV6NJoopv0gxTy9jzr9ucu6vGk-7LVJVWHnVWfIugZkoJtWKthyNZcR6f-pc9Uo-LeVNKDeX4c2lscdMonJ9uPAwDbN5p09A8uODuM_c_xIojKQ3CPaIyOv-_lThM3e8_0rIYv3_/s1600-h/CustomerTestApp_15.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 348px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5415809926158962754" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggKuk4pV6NJoopv0gxTy9jzr9ucu6vGk-7LVJVWHnVWfIugZkoJtWKthyNZcR6f-pc9Uo-LeVNKDeX4c2lscdMonJ9uPAwDbN5p09A8uODuM_c_xIojKQ3CPaIyOv-_lThM3e8_0rIYv3_/s400/CustomerTestApp_15.jpg" /></a> 나머지 클라이언트 시리즈는 나중에..또는 각자 알아서.. --;</p>강여사(J.Y.Kang)http://www.blogger.com/profile/17450510931308610527noreply@blogger.com0tag:blogger.com,1999:blog-6811062799606447528.post-22557992653162190112009-12-16T03:56:00.000-08:002009-12-17T17:50:24.147-08:00넷빈(Netbeans)6.8에서 jax-rs 서버와 클라이언트 작성하기 01 - 서버이번 예제에서는 넷빈 6.8에서 jax-rs 서버와 클라이언트를 둘다 해보도록 하겠습니다.<br /><br />(현재 jax-rs 작성시 약간의 버그가 있습니다..버그는 수정될 꺼고..해서 문제를 피해 예제 샘플을 만들어보도록 하겠습니다).<br /><br />우선 지난번 예제처럼 jax-rs 서버(RESTful Web Service)를 진행할텐데.. 나중에 소스 붙여넣기 좋도록 해당 프로젝트 명을 일치시켜 주시기 바랍니다.<br /><br />이번 프로젝트에서 사용할 환경은<br /><br />넷빈 6.8<br />글래스피시 v3 domain (EE6)<br />자바 DB (Derby의 sample 데이터베이스)<br /><br />우선 새로 프로젝트를 만듭니다<br />파일- 새 프로젝트(new project)<br /><br /><br /><br /><br /><br /><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzpcIDOrnGP7TjpaTq0RBgtc__gWkl8A66hkCXUpzuM27kKZfCycvq9f8fE0dNbK1v6JOt5wElLgwO1ifWSKJABdvWW9Bz3IhgtnIST_2NXdURjXXSyyw1RgEdtW8OLhHNm4KdAUPxICl7/s1600-h/CustomerDB_01.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 299px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5415803330846937938" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzpcIDOrnGP7TjpaTq0RBgtc__gWkl8A66hkCXUpzuM27kKZfCycvq9f8fE0dNbK1v6JOt5wElLgwO1ifWSKJABdvWW9Bz3IhgtnIST_2NXdURjXXSyyw1RgEdtW8OLhHNm4KdAUPxICl7/s400/CustomerDB_01.jpg" /></a> Java Web - Web application , 다음 클릭</p><br /><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5rhaIEnM1YjVQ1Gx0Eb4w8j1mh1LZSTJWU86WPLtQkV7viSX7pR8dvepvP7Or50S1XXpXXLTXLsobSLALvgkKNJw_ogZCF1_w2PxorplUzJeItYrqpHXPfMxIbNmXA1T48tLCSj8lhYbi/s1600-h/CustomerDB_02.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5415803326770989314" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5rhaIEnM1YjVQ1Gx0Eb4w8j1mh1LZSTJWU86WPLtQkV7viSX7pR8dvepvP7Or50S1XXpXXLTXLsobSLALvgkKNJw_ogZCF1_w2PxorplUzJeItYrqpHXPfMxIbNmXA1T48tLCSj8lhYbi/s400/CustomerDB_02.jpg" /></a> 프로젝트 이름을 CustomerDB 라고 줍니다.</p><br /><p>경로는 적당히</p><br /><p>다음 클릭</p><br /><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoniMSn8Wr6Y-ciwCF-2fBroqKvQSvwxNe_fCfDvWVaWlD5Q4O-4L1BRLl5HB2Q9tZ0kcQsURRKRVTLPipWVIKBrWP-zsKsG_B4A_o8G20G3qkGa1efnF3_HJ-nfJguUxGrR27qvS8tYua/s1600-h/CustomerDB_03.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5415803320533075090" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoniMSn8Wr6Y-ciwCF-2fBroqKvQSvwxNe_fCfDvWVaWlD5Q4O-4L1BRLl5HB2Q9tZ0kcQsURRKRVTLPipWVIKBrWP-zsKsG_B4A_o8G20G3qkGa1efnF3_HJ-nfJguUxGrR27qvS8tYua/s400/CustomerDB_03.jpg" /></a> 서버를 글래스피시 v3 도메인으로 줬습니다.</p><br /><p>EE 6 으로 (EE5와 EE6 모두 가능합니다)</p><br /><p>마침 클릭</p><br /><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7eqesIiOBev0rvp09Mev3u3ejWUyGHKRMThjXEM04Jq9IaIYPEdqBf9v8Jytg6lviiBa3kQr-O5HAIM9WLB2FQhKOfpJsJsxNleHPRy8uLYBXP6ZPhu2Fz5LjeaKqvjLOVE1vhmESH714/s1600-h/CustomerDB_04.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 266px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5415803315623214994" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7eqesIiOBev0rvp09Mev3u3ejWUyGHKRMThjXEM04Jq9IaIYPEdqBf9v8Jytg6lviiBa3kQr-O5HAIM9WLB2FQhKOfpJsJsxNleHPRy8uLYBXP6ZPhu2Fz5LjeaKqvjLOVE1vhmESH714/s400/CustomerDB_04.jpg" /></a> REST 웹 서비스를 데이터베이스에서 만들 예정인지라, 일단 퍼시스턴스 유닛부터 작성합니다.</p><br /><p>프로젝트에서 오른쪽 마우스 클릭 - new - other</p><br /><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIuWm5NjEUdtf_oCDmphqK7qFCtoKIjNXsM6BfJ5AHLRZez0gIGijxSL_fOQMAG4WbCdgb-FrDHLQA58O1a3UcPkgLKdK1oSgOuvm6mkMx4YkZUjUeblA0ciaBXZ8HiXwaGAmEAv4iLMX-/s1600-h/CustomerDB_05.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 299px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5415803311721297730" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIuWm5NjEUdtf_oCDmphqK7qFCtoKIjNXsM6BfJ5AHLRZez0gIGijxSL_fOQMAG4WbCdgb-FrDHLQA58O1a3UcPkgLKdK1oSgOuvm6mkMx4YkZUjUeblA0ciaBXZ8HiXwaGAmEAv4iLMX-/s400/CustomerDB_05.jpg" /></a> </p><br />정보보존(persistence)에서 퍼시스턴스 유닛을 선택합니다,<br />다음 클릭<br /><br /><br /><br /><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibYEFh4o85K1obrAucjs49NM7y9ueFXr1-NfzE0a8BN05Wg7tlweLa1cWlEyvIbJgfY65fScu3n40ADaCH0QHr28389k7i0MeErafCutFqD3iPytUnGJszbmA7tyVIglz8_HT3fByrIqCT/s1600-h/CustomerDB_06.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5415804207035717298" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibYEFh4o85K1obrAucjs49NM7y9ueFXr1-NfzE0a8BN05Wg7tlweLa1cWlEyvIbJgfY65fScu3n40ADaCH0QHr28389k7i0MeErafCutFqD3iPytUnGJszbmA7tyVIglz8_HT3fByrIqCT/s400/CustomerDB_06.jpg" /></a> 이름은 기본대로</p><br /><p>이번엔 퍼시스턴스 제공자를 TopLink 로 줬습니다. (뭐 EclipseLink 로 줘도 상관없습니다)</p><br /><p>테이블 전략은 없음으로</p><br /><p>마침 클릭</p><br /><p><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpEzSPK9us1p_MpPS1CPdVThcPPIsb-MTJ2W_JSzXIOB0OkIPkB7UsLE0xsHp9VzmqDFWF5r1kVZQFveMxEKDugABAQx5EwRIS-Z1SwckzDM3z3jzqi-SavNu_nC96Tlt17Vlq8jxMQsAy/s1600-h/CustomerDB_07.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 228px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5415806859273690338" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpEzSPK9us1p_MpPS1CPdVThcPPIsb-MTJ2W_JSzXIOB0OkIPkB7UsLE0xsHp9VzmqDFWF5r1kVZQFveMxEKDugABAQx5EwRIS-Z1SwckzDM3z3jzqi-SavNu_nC96Tlt17Vlq8jxMQsAy/s400/CustomerDB_07.jpg" /></a><br />이제 REST 웹 서비스를 만들도록 하겠습니다.</p><br /><p>프로젝트에서 오른쪽 마우스 클릭 - new - other</p><br /><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWvZfkWfDKg_pvr3IqBucQ5umEhXbP5Ibh0_23XNmSVLPewvBRzh7GwYHd1pQTajVk8fqbp_72HoVVaf-bdr4EG8ADWnKpwwOp3qe2qWfDje6nN29s-6uQROF9mNblRWjVnPDF-PSXr9sS/s1600-h/CustomerDB_08.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 299px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5415804194915173890" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWvZfkWfDKg_pvr3IqBucQ5umEhXbP5Ibh0_23XNmSVLPewvBRzh7GwYHd1pQTajVk8fqbp_72HoVVaf-bdr4EG8ADWnKpwwOp3qe2qWfDje6nN29s-6uQROF9mNblRWjVnPDF-PSXr9sS/s400/CustomerDB_08.jpg" /></a> Web Services - RESTful Web Services from Database 선택, </p><br /><p>다음 클릭<br /></p><br /><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIVw8v3yxDKpRyTPQ4ukEZPmfAS6NJZix8sb1JAK1gPAW2uWrHojgiZJo9P1-fwkyYEqyuTVPFATxDjypmLAz5aqkqYaU7V2Y_Bpe_-vkez8T0211ZuNDlxICFnkjKW4CoBLctWwZdsXWa/s1600-h/CustomerDB_09.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5415804189174244434" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIVw8v3yxDKpRyTPQ4ukEZPmfAS6NJZix8sb1JAK1gPAW2uWrHojgiZJo9P1-fwkyYEqyuTVPFATxDjypmLAz5aqkqYaU7V2Y_Bpe_-vkez8T0211ZuNDlxICFnkjKW4CoBLctWwZdsXWa/s400/CustomerDB_09.jpg" /></a> 데이터소스로 jdbc/sample (드래그 메뉴),</p><br /><p>사용가능한 테이블에서 customer 만 추가 합니다. (그럼 discount_code는 자동 선택됩니다)</p><br /><p>이 대목에서 모든 테이블을 선택해서 진행할 경우 purchaseorder 관련 버그가 있습니다. (EE6 에서)</p><br /><p>다음 클릭</p><br /><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgf-PUY-tVQznEYCPl2jYBbxq6Y6vFRjfN9cyKy-1d33QYFQKP21VsCUeredOGU1iYI7LmxsCOHnwec567nVg7THuS4fCboyYJVP7shhOuKLMBpHd_mlOB9BITafSMj8uMsYSDFQ3XEzUL5/s1600-h/CustomerDB_10.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 257px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5415804187377036626" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgf-PUY-tVQznEYCPl2jYBbxq6Y6vFRjfN9cyKy-1d33QYFQKP21VsCUeredOGU1iYI7LmxsCOHnwec567nVg7THuS4fCboyYJVP7shhOuKLMBpHd_mlOB9BITafSMj8uMsYSDFQ3XEzUL5/s400/CustomerDB_10.jpg" /></a> </p><br />패키지 명이 필요합니다.<br />적당히 a 라고 줬습니다.<br />다음 클릭<br /><br /><br /><br /><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZ3pzoSytlXyweG2yNWXZLRZhvfa6H8-8-jZpBt8jFzXbSA_Hhq8O80VG_9oWw262k-9sMdAlK7ElL6q_J-ye-KDXxI8gZIGzR3xzC_V5kblrOmzu389vncu678xosUVe_1A4U8YuojNuv/s1600-h/CustomerDB_11.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 257px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5415805342425978162" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZ3pzoSytlXyweG2yNWXZLRZhvfa6H8-8-jZpBt8jFzXbSA_Hhq8O80VG_9oWw262k-9sMdAlK7ElL6q_J-ye-KDXxI8gZIGzR3xzC_V5kblrOmzu389vncu678xosUVe_1A4U8YuojNuv/s400/CustomerDB_11.jpg" /></a> 헬퍼클래스가 각각의 패키지로 작업됩니다.</p><br /><p>마침 클릭<br /></p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJiWCQ72WC-Tm25Sk7DJ6blMv-9tWu0gdBFXLDGg9XJIMuYXwTbk5pwG3cLKNDGRuzoBflPhz4v0ciP1MPp8_fR5GMjWhWS3fmtQkjS0H9HaeaXgfwsU_l9Uz65qP2bjin12jftgV676B6/s1600-h/CustomerDB_12.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 260px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5415805332928419890" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJiWCQ72WC-Tm25Sk7DJ6blMv-9tWu0gdBFXLDGg9XJIMuYXwTbk5pwG3cLKNDGRuzoBflPhz4v0ciP1MPp8_fR5GMjWhWS3fmtQkjS0H9HaeaXgfwsU_l9Uz65qP2bjin12jftgV676B6/s400/CustomerDB_12.jpg" /></a> EE6 의 경우 넷빈즈가 관련 서브클래스를 자동 생성하게 됩니다. 확인 창<br />OK<br /><br /><br /><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiscmZb2BxFubV2e7tKGkHop79XycPfSXYmXJjGbdfz_J71654tqPOdxUJhQofMygLWQDOGzpmVN4XqBoCcRT5E8x2jm08KY_N_bZNpwFkPnOsVtQYg8Ra8aQEUxCEaG5YmnL3m-MQunuD4/s1600-h/CustomerDB_13.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 231px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5415806454867850658" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiscmZb2BxFubV2e7tKGkHop79XycPfSXYmXJjGbdfz_J71654tqPOdxUJhQofMygLWQDOGzpmVN4XqBoCcRT5E8x2jm08KY_N_bZNpwFkPnOsVtQYg8Ra8aQEUxCEaG5YmnL3m-MQunuD4/s400/CustomerDB_13.jpg" /></a> 프로젝트를 서버에 배포(Deploy)합니다.<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTPHX5JbUIIdHtpu63J5rJmOlZsuU2f6I8uOnpyPjHTRWgRTzgD_G8gLZz2q84rIVYw3V-RAb3M9grQERWq76vIQ-vBVz166YVPQTn6DaGxIjxl5nhX17_TA3hSQLuXNP9aBa00K16RhJH/s1600-h/CustomerDB_14.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 299px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5415805319182871714" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTPHX5JbUIIdHtpu63J5rJmOlZsuU2f6I8uOnpyPjHTRWgRTzgD_G8gLZz2q84rIVYw3V-RAb3M9grQERWq76vIQ-vBVz166YVPQTn6DaGxIjxl5nhX17_TA3hSQLuXNP9aBa00K16RhJH/s400/CustomerDB_14.jpg" /></a> 그런 후 프로젝트의 오른쪽 마우스를 클릭하여</p><br /><p>Test RESTful Web Service 메뉴를 클릭합니다.</p><br /><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiHUJVzTwOkhe4o0YrY9xaGaRQManIUFbFbmrIJUd6bbyLxs1i-ax3AZjeu9bglZPD87N-_SaBr7BUqVXKxXy1Hc7BI0YNtuBRIQoRgLmbYhygx5VgRuTsv4rxgNZcLiS1AyUK2DFEz4Db/s1600-h/CustomerDB_15.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 299px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5415805317378849746" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiHUJVzTwOkhe4o0YrY9xaGaRQManIUFbFbmrIJUd6bbyLxs1i-ax3AZjeu9bglZPD87N-_SaBr7BUqVXKxXy1Hc7BI0YNtuBRIQoRgLmbYhygx5VgRuTsv4rxgNZcLiS1AyUK2DFEz4Db/s400/CustomerDB_15.jpg" /></a> </p><br /><p>테스트페이지가 뜨면 customer 아래를 계속 확장하여 customerID에 1 값을 넣고 test 버튼을 누른 후 그림과 같이 아래 내용이 정상 출력되면 해당 REST 웹 서비스가 서비스되고 있다는 뜻입니다.</p><br /><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiU26TuDtOsYV_gGXgYbzeLQdvtTfmS7G1yYfrUOx5H5d2CpdY71dvEA0XY2Gk0U3MPoCVao7b3GCtD4MXkF3ptjgiet9qCQvp0Aii_0LK7wYwLKcxEq44ZUe3lmGjIO624X0Vdhcgxw-8d/s1600-h/CustomerDB_16.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 289px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5415807340584482322" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiU26TuDtOsYV_gGXgYbzeLQdvtTfmS7G1yYfrUOx5H5d2CpdY71dvEA0XY2Gk0U3MPoCVao7b3GCtD4MXkF3ptjgiet9qCQvp0Aii_0LK7wYwLKcxEq44ZUe3lmGjIO624X0Vdhcgxw-8d/s400/CustomerDB_16.jpg" /></a> 이제 다음 게시물에서 이 서비스를 사용한 클라이언트를 작성하도록 하겠습니다.</p>강여사(J.Y.Kang)http://www.blogger.com/profile/17450510931308610527noreply@blogger.com0tag:blogger.com,1999:blog-6811062799606447528.post-47070688139222932612009-12-15T05:54:00.001-08:002009-12-15T05:55:57.108-08:00넷빈(Netbeans)6.8에서 JAX-RS 사용하기(from Database)<div>이번에는 JAX-RS 에 대해 배워보도록 하겠습니다.<br />JAX-RS는 웹 서비스의 Resource 포커스인 RESTful Web Service를 위한 자바의 신기술입니다. 본격적으로 지원되는 건 JavaEE6 버전이지만 부분적으로 EE5 에서도 사용 가능합니다.<br /><br />그럼 넷빈에서는 어떻게 사용하는 지 알아봅시다.<br /><br />이번 예제에서는 데이터베이스로부터 JAX-RS까지의 작업을 일괄로 할 예정입니다.<br />데이터베이스는 JavaDB인 Derby의 sample 을 사용할 예정입니다.<br />그럼 우선 JavaDB를 시작합니다.<br />서비스-데이터베이스-JavaDB 오른쪽 마우스 클릭 - 서버 시작 을 누릅니다<br /><br /><br /><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhav4i8bARYarZqwyZmcu3QoK9q_tDzDscvLbiWsPntOsRrchSpVE3Y9Q9iTr7iWFUThXl1U-KIb3F9EPYG4FFHh_fC2e9lX5A1O66_6SlOZINpyH6p5WidII89PkI_DIAj1PaM1mgqn4Y/s1600-h/jaxrs_01.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 338px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5415247943751566658" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhav4i8bARYarZqwyZmcu3QoK9q_tDzDscvLbiWsPntOsRrchSpVE3Y9Q9iTr7iWFUThXl1U-KIb3F9EPYG4FFHh_fC2e9lX5A1O66_6SlOZINpyH6p5WidII89PkI_DIAj1PaM1mgqn4Y/s400/jaxrs_01.jpg" /></a>JAX-RS를 공급할 서버 프로그램을 만듭니다. (프로젝트 탭으로 다시 돌아와서)<br />new project (새 프로젝트)<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOsuUlEepQgJgAXk29xA2hzqqTG3HUBLWTZgwYTEGxRw0KwhTVOitE0oiBjFrlUV7nDJvJPKYIdms9553oTwg-4pP7RwQV9PzNALD9IKDBGIqYz0IMPsE-gtmi9Xj8v8D2S_9-bZbjJ7o/s1600-h/jaxrs_02.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 338px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5415247942053801570" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOsuUlEepQgJgAXk29xA2hzqqTG3HUBLWTZgwYTEGxRw0KwhTVOitE0oiBjFrlUV7nDJvJPKYIdms9553oTwg-4pP7RwQV9PzNALD9IKDBGIqYz0IMPsE-gtmi9Xj8v8D2S_9-bZbjJ7o/s400/jaxrs_02.jpg" /></a> JavaWeb - Web Application 선택 , 다음 클릭<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOdkPTxhITWUL_q21QZKdQZX9k8aWFz1vQWVGHaud7m4tEGXpDHTvYMV3hsznfxZ_yRzKU3qaK55T4p2COlmwrv45Gc5_i1K33_gJ6XdTUFv_ZaYO77uU4mIPHLDG0FzTkemjAfsou3jU/s1600-h/jaxrs_03.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5415247932600613074" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOdkPTxhITWUL_q21QZKdQZX9k8aWFz1vQWVGHaud7m4tEGXpDHTvYMV3hsznfxZ_yRzKU3qaK55T4p2COlmwrv45Gc5_i1K33_gJ6XdTUFv_ZaYO77uU4mIPHLDG0FzTkemjAfsou3jU/s400/jaxrs_03.jpg" /></a> 이름은 적당히(자동으로 잡히는 이름에 끝에 jaxrs 라고 줬습니다 --;)</p><br /><br /><p>경로도 적당히 , 다음 클릭<br /></p><br /><br /><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEju9kjUkuKtyVni9JnNl9O25vJYqoZC2HoNxGbdeV45QBzhFc3NREgHZs_CSvYCsOlu0NSxKpINczExRqtXboyxwteetjQvKjSaGKd2RPvCQChR22sJYzNk2liWQjo_Vk3TC0mHhyUJvRc/s1600-h/jaxrs_04.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5415247925649117458" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEju9kjUkuKtyVni9JnNl9O25vJYqoZC2HoNxGbdeV45QBzhFc3NREgHZs_CSvYCsOlu0NSxKpINczExRqtXboyxwteetjQvKjSaGKd2RPvCQChR22sJYzNk2liWQjo_Vk3TC0mHhyUJvRc/s400/jaxrs_04.jpg" /></a> 서버는 글래스피시 V3 도메인으로 잡고, JavaEE 6 web으로 잡았습니다.<br />(하지만, EE5로 잡으셔도 이 작업은 정상적으로 됩니다)<br />마침 클릭<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgR4qognl4UucWsqJzla_FpZon_yIoDGJB2W5hUgc4S9KS58IqEihqcbPIwgVRm9-pbzzGge2-r0gE_tdo62fQ2GDSPstiw0i6aoZBvKdeUfUycQgYUG_B19x83izSDfY6m68xf01BfHWU/s1600-h/jaxrs_05.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 266px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5415247922488945362" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgR4qognl4UucWsqJzla_FpZon_yIoDGJB2W5hUgc4S9KS58IqEihqcbPIwgVRm9-pbzzGge2-r0gE_tdo62fQ2GDSPstiw0i6aoZBvKdeUfUycQgYUG_B19x83izSDfY6m68xf01BfHWU/s400/jaxrs_05.jpg" /></a> 이제 JAX-RS를 위한 작업을 시작하도록 하겠습니다. </p><br /><br /><p>이번 예제에서는 데이터베이스에서 RESTful Web Service 를 바로 만들 예정인지라, 해당 작업을 위해서는 persistence.xml 이 사전에 작업되어 있어야 합니다.</p><br /><br /><p>따라서 persistence.xml 을 먼저 작업합니다.</p><br /><br /><p>프로젝트에서 오른쪽 마우스 클릭 - new - other <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjM2gbKVEfvY5crxg0h6o6cdKMxYsVrProXZ4viU-YZW0TKHyXjKTYbeu_x3DnV8IjLWCGZwHAUnBpgEUTvILklYeHij0t768U2KXGA4uCR0jWecEXCHNg7xwrhq9dj6dAGFob42z53JkA/s1600-h/jaxrs_06.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 338px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5415249565619306962" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjM2gbKVEfvY5crxg0h6o6cdKMxYsVrProXZ4viU-YZW0TKHyXjKTYbeu_x3DnV8IjLWCGZwHAUnBpgEUTvILklYeHij0t768U2KXGA4uCR0jWecEXCHNg7xwrhq9dj6dAGFob42z53JkA/s400/jaxrs_06.jpg" /></a>persistence(정보보전)카테고리에서 persistence unit (퍼시스턴스 유닛) 선택</p><br /><br /><p>다음 클릭<br /></p><br /><br /><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-gJg44VsA6ZV40JWfRRrnOm7dgw76rjD3bhbnJ81QaC3ytRomK_VDz7b5l5mKExnRQESe4cDeUtrogVUJyojN8VTuFiYgPX4FdjlruScc8YUnezLfpWSTyOHCsETjfBDuVkWUIHMMc_s/s1600-h/jaxrs_07.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5415249558144516018" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-gJg44VsA6ZV40JWfRRrnOm7dgw76rjD3bhbnJ81QaC3ytRomK_VDz7b5l5mKExnRQESe4cDeUtrogVUJyojN8VTuFiYgPX4FdjlruScc8YUnezLfpWSTyOHCsETjfBDuVkWUIHMMc_s/s400/jaxrs_07.jpg" /></a> 이름이 해당 프로젝트 명+PU 라고 붙습니다. 그냥 그대로</p><br /><br /><p>제공자가 toplink(default:이전)에서 EclipseLink(JPA 2.0-default-새거)로 바꿨군요. 뭐..그냥 그대로,</p><br /><br /><p>데이터소스는 jdbc/sample (WAS인 글래스피시에 기본적으로 작업된 데이터소스입니다. )주고,</p><br /><br /><p>이미 있는 데이터베이스 테이블을 사용할 예정인지라 테이블 생성 전략(Table Create Strategy)는 none (없음)으로..</p><br /><br /><p>마침 클릭<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuc9rUiMg0vdqfyYZZOVGNXR6tRLNE3VwWGpjXXRqnyZLZrCpZdgLjLpfKTkxF8io7ToSXFwbGsI4uDoncsKIC1edtHd0yQ4a2Wc1Jy07M1vbDcUCq4yPjxp6vBWI-Q48sX9e2G_f5dS4/s1600-h/jaxrs_08.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 257px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5415249555709408770" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuc9rUiMg0vdqfyYZZOVGNXR6tRLNE3VwWGpjXXRqnyZLZrCpZdgLjLpfKTkxF8io7ToSXFwbGsI4uDoncsKIC1edtHd0yQ4a2Wc1Jy07M1vbDcUCq4yPjxp6vBWI-Q48sX9e2G_f5dS4/s400/jaxrs_08.jpg" /></a> 이제 JAX-RS를 만들도록 하겠습니다.</p><br /><br /><p>다시 프로젝트에서 오른쪽 마우스 클릭 new - other 클릭<br /></p><br /><br /><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSlzxWsHVZTOE8FXBqfKsKc6IdiPCf4KuCPJuksyxDEBUgFx9u-MBUztIE7Hy97T6gSUZ2eElNwFwknE2TKfZ_eXH5XHtT4ltFk5kN4L83ZsKofYMQcCnMxje0envVS1Z3Z54R2wtawqs/s1600-h/jaxrs_09.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 338px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5415249549815380082" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSlzxWsHVZTOE8FXBqfKsKc6IdiPCf4KuCPJuksyxDEBUgFx9u-MBUztIE7Hy97T6gSUZ2eElNwFwknE2TKfZ_eXH5XHtT4ltFk5kN4L83ZsKofYMQcCnMxje0envVS1Z3Z54R2wtawqs/s400/jaxrs_09.jpg" /></a> 웹 서비스(Web Services)에 보면 RESTful Web Service from Database 가 있습니다.</p><br /><br /><p>선택 후 다음 클릭<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqncJ1KNZesMQ9xnLizdFO2BbMgIZ8HK2b43P0_2TfPdB-lKOXQyO0okNBZoeyb7xwvJmJ1Yt0uX3WG-Zxlm5qM9NPch5bTkhoP50wMsrh8Hn97_9rHEOUJGl_I7M0wKsl0zxVfj9iaqw/s1600-h/jaxrs_10.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5415249540275185858" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqncJ1KNZesMQ9xnLizdFO2BbMgIZ8HK2b43P0_2TfPdB-lKOXQyO0okNBZoeyb7xwvJmJ1Yt0uX3WG-Zxlm5qM9NPch5bTkhoP50wMsrh8Hn97_9rHEOUJGl_I7M0wKsl0zxVfj9iaqw/s400/jaxrs_10.jpg" /></a> </p><br />데이터소스로 jdbc/sample을 지정하면 아래 사용가능한 테이블에 해당 스키마의 테이블들이 올라옵니다. 그럼 그 중 필요한 테이블들을 선택하면 됩니다<br /><br />( 음.. 이 대목에서 캡처에 실수가..ㅋㅋ MYTABLE은 sample 에 원래 들어있는게 아니라 다른 예제때문에 들어간 거라는.. 넘 자세히 보시지 마세용~ ㅎㅎ) 아무튼 저는 모두 추가로 하고 다음 클릭<br /><br /><br /><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyMng4OTOSdOXsEoTuOVNp6AjuPUMlB-JS9umKzLEyOZgT0DCkOFR0iI1djdXGW6ph86y_IFGeh-0qAbrA34T6NshRbQWqSinlA7Dyo7fn3SqS4BU4AF3MP93DWjRxN31Ni5ycb8lw6eA/s1600-h/jaxrs_11.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 260px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5415251195532846690" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyMng4OTOSdOXsEoTuOVNp6AjuPUMlB-JS9umKzLEyOZgT0DCkOFR0iI1djdXGW6ph86y_IFGeh-0qAbrA34T6NshRbQWqSinlA7Dyo7fn3SqS4BU4AF3MP93DWjRxN31Ni5ycb8lw6eA/s400/jaxrs_11.jpg" /></a> 데이터베이스의 테이블에서 엔티티 클래스로의 전환이 표시 됩니다. </p><br /><br /><p>표시된 내용 확인 한후 적절한 패키지 명을 줍니다</p><br /><br /><p>(저는 그냥 a 라고 줬습니다) 다음 클릭<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqwkURDv_OWTkyqI9n0hYqpl3N0QWl3Ze7-5CuQnJ6UwCgouy-PNAsZFOxeY-94a86ZF3EFngqjGEEXadDwHaoqemGhXDTwS8WGo7f6uUsb-Jay28ri74rsvXAvz6RyiAgP1sEm7eqZtQ/s1600-h/jaxrs_12.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 260px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5415251191123500578" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqwkURDv_OWTkyqI9n0hYqpl3N0QWl3Ze7-5CuQnJ6UwCgouy-PNAsZFOxeY-94a86ZF3EFngqjGEEXadDwHaoqemGhXDTwS8WGo7f6uUsb-Jay28ri74rsvXAvz6RyiAgP1sEm7eqZtQ/s400/jaxrs_12.jpg" /></a> Helper 들이 만들어질 패키지 명 (헬퍼 클래스로는 service/와 converter/ 시리즈가 만들어집니다)</p><br /><p>마침 클릭<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggzRk6szOKJOAIJrTIM1pS-M9YuYTd3MMIb5_-ysGeBzL-KQDO4vCbENfPCqPr3NV_QhmVGanNZhdYL8eOK1PLBvxeVCFV0WNxM2geC_0xsQLhsG6Bzbf7BGiv9uQgelrhjGIivErtsQ0/s1600-h/jaxrs_13.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 260px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5415251186806893026" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggzRk6szOKJOAIJrTIM1pS-M9YuYTd3MMIb5_-ysGeBzL-KQDO4vCbENfPCqPr3NV_QhmVGanNZhdYL8eOK1PLBvxeVCFV0WNxM2geC_0xsQLhsG6Bzbf7BGiv9uQgelrhjGIivErtsQ0/s400/jaxrs_13.jpg" /></a> 그럼 다음과 같은 팝업창이 뜨는데, REST 리소스에 대한 구성입니다.</p><br /><br /><p>모든 REST 리소스들을 자동으로 넷빈이 생성해주는 첫번째가 디폴트고 이번엔 이걸로 그냥 작업했습니다.</p><br /><p>경로 확인(/resource) OK 클릭</p><br /><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVOT2slAuvvcZnskS0F3KfILDCPMrsBWMHSG6AgvuhGJfQfkIBXURqIzoqexW77sNVPzritQg4VJoZkDRE2314Q37J5j031WIZlaRxLJdBssRx382O0Gs4MyL58-sPc9xdwmWJ7UCfZr0/s1600-h/jaxrs_14.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 231px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5415251183164811042" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVOT2slAuvvcZnskS0F3KfILDCPMrsBWMHSG6AgvuhGJfQfkIBXURqIzoqexW77sNVPzritQg4VJoZkDRE2314Q37J5j031WIZlaRxLJdBssRx382O0Gs4MyL58-sPc9xdwmWJ7UCfZr0/s400/jaxrs_14.jpg" /></a> 그럼 한참을 작업한 후 (자동 작업중 중간에 오류들이 올라올 수도 있습니다만, 그건 만들어지면서 서로 찾는 거라 다 끝나면 모든 오류없이 저렇게 구성되어 있습니다. </p><br /><br /><p>여기서 Source 패키지 안에 만들어진 java 를 열어 편집기에서 내용을 본 거고, 아래 RESTful WebServices 경로를 확장시켜 놓은 그림입니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJ1PPKvOfVbTkGXq_wN8uebG2AOOFTSU23_T1PuOdHL72o_pCJzOx4ol4b-0JoMEUV-B2cXu3aKrUWD-AYf9-_N0wM9DGY_TSA3m6e2osSLBN0a80HDkXNP06pCgIcVo3p5afAO-dxvjU/s1600-h/jaxrs_15.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 338px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5415251172884391490" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJ1PPKvOfVbTkGXq_wN8uebG2AOOFTSU23_T1PuOdHL72o_pCJzOx4ol4b-0JoMEUV-B2cXu3aKrUWD-AYf9-_N0wM9DGY_TSA3m6e2osSLBN0a80HDkXNP06pCgIcVo3p5afAO-dxvjU/s400/jaxrs_15.jpg" /></a> </p><br />이제 서버에 배포..Deploy<br /><br /><br /><p><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 338px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5415264870094877010" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjonoWjgFEgZQpfcnZKT12Pgl47JXnaiGm-tyyK1VkFWTkd_koMWHDe0SXzB4FGFf7UkRo_rX-sQBi-tC43GmwPcaULbEfcxlKaazllVoT5k0eAhZpNLG4bmDsh6ZXeXigW801Q5Yxva4c/s400/jaxrs_16.jpg" /></p><br /><br /><p>배포작업이 끝나면 해당 웹 서비스를 테스트 해볼 수가 있습니다.</p><br /><br /><p>프로젝트에서 오른쪽 마우스 - TEST RESTful Web Services 메뉴 클릭</p><br /><br /><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgb2zQS0TCSS7p5Mc2pP0xK8fFRvWWBVQ3bDhFMx6UqW3kkT0bwEv_vL5BkUS71O_BjnG8zmHLxvQm8swhR88cAm1AAaGihE7pDMHm8IL7fC0T9creUv_qN5NnIrZW3iV8c53Lc_wNnhz8/s1600-h/jaxrs_17.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 338px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5415264867538959586" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgb2zQS0TCSS7p5Mc2pP0xK8fFRvWWBVQ3bDhFMx6UqW3kkT0bwEv_vL5BkUS71O_BjnG8zmHLxvQm8swhR88cAm1AAaGihE7pDMHm8IL7fC0T9creUv_qN5NnIrZW3iV8c53Lc_wNnhz8/s400/jaxrs_17.jpg" /></a> 그럼 웹 브라우저에 테스트 할 수 있도록 페이지가 연결됩니다.</p><br /><br /><p>여기서 원하는 내용을 테스트 하면 됩니다.</p><br /><br /><p>저는 아래쪽의 Product 에서 주욱 확장해서 productID 값 하나 넣는 걸로 테스트</p><br /><br /><p>productID 값으로 980001 을 주고 Test 버튼을 눌렀습니다.</p><br /><br /><p>아래 창에 해당 내용의 Resource URL 들이 REST가 공급되는 내용입니다.</p><br /><br /><p>나머지 사항들도 여러 뷰들로 확인해보시길..<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIgtWO058xEz6pmDHhedffKyr-1CyVDmZdt1WXzA0TduzHgZeeyrT7cgV4SWQeqkwnBhj7jvtN9_6JvAvqs0fpG8rFKFs-WEEnE8bl7hdQw5P14zZ8DdZGerSkPWyowpR-M8VLHpyx1ZU/s1600-h/jaxrs_18.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 340px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5415264863614574786" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIgtWO058xEz6pmDHhedffKyr-1CyVDmZdt1WXzA0TduzHgZeeyrT7cgV4SWQeqkwnBhj7jvtN9_6JvAvqs0fpG8rFKFs-WEEnE8bl7hdQw5P14zZ8DdZGerSkPWyowpR-M8VLHpyx1ZU/s400/jaxrs_18.jpg" /></a> 여기까지가 JAX-RS의 서버사이드 프로그래밍입니다. </p><br /><br /><p>이제 이걸로 클라이언트를 만들어 쓰면 되는데 가장 쉽고 뭔가 좀 그럴듯 한게 JMaki의 DOJO Table 이었는데 넷빈 6.8 에서 JMaki가 아직 정식 지원이 안되는 군요.. 음.. 노가다로 하기 시른데..쩝.. 노가다로 하려면야 JavaFX던 스윙이던 본인 맘대로 되지만..</p><br /><br /><p>아무튼.. 뭔가 올라오는 대로 글 만들어보도록 하겠습니다.</p></div>강여사(J.Y.Kang)http://www.blogger.com/profile/17450510931308610527noreply@blogger.com0tag:blogger.com,1999:blog-6811062799606447528.post-49641009819902633052009-12-13T18:44:00.000-08:002010-07-01T04:02:15.945-07:00netbean 6.8에서 JSTL -(glassfish v3, tomcat 6)JSTL 1.2 와 데이터베이스를 연동하는 예제입니다.<br /><br />DB는 JavaDB(Derby의 sample)을 사용<br />WAS 로는 glassfish v3 preview를<br />WS 로는 tomcat 6.0.20 을 사용합니다.<br /><br />EE버전은 모두 5이고, JSTL 1.2 (1.1사용) 입니다.<br /><br />우선 웹 프로젝트를 만듭니다.<br />new project <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvuCLGTdkRPbk7n7ogAh67lII0_KQVzehdpv8bb7tMspG9CJ6fQ3wKDbrYuovCiX5MN2z3k_BsGbp1Zs5V2z6Pgf3IR3I_OQIcGR6ngQQWYMq7llbvLBI-GddOPAsxCMpH3e3aZrQNyqY/s1600-h/jstl_01.jpg"></a><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvuCLGTdkRPbk7n7ogAh67lII0_KQVzehdpv8bb7tMspG9CJ6fQ3wKDbrYuovCiX5MN2z3k_BsGbp1Zs5V2z6Pgf3IR3I_OQIcGR6ngQQWYMq7llbvLBI-GddOPAsxCMpH3e3aZrQNyqY/s1600-h/jstl_01.jpg"><br /><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 353px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5414909057382966434" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvuCLGTdkRPbk7n7ogAh67lII0_KQVzehdpv8bb7tMspG9CJ6fQ3wKDbrYuovCiX5MN2z3k_BsGbp1Zs5V2z6Pgf3IR3I_OQIcGR6ngQQWYMq7llbvLBI-GddOPAsxCMpH3e3aZrQNyqY/s400/jstl_01.jpg" /></a>JavaWeb 에 Web application 선택 , 다음 클릭<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSCWaN4WR7SpDB03CK6LyzsP9VFIiTDfp1HFLiSy-zoILPtFPHX5HsW0O9I2eAO-xPBFdHPuQPjDrtUroPovP1H6J__GPucrgDk_ktcIev4EZzZLgXEnqS0x3-CAVtDXAPQEW4wYU-8fE/s1600-h/jstl_02.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5414909056410847074" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSCWaN4WR7SpDB03CK6LyzsP9VFIiTDfp1HFLiSy-zoILPtFPHX5HsW0O9I2eAO-xPBFdHPuQPjDrtUroPovP1H6J__GPucrgDk_ktcIev4EZzZLgXEnqS0x3-CAVtDXAPQEW4wYU-8fE/s400/jstl_02.jpg" /></a> 프로젝트의 이름은 JSTL를 끝에다 붙였습니다(적당히), 다음 클릭<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzsqgVJ7HkPnr4w8t-vSVRVSgNcZEFfc5TzRWbJIgTp4VEDKTUzjEC6JxFVCS-RGHqdEOD00Zq-dzHdjP3nvvInpt80WeAil1oRze4pkzJTRBvnWxNXIjt3u9-jcNZlD7JT4NuuQ7lx3Q/s1600-h/jstl_03.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 276px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5414909051089665810" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzsqgVJ7HkPnr4w8t-vSVRVSgNcZEFfc5TzRWbJIgTp4VEDKTUzjEC6JxFVCS-RGHqdEOD00Zq-dzHdjP3nvvInpt80WeAil1oRze4pkzJTRBvnWxNXIjt3u9-jcNZlD7JT4NuuQ7lx3Q/s400/jstl_03.jpg" /></a> 서버는 일단 glassfish v3 preview에서 먼저 작업하고 나중에 tomcat 으로 변경할 예정입니다.<br />따라서 기본설정된대로 glassfish v3 도메인 선택, 마침 클릭<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6VeJlmXnCtqjcEtnwWkTQ9yDitZY4bq6Ka08DUO3xQRo3cM9bpBBnecINGUSqJDF2eZKkrE86DlKj-r8tboVY81YmZnVEI6S5E8FiuIsS7a5VGgTLxzR2aBUdMGqJM5tBfZu6N9fTkdo/s1600-h/jstl_04.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 266px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5414909046542004514" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6VeJlmXnCtqjcEtnwWkTQ9yDitZY4bq6Ka08DUO3xQRo3cM9bpBBnecINGUSqJDF2eZKkrE86DlKj-r8tboVY81YmZnVEI6S5E8FiuIsS7a5VGgTLxzR2aBUdMGqJM5tBfZu6N9fTkdo/s400/jstl_04.jpg" /></a> 기본작업이 된 index.jsp 파일에서 오른쪽 파레트의 databases를 확장한 후 DB Report를 Hello World 아래 끌어다 놓습니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5V11nE6e7lbv2u5Kk-boskCpbI1NmgUORbXweLC8QS6OprzegVGqo0pKFiJYS1S55b5kbnrNM0Mem5a1ORzznt5PEKxkLODoAkhdoolF31x6Gqv3vpKfcYCsBJaaUWPdFR-HYCiKXBvg/s1600-h/jstl_05.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 353px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5414909040229696098" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5V11nE6e7lbv2u5Kk-boskCpbI1NmgUORbXweLC8QS6OprzegVGqo0pKFiJYS1S55b5kbnrNM0Mem5a1ORzznt5PEKxkLODoAkhdoolF31x6Gqv3vpKfcYCsBJaaUWPdFR-HYCiKXBvg/s400/jstl_05.jpg" /></a><br />그럼 데이터에 대한 설정이 나오는데 여기 Data Source 에는 jdbc/sample 을 쿼리문에는 select * from customer 를 입력합니다. (derby의 sample 데이터베이스의 customer 조회이며, glassfish에 jdbc/sample 이라는 이름으로 데이터소스 처리되어 있습니다.)<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOlC3Eg_NBZ-NKdQErSz_rCAL0S5kQ2p40S7iU9U_txT11znbSBpUe3TTen4N3Jh4bqmkzi8hlPP3KEecI22CdLbnnUx6uS-Dj6Jr99QkqIaQOcl6U_K0vjagSSBFVLuEdcbIrKVS94Xs/s1600-h/jstl_06.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 353px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5414911609171973042" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOlC3Eg_NBZ-NKdQErSz_rCAL0S5kQ2p40S7iU9U_txT11znbSBpUe3TTen4N3Jh4bqmkzi8hlPP3KEecI22CdLbnnUx6uS-Dj6Jr99QkqIaQOcl6U_K0vjagSSBFVLuEdcbIrKVS94Xs/s400/jstl_06.jpg" /></a> 그런 다음 web.xml (본인 프로젝트)에서 resource 작업을 합니다. resource 뷰를 선택합니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEih3gJAUp0OMdrIZFDpWCb7TJxQzsZJpst-DSnqsId0bcpsYsLfpJBSnXZyJBHcmxB3ylcwjZDWHUHmvd8u8FDD_k-92lf2NhuCNxsTRiPEHmjZyPx_GOyHKWSX7aBfe0pQrQYsbNLCNWY/s1600-h/jstl_07.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 338px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5414911602171438114" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEih3gJAUp0OMdrIZFDpWCb7TJxQzsZJpst-DSnqsId0bcpsYsLfpJBSnXZyJBHcmxB3ylcwjZDWHUHmvd8u8FDD_k-92lf2NhuCNxsTRiPEHmjZyPx_GOyHKWSX7aBfe0pQrQYsbNLCNWY/s400/jstl_07.jpg" /></a>resource ref 에서 add 버튼을 누르고 resource name을 jdbc/sample 로 기타는 기본 설정으로 OK 합니다. (만약 이 대목이 작업되지 않으면 jar 가 해당위치에 있어도 no suitable driver 에러가 납니다).<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUR4kAuDhwTTUtkTRnLCTlTNqVwk0_zjnxzb2iDMOb3Y7fECausYnUkrRQvvHYS7sEI514NAWNJOPpOPqIWKuktT8qfpIbDIqD6gYQJme86TNTVWXsbnGtqDxB7g_BpQfTI9eKLyydxfc/s1600-h/jstl_08.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 353px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5414911598847519746" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUR4kAuDhwTTUtkTRnLCTlTNqVwk0_zjnxzb2iDMOb3Y7fECausYnUkrRQvvHYS7sEI514NAWNJOPpOPqIWKuktT8qfpIbDIqD6gYQJme86TNTVWXsbnGtqDxB7g_BpQfTI9eKLyydxfc/s400/jstl_08.jpg" /></a> 실행(run)<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEht-FswjhVIDb2QUOZYs5MQDPrfn0SwshjqqRYQxZmuSBZny2Bt5lxW8Ku5PjWuHgfRpO5furStgqz3hmzgcI0BGIXjIwplfnzROIkw4Kl22TqVScznLIsleFaLoxhtE10oAIFDfjrSoXw/s1600-h/jstl_09.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 353px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5414911594645786770" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEht-FswjhVIDb2QUOZYs5MQDPrfn0SwshjqqRYQxZmuSBZny2Bt5lxW8Ku5PjWuHgfRpO5furStgqz3hmzgcI0BGIXjIwplfnzROIkw4Kl22TqVScznLIsleFaLoxhtE10oAIFDfjrSoXw/s400/jstl_09.jpg" /></a> 정상 수행결과입니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlutZlczeLVjpjUVIPCnio2HcuFnCAbqfaOi_wdRdcZ3Kshp_q7zBenmzwlmHR_T3e8pOF6NJ8c0FlMuhC8VIa8IR4K_GAye5LZJeKXNVT5jD3X55hAAcULU1Pdz1cGGj06ChDzmPVreo/s1600-h/jstl_10.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 252px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5414911590617286114" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlutZlczeLVjpjUVIPCnio2HcuFnCAbqfaOi_wdRdcZ3Kshp_q7zBenmzwlmHR_T3e8pOF6NJ8c0FlMuhC8VIa8IR4K_GAye5LZJeKXNVT5jD3X55hAAcULU1Pdz1cGGj06ChDzmPVreo/s400/jstl_10.jpg" /></a><br />이번에는 서버를 톰캣으로 변경해보겠습니다. 톰캣에는 glassfish 와는 달리 여러가지가 작업이 안되어 있으므로 추가 설정해야 할 게 많습니다. 일단 해당 프로젝트에서 서버 변경부터 시작하겠습니다.<br />프로젝트에서 오른쪽 마우스 클릭 - properties 선택<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyoRGn5OI7WoS9WQ-0jbVHyDrwN7jOnrAxZ6VMRt0h4LQX7TMoQjj7ktSM5PvmDdHYDWoHSdXNq4OQbFVMLHD_ePGlR5k13vwfsiaNiP7cf1xBQPA1pn8G4-SIrAHnzMZqA8wgw03EjDU/s1600-h/jstl_11.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 353px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5414912824822578018" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyoRGn5OI7WoS9WQ-0jbVHyDrwN7jOnrAxZ6VMRt0h4LQX7TMoQjj7ktSM5PvmDdHYDWoHSdXNq4OQbFVMLHD_ePGlR5k13vwfsiaNiP7cf1xBQPA1pn8G4-SIrAHnzMZqA8wgw03EjDU/s400/jstl_11.jpg" /></a> RUN 에서 서버를 Apache Tomcat 6.0.20 으로 변경합니다.<br />확인 클릭<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilw8VwkKDuArGoinB5g2yyUX9ZkxUl-6MKSmACaLTH2qhaNrwLt0myv35DHNNp1031hKcVc44wR1yy7MGOLg5Q9AjV9wDWXKa2tfyYd9Zorq-suSnLv4xYhgBfcyQ-hMiy3DnMQZ6S-oo/s1600-h/jstl_12.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 275px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5414912821378330946" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilw8VwkKDuArGoinB5g2yyUX9ZkxUl-6MKSmACaLTH2qhaNrwLt0myv35DHNNp1031hKcVc44wR1yy7MGOLg5Q9AjV9wDWXKa2tfyYd9Zorq-suSnLv4xYhgBfcyQ-hMiy3DnMQZ6S-oo/s400/jstl_12.jpg" /></a> 톰캣으로 변경하면 프로젝트에 자동으로 context.xml 작업이 되는데 META-INF 안에 있습니다.<br />해당 파일을 연 후, 마지막에 /> 이 부분을 > 으로 바꾸고, 그 안에 다음 내용을 작업해 넣습니다.<br />===================================================================<br /><Context antiJARLocking="true" path="/WebApplicationJSTL"><br /><Resource name="jdbc/sample" auth="Container" type="javax.sql.DataSource"<br />maxActive="100 maxIdle="30" maxWait="10000"<br />username="app" password="app" driverClassName="org.apache.derby.jdbc.ClientDriver"<br />url="jdbc:derby://localhost:1527/sample"/><br /></Context><br />===================================================================<br /><resource maxwait="10000" maxidle="30" maxactive="100" driverclassname="org.apache.derby.jdbc.ClientDriver" auth="Container" name="jdbc/sample" password="app" type="javax.sql.DataSource" url="jdbc:derby://localhost:1527/sample" username="app"><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJ_8qvpBGf8McVd2Z-7qG6eUccYCrGbwYtTROHntBXFpPf-iFC3GrobfbGRk71Sow9u9IFJVzM5Q93XRJ4p2g2mWz_w_k41lGjsMv3Y8EX94lOAYdkWp52iylcG1LzYGyfkcaIAWJruSM/s1600-h/jstl_13.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 353px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5414912817298040258" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJ_8qvpBGf8McVd2Z-7qG6eUccYCrGbwYtTROHntBXFpPf-iFC3GrobfbGRk71Sow9u9IFJVzM5Q93XRJ4p2g2mWz_w_k41lGjsMv3Y8EX94lOAYdkWp52iylcG1LzYGyfkcaIAWJruSM/s400/jstl_13.jpg" /></a>그런 다음 derby의 드라이버를 tomcat_home/lib 안에 복사해 넣습니다. (derby.jar, derbyclient.jar, derbynet.jar 3개)<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBuIlZqBpwFyB1idPkJz4fWRguOu7p_mZ11AZFirvQVwtx6i9lytqa5IoSWsGi98ZGjJ5PyYM6rVSCy-AiPbSpKEiRf48ivX9iVniGkYa0iHDdmhoCHtnvSCiMbfllGzpsPNHPFyCTe6A/s1600-h/jstl_14.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 294px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5414912813923444594" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBuIlZqBpwFyB1idPkJz4fWRguOu7p_mZ11AZFirvQVwtx6i9lytqa5IoSWsGi98ZGjJ5PyYM6rVSCy-AiPbSpKEiRf48ivX9iVniGkYa0iHDdmhoCHtnvSCiMbfllGzpsPNHPFyCTe6A/s400/jstl_14.jpg" /></a> 그리고 JSTL 관련파일을 프로젝트의 라이브러리에 추가합니다.<br />프로젝트의 library 에서 오른쪽 마우스 클릭 - 라이브러리 추가 를 선택합니다<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAyDep1A87qDWe8QSMcuSfmPu-lgwwpHC01zH1fCZN3y3zxTWGbDfJaRqVlRcqelvG9a_oAva0WfS0fcqwiDU05qJ9VPxoXj2GO1Cp4OzwdLW6jJlTaewzZMKR0BqXZejCYFsEgNdr7Ao/s1600-h/jstl_15.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 353px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5414912802905547154" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAyDep1A87qDWe8QSMcuSfmPu-lgwwpHC01zH1fCZN3y3zxTWGbDfJaRqVlRcqelvG9a_oAva0WfS0fcqwiDU05qJ9VPxoXj2GO1Cp4OzwdLW6jJlTaewzZMKR0BqXZejCYFsEgNdr7Ao/s400/jstl_15.jpg" /></a><br />라이브러리에서 JSTL 1.1 을 선택하여 아래 추가 버튼을 누릅니다.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQYIpUK7QkOy6HMuapC3T2aKMVuN4D5eiN_3YoCXKKKcUjb7vNHD7lvxPuH_SiveVAxPjDWhF_EqoihEGt5ocR6k6zMK79iGysEMBOmYFaHxsBJ71BbUn_NerxR8NCl2BpgwVAHERgTMM/s1600-h/jstl_16.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 353px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5414914730296938706" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQYIpUK7QkOy6HMuapC3T2aKMVuN4D5eiN_3YoCXKKKcUjb7vNHD7lvxPuH_SiveVAxPjDWhF_EqoihEGt5ocR6k6zMK79iGysEMBOmYFaHxsBJ71BbUn_NerxR8NCl2BpgwVAHERgTMM/s400/jstl_16.jpg" /></a> 그런 다음 deploy 를 합니다(이때 base에 context.xml 이 반영됩니다)<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnJRGowmIYMe6EBtoKpRWYqViBCNX8QJ1iGRlAsw-jG3uDkaPzu6bZdlILEy_63TPhFl3Q-K4W1pXEAmQmdnmmJ2A2xor18ICAHQ5qH352ozafi7GC_cGo4oyuHbiH-sFC9ma_2x9CkGA/s1600-h/jstl_17.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 353px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5414914720359186434" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnJRGowmIYMe6EBtoKpRWYqViBCNX8QJ1iGRlAsw-jG3uDkaPzu6bZdlILEy_63TPhFl3Q-K4W1pXEAmQmdnmmJ2A2xor18ICAHQ5qH352ozafi7GC_cGo4oyuHbiH-sFC9ma_2x9CkGA/s400/jstl_17.jpg" /></a> 이제 run (실행) 합니다<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDFcOMNjELDggwPt9o_X7-n8TtNBnitnJhcGVfW-vGwm-dv7T4DzzLwmPuMOnIgJhd2saoTyGKB9CTMvdTORuu6e1I4PgM83Xx397da8zwX3Z0J7KVDXfeVA6kJfDvi78M3FugXggM3uk/s1600-h/jstl_18.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 353px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5414914712439110050" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDFcOMNjELDggwPt9o_X7-n8TtNBnitnJhcGVfW-vGwm-dv7T4DzzLwmPuMOnIgJhd2saoTyGKB9CTMvdTORuu6e1I4PgM83Xx397da8zwX3Z0J7KVDXfeVA6kJfDvi78M3FugXggM3uk/s400/jstl_18.jpg" /></a> 톰캣에서도 정상적으로 수행됩니다<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7HC5RwfEKgyGm375eyJI1HFGjdCxoBbt3apRm2SaI5RkbUnJBJAB7ajxbG2TMXsRxr9S77URf1NTVDHBQ8xC3LYy5gMp8dfdznRl66fMnn4_9Bbjo4mHzQcNbXoUU2gVkJl3tOu8Z41w/s1600-h/jstl_19.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 252px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5414914706805592114" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7HC5RwfEKgyGm375eyJI1HFGjdCxoBbt3apRm2SaI5RkbUnJBJAB7ajxbG2TMXsRxr9S77URf1NTVDHBQ8xC3LYy5gMp8dfdznRl66fMnn4_9Bbjo4mHzQcNbXoUU2gVkJl3tOu8Z41w/s400/jstl_19.jpg" /></a>강여사(J.Y.Kang)http://www.blogger.com/profile/17450510931308610527noreply@blogger.com0