'분류 전체보기'에 해당되는 글 2491건

  1. 2008.11.12 GlassFish v2에서 SSL 사용하기
  2. 2008.11.12 GlassFish v2: Open for Business
  3. 2008.11.12 Sun Developer J2EE 문서
  4. 2008.11.12 향상된 루프문
  5. 2008.11.12 보안서버 SSL 구축 - Aapche1.3.x + mod_ssl
  6. 2008.11.12 보안서버 SSL 구동시 비밀번호 자동 입력 및 부팅시 자동 시작
  7. 2008.11.12 SSL 보안인증서 설치
  8. 2008.11.12 JSTL
  9. 2008.11.12 JSTL과 Velocity를 활용한 UI 레이어 구현 방법
  10. 2008.11.11 엑셀 사업자번호 가운데 0 빠진거 입력
  11. 2008.11.11 html 파싱...
  12. 2008.11.10 HTML 태그 제거 정규식
  13. 2008.11.10 작지만 강력한 HTML 파서, HtmlCleaner
  14. 2008.11.10 파싱된 소스코드 확인하기: 주소창에 다음 코드를 입력 후 Enter
  15. 2008.11.10 아래 코드는 현재 블로그에서 적용되고있는 스크립트입니다.
  16. 2008.11.10 ORACLE Creating Database Links v1.0
  17. 2008.11.10 영어문서를 음성파일로 바꿔주는 웹사이트 ispeech.org
  18. 2008.11.10 시작하는 JAVA프로그래머를 위해 자바강좌 (특히 비 전공자분들께)
  19. 2008.11.08 Solaris 정리 -1
  20. 2008.11.08 Solaris (Sprac) 하드 포멧및 인식하는 방법 sun e3500
  21. 2008.11.07 Solaris 10 하드추가 파티션 설정 1
  22. 2008.11.07 Solaris10 +Oracle10G 설치기 & 삽질기 22
  23. 2008.11.07 solaris를 설치하고 나서 Network이 되지 않을 때 체크할 사항들입니다.
  24. 2008.11.07 윈디하나의 솔라나라: 솔라리스 10 u6 기본설정
  25. 2008.11.07 IPMP (IP MultiPathing) 설정하기 (solaris8 이상 지원) 1
  26. 2008.11.07 Solaris 10 에서 openvpn 서버 설치하기
  27. 2008.11.07 컴퓨터 부팅시 비프음 소리에 의한 진단법
  28. 2008.11.06 솔라리스에 여러가지설치
  29. 2008.11.06 솔라리스 - 아파치 + 톰캣 + 오라클 구축 문서
  30. 2008.11.06 solaris 10 Tomcat 설치
98..Etc/GlassFish2008. 11. 12. 17:04
반응형

대부분의 엔터프라이즈 애플리케이션은 안전한 환경에서 실행할 필요가 있습니다. TLS(Transport Layer Security)/SSL(Secure Sockets Layer)은 포인트 투 포인트 보안 전송 메커니즘으로, 클라이언트 및 서버 간에 교환되는 메시지를 인증하고 메시지의 무결성 및 기밀성(confidentiality) 보장을 위해 사용할 수 있습니다. TLS/SSL(이 팁에서는 간단히 "SSL")은 대부분의 엔터프라이즈 애플리케이션 환경의 보안 요구사항을 충족하며 널리 채택되고 있습니다.

그러나 SSL에 의해 보호된 메시지 교환을 위해서는 서버가 SSL 서버로서 작동할 수 있어야 합니다. 이 팁에서는 GlassFish v2 애플리케이션 서버를 SSL 서버로 작동시키는 방법을 제시합니다.

각 단계별 설명으로 나아가기 전에, 키와 인증서와 같은 SSL의 기본 개념 몇 가지를 이해해야 하며 프로파일이라는 GlassFish v2의 개념도 이해할 필요가 있습니다.

키와 인증서

SSL에서 두 가지 중요한 개념은 키와 인증서입니다. 키는 클라이언트와 서버 사이의 트랜잭션에서 개인 정보 보호(privacy)와 신뢰(trust)를 구축하는 데 사용됩니다. SSL은 공개 키 암호화를 사용하며 이는 키 페어(key pairs)를 기반으로 합니다. 키 페어에는 하나의 공개 키와 하나의 개인 키가 포함됩니다. 데이터가 하나의 키로 암호화된 경우, 그것은 오직 그 페어의 나머지 한 키로만 해독될 수 있습니다.

인증을 위해서는 인증서가 사용됩니다. SSL을 사용하기 위해서는 서버에 연결할 수 있는 각 클라이언트의 IP 주소에 대해 각기 연관된 인증서가 있어야 합니다. 인증서는 서버 사이트의 소유자를 식별하며 관련 정보를 제공합니다. 인증서는 소유자에 의해 디지털로 암호화한 서명이 포함됩니다. 인증이 증요한 사이트의 경우, 인증서는 잘 알려진 신뢰성 있는 인증 기관으로부터 구입할 수 있습니다. 그러나 인증이 크게 중요하지 않은 사이트의 경우에는 자가 서명 인증서(self-signed certificate)를 사용할 수도 있습니다.

GlassFish v2 프로파일

GlassFish v2는 다양한 용도의 프로파일을 지원합니다. 각 프로파일은 애플리케이션 서버에 대한 구성 매개변수를 미리 설정하여 특정 유형의 용도로 최적화합니다. 세 가지 프로파일에는 개발자(developer), 클러스터(cluster) 및 엔터프라이즈(enterprise)가 있습니다.

개발자 프로파일은 개발 환경에서 사용하기 위해 GlassFish v2를 최적화합니다. 이는 구성 매개변수가 빠른 구동(fast startup)과 같은 목표는 지원하지만 로깅 또는 세션 복제와 같은 기능은 지원하지 않는다는 의미입니다. 클러스터 프로파일은 클러스터 생성 및 세션 복제를 가능하게 하는 구성 매개변수를 설정합니다. 클러스터는 GlassFish v2 인스턴스의 그룹으로 단일 논리 개체로서 관리하고 모니터할 수 있습니다. 엔터프라이즈 프로파일은 프로덕션 환경으로 GlassFish v2를 최적화합니다. 또한 로깅 및 기타 보안 관련 기능을 지원합니다.

GlassFish v2 애플리케이션 서버를 SSL 서버로 작동시키기

GlassFish v2를 SSL 서버로 작동시키는 단계는 애플리케이션 서버를 위해 사용된 프로파일에 따라 결정됩니다. 먼저 개발자 프로파일이 사용되는 경우의 프로세스를 살펴본 다음 엔터프라이즈 프로파일이 사용될 때의 프로세스를 검토합니다.

개발자 프로파일이 사용되는 경우

GlassFish v2 프로파일이 특정 유형의 용도를 위해 구성 매개변수를 미리 설정한다는 점을 상기하십시오. 이들 매개변수 중 하나가 Security Store인데 이것은 인증서와 키와 같은 보안 및 신용 관련 정보가 어떻게 저장되는지를 나타냅니다. 개발자 프로파일의 경우 Security Store 값은 JKS로 설정됩니다. 이 경우 서버에 대한 인증서와 키는 자바 키스토어 파일(keystore.jks)에 저장되며 인증서는 신뢰할 수 있는 CA에 의해 발행되며 인증서 파일(cacerts.jks)에 저장됩니다.

GlassFish v2를 설치할 때 서버 인증서로 자가 서명 인증서가 기본적으로 생성됩니다. 그러나 인증이 사용자의 사이트에서 중요한 경우라면, 자가 서명 인증서를 CA로부터의 디지털 서명 인증서로 교체할 필요가 있습니다. 이 섹션에서는 자가 서명 인증서를 대체하는 방법, CA에서 서버 인증서를 확득하는 방법 및 서버 인증서를 키스토어로 가져오는 방법을 설명합니다.

아래에 기술된 단계에서는 키 및 인증서 관리 툴인 keytool을 사용합니다. Keytool은 여러 버전의 자바 플랫폼, 스탠다드 에디션(자바 SE) 개발 킷(jdk)에서 사용 가능합니다. 한편 자바 SE 6에서는 keytool.에 몇 가지 필수 기능이 추가되었습니다. 아래의 명령은 jdk 6 버전의 keytool을 기반으로 합니다. keytool에 대한 자세한 정보는 JDK 툴 및 유틸리티를 참조하십시오.

다음은 애플리케이션 서버가 개발자 프로파일로 구성될 때 GlassFish v2를 SSL 서버로 작동시키기 위한 명령문입니다.

  1. 다음 명령을 수행하여 기본적으로 설치된 자가서명 인증서를 삭제하십시오(참고: 이 단계와 이후의 단계의 명령문은 포맷을 위해 여러 줄에 걸쳐 표시되었음).        keytool -delete -alias s1as -keystore keystore.jks
           -storepass <store_passwd>

    이 때 <store_passwd>는 키스토어에 대한 비밀번호(예: "mypass")입니다. s1as는 GlassFish v2 키스토어의 디폴트 alias입니다.

  2. 다음 명령을 수행하며 애플리케이션 서버를 위한 새로운 키 페어를 생성하십시오.       keytool -genkeypair -keyalg <key_alg>
          -keystore keystore.jks -validity <val_days> -alias s1as

    이 때 <key_alg>는 키 페어 생성을 위해 사용되는 알고리즘(예: RSA)이며 <val_days>는 인증서의 유효일 수(예: 365)입니다.

    키 페어 생성 외에도 해당 명령문은 공개 키를 자가 서명 인증서로 보호하고 인증서와 비밀 키를 alias에 의해 식별되는 새로운 키스토어 엔트리에 저장한다는 점에 유의하십시오.

    인증서의 이름이 사용자 사이트의 완전한 호스트 이름과 일치하도록 보장하는 것이 중요합니다. 그 이름이 일치하지 않으면 서버에 연결하는 클라이언트는 인증서의 이름이 사이트의 이름과 일치하지 않는다는 보안 경고를 받게 될 것입니다. 기본적으로 설치된 자가서명 인증서의 이름이 완전한 호스트 이름과 일치하는지 알고 있어야 합니다.

  3. 다음 명령을 수행하여 CSR(Certificate Signing Request)을 생성하십시오.       keytool -certreq -alias s1as -file <certreq_file>
          -keystore keystore.jks -storepass <store_passwd>

    여기서 <certreq_file>은 CSR이 저장되는 파일(예: s1as.csr)이며 <store_passwd>는 키스토어에 대한 비밀번호(예: changeit)입니다.

  4. VeriSign과 같은 CA에 CSR을 제출하십시오. 그러면 사용자는 응답으로 서명된 서버 인증서를 받게 될 것입니다. CA의 CA 인증서뿐만 아니라 응답에서 CA가 식별한, 중간에 발생한 모든 인증서를 브라우저로 가져와야 합니다.
  5. CA로부터 받은 서명된 서버 인증서를 마커 -----BEGIN CERTIFICATE-----와 -----END CERTIFICATE----- 를 포함하여 s1as.cert와 같은 파일에 저장하십시오. CA 인증서 및 모든 중간 CA 인증서를 다운로드하고 로컬 파일에 저장하십시오. CA 및 중간 CA 인증서를 브라우저로 가져오는 방법에 대해서는 브라우저 문서를 참조하십시오. Mozilla 및 Internet Explorer와 같은 다양한 브라우저로 CA 인증서를 가져오는 방법에 대한 정보는 CA에서 제공할 수도 있습니다.
  6. 원래의 자가 서명 인증서를 CA로부터 획득한 인증서(s1as.cert와 같은 파일에 저장)로 대체하십시오. 이를 위해 keytool 을 사용할 수 있으나 여러 단계를 필요로 합니다. 다음 자바 프로그램을 수행하면 더 쉽게 대체할 수 있습니다.

          import java.io.*;
          import java.security.Key;
          import java.security.KeyStore;
          import java.security.cert.Certificate;
          import java.security.cert.CertificateFactory;
          import java.security.cert.X509Certificate;
         
           
          public class Main {
              public static void main(String[] args) throws Exception {
                //args[] error checking logic omitted
                //file containing signed cert reply from CA
                String csrReplyFromCA = args[0];    
                //Path to GlassFish keystore.jks
                String keystoreLocation = args[1];  
                //Password for GlassFish keystore.jks
                String keystorePassword = args[2];  
                //The keyalias to be replaced : s1as in our example
                String selfSignedKeyEntry = args[3];
                 
                //create the signed Cert
                Certificate cert = null;
                FileInputStream fis =
                   new FileInputStream(csrReplyFromCA);
                CertificateFactory cf =
                   CertificateFactory.getInstance("X.509");
                cert = cf.generateCertificate(fis);
                 
                //now replace the original entry
                char[] passwordChars =
                   keystorePassword.toCharArray();
                KeyStore keystore = KeyStore.getInstance("JKS");
                keystore.load(new FileInputStream(keystoreLocation),
                   passwordChars);
                Key key = keystore.getKey(selfSignedKeyEntry,
                   passwordChars);
                keystore.setKeyEntry(selfSignedKeyEntry, key,
                   passwordChars, (new Certificate[]{cert}));
                keystore.store(new FileOutputStream(
                   keystoreLocation), passwordChars);
              }
          }

프로그램을 수행한 후에, GlassFish 키스토어 내의 인증서 s1as가 더 이상 원래의 자가 서명 인증서가 아니라 CA로부터 받은 인증서(response certificate)라는 것을 확인해야 합니다. 다음은 VeriSign으로부터 획득한 새 s1as 인증서와 원래의 s1as 인증서를 비교한 예입니다.

원래의 s1as (자가 서명):

Owner: CN=KUMAR, OU=Sun Java System Application Server, O=Sun
Microsystems, L=Santa Clara, ST=California, C=US
Issuer: CN=KUMAR, OU=Sun Java System Application Server, O=Su
n Microsystems, L=Santa Clara, ST=California, C=US
Serial number: 472acd34
Valid from: Fri Nov 02 12:39:40 GMT+05:30 2007 until: Mon Oct
30 12:39:40 GMT+05:30 2017

새로운 s1as (CA로부터 서명된 인증서 포함):

Owner: CN=KUMAR, OU=Terms of use at www.verisign.com/cps/test
ca (c)05, OU=Sun Java System Application Server, O=Sun Micros
ystems, L=Santa Clara, ST=California, C=US
Issuer: CN=VeriSign Trial Secure Server Test CA, OU=Terms of
use at https://www.verisign.com/cps/testca (c)05, OU="For Test
Purposes Only. No assurances.", O="VeriSign, Inc.", C=US
Serial number: 1375de18b223508c2cb0123059d5c440
Valid from: Sun Nov 11 05:30:00 GMT+05:30 2007 until: Mon Nov
26 05:29:59 GMT+05:30 2007

이러한 단계를 수행한 후에 GlassFish v2를 다시 시작하고 CA에 의해 발행된 서명된 서버 인증서를 사용할 수 있습니다.

클러스터 프로파일이 사용되는 경우

애플리케이션 서버가 클러스터 프로파일로 구성되는 경우, GlassFish v2를 SSL 서버로 작동시키려면 개발자 프로파일에 대해 수행했던 것과 동일한 단계를 수행합니다. 그러나 이 경우에 동일한 서버 키가 클러스터 내의 모든 애플리케이션 서버 인스턴스에 복제된다는 것을 확실하게 알아 둘 필요가 있습니다.

엔터프라이즈 프로파일이 사용되는 경우

엔터프라이즈 프로파일을 위한 Security Store 매개변수는 NSS이며 이는 네트워크 보안 서비스(Network Security Services)를 나타냅니다. NSS 보안 인프라에는 JKS 키스토어가 없으며 따라서 디폴트 GlassFish 키스토어가 없습니다.

GlassFish v2 애플리케이션 서버를 SSL 서버로 작동시키는 단계는 개발자 프로파일이 사용될 때와 엔터프라이즈 프로파일이 사용될 때가 대체로 유사합니다. 그러나 두 가지의 차이점이 있습니다. 첫 번째 차이는 프로세스의 첫 단계와 관계가 있습니다. JKS 키스토어가 없기 때문에 사용자는 비어 있는 키스토어(keystore.jks)로 프로세스를 시작합니다. 두 번째 차이는 프로세스의 마지막 단계와 관련이 있습니다. 결과로 얻은 서명 인증서를 JKS 키스토어로 가져오는 대신 사용자는 그것을 NSS 스토어로 가져옵니다. 즉, GlassFish v2 애플리케이션 서버를 SSL 서버로 작동시키려면 위에서 설명한 개발자 프로파일이 사용되는 경우와 동일한 단계를 수행하지만 비어 있는 키스토어로 시작하고 6단계를 다음으로 대체합니다.

  1. 다음 명령을 사용하여 키스토어로부터 서버 인증서를 위한 비밀키를 PEM(Privacy Enhanced Mail) 포맷으로 보내십시오.       keyexport.bat -keyfile serverkey.pem
          -keystore keystore.jks -storepass changeit -alias s1as

    이 명령문은 keyexport 유틸리티를 호출합니다. keyexport 패키지에 keyexport가 있습니다. 이 패키지는 Project Metro의 XWSS 다운로드 페이지에서 다운로드할 수 있습니다.

    위 명령에 대한 응답으로 키스토어 비밀번호 입력 프롬프트가 나타날 것입니다. 키스토어 비밀번호는 키 비밀번호와 동일하므로 리턴키를 누르면 됩니다.

    이것은 serverkey.pem 파일을 생성하며 이 파일에는 마커 -----BEGIN PRIVATE KEY----- 와 -----END PRIVATE KEY----- 아래에 서버 비밀 키가 포함됩니다.

  2. CA로부터 응답으로 온 서명 인증서(signed certificate reply)를 마커 -----BEGIN CERTIFICATE----- 와 -----END CERTIFICATE----- 를 포함하여 servercert.pem 파일에 추가하십시오. 마커 END PRIVATE KEY 아래에 그 응답을 추가하십시오.
  3. serverkey.pem 파일을 PKCS#12 파일(확장자가 .pfx인 파일)로 변환하십시오. "PKCS"는 RSA Security에 의해 고안 및 발행된 공개 키 암호화 표준의 그룹을 가리킵니다. PKCS#12는 비밀키와 그에 수반되며 비밀번호 기반의 대칭 키로 보호되는 공개 키 인증서를 저장하는데 흔히 사용되는 파일 형식을 정의합니다.

    serverkey.pem 파일을 PKCS#12 파일로 변환하는데 사용할 수 있는 툴은 여러가지가 있습니다. openssl 툴은 그러한 것 중 하나입니다. 다음은 openss1을 사용하여 파일을 변환하는 명령문입니다.

          openssl pkcs12  -export  -in serverkey.pem -out s1as.pfx

    위 명령에 대한 응답으로 익스포트 비밀번호 입력 프롬프트가 나타날 것입니다. "changeit"과 같은 비밀번호 또는 GlassFish 마스터 비밀번호를 입력하십시오.

    s1as.pfx 파일에는 이제 서명이 있는 서버 인증서 및 비밀 키가 포함될 것입니다.

  4. 원래의 s1as 자가서명 항목이 있으면 다음 명령을 수행하여 삭제하십시오.       certutil -D -n s1as -d $AS_NSS_DB

  5. pk12util 유틸리티를 사용하여 새 s1as.pfx 파일을 NSS 스토어로 가져오는 명령문은 다음과 같습니다.       pk12util -i s1as.pfx -d $AS_NSS_DB

    pk12util은 엔터프라이즈 프로파일을 위한 GlassFish 설치 임시 디렉토리 내에서 이용 가능한 NSS 유틸리티입니다. 그 유틸리티는 PCKS#12 파일을 NSS 스토어로 가져오거나 스토어에서 내보내는 데 사용됩니다.

    명령문에 대한 응답으로, NSS 소프트 토큰 및 PKCS#12 파일에 대한 비밀번호 입력 프롬프트가 나타날 것입니다. 적절한 비밀번호를 입력하십시오. 그러면 가져오기가 성공적으로 수행되었다는 다음과 같은 메시지를 볼 수 있을 것입니다.

          pk12util: PKCS12 IMPORT SUCCESSFUL  

고려해야 할 두 가지 경우가 있습니다.

  • 애플리케이션 서버 프로파일이 엔터프라이즈 프로파일이며 서버 키 페어가 이미 PKCS#12 파일에 있습니다. 스토어 내에 alias가 s1as인 항목이 이미 있는 경우에는 "엔터프라이즈 프로파일이 사용되는 경우"에서 설명한 대로 4단계를 수행하여 원래의 항목을 삭제하기만 하면 됩니다.      certutil -D -n s1as -d $AS_NSS_DB

    그리고 나서 5단계를 수행하여 새로운 s1as.pfx 파일을 NSS 스토어로 임포트합니다.

          pk12util -i s1as.pfx -d $AS_NSS_DB

    alias가 s1as인 항목이 스토어에 없으면 5단계만 수행하십시오.

  • 애플리케이션 서버 프로파일이 개발자 프로파일이며 서버 키 페어가 이미 PKCS#12 파일에 있습니다. 이러한 경우에 엔터프라이즈 프로파일이 사용되는 경우 에서 설명한 대로 5단계를 수행하여 원래의 s1as 항목을 삭제하기만 하면 됩니다. 그 후 pkcs12import 유틸리티를 사용하여 PCKS#12 파일을 GlassFish 키스토어로 가져오십시오.      pkcs12import.sh -file s1as.pfx -alias s1as
         -keystore keystore.jks -storepass changeit
         -pass <exp_password>

    이 때 <exp_password>는 PKCS#12 파일이 보내졌을 때 사용되었던 비밀번호(예: changeit)입니다.

    pkcs12import 패키지에 pkcs12import 유틸리티가 있으며 이 패키지는 Project Metro의 XWSS 다운로드 페이지에서 다운로드할 수 있습니다.

자세한 정보

GlassFish와 SSL에 대한 더 자세한 정보는 GlassFish v2로 SSL 및 CRL 확인(SSL and CRL Checking with GlassFish v2)를 참조하십시오.

또한 다음 리소스도 참조하십시오.


저자 정보

Kumar Jayanti는 썬마이크로시스템즈의 공학자 직원이며 웹 기술 및 표준 팀에서 일하고 있습니다. 현재 Kumar는 XML과 웹 서비스 보안 구현 부문에서 주역을 맡고 있으며 또한 최근에는 GlassFish 보안 모듈도 책임지게 되었습니다. 그는 2004년 초반부터 썬에서 웹 서비스 보안 분야에 관여해 왔으며 인도 Mumbai의 IIT에서 Computer Science 공학석사(M.Tech) 학위를 취득했습니다. 그의 관심 영역은 분산 컴퓨팅, CORBA, XML, 웹 서비스 및 보안 분야입니다.



이 글의 영문 원본은
http://java.sun.com/mailers/techtips/en ··· v07.html
에서 보실 수 있습니다.

"Java EE" 카테고리의 다른 글

Posted by 1010
98..Etc/GlassFish2008. 11. 12. 17:03
반응형
오픈 소스 소프트웨어는 점점 더 많은 기업과 사내 개발자들의 관심을 끌고 있습니다. 이는 커뮤니티에서 오픈 소스 소프트웨어의 소스 코드를 자유롭게 획득하고 업그레이드할 수 있기 때문입니다. 즉, 이 소프트웨어를 사용하면 상용 소프트웨어보다 빠르게 작업을 처리하고, 기업 및 개발자에게 실제로 필요한 사항에 맞게 업그레이드할 수 있습니다. 또한 일반적으로 오픈 소스 소프트웨어는 무료로 사용할 수 있기 때문에 비용을 절감할 수 있습니다. 따라서 많은 관심이 집중되고 사용 범위가 빠르게 확장되고 있는 추세입니다.

그러나 기업들은 오픈 소스 소프트웨어가 업무에 중요한 애플리케이션을 관리하고 로드 및 트랜잭션이 많은 환경을 처리하는 데에는 적합하지 않다고 생각하고 있습니다. 이는 오픈 소스 소트프웨어가 지원되지 않는 경우가 있으며, 상용 소프트웨어 보다 작동 용이성, 안정성 및 성능면에서 떨어지는 경우가 있기 때문입니다. 특히, 애플리케이션 서버와 같이 중요한 엔터프라이즈 구성요소의 경우 IT 결정자가 위험 수준이 낮고 애플리케이션에 적합하도록 오픈 소스를 다양하게 분류합니다.

기업에서는 오픈 소스 애플리케이션 서버를 사용할 것인지 또는 강력하고 안정적인 기업용 애플리케이션 서버를 사용할 것인지 더 이상 선택할 필요가 없습니다. 두 서버에서 모두 GlassFish v2를 사용할 수 있습니다.

그러나 GlassFish v2를 사용하려면 기업에서는 오픈 소스로 운영되며, 업무에 중요한 애플리케이션과 척박한 프로덕션 환경에 맞는 특성을 갖춘 애플리케이션 서버가 필요합니다. 기업에서는 오픈 소스 애플리케이션 서버를 사용할 것인지 또는 강력하고 안정적인 기업용 애플리케이션 서버를 사용할 것인지 더 이상 선택할 필요가 없습니다. 두 서버에서 모두 GlassFish v2를 사용할 수 있습니다.

이 기사에서는 GlassFish v2를 사용하여 중요한 비즈니스 애플리케이션 및 프로덕션 환경의 요구 사항을 처리하는 기능에 대해 집중적으로 설명합니다.


목차

- GlassFish란 무엇입니까?
- GlassFish v2 및 상용 배포판
- 고가용성 및 확장성
- 엔터프라이즈급 성능
- 중앙 집중화된 관리 및 모니터링
- 프로파일에서의 간단한 구성
- .NET과의 상호 운용성
- JBI 준비
- 뛰어난 메시지 처리 기능
- 매력적인 가격 지원 정책
- 요약
- 자세한 정보
- 저자 정보


GlassFish란 무엇입니까?

사용자 삽입 이미지
썬은 2005년 6월에 Java Platform, Enterprise Edition 5 (Java EE 5)와 호환되는 애플리케이션 서버를 개발하기 위해 자바 커뮤니티에 공개하여 GlassFish 프로젝트를 출시했습니다. 그 후, GlassFish 커뮤니티 라는 적극적인 개발자들의 커뮤니티가 프로젝트에 참여하게 되었습니다. 초창기에 많은 노력을 기울인 결과 첫 번째 오픈 소스이자 Java EE 5 호환 애플리케이션 서버이며 Java EE 5의 참조 구현인 GlassFish v1을 개발했으며, GlassFish 커뮤니티에서는 Java Persistence API의 참조 구현인 Toplink Essentials를 발표했습니다. 또한 커뮤니티에서는 Metro, jMaki, Open Message Queue(Open MQ) , Hudson Grizzly와 같은 다양한 하위 프로젝트의 개발을 촉진합니다.

GlassFish v2에는 GlassFish v1의 기능이 모두 포함되어 있으며, 애플리케이션 서버에서 중요한 프로덕션 환경 문제를 수행할 수 있는 기능이 추가되어 있습니다.

GlassFish v1은 개발자를 위해 만들어졌으며, 개발자가 Java EE 5 애플리케이션을 배포하고 테스트할 수 있는 완전한 Java EE 5 호환 애플리케이션 서버 및 오픈 소스를 제공할 목적으로 만들어졌습니다. 목표는 간단한 배포 즉, GlassFish의 단일 인스턴스에서 애플리케이션을 배포하는 것이었습니다. GlassFish v1은 공공 개발 및 배포 라이센스(CDDL) 하에 사용할 수 있으며, 연간 다운로드 횟수가 3백만 건 이상으로 매우 많이 사용되어 왔습니다. 이는 전 세계에 보급되어 썬에서 지원하는 상용 배포판인 Sun Java System Application Server Platform Edition 9.0을 포함하여 여러 배포판에 사용할 수 있으며, 솔라리스, 윈도우 및 리눅스 운영 체제를 비롯한 여러 플랫폼에서도 사용할 수 있습니다.

2007년 9월, GlassFish 커뮤니티에서 GlassFish v1에서의 모든 기능이 포함되고, 애플리케이션 서버에서 중요한 프로덕션 환경 문제를 수행할 수 있는 기능이 추가된 GlassFish v2를 발표했습니다. 이 기사에서는 이러한 기능에 대해 설명합니다.


GlassFish v2 및 상용 배포판

사용자 삽입 이미지
앞서 설명한 대로, GlassFish v1에는 썬에서 지원하는 상용 배포판이 포함되어 있으며, 이는 GlassFish v2의 경우에도 마찬가지입니다. GlassFish v2에 포함된 썬에서 지원하는 상용 배포판은 Sun Java System Application Server 9.1입니다. GlassFish v2와 Sun Java System Application Server 9.1에서는 동일한 코드 베이스를 사용합니다. 또한, 썬에서 Sun Java System Application Server 9.1에 대한 지원 서비스를 구매할 수 있습니다. 지원 서비스에 대한 자세한 내용은 매력적인 가격 지원 정책을 참조하십시오.

GlassFish v2와 Sun Java System Application Server 9.1는 모두 무료로 배포 및 재배포할 수 있습니다. 그러나 GlassFish v2와 달리, Sun Java System Application Server 9.1에서는 코드를 바이너리 형식으로만 사용할 수 있기 때문에 수정이 불가능합니다. GlassFish v2 소스 코드는 CDDL 또는 클래스 경로 예외가 포함된 GNU 일반 공개 라이센스(GPL) v2에 따라 수정할 수 있습니다.

이 기사에서는 주로 GlassFish v2라는 용어를 사용하여 오픈 소스 애플리케이션 서버, GlassFish v2와 해당 상용 배포판인 Sun Java System Application Server 9.1에 대해 설명합니다. 두 배포판 간의 내용이 다른 경우에 한해 GlassFish v2 또는 Sun Java System Application Server 9.1로 각각 언급합니다.

고가용성 및 확장성

애플리케이션 서버에서 중요한 비즈니스 애플리케이션을 처리하는 경우 해당 애플리케이션을 항상 사용할 수 있어야 합니다. 애플리케이션 서버를 프로덕션 환경의 요구 사항에 맞게 사용하려면 증가된 작업 부하에 맞춰 조정해야 합니다. GlassFish v2는 클러스터링 및 고가용성 데이터베이스(HADB) 기술을 통해 고가용성 및 확장성을 보증합니다.


클러스터링

클러스터는 GlassFish v2 애플리케이션 서버 인스턴스의 그룹으로 단일 논리 개체로서 관리하고 모니터할 수 있습니다. 클러스터를 생성하려면 먼저 클러스터링을 위해 GlassFish v2 도메인을 사용할 수 있어야 합니다. GlassFish v2 도메인 또는 보다 정확하게 관리 도메인은 관리자에 의해 모든 GlassFish v2 엔터티가 제어되는 논리 경계입니다. 런타임 시 도메인은 GlassFish v2 애플리케이션 서버 인스턴스 또는 클러스터와 동일합니다. 따라서 GlassFish v2를 설치할 때 도메인에 대한 클러스터링을 쉽게 수행할 수 있습니다. 예를 들어, GlassFish v2를 설치한 후 다음 명령을 사용하여 도메인을 생성하고 클러스터링을 수행할 수 있습니다.

lib/ant/bin/ant -f setup-cluster.xml

GlassFish v2 관리 콘솔에서 기존 도메인에 대한 클러스터링을 수행할 수도 있으며, 해당 내용은 이 기사의 뒷 부분에 설명되어 있습니다.

클러스터링을 수행하도록 도메인을 설정하면 해당 도메인에 클러스터 프로파일을 지정해야 합니다. 프로파일에 대한 자세한 내용은 프로파일에서의 간단한 구성을 참조하십시오. 도메인에서 클러스터를 유연하게 제거하거나 추가하고 특정 클러스터에서 GlassFish v2 인스턴스를 제거하거나 추가할 수 있습니다. 클러스터에 인스턴스를 추가하거나 도메인 내에 클러스터를 추가하여 증가된 애플리케이션 서버 용량과 속도에 대한 요구 사항에 맞게 조정할 수 있습니다. 클러스터 관리 및 모니터링에 대한 자세한 내용은 중앙 집중화된 관리 및 모니터링을 참조하십시오.

클러스터에서 하나의 애플리케이션 서버 인스터스가 실패한 경우 계속해서 세션을 처리하도록 해당 인스턴스와 상호 작용하는 세션이 클러스터의 다른 인스턴스로 다시 라우팅됩니다.

클러스터링의 가장 중요한 측면은 메모리 복제 입니다. 메모리 복제 시 GlassFish v2 인스턴스에서 배포된 애플리케이션이 있는 사용자 세션의 상태에 대한 정보가 클러스터의 동등 인스턴스로 복제됩니다. 클러스터의 각 GlassFish v2 인스턴스가 클러스터의 다음 인스턴스 즉, 복제 파트너에 세션 상태 정보를 보냅니다. 클러스터에서 인스턴스 순서는 인스턴스의 이름을 기반으로 합니다. 모든 인스턴스에서 배포된 애플리케이션의 세션 상태 정보가 업데이트되면 클러스터 주위에 복제됩니다.

GlassFish v2에서 플러그인으로 사용할 수 있는 로드밸런서는 메모리 복제에서 중요한 역할을 수행합니다. 로드밸런서는 여러 GlassFish v2 인스턴스 간의 작업 부하를 분산시키고, 인스턴스에 실패하면 세션을 다시 라우팅합니다. 클러스터에서 GlassFish v2 인스턴스가 실패한 경우 로드밸런서가 해당 인스턴스와 상호 작용하는 세션을 클러스터의 다른 인스턴스로 다시 라우팅합니다.

사용자 삽입 이미지
그림 1. 클러스터의 장애 조치 처리


그림 1에 표시된 대로, 인스턴스 1이 실패하면 로드밸런서가 인스턴스 1과 상호 작용하는 세션을 다른 인스턴스(그림에서 인스턴스 2)로 라우팅합니다. 라우팅할 대상 인스턴스가 실패한 GlassFish v2 인스턴스의 복제 파트너인 경우 해당 위치에서 세션이 처리됩니다. 그러나 라우팅 대상 인스턴스가 복제 파트너가 아닌 경우에는 복제 파트너가 복제된 세션 데이터를 라우팅 대상 인스턴스에 전송합니다. 다시 말해서, 로드 밸런서가 세션을 복제 파트너가 아닌 인스턴스 3으로 라우팅하면 세션을 처리하기 위해 복제 파트너인 인스턴스 2가 상태 데이터를 인스턴스 3으로 보냅니다.

메모리 복제를 사용하면 GlassFish v2에서 배포된 애플리케이션을 항상 사용할 수 있기 때문에 해당 애플리케이션과의 상호 작용에 방해가 있는 경우에도 사용자는 거의 인지하지 못합니다.

클러스터 인스턴스 및 해당 복제 파트너를 다른 시스템에 배치하여 가용성을 더욱 높일 수 있습니다. 이러한 방식으로 수행하면 시스템 중 하나가 실패하는 경우에도 세션 데이터가 손실되지 않습니다.


고가용성(HADB) 기술


매우 높은 수준의 가용성이 필요한 엔터프라이즈에서는 이전 버전의 썬 자바 시스템 애플리케이션 서버에서 사용되고 버전 9.1에서도 사용할 수 있는 기능인 고가용성 데이터베이스(HADB) 기술을 이용할 수 있습니다. HADB는 99.999%("5-9(five-nines)")의 가용성을 제공하고 세션 상태 정보를 유지관리할 수 있는 영구 데이터베이스 저장소를 제공합니다. HADB는 오픈 소스가 아니지만 작업 시 무료로 사용할 수 있습니다.

그러나 GlassFish v2의 클러스터링 기능을 통해 제공되는 강력한 메모리 내 복제를 수행하는 경우 대부분의 설치에 필요한 고가용성 요건을 충족해야 합니다. 또한 메모리 내 복제를 수행하려면 HADB 또는 해당 오픈 소스보다 설치 및 관리 작업을 줄여야 합니다. 이 외에도 메모리 내 복제를 수행하면 HADB를 능가하는 여러 성능 최적화 기능을 활용할 수 있습니다. 그러나 현재 HADB를 사용하는 작업이 있는 경우 또는 5-9(five-nines) 가용성이 필요한 경우 HADB에서 Sun Java System Application Server 9.1을 선택할 수 있습니다.

클러스터링 및 HADB에 대한 자세한 내용은 GlassFish 버전 2에서의 클러스터링을 참조하십시오.


엔터프라이즈급 성능


사용자 삽입 이미지
조정 범위에 상관없이 애플리케이션 서버를 올바르게 작동할 수 있습니다. 뛰어난 처리량과 응답 시간을 제공하므로 애플리케이션 서버에서 프로세싱 부하를 처리할 수 있습니다. GlassFish v2는 이러한 목표를 충족합니다. 사실, GlassFish v1의 상용 버전인 Sun Java System Application Server 9.0은 SPECjAppServer2004 벤치마크 결과를 공개한 첫 번째 오픈 소스 애플리케이션 서버였습니다.

SPECjAppServer2004(1)는 호환 애플리케이션 서버에서 구현된 모든 주요 Java EE 기술이 실행되는 종단간 애플리케이션으로, 복잡한 애플리케이션 및 엔터프라이즈 환경에서 일반적인 대용량 트랜잭션 처리를 반영하는 방식으로 수행됩니다.

GlassFish v2는 업계 최고의 상용 애플리케이션 서버를 능가하는 성능을 가진 가장 빠른 오픈 소스 애플리케이션 서버입니다.

GlassFish v2는 업계 최고의 상용 애플리케이션 서버를 능가하는 성능을 가진 가장 빠른 오픈 소스 애플리케이션 서버입니다. 2007년 7월에 GlassFish v2는 경쟁자들보다 20% 우수한 SPECjAppServer에서 단일 Sun Fire T2000 서버에 대한 최고 점수를 (2) 기록했습니다.

최근 GlassFish v2의 측정 결과는이 벤치마크에 공개된 점수 중 3위를 (3) 차지했습니다. GlassFish v2는 벤치마크 생산 경쟁 결과에 사용된 것보다 훨씬 적은 하드웨어, 공간 및 전력을 사용하지만 공개된 최고 점수와의 격차는 20% 내입니다.

애플리케이션 서버의 성능은 실행되는 애플리케이션의 조합에 따라 달라집니다. 따라서 사용자의 결과가 SPECjAppServer2004 벤치마크의 결과와 다를 수 있습니다.
 
GlassFish v2에서 크게 성능이 향상된 부문은 웹 서비스 기술입니다. GlassFish v2에서 웹 서비스 기술의 컬렉션을 Metro라고 합니다. Metro에는 Java EE와 Windows .NET 환경 간의 웹 서비스 상호 운용성을 지원하는 기술뿐만 아니라 XML 기반 웹 서비스(JAX-WS)용 Java API 2.1과 같은 핵심 웹 서비스 기술이 포함되어 있습니다. JAXB(Java Architecture for XML Binding)라는 자매 기술과 제휴한 JAX-WS 2.1을 정확한 웹 서비스 벤치마크 에서 테스트했으며, 그 결과 초당 처리 요청 수에 있어 뛰어난 성능을 나타냈습니다.

GlassFish v2 성능에 대한 자세한 내용은 SJSAS 9.1(Glassfish V2)에서 새 SPECjAppServer 2004 결과 게시 및 측정 가능한 SPECjAppServer 2004 제출을 참조하십시오.
 

중앙 집중화된 관리 및 모니터링

관리 콘솔에서는 엔터프라이즈에서 GlassFish 인스턴스 및 클러스터를 제어할 수 있는 중간 지점을 제공합니다.

공식적으로 썬 자바 시스템 애플리케이션 서버 관리 콘솔이라고 하는 단일 GlassFish v2 관리 콘솔 또는 GlassFish v2 명령행 인터페이스(CLI)에서 GlassFish v2 인스턴스 또는 클러스터를 관리하고 모니터할 수 있습니다. 이를 통해 엔터프라이즈에서 GlassFish 인스턴스를 제어할 수 있는 중간 지점을 제공할 뿐만 아니라 각 클러스터를 개별적으로 관리하거나 모니터할 수 있습니다.


사용이 용이한 관리 콘솔

관리 콘솔의 중요한 측면 중 하나는 쉽게 사용할 수 있다는 점입니다. 관리 콘솔에 로그인하면 사용의 용이성에 대해 직접 알 수 있습니다. 표시되는 첫 번째 페이지는 일반 운영 작업이 함께 표시되는 일반 작업 페이지입니다. 그림 2에 클러스터링에 사용할 수 있는 도메인에 대한 일반 작업 페이지가 표시됩니다.

사용자 삽입 이미지
그림 2. 클러스터링에 사용할 수 있는 도메인에 대한 일반 작업 페이지


새 클러스터 생성, 엔터프라이즈 애플리케이션 배포 및 데이터 모니터링과 같은 작업에 대한 버튼이 표시됩니다. 관리 작업을 수행할 수 있는 대체 경로를 제공하는 탐색 트리에 이러한 버튼이 추가됩니다. 운영 작업을 시작하려면 페이지에서 해당 버튼을 클릭하거나 트리에서 노드를 클릭합니다. 예를 들어, 클러스터링에 사용할 수 있는 도메인에 클러스터를 생성하려면 페이지에서 새 클러스터 만들기 버튼을 클릭하거나 탐색 트리에서 클러스터 노드를 클릭합니다.
또는 관리 작업에 대한 지원 문서를 일반 작업 페이지에서 직접 사용할 수 있습니다. 이러한 문서는 썬마이크로시스템즈 문서 페이지에서 사용할 수 있는 광범위한 참조 문서 라이브러리의 일부입니다.

일반 작업 페이지와 관리 콘솔의 여러 기타 요소는 동적입니다. 이러한 요소는 Project Woodstock에서 개발된 차세대 사용자 인터페이스 구성요소 집합의 일부로, Ajax 기능을 활용하여 빠르게 엔트리에 응답하고 디스플레이 간에 부드럽게 전환할 수 있습니다.


포괄적인 모니터링

관리 콘솔을 사용하면 광범위한 애플리케이션 서버 관련 데이터를 쉽게 모니터할 수도 있습니다. 일반 작업 페이지에서 모니터링 데이터 보기 버튼을 클릭하여 각 탭에 애플리케이션 서버의 다른 측면 또는 해당 운영 체제에 대한 데이터가 표시되는 탭 페이지를 표시합니다. 예를 들어, 그림 3에 표시된 대로 호출 플로우 탭에 호출 플로우 데이터가 표시됩니다.

사용자 삽입 이미지
그림 3. 호출 플로우 모니터링 


지정된 트랜잭션의 호출 플로우를 모니터링하여 그림 4에 표시된 대로 다양한 애플리케이션 서버 컨테이너를 통해 이동하는 트랜잭션을 추적할 수 있습니다.
사용자 삽입 이미지

그림 4. 트랜잭션에 대한 호출 플로우 세부사항

JMX(Java Management Extensions) 기술에 GlassFish v2를 사용할 수 있습니다. 이는 기업에서 이미 JMX를 사용하여 리소스를 모니터하고 관리하는 경우 접근 방법을 쉽게 확장할 수 있을 뿐만 아니라 GlassFish v2 리소스를 관리하고 모니터할 수 있습니다. 또한 GlassFish v2를 썬 관리 센터와 할시온의 썬 애플리케이션 서버용 PrimeAlert를 통해 구현된 모니터링 접근 방법 및 종단간 관리로 통합할 수 있습니다.


지능형 명령행 인터페이스(CLI)

CLI를 통해 GlassFish v2와 연관된 관리 작업을 전체적으로 수행할 수도 있습니다. 일반적으로 관리 콘솔 또는 CLI를 통해 거의 모든 GlassFish v2 관련 관리 작업을 수행할 수 있습니다. 예를 들어, CLI를 사용하여 GlassFish v2 도메인을 시작 및 중지하거나 클러스터를 생성하거나 호출 플로우 데이터 수집을 설정 또는 해제할 수 있습니다. 또한 CLI에는 명령을 입력할 때 오류가 발생하는 경우 대체 엔트리를 제안하는 "가장 일치하는 항목" 기능이 포함되어 있습니다. 예를 들어, 다음과 같이 asadmin 명령에 domain 키워드를 잘못 입력하는 경우가 있습니다.

asadmin start-domian

CLI에서 다음과 같이 대체 항목을 제안합니다.

Closest matching command(s):
asadmin start-domain


대규모 배포 관리

GlassFish v2에서 제공하는 관리 콘솔 및 CLI는 단일 인스턴스 또는 클러스터를 배포하고 구성할 수 있는 우수한 도구입니다. 대규모 기업 배포에 썬 N1 서비스 프로비저닝 시스템(N1SPS)을 사용할 수 있습니다. 썬 자바 시스템 애플리케이션 서버용 N1SPS 플러그인을 사용하면 기업 전체에 Sun Java System Application Server 9.1을 쉽게 설치, 구성 및 관리할 수 있습니다. 플러그인을 사용하여 기존 GlassFish v2 설치를 구성하고 관리할 수 있지만 이를 설치할 수는 없습니다. N1SPS에 대한 자세한 내용은 N1SPS을 통한 썬 자바 시스템 애플리케이션 서버 프로비저닝을 참조하십시오.

GlassFish v2의 관리 콘솔에 대한 자세한 내용은 GlassFish 프로젝트 - 관리 콘솔(GUI) 홈 페이지를 참조하십시오. GlassFish v2의 모니터링 기능에 대한 자세한 내용은 GlassFish 버전 2 모니터링 기능을 참조하십시오.


프로파일에서의 간단한 구성

최적화는 애플리케이션 서버의 중요한 요건이며, 각 서버에 각각 다른 유형의 최적화가 필요할 수 있습니다. 예를 들어, 애플리케이션을 빌드하고 테스트하는 개발자는 보안에 관계없이 애플리케이션 서버가 애플리케이션 요청에 응답하는 속도를 최적화하려고 할 수 있습니다. 그에 반해, 프로덕션 환경에서는 보안이 매우 중요하므로 애플리케이션을 배포하는 사람에게 보안은 가장 중요한 문제입니다.

애플리케이션 서버 도메인을 생성할 때 적절한 프로파일을 지정하여 간단하게 특정 유형의 용도를 위한 GlassFish v2를 구성하고 최적화할 수 있습니다.

구성 매개변수를 설정하여 특정 요구사항을 충족하도록 애플리케이션 서버를 수동으로 조정할 수 있지만, 이렇게 하면 시간과 노력이 많이 소비됩니다. 또는 특정 유형의 용도를 위해 미리 구성되어 있는 애플리케이션 서버의 특정 에디션을 사용할 수 있습니다. 사실, 이전 릴리스의 썬 자바 시스템 애플리케이션 서버를 여러 에디션에서 사용할 수 있었습니다. 예를 들어, 플랫폼 에디션은 개발자를 겨냥해 만들어졌으며 엔터프라이즈 에디션은 대기업을 겨냥한 제품입니다. 그러나 각각의 용도에 맞게 사용하기 위해 여러 에디션의 애플리케이션 서버를 설치하고 관리하는 것은 비현실적입니다.

보다 나은 솔루션은 단일 에디션의 애플리케이션 서버를 제공하면서 특정 사용 패턴을 위해 미리 설정된 구성을 제공하는 것입니다. 실제로 이러한 방법으로 GlassFish v2를 배포합니다. 이는 하나의 적절한 크기의 배포 번들에서 사용할 수 있으며, 다양한 사용 프로파일을 지원합니다. 각 프로파일은 특정 유형의 용도를 위해 구성 매개변수를 미리 설정합니다. GlassFish v2에서는 개발자, 클러스터 및 기업과 같은 세 가지 프로파일을 지원합니다.

개발자 프로파일은 개발 환경에서 사용하기 위해 GlassFish v2를 최적화합니다. 이는 구성 매개변수가 빠른 구동(fast startup)과 같은 기능은 지원하지만 로깅 또는 세션 복제와 같은 기능은 지원하지 않는다는 의미입니다. 클러스터 프로파일은 클러스터 생성 및 세션 복제를 가능하게 하는 구성 매개변수를 설정합니다. 엔터프라이즈 프로파일은 프로덕션 환경으로 GlassFish v2를 최적화합니다. 또한 로깅 및 기타 보안 관련 기능을 지원합니다.

표 1에 세 가지 프로파일의 일부 특성에 대해 요약되어 있습니다.

표 1: GlassFish v2 프로파일 특성 및 설정
특징
설명
개발자
프로파일 값
클러스터
프로파일 값
기업
프로파일 값
보안 저장
키 및 인증서와 같은 보안 아티팩트에 사용되는 저장 유형입니다. 두 가지 주요 유형은 썬에서 제공하는 키스토어 구현의 독점 유형인 JKS(Java Key Store)와 보안 설정 클라이언트 및 서버 애플리케이션의 크로스플랫폼 개발을 지원하기 위해 설계된 라이브러리 집합인 NSS(Network Security Services)입니다. 저장 유형은 형식 및 구성하는 데 사용할 수 있는 도구에 따라 다릅니다. NSS는 엔터프라이즈 솔루션에 일반적으로 사용되는 보안 유형입니다.
JKS
JKS
NSS
빠른 시작

애플리케이션 서버를 빠르게 시작할 수 있는 옵션입니다. 빠른 시작은 온 디맨드 서비스 프레임워크의 일부인 자바 NIO 기반 구현을 통해 수행됩니다.
true (사용)
false (사용안함)
false (사용안함)
JVM

자바 가상 머신 구성 매개변수입니다.
핫 스폿 VM 구성 매개변수
핫 스폿 VM 구성 매개변수
JDK에서 확인
세션 복제 메커니즘
세션 복제 메커니즘
없음
메모리 내 복제
HADB
 

도메인을 생성할 때 프로파일을 지정합니다. 예를 들어, 다음 명령은 도메인을 생성하고 해당 도메인에 대한 엔터프라이즈 프로파일을 지정합니다.

asadmin create-domain --user admin --adminport 4848 --profile enterprise

이상, 특정 유형의 용도(이 경우 프로덕션 환경)를 위해 GlassFish v2 애플리케이션 서버 인스턴스를 구성하고 최적화하는 데 필요한 모든 내용에 대해 설명했습니다.

프로파일에 대한 자세한 내용은 자료(One Pager): 애플리케이션 서버용 사용 프로파일 지원을 참조하십시오.


.NET과의 상호 운용성

상호 운용성은 엔터프라이즈에서 중요한 요건입니다. 일반적으로 운영 환경 전체에 엔터프라이즈의 애플리케이션 리소스가 배포되기 때문입니다. 예를 들어, Java EE와 같은 하나의 환경에 애플리케이션의 클라이언트 부분이 있을 수 있고, 웹 서비스에서 해당 클라이언트가 Microsoft의 .NET 프레임워크와 같은 다른 환경에 있어야 할 수 있습니다. GlassFish v2를 사용하면 웹 서비스 기반 애플리케이션에서 Java EE와 .NET 환경 간에 상호 운용할 수 있습니다.


Metro 및 웹 서비스 상호 운용성

GlassFish v2를 사용하면 웹 서비스 기반 애플리케이션에서 안전하고 안정적으로 메시징 및 트랜잭션을 지원하는 동시에 Java EE와 .NET 환경 간에 상호 운용할 수 있습니다.

GlassFish v2에는 웹 서비스에 대한 강력한 기술을 제공하는 Metro가 포함되어 있으며, 이는 Java EE에서 실행되는 웹 서비스에 대한 기술 스택을 능가합니다. 또한 Metro를 사용하면 웹 서비스에서 Microsoft .NET 프레임워크의 웹 서비스 스택인 WCF(Windows Communication Foundation)와 상호 운용할 수 있습니다. Metro와 WCF 모두 일반적으로 WS* 규격(모두 "WS"로 시작)이라는 웹 서비스 규격의 집합을 구현하며, 이를 통해 안전하고 안정적인 트랜잭션 지향 웹 서비스 상호 작용을 수행할 수 있습니다. Metro에서는 WS* 규격의 구현을 WSIT(Web Services Interoperability Technology)라고 합니다. 그림 5에 표시된 대로, WSIT를 사용하여 GlassFish v2의 웹 서비스 클라이언트가 .NET 3.0의 웹 서비스 끝점과 상호 작용하고 .NET 3.0 웹 서비스 클라이언트가 GlassFish v2의 웹 서비스 끝점과 상호 작용할 수 있습니다. GlassFish v2 클라이언트와 GlassFish v2 끝점 간의 통신도 지원됩니다.

사용자 삽입 이미지

그림 5. .NET과 Metro의 상호 운용성

Metro와 WCF가 안전하고 안정적인 트랜잭션 지향 웹 서비스 상호 작용을 지원하므로 웹 서비스 클라이언트가 커밋하거나 롤백할 수 있는 트랜잭션 또는 조합으로 처리되거나 안전하게 수신되는 웹 서비스와 교환하도록 요청할 수 있습니다.


웹 서비스 상호 운용성 구성을 위한 간단한 인터페이스

GlassFish v2의 웹 서비스 끝점에 대한 상호 운용성 특성은 WSIT 구성 파일이라는 XML 파일에서 지정됩니다. 웹 서비스 개발자가 파일의 필수 XML을 코드화할 수 있습니다. 그러나 XML이 장황해지고 WSIT 구성 파일의 컨텐츠가 광범위해질 수 있습니다. 상호 운용 가능한 웹 서비스를 개발하는 보다 간단한 방법은 NetBeans IDE 버전 5.5.1 또는 6.0을 사용하는 것입니다. WSIT에 NetBeans IDE 5.5.1을 사용하려면 WSIT 플러그인 모듈을 설치합니다. NetBeans IDE 6.0에는 플러그인 모듈이 이미 패키징되어 있습니다. 사용 가능한 경우, IDE에 안전한 메시징, 안정적인 메시징 및 트랜잭션 지원과 같은 WSIT 특성과 함께 웹 서비스를 구성할 수 있는 간단한 확인란 인터페이스가 표시됩니다. 그림 6에 NetBeans IDE 6.0에서의 이 인터페이스가 표시됩니다.

사용자 삽입 이미지

그림 6. 상호 운용 가능한 웹 서비스의 안전한 메시지 전달 지정

그림 6에 안전한 메시지 전달 및 정확한 순서로 메시지 전달 확인란이 선택되어 있습니다. 이러한 확인란을 선택하면 웹 서비스에서 안전하게 메시지를 전달할 수 있으며, 클라이언트가 보낸 메시지를 보낸 순서대로 웹 서비스 끝점에 전달할 수 있습니다.
 
NetBeans IDE를 사용하여 GlassFish v2에 웹 서비스를 배포할 수 있습니다. 진행 중에 IDE에서 구성 선택 항목에 적절한 모든 XML 코드와 구성 파일을 포함하여 적절한 아티팩트를 생성합니다.

Java EE 플랫폼과 .NET 프레임워크 간의 웹 서비스 상호 운용성을 구현하는 데 소요되는 시간, 비용 및 난이도를 고려하십시오. 이를 수행하려면 일반적으로 고가의 메시징 인프라뿐만 아니라 많은 사용자 정의 코드가 필요합니다. Metro에서는 추가 비용 없이 이러한 지원을 받을 수 있으며 GlassFish v2에 이미 내장되어 있습니다.

Metro에서 .NET과의 웹 서비스 상호 운용성 지원에 대한 자세한 내용은 Project Tango: 개요(PDF)Metro Project를 참조하십시오.


JBI 준비

GlassFish v2에서는 JBI(Java Business Integration)가 구현된 Open ESB에 대한 지원이 기본적으로 제공됩니다. JSR 208에 지정된 대로 JBI는 서비스 지향 아키텍처(SOA)에 따라 비즈니스 시스템을 구성할 수 있는 자바 표준입니다. SOA 접근 방식에서는 별도의 서비스에서 애플리케이션이 조합될 수 있으며, 각 서비스는 하나 이상의 비즈니스 관련 프로세스를 수행합니다. SOA에서는 하나의 애플리케이션에 사용된 데이터 및 서비스를 다른 애플리케이션에서 공유하고 재사용할 수 있기 때문에 엔터프라이즈에서 이러한 복합 애플리케이션을 매우 빠르게 빌드할 수 있습니다. 새 애플리케이션을 만들기 위해 서비스와 데이터를 통합하는 것과 같은 접근 방법을 통합 애플리케이션 시스템이라고 하는 경우도 있습니다. 이전에는 통합 애플리케이션 시스템을 구현하려면 많은 사용자 정의 코드를 사용하거나 독점적인 시스템에 투자해야 했습니다. JBI은 통합 애플리케이션 시스템을 구성하는 방법을 표준화고 특수 코드화 또는 독점 솔루션을 수행할 필요를 없애줍니다.

JBI는 플러그인 구성요소를 정의하며, 각 플러그인 구성요소는 특정 유형의 서비스를 실행하거나, 서비스가 실행되는 순서를 조정하거나, 데이터 형식 변환과 같은 기타 비즈니스 프로세스 관련 작업을 수행할 수 있는 기술을 제공합니다. 예를 들어, 하나의 JBI 구성요소가 Java EE 엔터프라이즈 아카이브(EAR) 파일로 배포된 서비스를 실행하는 EJB 서비스 엔진일 수 있습니다. 다른 구성요소는 SQL 쿼리를 실행하는 SQL 서비스 엔진일 수 있습니다. 세 번째 구성요소는 비즈니스 프로세스를 조정하는 BPEL 문을 실행하는 비즈니스 프로세스 실행 언어(BPEL) 서비스 엔진일 수 있습니다. 일부 플러그인 구성요소는 서비스를 제공하거나 사용하기 위해 다른 환경과 통신하는 구성요소를 바인딩합니다. 예를 들어, 하나의 바인딩 구성요소에서 SOAP over HTTP를 사용하여 신용 조사를 수행하는 원격 서비스를 실행할 수 있으며, 다른 바인딩 구성요소에서 SMTP를 사용하여 신용 조사에 대한 전자 메일 알림을 보낼 수 있습니다.

즉, 해당 복합 애플리케이션에 통합할 수 있는 광범위한 서비스 유형의 선택 범위를 엔터프라이즈에 제공하고 JBI 기반 시스템을 구성하는 구성요소에 많은 유연성을 제공하는 것입니다. JBI를 구현할 때, Open ESB를 사용하여 서비스를 느슨하게 결합된 복합 애플리케이션에 통합할 수 있습니다.

GlassFish v2에서는 Open ESB의 런타임 환경을 제공합니다. 이는 특정 유형의 서비스를 실행하는 다양한 서비스 엔진 및 서비스를 제공하거나 사용하기 위해 다른 환경과 통신하는 바인딩 구성요소를 제공합니다.


Open ESB 런타임 환경

GlassFish v2에서는 Open ESB의 런타임 환경을 제공합니다. 이는 다양한 서비스 엔진과 바인딩 구성요소를 제공합니다. Open ESB는 JBI를 기반으로 하기 때문에 GlassFish v2에서 제공하는 환경에 JBI 호환 서비스 엔진 및 바인딩 구성요소를 추가할 수 있습니다.

그림 7에 표시된 대로 GlassFish v2 애플리케이션 서버에 배포된 웹 서비스는 Sun Java EE 엔진이라고 하는 구성요소와 JAX-WS를 통해 JBI 런타임 환경과 통신합니다. 일반적으로 기타 JBI 구성요소의 경우 Sun Java EE 엔진에서 표준화된 메시지 라우터(NMR)라고 하는 경량 메시징 인프라를 사용하여 다른 서비스 엔진 및 바인딩 구성요소와 통신합니다. 그림 7에서 SE는 서비스 엔진을 의미하고 BC는 바인딩 구성요소를 의미합니다.

사용자 삽입 이미지

그림 7. GlassFish v2에서 JBI 런타임 환경


Open ESB 구성요소 관리

관리 콘솔 또는 CLI를 사용하여 GlassFish v2에서 기타 Open ESB 구성요소뿐만 아니라 Sun Java EE 엔진을 관리할 수 있습니다. 예를 들어, 일반 작업 페이지에서 JBI(Java Business Integration) 서비스 어셈블리 배포 버튼을 클릭하기만 하면 관리 콘솔을 사용하여 복합 애플리케이션의 일부 또는 전체가 포함되어 있는 JBI 서비스 어셈블리를 배포할 수 있습니다. 관리 콘솔 또는 CLI에서 Sun Java EE 엔진을 시작, 중지, 종료 또는 제거할 수 있습니다. 예를 들어, CLI에 다음 명령을 입력하여 Sun Java EE 엔진을 시작할 수 있습니다.

asadmin start-jbi-component sun-javaee-engine


복합 애플리케이션 구축 도구


개발 측면에서 NetBeans IDE 6.0은 Open ESB 환경에서 실행되는 복합 애플리케이션을 구축할 수 있는 다양한 도구를 제공합니다. 이러한 도구에는 BPEL 설계 도구, 그래픽 WSDL(Web Services Description Language) 편집기, CASA(Composite Application Service Assembly) 편집기 및 스키마와 XSLT 변환을 관리할 수 있는 도구가 포함되어 있습니다.

NetBeans IDE 6.0을 사용하여 복합 애플리케이션을 구축합니다. 그런 다음 GlassFish v2에서 해당 애플리케이션을 배포, 실행 및 관리합니다.

GlassFish v2에서의 Open ESB 지원에 대한 자세한 내용은 Sun Java EE 엔진: Java EE 웹 서비스와 JBI 구성요소 브리징 Open ESB 프로젝트를 참조하십시오.


뛰어난 메시지 처리 기능

효율적인 메시징 서버는 효율적인 엔터프라이즈를 구성하기 위해 비즈니스 소프트웨어를 연결하는 데 있어 매우 중요합니다. GlassFish v2에서는 메시지 지향 시스템 통합을 위한 완전한 JMS(Java Message Service) 구현인 Open Message Queue(Open MQ)를 제공합니다. JMS는 Java EE 기반 애플리케이션 구성요소에서 메시지 작성, 전송, 수신 및 읽기를 수행할 수 있는 메시징 표준입니다. JMS를 구현할 때 Open MQ에서 완전한 메시징 서버를 제공하며, 이는 오픈 소스 버전의 썬 자바 시스템 메시지 대기열 제품 입니다. Open MQ에는 자체 관리 도구 집합이 포함되어 있어 자체적으로 실행하거나 GlassFish v2에 완전히 통합할 수 있습니다.

GlassFish v2에서는 메시지 지향 시스템 통합을 위한 완전한 JMS(Java Message Service) 구현인 Open MQ를 제공합니다.

GlassFish v2와 함께 사용하면 클라이언트에 JMS 기반 메시지 전달 서비스를 제공하는 Open MQ 구성요소인 메시지 브로커가 GlassFish v2와 동일한 프로세스에 있을 수 있습니다. 즉, 둘 모두 동일한 자바 가상 머신에서 실행됩니다. 이러한 애플리케이션 서버에 대한 Open MQ의 관계를 EMBEDDED 모드라고 합니다. 또한 LOCAL 모드에서는 메시지 브로커가 GlassFish v2와 동일한 수명 주기를 공유할 수 있으며, REMOTE 모드에서는 별도로 실행될 수 있습니다.
 

효율적이고 안전한 메시지 전달

Open MQ를 사용하면 안전한 메시지 전달을 보증하면서 기존 및 새 애플리케이션을 연결할 수 있습니다. 메시지 전달이 보장되며 보낸 순서대로 메시지가 전달됩니다. Open MQ에서는 비동기 메시징을 지원합니다. 즉, 애플리케이션에서 메시지를 전송한 후 메시지를 수신하는 동안 기다리지 않고 계속해서 처리할 수 있습니다. 메시지는 게시-구독(Publish-Subscribe) 방식으로 전송됩니다. 이러한 접근 방식에서는 그림 8에 표시된 대로 게시자(publisher)라고 하는 메시지를 발신인이 제목(topic)이라고 하는 중간 대상에 메시지를 전송합니다. 해당 제목을 구독하는 구독자(subscriber)라고 하는 여러 애플리케이션에서 제목에서 메시지를 제거하여 메시지를 사용합니다. 게시자는 구독자와 완전히 독립적입니다. 대신 메시지를 지점 간 즉, 특정 수신자에게 전송할 수 있습니다. 이러한 경우 메시지가 대기열에 전송되고 수신자는 대기열에서 메시지를 제거하여 메시지를 사용합니다.

사용자 삽입 이미지

그림 8. Open MQ에서의 게시-구독 메커니즘

처리 기능 외에도 Open MQ는 쉽게 설치하고 관리할 수 있습니다.openInstaller를 기반으로 하는 GUI 기반 설치 프로그램을 사용하여 이를 설치할 수 있습니다. 또는 아카이브 배포의 압축을 푸는 파일 기반 설치를 수행한 다음 설치 스크립트를 실행하여 사용할 Open MQ를 구성할 수 있습니다. Open MQ에서는 메시지 브로커를 시작하는 것과 같은 Open MQ 관련 작업을 수행할 수 있는 자체 관리 콘솔 및 CLI를 제공합니다. 또한 Open MQ에서는 JAAS(Java Authentication and Authorization Service)를 통해JMX(Java Management Extensions) 기반 모니터링, 클러스터링 및 인증을 지원합니다.


고성능 및 가용성

Open MQ는 독립 실행형 애플리케이션으로 테스트되거나 뛰어난 성능이 포함된 GlassFish와 통합되었습니다. 또한 Open MQ에서는 데이터와 메시지 브로커 모두에 고가용성을 지원합니다. 고가용성 JDBC 공급자와 함께 Open MQ를 사용하면 고가용성 기능이 실행됩니다. Open MQ는 mySQL, Oracle RAC(Real Application Clusters) 및 Sun Java System Application Server 9.1의 HADB 기능으로 테스트되었습니다.

Open MQ에 대한 자세한 내용은 Open Message Queue 프로젝트를 참조하십시오.


매력적인 가격 지원 정책

Sun Java System Application Server 9.1에는 다양한 구독 옵션 집합을 사용할 수 있습니다. 완전한 보증, 온 디맨드 소프트웨어 업데이트 및 업그레이드, 썬 개발 전문가 지원 등이 포함된 서비스를 지원받을 수 있습니다. 소켓 4개에 대한 구독 가격은 연 4500 달러부터 저렴하게 시작합니다. 자세한 내용은 자바 시스템 애플리케이션 서버 구독을 참조하십시오.


요약

고가용성, 확장성, 엔터프라이즈급 성능, 중앙 집중화된 관리, 간단한 구성 및 효율적이고 안전한 메시지 전달과 같은 특성을 가진 GlassFish v2는 프로덕션 환경의 요구를 처리할 수 있는 견고성과 비즈니스 위험 애플리케이션을 처리할 수 있는 안전성이 포함된 엔터프라이즈 품질의 애플리케이션 서버입니다. 웹 서비스 상호 운용성 및 JBI 호환 런타임에 대한 지원을 추가할 경우 엔터프라이즈에 애플리케이션 처리 요구에 맞는 많은 유연성을 제공하는 애플리케이션 서버의 역할을 수행합니다. 오픈 소스로서, GlassFish v2는 GlassFish v2 또는 GlassFish v2의 썬 지원 상용 배포판인 Sun Java System Application Server 9.1인지에 관계없이 비즈니스에 개방되어 있습니다.

(1) SPEC 및 벤치마크 이름인 SPECjAppServer 2004는 Standard Performance Evaluation Corporation의 등록 상표입니다. Sun Java System Application Server 9.0은 521.42 JOPS@Standard(1 Sun Fire T2000 [코어 8개, 칩 1개] 애플리케이션 서버 및 1 Sun Fire T2000 [코어 6개, 칩 1개] 데이터베이스 서버)를 확보했습니다. 최신 SPECjAppServer 2004 벤치마크 결과는 SPEC 웹 사이트를 방문하십시오.

(2) 2007년 7월 10일을 기준으로 단일 Sun Fire T2000을 애플리케이션 서버로 사용하는 모든 SPECjAppServer 2004 점수를 기반으로 비교합니다. 참조 점수: Sun Java Application Server 9.1은 883.66 JOPS@Standard(1 Sun Fire T2000 [칩 1개, 코어 8개] 애플리케이션 서버 및 1 Sun Fire T2000 [칩 1개, 코어 6개] 데이터베이스)을 확보하고, BEA Weblogic 9.1은 801.70 JOPS@Standard(1 Sun Fire T2000 [칩 1개, 코어 8개] 애플리케이션 서버 및 1 Sun Fire T2000 [칩 1개, 코어 6개] 데이터베이스)을 확보했으며, Sun Java Application Server 9.0은 521.42 JOPS@Standard(1 Sun Fire T2000 [칩 1개, 코어 8개] 애플리케이션 서버 및 1 Sun Fire T2000 [칩 1개, 코어 6개] 데이터베이스)을 확보하고, IBM WebSphere는 616.22 JOPS@Standard(1 Sun Fire T2000 [칩 1개, 코어 8개] 애플리케이션 서버 및 1 Sun Fire X4200 [칩 2개, 코어 4개] 데이터베이스 서버)을 확보했으며, BEA Weblogic 9.0은 615.64 JOPS@Standard(1 Sun Fire T2000 [칩 1개, 코어 8개] 애플리케이션 서버 및 1 Sun Fire V490 [칩 4개, 코어 8개] 데이터베이스)을 확보했습니다.

(3) 2007년 11월 23일을 기준으로 공개된 모든 SPECjAppServer 2004 점수를 기반으로 비교합니다. 참조 점수: Sun Java Application Server 9.1은 8439.36 JOPS@Standard(6 Sun SPARC Enterprise T2150 애플리케이션 서버[칩 6개, 코어 48개] 및 1 Sun Fire E6900 데이터베이스[칩 24개, 코어 48개])를 확보하고, Oracle Application Server 10.1은 10519.43 JOPS@Standard(12 HP BL860c 애플리케이션 서버 [칩 24개, 코어 48개] 및 2 HP Superdome 데이터베이스 서버 [칩 40개, 코어 80개])를 확보했으며, Oracle Application Server 10.1은 9459.19 JOPS@Standard(11 HP BL860c 애플리케이션 서버 [칩 22개, 코어 44개] 및 2 HP Superdome 데이터베이스 서버 [칩 40개, 코어 80개])를 확보했습니다.


자세한 정보


GlassFish 커뮤니티 - Java EE 애플리케이션 서버 전달 (PDF)
GlassFish 커뮤니티
Sun Java System Application Server 9.1
GlassFish v2 - 엔터프라이즈 기능 및 오픈 소스
아쿠아리움(The Aquarium)
기사: 실행 중인 썬 기술


저자 정보

Ed Ortjava.sun.com 소속이며 관계형 데이터베이스 기술, 프로그래밍 언어, 웹 서비스 및 Ajax에 대해 폭넓게 저술했습니다.

이 글의 영문 원본은
http://java.sun.com/developer/technicalArticles/glassfish/GFv2OpenforBusiness/index.html

에서 보실 수 있습니다.

"Java EE" 카테고리의 다른 글

Posted by 1010
05.JSP2008. 11. 12. 16:58
반응형

  1. 2008/10/13 Metro 1.3으로 첨부 파일 보호
  2. 2008/10/12 진정한 추상화: JSF 2.0의 컴포지트 UI 구성 요소 -- 2부
  3. 2008/10/12 진정한 추상화: JSF 2.0의 컴포지트 UI 구성 요소 -- 1부
  4. 2008/10/12 Phobos and jMaki를 사용하여 Ajax 지원 웹 애플리케이션 빌드
  5. 2008/08/20 Groovy, Grails, MySQL 및 Java Persistence API의 조합
  6. 2008/08/13 P6Spy 및 GlassFish 연결 풀을 사용하여 데이터베이스 작업 추적
  7. 2008/07/09 EclipseLink를 사용하여 JPA에서 반복 불가능한 읽기 방지
  8. 2008/07/02 OpenSolaris에서 PHP와 함께 jMaki 사용
  9. 2008/05/20 GlassFish 서블릿 컨테이너에 인증 메커니즘 추가
  10. 2008/04/28 jMaki 이벤트 처리 방법
  11. 2008/04/07 Metro를 이용한 웹 서비스용 보안 대화
  12. 2008/04/04 애플리케이션 클라이언트에서 여러 웹 서비스 참조
  13. 2008/03/13 SIP 서블릿을 사용하여 자바 EE에 음성 추가하기
  14. 2008/03/10 상태 유지 세션 빈에서의 확장 지속성 컨텍스트
  15. 2008/02/26 Maven을 지원하는 JAX-WS 사용
  16. 2008/02/26 Metro를 사용하여 Kerberos 기반의 안전한 서비스 구축
  17. 2008/02/20 레슨: JavaBeans의 개념
  18. 2008/02/20 스윙 애플리케이션 프레임워크 소개
  19. 2008/02/13 GlassFish v2: Open for Business
  20. 2008/01/18 GlassFish v2에서 SSL 사용하기
  21. 2007/12/04 Java에서 RESTful 웹 서비스 구현하기 (1)
  22. 2007/12/04 스팸에 종지부를 찍다: RSS로 마이그레이션하는 SDN 뉴스레터
  23. 2007/11/12 Java 및 .NET 기술을 사용하여 Ajax를 통한 상호운용성 실현 (1)
  24. 2007/11/12 Metro와 .NET 간의 상호운용성 테스트
  25. 2007/11/12 Dynamic Faces를 사용한 Client-Side Polling
  26. 2007/09/03 현지화된 메시지 로깅 (23)
  27. 2007/09/03 Attach API (18)
  28. 2007/08/20 Japex 및 WSTest를 사용하는 성능 회귀 테스트 (14)
  29. 2007/07/23 매쉬업(Mashup) 스타일, 서버 사이드 매쉬업 (14)
  30. 2007/07/23 Java Persistence를 최상으로 구현하는 방법 (12)


출처 : http://blog.sdnkorea.com/blog/category/Java%20EE

Posted by 1010
01.JAVA/Java2008. 11. 12. 16:19
반응형

향상된 루프문

Java SE 2005/07/04 10:24 Posted by Sun

J2SE 5.0의 새로운 언어 기능으로 소개된 향상된 루프문(enhenced for loop)은 Iterator를 생성하거나 카운터 변수의 시작과 끝 상태를 계산할 필요 없이 콜렉션을 반복할 수 있게 해준다. 향상된 루프문은 J2SE 5.0의 새로운 기능들 중 사용자의 코드에 즉시 적용시킬 수 있는 가장 쉬운 기능이다. 이번 테크팁에서는 향상된 루프문으로 콜렉션의 엘리먼트에 순차적으로 액세스하는 이전 방법을 대체하는 법에 대해서 배워보자.

향상된 루프문은 어떻게 생겼는가? RecentTips이라고 불리는 TechTip 오브젝트들의 콜렉션이 있다고 치자. 이 콜렉션에 다음과 같이 향상된 루프문을 사용할 수 있다.

   for (TechTip tip: RecentTips)

"for each TechTip in RecentTips(RecentTips안에 각각의 TechTip)"이라고 읽는다. 여기서 콜렉션 내의 TechTip의 현재 인스턴스를 가리키기 위해 tip 변수가 사용되었다. "for each" 단어 때문에, 향상된 생성문은 for-each 생성문으로도 불린다.

콜렉션을 반복하기 위해 사용한 기존 방법과 향상된 루프문을 비교한다면, for each loop이 더 간단하고 사용자의 코드를 보다 읽기 쉽게 만들어준다는 것을 쉽게 알 수 있다.

또한 향상된 루프문은 제너릭 작업을 간단히 할 수 있게 디자인되었다. 이번 테그팁에서 제너릭에 향상된 루프문을 사용한 두가지 예를 보여주겠지만, 이번 테크팁에서 다루고자 하는 부분은 아니다. 대신, for each loop 를 사용하여 코드에 줄 수 있는 좀 더 기본적인 변화에 대해서 보여주고자 한다.

먼저, Array 의 엘리먼트들을 반복하기 위해 루프문을 어떻게 사용하고자 하는 지 생각해보자. 간단히 하기 위해, 0부터 5까지 int의 제곱을 나타내는 6개의 int로 이루어진 배열을 로딩한다.

   for (int i=0; i< squares.length; i++)

이 라인은 루프구문의 전통적인 사용법을 보여준다. 한 개 이상 카운터의 초기값을 지정하고, 완료 상태를 설정하고 어떻게 카운터가 증가하는지 보여준다.

Here is a short program, OldForArray, that uses the for loop.

   public class OldForArray {

     public static void main(String[] args){
       int[] squares = {0,1,4,9,16,25};
       for (int i=0; i< squares.length; i++){
         System.out.printf("%d squared is %d.\n",i, squares[i]);
       }
     }
   }

OldForArray 프로그램을 컴파일하고 구동하면 다음이 나타난다.

   0 squared is 0.
   1 squared is 1.
   2 squared is 4.
   3 squared is 9.
   4 squared is 16.
   5 squared is 25.

향상된 루프문을 사용하도록 테스크 프로그램을 변경하려면, 관련 변수와 변수들이 나타나는 콜렉션을 지정한다. 다음은 향상된 루프문이다.

   for (int i : squares)
이 라인은 "iterate on elements from the collection named squares. (squere라는 이름의 콜렉션의 엘리먼트 반복) "로 읽을 수 있다.리먼트는 int i로 나타날 것이다.

루핑 전에 배열에 있어야할 엘리먼트의 수를 결정할 필요는 없다. 또한 현재 상태에서 어떻게 증가할지도 지정할 필요가 없다. "내부적" 배열에 대한 향상된 루프문은 이전에 보여준 루프문과 동일하다.

테스트 프로그램인 NewForArray에서는 OldForArray에서와 같은 결과가 나타난다.

    public class NewForArray {

     public static void main(String[] args) {
       int j = 0;
       int[] squares = {0, 1, 4, 9, 16, 25};
       for (int i : squares) {
         System.out.printf("%d squared is %d.\n", j++, i);
       }
     }
   }

배열은 배열이 선언될 때 지정되는 싱글 타입 엘리먼트들의 색인화된 콜렉션이다. ArrayList와 같은 좀 더 일반적인 콜렉션에서는 엘리먼트가 Object로 저장된다.다음과 같이 콜렉션을 반복하는 C 스타일 루프문을 사용할 수 있다.

   for (int i = 0; i < list.size(); i++)

그 후 llist.get(i)를 사용하여 현재 엘리먼트를 레퍼런스할 수 있다. 예를 들어, 다음의 프로그램 OldForArrayList에서는 ArrayList을 채워서 ArrayList에서 읽기 위해 오토박싱을 사용한다.

   import java.util.ArrayList;
   import java.util.List;

   public class OldForArrayList {
     private static List squares = new ArrayList();

     private static void fillList() {
       for (int i = 0; i < 6; i++) {
         squares.add(i * i);
       }
     }

     private static void outputList() {
       for (int i = 0; i < squares.size(); i++) {
         System.out.printf("%d squared is %d.\n",
           i, squares.get(i));
       }
     }

     public static void main(String args[]) {
       fillList();
       outputList();
     }
   }

그러나 ArrayList가 콜렉션 프레임의 일부이기 때문에, 다음의 패턴에서 Iterator를 사용하여 이를 반복하는 것이 좀 더 일반적이다.

   while( iterator.hasNext()) {
     doSomethingWith (iterator.next());
   }

다음의 프로그램 IteratorForArrayList에 나타난 것처럼 이를 루프문에 번들할 수 있다.

   import java.util.ArrayList;
   import java.util.List;
   import java.util.Iterator;

   public class IteratorForArrayList {

     private static List squares = new ArrayList();

      private static void fillList() {
       for (int i = 0; i < 6; i++) {
         squares.add(i * i);
       }
     }

     private static void outputList() {
       Iterator iterator = squares.iterator();
       int j=0;
       for (; iterator.hasNext();) {
         System.out.printf("%d squared is %d.\n",
                            j++, iterator.next());
       }
     }

     public static void main(String args[]) {
       fillList();
       outputList();
     }
   }

루프문에 첫번째 혹은 세번째 매개변수가 없다는 것이 좀 이상해보일지 모른다. 초기 상태가 없고, List에서의 포지션 증가가 루프문의 본문에서 iterator.next()를 호출하여 수행된다.

향상된 루프문은 불필요한 반복문을 명확하게한다. ArrayList에 대한 Iterator 오브젝트를 생성하여 루프문에 반목문을 사용하는 대신, 다음을 이용한다.

  for ( Integer square : squares)

이는 콜렉션의 이름이 squares이고, 현재 참조된 아이템이 Integer타입이며, 변수 square로 참조되고 있음을 가리키고 있다.

ArrayList의 컨텐츠가 Integer 타입임을 알 수 있는 방법이 없으므로 이 코드는 컴파일되지 않을 것이다. 이를 수정하기 위해서, J2SE 5.0에 소개된 또다른 기능인, 제너릭을 사용해야한다. Integer 타입의 엘리먼트만을 저장할 수 있는 것으로 squares의 정의와 선언문을 정의해주어야한다. 다음과 같이 하면 된다.

   private static List<Integer> squares
                               = new ArrayList<Integer>();

다음의 프로그램, NewArrayList은 향상된 루프문과 제너릭을 함께 사용하는 법을 보여준다.

   import java.util.List;
   import java.util.ArrayList;

   public class NewArrayList {
     private static List<Integer> squares
                               = new ArrayList<Integer>();

      private static void fillList() {
       for (int i = 0; i < 6; i++) {
         squares.add(i * i);
       }
     }

     private static void outputList() {
       int j=0;
       for (Integer square : squares) {
         System.out.printf("%d squared is %d.\n",
                         j++, square);
       }
     }

     public static void main(String args[]) {
       fillList();
       outputList();
     }
   }

NewArrayList 예제는 극단적으로 간단한 것이지만, 루프 일반문과 향상된 루프문 사이의 구문적 차이점을 보여주고 있다. 다음은 루프문들간의 구문적 차이를 보여주는 또다른 예제이다. 이 예제는 2004년 JavaOne 컨퍼런스에서 Joshua Bloch and Neil Gafter의 담화를 발췌한 것이다. 이 예제에서, 메소드는 콜렉션의 각 엘리먼트에 사용된다. 처음 시작할 때, 이 예제에서는 다음과 같이 Iterator를 사용한다.

   void cancelAll (Collection c) {
     for (Iterator i = c.iterator(); i.hasNext(); ) {
       TimerTask tt = (TimerTask) i.next();
       tt.cancel();
     }
   }

다음으로, 향상된 루프문이 도입되어 Iterator의 사용을 삭제한다.

   void cancelAll( Collection c ) {
     for (Object o : c)
       ( (TimerTask) o). cancel();
   }

콜렉션의 엘리먼트를 Object 타입으로 취급해서 TimerTask 타입으로 캐스팅된다는 문제가 남아있다. 이 문제는 다음과 같이 제너릭을 도입하면 해결된다.

   void cancelAll( Collection c ) {
     for (TimerTask task : c)
       task.cancel();
   } 

향상된 루프문이 모든 곳에 사용될 수는 없다는 것을 알아두길 바란다. 다음과 같은 상황에서는 사용할 수 없다.

  • 콜렉션을 순회하면서 엘리먼트를 삭제할 때
  • 배열이나 리스트에서 현재 슬롯을 수정할 때
  • 다중 콜렉션이나 배열을 반복할 때

그러나, 위의 경우들을 제외하고는 향상된 루프문의 사용하여 코드를 좀 더 간단히 하기 바란다.

새로운 것들이 언제나 그렇듯이, 향상된 루프문은 조금 낯설고 읽기 어렵게 느껴질 수도 있다. 이전에는 오랫동안 루프문에 C 스타일을 사용했을 것이다. 그러나, 카운터 변수나 Iterator를 갖지 않는 것이 더 읽기 쉽다. 또한 초기 값과 루프 종료 상태를 설정하는데 있어 사용자의 콜렉션이 어디에서 시작하고 끝나는지 걱정할 필요가 없다.

향상된 루프문에 대한 좀 더 자세한 정보는 The For-Each Loop를 참고하기 바란다.

"Java SE" 카테고리의 다른 글

Posted by 1010
61.Linux2008. 11. 12. 15:22
반응형

보안서버 SSL 

먼저 Apache와 mod_ssl의 버전을 확인 후에 알맞은 openssl 을 설치해야 합니다. 해당 정보는 www.openssl.org , www.modssl.org 에서 확인 하실 수 있습니다. 알맞는 버전을 확인 후 해당 사이트에 소스를 다운로드 합니다.

보안서버 SSL

1. openssl 설치

[root@smson openssl-0.9.8]# tar xvfz openssl-0.9.8.tar.gz
[root@smson openssl-0.9.8]# ./config --prefix=/usr/local --openssldir=/usr/local/openssl
[root@smson openssl-0.9.8]# make; make install
[root@smson openssl-0.9.8]# ls -al /usr/local/openssl/
total 36
drwxr-xr-x    6 root     root         4096 Oct 29 00:08 .
drwxr-xr-x   24 root     root         4096 Oct 29 00:07 ..
drwxr-xr-x    2 root     root         4096 Oct 29 00:08 certs
drwxr-xr-x    6 root     root         4096 Oct 29 00:07 man
drwxr-xr-x    2 root     root         4096 Oct 29 00:08 misc
-rw-r--r--    1 root     root         9381 Oct 29 00:08 openssl.cnf
drwxr-xr-x    2 root     root         4096 Oct 29 00:08 private


2. mod-ssl 모듈 Apache 소스에 설정

[root@smson work]# tar xvfz mod_ssl-2.8.24-1.3.33.tar.gz
[root@smson work]# cd mod_ssl-2.8.24-1.3.33
[root@smson mod_ssl-2.8.24-1.3.33]# ./configure --with-apache=../apache_1.3.33 --with-ssl=../openssl-0.9.8 --prefix=/usr/local/apache-ssl

* MaxClients 값을 튜닝하기 위해 아래와 같이 HARD_SERVER_LIMIT 값을 수정한다.
[root@ihelpers apache_1.3.33]# vi src/include/httpd.h
#define HARD_SERVER_LIMIT 1024


3. Apache 설치

[root@smson apache_1.3.33]# export SSL_BASE=../openssl-0.9.8
[root@smson apache_1.3.33]# ./configure --prefix=/usr/local/apache-ssl --enable-module=so --enable-rule=SHARED_CORE  --enable-shared=max --enable-module=ssl  --enable-shared=ssl  --enable-module=rewrite  --enable-shared=rewrite  --enable-module=expires  --enable-shared=expires
[root@smson apache_1.3.33]# make
[root@smson apache_1.3.33]# make certificate  -- 테스트인증서 생성시 필요(생략해도 큰 문제 없음)
[root@smson apache_1.3.33]# make install

보안서버 SSL

4. 설정

보안서버 SSL

보안서버 SSL의 경우는 헤더도 암호화가 되므로 일반적인 웹사이트 설정처럼 443 포트를 공유할 수 없기에, 다른 도메인에 대한 추가 설정 시에는 443 포트가 아닌 다른 포트를 사용해야 합니다. 이와 같은 이유로 많은 도메인에 대한 설정이 필요할 경우는 Wildcard SSL 또는 Multi-Domain SSL 인증서를 고려해 보는 것이 좋습니다.

아래는 현재 저희가 설정하여 사용하고 있는 설정값 예 입니다.

[root@smson conf]# vi httpd.conf

DocumentRoot "/data1/wwwroot/analysis/html"
ServerName analysis.wsos.co.kr
ServerAdmin root@smson
ErrorLog /dev/null
TransferLog /dev/null
CustomLog /dev/null common

SSLPassPhraseDialog  exec:/usr/local/apache-ssl/conf/ssl/pw.sh

SSLLog      /var/log/ssl_engine_log

SSLCertificateFile $path/analysis_wsos_co_kr.crt
SSLCertificateKeyFile $path/analysis_wsos_co_kr.key
SSLCACertificateFile $path/analysis_wsos_co_kr.ca-bundl



5. 실행

보안서버 SSL

아래와 같이 '-DSSL' 로 SSL 보안서버 모드로 실행된 것을 확인 하실 수 있습니다.  일반 웹서비스는 'start' 옵션으로 실행하시면 됩니다.  실행 시에 비밀번호 자동입력 및 부팅시 자동실행과 같은 내용은 아래 내용을 참고하여 주십시오.

보안서버 SSL


6. 참고

Posted by 1010
61.Linux2008. 11. 12. 15:21
반응형

보안서버를 구축하게 되면 아래와 같이 구동 시에 비밀번호를 입력해야 합니다. 이때 간단한 설정으로 자동으로 비밀번호를 입력할 수 있습니다.

가. 비밀번호 자동 입력

[root@smson bin]# ./apachectl startssl
[Thu Oct 30 15:18:43 2008] [alert] httpd: Could not determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
Apache/1.3.33 mod_ssl/2.8.24 (Pass Phrase Dialog)
Some of your private key files are encrypted for security reasons.
In order to read them you have to provide us with the pass phrases.

Server analysis.wsos.co.kr:443 (RSA)
Enter pass phrase:

Ok: Pass Phrase Dialog successful.
./apachectl startssl: httpd started

[root@smson ssl]# vi pw.sh
#!/bin/sh
echo "password"
[root@smson ssl]# vi /usr/local/apache-ssl/conf/httpd.conf
<IfModule mod_ssl.c>
#   Pass Phrase Dialog:
#   Configure the pass phrase gathering process.
#   The filtering dialog program (`builtin' is a internal
#   terminal dialog) has to provide the pass phrase on stdout.
#SSLPassPhraseDialog  builtin
SSLPassPhraseDialog  exec:/usr/local/apache-ssl/conf/ssl/pw.sh

 나. 부팅시 자동 시작

 리눅스가 부팅 할때 /etc/rc* 에 있는 파일들을 실행합니다. rc 뒤에 붙은 숫자는 run level을 뜻합니다. 리눅스는 부팅 시에 run level을 지정할 수 있는데 일반적인 작업에서 사용되는 run level은 3입니다. 아래와 같이 간단한 스크립트를 작성하여 링크를 시켜 주시면 됩니다.

[root@smson bin]# cat apachectlstartssl
#!/bin/sh
/usr/local/apache-ssl/bin/apachectl startssl
[root@smson bin]# cd /etc/rc
rc          rc1.d       rc3.d       rc5.d       rc.d        rc.sysinit 
rc0.d       rc2.d       rc4.d       rc6.d       rc.local   
[root@smson bin]# cd /etc/rc3.d/
[root@smson rc3.d]# rm -rf S99apache
[root@smson rc3.d]# ln -s /usr/local/apache-ssl/bin/apachectlstartssl S99apache
[root@smson rc3.d]# ls -al
total 12
drwxr-xr-x    2 root     root         4096 Oct 30 17:50 .
drwxr-xr-x   10 root     root         4096 Oct 30 17:30 ..
lrwxrwxrwx    1 root     root           15 Jun 17  2005 K03rhnsd -> ../init.d/rhnsd
...
lrwxrwxrwx    1 root     root           43 Oct 30 17:50 S99apache -> /usr/local/apache-ssl/bin/apachectlstartssl
lrwxrwxrwx    1 root     root           41 Jun 17  2005 S99mysql -> /usr/local/mysql/share/mysql/mysql.server
[root@smson rc3.d]#
Posted by 1010
61.Linux2008. 11. 12. 15:20
반응형

1. 개인키 생성

개인키 생성

개인키는 1024bit 로 생성하는 것이 좋습니다. 기본값은 512bit 입니다. 개인키 분실시에는 인증서를 재발급 받아야 하기에 잘 백업해 두어야 한다.


2. 인증요청서( CSR ) 생성

CSR( Certificate Signing Request )은 SSL 서버를 운영하는 회사의 정보를 암호화하여 인증기관으로 보내 인증서를 발급받게 하는 일종의 신청서입니다. CSR은 ASCII 텍스트 파일로 생성됩니다. CSR을 생성할 때 서버의 식별명을 입력하게 됩니다.식별명은 각 서버를 공유하게 나타내는 이름으로 다음과 같은 정보를 포함합니다.

CSR 생성

주의사항

  • Common Name 에는 인증서를 설치할 사이트의 도메인의 이름을 정확하게 입력하셔야 합니다.
  • Common Name 에는 IP 주소, 포트번호, 경로명, http:// 나 https:// 등은 포함할 수 없습니다.
  • CSR 항목에는 < > ~ ! @ # $ % ^ * / \ ( ) ? 등의 특수 68 문자를 넣을 수 없습니다.
  • CSR 생성 후 서버에 개인키 (Private Key) 가 생성됩니다. 개인키를 삭제하거나 분실할 경우 인증서를 발급 받아도 설치가 불가합니다. 따라서 꼭 개인키를 백업 받아 두셔야 합니다.
  • 정보입력과정 마지막에 나오는 A challenge password 와 An optional company name 두 항목은 입력하지 마시고 Enter 만 누르고 넘어가야 합니다. 두 정보가 입력될 경우 잘못된 CSR 생성될 수 있습니다.


3. 테스트 인증서 생성 및 웹서버에 설정

SSL 테스트 인증서

테스트 인증서를 생성 후 웹서버에 아래와 같이 개인키와 인증서를 설정해 주신 후 재 시작 합니다.

인증서 설정


4. 웹브라우저에서 확인

보안경고

공인된 인증기관에서 발급되지 않은 인증서의 경우는 사용자가 처음 요청시에 위와 같이 '보안경고' 창을 노출합니다. 브라우저 하단 또는 상단의 열쇠모양의 아이콘을 클릭하여 인증서를 확인 하실 수 있습니다.

인증서 확인


5. 인증서 신청 및 발급

위에서 생성된 CSR 파일을 보면 base64 형식의 내용을 확인 하실 수 있습니다. 이문서의 첫 줄 -----BEGIN … 부터 마지막 줄 -----END … 까지 복사하여 지정된 SSL 접수페이지에 복사하여 붙여 넣은 뒤 입력정보와 함께 전송하면 접수가 완료됩니다.

대부분의 업체가 이메일을 통해 인증서를 수신하게 되는데, 보통 도메인인증파일과 루트인증파일 두 개를 압축해서 전달합니다.
인증서를 해당 서버에 저장 후 httpd.conf 파일에 설정해 주시면 됩니다.

국내구분 외산 국산
명칭 Comodo TrustSSL thwate VeriSign KICA
가격 40,000 300,000 240,000 440,000 120,000

SSL 인증서의 경우 가격이 저렴하다고 해서 SSL 보안서버의 성능이 떨어지거나 신뢰도가 낮은 것은 아닙니다. 가격은 브랜드 인지도, 로열티, 취급수수료에 의해 결정이 됩니다. 도메인 주소가 업체별로 차이가 있는 것과 동일하다고 생각하시면 됩니다. 각 업체별로 다양한 상품이 있는데, 값비싼 상품일수록 책임보험료가 높게 책정되어 있습니다. 문제가 발생 시에 발급기관에서 문제 발생 시에 책정된 보험료를 해당 사이트 사용자에게 보상을 해 주는데, 회원수가 많거나 회원들의 중요정보를 취급하는 경우가 아니고서는 비싼 상품을 선택할 필요는 없습니다.

내부의 서비스 운영 형태에 따라서 Wildcard 또는 Multi-Domain 인증서를 사용하시면 됩니다.  최근에는 해당 호스팅업체에서도 리셀러 방식의 판매대행을 하고 있고 가격도 더 저렴하기에 현재 서비스를 받고 있는 업체에 문의해 보는 것도 좋은 방법인 것 같습니다.


6. 인증서 확인

인증서 확인


7. 기타

보안경고

"보안경고창"은 해당 페이지 소스 내 오브젝트중에 https:// 가 아닌 http:// 로 절대경로가 지정된 것이 있어서 그렇습니다. 이를테면 웹페이지의 이미지 경로를 다른 도메인의 것을 사용했을 때, 해당 요청이 https 아닌 http라서 보안이 안 되는 요청이 있다는 경고창입니다.

HTTP 암호화

HTTP 패킷을 보았을 때 관련 정보가 암화화 된 것을 확인 하실 수 있습니다.

8. 참고


Posted by 1010
05.JSP2008. 11. 12. 12:30
반응형

JSTL

소개

  • J2EE 소형 클라이언트 기술인 JSP(JavaServer Pages)가 지난 몇 년 동안 널리 일반화되면서 독립적인 개발자들은 많은 사용자 정
    의 JSP 태그 라이브러리를 만들었습니다. 이러한 태그 라이브러리는 대부분 서로 다른 목표를 달성하도록 작성되었지만 반복, 조건 등의 일
    반적인 작업을 위한 유사한 솔루션을 제공하는 경향이 있습니다.
    유사하고 일반적이 문제점을 해결하는 독립적인 태그 라이브러리에 대한 필요성을 줄이기 위해 Java Community Process(JSR 52)의 지
    원하에 JSTL(JavaServer Pages Standard Tag Library)이 개발되었습니다. JSTL은 이러한 일반 기능을 처리하는 하나의 표준 솔루션
    을 제공합니다. (말그대로 표준태그라이브러리)
  • JSTL의 주요 강점 중 하나는 서블릿 컨텍스트에 저장된 데이타 같은 애플리케이션 데이타를 액세스 및 조작하는 쉬운 방법을 제공하는 간
    단한 EL을 사용할 수 있다는 것입니다.

EL 에 대하여

설치 방법

  • http://cvs.apache.org/builds/jakarta-taglibs/nightly/ 에서 다운
    \jakarta-taglibs-20051024\jakarta-taglibs\standard\lib
    에서 jstl 과 standard 파일 을 이 두개의 jar 파일을 우리의 웹애플리케이션의 /WEB-INF/lib 폴더에 넣습니다
    그 다음 tld 폴더의 tld 파일을 /WEB-INF/lib/tld 폴더 아래 넣습니다.
  • web.xml 에
     
    <!-- jstl 1.2 taglig -->
    <taglib>
    <taglib-uri>jstl-c</taglib-uri>
    <taglib-location>/WEB-INF/tlds/jstl/c.tld</taglib-location>
    </taglib>
    <taglib>
    <taglib-uri>jstl-fmt</taglib-uri>
    <taglib-location>/WEB-INF/tlds/jstl/fmt.tld</taglib-location>
    </taglib>
    <taglib>
    <taglib-uri>jstl-fn</taglib-uri>
    <taglib-location>/WEB-INF/tlds/jstl/fn.tld</taglib-location>
    </taglib>

    를 추가한다.

  • jsp 에 추가
     
    <%@ taglib uri="jstl-c" prefix="c" %>
    <%@ taglib uri="jstl-fmt" prefix="fmt" %>
    <%@ taglib uri="jstl-fn" prefix="fn" %>

사용 예(기본 문법)

Area Subfunction Prefix Description
Core Variable support c 변수지원
Core Flow control c 흐름제어
Core URL management c URL 처리
Core Miscellaneous c  
XML Core x XML 코어
XML Flow control x 흐름 제어
XML Transformation x XML 변환
I18n Locale fmt 지역
I18n Message formatting fmt 메시지 형식
I18n Number and date formatting fmt 숫자 및 날짜 형식
Database SQL sql SQL
Functions Collection length fn 콜렉션 처리
Functions String manipulation fn String 처리

http://java.sun.com/products/jsp/jstl/1.1/docs/tlddocs/index.html 참고

  • 변수지원태그
    set: <c:set var="varName" scope="session" value="someValue">
    var속성은 값을 지정할 변수의 이름
    <c:set t a r g e t ="" property="userName" value="someValue">
    target : 빈 프로퍼티나 맵 값을 설정한다.(Object)
    var와 target을 동시에 사용할 수 없다.
    scope속성은 변수가 위치하는 영역(page,request,session,application)
    value :저장하는 값
    remove :<c:remove var="varName" scope="session">
    var :삭제할 변수의 이름
    scope 속성은 삭제할 변수의 영역
    out : <c:out value="">
    value속성은 출력하려는 값
    catch : <c:catch var="">
    </c:catch>
    예외사항이 한번이라도 발생시 </c:catch>로 점프
    var에 정의 된 객체를 페이지 생존범위에 자동으로 묶어 나중에 var에 정의된 변수이름을 사용할 수 있다.
    예외 발생시
    : var 속성 사용시 exception 객체를 설정.
    <c:catch> 문 밖으로 제어가 떨어진다
 
<c:set var="num1" value="${20}" />
<c:set var="num2">
10.5
</c:set>

<c:set var="today" value="<%= new java.util.Date()%>" /><br>

변수 num1 = ${num1} <br>
변수 num2 = ${num2} <br>
num1 + num2 = ${num1+num2}<br>
오늘은 ${today}입니다.

<c:remove var="num1" scope="page" />

<p>
삭제한 후의 num1=${num1} <br>
삭제한 후의 num1 + num2 = ${num1 + num2}
 
<c:catch var="myException">
It's catch
<% int x = 10/0; %>
실행안됨.
</c:catch>
<c:if test="${myException != null}">
발생된 예외는 : ${myException.message} <br>
</c:if>
  • URL 관련
    import : <c:import url=""/>
    url속성에 명기한 파일을 현재 컨텐츠에 포함
    param : <c:param name="" value=""/>
    <jsp:param />과 같은 역할
    url : <c:url value="" var=""/>
    value에 들어있는 상대 경로 뒤에 jsessionid를 추가한다.(쿠키를 사용 못하는 경우)
    var : 옵션 속성으로 url을 참조하기 위해쓴다.
    redirect :<c:redirect url="' context=""/>
    context : url경로의 이름
 
<c:import url="Header.jsp" >
<c:param name="subTitle" value="This is subTitle"/>
</c:import>
  • 흐름제어 태그
    if : <c:if test="조건"> </c:if>
    test속성의 값에는 "조건"이 오는데 이 조건문의 결과값이 true 면 처리
     
    <c:if test="true">
    무조건 수행<br>
    </c:if>

    <c:if test="${param.name == 'bk'}">
    name 파라미터의 값이 ${param.name}입니다 <br>
    </c:if>

    <c:if test="${param.name eq 'bk'}">
    name 파라미터의 값이 ${param.name}입니다 <br>
    </c:if>

    <c:if test="${18 < param.age}">
    당신의 나이는 18세 이상입니다.
    </c:if>

    choose,when,otherwise : <c:choose>
    <c:when test="조건">
    </c:when>
    <c:otherwise>
    </c:otherwise>
    </c:choose>
    choose 태그는 자바의 switch 문과 if-else 의 혼합한 형태, 다수의 조건문을 하나의 블록에서 수행하고자 할때 사용
    -> switch문과의 차이점은 중간에 빠져 나가지 못한다는 것이다.
    -> when 의 어느 하나에도 실행되지 않을때 otherwise 실행
    -> otherswise 태그가 반드시 있어야 하는것은 아니다.

 
<c:choose>
<c:when test="${param.name == 'bk' }">
<li>당신의 이름은 ${param.name}입니다.
</c:when>
<c:when test="${param.age > 18 }">
<li>당신은 18세 이상입니다.
</c:when>

<c:otherwise>
<li> 당신은 'bk'가 아니고 18세 이상이 아닙니다.
</c:otherwise>
</c:choose>

forEach : <c:forEach var="변수" items="아이템" begin="시작값" end="끝값" step="증가값">
</c:forEach>
item 속성에 올수 있는 것들로는 Map,배열,Collection 이 있다.
varStatus는 javax.servlet.jsp.jstl.core.LoopTagStatus 객체 인스턴스변수를 만들며 count라는 프로퍼티가 있어 몇번의 회전인지 알 수있다.

 
<c:forEach var="i" begin="1" end="9">
<li>4 *${i} = ${4 *i}
</c:forEach>

<h4>int 형 배열</h4>

<c:forEach var="i" items="${intArray}" begin="2" end="4">
[${i}]
</c:forEach>

<h4>Map</h4>
<c:forEach var="i" items="${map}">
${i.key} = ${i.value}<br>
</c:forEach>

<c:forEach var="member" items="${memberList}" varStatus="memberLoopCount">
회원 $(memberLoopCount.count} : ${member} <br>
</c:forEach>

forTokens : <c:forTockens var="token" items="문자열" delins="구분자">
</c:forTockens>
forTokens 태그는 StringTokenizer 와 같은 기능을 제공한다.

 
<c:forTokens var="token" items="빨강색, 주황색, 노란색, 초록색, 파랑색, 남색, 보라색" delims=",">
${token}<br>
</c:forTokens>
  • 숫자 및 날짜 지원 형식
    The JSTL formatting actions allow various data elements in a JSP page, such as numbers,dates and times
    to be formatted and parsed in a locale-sensitive or customized manner.

formatNumber : 숫자 형식을 표현

 

number : <fmt:formatNumber value="9876543.61" type="number"/>
currency: <fmt:formatNumber value="9876543.61" type="currency"/>
percent : <fmt:formatNumber type="percent">9876543.61</fmt:formatNumber>

pattern=".000" :<fmt:formatNumber value="9876543.61" pattern=".000" />
pattern="#,#00.0#":<fmt:formatNumber value="9876543.612345" pattern="#,#00.0#"/>

parseNumber : 정해진 패턴을 문자열에서 수치를 파싱해내는 태그
formatDate :날짜 형식을 표현

 
<jsp:useBean id="now" class="java.util.Date"/>

<c:out value="${now}"/>
date: <fmt:formatDate value="${now}" type="date"/>
time: <fmt:formatDate value="${now}" type="time"/>
both: <fmt:formatDate value="${now}" type="both"/>

default:<fmt:formatDate value="${now}"
type="both" dateStyle="default" timeStyle="default"/>
short :<fmt:formatDate value="${now}"
type="both" dateStyle="short" timeStyle="short" />
medium :<fmt:formatDate value="${now}"
type="both" dateStyle="medium" timeStyle="medium" />
long :<fmt:formatDate value="${now}"
type="both" dateStyle="long" timeStyle="long" />
full :<fmt:formatDate value="${now}"
type="both" dateStyle="full" timeStyle="full" />

pattern="yyyy년MM월dd일 HH시mm분ss초"
<fmt:formatDate value="${now}" type="both"
pattern="yyyy년MM월dd일 HH시mm분ss초"/>

<fmt:formatDate value="${now}" pattern="yyyy/MM/dd" />

parseDate :정해진 패턴의 문자열에서 날짜를 파싱해내는 태그
timeZone : <fmt:timeZone value=""/>

setTimeZone : <fmt:timeZone value="" var="" scope=""/>

  • 국제화
    message <fmt:message
    setLocale <fmt:setLocale
    bundle <fmt:bundle
    setBundle <fmt:setBundle
    param <fmt:param
    requestEncoding <fmt:requestEncoding
  • SQL
    <sql:query sql="sqlQuery" var="varName" [scope="{page|request|session|application}"]
    [dataSource="dataSource"] [maxRows="maxRows"] [startRow="startRow"]>
    <sql:param>
    </sql:query>
         <sql:query var="customers" dataSource="${dataSource}">
    SELECT * FROM customers
    WHERE country ='China'
    ORDER BY lastname
    </sql:query>

    <table>
    <c:forEach var="row" items="">
    <tr>
    <td><c:out value="${row.lastName}"/></td>
    <td><c:out value="${row.firstName}"/></td>
    <td><c:out value="${row.address}"/></td>
    </tr>
    </c:forEach>
    </table>
Posted by 1010
05.JSP2008. 11. 12. 10:39
반응형

JSTL과 Velocity를 활용한 UI 레이어 구현 방법

Table of Contents

JSTL

소개

  • J2EE 소형 클라이언트 기술인 JSP(JavaServer Pages)가 지난 몇 년 동안 널리 일반화되면서 독립적인 개발자들은 많은 사용자 정
    의 JSP 태그 라이브러리를 만들었습니다. 이러한 태그 라이브러리는 대부분 서로 다른 목표를 달성하도록 작성되었지만 반복, 조건 등의 일
    반적인 작업을 위한 유사한 솔루션을 제공하는 경향이 있습니다.
    유사하고 일반적이 문제점을 해결하는 독립적인 태그 라이브러리에 대한 필요성을 줄이기 위해 Java Community Process(JSR 52)의 지
    원하에 JSTL(JavaServer Pages Standard Tag Library)이 개발되었습니다. JSTL은 이러한 일반 기능을 처리하는 하나의 표준 솔루션
    을 제공합니다. (말그대로 표준태그라이브러리)
  • JSTL의 주요 강점 중 하나는 서블릿 컨텍스트에 저장된 데이타 같은 애플리케이션 데이타를 액세스 및 조작하는 쉬운 방법을 제공하는 간
    단한 EL을 사용할 수 있다는 것입니다.

EL 에 대하여

설치 방법

  • http://cvs.apache.org/builds/jakarta-taglibs/nightly/ 에서 다운
    \jakarta-taglibs-20051024\jakarta-taglibs\standard\lib
    에서 jstl 과 standard 파일 을 이 두개의 jar 파일을 우리의 웹애플리케이션의 /WEB-INF/lib 폴더에 넣습니다
    그 다음 tld 폴더의 tld 파일을 /WEB-INF/lib/tld 폴더 아래 넣습니다.
  • web.xml 에
     
        <!-- jstl 1.2 taglig -->
         <taglib>
           <taglib-uri>jstl-c</taglib-uri>
           <taglib-location>/WEB-INF/tlds/jstl/c.tld</taglib-location>
        </taglib>
        <taglib>
           <taglib-uri>jstl-fmt</taglib-uri>
           <taglib-location>/WEB-INF/tlds/jstl/fmt.tld</taglib-location>
        </taglib>
        <taglib>
          <taglib-uri>jstl-fn</taglib-uri>
          <taglib-location>/WEB-INF/tlds/jstl/fn.tld</taglib-location>
        </taglib>
        

    를 추가한다.

  • jsp 에 추가
     
         <%@ taglib uri="jstl-c" prefix="c" %>
        <%@ taglib uri="jstl-fmt" prefix="fmt" %>
        <%@ taglib uri="jstl-fn" prefix="fn" %>
         

사용 예(기본 문법)

Area Subfunction Prefix Description
Core Variable support c 변수지원
Core Flow control c 흐름제어
Core URL management c URL 처리
Core Miscellaneous c  
XML Core x XML 코어
XML Flow control x 흐름 제어
XML Transformation x XML 변환
I18n Locale fmt 지역
I18n Message formatting fmt 메시지 형식
I18n Number and date formatting fmt 숫자 및 날짜 형식
Database SQL sql SQL
Functions Collection length fn 콜렉션 처리
Functions String manipulation fn String 처리

http://java.sun.com/products/jsp/jstl/1.1/docs/tlddocs/index.html 참고

  • 변수지원태그
    set: <c:set var="varName" scope="session" value="someValue">
    var속성은 값을 지정할 변수의 이름
    <c:set t a r g e t ="" property="userName" value="someValue">
    target : 빈 프로퍼티나 맵 값을 설정한다.(Object)
    var와 target을 동시에 사용할 수 없다.
    scope속성은 변수가 위치하는 영역(page,request,session,application)
    value :저장하는 값
    remove :<c:remove var="varName" scope="session">
    var :삭제할 변수의 이름
    scope 속성은 삭제할 변수의 영역
    out : <c:out value="">
    value속성은 출력하려는 값
    catch : <c:catch var="">
    </c:catch>
    예외사항이 한번이라도 발생시 </c:catch>로 점프
    var에 정의 된 객체를 페이지 생존범위에 자동으로 묶어 나중에 var에 정의된 변수이름을 사용할 수 있다.
    예외 발생시
    : var 속성 사용시 exception 객체를 설정.
    <c:catch> 문 밖으로 제어가 떨어진다
 
    <c:set var="num1" value="${20}" />
	<c:set var="num2">
		10.5
	</c:set>
	
	<c:set var="today" value="<%= new java.util.Date()%>" /><br>

	변수 num1 = ${num1} <br>
	변수 num2 = ${num2} <br>
	num1 + num2 = ${num1+num2}<br>
	오늘은 ${today}입니다.
	
	<c:remove var="num1" scope="page" />
	
	<p>
	삭제한 후의  num1=${num1} <br>
	삭제한 후의 num1 + num2 = ${num1 + num2}
   
 
       <c:catch var="myException">
     	It's catch
         <% int x = 10/0; %>
         실행안됨.
       </c:catch>
       <c:if test="${myException != null}">
           발생된 예외는 : ${myException.message} <br>
       </c:if>
     
  • URL 관련
    import : <c:import url=""/>
    url속성에 명기한 파일을 현재 컨텐츠에 포함
    param : <c:param name="" value=""/>
    <jsp:param />과 같은 역할
    url : <c:url value="" var=""/>
    value에 들어있는 상대 경로 뒤에 jsessionid를 추가한다.(쿠키를 사용 못하는 경우)
    var : 옵션 속성으로 url을 참조하기 위해쓴다.
    redirect :<c:redirect url="' context=""/>
    context : url경로의 이름
 
    <c:import url="Header.jsp" >
	<c:param name="subTitle" value="This is subTitle"/>
    </c:import>
   
  • 흐름제어 태그
    if : <c:if test="조건"> </c:if>
    test속성의 값에는 "조건"이 오는데 이 조건문의 결과값이 true 면 처리
     
       <c:if test="true">
         무조건 수행<br>
        </c:if>
    
        <c:if test="${param.name == 'bk'}">
          name 파라미터의 값이 ${param.name}입니다 <br>
        </c:if>
    
        <c:if test="${param.name eq 'bk'}">
          name 파라미터의 값이 ${param.name}입니다 <br>
        </c:if>
    
        <c:if test="${18 < param.age}">
    	 당신의 나이는 18세 이상입니다.
        </c:if>   
       

    choose,when,otherwise : <c:choose>
    <c:when test="조건">
    </c:when>
    <c:otherwise>
    </c:otherwise>
    </c:choose>
    choose 태그는 자바의 switch 문과 if-else 의 혼합한 형태, 다수의 조건문을 하나의 블록에서 수행하고자 할때 사용
    -> switch문과의 차이점은 중간에 빠져 나가지 못한다는 것이다.
    -> when 의 어느 하나에도 실행되지 않을때 otherwise 실행
    -> otherswise 태그가 반드시 있어야 하는것은 아니다.

 
     <c:choose>
       <c:when test="${param.name == 'bk' }">
	<li>당신의 이름은 ${param.name}입니다.
     </c:when>
     <c:when test="${param.age > 18 }">
	<li>당신은 18세 이상입니다.
     </c:when>

     <c:otherwise>
	<li> 당신은 'bk'가 아니고 18세 이상이 아닙니다.
     </c:otherwise>
     </c:choose> 
    

forEach : <c:forEach var="변수" items="아이템" begin="시작값" end="끝값" step="증가값">
</c:forEach>
item 속성에 올수 있는 것들로는 Map,배열,Collection 이 있다.
varStatus는 javax.servlet.jsp.jstl.core.LoopTagStatus 객체 인스턴스변수를 만들며 count라는 프로퍼티가 있어 몇번의 회전인지 알 수있다.

 
       <c:forEach var="i" begin="1" end="9">
	<li>4 *${i} = ${4 *i}
       </c:forEach>

       <h4>int 형 배열</h4>

       <c:forEach var="i" items="${intArray}" begin="2" end="4">
	[${i}]
       </c:forEach>

       <h4>Map</h4>
       <c:forEach var="i" items="${map}">
	  ${i.key} = ${i.value}<br>
       </c:forEach>

       <c:forEach var="member" items="${memberList}" varStatus="memberLoopCount">
	  회원 $(memberLoopCount.count} : ${member} <br>
       </c:forEach>
     

forTokens : <c:forTockens var="token" items="문자열" delins="구분자">
</c:forTockens>
forTokens 태그는 StringTokenizer 와 같은 기능을 제공한다.

 
       <c:forTokens var="token" items="빨강색, 주황색, 노란색, 초록색, 파랑색, 남색, 보라색" delims=",">
     	${token}<br>
       </c:forTokens>
     
  • 숫자 및 날짜 지원 형식
    The JSTL formatting actions allow various data elements in a JSP page, such as numbers,dates and times
    to be formatted and parsed in a locale-sensitive or customized manner.

formatNumber : 숫자 형식을 표현

 
 
      number  : <fmt:formatNumber value="9876543.61" type="number"/>
      currency: <fmt:formatNumber value="9876543.61" type="currency"/>
      percent : <fmt:formatNumber type="percent">9876543.61</fmt:formatNumber>

      pattern=".000"    :<fmt:formatNumber value="9876543.61" pattern=".000" />
      pattern="#,#00.0#":<fmt:formatNumber value="9876543.612345" pattern="#,#00.0#"/>
    

parseNumber : 정해진 패턴을 문자열에서 수치를 파싱해내는 태그
formatDate :날짜 형식을 표현

 
      <jsp:useBean id="now" class="java.util.Date"/>
	
         <c:out value="${now}"/>
           date: <fmt:formatDate value="${now}" type="date"/>
           time: <fmt:formatDate value="${now}" type="time"/>
           both: <fmt:formatDate value="${now}" type="both"/>

           default:<fmt:formatDate value="${now}"
                        type="both" dateStyle="default" timeStyle="default"/>
           short  :<fmt:formatDate value="${now}"
                        type="both" dateStyle="short"   timeStyle="short"  />
           medium :<fmt:formatDate value="${now}"
                        type="both" dateStyle="medium"  timeStyle="medium" />
           long   :<fmt:formatDate value="${now}"
                        type="both" dateStyle="long"    timeStyle="long"   />
           full   :<fmt:formatDate value="${now}"
                        type="both" dateStyle="full"    timeStyle="full"   />

          pattern="yyyy년MM월dd일 HH시mm분ss초"
             <fmt:formatDate value="${now}" type="both"
                             pattern="yyyy년MM월dd일 HH시mm분ss초"/>
            
         <fmt:formatDate value="${now}" pattern="yyyy/MM/dd" />

parseDate :정해진 패턴의 문자열에서 날짜를 파싱해내는 태그
timeZone : <fmt:timeZone value=""/>

setTimeZone : <fmt:timeZone value="" var="" scope=""/>

  • 국제화
    message <fmt:message
    setLocale <fmt:setLocale
    bundle <fmt:bundle
    setBundle <fmt:setBundle
    param <fmt:param
    requestEncoding <fmt:requestEncoding
  • SQL
    <sql:query sql="sqlQuery" var="varName" [scope="{page|request|session|application}"]
    [dataSource="dataSource"] [maxRows="maxRows"] [startRow="startRow"]>
    <sql:param>
    </sql:query>
         <sql:query var="customers" dataSource="${dataSource}">
          SELECT * FROM customers
          WHERE country ='China'
          ORDER BY lastname
         </sql:query>
         
         <table>
          <c:forEach var="row" items="">
             <tr>
               <td><c:out value="${row.lastName}"/></td>
               <td><c:out value="${row.firstName}"/></td>
               <td><c:out value="${row.address}"/></td>
             </tr>
          </c:forEach>
         </table>
       

<sql:update>
<sql:setDataSource>
<sql:param>
<sql:dateParam>

  • XML 코어
    <x:parse>
    <x:out>
    <x:set>
  • 흐름제어
    <x:if>
    <x:choose>
    <x:when>
    <x:otherwise>
    <x:forEach>
  • XML 변환
    <x:transform>
    <x:param>
  • function
    contains
    containsIgnoreCase
    endsWith
    escapeXml
    indexOf
    join
    length
    replace
    split
    startsWith
    substring
    substringAfter
    substringBefore
    toLowerCase
    toUpperCase
    trim
         <c:if test="${fn:contains(name, searchString)}">
         <c:if test="${fn:containsIgnoreCase(name, searchString)}">
         <c:if test="${fn:endsWith(filename, ".txt")}">
         ${fn:escapeXml(param:info)}
         ${fn:indexOf(name, "-")}
         ${fn:join(array, ";")} 
         You have ${fn:length(shoppingCart.products)} in your shopping cart.
         ${fn:replace(text, "-", "•")}
         ${fn:split(customerNames, ";")}
         <c:if test="${fn:startsWith(product.id, "100-")}">
         P.O. Box: ${fn:substring(zip, 6, -1)}
         P.O. Box: ${fn:substringAfter(zip, "-")}
         Zip (without P.O. Box): ${fn:substringBefore(zip, "-")}
         Product name: ${fn.toLowerCase(product.name)}
         Product name: ${fn.UpperCase(product.name)}
         Name: ${fn.trim(name)}
       

Velocity

Velocity

소개

  • 벨로시티란 자바 기반의 템플릿 엔진입니다.
    벨로시티를 활용하면 간단하면서도 강력한 템플릿 언어를 통하여 자바 코드에 정의된 객체를 액세스할 수 있습니다.
    벨로시티를 웹 개발에 사용하면, 웹 디자이너는 자바 프로그래머와 병렬로 작업을 할 수 있으며 MVC(모델-뷰-컨트롤러) 모델에 따라 웹 사이트를 개발할 수 있습니다. 더 자세히 설명하면 웹 페이지 디자이너의 경우 보기 좋은 사이트를 만드는 데만 집중하면 되고, 프로그래머는 잘 동작하는 코드를 만드는 데만 집중하면 된다는 뜻입니다.
    벨로시티는 웹 페이지와 자바 코드를 분리하여, 장기적인 측면에서 볼 때 웹 사이트를 손쉽게 유지보수할 수 있도록 하고, 자바 서버 페이지 (JSP) 또는 PHP를 대체할 수 있는 방안을 제시합니다. 벨로시티의 쓰임새는 웹 사이트에 국한되지 않습니다. 예를 들면, 템플릿으로부터 SQL이나 포스트스크립트, 또는 XML(XML 변환에 대해서는 벨로시티 툴 중 하나인 아나키아(Anakia)를 참조)문서를 생성하는 데 쓰일 수 있습니다. 벨로시티는 스탠드얼론 유틸리티처럼 사용하여 소스 코드나 리포트를 생성할 수도 있고, 다른 시스템의 컴포넌트로 통합할 수도 있습니다. 또한 벨로시티는 터빈 (또다른 자카르타 서브 프로젝트 중 하나) 웹 애플리케이션 프레임웍에 템플릿 서비스를 제공합니다. 벨로시티와 터빈을 조합하면 진정한 MVC 모델에 따라 웹 애플리케이션을 개발할 수 있습니다

설치 방법

  • web.xml 수정
     
       <servlet>
         <servlet-name>velocity</servlet-name>
            <servlet-class>org.apache.velocity.tools.view.servlet.VelocityViewServlet
         </servlet-class>
         <init-param>
            <param-name>org.apache.velocity.toolbox</param-name>
            <param-value>/WEB-INF/velocity-toolbox.xml</param-value>
         </init-param>
         <init-param>
            <param-name>org.apache.velocity.properties</param-name>
            <param-value>/WEB-INF/velocity.properties</param-value>
           </init-param>
         <load-on-startup>10</load-on-startup>
       </servlet>
       <servlet-mapping>
          <servlet-name>velocity</servlet-name>
          <url-pattern>*.vm</url-pattern>
       </servlet-mapping>
     
  • 파일 생성
    velocity.properties 파일
    velocity-toolbox.xml 을 생성 한 후 web_inf/lib 아래 둡니다.
    velocity-toolbox.xml
    <tool>
       <key>date</key>
       <scope>application</scope>
       <class>org.apache.velocity.tools.generic.DateTool</class>
     </tool>
    
      <tool>
      <key>math</key>
      <scope>application</scope>
      <class>org.apache.velocity.tools.generic.MathTool</class>
    </tool>
     ...
    

사용 예(기본 문법)

Velocity Template Language(VTL) 은 Template 에서 사용되는 Velocity 고유의 언어를 의미합니다.

  • References(참조형)
    Variables(변수) - 다음과 같이 $를 먼저 쓰고 그 뒤에 식별자를 적어주는 방식으로 사용
    ex) $foo
    Property(특성) - $ 다음에 식별자를 쓰고, 마침표(.)후에 다시 식별자의 형태로 사용
    ex) $foo.name
    Method(메소드) - $다음에 식별자를 쓰고 마침표 후에 호출할 메소드의 이름을 적는다
    ex)$foo.getName()
  • Directive(지시형)
    #set - reference 의 값을 설정한다.
    #if/elseif/else - 조건문 제어
    #foreach ---- 제어
    #include - velocity 로 파싱되지 않는 파일의 출력
    #parse -velocity 로 파싱된 파일 출력
    #stop -template 엔진의 정지
    #macro - 반복적으로 사용할 vm정의
  • Comment (주석)
      ## - 한줄짜리 주석
      #* ... *# 여러줄 짜리 주석
      
     ##This is an example velocity template
     #set($this = "Velocity")
       $this is great! But It's so hard.

     #foreach($name in $list)
       $name is great!
     #end

     #set($condition = true)
     #if ($condition)
        The condition is true!
     #else
       The condition is false
     #end
  

http://jakarta.apache.org/velocity/docs/vtl-reference-guide.html

Tool box 에 대해

VelocityTools is a collection of Velocity subprojects with a common goal of creating tools and infrastructure for building both web and non-web applications using the Velocity template engine.

  • Generic Tool (http://jakarta.apache.org/velocity/tools/generic/)
    *DateTool : A tool for manipulating and formatting dates
    *MathTool :A tool for performing floating point math.
    *NumberTool :A tool for formatting numbers
    *IteratorTool :A convenience tool to use with #foreach loops. It wraps a list to let the designer specify a
    condition to terminate the loop, and reuse the same list in different loops.
    *RenderTool:A tool to evaluate and render arbitrary strings of VTL (Velocity Template Language).
          Example uses:
      $date                         -> Oct 19, 2003 9:54:50 PM
      $date.long                    -> October 19, 2003 9:54:50 PM PDT
      $date.medium_time             -> 9:54:50 PM
      $date.full_date               -> Sunday, October 19, 2003
      $date.get('default','short')  -> Oct 19, 2003 9:54 PM
      $date.get('yyyy-M-d H:m:s')   -> 2003-10-19 21:54:50
     
      $myDate                        -> Tue Oct 07 03:14:50 PDT 2003
      $date.format('medium',$myDate) -> Oct 7, 2003 3:14:50 AM 
    
    
        
  • VelocityView (http://jakarta.apache.org/velocity/tools/view/)

JSTL 과 Velocity

같은 로직에 대해 두가지를 사용하여 각각 구현

다양한 View Technology에 대한 실행 속도 비교.

현재 개발중 우리들이 많이 사용하는 View 기술들을 이용하여 실행속도를 비교해 보면 다음 그래프와 같다.

이 그래프는 100명의 동시 접속자에 대한 테스트를 진행한 결과이다. 이 그래프는 Expert One-on-One J2EE Design and Development 책의 Chapter 15의 Web-Tier Performance Issues에서 인용하였다.

위와 같이 테스트를 진행한 결과 JSP는 초당 54페이지, Velocity는 초당 112페이지, XMLC는 초당 128 페이지, XSLT는 6,7페이지를 서비스하였다. 이 부분에서 눈여겨 볼 부분은 Velocity에 대한 결과라할 수 있다. 국내에서는 아직까지 많이 사용되지 않는 기술이지만 위의 실행 결과를 보면 사용할만한 가치가 있다는 것을 확인할 수 있다.

참고문헌

문서에 대하여

최초작성자 : 박재성
최초작성일 : 2005년 10월 15일
버전 : 1.0
문서이력 :

  • 2005년 10월 15일 박재성 문서 최초 생성 : 강좌 문서 템플릿 및 JSP와 Velocity에 대한 속도 비교문서 추가
Posted by 1010
90.개발관련문서2008. 11. 11. 17:49
반응형
=IF(LEN(#REF!)=10,MID(#REF!,4,2),"0"&MID(#REF!,4,1))
Posted by 1010
01.JAVA/Java2008. 11. 11. 10:13
반응형
import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.html.HTML;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.HttpURLConnection;
import java.util.Enumeration;
import javax.swing.text.BadLocationException;
import javax.swing.text.MutableAttributeSet;
import javax.swing.text.html.HTML.Tag;
import javax.swing.text.html.parser.ParserDelegator;
public class HTMLParsing
{
 //파서는 콜백 형식으로 되어 있다. 각 태그가 들어 올때 적절한 메소드가 호출됨
 private class CallbackHandler extends HTMLEditorKit.ParserCallback
 {
  @Override
  public void flush() throws BadLocationException
  {
   System.out.println("flush");
  }
  @Override
  public void handleComment(char[] data, int pos)
  {
   System.out.println("Cmt " + new String(data));
  }
  @Override
  public void handleEndOfLineString(String eol)
  {
   System.out.println("EOL ");
  }
  @Override
  public void handleEndTag(Tag t, int pos)
  {
   System.out.println("End </" + t + ">");
  }
  @Override
  public void handleError(String errorMsg, int pos)
  {
//   System.out.println("ERROR\t" + new String(errorMsg));
  }
  @Override
  public void handleSimpleTag(Tag t, MutableAttributeSet a, int pos)
  {
   System.out.print("Sim <" + t.toString() + ">\n");
   for (Enumeration e = a.getAttributeNames(); e.hasMoreElements();)
   {
    Object attributeName = e.nextElement();
    System.out.print("\t" + attributeName + "=");
    System.out.println(a.getAttribute(attributeName));
   }
  }
  @Override
  public void handleStartTag(Tag t, MutableAttributeSet a, int pos)
  {
   System.out.println("Str <" + t + ">");
   for (Enumeration e = a.getAttributeNames(); e.hasMoreElements();)
   {
    Object attributeName = e.nextElement();
    System.out.print("\t" + attributeName + "=");
    System.out.println(a.getAttribute(attributeName));
   }
  }
  public void handleText(char[] data, int pos)
  {
   System.out.println("\t\t" + new String(data));
  }
 }
 public void parse(String str)
 {
  try
  {
   //입력받은 URL에 연결하여 InputStream을 통해 읽은 후 파싱 한다.
   URL url = new URL(str);
   HttpURLConnection con = (HttpURLConnection) url.openConnection();
   InputStreamReader reader =
     new InputStreamReader(con.getInputStream(), "euc-kr");
   new ParserDelegator().parse(reader, new CallbackHandler(), true);
   con.disconnect();
  } catch (Exception e)
  {
   e.printStackTrace();
  }
 }
 public static void main(String[] args)
 {
  HTMLParsing parser = new HTMLParsing();
  parser.parse("http://ecos.bok.or.kr/jsp/use/100keystat/100KeyStatCtl.jsp");
 }
}
Posted by 1010
반응형

HTML 태그 제거 정규식#

 

태그제거[1] #

  1. // 정규표현식으로 제거
     String.replaceAll("<(/)?([a-zA-Z]*)(\\s[a-zA-Z]*=[^>]*)?(\\s)*(/)?>","");

한 줄로 표현하기[1] #

  1. String.replaceAll("("\r|\n","");

주석 제거#

  1. Pattern.compile("<!--.*-->", Pattern.DOTALL)
      .matcher(text)
      .replaceAll("");

HTML 태그 제거 소스 [2] #

  1. public class HTMLCleaner
    {
  2.  public static void main(String[] args)
     {
      HTMLCleaner cleaner = new HTMLCleaner();
  3.   //System.out.println(cleaner.clean("<html><head><script>aaaa</script></head><body><div>aaa</div> <div> <script></script></div><img src=\"http://tong.nate.com\" values=\">\"> 이건 어떻게 될까요 <!-- zmzm --></body></html> "));
  4.  }
  5.  private static interface Patterns
     {
      // javascript tags and everything in between
      public static final Pattern SCRIPTS = Pattern.compile("<(no)?script[^>]*>.*?</(no)?script>", Pattern.DOTALL);
  6.   public static final Pattern STYLE = Pattern.compile("<style[^>]*>.*</style>", Pattern.DOTALL);
      // HTML/XML tags
  7.   public static final Pattern TAGS = Pattern.compile("<(\"[^\"]*\"|\'[^\']*\'|[^\'\">])*>");
  8.   public static final Pattern nTAGS = Pattern.compile("<\\w+\\s+[^<]*\\s*>");
      // entity references
      public static final Pattern ENTITY_REFS = Pattern.compile("&[^;]+;");
      // repeated whitespace
      public static final Pattern WHITESPACE = Pattern.compile("\\s\\s+");
     }
  9.  /**
      * Clean the HTML input.
      */
     public String clean(String s)
     {
      if (s == null)
      {
       return null;
      }
  10.   Matcher m;
  11.   m = Patterns.SCRIPTS.matcher(s);
      s = m.replaceAll("");
      m = Patterns.STYLE.matcher(s);
      s = m.replaceAll("");
      m = Patterns.TAGS.matcher(s);
      s = m.replaceAll("");
      m = Patterns.ENTITY_REFS.matcher(s);
      s = m.replaceAll("");
      m = Patterns.WHITESPACE.matcher(s);
      s = m.replaceAll(" ");
  12.   return s;
     }
  13. }

* 완전하지는 않다.


See also#

정규식(Regular-Expression)

 

참고자료#

(1)  a b  http://fairworld.tistory.com/138

(2) a http://okjsp.pe.kr/seq/111879


Posted by 1010
반응형

HTML을 파싱해보면 알겠지만, HTML 파싱만큼 비정형적인 것에 대한 분노를 끓어오르게 하는 것은 좀처럼 없는 것 같다. 다소 오바긴 하지만, 지난 며칠간의 상황이 그렇다.

HTML은 알다시피 상당히 융통성 있는 구조를 띄고 있는데, 이 융통성이란 것이 코드를 작성하는 데 있어 가장 골치아프고 황당한 경우를 많이 겪게 만드는 걸림돌로 작용할 때가 많다. 그중 몇 가지를 들자면, 여는 태그와 닫는 태그가 굳이 쌍을 이루지 않아도 브라우저에서 그럭저럭 보여진다는 것, 한 페이지안에 각종 HTML, BODY, 등의 태그가 중복되어 나타나는 것, 설상가상으로 한 페이지에 여러개의 문자 인코딩이 섞여 그것들끼리 꼬이고 충돌하는 등의 문제를 겪게 된다. 특히나 요즘같이 웹 표준에 대한 관심이 고조되고 있는 상황에서조차도 그러한 비정형의 극치를 달리는 HTML 페이지들이 만들어져 버젓이 브라우저의 인내심을 테스트하고 있다.

아무튼, 오늘 소개하는 HTML 파서는 누차 강조하지만 비정형의 극치, HTML을 well-formedness를 요구하는 XML 포맷으로 변환시켜 파싱할 수 있도록 해주는 툴이다. 이름하야 HtmlCleaner!

공식 웹 사이트 : http://htmlcleaner.sourceforge.net/

요즘 자주 쓰고 있는 HTML 파서는 널리 알려져 있는 Java 기반의 HtmlParser인데, 이 HtmlParser는 우연찮게도 Refactoring to Patterns(패턴을 활용한 리팩터링)에 리팩터링 예제로 단골손님처럼 나오는 프로그램이다. 아무튼 문제는 이 HtmlParser가 상당히 섬세하고 다양한 기능을 제공하기는 하지만 치명적인 약점으로 주석처리에 상당히 약하다는 것과 문법에 맞지 않는 HTML 태그가 포함된 HTML 문서의 파싱을 가끔씩 거부한다는 것이다. 예를 들면, 중간에 주석이 포함되어 있고, 그 안쪽으로 태그가 있을 경우 그 안쪽에 있는 태그 처리를 무시하고 넘어가 버린다는 것이다. 정작 필요한 내용이 주석이 시작된 다음에 나올 경우가 있는데, 이럴땐 정말 난감하다. -_-;

오늘도 마침 이러한 문제가 생겨서 고민고민 해가면서 주석을 없애보기도 하고 해보았지만, 워낙 문법을 지키지 않은 페이지라서 주석 제거하는 것조차도 힘에 버거웠다. 그러던 찰나 지난달 쯤인가 HTML 파서중에 HTML 페이지를 XML 파일로(Well-formedness!!!) 둔갑시켜 줘서 파싱을 수행한다는 파서를 소개했던 글이 갑자기 생각나 급하게 인터넷을 찾아보니, 나온게 바로 HtmlCleaner. ^^;

HtmlCleaner는 말 그대로 손쉽게 비정형 HTML 페이지를 파싱해서 중간에 필요없다 싶은 주석이나 몇가지 파싱에 불필요한 요소들을 사전에 미리 제거하고 파싱을 수행하는데, 파싱이 완료되면 알아서 XML 포맷으로 변환된다. 변환된 다음에는 출력을 XML 포맷의 문자열이나 파일과 같은 OutputStream으로도 내보낼 수 있다. 이렇게 나오는 결과물에 대한 파싱은 상당히 쉬워짐은 말할 것도 없다.

사용자 삽입 이미지
위 그림은 HtmlCleaner 클래스의 핵심! setOmitXXX() 메소드들이다. HTML 문서를 파싱할 때 몇 가지 태그나 주석들을 미리 제거할 수 있도록 설정하는 메소드이다. 실제 사용예를 보자면, 가장 간단한 사용법은 이렇다.

import java.io.IOException;

 

import org.htmlcleaner.HtmlCleaner;

 

public class HtmlCleanerTest {

    public static void main(String[] args) {

        HtmlCleaner cleaner = new HtmlCleaner("test.html");

 

        try {

            cleaner.setOmitComments(true);

            cleaner.setOmitDeprecatedTags(true);

            cleaner.setOmitUnknownTags(true);

            cleaner.clean();

            cleaner.writeXmlToFile("output.xml");

        } catch (IOException e) {

            e.printStackTrace();

        }       

    }

}


상당히 간단하다. HtmlCleaner 객체를 만든 다음 몇가지 설정을 해주고 clean() 메소드만 호출하게 되면 파싱 대상 문서가 XML 포맷으로 변환된다. 물론 Well-formed 된 채로.

그렇지만 HtmlCleaner는 HtmlParser 만큼의 파싱 고유의 기능을 풍부하게 제공하지는 않는다. 따라서 HTML을 파싱할 것이라면, 특히나 비구조적인 내용이 충만한 ^^ 골치덩어리 HTML 문서를 파싱할 것이라면 HtmlCleaner와 HtmlParser를 함께 사용하는 것이 좋을 것이다. :)


출처 : http://decoder.tistory.com/41
Posted by 1010
반응형

파싱이란 프로그램 또는 인간이 웹 페이지의 소스를 읽고 이를 해석하는 작업을 의미합니다.

웹 브라우저는 HTML 페이지의 원본 소스를 파싱하여 파싱된 소스코드를 생성하는데
이 파싱된 소스코드가 비주얼하게 표현되므로 시각적인 웹 문서가 보이는 것입니다.

브라우저에 의해 파싱된 이 소스는 원본 HTML 소스와 다를 수 있고
브라우저에 맞게끔 변경이 될 수도 있습니다.

DHTML의 DOM 등으로 페이지의 값을 수정하게 되면
원본 HTML 소스(소스 보기 기능을 이용한 소스)가 아닌
파싱된 소스코드가 변경되는걸 확인할 수 있습니다.




파싱된 소스코드 확인하기: 주소창에 다음 코드를 입력 후 Enter
javascript:void(clipboardData.setData('Text', document.documentElement.outerHTML));

실행 후 메모장에서 Ctrl+V 눌러줌

원본 소스코드 확인하기 : IE 메뉴 '보기-소스'

Posted by 1010
반응형
아래 코드는 현재 블로그에서 적용되고있는 스크립트입니다.
왜 이스크립트를 사용했냐면.. 귀차니즘때문에..ㅋㅋ^^
문제가 뭐였냐면 글을 작성하다보면 링크항목이 몇개씩 있습니다.
기본으로 "_self" 형태로 링크가되어있어 사용자는 링크확인후 뒤로가기로 페이지를 돌아와야 했습니다.
그렇다고 매번 링크에 target을 "_blank"로 변경해주는것도 한두번이지 많은 링크가 있을땐 어이쿠....

그리하여 document.links로 링크객체들의 타겟속성을 "_blank"로 변경해주었더니
링크가 되는 부분은 전부 새창으로 뜨면서(관리자모드까지..) 더불편해지더라구요
그리하여 내린 대책이 특정영역의 특정태그에 대해서 속성을 변경하면 좋겠다고 생각을 했습니다.

분문에 해당하는 div태그에 id를 "mcontents"
로 설정해주고 해당영역에 존재하는  <a>태그들에게 타겟을 새창뜨기로 변경하였더니 본문에 해당하는 링크항목(<a>)만 새창으로 활성화가 되더라구요^^
저와 같은 고민을 하고 계시는 분은 한번적용시켜보세요^^

function setTarget()
{
  // id가 'mcontents'인 영역안의 'a'태그의 항목을 가져와서 속성을 변경
  for(var i=0; i<document.getElementById("mcontents").getElementsByTagName("A").length; i++)
  {
    document.getElementById("mcontents").getElementsByTagName("A")[i].target = "_blank";
  }
}


이번 설정으로 링크 목록의 정보를 가져오는 예제도 한번 만들어 보았습니다.
소스코드는
http://www.koxo.com 사이트에서 참조하였구요(레이아웃 잡는게 귀찮아서;;)
예제는 문서의 모든영역의 링크속성정보 혹은 특정 영역의 특정태그에 대한 속성정보를 보여주는 예제입니다.
특정영역의 특정태그는 위에서 사용했던 "sample" 영역의 <A> 태그만 적용하겠습니다.
(약간만 수정하면 여러형태고 사용이 가능합니다. ^^)
소스코드 아래 샘플도 있으니 확인해보시면 더욱 좋습니다.

<script type="text/javascript" language="javascript">

// 전체 항목에 있는 링크목록 보여주는 함수

function showAll()

{

  ShowInfo(document.links);

}

// 특정영역에 있는 특정태그 목록을 보여주는 함수(여기서는 A 태그만 사용)

function targetAll()

{

    ShowInfo(document.getElementById("sample").getElementsByTagName("A"));

}

// 특정 오브젝트를 받아서 해당 오브젝트의 정보를 보여주는 함수

function ShowInfo(obj)

{

  // 창단기 문자열을 변수로 만든다.

  closeStr='<SPAN style="border:solid 1 gray;padding:3;background:ffa;float:right;cursor:hand" ';

  closeStr+='onClick=self.close()>창닫기</SPAN>';

  // 테이블을 시작한다.

  str=closeStr+'<TABLE border=1 cellpadding=1 cellspacing=0 width=100% align=center>';

  // 테이블 제목을 넣는다.

  str+='<TR bgcolor=eeeeee><TH>#</TH><TH>protocol</TH><TH>href</TH>';

  str+='<TH>hash</TH><TH>target</TH><TH>host</TH></TR>';

 

  // 출력할 윈도우를 열고 이름(newWin)을 부여한다.

  newWin=window.open('','newWin','width=900,height=500,top=100,left=50,toolbars=no,scrollbars=yes');

 

  // 연결 배열변수 길이만큼 반복하는 루프를 시작한다.

  for (numb=0;numb<obj.length;numb++){

    // 번호를 넣는다.

    str+='<TR><TD>links['+numb+']</TD>';

    // 프로토콜을 넣는다.

    str+='<TD>'+(obj[numb].protocol?obj[numb].protocol:'&nbsp;')+'</TD>';

    // 각각 삼항식으로 빈칸이면 공백문자(&nbsp;)를 넣는다.

   

    // 연결주소를 넣는다.

    str+='<TD>'+(obj[numb].href?obj[numb].href:'&nbsp;')+'</TD>';

    // 부위지정자를 넣는다.

    str+='<TD>'+(obj[numb].hash?obj[numb].hash:'&nbsp;')+'</TD>';

    // 중복성이므로 생략한다.

//    str+='<TD>'+(obj[numb].search?obj[numb].search:' ')+'</TD>';

    // 목표 프레임을 넣는다.

    str+='<TD>'+(obj[numb].target?obj[numb].target:'&nbsp;')+'</TD>';

    // 호스트를 넣는다.

    str+='<TD>'+(obj[numb].host?obj[numb].host:'&nbsp;')+'</TD>';

    // 중복성이므로 생략한다.

//    str+='<TD>'+(obj[numb].pathname?obj[numb].pathname:' ')+'</TD>';

    str+='</TR>'; // 테이블 한줄을 닫는다.

  } // 루프를 종료한다.

 

 

  str+='</TABLE>'+closeStr; // 테이블을 닫는다.

  newWin.document.write(str); // 결과를 보조창에 출력한다.

}

</script>


 

<div class="show" title="결과">

<input type="button" value="문서내 모든 링크정보 보기" onclick="showAll()" />

<input type="button" value="특정 영역 링크정보 보기" onclick="targetAll()" />

</div>

<div id="sample">

<a href="http://www.naver.com" target="_blank">네이버</a>

</div>

<div>

<a href="http://www.daum.net" target="_top">다음</a>

</div>



다음

━━━━━━━━━━━━━━━
by 한상국(han3925)
MAIL  han3925@gmail.com
         han3925@hotmail.com
BLOG pointnet.tistory.com
━━━━━━━━━━━━━━━

Posted by 1010
02.Oracle/DataBase2008. 11. 10. 13:18
반응형
DB LINK의 사용은 다른 인스턴스의 객체를 사용하기 위함이다.




위에서 보면 ORCL USER는 PROD의 TEST SCHEMA가 가진 객체를 조회하고 싶은 상황이다.

일반적으로 자신이 가지고 있지 않은 객체를 조회하고 싶을때는 TNS 서비스를 통해
해당 객체를 소유한 USER로 접속하지 않으면 안된다.

DB LINK는 ORCL이 TEST를 소유한 것 같이 조회를 가능하게 한다.
DB LINK를 만들기 위해서는 CREATE SESSION ( 이 권한이 없으면 세션을 만들지도 못한다; ) 과
CREATE DATABSE LINK / CREATE PUBLIC DATABASE LINK 둘중에 하나를 가져야 한다.

Privilege Database Required For

CREATE DATABASE LINK

Local

Creation of a private database link.

CREATE PUBLIC DATABASE LINK

Local

Creation of a public database link.

CREATE SESSION

Remote

Creation

해당 권한의 조회는 role_sys_privs 의 privilege 의 조회로 확인 가능하다.

사용조건으로는 두 인스턴스 모두 네트워크가 연결이 되어야 하며 서로 패킷을
주고 받을 수 있어야 한다. (ping을 사용해 확인)

PROD 인스턴스는 LISTENER를 실행해야하며 ORCL에서는 TNSNAMES.ORA에
접속할 서비스를 등록해야 한다. (직접 파일 수정하거나 NETMGR 사용)

필자는 직접 수정하는 방법으로 진행해 보겠다.


PROD 에서 리스너를 실행하였다.
RH3@PROD : /home/oracle>lsnrctl start


ORCL 에서 TNSNAMES.ORA를 수정한다.

RH3@ORCL : /home/oracle>cd $ORACLE_HOME/network/admin
RH3@ORCL : /oracle/ora92/network/admin>vi tnsnames.ora

다음의 내용을 추가하였다.

PROD_LINK =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.100.100)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = PROD)
        (SERVER = DEDICATED)
    )
  )



tnsping 명령어로 접근이 가능한지 확인해 본다.

RH3@RESP : /home/oracle>tnsping prod_link

TNS Ping Utility for Linux: Version 9.2.0.4.0 - Production on 09-NOV-2008 13:25:
13

Copyright (c) 1997 Oracle Corporation.  All rights reserved.

Used parameter files:
/oracle/ora92/network/admin/sqlnet.ora


Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)
(HOST = 192.168.100.100)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = PROD) (S
ERVER = DEDICATED)))
OK (10 msec)
RH3@RESP : /home/oracle>

단순히 sqlplus로 접근해 확인해봐도 괜찮다

RH3@RESP : /home/oracle>sqlplus "test/test@prod_link"


접근해 볼 샘플 USER를 만들어 진행해 보겠다.

SQL> get te
  1  create user dblink identified by dblink
  2  default tablespace users
  3  temporary tablespace temp
  4* quota unlimited on users


dblink라는 user를 생성하였다.

SQL> /

User created.

dblink user에게 create session 과 create database link를 할당했다.

SQL> grant create session ,create database link to dblink;

Grant succeeded.

SQL> conn dblink/dblink
Connected.
SQL> select * from tab;

no rows selected

SQL> @dblink

Database link created.

아래는 dblink 생성할 때 사용한 구문이다.

SQL> get dblink
  1  create database link dblink
  2  connect to test identified by test
  3* using 'prod_link'

SQL> select * from tab;

no rows selected

객체명 뒤에 DATA BASE LINK 이름을 붙여 사용한다. 형태는 TNS를 통해 접근하는 모양새와 같다.

SQL> select * from tab@dblink;

TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
CHAINED                        TABLE
PLAN_TABLE                     TABLE
TEST                           TABLE

SQL> select count(*) from test@dblink
  2  ;

  COUNT(*)
----------
    500000

SQL>

/*+ OTN 문서에 아직 많은 내용이 남아있다. UPDATE 요망 */


출처 : http://h391106.tistory.com/category

Posted by 1010
반응형

ispeech 는 영어문서를 음성 파일로 바꿔주는 웹서비스입니다. 그러나 단순히 영어문장을 직접 입력해서 음성파일로 변환시켜주는 기능만 가지고 있는 것이 아니라 pdf 파일을 포함한 각종 영어 문서에서 텍스트 만을 추출해서 자동으로 음성 파일을 만들어 줍니다. 또한 웹사이트 ,블로그,rss 등을 통째로 음성파일로 전환시켜 줍니다.

또한 ispeech는 영어문장이나 문서를 음성파일로 변환하여 블로그나 홈페이지에 삽입할 수 있는 임베드코드를 제공할 뿐만 아니라 다운로드도 가능합니다.itunes를 이용한 포드캐스도 지원합니다. Convert your favorite Websites and Blogs to speech with iSpeech - Text to speech podcast with your iPod

아직은 개발 단계라 웹사이트, 블로그, rss 등은 음성변환 작업과 문서파일의 경우 다운로드 링크를 제공하지는 않습니다, 그러나 현재 기능만 가지고도 감탄사가 절로 나올만큼 놀라운 웹서비스라는 생각이 듭니다. 영어 리스닝에 도움이 되는 웹서비스이면서 , 시력 장애가 있는 분들도 보다 쉽게 웹 정보를 접할 수 있을 거라는 생각이 듭니다.

문장을 음성으로 변환 한 파일을 직접 들어보세요.

iSpeech is an alternative service that can convert your favorite websites, RSS, blogs and documents  to speech with any PC or mobile Device. Then you can download your favorite blogs and news feeds as MP3 or podcast your favorite websites into your iPod.


\

출처 : http://drchoi.or.kr/934?_top_tistory=new_title

Posted by 1010
01.JAVA/Java2008. 11. 10. 11:28
반응형
이곳은 50001.COM 주인장의 강좌와 주옥같은 JAVA고수님들의 강좌를 모아 놓은 곳입니다.
질문은 Q&A 게시판에 주세요.

들어가는 글 :: "시작하는 JAVA프로그래머를 위해" (특히 비 전공자분들께)
 
 
김상욱의 awt 멀티채팅강좌 ::
방개설, 귓말/쪽지, 방장기능, 캐릭터 및 글자색 기능, 이미지넣기, 관리자모드, 그림 및 음악 보내기 등 기술분석적 강의 (진행중)
김상욱의 db 이용한 awt 그래프 출력강좌 ::
db와 socket을 이용 3-Tier, 스크롤가능 그래프출력 강좌 (1차완료)
김상욱의 LIVECONNECTION :: 애플릿과 자바스크립트와의 통신강좌 (완료)
김상욱의 자바툴 강좌 :: Editplus, UltraEditor, Kawa, JCreator 등의 다운로드와 설정 (완료)
김상욱의 웹스타트(webstart) 강좌 (기본 완료, 응용 진행중)
김상욱의 Vector, Hashtable 클래스 성능 실험 외 (완료)
진은영 (50001.com javaside 시삽) 강사님의 자바 기초강좌 (진행중)
자바Side(50001.com) 온라인 자바 스터디 1기 채팅 소스 분석 스터디 정리(완료)
Java Basic처음 입문하신 분들은 이리로
J2SE(Core/Desktop)Java2 Standard Edition.
애플릿/애플리케이션 등 일반적인 자바
프로그램을 만들 수 있는 기본 패키지
J2EE(Enterprise/Server)Java2 Enterprise Edition
엔터프라이즈급 프로그램을 만들 때
사용하는 패키지.
웹프로그래밍 JSP :: servlet :: taglibrary/customtag
웹서비스
웹서비스
JAXP/JAXR/JAX-RPC

SOAP
Component
Enterprise JavaBeans(EJB)
Java Message Service(JMS)
기타

application server
Java Data Objects(JDO)
JavaMail
Transaction(JTA/JTS)
J2EE 기타

J2ME(Mobile/Wireless)Java2 Micro Edition.
휴대폰 등에 들어있는 소형 시스템에서
사용할 프로그램을 만들 수 있는 패키지.

모바일(J2ME)

(강사님별 / 기기별 강좌)

XML XML
IDE IDE
Other Java Technologies 준비중...
ETC 매뉴얼 :: 디자인패턴 :: 객체지향 UML ::
자바스크립트 :: XP(Extreame Programming) :: 기타

자바기본 (영문튜토리얼)

 
박용우님의 자바강좌 :: 자바 전반에 대한 문법 및 도움말 (강추!)
윤경구의 자바튜토리얼 :: '지나'시리즈로 유명한 저자의 기초~고급
최종명의 몽땅강좌 :: 기초부터 고수까지
최희창님의 자바클래스 소개
Java 전문 용어 이해하기 :: Sun사 문서 (오광신 님 번역)
원돈희님의 SCJP에 맞춘 자바강좌 :: 시험 유형에 맞춰 헷갈리기 쉬운 부분을 알기쉽게 강의
Sun의 자바기초강좌 SL275(한글문서) :: 김동학님 제공
자바 초보자를 위한 강좌 :: javanuri
corejava [1권] [2권] :: 번역판
Think In Java 2nd Ed (MS WORD버전)
자바기초에서 애플릿(바둑,채팅)까지 :: JSTORM
자바기초(당연히 알아야함에도 불구하고 그냥 지나치기 쉬운) :: JSTORM
JVM의기본 원리 및 클래스로더의 기초 :: JSTORM
제네럴 프로그래밍 애플릿에서 웹 서비스까지 [첨부파일] :: 박용우
GarbageCollection :: 오광신
JVM의 가비지 컬렉션 (영문) :: IBM
가비지 컬렉션과 퍼포먼스 (영문) :: IBM
이것은 무엇의 객체인가 (영문) :: IBM
추상클래스 :: 자바스터디
정적 유형 (Static type) (영문) :: IBM
final 사용 가이드라인 (영문) :: IBM
자바 속성 [1] [2] [3] [4] :: IBM
클래스와 클래스 로딩 (영문) :: IBM
Java Web Start 1.0 개발자 가이드 (번역) :: JSTORM
자바 네트워크 구동 프로토콜(JNLP)과 참조 구현, 자바 웹 스타트 :: 자바스터디
JAVA WEBSTART문서 [소스] :: 오광신
EMPOWER YOUR APPLICATIONS WITH JAVA™ WEB START - Sun사 문서 (오광신 님 번역)
자바프린팅모델 [1] [2] :: JSTORM
JDK 1_4의 프린팅 (printing), Part 1_새로운 Java Print Service API :: IBM
JDK 1_4의 프린팅 (printing), Part 2_프린트 관련 이벤트를 듣고 그래픽을 직접 프린트 :: IBM
표명(assertion) 기능 이용하기 :: IBM
J2SE 1_5_Tiger의 미래와 언어 차원의 변화 :: IBM
숫자와 currency 포맷 (영문) :: IBM
자바 어플리케이션에서 환경에 접근하기 :: 자바스터디
쓰레드 풀과 작업 큐(queue) (영문) :: IBM
쓰레드 보안 (영문) :: IBM
김세곤님의 클래스패스와 환경 변수, 그것이 알고 싶다. :: 패키지 및 클래스패스설정 총정리
classpath에 등록안된 클래스의 dynamic reload :: javapattern.info
Multiprocess JVM Implemetation_1 :: javapattern.info
Multiprocess JVM Implemetation_2 :: javapattern.info
native method 정의 및 구현 :: javapattern.info
StringBuffer class Optimization :: javapattern.info
Using java debugger :: javapattern.info
Java 2 레퍼런스 클래스 사용 가이드라인 (영문) :: IBM

애플릿 (영문튜토리얼)

 
Dubuilder로 Signed Applet 만들기 [소스] / [MakeRayCab.bat ] :: 오광신
Explore에서 Signed Applet만들기 :: 오광신
넷스케이프 브라우저에서의 사인 애플릿 작성 :: 핸디소프트 윤동빈
네트워크 가위바위보게임(+채팅) [소스] :: 박용우

그래픽(awt,JFC/swing,SWT) (영문튜토리얼)

 
AWT와 스윙 [1] [2] :: JSTROM
스윙(SWING)의 안쪽 탐험 :: JSTORM
Swinging audio_사용자 인터페이스 향상을 위한 소리 신호 구현하기 :: IBM
지능형 데이터로 Swing을 간단히!_(iData 기법) :: IBM
SWT: native 크로스플랫폼 GUI 애플리케이션 만들기 (영문) :: IBM
Create native, cross-platform GUI applications(GCJ, 리눅스, SWT) :: IBM
Equipping SWT 애플리케이션에 content assistants 추가하기 (영문) :: IBM
Fullscreen Exclusive Mode 와 draw directly to video RAM(영문) :: IBM
Java Web Start로 SWT 애플리케이션 전개하기 (영문) :: IBM
GUI의 접근성 높이기 (영문) :: IBM

자료구조(Collection) (영문튜토리얼)

 
콜렉션 개요와 Collection 클래스, MAP, Iterator, Comparator, 콜렉션 알고리즘:: 자바스터디

국제화(한글화) (영문튜토리얼)

 

네트웍(IO/NET)
 
파일과 네트웍 [01] [02] :: JSTORM
자바 I/O 성능 향상기법 :: JSTORM
네트웍 코드를 쉽게 테스트 하자 [소스] :: JSTORM
비 블록 소켓으로 가는 길 (영문) :: IBM
Merlin으로 자바 플랫폼에 nonblocking 입출력 가능_새롭게 추가된 기능들 :: IBM
JDK1.4의 New I/O에 대하여 [1] [2] :: 한빛미디어
스트림 완전히 바꾸기, Part 1 (영문) :: IBM
스트림 완전히 바꾸기, Part 2 내부 Java IO 최적화 (영문) :: IBM
자바 네트워킹 강화 (영문) :: IBM
Java NIO (Ron Hitchens 지음) (영문) :: IBM
Merlin의 new IO 버퍼의 모든 것 (영문) :: IBM
NIO Channel :: javapattern.info
NIO Reactor Pattern의 사용 :: javapattern.info
PushbackReader의 사용방법과 예제 :: javapattern.info
Multicast IP address를 이용한 채팅 :: javapattern.info
Extracting zip or jar file :: javapattern.info
Servlet과 Applet간의 HTTP 통신_1 :: javapattern.info
Servlet과 Applet간의 HTTP 통신_2 :: javapattern.info
Servlet과 Applet간의 HTTP 통신_3 :: javapattern.info
Servlet과 Applet간의 HTTP 통신_4 :: javapattern.info
SocketPool Implementation Source code Example_1 :: javapattern.info
SocketPool Implementation Source code Example_2 :: javapattern.info
DatagramSocket의 정의 및 샘플 :: javapattern.info
HttpURLConnection 사용예와 개념 :: javapattern.info
jNetServer Socket Framework :: javapattern.info
Lightweight Web Server Implementation :: javapattern.info

분산객체(RMI) (영문튜토리얼)

 
Java Distributed Computing Technology :: 자바스터디
자바 RMI 사용하기
차승욱님의 RMI강좌 :: 자바스터디
문영진님의 RMI강좌 :: 자바스터디
자바에서의 원격객체통신(RMI와 CORBA) :: 윤경구
RMI의 기초 :: JSTORM 박준용님
기업에서의 RMI-IIOP_IIOP상에 RMI 실행시키기 :: IBM

IDL(CORBA) (영문튜토리얼)

 
JBuilder를 이용한 코바(Corba)프로그래밍 :: Javastudy
코바와 자바 연동 (PDF) :: Javastudy
JAVA와 CORBA연동 (PDF) :: Javastudy
JBuilder에서 코바 프로그래밍 (MS_WORD) :: Javastudy
코바 이것만을 알고 개발하자!!(PDF) :: Javastudy
VisiBroker 설치 방법 (코바사랑) :: Javastudy
비지브로커의 이모저모.. (PDF) :: Javastudy
IDL에 대해서.. (PDF) 코바사랑 제공 :: Javastudy
JAVA에서 IDL 매핑 (PDF) 코바사랑 제공:: Javastudy
콜백 서비스에 대해.. (MS-WORD) 코바사랑 제공 :: Javastudy
CORBA & Next Generation :: Javastudy

보안(Security) (Security in 1.2 영문튜토리얼)

 
Globus Grid Security Infrastructure와 자바 (영문) :: IBM
JAAS와 JSSE를 이용한 자바 보안 (영문) :: IBM
대칭암호화알고리즘 소개 및 DES, Blowfish샘플코드 :: javapattern.info
Java Security Model Evaluation :: javapattern.info
MD5를 이용한 스트링 변환 :: javapattern.info

JDBC(데이터베이스)
 
데이타베이스와 자바(JDBC소개) :: 자바스터디
JDBC 팁 (영문) :: IBM
JDBC 쿼리 로깅을 쉽게_고급 PreparedStatement를 사용하여 JCBC 코드에 로깅 추가 :: IBM
JDBC와 ORACLE :: 자바스터디
JDBC와 MSQL :: 자바스터디
Database접속 Pool관리 :: 자바스터디
JDBC API를 이용한 프로그래밍 강좌 :: http://www.aboutjsp.com
JDBC 기초 강좌 :: http://cs.sookmyung.ac.kr
JDBC 다국어 처리법 :: http://www.ejavaschool.com.ne.kr
JDBC 설정 :: 자바스터디
PostgreSQL JDBC 활용 :: http://www.junghyun.pe.kr
자바 초보자를 위한 DB강좌 :: javanuri
SQL2000 강의자료 :: 김하나님 자료
Object Pool 패턴을 이용 구현한 JDBC Connection Pool :: JSTORM
oracle8i JDBC(Oracle 8i 와 Java) :: Javastudy
Informix 데이터베이스연결 :: javapattern.info
MySQL JDBC Connection_1 :: javapattern.info
MySQL JDBC Connection_2 :: javapattern.info
MySQL JDBC Connection_3 :: javapattern.info
Java JDBC Performance Tip(1)-Select Speed up! :: javapattern.info
Java JDBC Performance Tip(2)-Insert, Delete Speed up!.htm :: javapattern.info
JDBC DataConversion(Using Metadata) :: javapattern.info

JAR (영문튜토리얼)

 
JAR 파일 (영문) :: IBM

Extention Mechanism (영문튜토리얼)

 

2D Graphics (영문튜토리얼)

 
2D 애니메이션과 이미지 기반 경로 (영문) - IBM
롤오버(rollover) 효과를 위한 Java2D 합성 (영문) - IBM

Sound (영문튜토리얼)

 

JavaBeans (영문튜토리얼)

 
자바 빈으로 테트리스 게임의 구성 요소들을 재사용 가능한 컴포넌트로 :: IBM
JavaBeans 컴포넌트와 JSP 기술의 결합 (영문) :: IBM

JNI (영문튜토리얼)

 
자바와 C/C++ 연동하기 :: 마이크로소프트웨어
Java Native Interface(JNI) :: 윤경구
자바 네이티브 인터페이스로 피어 클래스 사용하기 :: 자바스터디

Reflection (영문튜토리얼)

 
reflection (영문) :: IBM
리플렉션(reflection) 적용하기 (영문) :: IBM

Optional Packages(JMF/JMX/commAPI/3D/JAI/SpeechAPI/Help System etc)

 
자바멀티미디어 JMF [01] [02] [03] :: JSTORM
JavaHelp 소프트웨어로 헬프셋 만들기 :: 자바스터디
JAVAHELP로 애플리케이션에 도움말 추가하기 :: 자바스터디
블랙박스에서 엔터프라이즈 까지, JMX 1.1 style (영문) :: IBM
블랙 박스에서 엔터프라이즈 까지, JMX 1.1 스타일 (영문):: IBM
블랙박스에서 엔터프라이즈 까지, JMX 통합_JMX Agent를 네트워크 관리 시스템에 연결:: IBM
자바 애플리케이션에서 USB 장치에 접근하기 (영문) :: IBM

J2SE 기타

 
클래스 변형하기 (영문) :: IBM
보다 나은 HashMap 구현하기 (영문) :: IBM
변이(mutate)할 것인가 말것인가 (영문) :: IBM
무한정 progress bars (영문) :: IBM
다중 스레드 애플리케이션 프로그래밍을 쉽게 구현. Consumer 클래스 :: IBM
안전한 구조 기술 (영문) :: IBM
자바 애플리케이션에서의 회귀 태스크 스케줄링 (영문) :: IBM
자바 최적화 기술_자바 애플리케이션의 퍼포먼스 향상을 위한 실질 가이드 :: IBM
패턴 매칭 :: 자바스터디
정규식을 위한 추상 자바 API 구현하기_Perl5 regexp 라이브러리를 사용 :: IBM
새로운 regex 라이브러리를 이용한 문자 시퀀스 파싱하기 (영문) :: IBM
패키지 의존성 줄이기 (영문) :: IBM
해시(hash) 해부 (영문) :: IBM
캐릭터 세트(Character set) (영문) :: IBM
내 쓰레드는 어디에_서버 애플리케이션에서 쓰레드 유출 피하기 :: IBM
Preferences API를 사용하여 객체 저장하기 (영문) :: IBM
SpringLayout 매니저 (gridbagLayout으로 부족할 때)(영문) :: IBM
String 클래스의 오타(mistyping) 방지하기 (영문) :: IBM
Shutdown hook클래스 작성방법 및 샘플 :: javapattern.info
Comparator클래스의 객체비교를 통한 sorting :: javapattern.info
Deep Copy, Shallow Copy에 관한 Perfomance Test 및 고려사항 :: javapattern.info
Property Utility Examples_1 :: javapattern.info
Property Utility Examples_2 :: javapattern.info
Reflection을 이용한 Value Object비교 :: javapattern.info
박용우님의 '스노우크래프트'자바강좌 :: 자바스터디

JSP
 

1.JSP 란? MS의 ASP처럼 java로 구현된 서버 스크립트입니다.

2.프로그램? java.sun.com/products/servlet/index.html

3.매뉴얼? java.sun.com/products/jsp/tags/tags.html

4.자세한 정보 java.sun.com/products/jsp

5.JSP FAQ www.esperanto.org.nz/jsp/jspfaq.html

6.JSP Developer's Guide java.sun.com/products/jsp/docs.html

JSP강좌 [01] [02] [03] :: JSTORM
JSP기초JSP이론 [01] [02] [03] [04] [05] [06] [07] :: 자바스터디강좌 by 파란공책
http://www.jabook.org/jbjsp/jbjsp_20000_0_0.html :: jabook의 JSP강좌 링크
JSP기초(Java Server Programming 번역일부) :: JSTORM

INSTALL

Tomcat4 설치하기 Windows NT/2K/XP, 98/ME :: okjsp

Tomcat4 Apache1.3.22연동 (mod_jk이용) (mod_webapp이용) :: okjsp

Tomcat 가상호스트 설정하기 :: okjsp

Apache 가상호스트 설정하기 ::okjsp

win98+apache+tomcat (win98과 winMe Tomcat 3.2.1, apache 1.3.14) :: okjsp

윈98 + 아파치 + 톰켓 설치 :: kimho.pe.kr

Tomcat 4.0 설치 (Windows 2000) :: kimho.pe.kr

apache + Tomcat설치하기 :: 자바스터디

리눅스에서 Tomcat 4.0 + 아파치 설치 :: kimho.pe.kr

Apache와 Tomcat4.0.1의연동(윈도2000) :: 김성박

Tomcat-apache 연동 :: okjsp

linux + apache + Tomcat설치하기 :: 자바스터디

Tomcat 3.2의 루트디렉토리 (Tomcat의 기본디렉토리 변경) :: okjsp

Tomcat 4.1의 루트디렉토리 (+ Context 추가) :: okjsp

win2k server + IIS + tomcat 3.2.3 (이미지 캡쳐) :: okjsp

IIS + tomcat 3.2.3 Context추가 (conf/uriworkermap.properties 변경) :: okjsp

IIS에서 자카르타톰캣 돌리기 :: 최종명

oracle 9i + jdbc + tomcat 4.0.3 연동 :: 하이텔 김현규(pasome)

일반계정으로 JSP 돌리기 :: kimho.pe.kr

Tomcat 서비스 설치하기 (NT, Tomcat 3.2.2 ) :: okjsp

win2000+apache+tomcat :: 자바스터디

win2000+IIS5+Resin (Resin 1.2.1) :: okjsp

resin install :: 자바스터디

Win2000에서 resin설치하기 :: 자바스터디

IIS에서 RESIN설치하기 :: 중앙정보기술 정원희

Resin 루트디렉토리 (Resin 1.2.1 기본디렉토리를 변경) :: okjsp

Apache1.X or 2.X+Resin 2.1.6 installed on Linux or Unix :: javapattern.info

자바 서비스를 위한 리눅스 보안 (영문) :: IBM

응용

Eclipse 시작하기 :: okjsp

Form study #1 :: okjsp

Tomcat 4 Manager 사용하기 :: okjsp

jsp에서 log() 이용하기 :: okjsp

WAR (Web ARchive jsp로 만든 웹 어플리케이션을 쉽게 배포) :: okjsp

한글처리 (일반적인 한글처리) :: okjsp

한글처리 빈 (빈에서의 한글처리) :: okjsp

useBean :: okjsp

톰켓에서 useBean 사용하기 :: kimho.pe.kr

session bean :: okjsp

bean 활용[1] [2] :: okjsp

FileUpload :: okjsp

JspSmartUpload 설치 :: okjsp

JspSmartUpload F&Q :: okjsp

jsp 에러잡기 :: okjsp

include 집중분석 :: okjsp

수학 내용을 포함하는 동적 웹 사이트 구축하기(JSP 기술과 LateX) :: IBM

패킹(Packing) (영문) :: IBM

The expression language_JSP 애플리케이션용 MA 단순화하기 :: IBM

Echo 웹 프레임웍으로 작업하기 [1] [2] :: IBM

include를 이용한 동적 콘텐트 조작 (영문) :: IBM

JSP 코드로 이미지 관리하기_동적 서블릿 이미지 메이킹을 마음대로! :: IBM

JSP best practices 외부 사이트에서 콘텐트를 가져오는 JSTL 태그 :: IBM

JSTL primer 프리젠테이션 (영문) :: IBM

JSTL을 이용한 JSP 페이지 업데이트 (영문) :: IBM

JSTL 기초 핵심에 접근하기_커스텀 태그를 이용한 플로우 제어와 URL 관리 :: IBM

JSTL 기초, Part 4 SQL과 XML 콘텐트에 접근하기 (영문) :: IBM

JSP best practices 타임 스탬프의 힘_JSP 페이지에 타임 스탬프 만들기 :: IBM

JSP best practices JSP 태그용 커스텀 애트리뷰트 만들기 :: IBM

JSP include 메커니즘으로 “look and feel”을 더욱 좋게 (영문) :: IBM

Struts, Tiles, JavaServer Faces 통합하기 :: IBM

Struts와 Tiles, 컴포넌트 기반의 개발 도우미 (영문) :: IBM

JSP Model 1 vs JSP Model 2 Architecture overview :: javapattern.info

URL Rewriting을 이용한 session tracking_1 :: javapattern.info

URL Rewriting을 이용한 session tracking_2 :: javapattern.info

[ JSP 기본 강좌 ] (http://www.ihelpers.co.kr)

“안녕하세요. 00 님!!!” 과 JSP 동작원리에 대하여

JSP Comment

JSP Directive

Scripting Elements

iimplicit object
Implicit Object - Request
Implicit Object - Response,Out
Implicit Object - Session, Application

공지사항 만들기 (1) (2) (3) (4) (5)

게시판 만들기 (1) (2) (3) (4) (5)

메일 발송 (1) (2)


진민님의 JSP 간단 강좌 ( http://myhome.shinbiro.com/~jimmy/ )

1. JSP 강좌1(jsp 기본구성)

2. JSP 강좌2(get,post처리 및 내장 인스턴트사용)

3. JSP 강좌3(외부 클래스 사용하는 방법)

4. JSP 강좌4(JDBC를 사용하는 방법)

5. JSP 강좌5(Cookie를 사용하는 방법)

6. JSP 강좌6(session을 사용하는 방법)

7. JSP 강좌7(session사용시 주의점)

김호님의 게시판 만들기 강좌 (http://www.kimho.pe.kr/)

JSP 게시판(방명록) 만들기 (글 내용보기)

JSP 게시판(방명록) 만들기 (글 삭제하기)

JSP 게시판(방명록) 만들기 (글 수정하기)

JSP 게시판(방명록) 만들기 (글 올리기)

JSP 게시판(방명록) 만들기 (리스트 출력하기)

JSP 게시판(방명록) 만들기 (페이징 기법)

JSP 게시판(방명록) 만들기 (또 다른 페이징 기법 1회)

JSP 게시판(방명록) 만들기 (또 다른 페이징 기법 2회)

JSP 게시판(방명록) 만들기 (글 삭제하기)

JSP 게시판(방명록) 만들기 (글 수정하기)

답변형 게시판 만들기 1회 - 답변형 게시판 로직

답변형 게시판 만들기 2회 - 글 올리기

답변형 게시판 만들기 3회 - 글 리스트 보기

답변형 게시판 만들기 4회 - 글 내용 보기


servlet
 

http://www.jabook.org/jbjsp/jbjsp_10000_0_0.html :: jabook의 서블릿강좌 링크

자바 서블릿 프로그래밍 :: 박용우
자바 서블릿(Java ServletTM) 아키텍처 :: 박용우
Java Servlets 2.4를 이용한 필터링 (영문) :: IBM
Servlet API와 NIO 완벽한 결합 (영문) :: IBM
쿠키에 한글이 들어갈 경우 예제 서블릿 :: javapattern.info
Making the Http WebServer(Java로 web server를 구현하는 방법)_1 :: javapattern.info
Making the Http WebServer(Java로 web server를 구현하는 방법)_2 :: javapattern.info
Making the Http WebServer(Java로 web server를 구현하는 방법)_3 :: javapattern.info
Servlet2.3 API Filter interface Implementation :: javapattern.info
Servlet과 Applet간의 TCP_IP 통신_1 :: javapattern.info
Servlet과 Applet간의 TCP_IP 통신_2 :: javapattern.info
Servlet의 각종 Listener 사용방법 및 샘플 :: javapattern.info
Web Tier Java Techonology :: javapattern.info

INSTALL

 JSPINSTALL 참고

 

taglibrary/customtag
 

JSP Tag Library 기초강좌 :: okjsp

커스텀 태그로 JSP 페이지 제어하기_커스텀 태그 라이브러리 통신의 모든 것 :: IBM

Custom Tag Library (1) (2) (3) (4) (5) (6) :: http://www.ihelpers.co.kr

커스텀 태그에서의 에러 핸들링 (영문) :: IBM

JSP 커스텀 태그를 구현하는 다섯 단계 (영문) :: IBM

InvokeEJB Custom Tag Library implementation_1 :: javapattern.info

InvokeEJB Custom Tag Library implementation_2 :: javapattern.info

InvokeEJB Custom Tag Library implementation_3 :: javapattern.info

Struts 1.1 Tiles-framework에 대한 개요 및 사용방법 :: javapattern.info

taglib (영문) :: IBM

 

웹서비스
 

웹 티어 클러스터링, Part 1 JavaGroups로 웹 서비스와 애플리케이션 설계 :: IBM

 

JAXP/JAXR/JAX-RPC
 

 

SOAP
 

아파치 SOAP 유형 매핑, Part 1 아파치의 직렬화 API 검토하기 :: IBM

아파치 SOAP 유형 매핑, Part 2 정의된 직렬자와 비직렬자를 작성 :: IBM

 

Enterprise JavaBeans(EJB)
 
J2EE 환경 소개 :: 자바스터디
오라이온 서버 설치 및 J2EE 애플리케이션 배치 :: 자바스터디
J2EE 신기술의 해설 :: 자바스터디

[ EJB 기본문서 ]

Java Enterprise edition tutorial :: SUN

썬 사의 EJB 규약

Enterprise Java Beans란 무엇인가? [01] [02] [03] [04] [05] :: JSTORM

EJB 한글자료

EJB 실전프로그래밍 (Persistence PowerTier for EJB) :: 자바스터디

Java Enterprise [PDF] :: 김국현님

EJB 성능향상을 위한 Best Practice [1] [2] :: JSTORM

Writing Enterprise Application [01] [02] [03] [04] [05] [06] [07] :: JSTORM

EJB 디자인 패턴 ↓

[ EJB 응용 ]

EJB의 트랜잭션 :: JSTORM 박지훈님

J2EE 애플리케이션에서의 XML :: JSTORM 한제택님

자바 서버상에서 서블렛의 활용 :: 핸디소프트 윤동빈님

J2EE에서의 작업 스케쥴링 :: JSTORM 윤준호님

J2EE 신기술 해설 :: 한국오라클(주) 안병문님

Component Architecture(CORBA, EJB, COM) :: 김국현님

Grady Report - EJB, Design Pattern, XP 강좌 문서 :: 박현철(hpark@kebi.com)

이런 J2EE프로젝트는 위험하다 :: JSTORM

LDAP 소개 :: database.sarang.net 부산대학교 컴공과 박근오님 (MS WORD)

분산 관리 솔루션 (영문) :: IBM

상태보존형(stateful) 네트워크용 J2EE (영문) :: IBM

싱글사인온 솔루션 구현 (영문) :: IBM

싱글사인온 GSS-API와 Kerberos 티켓을 사용하여 SSO를 구현 :: IBM

EJB 예외 처리 실전 (영문) :: IBM

타당성검사(Validation) 헬퍼(helper) 클래스_데이터-포맷 타당성 검사에서 코드 중복 없애기 :: IBM

데이터 타당성검사(validation) (영문) :: IBM

동적 delegate_Java reflection을 이용하여 보다 일반적인 business delegate 구현하기 :: IBM

보다 나은 예외 처리 프레임웍 구현하기 (영문) :: IBM

엔터티 빈 보호_Session Facade 패턴으로 데이터를 안전하게 관리하기 :: IBM

Business Delegate 패턴_EJB 디자인에서의 추상 비지니스, 구현, 애플리케이션 로직 :: IBM

delegation의 한계_business delegate의 대안 :: IBM

JNDI의 산업용 최적화 (영문) :: IBM

JNDI 미로 통과하기 (영문) :: IBM

value 객체를 사용하여 RMI 트랜잭션 속도 높이기 (영문) :: IBM

EJB State와 SOAP 헤더 (영문) :: IBM

JavaSpaces로 적응력 있고 광범위한 솔루션 구현하기 (영문) :: IBM

J2EE 1.2에 다중 애플리케이션 전개하기 (영문) :: IBM

J2EE 내부 객체 사용 (영문) :: IBM

J2EE 영속적인 데이터 관리, Part 1 (영문) :: IBM

J2EE 영속적인 데이터 관리, Part 2 (영문) :: IBM

J2EE를 이용한 서비스 지향 아키텍쳐 프레임웍 설계 (영문) :: IBM

stateful 웹 애플리케이션의 구현과 관리 (영문) :: IBM

stateless 네트워크용 J2EE 기술 (영문) :: IBM


Java Message Service(JMS)
 

벤더로부터 독립된 JMS 솔루션 구현하기 :: IBM

메시지 큐잉이 기업 애플리케이션의 유연성과 확장성을 향상시키는 방법 :: IBM

JMS를 이용한 엔터프라이즈 메시징 (영문) :: IBM

 

application server
 

JEUS 기반의 J2EE - from TmaxSoft
   JEUS EJB Server의 관리와 이를 이용한 EJB 개발 (PDF)
   JEUS JTS의 구조와 이를 이용한 개발 (PDF)
    JDBC의 개념과 프로그래밍하는 방법 (PDF)
   XML 소개와 XML APPLICATION 개발 (PDF)
   JEUS JMS의 구조와 이를 이용한 개발 (PDF)
   JEUS JNDI의 구조와 이를 이용한 개발 (PDF)
   WebtoB Web Server의 소개 (PDF)

HP Netaction Application Server 기반의 J2EE - from Nicstech
   HP Netaction Application Server 설치 방법(WIN 환경) [MS-Word]
   HP Netaction Application Server 설치 방법(UNIX/LINUX 환경) [MS-Word]
   HP Netaction Application Server 에서 웹서버 세팅 방법 [MS-Word]
   HP Netaction Application Server 기반의 JSP, Servlet 개발 방법 [MS-Word]
   HP Netaction Application Server기반에서 EJB사용을 위한 Tutorial [PDF]
   RADPAK 개발툴 사용방법 [MS-Word]

Ea Server 기반의 J2EE - from Sybase
   EA Server 소개 (PDF)
   EJB-CORBA 개발 (PDF)
   분산어플리케이션 (PDF)
   EAServer & PowerJ Installation Guide (ZIP)

PowerJ 연재 강좌 (PDF)
   Simple Application | 웹 어플리케이션 | EJB 컴포넌트 작성 | 컴포넌트 사용하기
   완벽한 J2EE Application 구축방법 (PDF)


javapattern.info 강좌

IBM Webshpere 5.0 의 서버시작, 중지 및 EJB Deploy ANT Build

Web Application Framework개발방법(1)-Framework의 개요

Web Application Framework개발방법(2)-LifeCycle,Controller

Web Application Framework개발방법(3)-View page Composing

Web Application Framework최종 소스 및 인스톨

Weblogic 7에서 JMS Queue Browser 활용 1

Weblogic 7에서 JMS Queue Browser 활용 2

Weblogic EJB Deploy using ANT build

 

Java Data Objects(JDO)
 

Castor JDO 시작하기(영문) :: IBM

Castor를 이용한 데이터 바인딩 (영문) :: IBM

 

JavaMail
 

JavaMail 설치 :: 자바스터디

JavaMail 기본설치 :: okjsp

JavaMail 폼메일 :: okjsp

JavaMail 파일첨부메일 :: okjsp

JavaMail 메일링리스트 :: okjsp

Apache의 James 엔터프라이즈 이메일 서버 (영문) :: IBM

javapattern의 java WebMail 구현

[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16]

 

Transaction(JTA/JTS)
 

트랜잭션에 대한 소개_트랜잭션은 신뢰성 있는 애플리케이션을 위한 구성 요소 :: IBM

장막 뒤의 마법_J2EE 컨테이너가 트랜잭션 관리의 복잡성을 숨기는 방법 :: IBM

보안과 퍼포먼스 균형맞추기_트랜잭션 경계설정과 고립화 가이드라인 :: IBM

WS-AtomicTransaction과 JTA를 이용한 분산 트랜잭션 (영문) :: IBM

 

J2EE 기타
 

Authenticator클래스를 통한 서버인증 메일전송 :: javapattern.info

Distributed Transaction Introduce :: javapattern.info

JRMP, IIOP type의 RMI분산 객체(RMI over IIOP) :: javapattern.info

MarshalledObject and Deserialization :: javapattern.info

RMI Peering System Construct :: javapattern.info

RMI programming, The Lifecycle of server :: javapattern.info

WebLogic WLSPool Size변경 application :: javapattern.info

 

모바일(J2ME) :

J2ME와 mobile device :: 김종원

핸드폰 단말기용 자바 애플리케이션의 구현 :: 배준현

네덜란드의 무선 기술 (영문) :: IBM

모바일 장치 디텍션(detection) (영문) :: IBM

P2P 네트워크 모바일 디바이스를 JXTA와 Jabber 클라이언트로 전환하기 :: IBM

기존의 네트워크 경계를 넘어 확장되는 P2P 시스템 설계 :: IBM

JXTA 2 고성능 P2P 네트워크 (영문) :: IBM

무선 J2ME 보안 (영문) :: IBM

EPOC에서 자바 애플리케이션 만들기 (영문) :: IBM

J2ME 101, Part 3 Record Management System (영문) :: IBM

J2ME 101, Part 4 Generic Connection Framework (영문) :: IBM

J2ME 기록 관리 저장 (영문) :: IBM

J2ME 애플리케이션과 Kerberos, Part 3 (영문) :: IBM

J2ME를 무선 메시지교환으로 확장하기 (영문) :: IBM

J2MEMIDP 애플리케이션 보안 (영문) :: IBM

MIDlets 클래스_모든 J2ME 프로그램의 기반하에 구축하기 :: IBM

Secrets of the wireless elite Jason Loia (영문) :: IBM

Secrets of the wireless elite Nancy Lehrer(영문) :: IBM

J2ME를 이용한 모바일 결제(m-payments)-모바일 장치에서 결제까지 :: IBM

강사님별 강좌
 

배준현님 마소 강의


무선단말을 위한 자바플랫폼 : CLDC/MIDP
핸드폰에는 나만의 자바 애플리케이션을!
OSGi로 여는 임베디드 자바 세상

이경범님 마소 강의

알라딘 기반의 상용만화 애플리케이션 만들자

김종원님 프세 강의

MIDP를 사용한 휴대폰 프로그래밍
J2MEWTK를 사용한 MIDlet Httpconnection 프로그래밍
SK-Aladdin VM(virtual machine)을 이용한 멀티 플렛폼 채팅 프로그램 작성
&J2ME와 embedded device

유제정님 모바일 DB 강의

1. 모바일데이터베이스를 이용한 MIDP Sample 프로그램 구현

김준동님 모바일 강의

소형기기를 위한 프로그래밍 전략

정성권님 번역 자료

Introduction to Wireless Application Development

권기경님 번역 자료

Using XML in Wireless Applications
Connected Limited Device Configuration (CLDC) (CLDC API) (KJAVA API)

권기경님 자료

컴파일에서 사전 검증, 실행까지
이미지 사용 예제 분석
[번역] Connection Framework


기기별 강좌
 

Mobile Information Device Profile (MIDP) (MIDP-FCS API)
권기경님 자료

컴파일에서 사전 검증, 실행까지
웹서버에 midp 응용프로그램을 올려 놓고 실행하기

[번역]
MIDP Inter-Communication with CGI and Servlets
HTTP를 사용하는 MIDP Network Programming과 Connection Framework (정창수님번역)
MIDP GUI Programming Programming the Phone Interface (오용석님번역)
Quick Start Guide: JavaTM 2 Platform Micro Edition, Wireless Toolkit (오광신님 번역)
MIDP Database Programming using RMS: a Persistent Storage for MIDlets (번역)

PALM Pilot PDA (Palm OS) (PALM API)

권기경님 자료 :: 컴파일에서 사전 검증, 실행까지

WABA (WabaSoft) (WABA API)

권기경님 자료 :: 컴파일에서 사전 검증, 실행까지

n.TOP 마법사 (SK Telecom, XCE) (n.TOP 마법사 API) (XCE Tutorial)

박재범님 강의 :: 컴파일에서 실행까지
마소자료 :: MIDP 소개 | SKT-P 소개 | 게임작성 소개

EZ-JAVA 핸드폰 (LG Telecom) (EZ-JAVA 영문 API) (EZ-JAVA 한글 API)

권기경님 자료
  컴파일에서 사전 검증, 실행까지
  실제 폼에서 ez-java 응용프로그램 실행하기

박재범님 자료 :: 이미지 사용 예제 분석

-MODE 핸드폰 (Nttdocomo) (I-MODE API)

권기경님 자료
  컴파일에서 사전 검증, 실행까지
i모드 Java 확장 API 클래스 라이브러리가 아닌 i-jade를 사용하여 컴파일과 실행까지

wizardee님 자료 :: iAppli 개발환경 만들기

iDEN 핸드폰 (Motorola) (CLDC API) (MIDP API)

권기경님 자료 :: 컴파일에서 사전 검증, 실행까지

Personal Java 강좌

황제헌님 자료
  Personal Java Programming
  Personal Java 한글 encoding 문제 해결

CessHan for Palm-sized PC & PocketPC 설치 방법

KVM에 대한 기본 설명
어플리케이션 사이즈를 줄여주는 Obfuscator
SUN의 Monty 프로젝트 관련 자료
MIDP NG (New Generation) 버젼에 관한 자료 [UI, Games, and Sound] [Security and Networking]
Parsing XML in J2ME MIDP
Introducing Wireless JMS (PDF)

XML
 
XML의 기본개요 :: javapattern.info
XML 정리 (pdf파일)
XML korean spec :: http://user.chollian.net/~clevekim
자바와 XML :: JSTROM
Using XML in Oracle
XML 게시판 [소스] :: 김미영 님
XML 과 데이타베이스 :: 박용우
XSL, XSLT, XPATH [1] [2] [3] [4]:: 전윤경(ygchon@penta.co.kr)
DOM으로 프로그래밍하자 [1] [2] :: 전윤경(ygchon@penta.co.kr)
About DOM & DOM Programming with Java :: javapattern.info
DOM Level 3 Core의 핵심 기능 [1] [2] (영문) :: IBM
About SAX & SAX programming with Java :: javapattern.info
SAX 파서 설치하기 (영문) :: IBM
자바 프로그래밍으로 온라인 XML 데이터 검색하기_XML 파싱 :: IBM
자바 프로그래밍의 XML-RPC (영문) :: IBM
자바가 본 XML :: 자바스터디
Digester와 Lucene을 이용한 XML 파싱, 인덱싱, 검색 (영문) :: IBM
XML 로 홈페이지 만들기 :: 전윤경(ygchon@penta.co.kr)
IBM developerWorks XML 아티클 템플릿 (영문) :: IBM
자바 문서 모델 사용법_상이한 자바 XML 문서 모델들이 작동하는 방식 :: IBM
Schema Infoset Model로 스키마에 대한 복잡한 쿼리를 간단히! :: IBM
Working XML 경로 컴파일과 테스트 자동화_알고리즘과 JUnit 자세히 살펴보기 :: IBM
XML 데이터 바인딩, 성능 (영문) :: IBM
XML 데이터 바인딩, JiBX architecture (영문) :: IBM
XML 데이터 바인딩, JiBX 사용하기 (영문):: IBM
About JDOM & JDOM Programming with Java.htm :: javapattern.info
FOP를 이용한 PDF생성시 한글변환방법 :: javapattern.info
XML을 이용한 Database Query Manager 구현하기 :: javapattern.info
XMLBeans를 이용한 xml binding.htm :: javapattern.info

IDE

 
JBuilder 5 한글 매뉴얼 (pdf)
JBuilder 6 한글 매뉴얼
JBuilder 7 [인스톨] [환경설정](ppt)
JBuilder 에서 휠마우스 사용
제이빌더에서 라인넘버 표시
제이빌더에서 Ant 실행
제이빌더에서 자바코드 뷰티파이어
한국 인프라이즈 제공 J 빌더 특강 [ZIP로 내려받기] :: javastudy.co.kr
Eclipse Platform 시작하기 :: IBM
Eclipse 플러그인 개발하기_플러그인 구현, 디버그, 설치 :: IBM
Eclipse 플러그인 서비스 (영문) :: IBM
Eclipse Workbench 밖에서 Eclipse GUI 사용하기, 간단한 파일 탐색 애플리케이션 :: IBM
Eclipse Workbench 밖에서 Eclipse GUI 사용하기, 메뉴, 툴바 추가(영문) :: IBM
Eclipse와 HSQLDB 관계형 데이터베이스를 Eclipse에 임베딩하기, Part 1 (영문) :: IBM
Eclipse의 자바 개발 툴 확장하기 (영문) :: IBM
Graphical Editing Framework을 사용하여 Eclipse 기반 애플리케이션 만들기 (영문) :: IBM

매뉴얼
 
VisualAgeForJava 3.0 한글 매뉴얼 (pdf)
WSCP 매뉴얼 (doc) :: 윤성민

디자인패턴
 
디자인패턴 실전체험 [1] [2] [3] [4] :: 자바스터디
기본패턴 Overview :: javapattern.info
인터페이스! 다시 생각하기 :: 오광신
Good Java Style :: JSTORM
Command패턴의 기초 :: JSTORM
동적으로 자바 어플리케이션 확장하기 :: JSTORM
DesignPattern for Java [소스] :: JSTORM
리팩토링(Refactoring)_Eclipse의 자동화 리팩토링 기능 :: IBM
Double-checked locking과 Singleton 패턴_double-checked locking 이디엄 :: IBM
반 패턴으로 프로그래밍을 향상시키는 방법 :: IBM

EBJ 디자인패턴

Session Facade :: JSTORM

EJB Home Factory :: JSTORM

Business Interface :: JSTORM

Dual Persistent Entity Bean :: JSTORM

JDBC for Reading :: JSTORM

Business Delegate :: JSTORM

Data Transfer HashMap :: JSTORM

Data Transfer RowSet :: JSTORM

EJB Command Pattern :: JSTORM

Version Number :: JSTORM

"Dependent Value Object" 와 큰 단위의 BMP 엔티 :: JSTORM

EJB 전략, 팁 그리고 관례 :: JSTORM

Message Facade :: JSTORM

Value Object Factory :: JSTORM

Data Access Command Beans :: JSTORM

Blueprint(J2EE Petstore) client tier pattern overview :: javapattern.info

EJB design performance tips :: javapattern.info


객체지향 UML
 
박용우님의 객체지향형 프로그래밍 :: 자바스터디
심원도님의 UML강좌 :: 자바스터디
이준규님의 객체지향형 강좌 :: 자바스터디
Rational Rose에서 UML을 이용한 모델링 [1] [2] [3] [4] :: 자바스터디
http://www.jabook.org/jbjava2/jbjava2_10000_0_0.html :: jabook의 객체지향강좌링크

자바스크립트
 
자바스크립트 레퍼런스(win help용)
자바 초보자를 위한 JavaScript 강좌 :: javanuri
애플릿과의 통신(LIVE CONNECTION)을 위한 netscape.jar

XP(Extreame Programming)
 
Extreme Programming 돌아온 XP distilled, Part 1_XP의 진실
Extreme Programming을 밝힌다 돌아온 XP distilled, Part 2 (영문)
Extreme Programming을 밝힌다 돌아온 XP distilled, Part 3 (영문)
Extreme Programming을 밝힌다 진정한 XP 고객_소프트웨어 프로젝트를 운영하는 방법 배우기
Extreme Programming을 밝힌다 페어 프로그래밍(Pair programming) (영문)
Extreme Programming Just-in-time 디자인 (영문)
Extreme Programming Test-driven 프로그래밍_코드를 작성하기 전에 테스트 먼저 작성하기
Extreme Programming 작업에 맞는 (XP) 툴
Extreme Programming Just-in-time 디자인 (영문)

기타
 
ANT 매뉴얼 [] [] :: http://www.hanbitbook.co.kr
Apache ANT Guide :: 최지웅
자바 마이그레이션 :: 하동욱(handan@hitel.net)
JINI기술과 실제 :: 자바스터디
고급 객체 직렬화 :: JSTORM
COM과 자바의 연결 :: 핸디소프트 윤동빈
PDF와 자바 :: JSTORM 윤준호
JavaCC를 이용하여 당신만의 언어를 만들자 [소스]:: JSTORM 윤준호
JavaCC, 파스 트리, XQuery 문법, Part 1 (영문) :: IBM
JavaCC, 파스 트리, XQuery 문법, Part 2 (영문) :: IBM
인스턴트 로깅(Instant logging) log4j 활용하기 (영문) :: IBM
Log4j를 위한 여러가지 환경설정(xml property)_1 :: javapattern.info
Log4j를 위한 여러가지 환경설정(xml property)_2 :: javapattern.info
Log4j의 출력방향 전환하기 :: javapattern.info
Extract unicode from ASCII format text :: javapattern.info
MP3 File Footer ID3V2 Spec Navigator :: javapattern.info
객체 보유 (object prevalence) 소개 (영문) :: IBM
동적 이벤트 리스너 프록시 (영문) :: IBM
리눅스에 LSID 권한 구현하기 (영문) :: IBM
매력적인 Jython (영문) :: IBM
소프트웨어 개발의 미래 (영문) :: IBM
접근가능성을 위한 코딩 (영문) :: IBM
쉬운 코드 관리를 위한 디자인 (영문) :: IBM
영속적인 트레이스 시스템으로 디버깅을 쉽게! (영문) :: IBM
영역 지향 프로그래밍(Aspect -oriented programming)으로 모듈화 향상시키기(AspectJ) :: IBM
강결합의 약점을 없앤 AOP (영문) :: IBM
자바 native 컴파일의 무게 재기_자바 소스에서 native 코드를 생성할 때의 장단점 :: IBM
자바 프로그래밍에서의 Assertion과 temporal logic (영문) :: IBM
버그 패턴에 Temporal logic 사용하기 (영문) :: IBM
콘텐트를 배치하는 새로운 방법 (영문) :: IBM
플랫폼 의존 gotchas: platform-dependent bug patterns (영문) :: IBM
AspectJ와 mock 객체를 이용한 유연한 테스팅 :: IBM
Concurrency made simple util.concurrent package :: IBM
Concurrent 컬렉션 클래스 (영문) :: IBM
ContentHandler의 애트리뷰트 (영문) :: IBM
ContentHandler의 엘리먼트와 텍스트 (영문) :: IBM
'스팩(specification)'이라는 줄타기를 하다_잘 정의된 스팩의 중요성 :: IBM
깊이 우선 Visitor와 broken dispatches_Visitor 패턴 변종으로 코드 간결성 향상 :: IBM
대화식 검사 기능을 제공하는 Repls_소프트웨어를 효과적으로 진단하는 기법 :: IBM
Run-on Initializer 버그 패턴_인자를 가진 생성자를 피함 :: IBM
e-business on demand 개발자의 로드맵 (영문) :: IBM
Eye on performance 객체 레퍼런싱 (영문) :: IBM
Eye on performance 마이크로 퍼포먼스 벤치마킹 (영문) :: IBM
Eye on performance 스트레스의 하중 (영문) :: IBM
Eye on performance 예외에 대한 예외 (영문) :: IBM
Eye on performance 향상된 개발 프로세스 (영문) :: IBM
Javassist를 이용한 클래스 변형 (영문) :: IBM
JML 시작하기_JML 주석으로 자바 프로그램 향상시키기 :: IBM
peer-to-peer 컴퓨팅의 실제 IP 멀티캐스트 기반의 검색 :: IBM
1vs순차N구조의 name-value pair DataSet 정의 :: javapattern.info
코딩지침 :: javapattern.info
Proxy하에서의 Client IP얻기.htm :: javapattern.info

※ 자료는 서로 공유되어야 합니다. ^_^ 각 강의자료의 저작권은 저작권자에게 있습니다.



출처 : http://50001.com/language/javaside/java-lecture.html
Posted by 1010
60.Unix2008. 11. 8. 17:10
반응형

1. 계정생성
 #useradd -d /export/home/user1 -s bin/ksh -m user1   (user1 추가)

 계정생성시
 admintool로 만들면 staff로 만들어진다
 useradd로 만들면 other로 만들어진다
 #passwd user1  암호설정
 #su - user1 유저로 로그인

2. cp(파일복사)
 $cp file1 file2 (파일1을 파일2로 복사한다) 없으면 생성 있으면 덮어쓰기

3. ls
ls -a 숨긴파일보기 .붙여서 만들면 숨김파일
ls -l 상세설정
ls -f 파일의 종류를 알수있다
   -일반파일
   /디랙토리
   *실행파일
   @링크파일

4. cat 안에있는 내용보기
 cat A > B  : A에서 출력된 내용을 B로 전달
 cat A >> B : A에서 출력된 내용을 B에 추가
 cat A < B  : B를 A의 인자로 입력받아 전달
 cat A << B : 입력의 끝을 지정

5. vi 편집기
esc눌러 편집모드에서
a->문자 뒤에 입력 A->줄 맨끝에 입력
<-i 문자 자리에 입력 <-I 줄 맨 앞에 입력
x 한문자삭제 dd 그줄삭제 yy 복사
$커서 맨뒤로 보내기
shift + ; (:)  wq 저장하고 종료
                 w저장
                 q종료
                 !문자뒤에 붙이면 강제종료

6.솔라리스 주소바꾸기
#vi 편집기 이용

#vi /etc/hosts 중요 ip주소가있다
다른곳에서 ip주소 호스트네임 입력하면 접속가능
#vi /etc/hostname.pcn0(pcn0는 물리적 랜카드에따라 다를수있다)
#vi /etc/nodename 자기 컴퓨터이름

#reboot or init 6 솔라리스 리부팅
#poweroff or init 5 솔라리스 종료


7.디랙토리 추가 삭제
1) mkdir 디랙토리 만들기
  -p(한번에 연달아 하위 디랙토리 만들수있다)
2) rmdir 비어있는 디랙토리 삭제
  -r 지정된 경로모두 삭제

8. 파일추가 삭제
1)touch file 파일추가
2)rm file 파일삭제
  rm [옵션] file_name
          -i      : 삭제하기 전에 사용자의 확인을 요구
          -r,-R   : 하위 디렉토리와 그 안의 파일까지 모두 삭제

9. cd 폴더이동
     cd~ 또는 cd[return] : 자신의 홈디렉토리로 이동
     cd /  : 루트 디렉토리로 이동
     cd .. : 상위디랙토리로 이용 cd ../../.. 형식이로 상위폴더 이동가능

10. pwd : 현재 작업 디렉토리 위치보기

11. 파일보기

more은 한페이지씩 보여준다 (한장씩넘기기 enter 한번에 끝까지 스페이스)

head 파일의 처음부터 지정한 라인까지 보갰다
(ex head -6 파일네임(경로)

tail 마지막라인 출력
-의 경우 마지막 몇라인까지 보갰다
+부터 시작해서 마지막까지 보갰다


12. 링크파일만들기 (바로가기파일)
ex)ln -s /export/home/user1/dir1/dir2/aa 링크네임(바로가기)
현제위치 user1 이면 바로가기 파일 만들어 진다


13. 권한설정
chmod
r 4                          u - 사용자 +
w 2                          g - 그룹   -
x 1                          o - 아무나
                             u - all    =
 u     g     o
rwx | rwx | rwx
421   421   421
 7     7     7

.symbolic mode
chmod  사용

ex)chmod u+x(x추가),go-rw(rw빼기) dante
a=rw(전부 rw로)
.octal mode

ex)chmod 542 dante

umask 기본 권한 (디폴트) 022
d777 f666
 022  022


14. 인터넷접속(netscape)

#vi /etc/hosts
192.168.123.51 ipea75

네임서버
#vi /etc/resolv.conf
nameserver 168.126.63.1 kt(dns서버)

공유기 셋팅
#vi /etc/defaultrouter
192.168.123.254

#vi /etc/nsswitch.conf
hosts : files dns

#sun_netscape & 실행
#netscape &


15 . grep
파일 그문장이 포함된 글찾을때
#grep 192 /etc/hosts (hosts 에 192포함된 줄을 찾아서 보여조라)
#gre[ -v 192 /etc/hosts (hosts에 192포함된 줄빼고 보여조라)



16. 유저삭제
1)#vi /etc/passwd -> user1 만빼고 나머지 유저를 삭제
2)#vi /etc/shadow -> user1 만빼고 나머지 유저로 삭제
3)해당유저 디랙토리 삭제


17. admintool 사용법
 #admintool &
 창뜨면 edit -> add - username 지정
 -> login shell 을 korn 으로 -> password normal passwd로
 막지막 path 에 /export/home user12
 ->admintool 로 화면 따로 local .profile 을 .profile로 변환안해도된다

 #admintool &(백그라운드로보낸다 다른작업가능) 과 #admintool(실행끝내기전 다른작업불가) 차이점
 #ps -ef | admintool (#admintool & 을 실행하고 나서실행 (프로세스 고유번호 확인후)
 
 -window-
 process창에서 (ctrl+alt-tab) 종료시키는 기능
 =>안보이는 process로 찾아서 죽일수 있다.
 #kill pid 프로세스 죽이기
 #kill (고유번호).
 안되면 강제 #kill -9 번호


18. 다른컴퓨터에서 서버접속하기
 #telnet (ip or hostname)
 #root
 ->useradd -d /export/home/ipeal -m -s /bin/ksh ipea6
 $who 개정접속 확인
 $ps -ef 로 프로세스번호확인
 root에서 kill -9로 삭제


19. 압축하기
 #tar cvf file.tar file1 file2 file3
 #tar tvf back.tar 확인
 #tar xvf back.tar 압축풀기
 #tar cvf back.tar /(절대 상대경로구분)etc

 compress back.tar (z)압축  gzip back.tar(gz)
 umcompress back.tar 압축풀기 gunzip back.tar



출처 : http://rmsh.tistory.com/3?srchid=BR1http%3A%2F%2Frmsh.tistory.com%2F3

Posted by 1010
60.Unix2008. 11. 8. 16:49
반응형

> boot - vr
 : 새로운 하드를 인식시킨다

>format
 : 인식된 하드 목록을 보고

>p
 : 파티션 설정으로 들어가서

>print
 : 파티션 목록을 보고

>fsck /dev/rdsk/c0t0d0s0
:  필요한 파티션을 파일 시스템으로 복구하고

> mount /dev/dsk/cotodoso /home
 : 마지막으로 마운트 시킨다. /home <- 폴더가 존재해야 함..꼭...(이름 중북 피하고..)

문의 : hanho9@nate.com

Posted by 1010
60.Unix2008. 11. 7. 17:20
반응형

root 로 /etc/format  명령을 내리면 장착되있는 하드의 리스트가 나옵니다..


# format
Searching for disks...done


AVAILABLE DISK SELECTIONS:
       0. c0t0d0 <SEAGATE-ST318275LC-0001 cyl 11697 alt 2 hd 10 sec 304>
          /pci@1f,4000/scsi@3/sd@0,0
       1. c0t8d0 <SEAGATE-ST318275LC-0001 cyl 11697 alt 2 hd 10 sec 304>
          /pci@1f,4000/scsi@3/sd@8,0
       2. c0t10d0 <SEAGATE-ST318406LC-0109 cyl 26123 alt 2 hd 2 sec 686>
          /pci@1f,4000/scsi@3/sd@a,0


2번 디스크를 선택 하겠습니다


Specify disk (enter its number): 2
selecting c0t10d0
[disk formatted]
Warning: Current Disk has mounted partitions.


포맷 명령어들이 나오게 됩니다..


FORMAT MENU:
        disk       - select a disk
        type       - select (define) a disk type
        partition  - select (define) a partition table
        current    - describe the current disk
        format     - format and analyze the disk
        repair     - repair a defective sector
        label      - write label to the disk
        analyze    - surface analysis
        defect     - defect list management
        backup     - search for backup labels
        verify     - read and display labels
        save       - save new disk/partition definitions
        inquiry    - show vendor, product and revision
        volname    - set 8-character volume name
        !<cmd>     - execute <cmd>, then return
        quit


여기서 파티션을 선택


format> partition


PARTITION MENU:
        0      - change `0' partition
        1      - change `1' partition
        2      - change `2' partition
        3      - change `3' partition
        4      - change `4' partition
        5      - change `5' partition
        6      - change `6' partition
        7      - change `7' partition
        select - select a predefined table
        modify - modify a predefined partition table
        name   - name the current table
        print  - display the current table
        label  - write partition map and label to the disk
        !<cmd> - execute <cmd>, then return
        quit


프린트를 선택하면 파티션 리스트가 나오게됩니다


partition> print
Current partition table (original):
Total disk cylinders available: 26123 + 2 (reserved cylinders)

Part      Tag    Flag     Cylinders         Size            Blocks
  0 unassigned    wm       0                0         (0/0/0)            0
  1 unassigned    wu       0                0         (0/0/0)            0
  2     backup    wu       0 - 26122       17.09GB    (26123/0/0) 35840756
  3 unassigned    wm       0                0         (0/0/0)            0
  4 unassigned    wm       0                0         (0/0/0)            0
  5 unassigned    wm       0                0         (0/0/0)            0
  6       home    wm       0 - 13756        9.00GB    (13757/0/0) 18874604
  7       home    wm   13757 - 26121        8.09GB    (12365/0/0) 16964780


파티션 번호를 선택하시고


partition> 6
Part      Tag    Flag     Cylinders         Size            Blocks
  6       home    wm       0 - 13756        9.00GB    (13757/0/0) 18874604


Enter partition id tag[home]: home

원하시는 유형선택
Enter partition permission flags[wm]:

적절한 퍼미션 선택
Enter new starting cyl[0]:

시작하는 사이클 선택
Enter partition size[18874604b, 13757c, 13756e, 9216.12mb, 9.00gb]: 13757c

파티션 영역 지정

 
partition> quit


format> quit


이제 포맷을 해야죠


newfs /dev/dsk/c0t10d0s6   6번째파티션을 포맷합니다



그다음 파일시스템 검사를


fsck /dev/dsk/c0t10d0s6


그다음 적절한 디렉토리생성후


마운트 시키면 됩니다..


mount /dev/dsk/c0t10d0s6 /export/home1


df -h 를 눌러 확인 후 사용하시면 됩니다..



vfstab설정 (자동마운트 설정파일)

설정전

# vi /etc/vfstab
"/etc/vfstab" 9 행, 319 문자
#device         device          mount           FS      fsck    mount   mount
#to mount       to fsck         point           type    pass    at boot options
#
fd      -       /dev/fd fd      -       no      -
/proc   -       /proc   proc    -       no      -
/dev/dsk/c0t0d0s1       -       -       swap    -       no      -
/dev/dsk/c0t0d0s0       /dev/rdsk/c0t0d0s0      /       ufs     1       no      -
/dev/dsk/c0t0d0s7       /dev/rdsk/c0t0d0s7      /export/home    ufs     2       yes     -
swap     -       /tmp    tmpfs   -       yes     -


설정후


# vi /etc/vfstab
"/etc/vfstab" 9 행, 319 문자
#device         device          mount           FS      fsck    mount   mount
#to mount       to fsck         point           type    pass    at boot options
#
fd      -       /dev/fd fd      -       no      -
/proc   -       /proc   proc    -       no      -
/dev/dsk/c0t0d0s1       -       -       swap    -       no      -
/dev/dsk/c0t0d0s0       /dev/rdsk/c0t0d0s0      /       ufs     1       no      -
/dev/dsk/c0t0d0s7       /dev/rdsk/c0t0d0s7      /export/home    ufs     2       yes     -
/dev/dsk/c0t10d0s6      /dev/rdsk/c0t10d0s6     /export/home1   ufs     3       yes     -
/dev/dsk/c0t10d0s7      /dev/rdsk/c0t10d0s7     /export/home2   ufs     4       yes     -
swap    -       /tmp    tmpfs   -       yes     -


Posted by 1010
60.Unix2008. 11. 7. 14:48
반응형

[펌]

Solaris10 +Oracle10G 설치기 & 삽질기



환경 : VMWARE 5.5.3

가상하드 : 8GB (+ 12GB)

메모리 : 512M (+ 512M)

준비물 : Solaris CD ,오라클10G(http://www.oracle.com/technology/software/products/database/oracle10g/index.html)


들어가면서 무수한 삽질을 해버렷다.

리눅스에서는 9i 를 깔다가 몇번 설치 경험이 잇기 때문에 다만몇년전이지만 그래도 기억을 되살려 별 어려움 없이 Install할거라는 큰 착각을 해버렷다 . 그 당시에는 꽤 괜찬은 서버환경과 fedora 에서 몇번 깔았던것 같다 사실 fedora 랑 오라클이랑 궁합이

잘 맞지 않는다. gcc 버젼도 낮춰야 하고 꽤 귀찬은듯 하다.

그러나 Solaris 랑은 궁합이 잘 맞지 않을까 라는 쓸데 없는 생각으로열악한 환경에서 깔기 시작햇다.

테스트용으로 사용할것 이기 때문에 VM 에서 512M 가와 8GB 가상 하드를 잡고 SWAP 도 100M 를 잡고 시작 하였다.

필요한 환경과 세팅도 숙지 않은채 Oracle 을 압축을 풀고

./runInstaller 를 실행

하드부족 요구~ㅜ.ㅜ

VM 에서 하드 12기가를 잡고 넣엇다.


하드 추가 하는 방법


1. 일단 하드를 붙인다.


2. Solaris 에서 변경된 하드웨어를 인식하게 하는 방법은 세가지가 있다.

A)부팅 시 옵션을 입력한다.
x86 버전의 경우 부팅 후 (b)oot (i)nterprete 를 고르는 부분이 있는데, 이곳에 “b ?r”을 입력한다.
PROM 프롬프트 에서는 “boot ?r” 을 입력한다.
위와 같은 방법을 거쳐 booting 이 된 후에야 다음 작업을 할 수 있다.

B)reboot -- -r  명령을 하면

 부팅시에 변경된 상황을 Solaris 에서 인식 하게 된다..


C)econfigure 파일을 만들어 준 후 reboot 을 한다.
부팅 후 init에서 불러 들이는 rc.sysinit 파일에서는
root 디렉토리에 reconfigure 라는 파일의 존재를 파악해서
시스템이 변경된 부분이 있는지 kernel 을 rebuild 하게 한다.
참고로 / 디렉토리는 root 만이 쓸 수 있으니 반드시 root로 로그인해야 한다.


3.Format 프로그램으로 사용가능한 파티션 설정및 셋팅
 처음 명령어를 실행 하면 이렇게 뜬다 . 0번은 기존꺼 1번은 추가구입(?) 하드이다.
      0.c0d0
          /pci@0,0/pci-ide@7,1/ide@0/cmdk@0,0
      1. c0d1
          /pci@0,0/pci-ide@7,1/ide@0/cmdk@1,0

1번을 고른다.


FORMAT MENU:
        disk       - select a disk
        type       - select (define) a disk type
        partition  - select (define) a partition table
        current    - describe the current disk
        format     - format and analyze the disk
        fdisk      - run the fdisk program
        repair     - repair a defective sector
        show       - translate a disk address
        label      - write label to the disk
        analyze    - surface analysis
        defect     - defect list management
        backup     - search for backup labels
        verify     - read and display labels
        save       - save new disk/partition definitions
        volname    - set 8-character volume name
        !<cmd>     - execute <cmd>, then return
        quit

이런 메뉴들이 뜬다.

먼저 fdisk 를 실행하여 Solaris 에서 사용가능한 파일 시스템을 만든다.

VM 으로 만들었기 때문에 이부분은 생략 가능하다. 실제 서버 컴퓨터는

셋팅을 해줘야 한다. 참고로 UFS 파일 시스템이다.


이제 파일 시스템을 만들었으면

partition 명령으로 파티션과 슬라이스는 잡자.


PARTITION MENU:
        0      - change `0' partition
        1      - change `1' partition
        2      - change `2' partition
        3      - change `3' partition
        4      - change `4' partition
        5      - change `5' partition
        6      - change `6' partition
        7      - change `7' partition
        select - select a predefined table
        modify - modify a predefined partition table
        name   - name the current table
        print  - display the current table
        label  - write partition map and label to the disk
        !<cmd> - execute <cmd>, then return
        quit


#>print

Part      Tag    Flag     Cylinders        Size            Blocks
  0 unassigned    wm       3 - 1562       11.95GB    (1560/0/0) 25061400
  1 unassigned    wm       0               0         (0/0/0)           0
  2     backup    wu       0 - 1562       11.97GB    (1563/0/0) 25109595
  3 unassigned    wm       0               0         (0/0/0)           0
  4 unassigned    wm       0               0         (0/0/0)           0
  5 unassigned    wm       0               0         (0/0/0)           0
  6 unassigned    wm       0               0         (0/0/0)           0
  7 unassigned    wm       0               0         (0/0/0)           0
  8       boot    wu       0 -    0        7.84MB    (1/0/0)       16065
  9 alternates    wm       1 -    2       15.69MB    (2/0/0)       32130


지금 이렇게 잡혀 잇다.

첨으로 들어 왔을시에 2,8,9 번만 잡혀 있을것이다.

만들고자 하는 파티션을 만들고 크기를 잡고 빠져 나온다.


설정을 하고 나오서 다시 Format 프롬프트에 나오면

label 명령오로 설정을 저장한다.

그리고 quit

자 이제 하드는 잡혀잇다.

이제 마지막으로

newfs /dev/rdsk/c0d1s0 이렇게 하면

드디어 마운트 할수 있는 하드 드라이브가 생겻다..


내 같은 경우 새로운 하드는 오라클 전용을로 쓰기 때문에

#>mkdir /oracle

#>mount -F ufs /dev/dsk/c0d1s0 /oracle


#> df -k
파일시스템           K바이트    사용    가용   용량    설치지점

/dev/dsk/c0d1s0      12340960 3557274 8660277    30%    /oracle

이런식으로 마운트를 확인 할수 있다.

부팅시 마운트를 유지 할려면

[root]:/etc>vi /etc/vfstab

#device         device          mount           FS      fsck    mount   mount
#to mount       to fsck         point           type    pass    at boot options
#
fd      -       /dev/fd fd      -       no      -
/proc   -       /proc   proc    -       no      -
/dev/dsk/c0d0s1 -       -       swap    -       no      -
/dev/dsk/c0d0s0 /dev/rdsk/c0d0s0        /       ufs     1       no      -
/dev/dsk/c0d0s7 /dev/rdsk/c0d0s7        /export/home    ufs     2       yes     -
/dev/dsk/c0d1s0 /dev/rdsk/c0d1s0        /oracle ufs     1       yes     -
/devices        -       /devices        devfs   -       no      -
ctfs    -       /system/contract        ctfs    -       no      -
objfs   -       /system/object  objfs   -       no      -
swap    -       /tmp    tmpfs   -       yes     -

중간에 한줄 추가 하면 된다.

/dev/dsk/c0d1s0 /dev/rdsk/c0d1s0        /oracle ufs     1       yes     -


이제 하드는 셋팅 완료다~ 힘들다..


이제 스왑파일이다.

스왑파일은 2기가 정도를 요구 하는것 같다.

정확한 스펙은 보지 않아서 모르겟지만

이제 스왑파일을 만들어 보자

먼저 스왑이 위치할 디렉토리와 파일을 만든다.


#>mkdir /oracle/swap

스왑2기기 생성
#>mkfile 2048m /oracle/swap/swapfile

[root]:/oracle/swap> swap -l
swapfile             dev  swaplo 블록   사용 가능
/dev/dsk/c0d0s1     102,1       8 1048568 1048568

[root]:/oracle/swap> swap -a /oracle/swap/swapfile

[root]:/oracle/tempswap> swap -l
swapfile             dev  swaplo 블록   사용 가능
/dev/dsk/c0d0s1     102,1       8 1048568 1048568
/oracle/tempswap/swaporacle  -        8 2097144 2097144

이제 스왑파일 생성 완료!


이제 하드웨어적인 것은 완료 된것 같다 물리적 메모리도 1기가 정도 잡아 두는게

원활한 인스톨을 위해서 좋을것 같다 Solaris 자체가 메모리를 많이 먹는것 같기도 하고


이제 Oracle 관한 환경 설정 파일이나 Shm 관련 해서 셋팅 하는 일만 남았다.

먼저 Oracle 계정을 만들어 두자.


/* 오라클 프로그램 $ORACLE_HOME=/oracle/oraapp */

groupadd oinstall

groupadd dba

useradd -g dba -G oinstall -d /oracle/ -s /usr/bin/bash oracle

# passwd oracle
# 암호지정


# /usr/openwin/bin/xhost + <- 디스플레이 활성화
# su - oracle



/* 참고
-g 옵션은 기본 그룹을 뜻하며, Redhat의 경우 생략하면 자동으로 사용자 ID와 동일하게 부여됩니다.(제가 별로 좋아하지 않는 방식이기도 하죠.)

이 경우 /etc/passwd 파일에 해당 사용자의 기본 그룹으로 반영되며, 해당 사용자가 생성하는 파일 등은 기본적으로 해당 그룹으로 생성되지요.

-G 옵션은 해당 사용자가 속하게될 그룹 목록입니다.
예를들어 기본 그룹 외에 다른 그룹(이미 존재하는)에도 소속되도록 하려면 -G 옵션과 함께 그룹목록을 지정해 주면 됩니다

*/

# su - oracle  모드에서...

# mkdir /oracle/oraapp/
# mkdir /oracle/oradata/

---------------------------------------(1)

# chown -R oracle:dba /oracle/
# chmod -R 775 /oracle/oradata
# chmod -R 775 /oracle/oraapp


---------------------------------------(2)
# chmod -R 755 oraapp
----------------------------------------
1,2중.....



vi ~/.profile  --> /oracle 안에 생성
# 추가
DISPLAY=localhost:0.0; export DISPLAY
ORACLE_BASE=/oracle; export ORACLE_BASE
ORACLE_HOME=/oracle/oraapp; export ORACLE_HOME
ORACLE_SID=orcl; export ORACLE_SID
if [ -x /usr/local/bin/dbhome ]
then
  ORACLE_HOME=`dbhome orcl`; export ORACLE_HOME
  PATH=$PATH:$ORACLE_HOME/bin; export PATH
  LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib
fi


vi /etc/system
# 추가
set semsys:seminfo_semmni=100
set semsys:seminfo_semmns=1024
set semsys:seminfo_semmsl=256
set semsys:seminfo_semvmx=32767
set shmsys:shminfo_shmmax=4294967295
set shmsys:shminfo_shmmin=1
set shmsys:shminfo_shmmni=100
set shmsys:shminfo_shmseg=10


이제 오라클 Install

./runInstaller

이제 Pro C만 깔면 한두달은 장난칠 거리 생긴다

Pro C셋팅은 조만간에 다시!

Posted by 1010
60.Unix2008. 11. 7. 13:13
반응형

solaris를 설치하고 나서 Network이 되지 않을 때 체크할 사항들입니다.

1. /etc/hosts
#
# Internet host table
#
127.0.0.1 localhost
[ IP Address ] hostname loghost

위 파일은 자신의 컴퓨터의 IP 주소와 이름(hostname)을 지정해 준다.
각각의 구분은 공백으로 구분하므로 반드시 공백을 띄워준다.
파일을 열어 [ IP Address ] 란에 자신의 IP 주소를 적어준다.


2. /etc/defaultrouter
기본 Gateway를 지정하는 파일이다.
기본적으로 생성되어 있지 않기 때문에 새로 만들어 준다.
# cat /etc/defaultrouter
192.168.0.1

아래와 같이 커맨드로 바로 지정해 줄 수도 있다.
# route add default xxx.xxx.xxx.xxx 1

3. /etc/nsswitch.conf
Nameserver를 지정하는 파일이다.
nameserver로 DNS를 사용할 것이기 때문에 다음과 같이 추가해 준다.
#
# /etc/nsswitch.files:
#
# An example file that could be copied over to /etc/nsswitch.conf; it
# does not use any naming service.
#
passwd: files
group: files
hosts: files dns
ipnodes: files
networks: files
....
위와 같이 "hosts: files" 줄의 마지막에 칸을 띠고 dns를 추가해 준다.

4. /etc/resolv.conf
DNS 서버를 지정해 준다.

# vi /etc/resolv.conf
domain [domain name]
nameserver xxx.xxx.xxx.xxx(DNS server IP)

5. /etc/netmasks
위 파일을 열어 자신의 Netmask 값을 넣어 준다.
#
# The netmasks file associates Internet Protocol (IP) address
......... 중 략 .................
# "decimal dot" notation, e.g:
#
# 128.32.0.0 255.255.255.0
xxx.xxx.xxx.xxx xxx.xxx.xxx.xxx
[네트워크 주소][서브넷 마스크]

6. Reboot
# reboot



1. /etc/hosts
#
# Internet host table
#
127.0.0.1 localhost
[ IP Address ] hostname loghost

위 파일은 자신의 컴퓨터의 IP 주소와 이름(hostname)을 지정해 준다.
각각의 구분은 공백으로 구분하므로 반드시 공백을 띄워준다.
파일을 열어 [ IP Address ] 란에 자신의 IP 주소를 적어준다.


2. /etc/defaultrouter
기본 Gateway를 지정하는 파일이다.
기본적으로 생성되어 있지 않기 때문에 새로 만들어 준다.
# cat /etc/defaultrouter
192.168.0.1

아래와 같이 커맨드로 바로 지정해 줄 수도 있다.
# route add default xxx.xxx.xxx.xxx 1

3. /etc/nsswitch.conf
Nameserver를 지정하는 파일이다.
nameserver로 DNS를 사용할 것이기 때문에 다음과 같이 추가해 준다.
#
# /etc/nsswitch.files:
#
# An example file that could be copied over to /etc/nsswitch.conf; it
# does not use any naming service.
#
passwd: files
group: files
hosts: files dns
ipnodes: files
networks: files
....
위와 같이 "hosts: files" 줄의 마지막에 칸을 띠고 dns를 추가해 준다.

4. /etc/resolv.conf
DNS 서버를 지정해 준다.

# vi /etc/resolv.conf
domain [domain name]
nameserver xxx.xxx.xxx.xxx(DNS server IP)

5. /etc/netmasks
위 파일을 열어 자신의 Netmask 값을 넣어 준다.
#
# The netmasks file associates Internet Protocol (IP) address
......... 중 략 .................
# "decimal dot" notation, e.g:
#
# 128.32.0.0 255.255.255.0
xxx.xxx.xxx.xxx xxx.xxx.xxx.xxx
[네트워크 주소][서브넷 마스크]

6. Reboot
# reboot

Posted by 1010
60.Unix2008. 11. 7. 12:42
반응형

윈디하나의 솔라나라: 솔라리스 10 u6 기본설정

최종 갱신일: 2008-11-03, 이 문서는 윈디하나의 솔라나라, http://www.solanara.net/에서 최근에 갱신된 문서를 찾을 수 있다.

1. 개요

  • 소프트웨어 설치 문서에 생략되어있는 공통 설정 사항에 대해, 솔라리스 10 u6 기준으로 설명하는 문서이다.
  • LD_LIBRARY_PATH와 PATH 환경변수는 반드시 일치해야 한다.
  • 본 문서는 솔라리스 10 u6 x86, 32bit을 기준으로 작성했다. 자신의 솔라리스 버전 및 업데이트 번호는 아래와 같이 확인할 수 있다.
    root@wl ~ # cat /etc/release
                           Solaris 10 10/08 s10x_u6wos_07b X86 1)
               Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
                            Use is subject to license terms.
                                Assembled 27 October 2008
    root@wl ~ # isainfo -kv
    32-bit i386 kernel modules 2)
    root@wl ~ # 
    
    1) [솔라리스 10, 2008년 10월에 배포, 업데이트번호는 6, x86버전]이라는 뜻이다.
    2) 32비트 x86 커널을 사용하고 있다는 뜻이다.

2. 솔라리스 설정

  1. 네트워크 설정 확인. 네트워크가 동작하는지 확인해야 한다. 아직 DNS가 설치된것은 아니므로, 도메인으로 외부 서버에 접속할 수 없다.
    # cat /etc/hosts 1)
    127.0.0.1       localhost       
    192.168.0.3  wl     loghost
    # cat /etc/hostname.pcn0 2)
    wl
    # cat /etc/netmasks 3)
    192.168.0.0    255.255.255.0
    # cat /etc/defaultrouter 4)
    192.168.0.1
    # ifconfig -a 5)
    lo0: flags=1000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4> mtu 8232 index 1
            inet 127.0.0.1 netmask ff000000
    pcn0: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 index 2
            inet 192.168.0.3 netmask ffffff00 broadcast 192.168.0.255
    
    1) /etc/hosts에 자신의 호스트 이름과 맞는 IP가 입력되어있는지 확인한다. 이 예제에서 호스트 이름은 wl 이다.
    2) NIC와 호스트이름을 확인한다. pcn0는 솔라리스의 pcn 이라는 NIC의 첫번째 드라이버라는 뜻으로 벤더마다 다르다. (솔라리스 스팍용은 ce로 되어있을것이다) pcn0 인터페이스에 wl 호스트의 IP를 넣을 것이다.
    3) netmask를 확인한다. 192.168.0.3의 경우 192.168.0.0/24에 포함된다. 따라서 넷마스크값으로 255.255.255.0 를 정해줄 것이다.
    4) 기본 라우터를 확인한다. 윈도우XP로 따지자면 게이트웨이에 해당된다.
    5) ifconfig -a 를 해보면 pcn0에 IP및 넷마스크가 입력된 것을 확인할 수 있다. 이 정보가 정확하면, 다음으로 단계로 넘어간다. 만약 정확하지 않다면 위 파일들을 고치거나, /usr/sbin/sys-unconfig 명령을 실행해 재시작후, 네트워크 설정을 다시 한다.
  2. 네트워크 테스트
    예제의 네트워크 구성
    ┌─┐
    │A├──┐
    └─┘ ┌┴─┐ ┌───┐ ┏───┓
        │허브├─┤라우터├─┤인터넷├─
    ┌─┐ └┬─┘ └───┘ ┗───┛
    │B├──┘
    └─┘
    
    A: 세팅하고 있는 호스트. 192.168.0.3
    B: 이미 세팅되었으며 정상 작동하고 있는 호스트. 192.168.0.2
    라우터: 192.168.0.1
    
    1. 같은 스위치/허브에 물려있는 호스트로 PING 테스트
      # ping 192.168.0.2
      192.168.0.3 is alive
      #
      
      - 성공시 NIC와 네트워크 케이블, IP세팅, 스위치의 작동은 정상임
      - 실패시 솔라리스 설정, 호스트에 연결되어있는 케이블 및 NIC 드라이버등을 점검
    2. 라우터로 PING 테스트
      # ping 192.168.0.1
      192.168.0.1 is alive
      #
      
      - 성공시 라우터(게이트웨이)까지 가는 장비 스위치/허브들도 정상임. 라우터도 응답 하고 있음.
      - 실패시 라우터 관리자에게 문의 (라우터가 PING응답을 하지 않도록 설정한 경우도 있음)
    3. 외부 호스트로 PING 테스트
      # ping 211.174.186.251
      211.174.186.251 is alive
      #
      
      - 성공시 라우터의 설정이 정상적으로 되어있으며 네트워크는 정상적으로 작동함
      - 실패시 라우터 관리자에게 문의 (외부에 있는 임의의 호스트가 PING응답을 하지 않도록 설정한 경우도 있음)
      여기까지 잘 되면 네트워크 설정은 마무리 된 것이다.
    4. 도메인으로 ping 테스트
      # cp /etc/nsswitch.dns /etc/nsswitch.conf
      # vi /etc/resolv.conf
      domain xxxx.com
      search xxxx.com
      nameserver 168.126.63.1 # 한국통신의 DNS 서버이다.
      nameserver 168.126.63.2
      # ping www.solarisschool.com
      www.solarisschool.com is alive
      #
      
      - 성공시 도메인 서버 세팅 및 도메인 서버가 제대로 작동함
      - 실패시 도메인 서버 세팅 확인 및 다른 도메인 서버 사용
    5. 접속 테스트
      - ICMP패킷이 올바르게 전송되는지만 확인해도 좋지만 확실하게 하기 위해서는 TCP패킷까지 보내보는 것이 좋다. 외부의 호스트에 telnet접속한 후에 다시 자시 서버로 telnet접속해보는 형식. 이건 각자의 환경에 따라 다르기 때문에 구체적인 예는 생략하겠다.
  3. 디스크 확인
    솔라리스 10 u6부터 ROOT 슬라이스도 ZFS를 이용해 설치할 수 있다. 게다가 2개 이상의 디스크가 있고 인스톨시 선택했다면 자동으로 아래와 같이 미러링 해준다. 당연히 이를 이용해야할 것이다. 아래의 예는 15GB인 디스크 2개를 선택해 설치한 예이다.
    # df -h
    파일시스템             크기   사용   가용   용량    설치지점
    rpool/ROOT/rset         15G   3.8G   8.8G    31%    /
    /devices                 0K     0K     0K     0%    /devices
    ctfs                     0K     0K     0K     0%    /system/contract
    proc                     0K     0K     0K     0%    /proc
    mnttab                   0K     0K     0K     0%    /etc/mnttab
    swap                   1.4G   892K   1.4G     1%    /etc/svc/volatile
    objfs                    0K     0K     0K     0%    /system/object
    sharefs                  0K     0K     0K     0%    /etc/dfs/sharetab
    /usr/lib/libc/libc_hwcap1.so.1
                            13G   3.8G   8.8G    31%    /lib/libc.so.1
    fd                       0K     0K     0K     0%    /dev/fd
    rpool/ROOT/rset/var     15G    70M   8.8G     1%    /var
    swap                   1.4G    36K   1.4G     1%    /tmp
    swap                   1.4G    24K   1.4G     1%    /var/run
    rpool/export            15G    19K   8.8G     1%    /export
    rpool/export/home       15G    18K   8.8G     1%    /export/home
    rpool                   15G    35K   8.8G     1%    /rpool
    # zpool status
        풀: rpool
      상태: ONLINE
    스크럽: 요청된 항목이 없습니다.
      구성:
    
            NAME          STATE     READ WRITE CKSUM
            rpool         ONLINE       0     0     0
              mirror      ONLINE       0     0     0
                c1t0d0s0  ONLINE       0     0     0
                c2t0d0s0  ONLINE       0     0     0
    
    오류: 알려진 데이터 오류가 없습니다.
    # zfs list
    NAME                  USED  AVAIL  REFER  MOUNTPOINT
    rpool                5.87G  8.77G  35.5K  /rpool
    rpool/ROOT           3.87G  8.77G    18K  legacy
    rpool/ROOT/rset      3.87G  8.77G  3.80G  /
    rpool/ROOT/rset/var  69.7M  8.77G  69.7M  /var
    rpool/dump           1.00G  8.77G  1.00G  -
    rpool/export           37K  8.77G    19K  /export
    rpool/export/home      18K  8.77G    18K  /export/home
    rpool/swap              1G  9.77G    16K  -
    # 
    
  4. 솔라리스 패치 - 권장패치를 이용하는 방법
    - 솔라리스 권장 패치는 http://sunsolve.sun.com/pub-cgi/show.pl?target=patches/patch-access 에서 회원가입 후 받을 수 있다. 이곳에서 원하는 버전과 아키텍처를 선택한후 다운로드 하면 된다. 이파일은 솔라리스 전체 패치가 아니라 선에서 권장하는 권장 패치일 뿐이다. README 에는 어떠한 패치가 포함되어있는지 나와있다. 권장패치는 [썬 서비스 플랜]에 가입해야 받을 수 있으며 가입은 유료다. 예전에 찾아봤을때는 일년에 240달러였다.
    - 선은 솔라리스를 6개월에서 1년마다 업데이트해 내놓고 있다. 이것을 이용해 업그레이드 하면 최신 패치를 설치한것과 동일한 효과를 가질 수 있다.
    - 게다가 상당수 개별 패치는 무료다. (권장 패치는 개별 패치들의 모음이다. 역설적으로 말하면 README에 나와있는 패치를 일일이 다 다운받아서 수동으로 설치하면 같은 효과를 낸다는 뜻이다)
    - 여의치 않다고 생각되면 OpenSolaris 를 사용할 수 있다. 솔라나라의 내용은 모두 오픈 솔라리스와 호환된다. [레드햇 엔터프라이즈 리눅스]와 [페도라]의 관계가 [솔라리스]와 [오픈 솔라리스]의 관계와 비슷하다.
    # unzip 10_x86_Recommended.zip
    # cd 10_x86_Recommended
    # ./install_cluster -nosave 1)
    Are you ready to continue with install? [y/n]: y
    Installing xxxxxx-yy...
      Installation of xxxxxx-yy failed. Return code z. 2)
    # sync
    # sync
    # sync
    # init 6
    
    1) 패치 클러스터는 패치 언인스톨을 위해 관련 파일을 압축해 저장해 놓는데 이 파일의 크키가 꽤 크다. 게다가 압축률 안좋은 .Z 확장자로 압축한다. /var/sadm/pkg/*/save/*/*.Z 파일이 그것이다. -nosave옵션을 주면 이를 생성하지 않을 수 있다. 단 패치의 언인스톨은 불가능해진다.
    2) z에 리턴된 코드중 2, 8, 35번은 무시해도 좋다. 코드에 대한 전체 설명은 message.html을 참고한다.
    2 Attempt to apply a patch that's already been applied
    8 Attempting to patch a package that is not installed
    35 Later revision already installed
  5. 솔라리스 패치 - smpatch 를 이용한 방법
    # cp /usr/lib/breg/data/RegistrationProfile.properties /tmp 1)
    # vi /tmp/RegistrationProfile.properties 
    userName=사용자아이디
    password=사용자패스워드
    # /usr/sbin/sconadm register -a -r /tmp/RegistrationProfile.properties
    sconadm이 실행되는 중
    사용자를 인증하는 중 ...
    finish registration!
    # rm /tmp/RegistrationProfile.properties 
    # smpatch get 2)
    patchpro.backout.directory      -       ""
    patchpro.baseline.directory     -       /var/sadm/spool
    patchpro.download.directory     -       /var/sadm/spool
    patchpro.install.types          -       rebootafter:reconfigafter:standard
    patchpro.patch.source           -       https://getupdates1.sun.com/
    patchpro.patchset               -       current
    patchpro.proxy.host             -       ""
    patchpro.proxy.passwd           ****    ****
    patchpro.proxy.port             -       8080
    patchpro.proxy.user             -       ""
    # smpatch analyze 3)
    메시지 생략
    # smpatch download 4)
    (으)로 패치 다운로드 /var/sadm/spool...
    xxxxxx-yy has been validated.
    메시지 생략
    # smpatch update 5)
    에서 패치 설치 /var/sadm/spool...
    xxxxxx-yy 적용되었습니다.
    메시지 생략
    설치 정책이 허용하지 않는 업데이트의 ID가 파일에
    기록되었습니다.6)
            /var/sadm/spool/disallowed_patch_list
    
    설치한 하나 이상의 업데이트를 활성화하려면 시스템을 종료해야 합니다. 시스템 종료를 시작하려면 다음 명령 중 하나를 사용해야 합니다.
    o 펌웨어 프롬프트로 이동 - init 0 또는 shutdown -i 0
    o 시스템 전원 끄기 - init 5 또는 shutdown -i 5
    o 시스템 재시작 - init 6 또는 shutdown -i 6
    # sync
    # init 6
    
    1) 등록을 하지 않았다면 등록한다. 한번만 하면 된다.
    2) 등록이 완료되면 패치프로의 설정 내용을 확인한다. [patchpro.patch.source]가 위와같이 나오는지 확인한다. 프록시를 사용하는 경우 [smpatch set patchpro.proxy.host=xxx.xxx.xxx.xxx]와 같이 지정해 주어야 한다.
    3) 패치를 분석해본다. 설치되어있지 않은 패치번호가 나올 것이다.
    4) 패치를 다운로드 한다. /var/sadm/spool 에 패치를 받는다. 생략 가능하다. 하단에 나오는 [smpatch update] 명령에 필요한 패치를 자동으로 다운로드해준다.
    5) 패치를 적용한다. /var/sadm/spool 에 받은 패치를 실행시킨다. 만약 설치해야할 패치가 다운로드 되지 않았으면 다운로드 한다.
    6) [싱글모드]로 전환([init s]명령을 사용하면 된다)해 [smpatch add -x idlist=/var/sadm/spool/disallowed_patch_list]명령을 주면 [설치 정책이 허용하지 않는 업데이트]를 설치할 수 있다. 허용하지 않는 패치에는 커널 업데이트와 드라이버 업데이트가 포함되기 때문에 반드시 해야한다. 또한 반드시 수동 설치해야 하는 패치도 있는데(SMPATCH LIVE UPGRADE처럼) 이는 [smpatch add -i 121431-25]처럼 명령을 주면 된다
  6. root의 기본 셸과 홈 디렉토리를 변경한다. 아울러 패스워드 암호화 방식도 MD5로 변경한다.
    # mkdir /root
    # vi /etc/passwd
    root:x:0:1:Super-User:/root:/bin/bash
    # vi /etc/security/policy.conf
    CRYPT_ALGORITHMS_ALLOW=1,2a,md5,5,6 1)
    CRYPT_DEFAULT=md5 2)
    # passwd root 3)
    새 암호:
    새 암호를 다시 입력하십시오:
    passwd: 암호(root용)가 성공적으로 변경되었습니다.
    # 
    
    1) 사용할 수 있는 알고리즘을 나타낸 것으로 이는 /etc/security/crypt.conf 에 연결되어있는 약어이다.
    1: UNIX crypt 알고리즘
    2a: Blowfish 알고리즘
    md5: MD5 알고리즘
    5: SHA256 알고리즘 (Solaris 10 u6 이상부터 지원)
    6: SHA512 알고리즘 (Solaris 10 u6 이상부터 지원)
    2) __unix__ 를 md5로 변경한다. 이후 패스워드 변경시 /etc/shadow파일을 보면 패스워드 필드가 $md5 로 시작하는 것을 볼 수 있다. 8자 이상의 패스워드도 지원해준다. 참고로 *LK*는 잠금상태, NP는 로그인 불가상태를 의미한다. 참고로 솔라리스 10 u6 이상 사용자들은 더 나은 알고리즘인 6(SHA512)을 사용하는 것도 좋다.
    3) __unix__로 암호화 되어있는 패스워드를 MD5로 암호화 하기 위해 root 패스워드를 한번 더 변경한다.
  7. 환경 설정 파일을 변경한다. 필자는 /etc/profile을 변경한다. 가장 아래줄에 다음과 같이 추가해준다. 필자는 sh와 bash를 사용한다.
    # vi /etc/default/init
    메시지 생략
    LANG=ko.UTF-8
    # vi /etc/profile
    메시지 생략
    alias ll="ls -alF"
    tty -s && stty cs8 -istrip defeucw
    
    case "$0" in
    bash | -bash)
    	PS1="\u@\h \w \\$ "; export PS1
    	;;
    sh | -sh)
    	PS1="`/usr/ucb/whoami`@`hostname'` "
    	case `/usr/xpg4/bin/id -u` in
    		0) PS1="${PS1}# ";;
    		*) PS1="${PS1}$ ";;
    	esac
    	;;
    esac
    EDITOR=vi; export EDITOR
    CC=cc; export CC
    PATH=/usr/local/bin:/opt/SUNWspro/bin:/usr/bin:/usr/sbin:/usr/ccs/bin:/usr/openwin/bin; export PATH
    LD_LIBRARY_PATH=/usr/local/xml/lib:/usr/lib:/usr/local/lib:/usr/ucblib:/usr/ccs/lib; export LD_LIBRARY_PATH
    #
    
    ※ 이 문서에서 가장 중요한 부분이 PATH 환경변수 세팅과 LD_LIBRARY_PATH 환경변수 세팅이다. 꼭 맞춰주자. PATH와 LD_LIBRARY_PATH가 기존에 소개했던 솔라리스 9용 설정과 다르다.
    ※ 솔라리스 콘솔도 컬러를 지원하기 때문에 안시코드를 이용해 컬러를 넣을수도 있다.
    PS1="\u@\h ^[[1;31m\w^[[0m \\$ "; export PS1
    
    처럼 입력할 수 있다. ^[[의 ^[부분은 안시 이스케이프 코드로, vi에디터의 입력 모드에서, Ctrl+V를 누르고 ESC키를 눌러 입력해야 한다.
  8. SAR(System Activity Reporter)를 활성화 하고 크론의 sar 설정을 활성화한다. NTP 데몬을 활성화한다.
    # svcadm enable sar
    # EDITOR=/usr/bin/vi; export EDITOR
    # crontab -e sys 1)
    0 * * * 0-6 /usr/lib/sa/sa1
    20,40 8-17 * * 1-5 /usr/lib/sa/sa1
    5 18 * * 1-5 /usr/lib/sa/sa2 -s 8:00 -e 18:01 -i 1200 -A
    # vi /etc/inet/ntp.conf 2)
    # 한국표준과학연구원, time.bora.net
    server 203.248.240.103
    # svcadm enable ntp
    
    1) 주석만 풀어주면 된다.
    2) 여기에서는 NTP 데몬을 이용한 타임서버 동기화 방법을 설명했다. 다른 방법으로 rdate를 cron에 등록시키는 방법도 있다. [rdate time.bora.net]명령을 이용하면된다. [svcadm enable time:stream]와 [svcadm enable time:dgram]가 활성화되어있는 솔라리스 호스트라면 그 호스트에서 시간을 가져올 수 있다.
  9. 사용자를 추가하고 패스워드를 지정한다.
    # useradd -d /export/home/windy -c "윈디하나" -g staff -m -u 101 -s /bin/bash windy 1)
    64 블록
    # passwd windy
    새 암호:
    새 암호를 다시 입력하십시오:
    passwd: 암호(windy용)가 성공적으로 변경되었습니다.
    # 
    
    1) 관리자가 주로 사용할 계정을 생성한다. (당연한 말이지만 꼭 windy가 아니어도 된다. 솔라나라와 똑같이 하라는 말 때문인지, 사용할 계정 이름까지 까지 똑같이 하는 경우를 봤다. 많이 봤다. ㅎㅁ) 8자 이상의 아이디를 가진 계정을 생성하면 [UX: useradd: xxxxxxxxxx name too long.]과 같은 메시지가 발생하지만 생성 되어있다. (그리고 정상적으로 사용 가능하다)
  10. 솔라나라에 필요한 링크를 걸어준다.
    반드시 필요해 링크를 거는 것이 아니라 솔라나라의 문서는 모두 wget을 이용해 받고, (GNU) tar를 이용해 압축을 풀도록 되어있기 때문에 걸어놓는 것이다.
    # mkdir -p /usr/local/bin
    # cd /usr/local/bin
    # ln -s /usr/sfw/bin/wget wget
    # ln -s /usr/sfw/bin/gtar tar
    
  11. 가뿐하게 한번 재시작해준다.
    # sync
    # sync
    # init 6
    

3. 컴파일러/기본 라이브러리 설치

아래에 소개된 프로그램을 설치한다. 솔라나라의 문서를 적용하려면 반드시 설치해야 한다.

Sun Studio 12

※ cc(C 컴파일러)를 설치한다. 솔라나라는 gcc가 아닌 cc를 사용할 것이다. SunStudio12ml-solaris-x86-200709-pkg.tar.bz2 파일은 Sun Studio Downloads에서 Sun Developer Network에 무료로 가입한 후 받을 수 있다.

※ 솔라나라를 2005년 7월에 오픈하면서 이번 리뉴얼에까지 가장 많이 바뀐것이 바로 gcc기준의 문서를 cc로 바꾼것이다. 솔라리스에서 cc가 유료였던 관계로 하는수 없이 gcc를 썼었는데 Sun Studio 12부터 무료로 배포되고 사용할 수 있기 때문에 cc를 사용하는 것이다. gcc와 cc를 혼합해서 쓰는것에는 여러가지 문제가 있으며, 아직까지는 솔라리스를 제대로 지원해주는게 cc라고 생각하기 때문에 cc를 기준으로 설명한다. 솔라나라의 문서는 cc를 기준으로 하지만 gcc를 사용해도 큰 문제 없도록 구성 되어있다. sunfreeware의 gcc나 솔라리스 기본 설치된 gcc(/usr/sfw/bin/gcc)를 사용해도 문제 없다는 의미이다. 실제로 어플리케이션이 컴파일시 gcc만을 요구하는 경우 솔라리스에 이미 설치되어있는 gcc를 이용해 컴파일 할 것이다.
  1. root@wl ~ # mkdir SunStudio
    root@wl ~ # cd SunStudio
    root@wl ~/SunStudio # ./batch_installer --show-sla 1)
    메시지 생략
    Please contact Sun Microsystems, Inc.  4150 Network Circle,
    Santa Clara, California 95054 if you have questions.
    root@wl ~/SunStudio # ./batch_installer -p all --accept-sla 1)
    Java Accessibility Bridge for GNOME loaded.
    
    
    root@wl ~/SunStudio # cc 2)
    usage: cc [ options] files.  Use 'cc -flags' for details
    root@wl ~/SunStudio # 
    
    1) 라이센스를 확인한다. [./batch_installer -p all --accept-sla]는 라이센스에 동의하였으며, 아무것도 묻지 않고 전체설치할때 사용하는 명령어이다. [Java Accessibility Bridge for GNOME loaded] 메시지가 나온 이후 한참 걸린다.
    2) 위와같이 나와야 한다. [/usr/ucb/cc: language optional software package not installed] 이렇게 나오면 안된다.
  2. 컴파일러를 설치한 후에는 패치를 해야 한다. Sun Studio 12 Patches에 가보면 버전별로 받아서 설치해야할 패치 목록이 나와있다. 리스트된 패치는 모두 무료로 제공되니 받아서 설치하면 된다. 물론 SDN에 가입해야 받을 수 있다. 솔라나라의 문서는 최신패치를 적용한 것을 기준으로 작성했다.
  3. smpatch (위에서 설명) 를 이용하면 cc가 시스템과 같이 패치된다.

OpenSSL

더 자세한 사항은 윈디하나의 솔라나라: OpenSSL을 참고한다. 솔라나라에서 소개하는 상당수의 어플리케이션이 OpenSSL을 지원하고 있으며 SSL과 같이 컴파일할것이다.
root@wl ~/source # wget http://www.openssl.org/source/openssl-0.9.8h.tar.gz
root@wl ~/source # tar xvfz openssl-0.9.8h.tar.gz
root@wl ~/source # cd openssl-0.9.8h
root@wl ~/source/openssl-0.9.8h # ./config
root@wl ~/source/openssl-0.9.8h # make
root@wl ~/source/openssl-0.9.8h # make test
root@wl ~/source/openssl-0.9.8h # make install
Valid XHTML 1.0 Transitional Valid CSS!
Posted by 1010
60.Unix2008. 11. 7. 12:26
반응형
IPMP (IP MultiPathing) 설정하기  (solaris8 이상 지원)
**************************************************



1) IPMP 설정 (Active-Standby 설정)


1.1) PROM 의 정보를 설정한다.

# eeprom local-mac-address?=true

; 시스템에 hme0 외에 hme1 인터페이스가 있어도 기본적으로는 mac address 가 hme0 의 mac address 를 갖게 되는데 (즉, 시스템 mac 주소를 갖는데)

hme1 에도 자기 고유의 mac address 를 가지게 하려면 local-mac-address? 를 true로 바꾸어준다.   default=false



1.2) 네트워크 장애 감지용 IP-address를 설정한다. (test IP -> 고정)

# ifconfig hme0 192.168.0.71 group black [netmask 255.255.255.0] deprecated -failover up



1.3) Service IP를 설정한다. (failover시 이동한다. -> 가변적)

# ifconfig hme0 addif 192.168.0.70 [netmask 255.255.255.0] up

: hme0 에 장애 발생시 service IP 는 qfe2 로 이동을 하므로 계속 사용할 수 있다.

test IP 는 hme0 에 대한 test 만 수행하고 이동은 하지 않으므로 사용할 수 없다.



1.4) qfe2 에 standby용 test IP를 설정한다.

# ifconfig qfe2 plumb 192.168.0.72 group black [netmask 255.255.255.0] deprecated    -failover standby up




1.5) 설정된 정보를 확인한다.

# ifconfig -a

# scstat -i  (네트워크 인터페이스 상태 확인)




1.6) 명령을 사용하여 failover 상태 점검한다.

# if_mpadm -d hme0

# ifconfig -a

# scstat -i




1.7) 원 위치 하기

# if_mpadm -r hme0

# ifconfig -a

# scstat -i






2) IPMP 설정 (Active-Active 설정)


2.1) PROM 정보를 설정한다.

# eeprom local-mac-address?=true

; 시스템에 hme0 외에 hme1 인터페이스가 있어도 기본적으로는 mac address 가 hme0 의 mac address 를 갖게 되는데 (즉, 시스템 mac 주소를 갖는데)

hme1 에도 자기 고유의 mac address 를 가지게 하려면 local-mac-address? 를 true로 바꾸어준다.   default=false


2.2) test IP 를 설정한다.

# ifconfig hme0 192.168.0.71 group black [netmask 255.255.255.0] deprecated -failover up


2.3) service IP 를 설정한다.

# ifconfig hme0 addif 192.168.0.70 [netmask 255.255.255.0] up


2.4) test IP를 설정한다.

# ifconfig qfe2 plumb 192.168.0.72 group black [netmask 255.255.255.0] deprecated -failover up


2.5) service IP를 설정한다.

# ifconfig qfe2 addif 192.168.0.73 [netmask 255.255.255.0] up

# ifconfig -a

# scstat -i



2.6) 명령을 사용하여 failover 상태 점검한다.

# if_mpadm -d hme0

# ifconfig -a

# scstat -i



2.7) 원 위치 하기

# if_mpadm -r hme0

# ifconfig -a

# scstat -i




3) IPMP 설정 제거하기


3.1) 가상 인터페이스를 제거한다.

# ifconfig qfe2:1 unplumb

# ifconfig qfe2 unplumb

# ifconfig hme0:1 unplumb



3.2) hme0 의 카드 정보를 수정한다.

# ifconfig hme0 -deprecated failover

# ifconfig hme0 group ""





4) 반영구적 사용을 위한 IPMP 설정


4.1) Active-Standby 설정시

# vi /etc/hostname.hme0

192.168.0.71 group black up -failover deprecated addif 192.168.0.70 netmask 255.255.255.0 up



# vi /etc/hostname.qfe2

192.168.0.73 group black deprecated -failover standby up




4.2) Active-Active 설정시

# vi /etc/hostname.hme0

192.168.0.71 group black up -failover deprecated addif 192.168.0.70 netmask 255.255.255.0 up



# vi /etc/hostname.qfe2

192.168.0.72 group black up -failover deprecated addif 192.168.0.73 netmask 255.255.255.0 up
Posted by 1010
60.Unix2008. 11. 7. 10:03
반응형

Solaris 10 에서 openvpn 서버 설치하기


최근 solaris 환경에 openvpn 서버를 설치할 기회가 있었는데, linux 에서와는 달리 약간의 삽질이 필요했습니다. 배포본으로부터 바이너리 및 설치 스크립트를 제공받을 수 없어서, /dev/tun 장치 파일 생성이나 ip forwarding / NAT 설정에서 조금 메모해 둘 필요가 있다고 생각되어 아래 내용을 보충해 둡니다.

작업했던 환경은 solaris 10 입니다. solaris 9 이하에서도 ip filter 설치 이외에 특별한 차이는 없습니다.
# uname -a
SunOS tomoko 5.10 Generic_127127-11 sun4v sparc SUNW,SPARC-Enterprise-T5220 Solaris

openvpn 바이너리 및 tun 드라이버 생성


본문의 [http]1.4.1 설치하기 에 해당되는 내용입니다.

우선 openvpn 소스코드에서 컴파일하지 않으면 되지 않으므로, http://www.sunfreeware.com/ 에서 gcc, libtool 등을 설치하여 기본적인 컴파일 환경을 갖추어야 합니다. 또한 openvpn 컴파일시에 필요한 openssl, lzo 라이브러리도 미리 설치해 두기로 합니다. 각 패키지가 동작하기 위한 의존성이 걸린 패키지도 설치되어 있지 않다면 함께 설치해 주세요.
# gzip -d gcc-3.4.6-sol10-sparc-local.gz
# pkgadd -d ./gcc-3.4.6-sol10-sparc-local
...
# pkgadd -d ./openssl-0.9.8h-sol10-sparc-local
# pkgadd -d ./lzo-2.03-sol10-sparc-local

이제 openvpn 소스코드를 컴파일하게 되는데, solaris 10 에는 /dev/tun 장치가 생성되어 있지 않으므로, 그냥 진행하면 아래와 같은 오류를 내면서 컴파일이 중단됩니다.
tun.c:1183:2: #error I need the symbol TUNNEWPPA from net/if_tun.h
tun.c: In function `open_tun':
tun.c:1245: error: `TUNNEWPPA' undeclared (first use in this function)
tun.c:1245: error: (Each undeclared identifier is reported only once
tun.c:1245: error: for each function it appears in.)
make[1]: *** [tun.o] Error 1
make[1]: Leaving directory `/data/pkg/openvpn/openvpn-2.0.9'

따라서 openvpn 설치 전에 미리 tun 드라이버를 생성해 둡니다. solaris 설치 시디에서 드라이버를 설치할 수 있을 것 같기도 한데, 귀찮기도 하거니와 방법도 잘 모르겠고 해서 구글링한 결과, 아래와 같은 해결책을 찾았습니다.

# wget http://vtun.sourceforge.net/tun/tun-1.1.tar.gz
# zcat tun-1.1.tar.gz | tar xvf -
# cd tun-1.1/solaris
# perl -pi~ -e 's;"TUN/TAP driver .*;"TUN/TAP driver 1.1",;' tun.c
# perl -pi~ -e 's/#define TUNSETPPA.*/$&\n\n#define TUN_VER "1.1"/' if_tun.h
# gcc -O2 -Wall -D_KERNEL -I. -m64 -mcpu=ultrasparc -c tun.c
# /usr/ccs/bin/ld -r -o tun tun.o
# file tun
tun:            ELF 64-bit MSB relocatable SPARCV9 Version 1, UltraSPARC1 Extensions Required
# cp tun /usr/kernel/drv/sparcv9/tun
# cp tun.conf /usr/kernel/drv/tun.conf
# cp if_tun.h /usr/include/net/if_tun.h
# chmod 755 /usr/kernel/drv/sparcv9/tun
# chown root:sys /usr/kernel/drv/sparcv9/tun /usr/kernel/drv/tun.conf
# chown root:bin /usr/include/net/if_tun.h
# rem_drv tun
# add_drv -v tun
# ls -als /dev/tun
1 lrwxrwxrwx 1 root sys 29 Oct 22 11:03 /dev/tun -> ../devices/pseudo/clone@0:tun

사용하는 장비의 아키텍처에 따라 gcc 옵션 및 tun 드라이버 설치 위치를 적절히 변경하면 되겠습니다. 제대로 되었다면 /dev/tun 캐릭터 디바이스가 생성됩니다.

다음으로 openvpn 소스코드 컴파일입니다. openssl 및 lzo 라이브러리 위치를 지정해 줄 필요가 있습니다. 아마도 LD_LIBRARY_PATH 에도 지정이 되어 있어야 할 것 같습니다. (귀찮아서 미확인)
# env | grep PATH
LD_LIBRARY_PATH=/usr/local/lib:/usr/local/ora:/usr/local/ssl/lib:/usr/openwin/lib:...
PATH=/usr/local/bin:/usr/local/ssl/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/ccs/bin:...
# ./configure --with-ssl-headers=/usr/local/ssl/include --with-ssl-lib=/usr/local/ssl/lib
# make
# make install
# ls -als /usr/local/sbin/openvpn
1504 -rwxr-xr-x 1 root root 1525160 Oct 22 14:57 /usr/local/sbin/openvpn

openvpn 기동시에 LD_LIBRARY_PATH 지정하는 것이 귀찮다면, 바이너리를 링크할 때 rpath 지정해 주면 편리합니다. solaris ld 는 rpath 지정하는 옵션이 -R 입니다. rpath 지정하는 것이 나쁘다는 의견도 있으므로 아래는 참고로 하시면 되겠습니다.
# gcc  -g -O2  -L/usr/local/ssl/lib -R /usr/local/lib:/usr/local/ssl/lib -o openvpn            \
    base64.o buffer.o  crypto.o error.o event.o  fdmisc.o forward.o fragment.o  gremlin.o      \
    helper.o init.o  interval.o list.o lzo.o  manage.o mbuf.o misc.o  mroute.o mss.o mtcp.o    \
    mtu.o  mudp.o multi.o ntlm.o occ.o  openvpn.o options.o otime.o  packet_id.o perf.o ping.o \
    plugin.o pool.o proto.o  proxy.o push.o reliable.o  route.o schedule.o session_id.o        \
    shaper.o sig.o socket.o  socks.o ssl.o status.o  thread.o tun.o                            \
    -lssl -lcrypto -llzo2 -lnsl -lsocket
# env | grep LD_LIBRARY_PATH
(nothing found)
# ldd openvpn
        libssl.so.0.9.8 =>       /usr/local/ssl/lib/libssl.so.0.9.8
        libcrypto.so.0.9.8 =>    /usr/local/ssl/lib/libcrypto.so.0.9.8
        liblzo2.so.2 =>  /usr/local/lib/liblzo2.so.2
        libnsl.so.1 =>   /lib/libnsl.so.1
        libsocket.so.1 =>        /lib/libsocket.so.1
        libc.so.1 =>     /lib/libc.so.1
        libdl.so.1 =>    /lib/libdl.so.1
        libgcc_s.so.1 =>         /usr/local/lib/libgcc_s.so.1
        libmp.so.2 =>    /lib/libmp.so.2
        libmd.so.1 =>    /lib/libmd.so.1
        libscf.so.1 =>   /lib/libscf.so.1
        libdoor.so.1 =>  /lib/libdoor.so.1
        libuutil.so.1 =>         /lib/libuutil.so.1
        libgen.so.1 =>   /lib/libgen.so.1
        libm.so.2 =>     /lib/libm.so.2
        /platform/SUNW,SPARC-Enterprise-T5220/lib/libc_psr.so.1
        /platform/SUNW,SPARC-Enterprise-T5220/lib/libmd_psr.so.1

ip forwarding / NAT 설정


본문의 [http]1.6.2 서버쪽의 다른 서버들 연결하기 에 해당하는 내용입니다.

solaris 10 을 기준으로 설명합니다. solaris 9 이하에서는 설정을 위한 명령어가 약간 차이가 있습니다.

ip forwarding 기능을 활성화 하기 위하여 routeadm 명령을 사용합니다. -u 옵션으로 다음 부팅시에도 적용되도록 된다고 합니다. (미확인)
# routeadm -u -e ipv4-forwarding
# routeadm
              Configuration   Current              Current
                     Option   Configuration        System State
---------------------------------------------------------------
               IPv4 routing   disabled             disabled
               IPv6 routing   disabled             disabled
            IPv4 forwarding   enabled              enabled
            IPv6 forwarding   disabled             disabled

           Routing services   "route:default ripng:default"
...
# ifconfig -a
lo0: flags=2001000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4,VIRTUAL> mtu 8232 index 1
        inet 127.0.0.1 netmask ff000000
tun0: flags=10011008d1<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST,ROUTER,IPv4,FIXEDMTU> mtu 1500 index 3
        inet 10.8.0.1 --> 10.8.0.2 netmask ffffffff
        ether 0
e1000g0: flags=1100843<UP,BROADCAST,RUNNING,MULTICAST,ROUTER,IPv4> mtu 1500 index 5
        inet 210.103.xxx.xxx netmask fffffffc broadcast 210.103.xxx.xxx
        ether xx:xx:xx:xx:xx:xx

tun0, e1000g0 인터페이스 상태에 ROUTER 가 추가되었습니다. 상기 설정으로 openvpn 서버는 라우터의 역할을 하게 되고, openvpn 클라이언트로부터 tun0 를 통해 전달받은 패킷을 외부로 뿌려줄 수 있게 됩니다. 하지만 패킷의 source ip 가 openvpn 클라이언트의 사설 ip 인 상태이므로, 클라이언트가 vpn 을 통해 다른 서버와 통신할 수는 없습니다. 따라서 추가적으로 NAT 설정을 해 주어야 합니다.

linux 의 iptables 에 대응하여 solaris 에는 ip filter 가 있습니다. solaris 10 부터는 기본적으로 설치되어 있고, solaris 9 이하에서는 별도로 설치해야 합니다. 설치 방법은 어렵지 않다고 하니 구글의 도움을 받도록 합시다. 설치가 되었다면 nat 설정을 추가하고(ipnat.conf), 설정을 적용할 네트웍 디바이스를 지정합니다(pfil.ap). ipf 설정은 보다 복잡하게 할 수 있지만, 여기서는 openvpn 클라이언트의 주소지(10.8.0.0/24)에서 들어온 패킷을 외부 인터넷(e1000g)으로 연결하도록 간단하게 한 줄만 추가합니다.
# echo "map e1000g0 10.8.0.0/24 -> 0/32" >> /etc/ipf/ipnat.conf
# echo "e1000g -1 0 pfil" >> /etc/ipf/pfil.ap
# ifconfig e1000g0 down
# ifconfig e1000g0 unplumb
# ifconfig e1000g0 plumb
# ifconfig e1000g0 210.103.xxx.xxx netmask 255.255.255.252 up

pfil.ap 설정을 적용하기 위해서는 네트웍 디바이스를 내렸다 올려야 함에 유의하고, 여기까지 되었다면 pfil, ipfilter 서비스를 구동하여 상태를 확인합니다.
# svcadm enable svc:/network/pfil
# svcadm enable svc:/network/ipfilter
# ipf -V
ipf: IP Filter: v4.1.9 (592)
Kernel: IP Filter: v4.1.9
Running: yes
Log Flags: 0 = none set
Default: pass all, Logging: available
Active list: 0
Feature mask: 0x107

openvpn 클라이언트에서 인터넷을 접속할 때 vpn 서버의 ip 가 묻어 나가는 것이 확인되면 완료입니다. :-)
Posted by 1010
99.유용한정보/잡식2008. 11. 7. 09:31
반응형
컴퓨터 부팅시 비프음 소리에 의한 진단법
AMD 바이오스
1번 --> 램 불량이거나 램끼리 규격이 안맞을때(Dram 리플레시실패)

2번 --> 패리티 체크 실패(Parity라함은 오류를 검출하기위한 여분의정보를 일컫는다.)

3번 --> 기본 64KB(도스영역) 메모리 점검 실패( 메모리 문제)이다. 메모리가 잘못 꽂혔을 수가 있으므로 메모리를 뺀후다시장착한다.문제가 해결되지 않으면 메모리를 다른 정상적인 PC에 바꾸어 장착해 본다. 메모리를 바꿨는데도 해결이 안되면 메모리 소켓의 불량일 확률이 높다. 메인보드를 A/S 받아야 한다.

4번 --> 시스템 타이머 실패 .메인보드 이상에 관련된 부분이다. CMOS 밧데리를 교체하거나 바이오스를 업그레이드 하거나 메인보드를 A/S 받아야 한다

5번 --> 프로세서(CPU) 오류.CPU 관련 에러다. CPU를 빼서 연결상태를 확인해서 다시 꽂아보고 클럭수를 낮추거나 다른 CPU로 교환해서 테스트 해본다.

6번 --> 먼저 소리가 가장 크다는게 특징이다. 키보드컨트롤러/Gate 20 실패. 입력장치 에러다. 키보드 연결을 확인해서 다시 한번 연결해 보고 키보드를 다른것으로 바꾸거나 메인보드의 키보드 커넥터를 교체한다.

7번 --> 가상모드 오류(4번의 비프음과 동일)

8번 --> 비디오 카드 인식 오류.그래픽카드가 정확하게 꽂혀있나 확인하고 VGA카드의 슬롯을 바꾸거나 VGA카드를 다른 것으로 교체해서 작동시켜본다.

9번 --> 롬바이오스 체크 오류. 변경된 바이오스의 내용을 저장하거나 메인보드를 A/S 받아야 한다.

10번 --> CMOS 읽기/쓰기 오류(ROM BIOS CHIP을 바꾸는데 부품만 1만5천원이 든다)

11번 --> 캐시 불량.캐시를 Disable 시켜서 부팅을 시도하거나 캐시를 교체하거나 메인보를A/S받아야 한다. 보통 이런 메시지는 잘안나오는데 캐시를 업그레이드 하고 난후 문제인 것 같다.

어워드 바이오스

1번 짧게 --> 시스템 정상

2번 짧게 --> 시스템 에러(화면상에 나타난 에러메시지를 참고로 해결한다.)

3번 짧게 --> 키보드 에러. 입력장치 에러다. 키보드 연결을 확인해서 다시 한번 연결해 보고 키보드를 다른 것으로 바꾸거나 메인보드의 키보드 커넥터를 교체한다.

1번 길게 1번 짧게 --> 메인보드 에러.메인보드에 장착되어 있는 주변장치들의 케이블연결이나 소켓/슬롯에 장착이 잘못되어 있는 경우에 주로 발생한다. CPU,RAM,VGA...등을 뽑았다가 다시 설치해 본다. 주변장치들이 이상이 없는데도 계속해서 비프음이 울리면 메인보드를 A/S 받아야 한다.

1번 길게 2번 짧게 --> VGA 카드 에러.VGA 카드가 메인보드 슬롯에 제대로 꽂혀 있는지 확인해본다. 뽑았다가 다시 꽂아서 부팅을 해본다.

1번 길게 3번 짧게 --> VGA 카드에러.VGA 카드가 메인보드 슬롯에 제대로 꽂혀 있는지 확인해 본다. 뽑았다가 다시 꽂아서 부팅을 해본다.

연속/반복/없음-->시스템의 주변장치들이 연결에 문제가 있는 경우에 발생한다. 시스템을 모두 분해해서 처음부터 다시 연결해 본다.

피닉스 바이오스

1-1-3번--> CMOS에 이상이 있는 경우이다. 건전지 교환이나 점퍼 셋팅이 잘되었는지 확인한다.

1-1-4번--> 바이오스에 이상이 있는 경우이다. 대부분 바이오스를 교환해야한다.

1-2-1번--> 마더보드에 있는 타이머에 이상이 있는 경우이다.

12-2번--> 마더보드가 불량인 경우이다. 전문 수리점에 A/S를 맡겨야 한다.

1-2-3번--> 마더보드나 메모리가 불량인 경우이다. 메모리가 제대로 꽃혀있는지 혹시나 메모리 불량이 아닌지 확인한다.

1-3-1번-->위와 같다.

1-3-3번-->위와 같다.

1-3-4번-->위와 같다.

1-4-1번-->위와 같다.

1-4-2번-->메모리중 일부가 불량인 경우이다. 업그레이드를 했다면 다른거로 교체해본다.

2-?-?번--> 두 번의 경고음으로 시작하는 것은 모두 메모리 가운데 일부가 불량인 경우이다.

3-1-1번-->마더보드에 있는 칩가운데 일부가 불량인 경우로 마더보드 전체를 갈아야한다.

3-1-2번-->위와 같다.

3-1-3번-->위와 같다.

3-1-4번-->위와 같다.

3-2-4번-->키보드 자체의 이상또는 키보드를 제어하는 칩이 이상인 경우이다.

3-3-4번-->컴퓨터가 비디오 카드를 찾지 못하는 경우이다.

3-4-1번--> 비디오 카드에 이상이 있는 경우이다.

3-4-2번--> 위와 같다.

3-4-3번--> 위와 같다.

4-2-1번--> 마더보드에 이상이 있는 경우로 교체가 불가피한 경우가 많다.

4-2-2번--> 먼저 키보드를 점검해보고 이상이 없는 경우는 마더보드문제일 수 있다.

4-2-3번--> 위와 같다.

4-2-4번-->카드중의 하나에 문제가 있는 경우이다 . 각 카드를 하나씩 점검해야한다.

4-3-1번-->마더보드에 이상이 있는 경우가 많다.

4-3-2번--> 위와 같다.

4-3-3번-->타이머 칩중에 결함이 있는 경우이다. 이런 경우 대부분 마더보드를 교체해야 하는 경우가 많다.

4-3-4번-->CMOS를 호출해서 날짜와 시간을 검사해 보아야 한다. 문제가 계속 발생하면 백업 배터리를 교환해야 한다. 전지교환후에도 문제가 계속 발생하면 전원공급장치를 점검해 보고 그래도 계속 이상이 발생되면 마더보드 자체를 교한해야한다.

4-4-1번-->직렬포트에 이상이 있는 경우이다. 이런 경우 입/출력 카드를 다시 꽂아 보아야 한다.

4-4-2번-->병렬포트에 이상이 있는 경우이다. 위의 경우와 마찬가지로 입출력 카드를 다시꽂아 본다.

4-4-3번-->수치 처리 연산자에 문제가 있는 경우이다.AMD 바이오스
1번 --> 램 불량이거나 램끼리 규격이 안맞을때(Dram 리플레시실패)

2번 --> 패리티 체크 실패(Parity라함은 오류를 검출하기위한 여분의정보를 일컫는다.)

3번 --> 기본 64KB(도스영역) 메모리 점검 실패( 메모리 문제)이다. 메모리가 잘못 꽂혔을 수가 있으므로 메모리를 뺀후다시장착한다.문제가 해결되지 않으면 메모리를 다른 정상적인 PC에 바꾸어 장착해 본다. 메모리를 바꿨는데도 해결이 안되면 메모리 소켓의 불량일 확률이 높다. 메인보드를 A/S 받아야 한다.

4번 --> 시스템 타이머 실패 .메인보드 이상에 관련된 부분이다. CMOS 밧데리를 교체하거나 바이오스를 업그레이드 하거나 메인보드를 A/S 받아야 한다

5번 --> 프로세서(CPU) 오류.CPU 관련 에러다. CPU를 빼서 연결상태를 확인해서 다시 꽂아보고 클럭수를 낮추거나 다른 CPU로 교환해서 테스트 해본다.

6번 --> 먼저 소리가 가장 크다는게 특징이다. 키보드컨트롤러/Gate 20 실패. 입력장치 에러다. 키보드 연결을 확인해서 다시 한번 연결해 보고 키보드를 다른것으로 바꾸거나 메인보드의 키보드 커넥터를 교체한다.

7번 --> 가상모드 오류(4번의 비프음과 동일)

8번 --> 비디오 카드 인식 오류.그래픽카드가 정확하게 꽂혀있나 확인하고 VGA카드의 슬롯을 바꾸거나 VGA카드를 다른 것으로 교체해서 작동시켜본다.

9번 --> 롬바이오스 체크 오류. 변경된 바이오스의 내용을 저장하거나 메인보드를 A/S 받아야 한다.

10번 --> CMOS 읽기/쓰기 오류(ROM BIOS CHIP을 바꾸는데 부품만 1만5천원이 든다)

11번 --> 캐시 불량.캐시를 Disable 시켜서 부팅을 시도하거나 캐시를 교체하거나 메인보를A/S받아야 한다. 보통 이런 메시지는 잘안나오는데 캐시를 업그레이드 하고 난후 문제인 것 같다.

어워드 바이오스

1번 짧게 --> 시스템 정상

2번 짧게 --> 시스템 에러(화면상에 나타난 에러메시지를 참고로 해결한다.)

3번 짧게 --> 키보드 에러. 입력장치 에러다. 키보드 연결을 확인해서 다시 한번 연결해 보고 키보드를 다른 것으로 바꾸거나 메인보드의 키보드 커넥터를 교체한다.

1번 길게 1번 짧게 --> 메인보드 에러.메인보드에 장착되어 있는 주변장치들의 케이블연결이나 소켓/슬롯에 장착이 잘못되어 있는 경우에 주로 발생한다. CPU,RAM,VGA...등을 뽑았다가 다시 설치해 본다. 주변장치들이 이상이 없는데도 계속해서 비프음이 울리면 메인보드를 A/S 받아야 한다.

1번 길게 2번 짧게 --> VGA 카드 에러.VGA 카드가 메인보드 슬롯에 제대로 꽂혀 있는지 확인해본다. 뽑았다가 다시 꽂아서 부팅을 해본다.

1번 길게 3번 짧게 --> VGA 카드에러.VGA 카드가 메인보드 슬롯에 제대로 꽂혀 있는지 확인해 본다. 뽑았다가 다시 꽂아서 부팅을 해본다.

연속/반복/없음-->시스템의 주변장치들이 연결에 문제가 있는 경우에 발생한다. 시스템을 모두 분해해서 처음부터 다시 연결해 본다.

피닉스 바이오스

1-1-3번--> CMOS에 이상이 있는 경우이다. 건전지 교환이나 점퍼 셋팅이 잘되었는지 확인한다.

1-1-4번--> 바이오스에 이상이 있는 경우이다. 대부분 바이오스를 교환해야한다.

1-2-1번--> 마더보드에 있는 타이머에 이상이 있는 경우이다.

12-2번--> 마더보드가 불량인 경우이다. 전문 수리점에 A/S를 맡겨야 한다.

1-2-3번--> 마더보드나 메모리가 불량인 경우이다. 메모리가 제대로 꽃혀있는지 혹시나 메모리 불량이 아닌지 확인한다.

1-3-1번-->위와 같다.

1-3-3번-->위와 같다.

1-3-4번-->위와 같다.

1-4-1번-->위와 같다.

1-4-2번-->메모리중 일부가 불량인 경우이다. 업그레이드를 했다면 다른거로 교체해본다.

2-?-?번--> 두 번의 경고음으로 시작하는 것은 모두 메모리 가운데 일부가 불량인 경우이다.

3-1-1번-->마더보드에 있는 칩가운데 일부가 불량인 경우로 마더보드 전체를 갈아야한다.

3-1-2번-->위와 같다.

3-1-3번-->위와 같다.

3-1-4번-->위와 같다.

3-2-4번-->키보드 자체의 이상또는 키보드를 제어하는 칩이 이상인 경우이다.

3-3-4번-->컴퓨터가 비디오 카드를 찾지 못하는 경우이다.

3-4-1번--> 비디오 카드에 이상이 있는 경우이다.

3-4-2번--> 위와 같다.

3-4-3번--> 위와 같다.

4-2-1번--> 마더보드에 이상이 있는 경우로 교체가 불가피한 경우가 많다.

4-2-2번--> 먼저 키보드를 점검해보고 이상이 없는 경우는 마더보드문제일 수 있다.

4-2-3번--> 위와 같다.

4-2-4번-->카드중의 하나에 문제가 있는 경우이다 . 각 카드를 하나씩 점검해야한다.

4-3-1번-->마더보드에 이상이 있는 경우가 많다.

4-3-2번--> 위와 같다.

4-3-3번-->타이머 칩중에 결함이 있는 경우이다. 이런 경우 대부분 마더보드를 교체해야 하는 경우가 많다.

4-3-4번-->CMOS를 호출해서 날짜와 시간을 검사해 보아야 한다. 문제가 계속 발생하면 백업 배터리를 교환해야 한다. 전지교환후에도 문제가 계속 발생하면 전원공급장치를 점검해 보고 그래도 계속 이상이 발생되면 마더보드 자체를 교한해야한다.

4-4-1번-->직렬포트에 이상이 있는 경우이다. 이런 경우 입/출력 카드를 다시 꽂아 보아야 한다.

4-4-2번-->병렬포트에 이상이 있는 경우이다. 위의 경우와 마찬가지로 입출력 카드를 다시꽂아 본다.

4-4-3번-->수치 처리 연산자에 문제가 있는 경우이다.
Posted by 1010
60.Unix2008. 11. 6. 17:20
반응형
Posted by 1010
60.Unix2008. 11. 6. 17:18
반응형
Posted by 1010
60.Unix2008. 11. 6. 17:17
반응형
환경
Tomcat 5.5
JDK 1.6

순서
JDK 1.6을 설치
Tomcat 5.5 설치
JK-Connector 설정

JDK 1.6 설치

1. http://java.sun.com 에서 솔라리스용 jdk 1.6 을 다운로드 받는다.

사용자 삽입 이미지

   32 비트 버전부터 다운 받아야 한다.
 
  #  zcat jdk-6<update>-solaris-sparc.tar.Z | tar -xf -
 
   이전 버전 패키지를 삭제한다.
  
   # pkgrm SUNWj6rt SUNWj6dev SUNWj6cfg SUNWj6man SUNWj6dmo
  
   패키지를 설치한다.
  
 #  pkgadd -d . SUNWj6rt SUNWj6dev SUNWj6cfg SUNWj6man SUNWj6dmo
  
2. 64 비트 버전을 받아 설치한다.

   # zcat jdk-6<update>-solaris-sparcv9.tar.Z | tar -xf -
  
   이전 버전 패키지를 삭제한다.
  
   # pkgrm SUNWj6rtx SUNWj6dvx SUNWj6dmx
  
   패키지를 설치한다.
  
   # pkgadd -d . SUNWj6rtx SUNWj6dvx SUNWj6dmx

Tomcat 5.5 설치
http://tomcat.apache.org 에서 Tomcat5.5를 받는다.

사용자 삽입 이미지

tar 형식으로 된 파일이 tar를 풀면서 에러가 나타났기 때문에
zip 형식으로 된 tomcat 파일을 받는다.

# unzip apache-tomcat-5.5.25.zip
압축을 풀면 디렉토리가 생긴다.
이 디렉토리를 옮긴다.
# mv ./apache-tomcat-5.5.25 /usr/local/tomcat5

아래 파일에 아래 내용을 추가한다.
# vi /etc/profile
export JAVA_HOME="/usr/jdk/jdk1.6.0_03/"
CLASSPATH=".:/usr/jdk/jdk1.6.0_03/lib/tools.jar"
export CLASSPATH
CATALINA_HOME=/usr/local/tomcat5
PATH=$PATH:$CATLINA_HOME/bin
export CATALINA_HOME
# source /etc/profile
위 명령어를 실행 시키면 적용된다.

zip 으로 압축을 푼 파일은 파일 권한에 실행 권한이 없다.
그러므로 실행권한을 준다.
디렉토리 변경후
# cd /usr/local/tomcat5/bin/
# chmod 755 ./*


# /usr/local/tomcat5/bin/startup.sh
Using CATALINA_BASE:   /usr/local/tomcat5
Using CATALINA_HOME:   /usr/local/tomcat5
Using CATALINA_TMPDIR: /usr/local/tomcat5/temp
Using JRE_HOME:       /usr/jdk/jdk1.6.0_03/

설치 확인
http://localhost:8080/
사용자 삽입 이미지


JK-Connector를 솔라리스용으로 컴파일된 걸 받는다.
http://tomcat.apache.org
이 곳에서 받을 수 있다.
사용자 삽입 이미지

이 파일을 이 위치에 둔다.

/usr/local/apache2/modules/mod_jk.so

/usr/local/tomcat5/conf/server.xml
에 아래 내용을 추가한다.
참고로 defaultHost 를 꼭 바꿔준다. localhost 로 두면 외부에서 확인 불가능이다.
<Engine name="Catalina" defaultHost="203.249.108.164"> <== 보통 요녀석 밑에 추가한다.
        <Listener
className="org.apache.jk.config.ApacheConfig" modJk="/usr/local/apache2/modules/mod_jk.so" />
        <Listener className="org.apache.jk.config.ApacheConfig" append="true" forwardAll="true" modJk="/usr/local/apache2/modules/mod_jk.so" />



/etc/apache2/httpd.conf 에 아래 내용을 추가한다.
Include "/usr/local/tomcat5/conf/auto/mod_jk.conf"
Posted by 1010