'분류 전체보기'에 해당되는 글 2491건
- 2008.08.25 FCKeditor java 버전 설치
- 2008.08.20 www.eclipse-plugins.info
- 2008.08.20 자바 Security 알고리즘 보기 1
- 2008.08.20 서버이전시 생긴 문제!!! <<org.apache.jasper.JasperException: Unable to compile class for JSP>>
- 2008.08.20 자바에러메세지정리
- 2008.08.19 아파치 로그분석툴 awstats 설치/활용 가이드 1
- 2008.08.19 보안서버구축 의무화...구축방법...
- 2008.08.19 java에서 properties 활용 가이드 라인
- 2008.08.19 파일이 어떤 포맷인지 알아볼때..
- 2008.08.19 Java 맵 컬렉션 클래스의 소개
- 2008.08.19 파일 다운로드 관련 팁
- 2008.08.19 DBUtils에서 Clob 사용하기
- 2008.08.19 POI의 HSLF를 이용하여 PowerPoint 문서를 읽어보자
- 2008.08.19 POI의 HWPF를 이용하여 MS WORD문서를 읽어보자
- 2008.08.19 Validator 속성들
- 2008.08.19 Commons-Fileupload 1.2
- 2008.08.19 DBUtils에서 number 타입의 컬럼이 int형으로 안넘어올때..
- 2008.08.19 Installing Tomcat with commons-daemon (jsvc)
- 2008.08.19 Commons DbUtils 몇가지 예제
- 2008.08.19 Jakarta Commons Net 에서 FTP 사용시 목록이 안보일 경우
- 2008.08.19 POI로 엑셀파일 읽을때, Invalid header signature 에러
- 2008.08.19 JSP에서 원하는 Appender 선택하여 쓰기
- 2008.08.19 Jakarta Commons Email
- 2008.08.19 Jakarta POI IV탄 이미지편
- 2008.08.19 Jakarta Ant II탄 상세편
- 2008.08.19 Apache Lucene "데모 실행 및 분석"편 1
- 2008.08.19 Jakarta Ant I탄 기본편
- 2008.08.19 Commons-net I탄 FTP
- 2008.08.19 Commons-lang IV탄 ToStringBuilder
- 2008.08.19 Commons-digester I탄 기본편
Plugin categories
All (1565)
만약 내가 특정 알고리즘으로 파일을 인코딩하고, 디코딩하며 보안을 철저히 하고 싶을때..
또는 통신 알고리즘상에서 스푸핑을 방지하고 싶을때..
또는 DB 설정파일을 보안화하고 싶을때..
그냥 자바를 보면 답이 나온다.
import java.util.Iterator; public class PrintProviders { for (Iterator iter = providers[i].keySet().iterator(); iter System.out.println("-------------------------------------"); } |
자바에서는 Security 알고리즘이 무상하게 제공되고 있다.
위의 소스의 결과를 볼까?
------------------------------------- name: SUN info: SUN (DSA key/parameter generation; DSA signing; SHA-1, MD5 digests; SecureRandom; X.509 certificates; JKS keystore; PKIX CertPathValidator; PKIX CertPathBuilder; LDAP, Collection CertStores, JavaPolicy Policy; JavaLoginConfig Configuration) version: 1.6 Alg.Alias.Signature.SHA1/DSA SHA1withDSA Alg.Alias.Signature.1.2.840.10040.4.3 SHA1withDSA Alg.Alias.Signature.DSS SHA1withDSA SecureRandom.SHA1PRNG ImplementedIn Software KeyStore.JKS sun.security.provider.JavaKeyStore$JKS Alg.Alias.MessageDigest.SHA-1 SHA MessageDigest.SHA sun.security.provider.SHA KeyStore.CaseExactJKS sun.security.provider.JavaKeyStore$CaseExactJKS CertStore.com.sun.security.IndexedCollection ImplementedIn Software Alg.Alias.Signature.DSA SHA1withDSA KeyFactory.DSA ImplementedIn Software KeyStore.JKS ImplementedIn Software AlgorithmParameters.DSA ImplementedIn Software Signature.NONEwithDSA sun.security.provider.DSA$RawDSA Alg.Alias.CertificateFactory.X509 X.509 CertStore.com.sun.security.IndexedCollection sun.security.provider.certpath.IndexedCollectionCertStore Provider.id className sun.security.provider.Sun Alg.Alias.Signature.SHA-1/DSA SHA1withDSA CertificateFactory.X.509 ImplementedIn Software Signature.SHA1withDSA KeySize 1024 KeyFactory.DSA sun.security.provider.DSAKeyFactory CertPathValidator.PKIX ImplementedIn Software Configuration.JavaLoginConfig sun.security.provider.ConfigSpiFile Alg.Alias.Signature.OID.1.2.840.10040.4.3 SHA1withDSA Alg.Alias.KeyFactory.1.2.840.10040.4.1 DSA MessageDigest.MD5 ImplementedIn Software Alg.Alias.Signature.RawDSA NONEwithDSA Provider.id name SUN Alg.Alias.AlgorithmParameters.1.2.840.10040.4.1 DSA CertPathBuilder.PKIX ValidationAlgorithm RFC3280 Policy.JavaPolicy sun.security.provider.PolicySpiFile Alg.Alias.AlgorithmParameters.1.3.14.3.2.12 DSA Alg.Alias.Signature.SHA/DSA SHA1withDSA Alg.Alias.KeyPairGenerator.1.3.14.3.2.12 DSA MessageDigest.SHA-384 sun.security.provider.SHA5$SHA384 Signature.SHA1withDSA ImplementedIn Software AlgorithmParameterGenerator.DSA sun.security.provider.DSAParameterGenerator Signature.NONEwithDSA SupportedKeyClasses java.security.interfaces.DSAPublicKey|java.security.interfaces.DSAPrivateKey MessageDigest.SHA-512 sun.security.provider.SHA5$SHA512 CertPathBuilder.PKIX sun.security.provider.certpath.SunCertPathBuilder Alg.Alias.Signature.1.3.14.3.2.27 SHA1withDSA CertPathBuilder.PKIX ImplementedIn Software Provider.id version 1.6 AlgorithmParameters.DSA sun.security.provider.DSAParameters Signature.SHA1withDSA SupportedKeyClasses java.security.interfaces.DSAPublicKey|java.security.interfaces.DSAPrivateKey CertStore.Collection sun.security.provider.certpath.CollectionCertStore AlgorithmParameterGenerator.DSA ImplementedIn Software KeyPairGenerator.DSA KeySize 1024 CertStore.LDAP sun.security.provider.certpath.LDAPCertStore CertificateFactory.X.509 sun.security.provider.X509Factory CertStore.LDAP LDAPSchema RFC2587 CertStore.LDAP ImplementedIn Software KeyPairGenerator.DSA ImplementedIn Software CertPathValidator.PKIX ValidationAlgorithm RFC3280 CertStore.Collection ImplementedIn Software Alg.Alias.Signature.1.3.14.3.2.13 SHA1withDSA CertPathValidator.PKIX sun.security.provider.certpath.PKIXCertPathValidator Alg.Alias.MessageDigest.SHA1 SHA AlgorithmParameterGenerator.DSA KeySize 1024 SecureRandom.SHA1PRNG sun.security.provider.SecureRandom Signature.SHA1withDSA sun.security.provider.DSA$SHA1withDSA Alg.Alias.KeyFactory.1.3.14.3.2.12 DSA KeyPairGenerator.DSA sun.security.provider.DSAKeyPairGenerator MessageDigest.SHA ImplementedIn Software Provider.id info SUN (DSA key/parameter generation; DSA signing; SHA-1, MD5 digests; SecureRandom; X.509 certificates; JKS keystore; PKIX CertPathValidator; PKIX CertPathBuilder; LDAP, Collection CertStores, JavaPolicy Policy; JavaLoginConfig Configuration) Alg.Alias.KeyPairGenerator.1.2.840.10040.4.1 DSA Alg.Alias.Signature.SHAwithDSA SHA1withDSA MessageDigest.MD5 sun.security.provider.MD5 Alg.Alias.Signature.DSAWithSHA1 SHA1withDSA MessageDigest.SHA-256 sun.security.provider.SHA2 Alg.Alias.KeyPairGenerator.OID.1.2.840.10040.4.1 DSA MessageDigest.MD2 sun.security.provider.MD2 ------------------------------------- ------------------------------------- name: SunRsaSign info: Sun RSA signature provider version: 1.5 Alg.Alias.Signature.OID.1.2.840.113549.1.1.4 MD5withRSA Alg.Alias.Signature.OID.1.2.840.113549.1.1.2 MD2withRSA Alg.Alias.KeyFactory.1.2.840.113549.1.1 RSA Signature.SHA512withRSA SupportedKeyClasses java.security.interfaces.RSAPublicKey|java.security.interfaces.RSAPrivateKey Provider.id version 1.5 Signature.MD5withRSA SupportedKeyClasses java.security.interfaces.RSAPublicKey|java.security.interfaces.RSAPrivateKey Alg.Alias.Signature.1.2.840.113549.1.1.13 SHA512withRSA KeyPairGenerator.RSA sun.security.rsa.RSAKeyPairGenerator Alg.Alias.Signature.1.2.840.113549.1.1.12 SHA384withRSA Alg.Alias.Signature.1.2.840.113549.1.1.11 SHA256withRSA KeyFactory.RSA sun.security.rsa.RSAKeyFactory Alg.Alias.Signature.1.3.14.3.2.29 SHA1withRSA Alg.Alias.KeyPairGenerator.OID.1.2.840.113549.1.1 RSA Signature.MD2withRSA sun.security.rsa.RSASignature$MD2withRSA Signature.SHA384withRSA sun.security.rsa.RSASignature$SHA384withRSA Signature.MD5withRSA sun.security.rsa.RSASignature$MD5withRSA Provider.id info Sun RSA signature provider Signature.SHA1withRSA SupportedKeyClasses java.security.interfaces.RSAPublicKey|java.security.interfaces.RSAPrivateKey Signature.SHA1withRSA sun.security.rsa.RSASignature$SHA1withRSA Alg.Alias.Signature.1.2.840.113549.1.1.5 SHA1withRSA Signature.SHA256withRSA sun.security.rsa.RSASignature$SHA256withRSA Alg.Alias.Signature.1.2.840.113549.1.1.4 MD5withRSA Provider.id className sun.security.rsa.SunRsaSign Alg.Alias.Signature.OID.1.2.840.113549.1.1.13 SHA512withRSA Alg.Alias.Signature.OID.1.2.840.113549.1.1.12 SHA384withRSA Alg.Alias.Signature.1.2.840.113549.1.1.2 MD2withRSA Alg.Alias.Signature.OID.1.2.840.113549.1.1.11 SHA256withRSA Signature.MD2withRSA SupportedKeyClasses java.security.interfaces.RSAPublicKey|java.security.interfaces.RSAPrivateKey Provider.id name SunRsaSign Alg.Alias.KeyFactory.OID.1.2.840.113549.1.1 RSA Signature.SHA384withRSA SupportedKeyClasses java.security.interfaces.RSAPublicKey|java.security.interfaces.RSAPrivateKey Signature.SHA512withRSA sun.security.rsa.RSASignature$SHA512withRSA Signature.SHA256withRSA SupportedKeyClasses java.security.interfaces.RSAPublicKey|java.security.interfaces.RSAPrivateKey Alg.Alias.Signature.OID.1.2.840.113549.1.1.5 SHA1withRSA Alg.Alias.KeyPairGenerator.1.2.840.113549.1.1 RSA ------------------------------------- ------------------------------------- name: SunJSSE info: Sun JSSE provider(PKCS12, SunX509 key/trust factories, SSLv3, TLSv1) version: 1.6 Alg.Alias.Signature.OID.1.2.840.113549.1.1.4 MD5withRSA Alg.Alias.KeyFactory.1.2.840.113549.1.1 RSA Alg.Alias.Signature.OID.1.2.840.113549.1.1.2 MD2withRSA SSLContext.Default com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl Provider.id version 1.6 TrustManagerFactory.SunX509 com.sun.net.ssl.internal.ssl.TrustManagerFactoryImpl$SimpleFactory KeyManagerFactory.NewSunX509 com.sun.net.ssl.internal.ssl.KeyManagerFactoryImpl$X509 KeyPairGenerator.RSA sun.security.rsa.RSAKeyPairGenerator KeyStore.PKCS12 com.sun.net.ssl.internal.pkcs12.PKCS12KeyStore SSLContext.SSLv3 com.sun.net.ssl.internal.ssl.SSLContextImpl KeyFactory.RSA sun.security.rsa.RSAKeyFactory Alg.Alias.Signature.1.3.14.3.2.29 SHA1withRSA Alg.Alias.TrustManagerFactory.X509 PKIX Alg.Alias.KeyPairGenerator.OID.1.2.840.113549.1.1 RSA Signature.MD5andSHA1withRSA com.sun.net.ssl.internal.ssl.RSASignature Signature.MD2withRSA sun.security.rsa.RSASignature$MD2withRSA Signature.MD5withRSA sun.security.rsa.RSASignature$MD5withRSA Provider.id info Sun JSSE provider(PKCS12, SunX509 key/trust factories, SSLv3, TLSv1) Signature.SHA1withRSA sun.security.rsa.RSASignature$SHA1withRSA Alg.Alias.Signature.1.2.840.113549.1.1.5 SHA1withRSA Alg.Alias.Signature.1.2.840.113549.1.1.4 MD5withRSA Provider.id className com.sun.net.ssl.internal.ssl.Provider Alg.Alias.Signature.OID.1.3.14.3.2.29 SHA1withRSA Alg.Alias.Signature.1.2.840.113549.1.1.2 MD2withRSA Provider.id name SunJSSE SSLContext.SSL com.sun.net.ssl.internal.ssl.SSLContextImpl SSLContext.TLS com.sun.net.ssl.internal.ssl.SSLContextImpl TrustManagerFactory.PKIX com.sun.net.ssl.internal.ssl.TrustManagerFactoryImpl$PKIXFactory SSLContext.TLSv1 com.sun.net.ssl.internal.ssl.SSLContextImpl Alg.Alias.KeyFactory.OID.1.2.840.113549.1.1 RSA KeyManagerFactory.SunX509 com.sun.net.ssl.internal.ssl.KeyManagerFactoryImpl$SunX509 Alg.Alias.TrustManagerFactory.SunPKIX PKIX Alg.Alias.TrustManagerFactory.X.509 PKIX Alg.Alias.Signature.OID.1.2.840.113549.1.1.5 SHA1withRSA Alg.Alias.KeyPairGenerator.1.2.840.113549.1.1 RSA ------------------------------------- ------------------------------------- name: SunJCE info: SunJCE Provider (implements RSA, DES, Triple DES, AES, Blowfish, ARCFOUR, RC2, PBE, Diffie-Hellman, HMAC) version: 1.6 Cipher.Blowfish SupportedKeyFormats RAW AlgorithmParameters.DESede com.sun.crypto.provider.DESedeParameters AlgorithmParameters.DES com.sun.crypto.provider.DESParameters Cipher.DES SupportedPaddings NOPADDING|PKCS5PADDING|ISO10126PADDING AlgorithmParameters.Blowfish com.sun.crypto.provider.BlowfishParameters Cipher.DESedeWrap SupportedKeyFormats RAW Alg.Alias.KeyAgreement.1.2.840.113549.1.3.1 DiffieHellman AlgorithmParameterGenerator.DiffieHellman com.sun.crypto.provider.DHParameterGenerator Cipher.RSA SupportedPaddings NOPADDING|PKCS1PADDING|OAEPWITHMD5ANDMGF1PADDING|OAEPWITHSHA1ANDMGF1PADDING|OAEPWITHSHA-1ANDMGF1PADDING|OAEPWITHSHA-256ANDMGF1PADDING|OAEPWITHSHA-384ANDMGF1PADDING|OAEPWITHSHA-512ANDMGF1PADDING Alg.Alias.Cipher.TripleDES DESede Cipher.ARCFOUR SupportedModes ECB Mac.SslMacSHA1 SupportedKeyFormats RAW KeyGenerator.DES com.sun.crypto.provider.DESKeyGenerator Provider.id version 1.6 KeyGenerator.DESede com.sun.crypto.provider.DESedeKeyGenerator Alg.Alias.SecretKeyFactory.PBE PBEWithMD5AndDES Alg.Alias.KeyFactory.1.2.840.113549.1.3.1 DiffieHellman Mac.HmacSHA1 com.sun.crypto.provider.HmacSHA1 Cipher.PBEWithMD5AndDES com.sun.crypto.provider.PBEWithMD5AndDESCipher Cipher.AES SupportedModes ECB|CBC|PCBC|CTR|CTS|CFB|OFB|CFB8|CFB16|CFB24|CFB32|CFB40|CFB48|CFB56|CFB64|OFB8|OFB16|OFB24|OFB32|OFB40|OFB48|OFB56|OFB64|CFB72|CFB80|CFB88|CFB96|CFB104|CFB112|CFB120|CFB128|OFB72|OFB80|OFB88|OFB96|OFB104|OFB112|OFB120|OFB128 Cipher.AESWrap SupportedModes ECB SecretKeyFactory.DESede com.sun.crypto.provider.DESedeKeyFactory KeyGenerator.SunTlsKeyMaterial com.sun.crypto.provider.TlsKeyMaterialGenerator AlgorithmParameters.OAEP com.sun.crypto.provider.OAEPParameters Cipher.AES SupportedKeyFormats RAW AlgorithmParameters.RC2 com.sun.crypto.provider.RC2Parameters AlgorithmParameters.PBE com.sun.crypto.provider.PBEParameters Alg.Alias.KeyPairGenerator.DH DiffieHellman Alg.Alias.KeyAgreement.OID.1.2.840.113549.1.3.1 DiffieHellman Cipher.AES com.sun.crypto.provider.AESCipher KeyGenerator.RC2 com.sun.crypto.provider.KeyGeneratorCore$RC2KeyGenerator Mac.HmacSHA512 com.sun.crypto.provider.HmacCore$HmacSHA512 Provider.id info SunJCE Provider (implements RSA, DES, Triple DES, AES, Blowfish, ARCFOUR, RC2, PBE, Diffie-Hellman, HMAC) Cipher.AES SupportedPaddings NOPADDING|PKCS5PADDING|ISO10126PADDING Alg.Alias.AlgorithmParameters.OID.1.2.840.113549.1.12.1.6 PBEWithSHA1AndRC2_40 Cipher.Blowfish SupportedPaddings NOPADDING|PKCS5PADDING|ISO10126PADDING Alg.Alias.AlgorithmParameters.OID.1.2.840.113549.1.12.1.3 PBEWithSHA1AndDESede KeyStore.JCEKS com.sun.crypto.provider.JceKeyStore Cipher.Blowfish SupportedModes ECB|CBC|PCBC|CTR|CTS|CFB|OFB|CFB8|CFB16|CFB24|CFB32|CFB40|CFB48|CFB56|CFB64|OFB8|OFB16|OFB24|OFB32|OFB40|OFB48|OFB56|OFB64 Alg.Alias.SecretKeyFactory.1.2.840.113549.1.5.12 PBKDF2WithHmacSHA1 Mac.HmacSHA384 SupportedKeyFormats RAW Cipher.DESedeWrap com.sun.crypto.provider.DESedeWrapCipher Cipher.ARCFOUR SupportedPaddings NOPADDING Alg.Alias.KeyPairGenerator.1.2.840.113549.1.3.1 DiffieHellman Cipher.PBEWithMD5AndTripleDES com.sun.crypto.provider.PBEWithMD5AndTripleDESCipher Alg.Alias.Cipher.1.2.840.113549.1.12.1.6 PBEWithSHA1AndRC2_40 Alg.Alias.Cipher.1.2.840.113549.1.12.1.3 PBEWithSHA1AndDESede Mac.HmacSHA256 SupportedKeyFormats RAW Alg.Alias.AlgorithmParameterGenerator.1.2.840.113549.1.3.1 DiffieHellman Cipher.PBEWithSHA1AndDESede com.sun.crypto.provider.PKCS12PBECipherCore$PBEWithSHA1AndDESede SecretKeyFactory.PBEWithMD5AndDES com.sun.crypto.provider.PBEKeyFactory$PBEWithMD5AndDES KeyPairGenerator.DiffieHellman com.sun.crypto.provider.DHKeyPairGenerator Cipher.RC2 SupportedModes ECB|CBC|PCBC|CTR|CTS|CFB|OFB|CFB8|CFB16|CFB24|CFB32|CFB40|CFB48|CFB56|CFB64|OFB8|OFB16|OFB24|OFB32|OFB40|OFB48|OFB56|OFB64 Alg.Alias.AlgorithmParameters.Rijndael AES KeyAgreement.DiffieHellman SupportedKeyClasses javax.crypto.interfaces.DHPublicKey|javax.crypto.interfaces.DHPrivateKey Mac.HmacMD5 SupportedKeyFormats RAW KeyGenerator.SunTlsRsaPremasterSecret com.sun.crypto.provider.TlsRsaPremasterSecretGenerator Cipher.AESWrap SupportedKeyFormats RAW SecretKeyFactory.DES com.sun.crypto.provider.DESKeyFactory Cipher.AESWrap SupportedPaddings NOPADDING Provider.id name SunJCE KeyGenerator.HmacSHA512 com.sun.crypto.provider.KeyGeneratorCore$HmacSHA512KG Mac.HmacSHA256 com.sun.crypto.provider.HmacCore$HmacSHA256 Cipher.ARCFOUR SupportedKeyFormats RAW Cipher.DES SupportedModes ECB|CBC|PCBC|CTR|CTS|CFB|OFB|CFB8|CFB16|CFB24|CFB32|CFB40|CFB48|CFB56|CFB64|OFB8|OFB16|OFB24|OFB32|OFB40|OFB48|OFB56|OFB64 Cipher.RSA SupportedKeyClasses java.security.interfaces.RSAPublicKey|java.security.interfaces.RSAPrivateKey SecretKeyFactory.PBEWithMD5AndTripleDES com.sun.crypto.provider.PBEKeyFactory$PBEWithMD5AndTripleDES Cipher.PBEWithSHA1AndRC2_40 com.sun.crypto.provider.PKCS12PBECipherCore$PBEWithSHA1AndRC2_40 AlgorithmParameters.DiffieHellman com.sun.crypto.provider.DHParameters Mac.HmacMD5 com.sun.crypto.provider.HmacMD5 Cipher.RSA com.sun.crypto.provider.RSACipher Mac.SslMacMD5 com.sun.crypto.provider.SslMacCore$SslMacMD5 Alg.Alias.AlgorithmParameters.OID.1.2.840.113549.1.5.3 PBEWithMD5AndDES Cipher.DESede SupportedPaddings NOPADDING|PKCS5PADDING|ISO10126PADDING Alg.Alias.AlgorithmParameterGenerator.OID.1.2.840.113549.1.3.1 DiffieHellman Cipher.DESede com.sun.crypto.provider.DESedeCipher Alg.Alias.AlgorithmParameters.OID.1.2.840.113549.1.3.1 DiffieHellman Alg.Alias.AlgorithmParameters.1.2.840.113549.1.5.3 PBEWithMD5AndDES Mac.HmacSHA512 SupportedKeyFormats RAW Mac.HmacPBESHA1 SupportedKeyFormats RAW Alg.Alias.AlgorithmParameterGenerator.DH DiffieHellman Cipher.DESedeWrap SupportedPaddings NOPADDING Alg.Alias.SecretKeyFactory.OID.1.2.840.113549.1.5.12 PBKDF2WithHmacSHA1 Alg.Alias.AlgorithmParameters.1.2.840.113549.1.3.1 DiffieHellman Mac.HmacPBESHA1 com.sun.crypto.provider.HmacPKCS12PBESHA1 Cipher.DES SupportedKeyFormats RAW AlgorithmParameters.PBEWithMD5AndTripleDES com.sun.crypto.provider.PBEParameters Cipher.DESedeWrap SupportedModes CBC Alg.Alias.KeyFactory.OID.1.2.840.113549.1.3.1 DiffieHellman Alg.Alias.Cipher.OID.1.2.840.113549.1.5.3 PBEWithMD5AndDES AlgorithmParameters.AES com.sun.crypto.provider.AESParameters Alg.Alias.AlgorithmParameters.TripleDES DESede Alg.Alias.SecretKeyFactory.TripleDES DESede KeyGenerator.HmacSHA256 com.sun.crypto.provider.KeyGeneratorCore$HmacSHA256KG Alg.Alias.KeyGenerator.TripleDES DESede Alg.Alias.AlgorithmParameters.DH DiffieHellman KeyGenerator.AES com.sun.crypto.provider.AESKeyGenerator Cipher.RC2 SupportedPaddings NOPADDING|PKCS5PADDING|ISO10126PADDING Alg.Alias.Cipher.RC4 ARCFOUR Alg.Alias.KeyPairGenerator.OID.1.2.840.113549.1.3.1 DiffieHellman Mac.HmacSHA384 com.sun.crypto.provider.HmacCore$HmacSHA384 SecretKeyFactory.PBKDF2WithHmacSHA1 com.sun.crypto.provider.PBKDF2HmacSHA1Factory Provider.id className com.sun.crypto.provider.SunJCE Cipher.DES com.sun.crypto.provider.DESCipher Cipher.Blowfish com.sun.crypto.provider.BlowfishCipher KeyGenerator.SunTlsMasterSecret com.sun.crypto.provider.TlsMasterSecretGenerator KeyGenerator.HmacSHA1 com.sun.crypto.provider.HmacSHA1KeyGenerator Alg.Alias.SecretKeyFactory.1.2.840.113549.1.5.3 PBEWithMD5AndDES KeyGenerator.SunTlsPrf com.sun.crypto.provider.TlsPrfGenerator SecretKeyFactory.PBEWithSHA1AndDESede com.sun.crypto.provider.PBEKeyFactory$PBEWithSHA1AndDESede KeyGenerator.ARCFOUR com.sun.crypto.provider.KeyGeneratorCore$ARCFOURKeyGenerator Alg.Alias.KeyAgreement.DH DiffieHellman Alg.Alias.KeyGenerator.Rijndael AES AlgorithmParameters.PBEWithSHA1AndDESede com.sun.crypto.provider.PBEParameters Alg.Alias.KeyGenerator.RC4 ARCFOUR Alg.Alias.Cipher.OID.1.2.840.113549.1.12.1.6 PBEWithSHA1AndRC2_40 Alg.Alias.Cipher.OID.1.2.840.113549.1.12.1.3 PBEWithSHA1AndDESede Mac.SslMacMD5 SupportedKeyFormats RAW Mac.HmacSHA1 SupportedKeyFormats RAW Cipher.DESede SupportedKeyFormats RAW Cipher.RC2 com.sun.crypto.provider.RC2Cipher SecretKeyFactory.PBEWithSHA1AndRC2_40 com.sun.crypto.provider.PBEKeyFactory$PBEWithSHA1AndRC2_40 KeyGenerator.HmacMD5 com.sun.crypto.provider.HmacMD5KeyGenerator AlgorithmParameters.PBEWithSHA1AndRC2_40 com.sun.crypto.provider.PBEParameters KeyGenerator.HmacSHA384 com.sun.crypto.provider.KeyGeneratorCore$HmacSHA384KG Alg.Alias.AlgorithmParameters.1.2.840.113549.1.12.1.6 PBEWithSHA1AndRC2_40 KeyFactory.DiffieHellman com.sun.crypto.provider.DHKeyFactory Alg.Alias.AlgorithmParameters.1.2.840.113549.1.12.1.3 PBEWithSHA1AndDESede AlgorithmParameters.PBEWithMD5AndDES com.sun.crypto.provider.PBEParameters Alg.Alias.SecretKeyFactory.1.2.840.113549.1.12.1.6 PBEWithSHA1AndRC2_40 Alg.Alias.SecretKeyFactory.1.2.840.113549.1.12.1.3 PBEWithSHA1AndDESede Cipher.AESWrap com.sun.crypto.provider.AESWrapCipher Alg.Alias.SecretKeyFactory.OID.1.2.840.113549.1.5.3 PBEWithMD5AndDES Alg.Alias.Cipher.Rijndael AES Cipher.RSA SupportedModes ECB Cipher.DESede SupportedModes ECB|CBC|PCBC|CTR|CTS|CFB|OFB|CFB8|CFB16|CFB24|CFB32|CFB40|CFB48|CFB56|CFB64|OFB8|OFB16|OFB24|OFB32|OFB40|OFB48|OFB56|OFB64 Alg.Alias.SecretKeyFactory.OID.1.2.840.113549.1.12.1.6 PBEWithSHA1AndRC2_40 Alg.Alias.SecretKeyFactory.OID.1.2.840.113549.1.12.1.3 PBEWithSHA1AndDESede Cipher.ARCFOUR com.sun.crypto.provider.ARCFOURCipher Alg.Alias.Cipher.1.2.840.113549.1.5.3 PBEWithMD5AndDES Mac.SslMacSHA1 com.sun.crypto.provider.SslMacCore$SslMacSHA1 KeyAgreement.DiffieHellman com.sun.crypto.provider.DHKeyAgreement Cipher.RC2 SupportedKeyFormats RAW Alg.Alias.KeyFactory.DH DiffieHellman KeyGenerator.Blowfish com.sun.crypto.provider.BlowfishKeyGenerator ------------------------------------- ------------------------------------- name: SunJGSS info: Sun (Kerberos v5, SPNEGO) version: 1.0 GssApiMechanism.1.3.6.1.5.5.2 sun.security.jgss.spnego.SpNegoMechFactory Provider.id info Sun (Kerberos v5, SPNEGO) Provider.id className sun.security.jgss.SunProvider Provider.id version 1.0 GssApiMechanism.1.2.840.113554.1.2.2 sun.security.jgss.krb5.Krb5MechFactory Provider.id name SunJGSS ------------------------------------- ------------------------------------- name: SunSASL info: Sun SASL provider(implements client mechanisms for: DIGEST-MD5, GSSAPI, EXTERNAL, PLAIN, CRAM-MD5; server mechanisms for: DIGEST-MD5, GSSAPI, CRAM-MD5) version: 1.5 Provider.id className com.sun.security.sasl.Provider SaslClientFactory.CRAM-MD5 com.sun.security.sasl.ClientFactoryImpl Provider.id version 1.5 SaslClientFactory.EXTERNAL com.sun.security.sasl.ClientFactoryImpl SaslClientFactory.DIGEST-MD5 com.sun.security.sasl.digest.FactoryImpl SaslClientFactory.PLAIN com.sun.security.sasl.ClientFactoryImpl Provider.id name SunSASL SaslClientFactory.GSSAPI com.sun.security.sasl.gsskerb.FactoryImpl SaslServerFactory.DIGEST-MD5 com.sun.security.sasl.digest.FactoryImpl SaslServerFactory.CRAM-MD5 com.sun.security.sasl.ServerFactoryImpl SaslServerFactory.GSSAPI com.sun.security.sasl.gsskerb.FactoryImpl Provider.id info Sun SASL provider(implements client mechanisms for: DIGEST-MD5, GSSAPI, EXTERNAL, PLAIN, CRAM-MD5; server mechanisms for: DIGEST-MD5, GSSAPI, CRAM-MD5) ------------------------------------- ------------------------------------- name: XMLDSig info: XMLDSig (DOM XMLSignatureFactory; DOM KeyInfoFactory) version: 1.0 Alg.Alias.TransformService.XPATH http://www.w3.org/TR/1999/REC-xpath-19991116 TransformService.http://www.w3.org/TR/1999/REC-xslt-19991116 MechanismType DOM Provider.id version 1.0 Alg.Alias.TransformService.INCLUSIVE http://www.w3.org/TR/2001/REC-xml-c14n-20010315 TransformService.http://www.w3.org/2000/09/xmldsig#base64 MechanismType DOM Alg.Alias.TransformService.EXCLUSIVE http://www.w3.org/2001/10/xml-exc-c14n# KeyInfoFactory.DOM org.jcp.xml.dsig.internal.dom.DOMKeyInfoFactory TransformService.http://www.w3.org/2001/10/xml-exc-c14n#WithComments org.jcp.xml.dsig.internal.dom.DOMExcC14NMethod Alg.Alias.TransformService.INCLUSIVE_WITH_COMMENTS http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments TransformService.http://www.w3.org/2002/06/xmldsig-filter2 MechanismType DOM TransformService.http://www.w3.org/TR/1999/REC-xpath-19991116 MechanismType DOM TransformService.http://www.w3.org/2001/10/xml-exc-c14n# org.jcp.xml.dsig.internal.dom.DOMExcC14NMethod XMLSignatureFactory.DOM org.jcp.xml.dsig.internal.dom.DOMXMLSignatureFactory Alg.Alias.TransformService.XPATH2 http://www.w3.org/2002/06/xmldsig-filter2 TransformService.http://www.w3.org/2001/10/xml-exc-c14n# MechanismType DOM TransformService.http://www.w3.org/2001/10/xml-exc-c14n#WithComments MechanismType DOM TransformService.http://www.w3.org/TR/1999/REC-xslt-19991116 org.jcp.xml.dsig.internal.dom.DOMXSLTTransform TransformService.http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments org.jcp.xml.dsig.internal.dom.DOMCanonicalXMLC14NMethod Alg.Alias.TransformService.BASE64 http://www.w3.org/2000/09/xmldsig#base64 Alg.Alias.TransformService.ENVELOPED http://www.w3.org/2000/09/xmldsig#enveloped-signature Provider.id info XMLDSig (DOM XMLSignatureFactory; DOM KeyInfoFactory) TransformService.http://www.w3.org/TR/2001/REC-xml-c14n-20010315 org.jcp.xml.dsig.internal.dom.DOMCanonicalXMLC14NMethod Provider.id className org.jcp.xml.dsig.internal.dom.XMLDSigRI Alg.Alias.TransformService.EXCLUSIVE_WITH_COMMENTS http://www.w3.org/2001/10/xml-exc-c14n#WithComments TransformService.http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments MechanismType DOM TransformService.http://www.w3.org/2002/06/xmldsig-filter2 org.jcp.xml.dsig.internal.dom.DOMXPathFilter2Transform TransformService.http://www.w3.org/2000/09/xmldsig#enveloped-signature org.jcp.xml.dsig.internal.dom.DOMEnvelopedTransform Provider.id name XMLDSig TransformService.http://www.w3.org/2000/09/xmldsig#base64 org.jcp.xml.dsig.internal.dom.DOMBase64Transform TransformService.http://www.w3.org/TR/1999/REC-xpath-19991116 org.jcp.xml.dsig.internal.dom.DOMXPathTransform TransformService.http://www.w3.org/TR/2001/REC-xml-c14n-20010315 MechanismType DOM Alg.Alias.TransformService.XSLT http://www.w3.org/TR/1999/REC-xslt-19991116 TransformService.http://www.w3.org/2000/09/xmldsig#enveloped-signature MechanismType DOM ------------------------------------- ------------------------------------- name: SunPCSC info: Sun PC/SC provider version: 1.6 Provider.id info Sun PC/SC provider Provider.id className sun.security.smartcardio.SunPCSC Provider.id version 1.6 Provider.id name SunPCSC TerminalFactory.PC/SC sun.security.smartcardio.SunPCSC$Factory ------------------------------------- ------------------------------------- name: SunMSCAPI info: Sun's Microsoft Crypto API provider version: 1.6 SecureRandom.Windows-PRNG sun.security.mscapi.PRNG Provider.id version 1.6 Cipher.RSA/ECB/PKCS1Padding sun.security.mscapi.RSACipher Signature.MD5withRSA SupportedKeyClasses sun.security.mscapi.Key KeyPairGenerator.RSA sun.security.mscapi.RSAKeyPairGenerator KeyStore.Windows-ROOT sun.security.mscapi.KeyStore$ROOT Signature.NONEwithRSA SupportedKeyClasses sun.security.mscapi.Key Cipher.RSA SupportedKeyClasses sun.security.mscapi.Key Signature.MD2withRSA sun.security.mscapi.RSASignature$MD2 Signature.MD5withRSA sun.security.mscapi.RSASignature$MD5 Cipher.RSA SupportedModes ECB Provider.id info Sun's Microsoft Crypto API provider Signature.SHA1withRSA SupportedKeyClasses sun.security.mscapi.Key Signature.SHA1withRSA sun.security.mscapi.RSASignature$SHA1 Provider.id className sun.security.mscapi.SunMSCAPI KeyPairGenerator.RSA KeySize 1024 Signature.MD2withRSA SupportedKeyClasses sun.security.mscapi.Key Provider.id name SunMSCAPI Cipher.RSA SupportedPaddings PKCS1PADDING Cipher.RSA sun.security.mscapi.RSACipher KeyStore.Windows-MY sun.security.mscapi.KeyStore$MY ------------------------------------- |
이렇게 많ㅇ이 사용될 수 있는 알고리즘 구현방식이 있다.
아래 URL의 샘플 코드를 봐보자.
http://java.sun.com/developer/technicalArticles/Security/AES/AES_v1.html
import java.security.*; import javax.crypto.*; import javax.crypto.spec.*; import java.io.*; /** * This program generates a AES key, retrieves its raw bytes, and * then reinstantiates a AES key from the key bytes. * The reinstantiated key is used to initialize a AES cipher for * encryption and decryption. */ public class AES { /** * Turns array of bytes into string * * @param buf Array of bytes to convert to hex string * @return Generated hex string */ public static String asHex (byte buf[]) { StringBuffer strbuf = new StringBuffer(buf.length * 2); int i; for (i = 0; i < buf.length; i++) { if (((int) buf[i] & 0xff) < 0x10) strbuf.append("0"); strbuf.append(Long.toString((int) buf[i] & 0xff, 16)); } return strbuf.toString(); } public static void main(String[] args) throws Exception { String message="This is just an example"; // Get the KeyGenerator KeyGenerator kgen = KeyGenerator.getInstance("AES"); kgen.init(128); // 192 and 256 bits may not be available // Generate the secret key specs. SecretKey skey = kgen.generateKey(); byte[] raw = skey.getEncoded(); SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); // Instantiate the cipher Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.ENCRYPT_MODE, skeySpec); byte[] encrypted = cipher.doFinal((args.length == 0 ? "This is just an example" : args[0]).getBytes()); System.out.println("encrypted string: " + asHex(encrypted)); cipher.init(Cipher.DECRYPT_MODE, skeySpec); byte[] original = cipher.doFinal(encrypted); String originalString = new String(original); System.out.println("Original string: " + originalString + " " + asHex(original)); } } [출처] 자바 Security 알고리즘 보기|작성자 용용 |
Window 2000 서버 ==> IBM AIX 서버(유닉스)
코드 폴더 통째로 바꿨다!! 그런데..!!!
잘 돌아가던 소스가 실행이 안되는 거다!!!
다음과 같은 에러가...!!!@@
org.apache.jasper.JasperException: Unable to compile class for JSP
Generated servlet error:
/home/lsms/WEB-INF/work/org/apache/jsp/main_jsp.java:1033: handlePageException(java.lang.Exception) in javax.servlet.jsp.PageContext cannot be applied to (java.lang.Throwable)
(source unavailable)
1 error
at org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:84)
at org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:332)
at org.apache.jasper.compiler.Compiler.generateClass(Compiler.java:412)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:472)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:451)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:439)
at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:511)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:295)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:300)
at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:374)
at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:743)
at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:675)
at org.apache.jk.common.SocketConnection.runIt(ChannelSocket.java:866)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
at java.lang.Thread.run(Thread.java:568)
이런 에러가 뜨면서..뜨아..
아무리 찾아봐도 안되는거다. 그 좋다는 지식검색마저도...
결국 해결봤다.
어떻게??~~ ==> 소스 폴더 안에 WEB-INF 라는 놈도 같이 다 카피가 됐었는데. 그놈은 서버마다 다른거 같다.
따라서 WEB-INF 라는 폴더를 통째로 삭제시켜주자!!!!
그럼 이런 에러 없이 전혀 문제없이 잘 돌아간다. 6시간 뺑이친 결과물이다. ㅡㅡ;
출처 : http://sweetjini.egloos.com/2477988
Java Error Message 정리 자료입니다.
1. ERROR Exception in thread "main" java.lang.NoClassDefFoundError: 파일명
발생되는 경우 클래스 파일을 찾을 수 없는 경우
조 언 실행하려는 클래스 파일 이름이 제대로 되어 있는지 확인한다.
또한, CLASSPATH 설정이 제대로 되어 있는지 확인하며 (도스모드에서 set명령어)
만약, 되어있지 않다면 설정한다. (CLASSPATH = jdk1.3/jre/lib/rt.jar; 2-1강좌 참조)
2. ERROR cannot resolve symbol
symbol : class in(에러가 난 부분)
location : class StackTest(찾으려는 위치)
발생되는 경우 이해할 수 없는 클래스나 메소드, 변수명이 올경우
조 언 보통 이 에러는 철자가 틀렸을 경우에 많이 발생한다. 클래스, 메소드, 변수의 철자를 세심히 확인해 본다.
특히, 철자를 확인할때 대소문자 구분을 확실히 체크한다.(자바는 대소문자를 구별한다.) 그리고 클래스에서 발생할 경우 import를 해주었는지 확인해 봅니다.
3. ERROR non-static variable 변수이름(or method 메소드이름) cannot br referenced from a static context
발생되는 경우 static 메소드 안에서 static 으로 선언되지 않은 메소드나 변수를 참조(사용)했을 경우.
특히, 메소드의 경우는 인스턴스를 사용하지 않고 static메소드 내에서 바로 선언한 경우.
조 언 static 선언자의 사용여부를 살펴보고 static 메소드 안에 static으로 선언되어지지 않은 메소드나 변수가 있느지 확인해본다.
만약 그런것이 있으면 메소드를 새로 만들어 그쪽에서 선언한다. 단, 인스턴스를 생성해서 불러줘야 한다는 것을 잊지 말아야한다.
4. ERROR valiable 변수명 might not have been initialized
발생되는 경우 지역변수인 변수명의 변수가 초기화가 되어있지 않았을 경우
조 언 지역변수(메소드 내에서 선언한 변수)를 초기화 하지 않은채 선언했을 경우 발생한다.
멤버 필드가 아닌 경우는 반드시 변수 선언시 초기화를 해주어야 한다.
(멤버 필드는 자바 프로그램 자체에서 자동으로 default값으로 초기화 해준다.)
5. ERROR class 클래스명 is public, should be declared in a file named 클래스명.java
발생되는 경우 클래스명이 public으로 선언되었는데 파일명과 다를 경우
조 언 public으로 선언된 클래스가 있다면 반드시 그 클래스명과 파일명이 같아야 한다.
클래스명과 파일명의 대소문자 및 철자가 같은지 비교해 본다.
또한, public으로 선언된 클래스가 하나 이상 있는지 찾아본다.(반드시 하나만 있어야한다.)
6. ERROR push(java.lang.object)[메소드(인자로 받을 수 있는 형)] in java.util.Stack(메소드의 클래스) cannot be applied to (int)[잘못 들어간 형]
발생되는 경우 메소드에서 인자를 받을 때 받을 수 있는 형이 아닌 자료형 또는 클래스형을 사용할 경우
조 언 사용하는 메소드의 API를 참고하여 어떤 형을 인자로 받을 수 있는지 찾아본다.
API를 보지 못할 경우는 각 자료형으로 인자를 직접 바꾸어 본다.
7. ERROR java.lang.NoSuchMethodError: main
Exception in thread "main"
발생되는 경우 클래스 파일 안에서 main() 메소드를 찾을 수 없는 경우
조 언 자바 애플릿이 아닌 이상 자바 애플리케이션은 반드시 main() 메소드를 사용해야 합니다.
main() 메소드를 빼먹지 않았는지 확인해 보십시요. 또한 public static void main(String[] args) 형식으로 씌어졌는지도 확인해 보십시요.
(main 클래스는 반드시 위와 같은 형식으로 만들어져야 합니다.)
8. ERROR unreported exception java.io.IOException(Exception명); must be caught or declared to be thrown
발생되는 경우 예외가 발생하는데 예외처리를 해주지 않았을 경우
조 언 예외를 발생하는 메소드 같은 경우는 반드시 예외처리를 해주어야 합니다.
예외를 발생하거나 예외처리를 해야하는 메소드는 API를 확인해 보시면 알 수 있습니다.
그렇지 않다면 컴파일 후 지금처럼 에러가 난 예외를 예외처리해 주시면 됩니다.
또한, 예외를 처리할 때는 메소드 차원에서 throws 예외명을 이용해서 처리할 수 있고
try{} catch{} 구문을 이용해서 직접 처리해 주셔도 됩니다.(예외 강좌를 참고하세요.)
특히, 예외도 클래스이므로 반드시 예외가 들어간 패키지를 import 해주어야 합니다.
9. ERROR Note : Calculator.java(파일명) uses or overrides a deprecated API.
Note : Recompile with -deprecation for details.
발생되는 경우 JDK 버전이 높아졌거나 보안등의 기타이유로 사용이 deprecated된 메소드를 사용한 경우
조 언 이건 예외라기 보다는 경고 입니다.(실행하면 됩니다.^^)
JDK가 버전이 높아지거나 보안등의 이유에 따라 예전에 만들어졌지만 필요가 없어지거나 대체된 메소드가 생겨났습니다.
그런 메소드를 deprecated 되었다고 하는데 이것은 API상에 나왔있습니다.
또한, 컴파일할때 -deprecation 옵션주면 어떤 메소드가 deprecate됐는지 알수있읍니다.
사용이 중지 됐다고 보기 보다는 사용을 가능하면 하지 않게끔 해주는 거죠.
대치되었거나 버전 업된 메소드를 사용하시면 됩니다.
10. ERROR MouseEvent(클래스명) should be declared abstract; it does not define mouseDragged(java.awt.event.MouseEvent)[메소드명(메소드가 포함된 클래스)] in MouseEvent(클래스명)
발생되는 경우 implements한 Interface의 모든 메소드를 구현하지 않아서 발생됨
조 언 Interface는 모든 메소드가 선언만 되고 구현되지 않은 추상(abstract) 메소드입니다.
만약 Interface를 implements하려면 implements한 클래스가 Interface에서 선언한 모든 메소드를 구현해 주어야 합니다.
하나라도 빠질 경우 implements한 클래스도 추상 클래스로 보고 에러가 발생합니다.
에러에 구현해 주어야할 메소드명이 나오므로 그곳에 쓰여있는 메소드를 구현해 주면 됩니다.
만약, 그 메소드를 구현해 주었는데 에러가 나면 철자 및 대소문자를 다시 확인해 보십시요.
11. ERROR incompatible types
found : /null(입력한 자료형)
required : int(요구하는 자료형)
발생되는 경우 입력을 했을때 맞지 않는 자료형이나 클래스형을 입력할 경우
조 언 incompatible 은 '성미가 맞지 않는','모순된' 이라는 뜻을 가진 단어 입니다.
단어뜻 처럼 입력 경우 required 에 나타난 자료형 및 클래스형을 요구하는데
found 에서 나타난 자료형 및 클래스형을 써주어서 입력을 하지 못하게 되어서 발생하는 에러입니다.
found 에 나타난 자료형을 required 에 나타난 자료형으로 변경해 주시면 됩니다.
12. ERROR package java.servlet(패키지명) does not exist
발생되는 경우 import한 패키지가 존재하지 않을 경우
조 언 import한 패키지가 존재하지 않을 경우에 발생하는 에러입니다.
철자와 대소문자를 먼저 확인하고 CLASSPATH 설정을 확인해 보시기 바랍니다.
또한 그 곳에 패키지가 jar파일로 있는지도 확인해 보셔야 합니다.
(API에 나와있는 패키지는 rt.jar에 다 있습니다.
단 javax가 붙거나 다름으로 시작되는 확장 패키지는 설치해 주어야합니다.(javax.swing 제외))
13. ERROR java.lang.NullPointerException
Exception in thread "main"(메소드) java.lang.NullPointerException
at java.awt.Container.addImpl(Container.java:341)... [에러가 일어난 부분]
발생되는 경우 참조하거나 사용한 클래스 또는 자료형이 초기화 되지 않은 경우
조 언 보통 이것은 awt나 배열 부분에서 자주 발생하는데 초기화를 해주지 않아서 많이 발생합니다.
자바의 변수들은 기본적으로(자동으로 초기화 되는 멤버필드등을 제외하고) 초기화를 요구합니다.
에러에 체크된 부분을 검토해 보시고 초기화를 해주십시요.
14. ERROR ';'(빠진 부분) expected
발생되는 경우 문법상으로 써야할 것을 쓰지 않은 경우 발생합니다.
조 언 주로 ';'을 안써주시거나 아님 '()'(괄호)를 열기만 하고 닫지 않은 실수를 할 경우 발생합니다.
대부분 이 에러가 발생한 경우는 에러에 나온것을 소스에 추가해 주시면 됩니다.
15. ERROR unexpected type
required : value(요구하는 타입)
found : class(소스상 써준 타입)
발생되는 경우 써주어야 할 타입이 아닌 잘못된 타입을 써주었을 경우
조 언 unexpected type 에러를 해석하면 '기대하지 않은 타입'이란 뜻을 가지고 있습니다.
즉, 원하는 타입(required)이 아닌데 잘못된 타입(found)을 써준 경우 발생합니다.
에러 체크된 부분의 타입을 required 에서 나타난 타입으로 변경해 주시면 됩니다.
16. ERROR java.lang.ArrayIndexOutOfBoundsException
at Test.main(Test.java:10)[클래스.메소드(파일명:에러난 위치)]
Exception in thread "main"(예외가 던져진 메소드)
발생되는 경우 배열의 범위를 넘어선 값을 넣었을 경우
조 언 위의 에러는 특이하게 컴파일은 이상없이 되지만 실행을 하면 발생하는 에러입니다.
배열의 범위를 넘어설 경우에 발생하므로 에러난 위치의 배열의 참조 범위를 확인해보시고
선언해둔 배열의 범위에 맞게 조정해 주시면 됩니다.
17. ERROR illegal start of expression
발생되는 경우 선언자(modifier)를 잘못 집어 넣은 경우
조 언 에러의 단어뜻을 확인해 보면 '표현의 시작이 부적격 합니다.'하고 해석할 수 있습니다.
보통 선언자가 맞지 않거나 쓰일데가 아닌데 선언자를 줄 경우에 많이 발생합니다.
특히 메소드안에서 static 선언자를 쓴 경우에는 직격으로 볼수 있죠.
에러가 난 부분의 선언자를 제거하거나 맞는 것인지 다시 확인해 보십시요.
18. ERROR java.io.InputStream(클래스) is abstract; cannot be instantiated
발생되는 경우 abstract로 선언된 클래스를 직접 new 명령어를 이용하여 인스턴스화 할 경우
조 언 abstract로 선언된 클래스를 직접 new 명령어를 이용하여 인스턴스화 할 경우에 발생하는 에러입니다.
왜냐하면, 추상 클래스는 직접 new 명령어를 이용하여 인스턴스화 할수 없기 때문입니다.(객체를 못만든다구요.)
이 경우에는 인스턴스를 다른 방법으로 생성하시면 됩니다.
예를 들어 인스턴스를 반환하는 메소드를 이용한다거나 상속을 통해서 상속받은 클래스의 인스턴스를 만들어
직접 인스턴스를 만드는 효과를 낼수도 있구요. 원하시는 방법으로 바꾸어 보시길...
19. ERROR local variable name(변수명) is accessed from within inner class; needs to be declared final
발생되는 경우 Local Class의 변수를 final로 선언하지 않은 경우
조 언 Local Class의 변수는 참조변수의 참조값 변동을 방지하기 위하여 final 선언자를 붙여주어야 합니다.
변수에 final 선언자를 붙이면 변수는 값을 변동할 수 없는 상수 처럼 쓰이며
만약 이 값을 참조할 경우 자바는 이 값을 넘기는게 아니라 이 값의 복사본을 참조 값으로 넘기게 됩니다.
그러므로 Local Class에서 참조값 변동없이 변수를 참조할 수 있게 되는 것입니다.
Local Class를 정의해준 곳을 살펴보고 final 선언자를 확실하게 확인하시기 바랍니다.
20. ERROR inner classes cannot have static declarations
발생되는 경우 내부 클래스 안에서 static 선언자를 쓴 경우
조 언 내부 클래스 안에서는 static 선언자를 쓸수 없습니다.
내부 클래스 안에서 사용된 static 선언자를 제거해 주십시요.
21. ERROR referenceto List is ambiguous,both class java.util.List(클래스) in java.util(패키지)
and class java.awt.List(클래스) in java.awt(패키지) match
발생되는 경우 클래스 사용시 다른 패키지내에 동일이름의 클래스들이 있어서 참조가 모호할 경우
조 언 예시를 보면 아시겠지만 import 한 패키지중에 같은 이름을 사용하는 클래스를 클래스 이름만으로
생성함으로서 참조가 모호해질 경우 발생하는 에러입니다.
이와 같은 경우는 import를 하나 제거 하거나 아님 java.util.List 이런식으로
직접 그 클래스의 패키지를 같이 써줌으로서 모호성을 제거할수 있습니다.
22. ERROR m()(메소드명) in B(클래스명) cannot override m()(메소드명) in A(클래스명);
attempting to use incompatiable return type
발생되는 경우 클래스를 상속받고서 메소드를 오버라이드 하고자할때 잘못한 경우
조 언 클래스를 상속받고서 메소드를 오버라이드 할 경우에는 지켜야 하는 규칙이 있습니다.
1. 메소드의 이름이 같아야 합니다.
2. 메소드의 파라미터 개수, 데이터형이 같아야 합니다.
3. 메소드의 리턴형이 같아야 합니다.
4. 상위 메소드와 동일하거나 더 구체적인 Exception을 발생시켜야 합니다.
5. 상위 메소드와 동일하거나 접근범위가 더 넣은 접근 제한자를 사용해야 합니다.
님의 메소드 오버라이드시 위 규칙을 잘 지켰는가를 다시 한번 확인해 보세요.
23. ERROR getPathBetweenRows(int,int)(메소드) has protected access in javax.swing.jTree(클래스)
발생되는 경우 protected로 선언된 메소드를 상속 없이 직접 불러쓸 경우
조 언 protected로 선언되어 있는 메소드는 상속하거나 같은 package에 있을 때만 쓸 수 있습니다.
상속해서 다시 public 메소드로 값을 받던지 아니면
public 메소드 중에서 비슷한 기능을 하는 메소드가 있는지 찾아서 바꾸어주어야 합니다.
24. ERROR invalid method declaration; return type required
발생되는 경우 리턴 타입을 쓰지 않아 메소드의 선언이 잘못된 경우
조 언 리턴 타입을 쓰지 않아 메소드의 선언이 잘못된 경우에 발생하는 에러이므로
에러가 발생한 메소드를 확인해보고 리턴 타입을 맞게 적어주어야 합니다.
25. ERROR Error occurred during initialization of VM
java.lang.ExceptionInInitializerError
발생되는 경우 static으로 선언된 변수중 초기화가 안되어 있는 것이 있는 경우
조 언 static으로 선언된 변수중에 초기화가 안된게 있는 경우에 발생하는 에러이므로
에러가 발생한 변수를 확인해보고 알맞은 초기화를 시켜주거나 변수의 위치를
자동 초기화가 가능한 메소드 밖의 클래스 변수로서 사용하게 합니다.
26. ERROR Error opening registry key 'Software\JavaSoft\Java Runtime Environment'
Error: could not find java.dll
Error: could not find Java 2 Runtime Environment
발생되는 경우 중복설치 등으로 인해 레지스트리 키값이 잘못되어 있는 경우
조 언 중복설치 등으로 인해 레지스트리 키값이 잘못되어 있는 경우에 발생하는 에러이므로
레지스트리 편집기를 열어서 HKEY_LOCAL_MACHINE -> SOFTWARE -> JavaSoft에
보시면 3개의 키가 있을 겁니다. 그중에서 첫번째 키인 Java 런타임 환경 을 마우스
오른쪽 버튼으로 클릭하여 Java Runtime Environment로 이름을 바꿔주시면 됩니다.
27. ERROR Error Registry Key 'Sofrware\JavaSofrware\Java Runtime Environment\CurrentVerison'
has value '1.1',but '1.3' is requried.
Error: could not find java.dll
Error: could not find java 2 Runtime Enviroment.
발생되는 경우 중복설치 등으로 인해 레지스트리 키값의 자바 버전이 잘못되어 있는 경우
조 언 중복설치 등으로 인해 레지스트리 키값의 자바 버전이 잘못되어 있는 경우에 발생하는 에러이므로
레지스트리 편집기를 열어서 HKEY_LOCAL_MACHINE -> SOFTWARE -> JavaSoft -> Java Runtime Environment의 Current version의 값을 1.3으로 되어있는지 확인해 주시면 됩니다.
28. ERROR java.lang.ClassNotFoundException: org.gjt.mm.mysql.Driver(드라이버명)
발생되는 경우 JDBC로 데이터 베이스에 연결하는 중 드라이버를 찾지 못할 경우
조 언 JDBC를 연결하는 중에 드라이버를 찾지 못할 경우에 발생하는 에러이므로
각 데이터 베이스에 맞는 드라이버가 제대로 다운로드 되었는지 확인해 보시고
드라이버의 위치가 클래스 패스에 잡혀 있는지 확인해주시면 됩니다.
29. ERROR Method printIn(java.lang.String)(메소드명) not found in class java.io.PrintStream(클래스명)
발생되는 경우 자신이 사용한 클래스의 메소드가 맞지 않는(=없는)경우
조 언 자신이 사용한 클래스의 메소드가 맞지 않는(=없는) 경우에 발생하는 에러이므로
API를 통해서 사용하고자 하는 클래스와 메소드를 다시 한번 확인해 봅니다.
보통 이경우 메소드의 철자나 대소문자를 잘못 쓴 경우가 많으니 그점을 유심히 살표봅니다.
마지막으로 철자와 대소문자도 맞는다면 메소드의 인자의 객체형을 맞게 주었는지 확인해보면 됩니다.
| |||||
웹로그 분석이 필요하신 분은 사용해 보세요. awstats 리눅스용 tar파일도 같이 올립니다. 리눅스포털에서 만든 가이드입니다. | |||||
|
규칙1: properties 파일은 Text 파일이며, 다음과 같은 형태의 이름들을 가질 수 있습니다.
MyResource_ko_KR_IBMeucKR.properties
MyResource_ko_KR.properties
MyResource_ko.properties
MyResource_en_US.properties
MyResource_en.properties
MyResource.properties
baseclass "_" language1 "_" country1 "_" variant1
baseclass "_" language1 "_" country1
baseclass "_" language1
baseclass
즉, 자동으로 JVM의 Locale 정보를 찾아서 위 순서대로 프로퍼티 파일을 순차적으로 찾아
나갑니다.
Locale 옵션을 주지 않으면, Locale.getDefault()를 사용하게 됩니다.
System.out.println(Locale.getDefault()) 해 보시면 확인이 가능하며, 이 값은
"file.encoding" 이라는 System Property 값에 의해 영향을 받으며, 이것은 다시
환경변수 "LANG" 값에 영향을 받습니다.
이 기능을 이용하여, Locale 값이 무엇이냐에 따라 서로 다른 문자열을 프로그램내에서
제공할 수 있게 되는 것이지요...
즉, 아래와 같은 서로 다른 이름의 resource 파일을 두게 되면, 영어와 한글 문자열을
Locale 값에 따라 서로 다르게 제공할 수 있는 것이지요.
MyResource_ko.properties
MyResource_en.properties
MyResource.properties <--- 이도저도 아닐 때 사용되는 defualt
규칙2: 위의 해당 properties 파일은 classpath 에 잡혀 있는 곳에 있어야 하며,
만약, package 로 구분된 sub directory 에 두었다면, 반드시 full path 를 주어야
합니다.
ResourceBundle resource =
ResourceBundle.getBundle("org.jsn.somewhere.MyResource")
그리고, MyResource_??_??.properties 파일들(!)은 org/jsn/somewhere/ 하부 디렉토리에
놓여 있어야 합니다.
해당 properties 파일들은 jar 파일내에 함께 묶어 두어도 됩니다.
규칙3: properties 파일들은 다음과 같은 포멧으로 구성되어 있습니다.
----------------------------------------------------------------------
# 1. key = value_string 으로 기술된다.
# 2. Comment 는 '#'으로 시작되면 되나, 문자열 중간에 있는 '#'기호는 Comment로
# 인식하지 않는다.
# 3. '=' 대신 ' '(공백)을 사용해도 된다.
# (즉 첫번째 나오는 공백이 key와 vlaue string를 나누는 구실도 한다.
# 4. 3번의 이유로 인하여 key에는 중간에 공백이 허용되지 않는다.
# 5. 반면, value string에는 공백이 허용된다.
# 6. value string를 사용할 때 한글이 지원된다. 그러나 key는 한글지원이 안된다.
# 7. 두 줄 이상을 사용하려면 라인의 끝에 '\' 문자를 사용하면 된다.
# '\'문자 자체가 필요할 땐 '\' 대신 '\\'을 사용하라.
# 8. 7번의 이유로 인하여 Windows 환경에서 디렉토리 구분은 '\'가 아니라 '\\' 이다.
key = value
name = 이원영
.....
----------------------------------------------------------------------
규칙4: 한글은 8859_1 캐릭터 셋으로만 읽혀 집니다. 따라서, JVM의 인코딩이 8859_1 이
아니라면, 다음처럼 변환하여야 합니다. file.encoding 이 "KSC5601" 이라면,
ResourceBundle resource = ResourceBundle.getBundle("resource.MyResource");
System.out.println(Locale.getDefault());
System.out.println(resource.getString("name"));
System.out.println(new String(resource.getString("name").getBytes("8859_1"),"KSC5601"));
내부적으로 ClassLoader.getResourceAsStream(filename); 의 형태로 읽혀 들이기
때문입니다.
보다 자세한 사항은 해당 클래스의 API 문서와 JDK 소스를 직접 읽어 보시길 바랍니다.
가장 빨리/정확히/깊이있게 공부하는 지름길입니다.
-------------------------------------------------------
본 문서는 자유롭게 배포/복사 할 수 있으나 반드시
이 문서의 저자에 대한 언급을 삭제하시면 안됩니다
================================================
자바서비스넷 이원영
E-mail: javaservice@hanmail.net
PCS:011-898-7904
================================================
출처 : http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=javatip&c=r_p&n=993541416&p=13&s=t
Java 맵 컬렉션 클래스의 소개
Map 인터페이스와 메소드의 이해
Java 코어 클래스에는 여러 가지 사전정의된 Map 클래스가 존재합니다. 구체적인 구현 방식을 설명하기 전에 Map 인터페이스를 살펴보고 모든 Map 클래스가 공유하는 공통점이 무엇인지 이해해 보기로 하겠습니다. Map 인터페이스는 모든 Map이 공통적으로 갖는 네 가지 종류의 메소드를 정의하고 있습니다. 그 중에서 별로 중요하지 않은 두 가지 메소드를 살펴 보기로 하겠습니다.
표 1: 아래 두 가지 메소드는 오브젝트에 의해 오버라이드(override)되며, Map 오브젝트가 동등(equallity) 조건에 의해 비교될 수 있게 합니다.
equals(Object o) | 지정한 오브젝트과 이 맵의 동등(equality) 조건을 비교합니다 |
hashCode() | 이 맵의 해시 코드를 리턴합니다. |
맵 빌딩
맵은 엘리먼트를 삽입/제거하기 위한 다양한 뮤테이터(mutator) 메소드를 제공합니다
표 2: 맵 업데이트 메소드: 맵의 컨텐트를 변경하기 위한 메소드.
clear() | 모든 매핑을 맵으로부터 제거 |
remove(Object key) | 키와 연계된 값을 맵에서 제거 |
put(Object key, Object value) | 지정된 값을 지정된 키와 연계(associate) |
clear() | 모든 매핑을 맵으로부터 제거 |
putAll(Map t) | 특정 맵에서 이 맵으로 모든 매핑을 복사 |
여기에 별다른 것은 없습니다. 한 가지 참고할 만한 사항은 putAll()이 여러 번의 put() 호출을 사용하는 것보다 효율적인 경우가 드물다는 사실입니다. putAll()을 전달하기 위해 다른 맵을 생성하는데 드는 비용을 고려하지 않더라도 마찬가지입니다. putAll()은 전달된 Map의 각 엘리먼트에 대해 루프를 실행하며, 각각의 키 값을 put()이 실행되는 Map에 추가하는 알고리즘을 실행해야 하기 때문입니다. 하지만 putAll()이 전체 엘리먼트를 추가하기 전에 Map의 크기를 적절하게 설정하는 작업을 수행하는 작업을 수행하므로, 사용자가 직접 Map의 사이즈를 설정하는 것보다 putAll()이 좀더 효율적으로 실행될 수 있음을 참고하시기 바랍니다.
맵의 조회
Map의 각 엘리먼트 별로 알고리즘을 실행하는 방법은 상황에 따라 달라집니다. 특정 쿼리를 만족하는 엘리먼트가 무엇인지 확인하려면, 또는 어떤 이유로든 전체 엘리먼트에 대해 알고리즘을 반복적으로 실행하려면 먼저 Map의 “뷰”를 가져와야 합니다. 뷰에는 크게 3 가지가 있습니다 (표3) 참고
- 전체 키-값 쌍(key-value pair) — entrySet()
- 전체 키 — keySet()
- 전체 값 — values()
앞의 두 가지는 Set 오브젝트를, 마지막은 Collection을 반환합니다. 세 가지 경우 모두 Collection 또는 Set 오브젝트를 직접 반복실행(iterate)할 수는 없으므로, 반복실행을 위한 Iterator 오브젝트를 먼저 가져와야 합니다. 따라서 Map의 여러 엘리먼트에 대해 반복실행을 하기 위해서는 다소 복잡한 구문을 사용해야 합니다.
이 오브젝트들(Set, Collection, Iterator)는 실제로 하부 맵의 뷰로써 존재할 뿐, 전체 엘리먼트의 사본을 포함하고 있지 않다는 점을 참고할 필요가 있습니다. 따라서 조회 작업은 매우 효율적으로 수행됩니다. 반면 Collection 또는 Set의 toArray() 메소드는 Map의 모든 엘리먼트를 포함하는 어레이 오브젝트를 생성하므로, 실제로 어레이 내부의 엘리먼트를 일일이 확인해야 하는 경우가 아니라면 비효율적일 수 있습니다.
아래 예제는 HashMap을 이용하여 간단한 테스트를 실행하고 두 가지 방법을 이용하여 Map 엘리먼트들을 일일이 확인하는데 드는 비용을 비교하고 있습니다 (Test1.java 참고)
이 테스트를 수행하는 방법에는 여러 엘리먼트에 대한 실행 시간을 측정하는 방법과 toArray 호출을 이용하여 어레이를 생성하는데 드는 추가적인 비용을 산출하는 방법이 있습니다. 첫 번째 방법에서 어레이를 생성하는데 소요되는 시간을 무시한다면, Iterator를 이용하는 방법보다 toArray 호출을 통해 기존에 생성된 어레이를 사용하는 방법이 30%-60% 정도 빠릅니다. 하지만, toArray를 사용하여 어레이를 생성하는데 수반되는 오버헤드를 고려한다면, 오히려 Interator가 10%-20% 정도 빠른 성능을 보입니다. 그러므로, 컬렉션으로부터 엘리먼트 어레이를 생성해야 할 필요가 있는 경우라면, 각 엘리먼트 별로 작업을 수행하는 대신 어레이를 사용하는 편이 빠릅니다. 반면에 어레이가 굳이 필요하지 않은 경우라면 어레이를 아예 생성하지 않고 Iterator를 사용하는 것이 바람직합니다
표 3: 뷰를 반환하는 Map 메소드: 아래 메소드들은 Map 엘리먼트를 조회(traverse)하거나 Map의 엘리먼트를 삭제하기 위한 오브젝트를 반환합니다
entrySet()
맵에 포함된 매핑에 대한 Set 뷰를 반환합니다. 셋에 포함된 각 엘리먼트는 Map.Entry 오브젝트로 구성되며, getKey(), getValue() 메소드의 접근을 위한 key/value 엘리먼트를 포함할 수 있습니다(setValue() 메소드도 함께 제공됩니다).
keySet()
맵에 포함된 키에 대한 Set 뷰를 반환합니다. Set에서 엘리먼트를 제거하면 해당되는 매핑(key, value) 역시 Map에서 제거됩니다.
values()
맵에 포함된 값에 대한 Collection 뷰를 반환합니다. Collection에서 엘리먼트를 제거하면 해당되는 매핑(key, value) 역시 Map에서 제거됩니다.
엘리먼트에 대한 접근
맵 액세스를 위한 메소드는 표 4에서 확인하실 수 있습니다. 맵은 (value가 아닌) key를 기준으로 한 액세스에 최적화되는 것이 일반적입니다. 이러한 환경이 Map 정의에 분명히 명시되지는 않지만, 일반적으로 그러하다고 기대할 수 있습니다. 따라서 containsKey() 메소드는 get() 메소드와 유사한 실행 속도를 갖는 것으로 기대할 수 있습니다. 반면 containsValue() 메소드는 맵의 value를 일일이 스캔해야 하므로 훨씬 느린 속도를 보이는 경우가 대부분입니다.
표 4: 맵 액세스 및 테스트를 위한 메소드: Map 컨텐트를 변경하지 않은 상태에서 Map 컨텐트에 대한 정보를 조회하기 위한 메소드입니다.
get(Object key) | 지정된 키에 관련된 값을 반환합니다. |
containsKey(Object key) | 맵이 지정된 키에 대한 매핑을 포함하고 있는 경우 True를 반환합니다. |
containsValue(Object value) | 맵이 지정된 값에 대한 하나 또는 그 이상의 키를 포함하고 있는 경우 True를 반환합니다. |
isEmpty() | 맵이 key-value 매핑을 전혀 포함하고 있지 않은 경우 True를 반환합니다. |
size() | 맵에 포함된 key-value 매핑의 수를 반환합니다. |
HashMap에서 containsKey(), containsValue() 메소드를 이용하여 모든 엘리먼트를 테스트하는데 걸리는 시간을 비교해 보면, containsValue()의 실행 시간이 수십 배나 오래 걸림을 확인할 수 있습니다. (참고 Test2.java) 따라서 containsValue()가 애플리케이션의 성능 문제를 유발할 가능성이 매우 높습니다. 이 경우, containsValue() 이외의 다른 대안을 사용하여 보다 효율적인 방법으로 문제를 해결할 수 있을 것입니다. 이러한 대안이 불가능하다면, 첫 번째 Map의 모든 값을 키로 갖는 두 번째 Map을 생성하고, 첫 번째 Map에 대해 containsValue()를 실행하는 대신 두 번째 Map에 containsKey()를 실행하는 방법을 고려해 볼 수 있을 것입니다
코어 맵
Java는 다양한 Map 클래스를 포함하는 형태로 배포됩니다. Map 클래스는 크게 세 가지 종류로 구분됩니다
- 매핑 관리를 위해 애플리케이션에서 사용하는 범용 Map (대부분 java.util 패키지에 구현)
- HashMap
- Hashtable
- Properties
- LinkedHashMap
- IdentityHashMap
- TreeMap
- WeakHashMap
- ConcurrentHashMap
- 직접 생성하는 대신 다른 클래스를 이용하여 액세스하는 특수 목적의 Map
- java.util.jar.Attributes
- javax.print.attribute.standard.PrinterStateReasons
- java.security.Provider
- java.awt.RenderingHints
- javax.swing.UIDefaults
- 별도의 Map 클래스 구현을 지원하기 위한 추상화 클래스
- AbstractMap
해시 매핑 테크닉
대부분의 범용 Map은 해시 매핑(hash mapping)을 사용합니다. 해시 매핑은 엘리먼트를 어레이에 매핑하기 위한 매우 단순한 메커니즘을 제공합니다. Map을 제대로 이해하기 위해서는 먼저 해시 매핑을 이해하는 것이 중요합니다.
해시 맵 구조는 엘리먼트가 저장되는 내부 어레이로 구성됩니다. 내부 저장소가 어레이 형태로 구성되므로, 임의의 키를 이용하여 어레이에 인덱스를 적용하기 위한 메커니즘이 필요합니다. 이 메커니즘은 어레이의 크기보다 작은 어레이 인덱스 값을 생성하는데 사용됩니다. 이러한 메커니즘을 해시 함수(hash function)이라 부릅니다. Java 해시 기반 Map에서, 해시 함수는 임의의 오브젝트를 내부 어레이에 적합한 정수로 변환합니다. 해시 함수를 다른 데서 찾을 필요는 없습니다. 모든 오브젝트는 정수값을 반환하는 hashCode() 메소드를 가지고 있습니다. 이 값을 어레이로 매핑하려면, 값을 양수로 변환한 뒤 어레이 사이즈로 나눈 나머지값을 취하면 됩니다. Java의 모든 오브젝트에 대해 사용 가능한 단순한 해시 함수의 예가 아래와 같습니다.
int hashvalue = Maths.abs(key.hashCode()) % table.length;
(modulo라 불리는 % 바이너리 연산자는 좌항을 우항으로 나눈 후 나머지값으로 남는 정수를 반환합니다.)
실제로 버전 1.4가 출시되기 전까지, 위의 해시 함수가 해시 기반 Map 클래스를 위해 사용되어 왔습니다. 실제 코드는 아래와 같습니다
int hashvalue = (key.hashCode() & 0x7FFFFFFF) % table.length;
이는 양수 값을 얻기 위해 좀 더 효율적인 메커니즘을 사용하고 있을 뿐, 앞에서 예시한 함수와 동일합니다. 버전 1.4가 출시되면서 HashMap 클래스는 Doug Lea의 util.concurrent 패키지를 기반으로 하는 좀 더 복잡한 해시 함수를 사용하게 되었습니다(Doug Lea의 클래스에 대해서는 뒷부분에서 좀 더 자세하게 설명합니다).
그림1 해싱의 동작 원리
지금까지 해시 매핑의 기본적인 원리를 설명했습니다. 하지만 이것으로 설명이 충분한 것은 아닙니다. 해시 함수는 임의의 오브젝트를 어레이의 특정 위치에 매핑시킵니다. 하지만 서로 다른 두 개의 키가 동일한 위치에 매핑되는 경우는 어떻게 해야 할까요? 이러한 현상을 근본적으로 차단할 수 있는 방법은 없습니다. 해시 매핑에서는 이러한 문제를 충돌(collision)이라 부릅니다. 맵에서는 이러한 충돌을 피하기 위해 인덱스 위치에 링크드 리스트(linked list)를 삽입하고, 각각의 엘리먼트를 링크드 리스트에 추가하는 방법을 사용합니다. 따라서 해시 기반 Map의 기본적인 put() 메소드는 아래와 같이 구현됩니다.
다양한 해시 기반 Map의 소스를 살펴보면 그 내용이 서로 상당히 유사하다는 것을 알 수 있습니다. 널 키, 널 값을 처리하는 방법, 내부 어레이의 리사이즈와 같은 별도의 고려사항이 존재하기는 합니다. 위에서 정의된 put() 메소드는 get() 메소드를 위한 알고리즘을 함께 포함하고 있습니다. 삽입 과정에서 키가 이미 존재하는지의 여부를 확인하기 위해 매핑된 인덱스의 엔트리를 검색하는 작업이 필요하기 때문입니다. (get() 메소드는 put()과 동일한 알고리즘을 가지고 있지만 삽입, 덮어쓰기를 위한 코드가 없다는 차이만을 갖습니다.) 링크드 리스트 이외에도 충돌 현상을 방지하기 위한 방법으로, 해시 맵에서 별도의 “open addressing” 접근법이 사용되기도 합니다(본 문서에서는 자세히 다루지 않습니다).
해시맵의 최적화
해시 맵의 내부 어레이가 단 하나의 엘리먼트만으로 구성되어 있다면, 모든 엔트리는 동일한 어레이 위치의 링크드 리스트에 삽입되어야 할 것입니다. 이 방법은 매우 비효율적입니다. 링크드 리스트에 대한 선형 검색을 이용한 액세스 또는 업데이트는 각각의 어레이 인덱스가 하나의 오브젝트만을 가진 경우보다 훨씬 느립니다. 링크드 리스트의 액세스/업데이트 속도는 리스트의 사이즈에 정비례하는 반면, 해시 함수를 이용하여 어레이의 단일 엘리먼트를 액세스/업데이트하는 속도는 어레이 사이즈와 무관합니다. 점근적 성능(asymptotic performance, Big-O notation)의 용어에 대응시킨다면 전자는 O(n)이고 후자는 O(1)이 됩니다. 따라서 여러 엔트리가 동일한 어레이 위치에 집중되는 것을 방지하고 어레이의 사이즈를 크게 잡는 것이 유리합니다.
Map의 리사이즈
해시에서 각각의 내부 어레이 위치를 “버킷(bucket)”이라 부르고, 사용 가능한 버킷의 수(내부 어레이의 사이즈)를 용량(capacity)이라 부릅니다. Map 오브젝트가 임의의 수의 엔트리를 효과적으로 처리하게 하려면, 맵의 리사이즈가 가능해야 합니다. 하지만 리사이즈 작업은 매우 많은 비용이 필요합니다. 어레이의 사이즈가 바뀌면 인덱스 값 또한 바뀔 수 밖에 없기 때문에 리사이즈 과정에서 모든 엘리먼트를 새로운 어레이에 다시 삽입해야 합니다. 이전에 충돌하던 키들이 서로 충돌하지 않는 반면, 이전에는 충돌하지 않던 키들이 서로 충돌할 수 있습니다. Map을 충분한 크기로 늘리는 경우, 충돌의 가능성을 최소화할 수 있으며 따라서 극적인 성능 향상이 가능합니다.
1.4.2 JVM에서 많은 수의 엔트리(백만 개 이상)를 HashMap에 추가하는 간단한 테스트를 수행해 보았습니다. 표 5는 그 결과를 보여 주고 있으며, 모든 시간은 ‘pre-sized 서버 모드’에 정규화되었습니다(참고Test3.java). pre-sized JVM의 경우 클라이언트/서버 모드 JVM 모두 동일한 시간을 보입니다(JIT 컴파일 단계의 시간은 계산하지 않았습니다). 하지만 Map의 디폴트 사이즈를 사용하는 경우에는 여러 차례 리사이즈 작업이 발생하며 그 비용은 상당합니다. 서버 모드의 경우 50%나 증가하였으며, 클라이언트 모드와 비교했을 때는 3배나 많은 시간이 걸렸습니다!
표 5: pre-sized HashMap과 default sized HashMap에 엔트리를 추가하는데 소요되는 시간
Client mode | Server mode | |
Pre-sized large | 100% | 100% |
Default size | 294% | 157% |
Load Factor의 사용
각 버킷의 링크드 리스트 사이즈를 추적하지 않고도 리사이즈가 필요한 시점을 결정할 수 있도록 하기 위해, 해시 기반 Map은 별도의 매개변수와 계산식을 이용하여 버킷의 밀집도를 측정합니다. Map은 “로드 팩터(load factor)”라 불리는 매개변수를 이용하며, 로드 팩터는 Map에 리사이즈가 수행되기 전에 얼마나 많은 “로드” 작업이 허용되는지를 결정하는데 사용됩니다. 로드 팩터, 엔트리의 수(맵 사이즈), 용량의 관계는 아래와 같이 정의됩니다.
- (load factor) x (capacity) > (map size)인 경우 맵은 리사이즈 된다.
예를 들어, 디폴트 로드 팩터가 0.75이고 디폴트 용량이 11이면 11 x 0.75 = 8.25가 됩니다. 이 값에 버림을 적용하면 8 개의 엘리먼트를 얻습니다. 따라서 이 Map에 8 개째의 엔트리를 추가하는 시점에 Map은 보다 큰 용량으로 리사이즈 됩니다. 역으로, 리사이즈를 피하기 위해 초기 용량을 계산할 때에는 추가되는 엔트리의 수를 로드 팩터로 나누고 그 결과에 올림을 적용하면 됩니다.
- 로드 팩터가 0.75일 때 100 개의 엔트리를 추가하려면, 용량은 100/0.75 = 133.33, 이 결과에 올림을 적용하여 134 (또는 홀수 값이 필요한 경우 135)
홀수 값을 갖는 버킷 사이즈는 충돌의 가능성을 줄여주므로 보다 효율적입니다. 소수(素數)를 적용하는 것이 이상적이지만, 실제로 테스트해 보면 소수가 항상 최상의 결과를 보여 주는 것은 아닙니다(참조Test4.java). 버전 1.4 이후의 일부 Map(예: HashMap과 LinkedHashMap (Hashtable과 IdentityHashMap은 제외))은 2n의 용량을 필요로 하는 해시 함수를 사용하지만, 이러한 Map은 결과값에 가장 근사한 2n 값을 자동으로 계산하므로, 별도의 계산 작업이 불필요합니다.
로드 팩터는 시간과 공간의 조율을 위한 변수입니다. 로드 팩터가 작으면 공간을 더 많이 차지하지만 충돌의 가능성이 적어지므로, 액세스/업데이트가 빨라집니다. 0.75 이상의 로드 팩터는 일반적으로 권장되지 않으며, 로드 팩터 1.0은 최소한 하나 이상의 충돌 가능성을 담보합니다. 로드 팩터가 0.50 이하로 내려가면 그 효과는 점차적으로 약해지지만, 맵 사이즈를 효과적으로 관리하는 이상 작은 로드 팩터가 (메모리 비용을 제외하고) 성능에 부정적인 영향을 미칠 가능성은 없습니다. 하지만 Map의 사이즈를 충분히 크게 설정해 놓지 않은 상태라면, 로드 팩터가 작으면 작을 수록 리사이즈가 더욱 빈번하게 발생하고 성능 저하 현상으로 연결될 수 있습니다.
적절한 맵의 선택
그렇다면 어떤 맵을 사용해야 할까요? 동기화가 필요할까요, 그렇지 않을까요? 애플리케이션의 최적화된 성능을 보장하기 위해 가장 중요한 두 가지 고려사항이 바로 이 두 가지입니다. 범용 Map을 사용하는 경우에는 맵 사이즈와 로드 팩터의 두 가지 튜닝 옵션만으로 대부분의 문제를 해결할 수 있습니다.
최적의 Map 성능을 얻기 위한 방법이 아래와 같습니다.
- 모든 Map 변수를 Map으로 선언합니다(다시 말해, HashMap, Hashtable과 같은 다른 Map 클래스를 사용하지 않습니다.)
Map criticalMap = new HashMap(); //GOOD
HashMap criticalMap = new HashMap(); //BAD
이와 같이 선선하면 코드의 한 라인만 수정함으로써 특정 Map 인스턴스를 쉽게 대체할 수 있습니다.
- Doug Lea의 util.concurrent 패키지를 다운로드합니다. (http://gee.cs.oswego.edu/dl/classes/EDU/oswego/cs/dl/util/concurrent/intro.html) ConcurrentHashMap을 디폴트 Map으로 사용합니다. 1.5 릴리즈로 이전하는 경우, 디폴트Map을 java.util.concurrent.ConcurrentHashMap으로 변경합니다. 멀티-쓰레드 환경이라 하더라도 Synchronized wrapper를 이용하여 ConcurrentHashMap을 래핑하지 않습니다. 디폴트 사이즈와 로드 팩터를 그대로 사용합니다.
- 애플리케이션 프로파일링을 수행합니다. Map이 성능 병목으로 작용하는 경우, 그 원인을 분석하고 Map 클래스, Map 사이즈, 로드 팩터, 키 오브젝트 equals() 메소드 등에 관련한 설정 변경을 시도합니다. 범용적이지 않은 특수 목적의 Map 활용 시에는 예외 없이 특수 목적의 커스텀 Map 구현 방식이 필요하지만, 그렇지 않은 경우라면 범용적인 Map을 이용하여 원하는 성능 목표를 달성할 수 있을 것입니다.
맵의 선택
어쩌면 여러분들은 좀 더 복잡한 설명을 기대하고 있을지도 모르겠습니다. 조금 여유를 갖고 접근해 봅시다. 먼저, 어떤 Map을 사용해야 할까요? 그 답은 매우 간단합니다. 특정 Map 유형을 필요로 하는 실질적인 설계 요구사항이 도출되기 전까지는 Map을 선택하지 않습니다. 구체적인 Map 구현 방식은 일반적으로 설계 단계에서 결정되지 않습니다. Map이 필요하다는 사실은 알더라도, 어떤 Map이 필요한지는 모를 수 있습니다. Map 인터페이스가 필요한 이유가 바로 여기에 있습니다. 필요한 시점까지 Map 구현 방식의 결정을 미루는 것이 좋습니다. 또 “Map” 선언 변수를 올바르게 활용하였다면, 라인 하나만 변경함으로써 특정 Map의 구현 방식을 변경할 수 있을 것입니다. 이것은 매우 적은 비용을 수반하는 튜닝 방법입니다. 그렇다면 디폴트 Map 구현 방식은 무엇을 선택해야 할까요? 여기에 대해서는 곧 설명하겠습니다.
맵의 동기화
그렇다면 동기화 여부는 어떻게 결정할 수 있을까요? (동기화를 위해서는 synchronized Map을 사용하거나 Collections.synchronizedMap()을 이용하여 unsynchronized Map dmf synchronized Map으로 변환해야 합니다. 두 번째 테크닉에서는 “synchronized wrapper”가 사용됩니다.) 이것은 매우 복잡한 문제입니다. Map이 멀티-쓰레드 동시 액세스/업데이트를 위해 사용될 것인지의 여부를 고려해야 하며, 이와 별도로 유지보수에 관련한 고려가 필요합니다. 예를 들어, 동시 업데이트를 고려하지 않고 Map을 시작하였다가, 나중에 동시 업데이트가 필요해지는 경우를 고려해 봅시다. 이러한 상황이라면, unsynchronized Map으로 시작하였다가 나중에 애플리케이션에 동시 업데이트 쓰레드를 추가하는 시점에 synchronized로 변경하는 방법을 사용할 가능성이 매우 높습니다. 이러한 작업은 애플리케이션의 손상을 초래하며, 이러한 형태의 버그는 그 원인을 확인하고 추적하기가 가장 어렵습니다.
하지만 디폴트로 synchronized Map을 선택하고 멀티-쓰레드 애플리케이션의 실행을 순차화(serialize)하는 경우에는 심각한 성능 저하를 경험하게 됩니다. 해답을 찾기는 무척 어려운 것처럼만 보입니다.
Doug Lea는 뉴욕 주립대학의 컴퓨터 과학 교수입니다. 그는 util.concurrent라 통칭되는 몇 가지 퍼블릭 도메인 패키지를 생성하였으며, 이 패키지에는 고성능 동시 접속 프로그램을 단순화하기 위한 여러 가지 유틸리티 클래스가 포함되어 있습니다. 이 클래스에 포함된 두 가지 Map으로 ConcurrentReaderHashMap과 ConcurrentHashMap이 있습니다. 이 Map 구현방식은 쓰레드로부터 안전(thread-safe)하며, 동시 액세스/업데이트를 위해 동기화를 요구하지 않을 뿐 아니라, Map을 필요로 하는 대부분의 상황에서 유용하게 활용됩니다. 또 이 Map들은 Hashtable과 같은 synchronized Map이나 synchronized wrapper를 사용하는 방식보다 훨씬 더 뛰어난 확장성을 제공하며, HashMap과 비교했을 때의 성능적인 손실은 매우 적은 수준입니다. utl.concurrent 패키지는 1.5 Java 릴리즈를 위한 동시성 유틸리티의 개발을 추진해 온 JSR166의 기반을 이루고 있으며, 1.5 릴리즈는 이 Map을 새로운 java.util.concurrent 패키지에 포함하게 될 것입니다.
결론적으로 synchronized/unsynchronized Map을 선택하기 위해 복잡한 결정 과정을 거칠 필요는 없으며, ConcurrentHashMap을 사용하기만 하면 됩니다. 물론 ConcurrentHashMap이 적합하지 않은 경우도 있을 수 있습니다. 하지만 이러한 경우의 가능성은 극히 적으며 각 케이스 별로 별도로 해결하는 것이 바람직합니다.
저자 - Jack Shirazi
출처 한국오라클
파일 다운로드에 관하여 여러모로 고민하다가 기본의 Struts내에서 지원하는 DownloadAction 클래스를 상속하여 Streaminfo를 받아오는 방식을 포기하고 직접 새로운 DownloadFile 메소드를 짜보았습니다. 직접 적용하여 쓰시려면 필히 DownFileException 예외클래스를 만들어주시고 MessageResource.properties속에 해당 키를 설정해주어야 합니다. 기존의 파일이 존재하지않으면(즉 파일 사이즈가 0 바이트) DownFileException을 만들어서 에러페이지로 포워딩 하는 방법을 사용하였습니다. 다양하게 스크립트를 띠우거나 다른 방식을 취하셔도 좋습니다.^^
참고로 파일 명이 깨지는 문제를 해결하기 위하여 DownloadFileAction에서 아래와 같이 미리 파일명을 처리해주었습니다.
logicalFileName = URLEncoder.encode(logicalFileName,"UTF-8");
public static void DownloadFile(HttpServletRequest request,
HttpServletResponse response, String filePath, int maxFileSize,
String physicalFileName, String logicalFileName) throws Exception {
File file = new File(filePath + physicalFileName); // Realpath of
// file...
// Primary check for whether the selected file is existed...
if (file.length() == 0) {
DownFileException dfe = new DownFileException();
dfe.setMessageKey("error.board.nonexist.files.error");
throw dfe;
}
response.setContentType("application/octet-stream");
String Agent = request.getHeader("USER-AGENT");
if (Agent.indexOf("MSIE") >= 0) {
int i = Agent.indexOf('M', 2);
String IEV = Agent.substring(i + 5, i + 8);
if (IEV.equalsIgnoreCase("5.5")) {
response.setHeader("Content-Disposition", "filename="
+ logicalFileName);
} else {
response.setHeader("Content-Disposition",
"attachment;filename=" + logicalFileName);
}
} else {
response.setHeader("Content-Disposition", "attachment;filename="
+ logicalFileName);
}
byte b[] = new byte[maxFileSize * 1024 * 1024];
if (file.exists()) {
try {
BufferedInputStream fin = new BufferedInputStream(
new FileInputStream(file));
BufferedOutputStream outs = new BufferedOutputStream(response
.getOutputStream());
int read = 0;
while ((read = fin.read(b)) != -1) {
outs.write(b, 0, read);
}
outs.flush();
outs.close();
fin.close();
} catch (Exception e) {
}
}
}
POI HSLF
Java API To Access Microsoft Powerpoint Format Files
1. POI API Document
http://jakarta.apache.org/poi/apidocs/index.html
2. POI Download
http://www.apache.org/dyn/closer.cgi/jakarta/poi/
3. 간단한 텍스트 읽기
4. 테스트버젼
PPT 2000
POI HWPF
Java API to Handle Microsoft Word File
1. POI API Document
http://jakarta.apache.org/poi/apidocs/index.html
2. POI Download
http://www.apache.org/dyn/closer.cgi/jakarta/poi/
3. 간단한 텍스트 읽기
4. MS Word 테스트 버젼
MS워드 2000, MS워드 2003
=============================================
본문서는 자유롭게 배포/복사 할수 있지만
이문서의 저자에 대한 언급을 삭제하시면 안됩니다
저자 : GoodBug (unicorn@jakartaproject.com)
최초 : http://www.jakartaproject.com
=============================================
Validator 속성
|
depends속성에 따른 파라미터
|
예제
Commons-Fileupload 1.2
1.2 버젼이 2007.2.13에 새롭게배포되었습니다
1.1 이하단계 버젼과 달라진 점을 알아보도록 하지요
I. commons-fileupload 1.1
http://www.jakartaproject.com/article/jakarta/110887666654000
II. 다운로드 및 설치
-. fileupload는 commons의 io가 필요합니다
① commons-fileupload
http://jakarta.apache.org/site/downloads/downloads_commons-fileupload.cgi
② commons-io
http://jakarta.apache.org/site/downloads/downloads_commons-io.cgi
III. 달라진점
-. DiskFileUpload 가 Deprecated 되었습니다
-. 리스너 추가를 통해 업로드 진행 상태를 파악할 수 있습니다(대용량 파일인 경우 유용)
-. 비정상적인 업로드시 나타나는 중간 쓰레기 파일들을 제거할 수 있습니다
IV. 예제소스코드
upload.html
web.xml
가비지 파일 cleaner에 사용되는 FileCleanerCleanup을 listener로 추가
샘플 코드에서 사용되는 서블릿 등록
UploadServlet.java
V. 실행결과
큰 파일을 업로드한 경우 업로드 상태 출력
=============================================
본문서는 자유롭게 배포/복사 할수 있지만
이문서의 저자에 대한 언급을 삭제하시면 안됩니다
저자 : GoodBug (unicorn@jakartaproject.com)
최초 : http://www.jakartaproject.com
=============================================
DBUtils에서 number 타입의 컬럼이 int형으로 안넘어올때..
데이터베이스의 컬럼이 NUMBER 타입인데 VO객체의 int형 setter를 통해 그 값이 안넘어 오는 경우가 있습니다
데이터베이스 테이블 스크립트
데이터베이스의 값을 저장하는 VO 객체
JSP
간단히 위와 같이 코딩을 하면 다음과 같은 에러 메세지가 납니다
java.sql.SQLException Cannot set user_point : argument type mismatch Query
user_point 컬럼이랑 먼지 모르지만 아규먼트랑 type이 맞지 않는다는 말 같군요
DBUtils 받아서 차근차근 소스를 보다보니..
org.apache.commons.dbutils.BasicRowProcessor.java
① 의 setter.invoke 에서 IllegalArgumentException 가 throw 되고 있었습니다
즉 값에 해당하는 setter 함수를 찾다가 setUser_point(int user_point) 가 있음에도 불고하고 적당한 것이 없어서 Exception을 던지고 있는 실정입니다
원인은 value 때문이었는데, 이는
value = rs.getObject(i+1)
와 같이 resultset에서 받아온 값입니다
invoke 함수에 두번째 파라미터로 Object형태의 객체형태로 넘겨주어야 하는데 이넘은 Integer형이 아닌것 같았습니다
Integer.class.isInstance(value) 로 값을 찍어보니 역시나 false가 리턴되었습니다
그래서 다음과 같이 약간 수정하였습니다
② 과 같이 명시적으로 Integer 타입일때 Integer형태를 만들어 주었습니다
MySQL과 Oracle 두가지 테스트해보았는데, MySQL에서는 발생하지 않았지만 Oracle에서는 위와같은 문제가 발견되었습니다
아마도 M$SQL에서도 동일한 문제가 발생할것 같습니다
소스는 동일한데 어디선 되고 안되고를 보니 JDBC영향일것으로 추측이 되는데, JDBC 소스를 보아도 별 특별한데는 아직 찾지 못했습니다
사실 DBUtils는 잘쓰면 무척 편합니다
하지만 많이 좋아졌다고는 하나 reflect에 대한 비용 없잖아 들겁니다
DBUtils는 그 자체로 괜찮지만 아마 사용하다보면 소스에 손을 데야될겁니다
한글 인코딩, 디코딩이나 쿼리등을 DBUtils에 심어놓으면 코딩은 아마 더 줄어들겁니다
Installing Tomcat with commons-daemon (jsvc)
Most installation that I've seen of Tomcat is made with tomcat running as root. This could potentially be a disasters security hole. Most Linux systems only allow the root to listen to port 80...which is why many users of tomcat under Linux run tomcat as root. With jscv, the process will start off as root but later on will change owner to a user of your choice.
Installation
Create the user to run tomcat under with
This will create a directory under
Download and install tomcat under /usr/tomcat. This is how my tomcat directory looks like
Compile the jscv code by following the instructions on http://tomcat.apache.org/tomcat-5.0-doc/setup.html
Run As Service
Tomcat 5.x ship with a tomcat service file which you can use and modify. However, it's written to be used with Java 1.4. To use it with Java 1.5 you need to tweak it some more or use the following file. Please note the items in red. Tomcat user and the JDK path which you must update to fit your system. Also make sure the DAEMON_HOME executable is in the right place.
Start and Stop
To start tomcat, use (on redhat)
To stop
from http://waelchatila.com/2005/12/13/1134504717808.html
commons의 daemon을 이용해서 일반유저로 톰캣을 80포트로 올리는 법입니다
이전에 jsvc가 이미 make 되어 있어야 합니다
DbUtils 몇가지 예제
DBUtils 기본은 다음 링크를 참조하세요
http://www.jakartaproject.com/article/jakarta/1108193481660
① 설정방법
DB유틸 설정 방법은 특별히 없습니다 그냥 다운받은 클래스 패스 잡으시면 됩니다
Application에서 사용시에는 환경변수나 실행시 클래스 패스를 잡으면 되고요,
웹에서 사용한다면 해당 어플리케이션의 /WEB-INF/lib/ 에 commons-beanutils.jar 를 복사하면 됩니다
기본적인 문서는 http://www.jakartaproject.com/article/jakarta/1108193481660 를 보세요
Download http://jakarta.apache.org/site/downloads/downloads_commons-dbutils.cgi
API http://jakarta.apache.org/commons/dbutils/apidocs/index.html
② SELECT 예제 (여러건)
③ SELECT 예제 (한건)
select 처리 건수가 1건일 경우에는 MapHandler를 사용하면 됩니다
핸들러에는 아래와 같이 여러 종류의 핸들러 들이 있으며,
ArrayHandler, ArrayListHandler, BeanHandler, BeanListHandler, ColumnListHandler, KeyedHandler, MapHandler, MapListHandler, ScalarHandler
그때그때 맞춰 사용하면 됩니다
④ UPDATE 예제
이 예제는 Unicorn 소스에 있는 예입니다
Unicorn 소스를 다운받아 /src/com/jakartaproject/admin/dao/AdminMySqlDAO.java 를 열어 보시면 Update, Insert 예제를 볼수 있습니다
Jakarta Commons Net 에서 FTP 사용시 목록이 안보일 경우
Jakarta Commons Net 기본 http://www.jakartaproject.com/article/jakarta/1113911351166
Commons net API http://jakarta.apache.org/commons/net/apidocs/index.html
Commons net http://jakarta.apache.org/commons/net/
ⓐ 조회 권한이 없는 경우
로그인한 유저의 권한이 적당한지 체크해 본다
또는 텔넷을 통해 해당 유저로 ftp 테스트를 해 본다
ⓑ Passive mode를 사용해 본다
from http://www.javaservice.net/~java/bbs/read.cgi?m=resource&b=qna2&c=r_p&n=1131692449&p=1&s=t
제목 : POI로 엑셀파일 읽을때, Invalid header signature 에러 글쓴이: 손님(guest) 2005/11/11 11:37:30 조회수:20 줄수:44 |
poi를 이용하여 클라이언트의 엑셀문서를 서버에 업로드후 읽어내는 작업을 하려합니다. 작업의 목적은 화면상에 입력필드가 너무 많아서(대략 240여개 정도 됩니다), 일일이 입력하기에 불편함이 초래되어,엑셀로 다운받은 다음에 해당 입력값들을 엑셀에서 입력후, 입력한 값을 다시 화면상에 뿌려주려는 것입니다. 업로드 완료후 엑셀파일을 읽을때, Error occurred : Invalid header signature; read 5789751444030890300, expected -2226271756974174256 java.io.IOException: Invalid header signature; read 5789751444030890300, expected -2226271756974174256 at org.apache.poi.poifs.storage.HeaderBlockReader.<init>(HeaderBlockReader.java:88) at org.apache.poi.poifs.filesystem.POIFSFileSystem.<init>(POIFSFileSystem.java:83)....... 위와 같은 에러가 발생합니다.해당 라인을 쫓아가보면, POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(filePath + fileName)); 이부분입니다. 읽으려 하는 엑셀은 jsp내에서, response.setContentType("application/vnd.ms-excel;charset=euc-kr"); response.setHeader("Content-Disposition", "attachment; filename="+jspName+".xls"); response.setHeader("Content-Description", "JSP Generated Data"); 을 이용해서 생성한것입니다.해당 엑셀파일을 일반 텍스트 에디터에서 열어보면, <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"> <head> <meta http-equiv=Content-Type content="text/html; charset=ks_c_5601-1987"> <meta name=ProgId content=Excel.Sheet> (이하 생략) meta 태그내의 'content="text/html;' 부분이 의심이 갑니다만. 엑셀을 생성하는 jsp내의 meta 태그부분을 삭제해도,생성된 엑셀을 보면 해당부분이 들어가있는데요. 다시 처음으로 와서,content='text/html' 부분때문에 Invalid header signature...의 오류가 발생하는것인지요? jsp에서 생성된 엑셀이 아닌 일반 엑셀문서로 테스트 해봤을때는 이상없이 제대로 실행됩니다. 제가 의심한 부분이 맞는것이라면, 해결책은 어떤것이 있을런지 조언 부탁드립니다. |
제목 : Re: 실제 엑셀파일이 아니라서 그런거 같습니다. 글쓴이: 손님(guest) 2005/11/11 16:00:49 조회수:7 줄수:16 |
Invalid Header라는 에러메시지의 의미가 파일 헤더가 엑셀타입이 아니라서 그런거 같습니다. POI가 해석하는 엑셀파일은 MS OLE Compound로 생성된 파일포맷일 경우에만 해당됩니다..html의 header를 excel이라 조작해서 생성된 엑셀파일은 실제론 텍스트파일일뿐 OLE 타입이 아니라서요. 서버에서 생성시 jsp로 생성하지 말고 poi를 이용해서 서버측에 실제 엑셀파일을 생성한 후 클라이언트로 스트리밍을 통해 다운로드 해주는 방식을 택해야할 것같네요. |
제목 : Re: 답변 고맙습니다. 글쓴이: 손님(guest) 2005/11/11 16:31:58 조회수:2 줄수:5 |
그렇군요. 실제로 jsp내에서 생성되는 엑셀을 다른이름으로 저장해서 'Micrisoft Excel 통합문서' 형식으로 저장하니, 정상적으로 실행이 되는군요. 충고해주신데로, poi를 이용해서 엑셀을 생성하는 쪽으로 다시 해봐야겠습니다. 답변 고맙습니다.좋은 주말 되세요. |
JSP에서 원하는 Appender 선택하여 쓰기
만약 log4j 가 처음이라면 다음 링크를 먼저 필독하세요
log4j 웹에서 사용하기
http://www.jakartaproject.com/article/jakarta/1110438405982
log4j 고급스럽게 사용하기
http://www.jakartaproject.com/article/jakarta/1113816023183
I. 먼저 log4j 프로퍼티 파일입니다
log4j.properties
log4j.logger.jsp1=INFO, stdout1
log4j.logger.jsp2=INFO, stdout2
jsp1과 jsp2의 두개의 logger를 정의합니다
jsp1 logger는 appender로 stdout1을 사용하며, jsp2 logger는 appender로 stdout2로 사용한다는 의미입니다
log4j.additivity.jsp1=false
additivity 속성은 jsp1 logger를 상위 로거(root logger)의 속성을 삭송받지 않겠다는 의미입니다
만약 이 속성이 없으면 동일한 메세지가 여러번 로깅될 것입니다
이하 속성은
http://www.jakartaproject.com/article/jakarta/1110438405982 을 참고하세요
II. JSP 샘플 소스
test_jsp1_appender.jsp
로깅 메세지
test_jsp2_appender.jsp
로깅 메세지
=============================================
본문서는 자유롭게 배포/복사 할수 있지만
이문서의 저자에 대한 언급을 삭제하시면 안됩니다
저자 : GoodBug (unicorn@jakartaproject.com)
최초 : http://www.jakartaproject.com
=============================================
Jakarta Commons Email
I. Commons-Email
2005년 9월 27일 드디어 Commons-Email이 version 1.0이 배포되었습니다
Commons-Email은 Java Mail API를 근간으로 좀더 심플하게 메일을 보내는 방안을 제시합니다.
기능상으로는 첨부파일 뿐만 아니라 HTML Email도 쉽게 보낼수 있는 API를 제공합니다
II. Download!
Commons-Email을 사용하기 위해서는 JavaMail의 mail.jar와 JAF의 activation.jar 가 필요합니다
Commons-Email download
http://jakarta.apache.org/site/downloads/downloads_commons-email.cgi
JavaMail 1.3
http://java.sun.com/products/javamail/downloads/index.html
JAF 1.0.2
http://java.sun.com/products/javabeans/glasgow/jaf.html
Commons-Email
http://jakarta.apache.org/commons/email/index.html
Commons-Email API
http://jakarta.apache.org/commons/email/apidocs/index.html
III. Install
다운 받은 3개의 파일을 $tomcat_home/webapps/ROOT/WEB-INF/lib/ 밑에 복사합니다
IV. 샘플 소스
① 간단히 텍스트만 보내기
org.apache.commons.mail.SimpleEmail 은 가장 중심이 되는 org.apache.commons.mail.Email을 상속받아 setMsg(java.lang.String msg)만을 구현한 가장 기본적인 클래스입니다.
setHostName(java.lang.String aHostName)으로 SMTP 서버를 지정하고,
addTo(java.lang.String email) or addTo(java.lang.String email, java.lang.String name)으로 받는 사람의 메일주소를, setFrom(java.lang.String email) or setFrom(java.lang.String email, java.lang.String name)으로 보내는 사람의 메일을 설정합니다
물론 addTo 함수의 추가로 여러 사람에게 메일을 보낼 수 있습니다.
가장 기본적인 setSubject(java.lang.String subject)와 setMsg(java.lang.String msg)로 메일 제목과 내용을 입력한 후 send() 함수로 전송합니다
② 파일 첨부하기
첨부파일과 같이 보낼려면 EmailAttachment 를 생성하여 파일 정보를 입력해 줍니다
파일경로와 파일형태, 파일 설명등을 추가하며 마지막으로 setName(java.lang.String name)을 통해 첨부되는 파일명을 설정합니다
그 후 MultiPartEmail 을 통해 SimpleEmail 처럼 기본 메일정보를 설정합니다
마지막으로 MultiPartEmail의 attach() 함수를 통해 첨부 파일을 추가하여 전송합니다
만약 첨부파일이 두개 이상이라면 EmailAttachment 를 여러개 생성하여 파일 정보를 설정 한 후 attach()를 통해 추가해 주기만 하면 됩니다
③ URL을 통해 첨부하기
파일 경로 정보를 setURL(java.net.URL) 으로 설정할 뿐 위의 첨부파일과 동일합니다
④ HTML 이메일 보내기
HtmlEmail 클래스는 setHtmlMsg()로 작성된 html을 보낼 수 있습니다
이미지 처리가 조금 까탈스럽네요
V. 인증처리
만약 SMTP 서버가 인증을 요구한다면 org.apache.commons.mail.Email 의 setAuthentication(java.lang.String username, java.lang.String password)를 통해 해결할 수 있습니다
이 함수는 JavaMail API의 DefaultAuthenticator 클래스를 생성하여 사용합니다
=============================================
본문서는 자유롭게 배포/복사 할수 있지만
이문서의 저자에 대한 언급을 삭제하시면 안됩니다
저자 : GoodBug (unicorn@jakartaproject.com)
최초 : http://www.jakartaproject.com
=============================================
Jakarta POI
X. 이미지
POI 3.0 부터 드디어 이미지를 지원하는군요.
아직 알파버젼이구요 http://www.apache.org/dyn/closer.cgi/jakarta/poi/ 에서 최신버젼을 다운 받을 수 있습니다
최신링크
http://mirror.apache.or.kr/jakarta/poi/dev/bin/poi-bin-3.0-alpha1-20050704.zip
아래 소스는 OKJSP의 "이루"님이 작성한 소스입니다
from http://www.okjsp.pe.kr/bbs?act=VIEW&seq=60543&bbs=bbs4&keyfield=content&keyword=&pg=0
Jakarta Ant
-. 이번 강좌에서는 지난 시간에 이어 ant 사용에 필수적인 task들에 대해 알아보고
예제를 통해 한번더 알아보도록 하겠습니다.
만약 지난 강좌를 아직 보지 않았다면 다음 링크를 참조하세요
http://www.jakartaproject.com/article/jakarta/1114617006525
I. 집합 태그
1. <fileset>
①개요
-. fileset이란 말 그대로 파일의 집합을 말하며 특정 태스크에서 파일을 포함하여야 할때
손쉽게 특정 파일이나 집합을 지정해 주는데 사용된다
주로 클래스패스나, 압축, 파일 카피등의 task에서 사용되어진다
②예제
사용예제-1
모든 디렉토리의 java파일을 포함시키면서 파일이름중 Test가 들어가는 파일은 제외하는 fileset을 나타낸다
위 세가지 fileset은 같은 의미이다
사용예제-2
","를 사용하여 나타낼 수도 있고 다로 분리하여 tag를 사용할 수도 있다
위 두 fileset은 같은 의미이다
③ 속성
속성 | 설명 | 필수여부 |
dir | 파일집합의 최상위 디렉토리 (루트 디렉토리) | dir나 file둘중 하나는 필수 |
file | 특정 하나의 파일을 지정할때 사용 | |
defaultexcludes | default excludes 에 명시된 파일 및 디렉토리를 자동적으로 제외하는 속성이며 이기능을 사용하려면 생략한다. 혹은 yes/no 로 값을 준다 | No |
includes | 컴마나 스페이스로 구분된 파일의 패턴을 포함하는 속성이며 모든 파일을 사용하려면 생략한다 | No |
includesfile | 특정 각각의 파일을 포함할때 사용하는 속성 | No |
excludes | 컴마나 스페이스로 구분된 파일의 패턴을 제외하는 속성이며 생략하면 default excludes를 제외하고 어떠한 파일도 제외하지 않는다 | No |
excludesfile | 특정 각각의 파일을 제외할때 사용하는 속성 | No |
casesensitive | 패턴의 대소문자를 구분할지 여부를 나타내는 속성으로 기본값은 true이다 | No |
followsymlinks | symbolic links를 허용할지 여부를 나타내며 기본값은 true이다 | No |
excludes를 사용하지 않아도 기본적으로 제외되는 파일 및 디렉토리
자 이정도면 fileset은 이제 빠~삭해 지셨겠죠?
2. <dirset>
① 개요
-. fileset이 파일 집합을 나타냈다면 dirset task는 디렉토리의 집합을 나타낸다. 기본적인 속성은 fileset과 동일하다
차이점은 defaultexcludes가 없다
② 사용예제
apps 이하 디렉토리중 classes 디렉토리를 포함하고 apps 이하 디렉토리중 디렉토리 이름중 Test가 들어가는 디렉토리는 제외한 dirset을 의미한다
③ 속성
속성 | 설명 | 필수여부 |
dir | 파일집합의 최상위 디렉토리 (루트 디렉토리) | YES |
includes | 컴마나 스페이스로 구분된 디렉토리의 패턴을 포함하는 속성이며 모든 파일을 사용하려면 생략한다 | No |
includesfile | 특정 각각의 디렉토리를 포함할때 사용하는 속성 | No |
excludes | 컴마나 스페이스로 구분된 디렉토리의 패턴을 제외하는 속성이며 생략하면 어떠한 디렉토리도 제외하지 않는다 | No |
excludesfile | 특정 각각의 디렉토리를 제외할때 사용하는 속성 | No |
casesensitive | 패턴의 대소문자를 구분할지 여부를 나타내는 속성으로 기본값은 true이다 | No |
followsymlinks | symbolic links를 허용할지 여부를 나타내며 기본값은 true이다 | No |
3. <patternset>
① 개요
-. 여러 파일이나 디렉토리를 미리 그룹핑해 놓고 이를 특정 아이디를 통해 사용하는 방식을 제공한다. 즉 워드의 매크로 같은 기능이라 보면 쉽게 이해가 갑니다
② 사용예제
예제를 보는바와 같이 patternset은 여러곳에서 동일한 패턴을 사용할때 이를 미리 정의해 놓고 지정한 id의 값을 refid를 통해 재사용 할 수 있다
paternset을 사용하면 코딩양을 줄일 수 있고 변동사항이 있으면 손쉽게 변동 할 수 있다는 점이다
③ 속성
속성 | 설명 | 필수여부 |
includes | 컴마나 스페이스로 구분된 디렉토리의 패턴을 포함하는 속성이며 모든 파일을 사용하려면 생략한다 | No |
includesfile | 특정 각각의 디렉토리를 포함할때 사용하는 속성 | No |
excludes | 컴마나 스페이스로 구분된 디렉토리의 패턴을 제외하는 속성이며 생략하면 어떠한 디렉토리도 제외하지 않는다 | No |
excludesfile | 특정 각각의 디렉토리를 제외할때 사용하는 속성 | No |
4. <path>
① 개요
-. 파일과 디렉토리를 함께 나타낼 수 있는 집합. 클래스패스에는 경로뿐만 아니라 *.jar 같은 파일이 같이 사용되듯이 이 path task는 주로 클래스패스로 자주 이용된다
fileset, dirset과 비슷하지만 파일과 디렉토리를 함께 나타낼 수 있다는 점에서 틀리다
path tag역시 patternset과 같이 지정된 id 값을 이용하여 여러 곳에서 재사용 할 수 있다.
② 사용예제
아래 예제는 ${basedir}/lib/struts.jar, ${base.dir}/lib/log4j.jar 그리고 ${base.dir}/classes 에 클래스패스를 잡는 예제이다.
path에 대한 정의를 해놓고 base.path라는 아이디를 이용하여 여러 곳에서 사용할 수 있다
location 속성은 single 파일이나 탐색할 하나의 디렉토리만을 설정할수 있는 반면에,
path는 ";"나 ":"를 사용하여 여러 파일들이나 디렉토리를 설정할 수 있다
II. 파일 태그
1. <copy>
① 개요
-. 소스 파일을 타겟으로 파일을 복사하는데 사용한다
② 사용예제
③ 속성
속성 | 설명 | 필수여부 |
file | 복사할 파일 | fileset tag를 사용하지 않는다면 필수 |
preservelastmodified |
소스와 타겟의 최종 수정날짜 파일을 유지하며 복사한다 기본값은 false |
No |
tofile | 복사할 소스파일 | fileset tag와 함께 소스 및 타겟을 지정할수있다 |
todir | 복사할 소스 디렉토리 | |
overwrite | 타겟의 파일이 최근의 파일이라도 덮어쓸지 여부를 나타내며 기본값은 false | No |
filtering |
복사하는동안 filter를 사용할것인지 여부를 나타내며 기본값은 false 단 이 값이 false일지라도 nested 하게 <filterset>을 사용할수 있다 |
No |
flatten |
소스 디렉토리의 구조를 무시하고 특정 디렉토리 한곳에 모든 파일을 복사할지 여부를 나타내며 기본값은 false |
No |
includeEmptyDirs |
<fileset>을 지정하여 복사될 디렉토리중에 파일이 없는 비어있는 디렉토리까지 복사할지 여부를 나타내며 기본값을 true |
No |
failonerror |
복사중 에러가 발생할때 false이면 warning 메세지 로그를, 그렇지 않으면 build시 중지한다 기본값은 true |
No |
verbose | 복사되고 있는 파일의 로그 여부를 나타내며 기본값은 false | No |
encoding |
필터 복사중 사용할 encoding을 나타내며 기본값은 JVM 기본 encoding을 따른다 (ant 1.5 이후) |
No |
outputencoding |
파일기록에 사용할 encoding을 나타낸다 (ant 1.6이후) |
No |
enablemultiplemappings |
true면 주어진 소스 path에대해 모든 mapping 처리를 하며 false이면 첫번째 파일이나 디렉토리에 대해서만 mapping 처리를 한다 이 속성은 <mapper> subelement가 있을때만 관련있다 기본값은 false (ant 1.6이후) |
No |
granularity |
최근 수정된 시간을 기준으로 파일을 비교 복사시 기준이 되는 시간으로부터 여유분 시간을 나타낸다 즉 소스 파일 서버와 타겟 파일 서버가 다른경우 두 머신간에 시간차이가 있을 수 있기 때문에 이를 사용한다 (ant 1.6.2 이후) |
2. <delete>
① 개요
-. 하나의 파일, 하나의 디렉토리 혹은 fileset으로 지정한 특정한 파일들을 삭제할수 있다
② 사용예제
③ 속성
속성 | 설명 | 필수사항 |
file |
삭제할 파일 (상대경로나 절대경로나 상관없음) |
<fileset>을 사용하지 않는다면 file혹은 dir둘중 하나는 사용하여야 한다 |
dir |
삭제할 디렉토리 | |
verbose |
각 삭제되는 파일의 이름을 보져줄 것인지 여부를 나타내며 기본값은 false |
No |
quiet |
시스템이 사용하고 있어 삭제할수 없는 파일이거나 존재하지 않는 파일, 디렉토리등의 메세지를 나태낼지 여부를 나타내며 기본값은 false |
No |
failonerror |
파일 삭제시 에러가 발생하면 build를 중단 하고 현재 사항을 레포팅해줄지 여부를 나타내며 기본값은 true |
No |
includeemptydirs | fileset을 사용할 때 빈 디렉토리empty directory)를 삭제할 것인지 여부를 나타내며 기본값은 false | No |
includes | Deprecated. Use <fileset> . |
No |
includesfile | Deprecated. Use <fileset> . |
No |
excludes | Deprecated. Use <fileset> . |
No |
excludesfile | Deprecated. Use <fileset> . |
No |
defaultexcludes |
Deprecated. Use 기본값은 true |
No |
deleteonexit |
파일 삭제시 실패했을때 JVM이 종료될 때 이 파일을 지우도록 할것인지 여부를 나타내며 기본값은 false (ant 1.6.2 이후) |
No |
3. <mkdir>
① 설명
-. 디렉토리를 생성
② 사용예제
③ 속성
속성 | 설명 | 필수여부 |
dir | 생성할 디렉토리 | Yes |
4. <move>
① 설명
-. 파일 혹은 디렉토리를 타겟으로 이동시킵니다 디폴트로 타겟에 이미 파일이 존재하면 덮어씁니다.
② 사용예제
③ 속성
-. delete 속성과 동일합니다
III. java 태그
1. <javac>
① 설명
-. 자바소스를 컴파일 하는 tag입니다
기본적으로 타겟에 특정 .java에 대해 .class 파일이 없거나 오래된 .class 파일이면 컴파일 대상입니다
② 사용예제
③ 속성
width=20%>속성 | 설명 | 필수여부 |
srcdir | 자바 소스가 위치한 디렉토리 |
Yes
|
destdir | 컴파일된 클래스파일이 위치할 디렉토리 | No |
includes | 컴마나 스페이스로 구분된 파일집합의 패턴을 포함하여 컴파일하며 모든 파일을 사용하려면 생략한다 | No |
includesfile | 각각 개개의 파일을 포함하여 컴파일 | No |
excludes | 컴마나 스페이스로 구분된 파일의 패턴을 제외하하여 컴파일하며 생략하면 어떠한 디렉토리도 제외하지 않는다 | No |
excludesfile | 각각 개개의 파일을 제외하여 컴파일 | No |
classpath | 사용할 클래스 패스 | No |
sourcepath |
사용할 소스패스이며 기본값은 srcdir 값이다 |
No |
bootclasspath | bootstrap 클래스 패스 | No |
classpathref | 참조를 통해 사용할 클래스 패스 (refid를 이용한 path 태그) | No |
sourcepathref | 참조를 통해 사용할 소스 패스 | No |
bootclasspathref | 참조를 통해 사용할 bootstrap 패스 | No |
extdirs | 사용할 extednsion이 위치한 경로 (${java_home}/lib/ext/를 말하는것 같음) | No |
encoding | 소스파일에 사용할 encoding (javac의 -encoding과 동일) | No |
nowarn |
컴파일시 -nowarn 옵션을 을 줄지 여부를 나타내며 기본값은 off 반대값은 on |
No |
debug | 컴파일시 debug 모드로 컴파일 하며 기본값은 off | No |
optimize | 컴파일시 optimize 옵션을 사용한다 기본값은 off | No |
deprecation | 컴파일시 deprecation 옵션을 사용한다 기본값은 off | No |
target | 특정 VM 버젼으로 컴파일 할수 있도록 한다 | No |
verbose |
컴파일시 그 내용을 화면에 출력한다 기본값은 no |
No |
depend |
이를 지원하는 컴파일러는 dependecy-tracking를 가능하게 한다 |
No |
includeAntRuntime |
ant run time library를 포함하여 컴파일하며 기본값은 yes |
No |
includeJavaRuntime |
VM이 실행될때의 run time library를 포함하여 컴파일하며 기본값은 no |
No |
fork | 외부의 JDK를 사용하여 컴파일 하며 기본값은 no | No |
executable |
fork를 yes로 하였을경우 javac가 실행될 경로를 나타내며 기본값으로는 ant에서 현재 사용중인 java version의 컴파일러를 나타낸다 |
No |
memoryInitialSize |
VM내에서 초기 메모리 사이즈를 설정하며 기본값은 VM에 설정된 기본값을 사용한다 |
No |
memoryMaximumSize | VM내에서 최대 메모리 사이즈를 설정 | No |
failonerror |
컴파일시 에러가 발생하였을 경우 계속 진행할지 여부를 나타내며 기본값은 true |
No |
source | -source 옵션을 이용하여 컴파일 한다 | No |
compiler |
사용할 컴파일러 설정 list |
No |
listfiles |
컴파일 되는 소스파일들을 list할지 여부를 나타내며 기본값은 no |
No |
tempdir |
ant가 사용하는 임시디렉토리 기본값은 java.io.tmpdir (ant 1.6이후) |
No |
2. <javadoc>
① 개요
-. 자바 소스 파일로 부터 javadoc API 문서를 생성한다
② 사용예제
③ 속성
속성 | 설명 | 사용범위 | 필수여부 |
sourcepath | 자바 소스 위치 | all | At least one of the three or nested <sourcepath> , <fileset> or <packageset> |
sourcepathref | 참조된 경로 아이디를 사용하여 소스위치를 지정 (path 의 refid를 사용) | all | |
sourcefiles | 컴마로 구분하여 소스 파일을 지정 | all | |
destdir | 결과물(java docs) 디렉토리를 지정 | all | Yes, unless a doclet has been specified. |
maxmemory |
javadoc VM에 할당할 최대 메모리 사이즈 |
all | No |
packagenames |
컴마로 구분된 패키지 파일 목록 ("*"로 끝나면 하위 패키지까지 모두 javadoc으로 처리한다) |
all | No |
packageList | 처리할 패키지를 포함하고있는 파일명 | all | No |
classpath | 사용할 클래스 패스 | all | No |
Bootclasspath |
사용할 bootstrap 클래스 패스 |
all | No |
classpathref | 참조된 경로 아이디를 사용하여 클래스 패스를 지정 (path 의 refid) | all | No |
bootclasspathref | 참조된 경로 아이디를 사용하여 bootstrap classpath를 지정 | all | No |
Extdirs | 설치된 extension 위치 | all | No |
Overview |
HTML 문서로부터 overview 문서를 읽어온다 |
all | No |
access |
Access mode를 지정한다
|
all | No |
Public | 생성된 문서에 public 클래스와 멤버만 보여준다 | all | No |
Protected | 생성된 문서에 protected/public 클래스와 멤버만 보여준다 | all | No |
Package | 생성된 문서에 package/protected/public 클래스와 멤버만 보여준다 | all | No |
Private | 생성된 문서에 모든 클래스와 멤버를 보여준다 | all | No |
Old | jdk 1.1 버젼으로 문서를 생성한다 | 1.2 | No |
Verbose | javadoc을 생성하는동안 메세지를 화면에 출력한다 | all | No |
Locale |
사용할 Locale 을 지정한다 (en_US, en_US_WIN, ko_KR) |
all | No |
Encoding | 소스파일 encoding 이름 | all | No |
Version | @version 단락을 포함한다 | all | No |
Use | 클래스와 패키지 사용법에 대한 페이지를 생성한다 | all | No |
Author | @author 단락을 포함한다 | all | No |
Splitindex | Split index into one file per letter | all | No |
Windowtitle | 생성된 문서의 브라우져 타이트을 지정한다 (텍스트) | all | No |
Doctitle |
패키지 인덱스 페이지에 대한 타이틀을 지정한다 (html 코드) |
all | No |
Header |
각페이지에대한 헤더부분을 지정한다 (html 코드) |
all | No |
Footer | 각페이지에대한 푸터부분을 지정한다 (html 코드) | all | No |
bottom | 각페이지에대한 버텀부분을 지정한다 (html 코드) | all | No |
link |
주어진 URL로 javadoc 출력물에 link를 생성한다 |
all | No |
linkoffline | Link to docs at <url> using package list at <url2> - separate the URLs by using a space character -- see also the nested link element. |
all | No |
group | 특정 패키지들에 대한 overview 페이지를 생성한다 | all | No |
nodeprecated | @deprecated 정보를 포함하지 않는다 | all | No |
nodeprecatedlist | deprecated 목록을 생성하지 않는다 | all | No |
notree | 클래스 하이라키를 생성하지 않는다 | all | No |
noindex | 인덱스를 생성하지 않는다 | all | No |
nohelp | 도움말 link를 생성하지 않는다 | all | No |
nonavbar | 네비게이션 바를 생성하지 않는다 | all | No |
serialwarn | @serial tag 대한 warning을 생성한다 | all | No |
helpfile | help 파일로 사용될 HTML 파일을 지정한다 | all | No |
stylesheetfile | CSS 로 사용할 파일을 지정한다 | all | No |
charset | 문서를 생성할때 사용될 charset을 지정한다 | all | No |
docencoding | 결과 파일(문서)에 사용될 encoding을 지정한다 | all | No |
doclet |
doclet을 시작하는 클래스 파일을 지정한다 |
all | No |
docletpath |
doclet 클래스 패스를 지정한다 |
all | No |
docletpathref | 참조 아이디값을 이용해 docletpath를 지정한다 | all | No |
additionalparam |
javadoc 명령에서 추가적인 파라미터를 추가하도록 한다 |
all | No |
failonerror |
에러 발생시 build 중단할지 여부를 나타낸다 |
all | No |
excludepackagenames | 문서를 생성하지 않을 패키지를 컴마로 구분하여 지정한다ment. | all | No |
defaultexcludes |
기본적으로 제외되는 목록을 사용할 것인지 여부를 나타낸다 |
all | No |
useexternalfile |
명령줄을 간단히하기위해 임시파일에 기록된 소스파일명을 지정한다 기본값은 No |
all | No |
source |
j2se 1.4 소스코드에 나타난 주장을 처리하도록 javadoc에서 설정한다 |
1.4+ | No |
linksource |
소스파일에 hyperlinks 생성한다 기본값은 No (ant 1.6이후) |
1.4+ | No |
breakiterator |
새로운 breakiterator 알고리즘을 사용한다 기본값은 No (ant 1.6이후) |
1.4+ | No |
noqualifier |
-noqualifier 옵션을 설정한다 (ant 1.6이후) |
1.4+ | No |
includenosourcepackages |
"true"이면 자바소스가 아닌 패키지된 html을 가지고 문서 생성이 한다 (ant 1.6.3이후) |
all | No (default is false ) |
executable |
실행될 javadoc 위치를 지정한다 (ant 1.6이후) |
all | No |
3. <war>
① 개요
-. 웹 어플리케이션 배포 파일인 war 파일을 생성해 준다
② 사용예제
③ 속성
속성 | 설명 | 필수여부 |
destfile | 생성될 WAR 파일 지정 | 둘중 하나는 필수 |
warfile | Deprecated | |
webxml | 사용할 deployment descriptor (WEB-INF/web.xml)를 지정 | Yes |
basedir | jar파일로 압축할 디렉토리를 지정한다 | No |
compress |
data를 압축할지 여부를 나타내며 기본값은 true이다 keepcompression 속성을 false로 했을지라도 이는 적용된다 |
No |
keepcompression |
이미 존재하는 파일 묶음에 대해 compress을 계속 유지할 것인지 여부를 나타내며 기본값은 fale 이다 (ant 1.6이후) |
No |
encoding |
압축될 파일명에 사용할 encoding을 지정한다 기본값은 UTF8 |
No |
filesonly |
Store only file entries 기본값은 false |
No |
includes | 지정된 컴마나 스페이스로 구분된 파일 패턴을 WAR에 포함하며 생략하면 모든 파일을 WAR한다 | No |
includesfile | 지정된 개개의 파일을 WAR에 포함한다 | No |
excludes | 지정된 컴마나 스페이스로 구분된 파일 패턴을 WAR에서 제외시키며 생략하면 어떠한 파일로 제외하지 않는다 | No |
excludesfile | 지정된 개개의 파일을 WAR에서 제외시킨다 | No |
defaultexcludes | 기본적으로 제외시키는 기능을 사용할것인지 여부를 나타낸다 | No |
manifest | 사용할 manifest 파일을 지정한다 | No |
update | 이미 존재하는 파일이라면 업데이트할지 덮어쓸지를 결정하며 기본값은 false이다 | No |
duplicate |
중복된 파일이 나타났을 때 "add"할지 "preserve"할지 혹은 "fail"할지를 지정하며 기본값은 "add"이다 |
No |
roundup |
파일 시간 비교시 파일 변경 시간을 다음 짝수 횟수의 초(seconds)에 반올림 할지 혹은 내림할지 여부를 나타낸다 기본값은 true |
No |
from http://ant.apache.org/manual/index.html
=============================================
본문서는 자유롭게 배포/복사 할수 있지만
이문서의 저자에 대한 언급을 삭제하시면 안됩니다
저자 : GoodBug (unicorn@jakartaproject.com)
최초 : http://www.jakartaproject.com
=============================================
I. Welcom to Lucene !
Lucene 은 자바로 구현된 고성능의 풀텍스트 검색엔진입니다
Lucene 이 제공하는 API를 사용하여 강력하고 유연한 검색기능을 어플리케이션에 손쉽게 추가할 수 있습니다
Lucene은 2005년 2월에 Apache top-level 로 등급이 상승하였고
서브 프로젝트인 Nutch 또한 2005년 6월에 Apache Incubator를 졸업하였습니다
Lucene는 다음 3가지 software를 포함하고 있습니다
이번 강좌에서는 Lucene java 함 뒤벼보고 웹에다 Lucene을 달아봅시다 ^^
강좌 진행 순서는 "데모I 프로그램(어플리 케이션) -> 데모II 프로그램(웹 어플리케이션) -> 데모II 프로그램 수정" 순으로 갑니다
ps. 한글검색이 가능하지만 한글 형태소 분석을 아직까지는 지원하지 않기 때문에
한글은 단순검색으로 만족해야 합니다.
하지만 영문은 기똥차게 잘됩니다
II. Download
lucene 다운로드
http://www.apache.org/dyn/closer.cgi/jakarta/lucene/binaries/
참고 사이트
http://lucene.apache.org/java/docs/api/index.html
http://lucene.apache.org/java/docs/index.html
http://today.java.net/pub/a/today/2003/11/07/QueryParserRules.html
http://www-128.ibm.com/developerworks/library/j-lucene/
http://www.onjava.com/pub/a/onjava/2003/03/05/lucene.html
III. 설치
그럼 이제 Lucene에 한번 빠져 봅시다~!
① 다운받은 lucene-1.4.3.zip 파일을 C:\에 압축을 풉니다
② 압축을 풀면 lucene-1.4.3.jar와 lucene-demos-1.4.3.jar 파일을 클래스 패스에 겁니다
"set" 명령으로 확인합니다
설치 끝 ~
IV. 데모I 실행하기
Lucene 데모에는 두가지 데모가 있습니다
하나는 일반적인 인덱싱, 및 검색이고 다른 하나는 웹에서 사용하기 위한 인덱싱 및 웹검색입니다
1) 데모I 실행
먼저 네이버나 야후같은 웹 검색엔진을 생각해 봅시다
수도없이 많은 문서들이 어떻게 해서 그렇게 빠릴 검색될까요?
바로 검색 전처리 작업을 하기 때문입니다
예를들어 간단하게 보자면 "love"라는 단어는 A문서, B문서, C문서에 포함되어 있다라는 정보를 미리 만들어 두는 것입니다
즉 인덱스를 만들어 두는 것이지요
그리고 웹로봇들이 문서를 수집해오면 추가된 문서들에 대해 하루에 몇번씩 배치작업으로 인덱스를 추가해 주겠지요
결과적으로 "love" 검색시 인덱스 정보를 뒤져서 A문서, B문서, C문서의 결과를 보여주는 겁니다
lucene도 마찬가지 입니다 인덱스를 먼저 만들어 주어야 합니다
먼저 일단 데모프로그램을 이용하여 인덱스를 만들어 보고 이를 이용하여 검색해 봅시다
내부 코딩은 일단 실행 이후에 살펴봅시다 ^_^ (눈에 먼저 보여야 멀 해도 잘되죵)
C:\lucene-1.4.3\src\ 는 데모을 위한 자바소스 파일입니다
① 인덱스 생성하기
다음 명령으로 인덱스를 생성해 봅시다
인덱스 생성 어플리케이션은 IndexFiles.java 이며 파라미터는 인덱스를 만들 소스파일들(검색대상파일들) 입니다
여기서는 lucene의 document를 index 처리해 보겠습니다
야호~ 인덱스가 생성되었습니다
C:\lucene-1.4.3\index 풀더를보면 다음 파일들이 생성된 것을 알수있습니다
② 검색하기
검색 어플리케이션은 SearchFiles.java 이며 실행 후 Query: 에 검색할 단어를 입력해 봅시다
와~ 성공! 엄청 빠릅니다!!
검색결과가 10개씩 리스팅되며 다음 리스트는 y버튼을 클릭하여 조회 할수 있습니다
2) 데모I 인덱싱 코드 분석
이 데모 프로그램은 가장 기본이 되는 프로그램으로 핵심 코딩만 되어 있으니 lucene을 사용하기 위해서는 꼭 알아 두어야 합니다
① Analyzer 선택
Analyer 는 문서를 인덱싱 하거나 검색할때 핵심이 되는 요소로서, 텍스트를 파싱할 때 사용합니다 Analyzer의 종류에는 다음 몇가지 들이 있습니다
② IndexWriter 생성
자 이제 Analyer를 선택했으면 IndexWriter를 생성하여 Index를 만들어봅시다
첫번째 파라미터는 index가 생성될 위치를 말하며
두번째 파라미터는 선택한 Analyzer를,
세번째 파라미터는 index를 초기화 하여 다시 생성할것인지 말것인지를 말합니다
즉 추가/삭제만 할 것인지(false) 새로 만들것인지(true)를 나타냅니다
문서가 많을경우 매번 새로 만들수 없으며,
또한 만약 몇개의 문서만 변경되었는데 모두 다시 인덱스를 만들수는 없기 때문입니다 (시간 상당히 걸림 --)
③ Index에 document 추가
다음으로 소스 디렉토리(검색대상 문서들)의 파일들을 읽어가며 Analyzer에 의해 파싱된 문서 정보를 인덱스에 추가합니다
④ index optimize
마지막으로 인덱싱한 정보를 하나의 파일로 merge 합니다
즉 검색에 적합하도록 파일을 하나로 합치는 겁니다
⑤ index close
사용후 받드시 close 합시다!
끝~ 간단하죠?
이제 전체 소스를 살펴봅시다
소스는 C:\lucene-1.4.3\src\demo\org\apache\lucene\demo 에 있습니다
org.apache.lucene.demo.IndexFiles.java
3) 데모I 검색 코드분석
검색은 인덱스를 만드는 코드보다 훨씬 쉽습니다
① IndexSearcher 생성
실질적으로 검색을 담당할 IndexSearcher를 생성해 봅시다
파라미터로는 index가 생성되어있는 위치를 입력합니다
② Query 생성
Query는 질의 문자열을 파싱해 줍니다 (즉 AND,OR,NOT,!,-등의 논리연산이나 와일드카드 *,?등을 파싱합니다)
첫번째 파라미터는 질의를,
두번째 파라미터는 검색 필드를,
세번째 파라미터는 인덱스를 만든 Analyzer와 동일한 Analyzer를 입력해 줘야 합니다
③ 검색 및 검색한 결과 저장
파싱된 쿼리를 가지고 검색하여 그 결과값을 반환 받습니다
반환된 Hits 클래스는 순위가 매겨진 문서들로 검색결과를 저장하고 유지합니다
④ IndexSearcher close
검색이 끝났으면 닫아줍시다
전체 소스를 살펴봅시다
org.apache.lucene.demo.SearchFiles.java
V. 질의 문법
질의 문법에 대해 알아봅시다
① A AND B
A와 B가 모두 포함된 문서를 검색한다
② A OR B
A혹은 B가 포함된 문서를 검색한다
③ A NOT B
A는 포함되고 B는 포함되지 않는 문서를 검색한다
A ! B, A - B와 동일하다
④ +A OR B
A OR B에서 A는 받드시 포함된 문서를 검색한다
⑤ A*
A로 시작하는 단어가 있는 문서를 검색한다
⑥ A?
A로 시작하는 두글자의 단어가 있는 문서를 검색한다
⑦ A~
A와 스펠링이 비슷한 글자를 지닌 단어가 있는 문서를 검색한다
⑧ (A OR B) AND C
논리연산의 그루핑 또한 지원한다
AND, OR, NOT등은 반드시 대문자로 입력해야 인식됩니다
다음 시간에는 두번째 데모 프로그램을 실행시켜 보고 lucene을 웹 어플리케이션에 달아 봅시다~
=============================================
본문서는 자유롭게 배포/복사 할수 있지만
이문서의 저자에 대한 언급을 삭제하시면 안됩니다
저자 : GoodBug (unicorn@jakartaproject.com)
최초 : http://www.jakartaproject.com
=============================================
Jakarta Ant
I. Ant 야 놀자~
Ant 란 "Java 기반의 빌드 도구입니다" 라고들 많이 나와있습니다
근데 이게 대체 무순 뜻이란 말인가 ㅡ.ㅡ;
쉽게 예기해서 환경에 구애받지 않고 간단히 java 소스를 컴파일 하고 필요한 파일이 있다면
그 파일들을 복사나 삭제하며 또한 javadoc 이나 war 같은 배포용 파일까지 생성해 주며
필요하다면 서버에 까지 바로 적용할 수 있도록 도와주는 도구입니다.
또한 여러팀원들이 프로젝트를 진행할 때 새로운 팀원이 참가하더라도
Ant 설정파일을 공유함으로써 손쉽게 참여가 가능하다는 것입니다
아직 사용해 보지 않았다면 얼렁 익혀서 사용해봅시다 무~지 편하답니다
II. 설치해보자
다운로드
Ant
http://ant.apache.org/bindownload.cgi
Ant manual
http://ant.apache.org/manual/index.html
http://ant.apache-korea.org/manual/index.html
다운받은 파일의 압축을 풀고 환경변수 및 패스를 잡아줍니다
set ANT_HOME=c:\ant
set JAVA_HOME=c:\jdk1.4.2
set PATH=%PATH%;%ANT_HOME%\bin
III. 간단한 Ant 예제
Ant를 이용하여 web application을 구성할 때 다음의 구조를 유지하기를 권장합니다
① build : src, web, docs에서 결과적으로 만들어진 산출물 디렉토리
② dist : build를 배포하기 위한 배포 디렉토리
③ docs : 배포판에 배포할 정적인 문서를 관리할 디렉토리
④ src : /WEB-INF/classes 에 위치할 java 소스 디렉토리
⑤ web : HTML, JSP, 이미지등의 컨텐트 디렉토리 (WEB-INF의 서브디렉토리 포함)
⑥ build.properties : build.xml에서 사용할 properties
⑦ build.xml : ant 명령으로 실행될 설정파일
src에 하나이상의 java 소스를 테스트로 넣어 놓으세요
자 이렇게 디렉토리를 설정하고 build.xml 을 다음 step에 따라 따라 해 BOA요 ^^&
STEP 1. build.xml 의 기본구조
xml을 기본적인 내용을 안다면 이해하기 쉽습니다
하나의 build 파일은 하나의 project로 구성되며 이는 다시 여러 target으로 구성됩니다
target 이란 빌드 과정중 수행해야 할 task들을 모아놓은 job 단위 라고 보면 됩니다
compile target이라 한다면 compile에 관련된 작업들을 모아놓은 그룹이라 생각하면 쉽게 이해 될겁니다
STEP 2. 시~작 Ant 맛보기~
① build.xml에 다음을 입력한 후 저장 합니다
-. project
project는 하나 이상의 target을 정의 합니다 또한 하나의 target은 task의 집합입니다
ant를 실행할 시에 어느 타겟을 실행할 것인지 지정할 수가 있으며 (예: \ant clear)
지정하지 않았을 경우 디폴트로 설정된 값이 사용됩니다 이부분이 default="clear"입니다
-. property
전역변수 설정 혹은 그렇게 사용할 build.properties를 정의 합니다
build.properties에 catalina.home을 정의하였으며 여러 환경이 변하더라도 이 값만
변경해주면 build.xml을 수정없이 바로 실행 가능합니다
-. echo
message 내용을 출력 합니다
-. target
target 이란 task의 집합으로 실질적으로 실행될 코드들의 묶음입니다
여기서는 아무 task도 없습니다
② build.properties에 다음을 입력 후 저장합니다
catalina.home 은 변수로 사용할 것이며 그 값은 C:\Tomcat 5.0입니다
③ 실행
해당 디렉토리로 이동하여 도스창에서 ant 라고 칩니다
STEP 3. 사전작업 하기~
이번 단계에서는 컴파일 하기전 전역변수 선언이나 컴파일 시 클래스 패스 설정을 해봅시다
① build.xml
-. project
이번에는 default 값을 prepare로 하였습니다 고로 target은 prepare가 실행될 것입니다
-. property
역시나 build.properties를 정의하였고 여러 전역변수를 설정하였습니다
build.home 이란 변수에는 ${basedir}/build 값이 정의되었으며
build.home은 ${build.home}으로 사용할수 있습니다
궁금하면 <echo message="${build.home}"/> 등으로 출력해 봅시다~
-. path
${catalina.home} 은 build.properties에서 정의하였다는것을 기역하실겁니다
fileset은 파일들의 집합을 나타내는데 어떤 특정파일만 포함 할수 있거나 혹은 어느 특정파일만 제외할 수 있습니다
특정파일만 포함하는것은 include 태그이며 그 반대는 exclude 입니다
<fileset dir="${web.home}/WEB-INF/lib">
<include name="*.jar"/>
</fileset>
이부분은 ${web.home}/WEB-INF/lib 에서 *.jar 파일만 클래스패스로 잡겠다는 의미입니다
-. target
드디어 실질적으로 실행될 target 입니다.
project 속성의 default가 prepare이므로 prepare target으로 실행하기 위해 가보니 depend 속성으로 "clean"이 설정되어 있습니다
이것은 "clean" target을 먼저 실행 후 prepare를 실행하라는 말입니다
즉 prepare는 clean이 실행조건 입니다
clean target은 delete 태그를 이용하여 배포할 dist 디렉토리와 산출물 디렉토리인 build를 삭제하는 작업입니다
prepare target으로 다시 와보면 mkdir 는 당연히 디렉토리를 만들라는 뜻입니다
copy는 todir에 다음 web.home의 모든 fileset을 copy 하라는 의미입니다 여기서도 역시나 include, exclude가 사용될 수 있겠지요
<include name="**/*.jsp"/> 는 모든디렉토리의 *.jsp 를 카피하라는 의미입니다
즉 web 디렉토리의 모든 실행 가능할 파일을 build로 옮기는 작업입니다
② 실행
STEP 4. 컴파일 하기
이제 컴파일할 모든 준비가 되었습니다
STEP2의 소스에 다음 target을 추가하고 project의 default 값을 compile로 수정한 후 실행해 봅시다
② 실행
STEP 5. Javadoc 을 이용해 API를 만들어 보고 배포파일도 생성해 보자
이제 컴파일도 했으니 javadoc도 만들어 보고 war 같은 배포파일도 생성해 봅시다
STEP 3.까지의 build.xml에 아래 target을 더 추가하고 project의 default 값에 dist로 설정합니다
① build.xml
-. target
target의 실행순서는 clean, prpare, compile, javadoc, dist가 될겁니다
javadoc target의 javadoc 태스트를 보면 java 소스가 있는 소스디렉토리와
API를 생성할 타겟 디렉토리를 정해주면 알아서 API를 생성해 줍니다
만들어진 API는 배포버젼의 dist디렉토리로 해주면 더 좋겠지요
dist target은 배포파일인 war를 만듭니다
필요한 문서가 있으면 docs 디렉토리를 만들어 로 복사도 하도록 합시다
jar 태스크는 위의 방식과 같이 사용합니다
② 실행
VI. Ant 실행
① C:\예제\ant -help
ant [options] [target [target2 [target3] ...]]
Options :
-help 이 메세지의 표시
-projecthelp 프로젝트 도움 정보의 출력
-version 버전 정보의 출력과 종료
-diagnostics diagnose 나 report 문제에 도움이 되는 정보의 출력.
-quiet, -q 한층 더 메세지를 적게
-verbose, -v 한층 더 메세지를 많게
-debug 디버그 정보의 출력
-emacs adornments 없이 로그 정보의 생성(produce)
-logfile <file> 로그를 지정 파일에 출력
-l <file> ''
-logger <classname> 로그 생성을 실행하기 위한 클래스
-listener <classname> 프로젝트 청취자(listener) 역할의 class의 인스턴스를 추가
-buildfile <file> 지정된 빌드 파일의 사용
-file <file> ''
-f <file> ''
-D<property>=<value> 지정된 프로퍼티의 값의 사용
-propertyfile <name> 모든 프로퍼티를 파일로부터 로드 (-D프로퍼티보다 전에)
-inputhandler <class> 입력 요청(requests)를 취급하는 클래스
-find <file> 파일시스템의 루트로 향해 빌드파일을 검색하고 그것을 사용
② C:\예제\ant
현재 디렉토리에 있는 build.xml
파일을 이용해, 디폴트 타겟으로 Ant 를 실행합니다.
③ C:\예제\ant compile
현재 디렉토리에 있는 build.xml이 실행되며 파라미터로 compile을 지정하면 project의 default 값을 무시하고 compile target을 실행합니다 물론 depends 가 있다면 먼저 실행합니다
④ C:\예제\ant -buildfile test.xml
현재 디렉토리에 있는 test.xml
파일을 이용해, 디폴트 타겟으로 Ant 를 실행합니다.
⑤ C:\예제\ant -buildfile test.xml dist
현재 디렉토리에 있는 test.xml
파일을 이용해, dist
라는 이름의 타겟으로 Ant 를 실행합니다.
⑥ C:\예제\ant -buildfile test.xml -Dbuild=build/classes dist
현재 디렉토리에 있는 test.xml
파일을 이용해, dist
라는 이름의 타겟으로, build
프로퍼티에 build/classes
값을 설정해 Ant 를 실행합니다.
VII. 기본 프로퍼티
Ant는 다음과 같은 프로퍼티를 기본으로 제공합니다
① basedir : 기본 디렉토리 경로를 나타내며 project 태그의 basedir에 명시되어 있습니다
② ant.file : 빌드 파일의 절대 경로입니다
③ ant.version : Ant 버젼을 나타냅니다
④ ant.project.name : project 태그의 name에 명시되어있습니다
⑤ ant.java.version : 자바 버젼을 나타냅니다
⑥ 자바 시스템 프로퍼티를 사용 가능 합니다
예) ${os.name} 참고 http://java.sun.com/j2se/1.4.2/docs/api/java/lang/System.html#getProperties()
<echo message="${ant.file}"/> 으로 한번 출력해 보면 이해가 쉽습니다
다음 시간에는 각 타스크의 종류와 상세 설정에 관해 알아봅시다
=============================================
본문서는 자유롭게 배포/복사 할수 있지만
이문서의 저자에 대한 언급을 삭제하시면 안됩니다
저자 : GoodBug (unicorn@jakartaproject.com)
최초 : http://www.jakartaproject.com
=============================================
Commons net
I. Commons net
Jakarta Commons의 net은 network utility collection입니다.
인터넷 프로토콜을 대부분지원하는 강력한 유틸리티로 사용이 쉽고 간결합니다.
클라이언트측의 기본적인 Internet protocol을 구현함으로서 고차원적인 abstract가 아닌 기본적인 프로토콜 access가 목적이기 때문에 부분적으로 object-orient 규칙에 위배되는 사항이 있다는것을 참고적으로 알자
Commons net이 지원하는 프로토콜은 다음과 같다
- FTP
- NNTP
- SMTP
- POP3
- Telnet
- TFTP
- Finger
- Whois
- rexec/rcmd/rlogin
- Time (rdate) and Daytime
- Echo
- Discard
- NTP/SNTP
FTP의 경우 이전에는 sun 패키지의 FtpClient를 사용했지만 이제는 Commons net의 FTP를 사용해 봅시다
II. 준비물~
Commons net은 자체적으로 ORO를 사용합니다
Jakarta ORO란 파일이름의 치환, 분할, 필터링 등을 수행하기 위한 Perl5 호환 정규식, AWK와 같은 정규식, glob 표현, 그리고 유틸리티 클래스들을 제공하는 텍스트 처리 자바 클래스들입니다
Commons net http://jakarta.apache.org/site/downloads/downloads_commons-net.cgi
Jakarta ORO http://jakarta.apache.org/site/downloads/downloads_oro.cgi
참고자료
Commons net API http://jakarta.apache.org/commons/net/apidocs/index.html
Commons net http://jakarta.apache.org/commons/net/
III. org.apache.commons.net.ftp 의 흐름
sun 패키지의 FTPClient처럼 FTP여러 동작을 Commons net의 FTPClient로 구현해 보자
다음 ① ~ ⑦까지 목록은 필수항목으로 구현되어야 합니다.
논리적으로 보면 간단합니다
IV. 사용예제 - 목록보기
본격적으로 FTP에 접속하여 목록을 가져오는 소스를 봅시다
목록보기 방법에는 한가지 방법이 더 있습니다
위의 코드는 해당 디렉토리내의 모든 파일을 가져오는 방법이며 다음 방법은 해당 디렉토리의 모든 파일을 정해진 수로 짤라 가져오는 방법이 있습니다.
위의 빨간색 코드대신 다음 코드가 들어갈 수 있습니다.
V. 사용예제 - get (파일 다운로드)
서버의 /public/테스트.txt 파일을 클라이언트의 C:\\Test\\테스트.txt 에 다운받는 예제
VI. 사용예제 - put(파일 업로드)
클라이언트의 C:\\Test\\보내자.txt 파일을 서버의 /public/보내자.txt 에 업로드하는 예제
만일 서버에 이미 /public/보내자.txt 파일이 있다면 덮어쓰게 된다
VII. 사용예제 - append (파일업로드)
위의 예제와 같은 기능을 하지만 이미 파일에 동일한 파일이 있으면 false를 반환하면서 실행하지 않는다
VIII. 사용예제 - rename (파일 이름변경)
변경전 파일명과 변경할 파일명을 파라미터로 준다
IX. 사용예제 - delete (파일삭제)
삭제할 파일을 선택한다
X. 사용예제 - directory 생성
/public 에 oops 디렉토리를 생성한다
XI. 사용예제 - OS 커맨드 입력하기
/public 에 oops 디렉토리를 생성한다
sendCommand 함수에 FTPCommand의 실행할 OS명령을 static 멤버변수를 넘겨준다
XII. 사용예제 - 작업디렉토리 설정하기
작업디렉토리를 /public 설정한 후 oops 디렉토리를 설정한다 (위의 예제와 비교해보라!)
XIII. 사용예제 - 파일 및 전송형태 설정
파일 형태 설정
파일 타입
FTP.BINARY_FILE_TYPE, FTP.ASCII_FILE_TYPE, FTP.EBCDIC_FILE_TYPE, FTP.IMAGE_FILE_TYPE , FTP.LOCAL_FILE_TYPE
이 값을 설정하지 않으면 디폴트는 ASCII 이다
전송 형태 설정
전송 타입
FTP.BLOCK_TRANSFER_MODE, FTP.COMPRESSED_TRANSFER_MODE
이값을 설정하지 않으면 디폴트는 FTP.STREAM_TRANSFER_MODE 이다
XIV. FTP접속시 글목록이 보이지 않는경우 아래 URL을 참고하세요
Jakarta Commons Net 에서 FTP 사용시 목록이 안보일 경우
http://www.jakartaproject.com/article/jakarta/1132032615162
목록이 안보일 경우 해결기 I탄
http://www.jakartaproject.com/article/jakarta/1135307924491
테스트한 파일을 첨부합니다 ^^
=============================================
본문서는 자유롭게 배포/복사 할수 있지만
이문서의 저자에 대한 언급을 삭제하시면 안됩니다
저자 : GoodBug (unicorn@jakartaproject.com)
최초 : http://www.jakartaproject.com
=============================================
Commons-Lang
VI. org.apache.commons.lang.builder.ToStringBuilder
toString()은 현 객체의 값을 문자열로 변환하여 반환 해주는 메소드로써 직접 구현할려면 노가다성 코드입니다.
하지만 Commons의 ToStringBuilder를 사용하면 는 말 그대로 클래스의 toString()을 쉽게 만들 수 있습니다.
웹에서는 빈클래스등에 toString을 구현하면 쉽게 디벙깅을 할 수 있습니다.
예제
ToStringTest.java
TestClass.java
(1) refrectionToString 함수
reflectionToString은 static함수로써 위와같이 사용하며 파라미터로 스타일을 지정할 수 있습니다. 아래 코드를 봅시다
(2) append 함수
append 메소드는 static이 아니며 다음과 같은 형식으로 사용 가능합니다.
출력 결과
TestClass@1cd2e5f[boardId=<null>,boardNo=0]
=============================================
본문서는 자유롭게 배포/복사 할수 있지만
이문서의 저자에 대한 언급을 삭제하시면 안됩니다
저자 : GoodBug (unicorn@jakartaproject.com)
최초 : http://www.jakartaproject.com
=============================================
Commons-Digester
I. Digester ?
digester는 XML파일로 저장된 정보를 java 객체에 매핑해 주는 API입니다. 하지만 그 반대기능은 되지 않습니다.
보통은 XML파일을 parsing할때 SAX와 DOM을 이용하였지만 DOM은 성능이 좀 느리고, SAX는 DOM보다는 빠르지만 코드가 난잡해 집니다. digester는 SAX기반이지만 pattern 매칭으로 아주 쉽고 빠르게 XML 파일을 parsing합니다
원래 digester는 struts의 struts-config.xml 정보를 로딩하기위해 개발되어 struts의 한 부분이었는데 독립적으로 commons project로 분리되었습니다.
II. 준비물
digester를 사용하기 위해서는 다음 4가지 준비물이 필요합니다
commons-digester http://jakarta.apache.org/site/downloads/downloads_commons-digester.cgi
commons-beanutils http://jakarta.apache.org/site/downloads/downloads_commons-beanutils.cgi
commons-collections http://jakarta.apache.org/site/downloads/downloads_commons-collections.cgi
commons-logging http://jakarta.apache.org/site/downloads/downloads_commons-logging.cgi
만약 digester는 SAX API를 사용하기 때문에 jdk1.4 이상의 버젼이 아니라면 Xerces같은 XML parser가 필요합니다
아래예제를 실행하려면 dbcp 관련 파일도 필요하며 이는 Commons-dbcp 편을 참조하세요~
참고 사이트
commons-digester API http://jakarta.apache.org/commons/digester/commons-digester-1.6/docs/api/index.html
commons-digester Guide http://jakarta.apache.org/commons/digester/apidocs/org/apache/commons/digester/package-summary.html
III. 시작하기 전에..
보통 digester는 여러 설정값들을 xml에 정의해 놓고 이를 어플리케이션에서 로드하는 방식으로 많이 이용됩니다. 이 강좌에서도 데이터베이스 정보를 xml에 정의해 놓고 이를 로딩하여 데이터베이스에 연결하는 예제를 강의할 것입니다.
시작하기 전에 XML에 대한 어느정도 기본 지식이 필요합니다.
① 주요함수
다른 함수들도 많이만 가장 많이 사용되는 다음 4가지만 딱 눈으로 익히고 갑시다
대강은 이런 뜻으로 알고 넘어 갑쉬다~!
그럼 element 경로가 먼가요? 다음에 나옵니다
② Element Matching Pattern
XML에 element들의 path를 pattern으로 인식하는 방법만 익힙시다.
위 XML을 보면 element a가 최상위 루트 element 입니다.
이것은 "a"로 매칭되며 그다음 a의 서브 element b는 "a/b" 로 매칭합니다
그다음은 .. "a/b/c"..
쉽죠?
즉 최상위만 "/"가 붙지 않으며 그 이하는 트리구조처럼 "/"를 붙여주면 됩니다
자 그럼 좀전에 보았던 함수들과 연관지어 보면..
요렇게 쓰입니다.
IV. Digester를 이용하여 데이터베이스 커넥션 정보를 DBCP로 멀티 설정하여 웹에서 사용해 보자!
자 이제 실질적인 예제를 봅시다~
무엇을 하려고 하려면 mysql과 oracle jdbc정보를 xml 파일에 기록해 두고 이를 딱 한번만 읽어서 이정보를 데이터베이스 커넥션풀인 dbcp에 설정할 것입니다
① XML 파일
다음과 같은 XML 파일이 있습니다. 이 파일은 mysql과 oracle을 연결하는 커넥션 정보를 가지고 있습니다
이 파일이름은 C:\Tomcat 5.0\webapps\ROOT\WEB-INF\classes\config.xml입니다
mysql과 oracle 두개의 jdbc pool을 dbcp로 설정할 것입니다.
이 파일은 제가 임의로 정해서 만든겁니다.
② web.xml
웹 배치파일에 의해 db.ConnectionInitialize.java를 초기 서블릿 컨테이너 로딩시 실행하여 XML정보를 DBCP로 세팅할 것입니다
config.xml 파일경로를 config 파라미터에 설정합니다
③ db.jdbc.ConnectionSources.java
XML 파일에서도 보면 알수있듯이 connection-sources 서브요소인 description과 JDBCConnectionPool을 저장하는 객체입니다. 변수를 눈여겨 봅시다
addSource 함수는 여러 JDBCConnectionPool 정보를 ConnectionSourcec 의 source에 저장합니다. 이 함수는 밑에서 다시 나오니 눈여겨 봅시다
④ db.jdbc.JDBCConnectionPool.java
변수에 대해 단순히 setter, getter로 이루어져 있습니다.
XML 파일을 보면JDBCConnectionPool 의 서브 element들을 저장하는 객체이며 XML파일과 이 java 변수명들과 매칭되는것을 알수 있을겁니다.
대강 감이 오나요? ㅡ.ㅡ? 감좌봐쓰~?
⑤ db.ConnectionInitialize.java
자 이제 여기가 핵심 클래스입니다. 위부분이 모두이해가 되었으면 다음 소스코드를 살펴봅시다
web.xml에서 정의한 config.xml을 로딩하여 파싱하고 그 정보를 DBCP에 설정합니다
mysql과 oracle 두개의 jdbc를 설정하도록 xml에 정의하였었습니다.
⑥ 그럼 이렇게 설정한 DBCP는 어떻게 사용할까요?
이전강좌에서 보았던 ConnectionContext.java와 ConnectionResource.java를 다시 사용해봅시다
ConectionContext를 구현한 ConnectionResource는 풀이름을 받아 처리하는것으로 수정하였습니다
⑦ jsp 파일
마지막으로 ConnectionContext는 풀이름과 함께 사용하면 되겠네요
DBCP 부분은 이전 강좌인 Commons-dbcp (http://www.jakartaproject.com/article/jakarta/1111890409958 )부분을 참조하세요~
ps. 휴 =3 다썼당 ^_^
흠.. 쉽게쓴다고 이리 저리 하루종일 썼는데 설명이 많이 부족한것 같네요
그밖에 사항은 알아서 찾아보기~!
digester II탄에서는 xml 설정파일로부터 규칙을 읽어 xml을 파싱하는 방법을 알아보겠습니다~
=============================================
본문서는 자유롭게 배포/복사 할수 있지만
이문서의 저자에 대한 언급을 삭제하시면 안됩니다
저자 : GoodBug (unicorn@jakartaproject.com)