'Java'에 해당되는 글 18건

  1. 2010.08.05 Java 트랜잭션 처리
  2. 2010.06.29 [String 비교하기] .equals()와 ==은 다른가요?
  3. 2010.06.11 Java 컴파일과 실행
  4. 2010.05.31 iBATIS
  5. 2010.05.19 Java 룩앤필 설정
  6. 2010.04.19 Java Code Convention
  7. 2010.04.12 Java에서 저장 프로시저 사용하기
2010.08.05 09:30

Java 트랜잭션 처리

트랜잭션(Transaction)은 All or Nothing 으로 표현되는 것으로 데이터베이스와 연동을 하는 어플리케이션에 있어서 아주 중요한 것이다. 데이터베이스와 연동된 모든 프로그램은 트랜잭션이 완벽히 보장되어야 한다.

JSP에서 제공하는 트랜잭션 처리에 대한 메소드들은 다음과 같다.

* 트랜잭션을 위한 메소드 : commit(), rollback()
JDBC API의 Connection 객체는 commit() 메소드와 rollback() 메소드를 제공한다. commit() 는 트랜잭션의 commit 을 수행하고, rollback() 메소드는 트랜잭션의 rollback 을 수행한다.

기본적으로 Connection 객체에 setAutoCommit(boolean autoCommit) 이란 메소드가 있는데 기본값이 true로 설정되어 있다. 기본적으로 JSP는 오토커밋(Autocommit)이다. 그래서 우리가 지금까지 작성한 쿼리문이 오토커밋(Autocommit)에 의해 자동으로 수행되었던 것이다.

그러나 트랜잭션을 처리할 때는 오토커밋(Autocommit)에 의해 자동으로 commit을 사용하면 안 된다. 여러 개의 쿼리 문장이 하나의 작업으로 수행되어야 하기 때문에 JSP의 오토커밋(Autocommit)이 자동으로 작동되지 못하게 해야 한다. 오토커밋(Autocommit)이 자동으로 작동되지 못하게 하려면 setAutoCommit(false); 로 지정해야 한다.

여러 작업을 하나의 트랜잭션으로 묶어서 처리하는 JSP의 예제는 다음과 같다.

Connection conn = null; 
try {
	conn = DriverManager.getConnection(url,dbId,dbPwd);
	conn.setAutoCommit(false); //트랜잭션 처리를 위해서 AutoCommit을 중지한다.

	//.... 데이타내의 수정문(Insert, Update, Delete) 등을 수행
	//.... 데이타내의 수정문(Insert, Update, Delete) 등을 수행
	//.... 데이타내의 수정문(Insert, Update, Delete) 등을 수행
	//.... 데이타내의 수정문(Insert, Update, Delete) 등을 수행

	conn.commit(); //데이타 처리시 에러가 없다면 commit 수행

}catch(SQLException e) {
	e.printStackTrace();

	if( conn != null ) {
		try {
			conn.rollback(); //에러발생시 rollback 처리
		} catch(SQLException sqle) {

		}
	}
}
finally {
	try {
		conn.setAutoCommit(true); //트랜잭션 처리를 기본상태로 되돌린다. 

		if( pstmt != null ) {
			pstmt.close();
		}

		if( conn != null ) {
			conn.close();
		}
	} catch (SQLException sqe) {

	}
}

 

[출처] [JAVA] 트랜잭션 처리
Trackback 0 Comment 0
2010.06.29 15:41

[String 비교하기] .equals()와 ==은 다른가요?

우리는 코딩을 하면서 String을 비교할 때 무의식적으로 아래와 같이 코딩을 합니다.
aString.equals(bString)

하지만 왜 String을 비교할 때만 이렇게 비교하는지 우리는 알고 코딩을 하고 있는 것일까? int, boolean, long 등은 == 로 비교를 하면서 String은 왜 다를까?

지금부터  String을 비교할 때 .equals()와 == 이 어떻게 다른지 알아보자.

일단 코드를 실행해보고 결과를 보면서 진행하겠습니다. 저는 백문이불여일견이라는 말을 좋아하거든요.^^

public class Test {
    /**     * @param args     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new Test().testString();
    }

    public void testString() {
        String a = "TEST";
        String b = "TEST";
        String c = new String("TEST");
        String d = new String("TEST");

        System.out.println("1:"+System.identityHashCode(a));
        System.out.println("2:"+System.identityHashCode(b));
        System.out.println("3:"+System.identityHashCode(c));
        System.out.println("4:"+System.identityHashCode(d));
        System.out.println("5:"+(a == b));
        System.out.println("6:"+a.equals(b));
        System.out.println("7:"+(c == d));
        System.out.println("8:"+c.equals(d));
    }
}

위 코드를 실행해 보면 결과는 다음과 같이 나옵니다.

사용자 삽입 이미지

결과를 보면 a,b는 hashcode값이 같지만 c,d는 값이 다른 것이 보입니다.
그럼 이번엔 비교한 결과를 볼까요? a,b는 equals()로 비교를 하거나 ==로 비교를 해도 결과는 항상 true 입니다. 하지만 c,d는 equals() 비교를 하면 트루지만 ==로 비교를 하면 false죠.

왜 이런 결과가 나올까요?

이런 결과가 나오는 이유는 equals()는 비교대상의 문자열 리터럴(값)을 비교하고 ==는 대상 객체를 비교하기 때문입니다. 또한 자바에서는 a,b처럼 같은 값을 가지면 하나의 메모리 주소를 참조하게 됩니다. 즉, a,b의 "TEST"라는 문자열 리터럴은 컴파일되면 String 객체가 되는데 a,b는 같은 메모리 주소를 가지게 됩니다. 하지만 c,d는 처음부터 별도의 String 객체로 생성되었기 때문에 동일한 "TEST"라는 문자열 리터럴을 가지지만 서로 다른 객체가 됩니다.

무슨말인지 모르시겠다구요? 그럼 그림으로 한번 볼까요?
사용자 삽입 이미지
간단하게 정리하자면 a,b는 문자열 리터럴이 컴파일시에 자동으로 하나의 String 객체가 되고 b,c는 별도의 객체가되어서 문자열 리터럴(값)으로 비교를 하면 a,b,c,d 모두 같지만 객체로 비교를 하게 되면 (a,b),c,d의 3개의 객체가 되는 것입니다.

[출처] [String 비교하기] .equals()와 ==은 다른가요?
Trackback 0 Comment 0
2010.06.11 13:22

Java 컴파일과 실행

1. Compile
java compile은 javac 명령을 이용해 가능하다.

javac source_file.java

.class 파일이 source_file의 디렉토리에 생성
예) javac MyFirstJava.java


javac -d target_directory source_file.java

.class 파일이 target_directory에 생성
예) javac -d ./lib MyFirstJava.java


2. Run
java 실행은 java 명령을 이용해 가능하다

java class_file

현재 디렉토리의 MyFirstJava 파일을 실행
예) java MyFirstJava


java -classpath target_directory class_file

현재 디렉토리의 lib 디렉토리 안의 MyFirstJava 파일을 실행
예) java -classpath ./lib MyFirstJava


3. Package
3.1 Package Compile
java에서 package 컴파일을 -d 옵션을 이용해 가능하다

javac -d target_directory source_file.java

target_directory에 패키지 형태로 class 파일이 생성된다.
예) javac -d ./lib MyFirstJava.java


3.2 Package Run
패키지를 실행하기 위해서는 -classpath 옵션을 지정해야 한다.

java -classpath target_directory package.class_file

만약 실행하고자 하는 class 파일의 package가 com.company.test이고
lib 디렉토리에 저장이 되어 있다면
예)java -classpath ./lib com.company.test.MyFirstJava
와 같이 실행을 해야 한다.


4. 외부 library를 이용한 Compile
외부 library를 이용해 컴파일을 하기 위해서는 -classpath 옵션을 사용한다.

javac -classpath lib_file.jar source_file.java

예)javac -classpath ./MyLib.jar MyFirstJava.java



[참조] Java compile과 실행

Trackback 0 Comment 0
2010.05.31 11:58

iBATIS

iBATIS의 개념
iBATIS는 간단한 XML서술자를 사용해서 간단하게 자바빈즈를 SQL statement에 맵핑시킨다. 간단함(Simplicity)이란 다른 프레임워크와 객체관계맵핑툴에 비해 iBATIS의 가장 큰 장점이다. iBATIS Data Mapper를 사용하기 위해서 당신은 자바빈즈와 XML 그리고 SQL에 친숙할 필요가 있다. 여기엔 배워야 할것도 거의 없고 테이블을 조인하거나 복잡한 쿼리문을 수행하기 위해 필요한 복잡한 스키마도 없다. Data Mapper를 사용하면 당신은 실제 SQL문의 모든 기능을 가질수 있다. JDBC 로만 프로그래밍 할 때의 번거로움을 줄여주기 위해 재사용 모듈로 개발된 것인데 그 주요한 어려움을 ibatis 개발자 가이드에서 다음과 같이 정리하고 있다.

iBATIS의 역사와 사용
  • SQL 문장과 프로그래밍 코드의 분리
  • JDBC 라이브러리를 통해 매개변수를 전달하고 결과를 추출하는 일
  • 데이터베이스 접근 클래스와 비즈니스 로직을 담은 클래스의 분리
  • 자주 쓰이는 데이터를 변경되지 않는 동안에 임시 보관(Cache)
  • 트랜젝션과 쓰레드 관리

이러한 사항들에 대해서 한번쯤 생각해볼 필요가 있다.

SQL 문장과 프로그래밍 코드의 분리
SQL문과 프로그램 코드는 꼭 분리해야 할까? 우선 프로그램이 작은 경우는 굳이 분리할 필요가 없어 보인다. 파일만 두개로 분리되기 때문에 관리에 불편함이 가중될 수 있다. 프로그램이 커져도 분리하는 것이 꼭 유리한 것만은 아니다. SQL을 사용하는 클래스가 1000개라면 분리했을 때 2000개가 되어서 더 복잡해질 수도 있다. 그럼에도 불구하고 ibatis에서는 SQL을 분리하는 이유는 무엇일까?

Separation of Concern!! 할 일의 명확한 분리. 아마도 이것이라 짐작된다. 자바 코드에서 SQL을 없애서 순수 OO로 만들어놓기. 이것은 결벽증이나 지나친 원리집착이 아니라 체계가 다른 것을 나누어 보관하는 것이다. 논리적으로 정연한 흐름을 만들어 둘 수 있고, 객체지향 입장에서 데이터에 해당하는 도메인 모델(Domain model) 혹은 도메인 객체(Domain object)와 관계형 데이터베이스의 테이블(Table)을 느슨한 관계(loosely coupled)로 만들어서 변화에 대한 유연성을 확보할 수도 있다. 즉, 정규화를 위해서 혹은 데이터 접근의 효율성을 위해서 테이블 구조를 바꾸어도 프로그램 코드 안에 있는 SQL을 수정할 필요가 없어진다.

JDBC 라이브러리를 통해 매개변수를 전달하고 결과를 추출하는 일
select 등를 할 때 조건에 해당하는 매개변수를 설정하거나, insert 문에서 값을 할당하기 위해 매개변수를 설정하는 일은 무척 번거로운 일이다. 단순한 일이면서도 오류가 잦은 부분이다. 때문에 프로젝트를 몇 차례 겪고 나면 자신만의 라이브러리를 만들거나 공통팀에서 유틸리티를 제공하는 일을 흔하게 볼 수 있다. Apache Commons의 DB Utils 나 Spring의 JDBC Template 등은 이러한 작업을 용이하게 하려고 등장했고, ibatis 역시 이러한 작업을 훨씬 부드럽게 해준다.

데이터베이스 접근 클래스와 비즈니스 로직을 담은 클래스의 분리
이른바 DAO(Data Access Object) 패턴이 이러한 일을 담당한다. ibatis는 DAO 계층 구현을 위한 유틸리티 성격이면서 동시에 best practice 역할도 수행한다.

자주 쓰이는 데이터를 변경되지 않는 동안에 임시 보관(Cache)
ibatis 에선 XML 설정만으로 캐시를 할 수 있다.

트랜젝션과 쓰레드 관리
트랜젝션 처리 역시 용이하다.


iBATIS의 주요기능 

Data Mapper (com.ibatis.sqlmap.*)
개념
iBATIS Data Mapper API는 프로그래머에게 자바빈즈 객체를 PreparedStatement파라미터와 ResultSets으로 쉽게 맵핑할 수 있도록 한다. Data Mapper의 기본적인 생각은 간단함(simple)이다. 이는 자바코드의 20%를 사용하여 JDBC기능의 80%를 제공하는 간단한 프레임워크라는 뜻이다.

작동원리
Data Mapper는 자바빈즈, Map구현, 원시래퍼타입(String, Integer…) 그리고 SQL문을 위한 XML문서를 맵핑하기 위한 XML서술자를 사용하는 매우 간단한 프레임워크를 제공한다.

다음은 생명주기에 대한 높은 레벨의 서술이다.
1) 파라미터(자바빈즈, Map 또는 원시래퍼)로써 객체를 제공한다. 파라미터 객체는 update문내에 입력값을 셋팅하기 위해 사용되거나 쿼리문의 where절을 셋팅하기 위해서 사용된다.

2) 맵핑된 statement을 실행한다. 이 단계는 마법이 일어나는곳이다. Data Mapper프레임워크는
PreparedStatement 인스턴스를 생성할것이고 제공된 파라미터객체를 사용해서 파라미터를 셋팅한다. 그리고 statement를 실행하고 ResultSet으로부터 결과 객체를 생성한다.

3) update의 경우에 영향을 미친 rows의 숫자를 반환한다. 조회문일경우에 한 개(single)의 객체 또는 컬렉션 객체를 반환한다. 파라미터처럼 결과 객체는 자바빈즈, Map 원시타입래퍼또는 XML이 될수 있다.

[출처] iBATIS 란?

Trackback 0 Comment 0
2010.05.19 11:12

Java 룩앤필 설정

0. 룩앤필(look and feel)이란?
소프트웨어 디자인에서 룩앤필은 GUI(Graphical User Interface)측면과 디자인의 형태 구성에서 사용되는 용어로 색상, 모양, 레이아웃, 서체(look)와 같은 요소와 버튼, 박스, 메뉴(feel)와 같은 동적 요소의 행위를 포함한다.

1. 소개
별도로 룩앤필을 지정하지 않으면 자바 룩앤필이 기본으로 지정된다.
룩앤필을 지정할 때에는 다음과 같이 UIManager 클래스를 사용하면 된다

try {
    UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
} catch (Exception e) { 
    System.err.println("Cannot set look and feel:" + e.getMessage ()); 
}


UIManager 클래스의 getCrossPlatformLookAndFeelClassName() 메소드는 자바 룩앤필 클래스 이름을 리턴한다. getSystemLookAndFeelClassName() 메소드는 현재 자바 스윙 컴포넌트가 실행되고 있는 환경에 따라 다른 클래스 이름을 리턴한다. 즉, 마이크로소프트 윈도우 시스템에서 실행되고 있다면 윈도우 룩앤필 클래스 이름을 리턴하고, 유닉스의 X 윈도우 시스템에서 실행되고 있다면 모티프 룩앤필 클래스 이름을 리턴할 것이다.

2. 룩엔필 지정하기
메탈 룩앤필 설정 예)
try {
    UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
} catch(Exception e) { 
}


시스템에서 사용하는 룩 앤 필을 사용하는 예)
try {
    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch(Exception e) { 
}


윈도우 룩앤필 설정 예)
try {
    UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
} catch(Exception e) { 
}


3. LookAndFeel 바꾸기
프로그램의 GUI 가 보인후에도 Look & Feel을 setLookAndFeel() 을 이용하여 변경이 가능하다.
새로운 l&f 을 컴포넌트에 적용하기 위해서는 SwingUtilities.updateComponentTreeUI() 을 최상위 컨테이너에서 호출해야 한다.

UIManager.setLookAndFeel ( Look&Feel_Name );
SwingUtilities.updateComponentTreeUI ( frame );
frame.pack ( );
...


4. 클래스/메소드
UIManager.setLookAndFeel()
- 프로그램의 룩앤필을 변경한다.
- 지원하는 룩앤필이 아니면 UnsupportedLookAndFeelException을 발생

UIManager.getCrossPlatformLookAndFeelClassName()
- 자바의 플랫폼 중립적인 메탈 룩 앤 필을 나타내는 객체 반환

UIManager.getSystemLookAndFeelClassName ()
- 현재 시스템에 맞는 Look & Feel 을 제공한다.

플랫폼별 L&F 이름
Windows L&F -  "com.sun.java.swing.plaf.windows.WindowsLookAndFeel" (윈도우 전용)
CDE/Motif L&F - "com.sun.java.swing.plaf.motif.MotifLookAndFeel" (모든 OS 가능)
Mac OS L&F - "javax.swing.plaf.mac.MacLookAndFeel" (Mac OS 전용)

Trackback 0 Comment 0
2010.04.19 09:35

Java Code Convention

Coding conventions are a set of guidelines for a specific programming language that recommend programming style, practices and methods for each aspect of a piece program written in this language.

These conventions usually cover file organization, indentation, comments, declarations, statements, white space, naming conventions, programming practices and etc.

Software programmers are highly recommended to follow these guidelines to help improve the readability of their source code and make software maintenance easier.

Coding conventions are only applicable to the human maintainers and peer reviewers of a software project.

Conventions may be formalized in a documented set of rules that an entire team or company follows, or may be as informal as the habitual coding practices of an individual.

Coding conventions are not enforced by compilers. As a result, not following some or all of the rules has no impact on the executable programs created from the source code.

Java Code Convention Document:



[출처] Wikipedia, Code Conventions for the Java Programming Language

Trackback 0 Comment 0
2010.04.12 12:51

Java에서 저장 프로시저 사용하기

자바에서 저장 프로시저를 사용하기 위한 코드는 다음과 같다.

Connection con=null;
ResultSet rs=null;
CallableStatement cs=null;

try{
    String url="jdbc:oracle:thin:@00.0.0.000:1521:orcl";
    String id="id";
    String pass="password";

    Class.forName("oracle.jdbc.driver.OracleDriver");
    con = DriverManager.getConnection(url, id, pass);
    //프로시저 불러내고
    cs=con.prepareCall("{call TEST_PR(?,?,?)}");
    //인자값 넣고
    cs.setString(1,"2006");
    cs.setString(2,"1");
    //출력값
    cs.registerOutParameter(3,java.sql.Types.VARCHAR);
    //실행
    cs.executeQuery();
    //출력값 출력
    out.println(cs.getString(3)); 
}catch(Exception e){
    out.println("error");
    e.printStackTrace();
}
finally{
    if(rs!=null)
        rs.close();
    if(cs!=null)
        cs.close();
    if(con!=null)
        con.close();
}

[출처] 구네구네의 블로그

Trackback 0 Comment 0