레이블이 JAVA JNDI인 게시물을 표시합니다. 모든 게시물 표시
레이블이 JAVA JNDI인 게시물을 표시합니다. 모든 게시물 표시

2013년 8월 9일 금요일

[OracleJavaCommunity,오라클자바커뮤니티]이번 강좌에서는 자바에서의 main 메소드에 대해 자세히 알아 보도록 하겠습니다

이번 강좌에서는 자바에서의 main 메소드에 대해 자세히 알아 보도록 하겠습니다. main 앞에 왜 static이 붙으며 왜 public이 붙는지등에 관한 것을 공부해 보도록 하겠습니다. 잘 알아두시기 바랍니다.


오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)  



main 메소드의 특징 

메인 메소드는 JVM에 의해 자바 프로그램을 실행 할 때 처음 호출되는 메소드 입니다.
메인 메소드는 객체 생성을 위한 첫 실행 메소드 이다. 그러므로 어느 클래스에서 접근이 가능해야 하므로 public 이라는 접근 제어자를 사용 합니다.
해당 클래스로 부터 생성된 모든 객체에서 접근이 가능해야 한다. (static) --> static이라는 말이 붙으면 객체와 관련이 있는 것이 아니라 클래스와 관련이 있으며 초기화가 한번만 일어나며, 클래스가 실행되기 위해 메모리로 로딩되는 시점에 한번만 초기화가 일어 납니다. 즉 전역변수등에 사용되며...등등 [자바기초다지기#7]변수-인스턴스변수, 클래스변수 강좌에서 이미 공부 했던 부분 입니다.
Return 값을 가지지 않습니다.(void)
또한 실행 될 때 인자 값을 받아 들일 수 있습니다.

자바 인터프리터는 Java Application에 주어지는 각 명령형 인자들을 main(String[] args) 메소드에 매개변수로 넘겨 줍니다.
각 명령행 인자는 공백문자(whitespace)로 구분 하며, C/C++에서 메인 함수의 매개변수 개수를 나타내는 argc와 명령형 매개 변수 들을 문자열 배열로 받아 들이는 argv는 결국 Java의 args.length, args로 대체 될 수 있습니다.

[예제]

class ArgTest
{
public static void main (String[] args)
{
for(int i = 0; i < args.length; ++i) //이 프로그램을 실행할때 넘어 오는 아규멘트의 갯수 만큼 루프를 돕니다. >
System.out.println( "args[" + i + "] = " + args[i] );
}
}



[결과1]

java ArgTest test 100 이라고 실행시

args[0] = test
args[1] = 100


[결과2]

java ArgTest "test 100" 이라고 실행시

args[0] = test 100

2013년 8월 8일 목요일

[오라클자바닷넷강의, ORACLEJAVA]스트럿츠에서의 예외처리

Struts에서의 예외처리 방법입니다. 참고하세요

오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)  

자바의 예외는 애플리케이션에서 비정상적인 상황이 발생 할 때 생성되는 객체 입니다. 자바에서 예외가 발생하면 java.lang.Throwable  객체를 상속한 객체를 생성하는 것입니다. Throwable 아래에는 java.lang.Error와 java.lang.Exception등이 있습니다.

 

일반적으로 Exception의 경우 Application에서 처리 가능한 예외이며 스트럿츠에서의 모든 예외는 Exception 클래스의 서브 클래스로 생성하고 발생해야 합니다.

Exception을 제외한 Error 부분은 심각한 문제들을 위해 예약되어 있습니다. 예를 들어 애플리케이션에서 사용 할 시스템 메모리가 부족한 에러 등이 해당 합니다. 그러므로 일반적으로 Error클래스의 서브 클래스의 경우는 애플리케이션에서 예외를 처리하기는 어려우며 대부분 JVM 자체에서 Error또는 Error클래스의 서브 클래스의 인스턴스를 발생 시킵니다.

JVM은 각 스레드의 호출 순서를 추적하는데 사용하기 위해 호출 스택(Call Stack)이라고 부르는 메소드 호출 스택(Method Invocation Stack)을 사용 합니다. main()에서부터 출발하여 각각의 메소드가 호출 될 때 마다 메소드 호출 스택의 상단에 추가되고 새롭게 추가된 메소드 스택이 현재 실행할 메소드가 되는 것 이며 각 메소드 필드 상태는 해당하는 스택 프레임에 저장됩니다.

JVM은 자바 메소드가 정상적으로 종료하면 최상단의 현재 메소드의 스택 프레임을 꺼내고 다음 스택 프레임을 실행 합니다. 그러나 예외가 발생 한다면 예외 핸들러를 찾는데 우선 현재 메소드에서 try-catch 구문이 있는지 확인을 합니다. 만약 현재 예외가 발생 한 곳에 try-catch 구문이 없다면 JVM은 발생한 예외 혹은 그 예외의 상위 예외를 처리하는 구문을 찾을 때 까지 호출 스택에서 메소드 프레임을 하나씩 꺼냅니다.

만약 JVM이 모든 스택 프레임을 꺼냈는데도 해당 예외를 처리하는 구문이 없을 경우 예외가 발생 한 쓰레드는 종료하게 됩니다. 만약 종료한 쓰레드가 메인 쓰레드이고 다른 비데몬 쓰레드가 없다면 애플리케이션 자체가 종료하게 됩니다.

이와는 달리 JVM이 예외를 처리하는 구문을 만난다면 그 구문이 있는 스택 프레임을 스택의 맨 위에 위치 시키고 다시 실행을 재개 하게 됩니다.

 




--------------------------
Checked와 Unchecked
--------------------------

자바의 예외는 checked 예외와 unchecked 예외로 구분해 볼 수 있습니다. Checked 예외는 클라이언트가 반드시 처리해야 하는 것이며 이에 대한 처리를 위해 메소드에서는 try-catch로 처리하거나 throws을 이용하여 예외를 던져 버려야 합니다.

JVM은 컴파일 시 checked 예외를 검사하지만 unchecked 예외에 대해서는 무시 합니다. Unchecked 예외로는 java.lang.ClassCastException등과 같은 예외가 있는데 일반적으로 부정확한 로직이나 프로그래밍의 오류로 인해 발생 되는 오류들 입니다.

또한 checked와 unchecked 예외는 예외 계층에서의 위치로도 결정 되는데 RuntimeException의 서브 클래스를 제외한 java.lang.Exception 클래스의 자식 클래스는 모두 checked 예외 입니다. 즉 이 예외는 try-catch로 처리 하든지 아니면 throw 절에 의해 처리되는 것이 보장 되어야 합니다.

Runtime 클래스와 그 자식 예외들은 unchecked 예외인데 이 예외는 try-catch 또는 throws 절에 위해 처리 되지 않아도 프로그램은 컴파일 되고 수행이 됩니다. 그러므로  unchecked라고 하는 겁니다.

보통 자바에서 try-carch문을 이용하는 것은 애플리케이션의 성능에 큰 영향을 주지 않습니다. 실제 예외가 발생 했을 때만  영향을 미치는데 이러한 이유는 JVM이 예외를 처리할 핸들러를 찾기 때문 입니다. 만약 예외를 처리 할 catch 문이 예외가 발생 한 메소드안에 있으면 성능에는 문제가 없지만 예외를 처리하기 위해 아래의 스택 프레임을 뒤진다면 성능에 영향을 줄 수 있습니다.

따라서 try-catch문은 오류에 대한 처리 조건으로 이용되어야 하며 프로그램의 흐름을 컨트롤 하기 위해서 사용 되어져서는 안됩니다. 아래는 잘못 사용된 예 입니다.

Double basePrice = null;
String basePriceStr =request.getParameter( "BASE_PRICE_AMOUNT" );

// Use a try/catch to make sure the value is a number
try{
basePrice = Double.valueOf( basePriceStr );
}
catch( NumberFormatException ex )
{
// The value could not be converted to a valid Double; set the default
basePrice = ApplicationDefaults.DEFAULT_BASE_PRICE;
}


--------------------------
Chained 예외 사용하기
--------------------------

때에 따라서는 특정 타입의 예외를 catch한 후 다른 유형의 예외를 발생하는 경우가 있습니다. 예를 들어 스트럿츠에서 애플리케이션의 Action 클래스를 호출해서 데이터베이스에 이미지를 저장 하는 경우라고 했을 때 Action 클래스에서는 다음과 같은 update  메소드를 호출 합니다.

public void updateImageFile( String imagePath ) throws UploadException;

메소드를 호출하면 이미지 파일을 업로드 하고 예외가 발생하면 UploadException이 발생 합니다. 에러가 발생하는 실제 오류를 보면 데이터베이스에 저장 공간이 없을 수도 있고 여러 가지 오류의 경우가 나올 수 있습니다. 아마도 최초 발생 하는 예외는 IOException이나 SQLException등이 될 것 입니다.

그러나 사용자는 이 레벨의 오류를 알 필요가 없습니다. 단지 필요한 것은 이미지의 업로드기 실패 했다는 것이 됩니다. 이런 경우 추후 개발자가 확인을 위해 시스템에 로깅을 통해 SQLExceptio이나 IOException은 기록을 하고 사용자에게는 “입력 실패 입니다”와 같은 오류 메시지를 보여 주어야 할 것 입니다.

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

Example 10-1. An exception class that supports chained exceptions
import java.io.PrintStream;
import java.io.PrintWriter;
/**
* 이 클래스는 애플리케이션 예외의 슈퍼 클래스 입니다.
* 이 클래스와 이 클래스의 서브 클래스는 chained 예외 기능을 제공 합니다.
* chained 예외기능 이란 원래의 문제를 이 클래스나 이 클래스의 서브
* 클래스로 감싸서 다시 예외를 발생 시키는 것 입니다.
*/
public class BaseException extends Exception {
        protected Throwable rootCause = null;
        protected BaseException( Throwable rootCause ) {
                this.rootCause = rootCause;
        }

        public void setRootCause(Throwable anException) {
                rootCause = anException;
        }

        public Throwable getRootCause( ) {
                return rootCause;
        }

        public void printStackTrace( ) {
                printStackTrace(System.err);
        }

        public void printStackTrace(PrintStream outStream) {
                printStackTrace(new PrintWriter(outStream));
        }

        public void printStackTrace(PrintWriter writer) {
                super.printStackTrace(writer);
                if ( getRootCause( ) != null ) {
                        getRootCause( ).printStackTrace(writer);
                }
                writer.flush( );
        }
}

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

위 예제는 원래의 Throwable을 감싸고 있으며 이러한 경우의 장점은 저 수준 예외에 대한 자세한 부분들을 추상화 할 수 있다는 것입니다. 동시에 예외의 자세한 사항을 로그에 기록하고 게발자가 사용 할 수 있도록 할 수 있습니다. 이러한 예외들을 계속 연결 할 수 있기 때문에 chained 예외라고 합니다.

“exception chaining”은 JDBC같은 저 수준의 오류를 사용자에게 전달하는 것을 막을 수 있습니다.


----------------------------
다중 예외
----------------------------

한 메소드에서 여러 예외가 발생 한다는 개념으로 “exception chaining”을 약간 변형 한 것입니다.

인터넷을 통해 회원가입을 하려고 합니다. 비밀번호와 비밀번호 확인이 잘못 되었으며 주소도 입력하지 않았고 전화번호도 기입하지 않았습니다. 이 경우 여러 항목들을 입력하고 “저장” 버튼을 누르면 오류가 차례차례로 하나씩 나타나 사용자를 불편하게 할 것입니다.

닷넷인 경우 Validation Check를 위한 객체를 지원하여 이러한 부분이 해결 가능 하지만 자바에서는 기본적으로 지원하지 않습니다. 불행이도 자바에서는 오직 하나의 Throwable만 던질 수 있습니다.

다중 예외를 처리하는 한가지 방법은 예외 클래스가 다른 예외들의 컬렉션을 지원하는 기본 예외를 갖도록 하는 것입니다. 아래의 예문에서는 메소드가 실행 하는 동안 예외가 하나 이산 발생 하면 추가적인 예외들을 추가하여 클라이언트에 반환 합니다.

import java.util.List;
import java.util.ArrayList;
import java.io.PrintStream;
import java.io.PrintWriter;
/**
* exceptions라는 인스턴스 변수에서 여러 예외를 지원 합니다.
*/
public class BaseException extends Exception{
        protected Throwable rootCause = null;
        private List exceptions = new ArrayList( );

        public BaseException( ){
                super( );
        }

        public BaseException( Throwable rootCause ) {
                this.rootCause = rootCause;
        }

        public List getExceptions( ) {
                return exceptions;
       

        public void addException( BaseException ex ){
                exceptions.add( ex );
        }

        public void setRootCause(Throwable anException) {
                rootCause = anException;
        }

        public Throwable getRootCause( ) {
                return rootCause;
        }

        public void printStackTrace( ) {
                printStackTrace(System.err);
        }

        public void printStackTrace(PrintStream outStream) {
                printStackTrace(new PrintWriter(outStream));
        }

        public void printStackTrace(PrintWriter writer) {
                super.printStackTrace(writer);

                if ( getRootCause( ) != null ) {
                        getRootCause( ).printStackTrace(writer);
                }
                writer.flush( );
        }

2013년 8월 1일 목요일

oracle 11g : 오라클11g : 읽기전용 테이블 , readonly table

Oracle 11g : 읽기 전용 테이블

오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷  실무전문 강의)


이전 버전의 오라클에서는 테이블은 다른 사용자에게 SELECT 오브젝트 권한을 주는 경우에만 읽기전용이 가능했고 해당 Owner는 테이블에 Read/Write 둘 다 가능했으며 읽기전용으로 만드는 것은 불가능 했다.

오라클 11g에서부터 alter table 테이블명 read only 명령으로 읽기전용으로 변경이 가능하다,

[형식]
ALTER TABLE table_name READ ONLY;
ALTER TABLE table_name READ WRITE;


SQL>reate table readtest
as
select rownum id, '홍길동'||rownum name from dual;

SQL>select * from readtest;

SQL> alter table readtest read only;

테이블이 변경되었습니다.

SQL> insert into readtest values (2, '김길동');
insert into readtest values (2, '김길동')
            *
1행에 오류:
ORA-12081: "SCOTT"."READTEST" 테이블에 작업을 갱신하는 것이 허용되지 않습니다


SQL> delete from readtest;
delete from readtest
            *
1행에 오류:
ORA-12081: "SCOTT"."READTEST" 테이블에 작업을 갱신하는 것이 허용되지 않습니다


SQL> truncate table readtest;
truncate table readtest
               *
1행에 오류:
ORA-12081: "SCOTT"."READTEST" 테이블에 작업을 갱신하는 것이 허용되지 않습니다


SQL> alter table readtest read write;

테이블이 변경되었습니다.

SQL> truncate table readtest;

테이블이 잘렸습니다.

자바의 OutputStream (JAVA OutputStream)

OutputStream 클래스는 모든 파일 시스템으로부터 스트림의 한 바이트를 쓴다. 
  public abstract void write(int b): 정수 b를 byte로 변환하여 출력한다.
  public void write(byte b[]): 배열 b의 모든 바이트를 쓴다.
  public void write(byte b[], int off, int len): b의 off 위치로부터 len만큼 쓴다. 
  public void close(): 출력 스트림을 닫는다.
  public void flush(): 버퍼에 남겨진 모든 데이터를 목적지에 보낸다.
  InputStream과 OutputStream은 추상 메소드를 포함하여 바이트들과 바이트 배열들을 읽고 쓰기 위하여 read()와 write()를 사용하는데 실제로 바이트 스트림을 읽고 쓰는 경우가 드물기 때문에 이 메소드는 거이 이용하지 않는다. 왜냐하면 자바에서 문자열은 바이트가 아니라 유니코드로서 일반적으로 숫자, 문자열, 객체형태로 입출력되기 때문이다. 


public class Iotest { //입력 문자열을 그대로 출력 
      public static void main(String []args) throws java.io.IOException {
            int i;
            while ((i=System.in.read())!=-1)
                System.out.write(i); // 정수 i를 문자로 바꾸어 출력한다.
      }
 }

java.util.HashSet 클래스 – 예제

import java.util.*; 
public class SetTest { 
 public static void main (String  args[]) { 
  String  names[] = {"홍명보", "안정환", "차두리","히딩크", "황선홍", "이운재", "설기현", "황선홍"}; 
  Set koreaTeam = new HashSet(); 
  int namesLen = names.length; 
  int index; 
  for (int i=0; i < 100; i++) { 
index =  (int)(Math.random()*namesLen); 
koreaTeam.add (names[index]); 
  } 
  Iterator it = koreaTeam.iterator(); 
  while (it.hasNext()) { 
    System.out.println (it.next()); 
  } 
 } } 

2013년 7월 29일 월요일

JAVA JNDI를 이용한 DNS 서비스 구현(JAVA JNDI DNS)

JNDI를 이용한 DNS 서비스 구현


오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷  실무전문 강의)



즉 자바 응용 프로그램이 어느 위치에 있든지 필요한 자바 객체들을 검색할 수 있는 것입니다. EJB 환경에서는 JNDI를 이용해 EJB Home 객체를 얻어낸 후 이를 이용해 Java Beans 객체를 생성하거나 접근하게 됩니다.

JNDI DNS(Domain Name System), COS(Common Object Services) 등의 네이밍 서비스 표준과 LDAP(Lightweight Directory Access Protocol), NDS(NetWare Directory Service), NIS(Netware Information System) API를 제공 합니다.

참고로 JDK1.4 부터는 JNDI 서비스 프로바이더에 DNS Service Provoder를 제공하여 DNS 서비스를 통해 네이밍 서비스를 받을 수 있도록 지원 했는데 아래는 그 예제 입니다.

/*
 * Created on 2005. 1. 9
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */

/**
 * @author 이종철
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
import java.util.Hashtable;
import javax.naming.directory.*;
import javax.naming.NamingEnumeration;


public class SimpleDNS {

             public static void main(String[] args) {
                           Hashtable h = new Hashtable();
                           h.put("java.naming.factory.initial","com.sun.jndi.dns.DnsContextFactory");
                           h.put("java.naming.provider.url","dns://ns.dacom.co.kr");
                          
                           try {
                                        //DirContext 초기화
                                        DirContext context = new InitialDirContext(h);
                                       
                                        //DNS질의 결과를 받아 오자...
                                        Attributes attribute = context.getAttributes("onjprogramming.co.kr");
                                       
                                        //질의 결과 출력
                                        NamingEnumeration ne = attribute.getAll();
                                        System.out.println("onjprogramming.co.kr --> ");
                                        while(ne.hasMoreElements()) {
                                                     System.out.println(ne.next());
                                        }
                           }
                           catch(Exception e) {
                                        e.printStackTrace();
                           }
                          
             }
}

[결과]
onjprogramming.co.kr -->
NS: ns1.gabia.co.kr., ns.gabia.net., ns.gabia.co.kr.


[출처]오라클자바커뮤니티



www.oraclejavacommunity.cop.kr