검색결과 리스트
programmer/Java에 해당되는 글 10건
- 2011/05/11 JDBC에 대해서 다시한번 보라구..
- 2010/01/31 [기초]GUI , AWT 와 JFC ,사용하는 Event 그리고 Applet
- 2010/01/31 [기초]byte,text,file,object 입출력 과 자바 네트워크(TCP,UDP,Muticast,RMI)
- 2010/01/31 [기초]클래스,예외처리,Collection,Assertion
- 2010/01/31 [기초]Method , Array ,
- 2010/01/31 [기초] 자바 개요, JVM 메모리 , 자료형,연산자,제어문
- 2010/01/11 놓치기 쉬운, 기본적인 사항들! (1)
- 2008/05/10 웹 2.0 시대를 선도할 자바 웹 서비스 2.0
- 2008/05/10 Java6.0에서만 가능한 쿠키 처리
- 2008/05/10 썬의 Java DB 사용법
글
Java DataBase Connectivity 는 JDK에서 흔하디 흔하게 사용되는 패키지 이다.
java를 이용해서 SQL 를 사용할때, 가장 기본적으로 사용되어 지는 jdbc에 대해서
그냥 사용법만 알고 넘기는 경우가 흔하기 흔하다고 합니다.
IBM DeveloperWorks 에서는 도움이 되는 기술 문서를 자주 제공하고 있는데,
이번에는 JDBC에 대해서 모르고 있던 5가지 라는 문서가 있네요
1. 스칼라 함수
2. 스크롤 가능한 ResultSet
3. 업데이트 가능한 ResultSet
4. Rowset
5. 일괄처리 업데이트
요즘에는 Java를 잘 다루지 않고 있지만.. 꼭 반드시 쓰게 될 일이 있을것 같아.
아래 URL를 링크 합니다.
http://www.ibm.com/developerworks/kr/library/j-5things10/j-5things10.html
설정
트랙백
댓글
글
GUI(Graphic User Interface) : 사용자를 위한 그래픽 화면을 제공하는 프로그램
■ Frame 클래스 와 Label
Frame 클래스 : GUi의 Base form
- Frame 객체 생성
- Frame 클래스 상속
Frame의 배치
Component 추가
■ Frame 상속 계열 클래스
Layout Manager
Frame 상속 계열 클래스들
Object -> Component -> Container -> Window -> Frame
Component 클래스의 메서드
Container 클래스의 메서드
Window 클래스의 메서드
Frame 클래스 메서드
- getIconImage()
- setIconImage()
- getTitle();
- setMenuBar(MenuBar mb)
- setResize();
- setUndecorated(boolean undecorated)
■ Layout Manager
-FlowLayout Manager
-GridLayout Manager
-BorderLayout Manager :North,South,East,West,Center
-CardLayout Manager : 여러장의 카드를 겹쳐놓은 듯한...;;;
-GridBargLayout Manager : 적절한 위치에 맘대로!!
■ java.awt.Panel 클래스
Panel 클래스 : Layout Manager를 적용하기 위한 영역
Panel 클래스에는 또 다른 Panel 클래스가 추가 될수 있다.
Panel 클래스는 Layout Manager에 의해 영역을 분할할 수 있다.
■ 주변 클래스들
java.awt.Color : Color(int r,int g,int b) 255,255,255 : white , 0,0,0 : black 빛
: Creates an opaque sRGB color with the specified red,green and blue values in the range
java.awt.Cursor
java.awt.Dimension : 크기를 관리하는 것이래용
java.awt.Font
java.awt.Image
java.awt.Toolkit : 로컬 경로에서 !!! 정보를 받아온데요
■ AWT 관련 컴포넌트
java.awt.Label
java.awt.Button
java.awt.Checkbox
java.awt.CheckboxGroup
java.awt.choice
java.awt.List
java.awt.TextField
java.awt.TextArea
java.awt.Dialog
java.awt.FileDialog
java.awt.Menu
java.awt.MenuItem
■ Event 관련 패키지 와 적용범위
-Event Handler 란 (java.awt.event)
각 컴포넌트에 대해 특정 행위를 하였을 때에 대한 작업을 처리 할수 있는것.
-각 컴포넌트 별 처리 이벤트
add로 시작하여 Listener로 끝나는 메서드
-이벤트 관련 클래스
Listener 인터페이스 , Adapter 클래스, Event 클래스
■ Event 작성법
-Event Handler 클래스 생성법 4가지
1. Listener Class를 구현하는 방법
addActionListion : 버튼을 클릭했을때, 메뉴을 클릭했을때... 발생하는 이벤트를 듣는다.
매개변수에는 ActionListener 가 들어가야 하고, ActionListener 구현시에는 actionPerformed는 꼭 포함
2. Adapter Class 를 상속받는 방법
3. Frame Class에 Listener를 구현하는 방법
4. 익명 중첩 클래스를 사용하는 방법
-Event 작성법
1. 처리하고자 하는 종류의 Event 클래스 생성
2. 컴포넌트에 대해 관련 Event를 추가
■ 자주 사용되는 Event 클래스
-Event 활용범위
1.ActionListener : 버튼 클릭, 메뉴 선택 등
2.WindowAdapter 와 WindowListener : Frame 관련
3.MouseAdapter 와 MouseListener : 마우스 크ㄹ릭 등 마우스 관련
4.MouseMoitionAdapter 와 MouseMotionLister : 마우스 움직임 관련
5.KeyAdapter 와 KeyListener : 키 관련
6.FocusAdapter 와 FocusListener : 포커스 과련
7.ItemLister : List나 Choice에서의 아이템 관련
■ Graphics 실행 순서와 호출법
Graphics 실행 순서
- Frame 혹은 Applet 실행 시 생성자 호출
- public void update(Graphics g) 호출 -->숨어있다
- public void pain(Graphics g) 호출
- Thread 대기 상태 (Event 호출 가능)
Garphics의 paint 메서드 호출 방법
- Frame or Applet open
- Resize
- 사용자의 의해 repaint() 호출 될때
Graphics 클래스와 Image
-Graphics 메서드
1. drawLine , drawRect , DrawOval , drawPolygon
2. fillRect , fillOval , fillPolygon
3. drawString : 문자열 그림
4. drawImage : 이미지 그림
■ Image 객체 생성
1. Toolkit t = Toolkit.getDefaultToolkit();
2. Image img = t.getImage("파일명");
■ Applet 작성법 과 실행 순서
Applet을 포함하는 Html 작성(applet 태그 ,
Applet을 상속받는 클래스 작성
Applet 실행순서
public void init()
public void start()
public void paint(Grphics g)
public void stop()
public void destory()
■ Applet Image 와 Sound
Applet의 Image 와 Sound 객체 생성
Image : Applet 객체.getImage(위치, 파일명)
Sound : Applet 객체.getAudioClip(위치, 파일명)
위치
applet객체.getDocumentBase
Applet객체.getCodeBase
Image객체와 AudioClip 객체에 각 데이터 저장
AudioClip 사용 메서드
play() : sound를 한번만 실행
stop() : sound를 멈춤
loop() : 반복 실행
■ Swing 을 이용한 화면 구성
JFC의 상속 클래스 : JFrame
Base 작업 영역 : Container
- Frame 위에다가 했었는데, 계층 클래스 ,
계층 클래스 :
- JRootPane
- JLayoutPane (GlassPane 포함)
javax.swing.border 클래스
- Empty,Line,Etched, Bevel , SoftBevel
- Matte , Titled, Compound
■ JFC ( Java Foundation Component ) Component 클래스들
- awt 는 window에 종속적인 컴포넌트 이다.
- jfc 컴포넌트 입니다.(Swing 대세!!!)
- pure java ->1.2 이상부터 많이 사용
- platform의 독립적으로 구성 가능
- JToggleButton
- JColorChooser 와 JFileChooser
- JOptionPane
- JDesktopPane , JInternalFrame
- JSplitPane
- JTabbedPane
- JToolBar
■ JApplet을 통한 애플릿 구현
JApplet에서는 일반 Applet 클래스에서 사용할 수 없는 부분을 많이 보완해 두었다.
applet 태그
기본 : code , width, height
기타 : codebase , archive , vspace , hspace
■ JTree와 JTable 클래스
JTree 클래스
- 기본 트리 구조 예제
JTable 클래스
- 기본 트리 구조 예제
설정
트랙백
댓글
글
■ File 클래스
- 시스템에 존재하는 자원에 접근하여 자바 프로그램에서 객체로 이용할 수 있는 클래스
■ File 클래스의 APIs (java.io.*)
- File(File,String)
- File(String)
- File(String,String)
- File(URL)
■ 1byte 입력과 출력
1byte 출력
FileOutputStream fos = new FileOupputSream(FileDescriptor.out); //File 객체 , Network 객체
BufferedOutputStream bos = new BufferedOutputStream(fos,byte수);
DataOutputStream dos = new DataOutputStream(bos); ->메서드
1byte 입력
FileInputStream fis = new FileInputStream(FileDescriptor.in); // File 객체, Nexwork 객체
BufferedInputStream bis = new BufferedInputStream(fis, byte수);
DataInputStream dis = new DataInputStream(bis);
■ 텍스트 입력과 출력
텍스트 출력
OutputStreamWriter osw = new OutputStreamWriter(Sstem.out);
//Network OuputStream 객체
//FileWriter osw = new FileWriter(파일객체 or 문자열)
텍스트 입력
OuputStreamWriter ow = new OutputStreamWrite(System.out);
BufferedWriter bw = new BufferedWriter(ow);
PrintWriter pw = new PrintWriter(bw);
FileWriter fw = new FileWriter(new File("ccc.txt"));
BufferedWriter bw = new BufferedWriter(fw);
PrintWriter pw = new PrintWriter(bw);
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
PrintReader pr = new PrintReader(br);
FileReader fr = new FileReader(new File("ccc.txt"));
BufferedReader br = new BufferedReader(fr);
PrintReader pr = new PrintReader(br);
■ * java.util.Scanner 클래스
String input = "1 fish 2 fish red fish blue fish";
Scanner s = new Scanner(input);
s.useDelimiter("\\s*fish\\s*");
System.out.println(s.nextInt());
System.out.println(s.nextInt());
System.out.println(s.next());
System.out.println(s.next());
s.close();
■ 객체 입력과 출력
객체 출력
FileOutputStream fos = new FileOutputStream(파일객체 or 문자열);
//Network OutputStream 객체 (직렬화 를 반드시 써야 한다)
BufferedOutputStreamm bos = new BufferedOutputStream(fos);
ObjectOutputStream oos = new ObjectOutputStream(bos);
객체 입력
FileInputStream fos = new FileInputStream(파일객체 or 문자열);
//Network InputStream 객체 (직렬화 를 반드시 써야 한다)
BufferedInputStreamm bos = new BufferedInputStream(fos);
ObjectInputStream oos = new ObjectInputStream(bos);
■ 자바 네트워크
프로그램 네트워크의 정의
- 데이터를 교환을 목적으로 로컬 PC 와 원격 PC 사이의 데이터 흐름을 나타내는 구조
네트워크의 필수 조건
- IP 주소 : PC 고유의 주소 (219.255.61.191)
- Port 번호 : 0 ~ 65535
- 프로토콜 : TCP , UDP <- 약속
- 기타 :
subnet mask (255.255.255.0) : 같은 게이트 웨이 안에 있는지 확인 (End 연산)
dns
gateway (219.255.61.1)
컴퓨터 <-> router <-> gateway INTERNET gateway <-> router <-> 컴퓨터
■ TCP 통신
- TCP 통신의 장점과 단점
장점 : 상대방의 데이터 전달 여부를 곧바로 확인이 가능하다.
단점 : 부하가 많이 걸린다. 지속적인 연결 유지
(Connection을 유지 시켜줘야 한다)
- 자바의 TCP 구현을 위한 클래스들
InetAddress : 주소 관련 클래스 (주소가 들어가는 어디서나 사용 가능)
Socket , ServerSocket
■ URL 통신
URL 클래스
URLConnection 클래스
■ UDP
UDP통신의 장점과 단점
편지 라고 생각하면 된다.
부하가 발생 없다
보낸 데이터의 소실 여부 확인 불가
UDP를 위한 자바의 클래스들 - DatagramPacket ,DatagramSocket
■ Multicast
- Unicast , Broadcast , Multicast 의 구분
x.x.x.255 -> 1~254까지 전부 전송
- Multicast를 위한 자바의 클래스들
(D타입 클래스) 242 ~ 239 번으로 지원받은... Multicast
: DatagramPacket 클래스
- MulticastSocket 클래스
■ RMI
- Remote Method Invocation의 약자
- 원격 지역의 메서드 호출로 실행
■ RMI 프로그램 작성 방법 및 실행
- 원격 인터페이스 작성
-서버측 구현 클래스 작성
-Stub 클래스 생성( rmic 원하는JAVA )
-서버측 바인딩 클래스 작성
-클라이언트 lookup 클래스 작성
-rmiregistry.exe 및 바인딩 클래스 실행 (start rmiregistry.exe)
-lookup 클래스 실행
설정
트랙백
댓글
글
■ 클래스의 기본 구성
형식
접근_제한자 지정_예약어 class 클래서
extends 상위 클래스 implements 상위인터페이스
■ 클래스 포함 멤버
Nested Class : 중첩 클래스
Field : 데이터 저장 공간 (멤버 필드 , 클래스 안에 있는 필드를 멤버 필드다.)
Construct : 객체 생성 및 초기화 Method (객체를 생성시키고, 초기화 시키는 생성자)
Method : 특정 행위의 기술 영역
■ 클래스 사용법 과 메모리
- 객체 생성 : 클래스명 객체명 = new 생성자(매개변수);
(new : 동적 메모리 할당 연산자) -> GC heap 영역에!!! , 레퍼런스 4byte 로
- 연산자 : .(참조 연산) - 최우선 연산자
- 객체명.Field or 객체명.메소드
- 객체는 Reference 4byte , GC 영역 할당
■ 생성자 메서드
- 클래스명과 동일
- 결과형 리턴값이 없다.
- 객체 생성 시 반드시 하나의 생성자 호출
- 생성자 오버로딩
오버로딩 : 생성자가 여러가지가 있을수 있다.(매개변수의 개수 및 매개변수 자료형이 틀리다)
만약 생성자가 없을때, Jvm에서는 자동으로 default 생성자가 호출됨.
- 멤버 필드 값 초기화
- this 와 this()
■ Garbage Collection
- 더 이상 참조 받지 않는 Garbage Collection 영역의 메모리를 삭제한다.
- 어떤 공간이라도 해당 메모리를 참조하면 삭제 하지 않는다.
Garbage Collector의 호출
- System.gc();
- Low memory 상태에서 최 하위 Thread로 동작
■ 접근 제한자 와 멤버필드
- 클래스 내에 멤버에 접근을 제한하기 위한 예약어 => 은닉화 , 제약
■ 접근 제한자의 종류
- private : 하나의 클래스 내에서만 사용 가능한 멤버를 지정할 때 사용하는 제한자
- package : 동일 파일 + 동일 폴더
- protected : 동일 파일 + 동일 폴더 + 상속
- public : 객체를 가진 모든 영역
■ 멤버필드 와 멤버 메서드
멤버 필드 (Member Field)
- 형식 : 접근제한자 [지정예약어] 자료형(클래스형) 필드명 = 값;
멤버 메서드 (Member Method)
- 형식 : 접근제한자 [지정예약어] 결과형리턴값(자료형) 메서드명(매개변수들) throws 예외클래스들{
......
}
지정예약어 : static 은 static으로 지정된 곳에서만 사용할수 있데유~
■ 자기자신의 객체를 참조하는 this
this의 정의 : 클래스 내부에서 자신의 클래스를 지칭하는 객체
this()의 정의 : 생성자 내부에서 자신 클래스의 또 다른 생성자를 지칭하는 메서드
메서드의 0번째 매개변수
- 자신_클래스명 this <- this 는 예약어
- 0번째 매개변수는 표기할 수 없다.
( Exam_01_Sub this,int x , int y);
■ 공유 필드를 위한 static
static 필드 : 데이터 값의 공유를 위해 선언하는 공간(멤버필드로만 가능)
- 클래스 이름으로 접근 가능
- 객체 발생 전 메모리 할당
■ Static 초기화 영역
static 초기화 영역 : static 멤버 필드의 값을 초기화 하기 위한 영역
: 생성자에서 초기화 하지 않는다.
형식) static { 초기화 구문..}
static 메서드 : static 필드 컨트롤 목적
- this가 0번째 매개변수로 갖고 있지 않는다.
■ 상수 필드와 변수를 위한 final
-final 필드 : 상수 값을 저장하기 위한 공간으로 값이 변경될 수 없음.
- 지역변수나 멤버 필드 모두 가능
-final 메서드 : 상속 시 오버라이딩 되지 않아야 할 메서드를 지정
- 만약 overriding 하게 되면 에러 발생.
■ 기타 지정 예약어
transient : (IO) 직렬화 되지 않는 멤버 Data 지정
BufferedReader , 이름,나이 -> 파일로 저장시에 BufferedReader 는 저장시에 빼주세요!!
instanceof : 특정 클래스의 instance 여부를 체크
■ 중첩 클래스(inner Class)
- 클래스 내부에 또 다른 클래스를 가짐으로 클래스 관리의 효율을 높인 것(static 포함 불가)
- 중첩 클래스의 형식과 생성 파일
형식) class Outer{ class Inner{...}}
생성파일) Outer.class, Outer$Inner.class
- 중첩 클래스 객체 생성
Outer.Inner oi = new Outer().new Inner();
■ 정적 중첩 클래스(static Inner Class)
- 중첩 클래스 내부에 static 멤버를 포함할 수 있는 형태(Outer의 non-static 멤버 포함 불가)
- 정적 중첩 클래스의 형식과 생성파일
class Outer { static class Inner{...}}
생성파일) Outer.class, Outer$Inner.class
- 정적 중첩 클래스 객체 생성
Outer.Inner oi = new Outer.Inner();
■ 지역 중첩 클래스(local Inner Class)
- 메서드 실행 시에 사용되는 클래스를 정의한 형식으로 접근자나 지정어를 가질 수 없다.
- 지역 중첩 클래스의 형식 및 생성 파일
class Outer{
method(){ class Inner{....} }
}
생성 파일은 Outer.class, Outer$숫자Inner.class
- 객체 생성은 외부에서 할 수 없다.
■ 익명 중첩 클래스(anonymous Inner)
기존 클래스의 특정 메서드를 오버라이딩 하여 원하는 형태로 재정의 하여 사용하는 방식
외부 멤버 중 final 만 포함 할 수 있다.
익명 중첩 클래스의 형식 및 생성 파일
class Inner{...}
class Outer{method(){ new Inner(){....}}}
Outer.class , Outer$숫자.class
new Inner() 자체가 객체 생성임
■ Object 와 super
포함 Object의 단점 : 객체명의 접근
최상위 클래스 : java.lang.Object
자바에서 생략된 형태들
import, default 생성자 , this , 0번째 매개변수, toString(), Object super()
■ this() 와 super()
- this() : 자신 클래스의 또 다른 생성자 호출
- super() : 상위 클래스의 생성자 호출
■ 필드와 메서드의 상속
필드 상속과 접근자 : protected (제약어)
super 와 this 예약어를 통한 접근
- 생략 시 자동 this 인식
■ 메서드의 상속과 메서드 재정의
- 메서드 오버라이딩 : 접근자와 예외 전가 (상속에서만 나타나는 오버라이딩)
: 동일한 이름의 메서드
- 메서드 오버로딩 : 매개변수 개수와 자료형
- final 메서드의 제약
private < package < protected < pubilc
■ 다형성의 표현
다형성이란 : 부모 객체를 통해 자식 객체를 표현하는 방법
멤버 필드의 다형성 표현
- 부모 객체의 필드만 사용 가능하다.
멤버 메서드의 다형성 표현
-자식 객체의 메서드를 먼저 수행
-자식 객체에 해당 메서드가 없다면 부모 객체의 메서드 실행
abstract and interface : 둘다 클래스라는 입장에서 바라봐~~~
abstract (추상적이다)
abstract 메서드
- 메서드의 내용부가 정의 되지 않은 형태로 모델 개념의 메서드
- 반드시 오버라이딩 되어야 사용 가능
- 메서드에 abstract가 포함되면... T.T Class 도 abstract가 들어가야 한데용;
abstract 클래스
- abstract 메서드를 포함하고 있는 클래스로 다형성 표현으로 사용
- 객체를 발생시킬 수 없는 것을 제외하면 일반 클래스와 동일
interface
- abstract 클래스의 한 종류로 포함 멤버의 제약을 가짐(순수 디자인 목적)
- 다중 상속이 가능한 유일한 클래스
interface의 포함 멤버
- public static final 멤버 필드
- public abstract 멤버 메서드
- public static inner 클래스
■ 멀티 Thread 와 API
- Thread 는 뭐냥? : 시작점과 진행 그리고 종료점을 가지는 일련된 하나의 작업 흐름
Thread 생성 클래스 : Thread, Runnable
: 클래스의 상속(단일 상속), 인터페이스 상속(다중 상속) 의 형태로 존재!!!
■ Thread의 우선 순위
: 우선 순위의 제어 , 순서를 줘라
독립 Thread와 데몬 Thread
: public static void main은 주 Thread 인거야
메인과 동일하게 끝나면, Deamon - Thread 이래
안끝나면... 독립 Thread
기타 Thread APIs : java.lang 안에도 Thread가 있데유
■ 동기화 : 지역 동기화와 메서드 동기화
synchronized , synchronized(this)
■ 예외와 예외처리
- 예외 전가(throws Exception)
- 예외란 : P/G 실행 시 예상치 못한 일로 발생한 에러
- 예외 처리 관련 예약어
throw : 예외를 발생시켜라
throws : 예외를 통과 시켜라!!!
try ~ catch(XXXXException x){} finally{}
예외 처리의 용도
- 정상종료, 예외보고, 계속 실행, 대안적 결과
사용자 정의 예외
Exception Class 상속
■ Packages
- 폴더의 개념
- package 란 유사 클래스를 묶어서 관리하는 폴더의 개념
- package 선언
: 주석을 제외한 상태에서 파일의 최고 상위에 위치 (package 경로.경로.경로....)
- package 컴파일
: javac -d 저장경로 파일명.java
- 사용법
: import 및 절대경로명
■ Assertion
- 예외처리와 일맥상통 ,
- assertion 이란 : 개발시에 주로 사용
: 특정 구문 실행 시 결과를 단정지어 표현하는 방법(원하는 결과와 다를 경우 에러발생)
형식 : assert [boolean 검증] : 에러처리
java -ea | da | esa 파일명
:ea는 enable assertion
da는 disable assertion
esa는 뭘까?
지정 옵션:
- ea:클래스 , -ea:... , -ea:<package명>
■ Collection 과 APIs
- 무한 데이터 입력,LinkedList 를 좀더 공부해!! (java.util.*)
- Collection 관련 APIs : Set , Map , List (무한적으로 데이터를 받아낼수 있는 배열이다.)
Collection은 무한한 데이터를 넣을수 있는것이야!!!
자기 참조 : java.util.*
구분 : 정렬이 되느냐!!(order) , 중첩데이터를 허용하느냐 마느냐
Set : 복주머니 속의 구슬, 정렬이 안되겠죠 ~ 로또!!!(순서가 없어, 정렬이 안되)
중첩 객체 허용 안됨!!!
Map : 깃발을 꽂아 놓았데... 구분이 가능할껍니다
중첩 개체 강력 허용!!!!
Ordering은 되지 않습니다.
List : 기차!!!!!, 먼저 달려있는지 알수 있다.(Ordering이 된다. 집어 넣은순서대로)
중첩 개체 허용
Ordering 허용
Set , Map , List 의 SubClass를 API에서 찾아봅시다.
■ Wrapper 클래스들
- Class라는 클래스와 Runtime 클래스
- String 클래스
- Data 와 Calendar 클래스
- SimpleDataFormat 클래스
- StringTokenizer 클래스
- For문의 확대, Generic & Auto-boxing
Generic : ArrayList<String> al = new ArrayList();
컬렉션 타입 쓸때 따라서 쓰는 것이다
설정
트랙백
댓글
글
■ Method 의 정의 및 용법
자주 반복하여 사용하는 내용에 대해 특정 이름으로 정의한 묶음
접근_제한자 지정_예약어 결과형_리턴값
메서드명(매개변수들) throws 예외_클래스들{
내용 정의부;
}
-Call by Name : 메서드의 이름에 의해 호출되는 메서드로 특정 매개변수 없이 실행
-Call by Value : 메서스를 이름으로 호출할 때 특정 매개변수를 전달하여 그 값을 기초로 실행하는 메서드
-Call by Reference : 메서드 호출 시 매개변수로 사용되는 값이 특정 위치를 참조하는 reference 변수
(배열,클래스 객체)
※ Call by Value 와 Reference 의 차이 : 원본 데이터 값이 변하냐 안하냐!!!!(응 그거 궁금했어용)
Call by Value : 안변해 , Call by Reference : 변해!!
결과형 리턴값 : 메서드를 실행한 후 결과로 되돌려 주는 값
- return 예약어를 이용
- void : 실행 후 돌려 줄 결과가 없을 때
- 원시 타입 자료형 : 8대 자료형(boolean , byte,short,char,int,long , float, double)
- 클래스형 : 모든 클래스나 인터페이스 형 (String)
■ 단일 차원 배열
배열의 정의 : 동일한 자료 형으로 선언된 데이터 공간을 메모리 상에 연속적으로 나열하여 데이터 관리의 효율성을 높인 것이다.!!!!!!
기존 자료 처리와 배열의 비교한다면 동일 자료형의 관리 , 유사 문구의 관리
cf) Garbage Collection Heap 에 할당을 시킬수 있는 연산자는 new
- 배열은 Reference 이다.
- 배열명은 4byte 객체이다.
- 배열의 길이는 length 속성을 이용할 수 있다.
- 배열의 실제 데이터는 Heap 영역에 표시된다. (new 연산자의 의미 : Heap에 대한 할당)
- Garbage Collection에 의해서 소멸된다.
- 각 공간은 첨자로 구분된다. (첨자는 0부터)
- 공간의 값은 자동으로 Default로 초기화 된다.(다른건 꼭 초기화 시켜라!!!)
- 동적으로 공간 할당이 가능하다.선언과 초기화
- 자료형[] 배열명 = {초기값,초기값...};
- 단일 차원 배열의 선언
자료형 [] 배열명; or 자료형 배열명[];
int [] x ;
(레퍼런스 주소 저장)
GC 힙 영역 12 byte 할당 -> 메모리 할당 x= new int[3];
런타임 스택 영역 -> 4byte 메모리 할당(void main) 주소를 저장하는 공간(레퍼런스)
레지스트리 영역
단일 차원 배열의 초기화
배열명 = new 자료형[개수];
동적메모리할당 연산자
배열명 = new 자료형[]{초기값,초기값...};
■ main Mehtod의 String 배열
(public static void main(String[] args){})
용도 : 프로그램 시작시 초기값 전달
형식 : java 클래스 명 초기값 초기값
배열 형식 : args.length
종료 Method : System.exit(처리수)
단일 차원 배열
for(int i = 0; i<inwon ; ++i){
for(int j =0 ; j<inwon; j++){
if(tot[i]<tot[j]) rank[i]++;
}
}
■ 다차원 배열
자료형[][] 배열명;
자료형 [] 배열명[];
자료형 배열명 [][];
다차원 배열의 초기화
배열명 = new 자료형[수][수]'
배열명 = new 자료형[][]{{2,3},{4,4,5,5,5}}; 행과 열이 동일하지 않아도 된다.
배열명 = new 자료형[개수][]; //동적배열
- 행의 개수는 지정하고, 열의개수는 비워두면... 동적 배열이 가능합니다.
- 다차원 배열에서 각 영역은 모두 Reference 이고, 마지막 배열 공간만 실제 데이터 공간이래
- 다차원 배열은 단일 차원 배열로 구성된다.
- 다차원 배열은 다중 For 문과 함께 사용하죠
- 다차원 배열에서는 동적 배열이 가능해버렷!!!
설정
트랙백
댓글
글
■ JAVA 개요 및 특징
- 자바의 주요 개념 및 특성(JVM)
자바의 분류
- J2SE : Java2 Standard Edition
- J2EE : Java2 Enterprise Edition
- J2ME : Java2 Micro Edition
■ JVM (Java Virtual Machine) 의 메모리 , 가상머신
- 인터프리트 용도 , 실행용도
- 스택 영역(Runtime stack) 실행시에 사용하는 메모리영역, 초기화가 자동화 되지 않다.퍼스트 인,라스트 아웃
- 힙 영역(Garbage Collection Heap) 동적 메모리 할당 영역
- 상수 영역(Constant & Code Segment) 상수 데이터 및 static 데이터 할당 영역
- 레지스터 영역(PRocess Regdister) 프로세서 실행 관련 메모리 할당 영역
※ 메서드 내부 선언 변수(지역변수)는 스택영역에 메모리 할당 (초기화 선행)
Method 내에서만 사용되고 소멸되는 변수, 메서드 종료 시점에서 JVM에 의해 메모리 제거
,클래스 내부 선언 변수(Member Field)는 힙 영역에 메모리 할당 되기 때문에 자동 초기화
클래스 내부에서 어느 위치든 사용 가능한 변수. 접근 제한자에 따라 다른 클래스 나 상속 관계에서도 사용 가능
Garbage Collection에 의해 메모리 제거
■ 자바에서의 약속
사용자 정의 명칭(Class , Method , Field)
- 첫 글자는 '_' ,'$', 영문 대,소문자 (한글 가능) ... 필드명으로 한글을 사용할수 있겠죠
- 글자수에 제한이 없다.
- 공백문자 및 특수 문자는 사용 불가능하다!!!!!
- 숫자는 첫글자가 아닐때는 사용 가능하다.
- 예약어 사용 불가!!!!
- 기타 단순 약속(대,소문자의 규칙)
Class의 첫번째 문자는 대문자
method, Field의 첫번째 문자는 소문자
Field의 상수는 전체 대문자로 해주는 것이 좋죠 ^^
합성어 중간 단어 앞은 대문자!!!
■ 자바의 주석처리
주석 처리 : 프로그램 실행에 영향을 미치지 않는 설명글
C언어 주석 : /* ~ */ -여러 줄 주석
C++주석 : // -한줄 주석
JAVA DOC 주석 : /** ~ */ - Doc를 위한 주석
■ 상수 와 변수 그리고 자료형 개념
상수 : 고유한 Data의 값으로 항상 동일한 의미를 가지는 개체
변수 : 상수를 저장하거나 보관하는 장소
변수명 : 변수에 대한 특정 이름
자료형 : 변수의 크기를 규정지어 미리 만들어 둔 크기의 약속
■ 자바의 기본 자료형과 String 클래스 (42억 byte에 메모리 할당이 됨.)
bit : 0과 1를 표시하는 최소 단위!!!(저급 언어)
1bit --> 2가지 의 경우의 수
2bit --> 4가지 의 경우의 수
3bit --> 000,001,010,011,100,101,110,111 8가지의 경우수
4bit --> 16가지
5bit --> 32가지
6bit --> 64
7bit --> 128
8bit --> 256 (최소 단위, 2의 7승) ==> 1 byte
(고급 언어)
논리형 자료형 : boolean (true,false) - 형변환 불가!!!!
정수형 자료형 :
- byte : 1byte(-128 ~ 127) 컴파일에러
8bit
0000 0000 -> 1byte
(2진수 -> 10진수 , 0 )
0000 0001
(2진수 -> 10진수 , 1 )
0000 0010
(2진수 -> 10진수 , 2 )
0000 0011
(2진수 -> 10진수 , 3 )
0111 1111
(2진수 -> 10진수 , 127)
1000 0000
(2진수 -> 10진수 , 128 -128)
1111 1110
(2진수 -> 10진수 , 254 -2)
1111 1111
(2진수 -> 10진수 , 255 -1)
위의 맨 앞자리를 음수,양수 로 구분한다.
0000 0000 으로 다시 돌고 돈다!!!
- short : 2byte(-32768 ~ 32767)
2의 15승 ~ 2의 15 -1(왜, 0이 양수쪽에 포함되어 있기 때문이지)
- char : 2byte (0 ~65535) : 문자형 (유니코드 , 1byte는 아스키 코드)
- int : 4byte (-2,147,483,648 ~ 2,147,483,647)
기본 자료형(자동으로 숫자는 integer로 된다)
- long : 8byte ( -922경 ~ 922경)
-2의 63승 ~ 2의 63승 -1
실수형 자료형
- float : 4byte
- double : 8byte (기본 자료형)
클래스 자료형
- String 클래스 : 문자열 저장
ex)
String str = new String("Java");
String str= "Java";
■ 아스키 제어문자 및 문자
0 '\0',null
8 '\b'
9 '\t'
10 '\n'
13 '\r' --아래와 처음으로 돌아가 : 엔터키는 '\r\n'
27 esc
48 ~ 57 '0' ~'9'
65 ~ 90 'A' ~ 'Z'
97 ~ 122 'a' ~ 'z'
■ Promotion 과 Casting
형 변환의 의미
- 상수의 값을 크기가 다른 변수에 담는 작업
Promotion(큰 공간) : 자동 형 변환
- 작은 공간의 변수 값을 큰 공간의 변수로 이동
Casting(작은 공간) : 강제 형 변환
- 큰 공간의 변수 값을 작은 공간의 변수로 이동
- 데이터 손실 고려
* boolean 형은 형 변환이 불가 하다!!!(다시한번 기억하시길 바랍니다.)
■ Wrapper라 불리는 클래스들
- 자료의 효율적인 관리 와 은닉화 와 객체화
- 종류 : Boolean ,Byte , Short , Character , Integer , Long ,Float , Double
- Documentation API 참고 활용
■ 연산자의 개념
- 피 연산자(상수 나 상수를 저장하고 있는 변수)들 사이의 계산방식을 특정한 기호로 표시 (+,-,*,/,%)
- 연산자 우선 순위(필수 암기??)
- 최우선 연산자 .,[],() -> 단항 연산자 -> 산술 연산자 -> 쉬프트 연산자 -> 관계 연산자 -> 비트 연산자
-> 논리 연산자 -> 삼항 연산자 -> 배정 대입 연산자 -> 증감 후위 연산자 -> 순차 연산자
1 . 최우선 연산자 : "." , "[]" , "()"
2. 단항 연산자(항이 하나로 구성되어 있다!!!!)
- 논리 부정 과 비트 부정 : "!" , "~" (!는 논리적인 부정에만 사용된다.)
"~" 비트 부정 : 변수 *(-1) -1
ex) ~4 = -5 이다.
- 부호 연산 : "+/-"
- 증감 전위 연산 : "++/--"
자기 자신의 값을 1씩 증/감
전위형는 상위 순위, 후위형 하위 순위 입니다.
- 형 변환 연산 : "(cast 자료형)"
- Type 비교 : "instanceof"
Exam_07 ex = new Exam_07();
boolean bool = ex instanceof Object;
3. 산술 연산자 : 연산 결과의 자료형
- "*","/","%" : 정수 연산 시 주의 ( 1/2 는 0 이 나올꺼야 ^^;;)
- "+" , "-"
사칙연산 시에 integer보다 작은 자료형의 결과값은 int 형으로 리턴된다.
사칙연산시에 integer보다 큰 자료형의 결과값은 큰 자료형 형태로 리턴된다.
(단 정수 외에 실수에서는 실수를 쫒아 가죠~~)
4. 쉬프트 연산자 : 특정 비트수 만큼 이동시에 사용된다.
한글 입력시 사용되는데, 16bit 속에 5bit씩 나눠서 초성,중성,종성 을 처리하고 , 나머지 1비트는 속성값.
- "<<" : left shift 연산자
1 << 3 = 8 => 1 * 2의3승
0000 0001 (앞의 3개의 0은 버려!!)
0000 1
0000 1000 (뒤의 3개의 0은 채워)
- ">>" : right shift 연산자
8 >> 3 = 1
=> 8 * 1/2의3승
0000 1000 (뒤의 3개의 0은 버려!!)
0 0001
0000 0001 (앞의 3개의 0은 채워)
- ">>>" : unsigned right shift 연산자
: 앞자리를 0으로 체워라~~~0이던 1이던 상관 말고~~~!!!
5. 관계 연산자(boolean 에 결과값이나타는경우)
-비교 관계 : > , < , >= , >=
-항등 관계 : == , !=
비트 연산자 : 논리에 사용 가능 ("&","|")
- "&" -and , "|" - or , "^" - exclusive or 배타적
2진 비트 데이터로 바꿔야 한다.
양쪽 비트가 모두 참이면 true
양쪽 비트가 모두 거짓이면 false
양쪽 비트가 서로 다르면 true
0은 거짓, 1은 참이다.
4 & 7
0000 0100
& 0000 0111
-----------------
0000 0100 = 4
0000 0100
| 0000 0111
-----------------
0000 0111 = 7
0000 0100
^ 0000 0111
-----------------
0000 0011 = 3
6. 논리 연산자 : "&&" - and , "||" -or
양쪽 논리를 가지고 논하고 , 앞에서 확인해서 논리가 통과 하면, 뒤에는 보지 않고 패스 한다.
이런 경우 비트 연산자를 쓴다.
6. 삼한 연산자 (if 문의 전신!!!! 두둥!!!)
- "조건항 ? 항1 : 항2"
배정 대입 연산자
- "=" , "*-", "/=" , "%=" , "+=", "-=" , "<<=" , ">>=" , ">>>=" 등
증감 연산자(후위)
x--;
t++;
7. 순차 연산자 (변수 선언할 때만 사용) : - ","
■ 제어문이란?
- 문장의 흐름은 위->아래, 좌-> 우 의 순이다.
- 문장의 흐름을 제어하여 예약어 - > 제어문
if 제어 : 만약 ~ 라면
1형식 : if(논리 조건문) { 내용부;}
2형식 : if(논리 조건문){...}else{...} 3항 연산자
3형식 : if(...){..}else if(...){...}else{...}
■ switch문은 특정 수나 문자에 대한 위치 이동을 제어 특징 , 수치나 문자에 따른 이동의 처리가 if문에 비해 빠르다. 컴파일 시에 위치가 정해진다.
switch(수치 or 문자){
case 조건수치 or 문자 : 내용부 ; [break;]
default : 만족하는 case가 없을 때 실행
}
cf) 주민 번호의 비밀 두둥!!!
1 2 3 4 5 6 ~ 1 2 3 4 5 6 7
12 년도수 , 34 월 , 56 일 -
1 성별 (9 or 0 - 1800년대생 9 남성 , 0 여성)
(1 or 2 - 1900년대생 1 남성 , 2 여성)
(3 or 4 - 2000년대생 3 남성 , 4 여성)
(5 or 6 - 외국인 5 남성 , 6 여성)
2 출생지 (0 :서울 , 1: 경기인천,2:강원,3:충북,4:충남,5:전북,6:전남,7:경북,8:경남,9 제주도)
4 구
56 읍면동
7 패리티코드
{(A*2)+(B*3)+(C*4)+(D*5)+(E*6)+(F*7)+(G*8)+(H*9)+(I*2)+(J*3)+(K*4)+(L*5)} ≡ M1 (mod 11)
11-M1 ≡ M (mod10)
(a ≡ b (mod m) 는 a - b = mk (k 는 어떤 정수) 가 성립)
■ loop문 ( 단일 for 제어문 )
정의 : 동일하거나 유사한 문장을 수치에 의해 반복 제어하는 문
for(초기화영역;조건부영역;증감부영역){
반복실행이 될 내용부
}
관련 예약어 : continue , break
continue : 가장 가까이 있는 닫힌 } 로 이동
break : 그냥 나가버렷!!!
■ 다중 for 제어문
for(초기화영역;조건부영역;증감부영역){
반복실행이 될 내용부
for(초기화영역;조건부영역;증감부영역){
반복실행이 될 내용부
}
반복실행이 될 내용부
}
관련 예약어 : Label , continue , break
■ while 제어문 : 동일하거나 유사한 문장을 행위에 의해 제어 하는 문
while(논리조건문 or true){
행위에 의한 반족 실행 내용부
}
관련 예약어: Label , continue, break
■ do ~ while 제어문
정의 : 선 실행 후 조건 비교 반복 제어문
do {
반복 실행 내용부;
}while(논리 조건문);
관련 예약어 : Label , continue, break
설정
트랙백
댓글
글
2002년도에 자바1.3 시절때 공부한 내용들을... 다시 한번 공부하고 있다.
공부의 이유인즉!! 현재 JAVA 1.6 까지 나온 마당에... JAVA를 사용하고 있음에...
매번 사용했던 패턴들만 사용하다 보니.. 이전 공부 했던 내용들에 대해서 많이 놓치고 간 부분들이 많았다.
공부하는데 있어서, 무엇이 두려울쏘냐!!! 기초부터 다시 시작했다.
그중에서 새삼 다시한번 중요한 부분에 대해서 기술한다.
1. if , switch
if 문과 switch 문 중에 어떤 것을 사용해야 할지에 대해서 고민하는 경우가 가끔씩 생긴다.
성능을 고려했을 경우에는 사실 switch 문을 써야 할 경우가 있다.
수치나 문자에 대한 이동의 처리가 if문보다 빠르다.(컴파일시에 위치가 정해짐)
2. for , do while 등의 Loop 문
loop 문 사용시에 break 에 대한 사용은 많았으나, continue 에 대한 사용이 거의 대부분 없었다.
continue를 사용해서 표현한다면, 프로그램상에 더 좋은 효과를 누릴수 있음에도, continue를 사용하지 않았다.
마지막으로 do while 에 대한 사용!!!
while 문을 꼭 do while 처럼 사용한 적이 많았다.
아니 이렇게 좋은 걸 놓고... 왜 이리 고민을 했을까?? 바보탱구리!!!
3. String class와 StringBuilder , StringBuffer 에 대한 사용
앞으로는 무슨일이 있더라도, String 를 사용하지 않겠다.
성능상에서 월등히 앞선 StringBuilder를 사용해서, 효율을 높이도록 할 예정이다.
String : 짧은 문자열
StringBuffer : Thread 에 안전하게 설계가 되었다고 함, 스레드를 고려한 시스템/프로그램에서 사용하면 될터!!
StringBuilder : 단일 Thread에 대한 안정성을 보장함. (JDK 5.0 추가)
String에 대한 사용시에 객체가 지속적으로 생성이 되는바, StringBuilder를 강추 한다.
(책에서 읽은 내용에서 보면, 테스트 결과에서도 어마어마한 차이를 나타낸다.)
이건 참 귀찮다고, 자주 안쓰고 있는데... 습관화를 꼭 하자.
설정
트랙백
댓글
글
웹 서비스라는 용어가 유행어처럼 널리 퍼진지도 이미 몇 년이 흘렀다. 하지만 그 높은 관심에 비해 적용도는 그다지 높지 않았다고 말할 수 있는데, 그 이유에는 여러 가지가 있었겠지만, 그 중의 하나를 꼽자면 기술적인 성숙도가 되겠다. 또 한가지는 설정의 어려움과 같은 개발 작업의 난해함과 같은 문제를 들 수 있겠다. 기술적인 성숙도의 문제는 해를 거듭해가면서 새로운 표준과 기술들을 내놓으면서 많이 해결되었으나, 설정의 어려움과 같은 문제는 여전히 남아 있었다. 하지만 자바 웹 서비스 2.0이라는 새로운 웹 서비스 모델은 이런 설정의 어려움을 해결함과 동시에 여러 새로운 기능들이 추가 됨으로써 새로운 도약을 할 수 있는 기반을 마련하였다.
예제와 자바 EE 5 애플리케이션 서버
이번 특집에 게재된 샘플들은 기본적으로 자바EE 5 애플리케이션 서버에서 동작한다. 샘플들 중 일부분에서 특정 벤더에서 제공하는 기능을 위주로 설명한 부분도 있지만 그러한 것들은 개발 및 배치 작업의 편의상 벤더에서 제공하는 기능을 사용하였을 뿐이다. 기본적으로는 JAX-WS 본연의 특성을 설명하는데 있어 영향을 미치지는 않는다. 현재 자바EE 5 호환 인증을 세계 최초로 통과한 제우스(JEUS) 6.0 프리뷰를 활용할 수 있으며 썬마이크로시스템즈(이하 썬)의 자바EE 5 SDK 도 사용할 수 있다. 하지만 사용자 편의성 측면 때문에 제우스 6.0에 일부 의존성이 있는 내용이 있으니 제우스 6.0을 활용한다면 더 편리할 것이다.
새로운 웹 서비스 모델 - 자바 웹 서비스 2.0
새롭게 재구성된 자바EE 5 웹 서비스의 가장 핵심은 JAX-WS 2.0이다. JAX-WS 2.0은 웹 서비스에 있어서 기존의 JAX-RPC를 대체하는 수단으로 설계되었으며 이제 막 그 위용을 드러내게 되었다. 하지만 왜 기존의 JAX-RPC라는 이름을 버리고 JAX-WS라는 이름을 택해야 했을까? 처음에는 JAX-WS 2.0은 JAX-RPC 2.0이라는 이름을 가지고 시작되었고 JAX-RPC 1.1과의 하위 호환성을 지원하도록 설계가 시작되었다. 그런데 개발 과정에서 여러 문제에 봉착해 결국 하위 호환성을 포기하고 이름 또한 JAX-WS로 바뀌게 된 것이다. 결국 JAX-RPC와 JAX-WS는 기술적으로는 완전히 다른 의미를 지니게 되었다. 이렇게 전혀 다른 모습으로 등장한 JAX-WS의 배경에는 JAXB 2.0의 등장이 있다. JAXB 2.0은 모든 XML 스키마 타입을 완전히 지원하게 됨으로써 기존에 존재했던 자바 타입과 XML 타입간의 매핑을 보다 명확하게 정의할 수 있게 되었다. 기존에 JAX-RPC 스펙에 존재하던 자바 타입과 XML 타입간의 매핑에 대한 의존성을 제거할 수 있게 하는 원동력이 되었다. 여기에다 SOAP 1.2 메시지를 직접 다룰 수 있게 하는 SAAJ 1.3까지 포함하여, 자바 웹 서비스 2.0이라는 새로운 웹 서비스 모델이 등장하게 된 것이다.
자바 웹 서비스 2.0의 핵심 JAX-WS 2.0
앞에서 언급했듯이 자바 웹 서비스 2.0은 JAX-WS 2.0, JAXB 2.0, SAAJ 1.3이라는 완전히 새로운 라인업으로 구성되어 있으며 이들의 한 가운데 이번 주제에서 다루려고 하는 JAX-WS 2.0이 존재한다. 우선 자바 웹 서비스 2.0의 핵심인 JAX-WS 2.0이 기존의 JAX-RPC 1.1에 비해 어떻게 달라졌는지 중요한 것들 위주로 살펴보자.
JAXB 2.0의 지원
먼저 눈에 띄는 차이는 JAX-RPC에서 담당하던 XML 타입과 자바 타입간의 매핑 처리를 JAXB 2.0에서 처리하도록 일임한 것이다. 기존에 JAX-RPC 스펙에서는 껄끄러운 자바 타입과 XML 타입간의 매핑에 대한 정의를 스펙 안에 포함하고 있었다. 이러한 작업은 JAX-RPC 스펙에 작지 않은 부담을 주고 있었다. 이는 JAX-RPC 스펙이 완성될 즈음에 XML 스키마를 100% 지원하는 JAXB 2.0이 존재하지 않았기 때문이다. JAXB 2.0이 완성되어 세상에 나온 이상 더 이상 자바 타입과 XML 타입간의 매핑을 중복하여 정의할 필요가 없게 되었다. 따라서 자바 타입과 XML 타입의 매핑은 JAXB에 모두 맡기게 되었다. 그로 인해 아쉬운 점도 생겼다. 부수적으로는 더 이상 ‘SOAP 인코딩’ 방식의 웹 서비스를 지원하지 않게 되었으며, 웹 서비스간에 주고 받는 메시지는 모두 XML 스키마로 정의되는 ‘Literal’ 방식의 웹 서비스만을 지원하기 때문이다. 하지만 이러한 사실조차도 웹 서비스 구현 벤더간의 상호 운영성을 저해하는 잠재적인 요소를 미연에 제거한다는 사실을 고려하면 긍정적인 측면도 있다.
어노테이션(Annotation)의 활용
JAX-WS 2.0은 JDK 1.5에서부터 지원되는 어노테이션을 적극 활용하여 웹 서비스 엔드포인트의 작성과 클라이언트를 작성할 때, 자바 타입과 WSDL간의 매핑을 명시적으로 정의할 수 있게 하였고 이를 런타임 시에도 활용할 수 있게 하였다. 또한 기존의 J2EE 1.4 엔터프라이즈 웹 서비스를 생성하기 위해 번거롭게 작성해야만 했던 웹 서비스 배치 서술자 같은 것은 모두 어노테이션으로 대체 가능하게 되었다. 이제껏 문제시 되었던 웹 서비스 작성에 존재했던 번거로움을 크게 경감시켜주는 절대적인 역할을 하게 되었다. 실제로 웹 서비스에 가장 큰 진입 장벽 중의 하나는 무엇보다 번거로운 설정 작업이었으며, 이러한 어려움을 어노테이션을 통해 크게 해결하게 된 것이다.
XML/HTTP 바인딩의 지원
기존 JAX-RPC에서는 SOAP/HTTP를 기본으로 지원 하였으나, JAX-WS에서는 SOAP 형태의 메시지 뿐 아니라 XML 형태의 메시지 자체를 웹 서비스 소비자와 서비스간에 주고 받아 처리할 수 있도록 하였다. 이 밖에도 바이너리 데이터의 효과적인 전송을 위해 MTOM (SOAP Message Transmission Optimization Mechanism)의 지원, 웹 서비스 클라이언트에서의 비동기 호출 API의 지원 등의 많은 변화가 있으나 지면 관계상 이 특성들의 소개는 다음 기회로 미루기로 한다.
JAX-WS 2.0에 기반한 웹 서비스의 생성
서론이 길었다. 그만큼 많은 변화가 있었다는 반증이기도 한데, 직접 웹 서비스를 생성하고 호출하는 작업을 소개하여 그 이해를 도울까 한다. JAX-WS 2.0에서는 기존의 J2EE 1.4 환경에서와 마찬가지로 두 가지의 웹 서비스 생성 방식을 제공한다. 하나는 자바 클래스 타입으로부터 시작하는 From Java 방식이고 또 다른 하나는 이미 정의되어 있는 WSDL로부터 시작하는 From WSDL 방식이다. 이 두 가지 방식으로 웹 서비스를 생성하기 위해서는 JAX-WS 2.0에서 어떻게 해야 하는 지 알아보자.
From Java 방식의 웹 서비스 생성
From Java 방식의 웹 서비스 생성은 기본적으로 다음과 같은 절차를 따른다.
1. 웹 서비스 어노테이션이 포함된 서비스 구현 빈의 작성
2. 타 벤더간에 이식 가능한 산출물(Portable Artifact)의 생성
3. 웹 서비스 패키징과 배치
이와 같은 절차를 좀 더 살펴보면 전반적으로는 기존의 JAX-RPC 환경에서 생성한 산출물을 기업용 웹 서비스로 공개하기 위해 꼭 필요했던 배치 서술자의 작성 등 번거로운 작업이 생략 가능하게 되었음을 알 수 있다.
● 서비스 구현 빈(Service Implementation Bean)작성
그럼 먼저 서비스 구현 빈(Service Implementation Bean)의 작성 방식부터 먼저 살펴보자. 서비스 구현 빈을 작성할 경우에는 몇 가지의 필수 제약 조건이 따르게 되는데, 이러한 필수 제약 조건들은 다음과 같다.
- javax.jws.WebService 어노테이션을 포함시켜서 이 클래스가 서비스 구현 빈임을 명시한다.
- 웹 서비스 메소드의 인자와 리턴 타입은 JAXB 2.0의 자바와 XML 스키마 간의 매핑 정의와 호환되어야 한다.
- 웹 서비스 메소드의 인자와 리턴 타입은 java.rmi.Remote 인터페이스를 직접 혹은 간접적으로 구현하지 말아야 한다.
package fromjava.server;
import javax.jws.WebService;
// JEUS에서 제공하는 웹 서비스 엔드포인트 설정을 위한 어노테이션
import jeus.webservices.annotation.EndpointDescription;
// 이 클래스가 웹 서비스 엔드포인트 임을 명시함
@WebService
// 이 웹 서비스 엔드포인트의 URL이 "HelloService" 가 되도록 설정함
@EndpointDescription(endpointUrl="HelloService")
public class HelloServiceImpl {
// 웹 서비스 메소드. 스트링 값을 받아서 리턴한다.
public String hello(String sHello){
return sHello;
}
}
이와 같은 요소들 말고도, javax.jws 패키지에 정의되어 있는 여러 어노테이션을 활용하면 메소드의 인자와 리턴 타입, 바인딩 방식 등의 커스터마이징이 가능하다. 그럼 간단한 예제 코드를 통해 실제 서비스 구현 빈이 어떻게 작성되어야 하는지 살펴 보자. <리스트 1>은 간단한 웹 서비스를 구현한 클래스의 예이다. JAX-WS 2.0에서는 기존 자바 클래스를 웹 서비스로 공개하기가 아주 쉽다. <리스트 1>에서와 같이 @WebService 어노테이션을 추가함으로써 쉽게 기존 자바 클래스를 웹 서비스로 변환하여 만들 수 있다. @WebService 어노테이션 이외에도 부가적인 웹 서비스의 엔드포인트도 설정할 수 있다. @Endpoint Description이라는 자바 클래스가 웹 서비스로 배치되었을 경우 공개되는 웹 서비스 엔드포인트 URL을 “HelloService”와 같이 특정한 값으로 설정할 수 있다(@EndpointDescription는 제우스 6.0에서 제공하는 어노테이션이다). 이는 기존의 JAX-RPC를 채용한 J2EE 1.4 웹 서비스 환경에서는 web.xml과 같은 배치 서술자에 추가적인 설정을 해 주었어야만 가능 했던 것이다. 하지만 자바 EE 5 웹 서비스 환경에서는 별도의 web. xml 같은 배치 서술자를 작성할 필요가 없으며 추가적인 설정은 앞에서와 같이 웹 서비스 어노테이션을 서비스 구현 빈만 추가하면 된다.
● 타 벤더 간에 이식 가능한 산출물(Portable Artifact)의 생성
서비스 구현 빈을 작성하고 컴파일 까지 수행했다면, JAX-WS 런타임에서 사용할 타 벤더 간에 이식 가능한 산출물을 생성해야 한다. 여기서 타 벤더 간에 이식 가능한 산출물이란, JAX-WS 스펙을 준수하는 모든 벤더에서 사용할 수 있는 JAX-WS 툴을 통해 만들어낸 산출물을 의미한다. 자바의 파라미터를 실제 WSDL의 메시지로 정확하게 매핑하기 위한 정보를 담고 있는 자바 클래스와 WSDL등이 여기에 포함된다. 제우스 6.0에서는 wsgen이라는 컨솔 스크립트를 제공하는데 이 스크립트는 %JEUS_HOME%/bin 디렉토리 밑에 존재한다.
wsgen -cp < classpath > -d < destination_directory> fromjava.server.HelloServiceImpl
<리스트 2>와 같이 명령을 실행하면 지정한 경로에 이식 가능한 산출물이 생성되는 것을 확인 할 수 있을 것이다. 위 스크립트를 실행할 때 -wsdl 옵션을 주면 WSDL까지 생성할 수 있다. JAX-WS 2.0에서는 웹 서비스 엔드포인트에 WSDL을 포함시키지 않아도 되므로 여기서 -wsdl 옵션을 주지 말아야 한다. 다음은 이 산출물들을 묶어서 서버에 배치하는 작업을 진행해 보자.
● 웹 서비스 패키징과 배치
현재 작성하고 있는 웹 서비스를 패키징 한다는 것은 서비스 구현 빈, 서비스 구현 빈이 참조하고 있는 자바 클래스와 부수적인 배치 서술자들을 WAR 형식으로 묶는 것을 의미한다. 여기서는 이미 앞에서 작성했던 파일인 fromjava.server.Hello ServiceImpl 클래스와 wsgen 스크립트를 통해 생성했던 fromjava.server.jaxws.Hello, fromjava.server.jaxws. HelloResponse 클래스만을 포함하면 된다. 이 클래스들은 WEB-INF/classes 밑에 포함시키면 된다. 패키징 할 파일 이름을 HelloService.war로 하여 WAR로 패키징 한 뒤에 제우스 6.0에 배치하려면, %JEUS_HOME%/webhome/deploy_home에 WAR 패키징을 복사해 두기만 하면 된다. 그러면 실제 이 서비스를 호출 할 수 있는 HTTP상의 주소는 다음과 같이 된다. http://localhost:8088/HelloService/HelloService 실제 이 주소로 웹 브라우저 상에서 호출해보면 <화면 1>과 같이 성공적으로 웹 서비스가 되는 것을 확인할 수 있다.
<화면1> 성공적으로 배치된 HelloService
● EJB 엔드포인트 웹 서비스의 생성
자바EE 웹 서비스 엔드포인트는 엔드포인트가 구동되는 환경에 따라 서블릿 엔드포인트 웹 서비스와 EJB 엔드포인트 웹 서비스로 나눌 수 있다. 즉 EJB 엔드포인트 웹 서비스는 웹 서비스의 비즈니스 로직이 무상태 세션 빈에 구현되어 있는 경우의 웹 서비스를 말한다. 짧게 줄여서 EJB 웹 서비스라고도 한다. JAX-WS 2.0에서의 EJB 웹 서비스 생성 방식은 서블릿 웹 서비스의 생성 방식과 유사하다. <리스트 3>은 EJB 형태의 서비스 구현 빈이다. 여기에서 알 수 있듯이 @WebService 어노테이션만 추가하면 기존의 무상태 세션 빈 클래스가 웹 서비스로 공개 될 수 있다. 이는 기존의 J2EE 1.4 환경에서 EJB 웹 서비스를 생성하기 위해서 ejb-jar.xml, webservices.xml과 같은 배치 서술자들을 필수적으로 작성해야 했던 것에 비해서는 괄목할 만한 변화이다.
<리스트 3>EJB 웹 서비스의 구현 - HelloServiceEJB.java
package fromjava.server;
import javax.jws.WebService;
import javax.ejb.Stateless;
import jeus.webservices.annotation.EndpointDescription;
// 이 EJB 빈 클래스가 웹서비스 엔드포인트임을 명시한다.
@WebService
// JEUS 6.0에서 제공하는 기능으로 HTTP상에서 접근 가능한 경로가 설정 가능하다.
@EndpointDescription(contextPath="webservice", endpointUrl="HelloService")
// 이 클래스가 무상태 세션 빈 클래스임을 명시한다.
@Stateless
public class HelloServiceEJB {
// 실제 웹 서비스 메소드로 공개되는 부분이다.
public String hello(String sHello){
return sHello;
}
}
이렇게 작성된 EJB 빈 클래스를 일반 EJB 3.0의 패키징 방식으로 묶어서 배치하면 다음 주소로 이 웹 서비스에 접근할 수 있다.
http://localhost:8088/webservice/HelloService
<화면2> 성공적으로 배치된 HelloServiceEJB
From WSDL 방식의 웹 서비스 생성
From Java 방식의 웹 서비스 방식이 이미 작성한 자바 RPC 모델을 웹 서비스로 공개하는 것이 초점이다. 한편, From WSDL 방식의 웹 서비스는 이미 서로간에 통신할 SOAP 메시지를 먼저 정의하고 WSDL를 통해 그 정보를 공유한 뒤에 정의된 메시지 타입에 맞도록 자바 클래스를 생성하는 것이 초점이라 할 수 있다. 일반적인 From WSDL 방식의 웹 서비스 생성은 다음과 같은 절차를 따른다. 그럼 이런 절차에 따라서 직접 From WSDL 방식의 웹 서비스를 생성해 보도록 하자.
1. 서비스 엔드포인트 인터페이스(Service Endpoint Interface)의 생성
2. 서비스 엔드포인트 인터페이스의 구현
3. 웹 서비스 패키징과 배치
● 서비스 엔드포인트 인터페이스(Service Endpoint Interface)의 생성
이 과정에서는 이미 공개되어 있는 WSDL을 기반으로 웹 서비스의 자바 인터페이스 파일과 자바 인터페이스 파일이 사용하는 자바 타입 클래스 파일들을 생성한다. 이 때 제우스 6.0에서 제공하는 wsimport라는 컨솔 스크립트를 사용하면 되고, 필요한 스크립트는 %JEUS_HOME%/bin에 있다.
// 이 경우, WSDL 파일은 ./wsdl 이라는 경로에 존재하는 것으로 가정하며,
// 생성된 SEI는 fromwsdl.server 패키지 이름으로 생성되게 된다
wsimport -keep -p fromwsdl.server -d ./build ./wsdl/HelloServiceImplService.wsde
<리스트 4>와 같이 명령을 실행하면, 지정한 경로에 서비스 엔드포인트 인터페이스와 서비스 정의 클래스를 포함한 여러 산출물들이 만들어진다. 이 중, 생성된 서비스 엔드포인트 인터페이스는 <리스트 5>와 같이 보이게 될 것이다. 이렇게 생성된 서비스 엔드포인트 인터페이스는 JAX-WS 2.0 런타임에 사용될 정보들을 어노테이션 형태로 포함하고 있다.
@WebService 어노테이션은 이 인터페이스가 웹 서비스 엔드포인트로 사용되고 있음을 나타내게 되고, @WebMethod 어노테이션은 이 어노테이션이 붙은 메소드가 웹 서비스로 공개 될 비즈니스 메소드임을 나타낸다. WSDL에 정의 되어 있는 메시지의 스키마 타입은 JAXB 2.0의 자바로의 매핑 법칙에 의해 특정한 자바 클래스로 생성이 되었다. 이들 파라미터와 리턴 타입을 서비스 엔드포인트 인터페이스에 이어 주는 역할을 하는 것이 바로 @RequestWrapper와 @Response Wrapper이다.
<리스트 5>JAX-WS 툴을 이용해 생성한 서비스 엔드포인트 인터페이스(SEI)
package fromwsdl.server;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.xml.ws.RequestWrapper;
import javax.xml.ws.ResponseWrapper;
// 이 생성된 인터페이스가 웹 서비스 엔드포인트임을 명시한다.
@WebService(name = "HelloServiceImpl",
targetNamespace = "http://server.fromjava/",
wsdlLocation = "./wsdl/HelloServiceImplService.wsdl")
public interface HelloServiceImpl {
/**
*
* @param arg0
* @return
* returns java.lang.String
*/
// 이 메소드가 웹 서비스 메소드로 공개될 메소드임을 명시한다.
@WebMethod
@WebResult(targetNamespace = "")
// 웹 서비스와 웹 서비스 소비자 간의 주고 받는 메시지 타입에 관한 정의이다.
@RequestWrapper(localName = "hello",
targetNamespace = "http://server.fromjava/",
className = "fromwsdl.server.Hello")
@ResponseWrapper(localName = "helloResponse",
targetNamespace = "http://server.fromjava/",
className = "fromwsdl.server.HelloResponse")
public String hello(
//주고 받는 웹 메소드의 파라미터가 SOAP 메시지 안에서 실제로 표기되는 방식을 정의한다.
@WebParam(name = "arg0", targetNamespace = "")
String arg0);
● 서비스 엔드포인트 인터페이스의 구현
서비스 엔드포인트 인터페이스가 만들어졌다면, 다음 단계는 이 엔드포인트 인터페이스를 구현하는 실제 비즈니스 로직을 가지고 있는 서비스 구현 빈을 작성하는 것이다. 서비스 엔드포인트 인터페이스를 구현한 서비스 구현 빈을 작성할 때에는 @WebService 어노테이션을 추가해야 한다. 이 어노테이션은 서비스 엔드포인트 인터페이스를 명시한 endpointInterface 멤터를 속성으로 가지고 있어야 한다. <리스트 6>에서는 실제로 서비스 엔드포인트 인터페이스를 구현한 서비스 구현 빈을 보여준다. 여기서도 @EndpointDescription이라는 어노테이션을 추가하여 HTTP 상에 공개할 엔드포인트 URL을 임의의 값으로 지정할 수 있다.
<리스트 6>서비스 엔드포인트 인터페이스를 구현한 서비스 구현 빈
package fromwsdl.server;
import javax.jws.WebService;
import jeus.webservices.annotation.EndpointDescription;
// 이 클래스가 실제로 웹 서비스의 엔드포인트 임을 명시하며, 보다 상세한 웹 서비스에 대한
// 서술은 적시한 서비스 엔드포인트 인터페이스를 참조할 것을 명시한다.
@WebService(endpointInterface="fromwsdl.server.HelloServiceImpl")
// 서비스에 접근하기 위해서 필요한 URL을 명시적으로 설정한다.
@EndpointDescription(endpointUrl="HelloServiceTopdown")
// wsimport를 통해 생성하였던 서비스 엔드포인트 인터페이스 HelloServiceImpl를 구현하고 있다.
public class HelloServiceImplSoapBinding implements HelloServiceImpl{
// 실제 구현된 웹 서비스 메소드다.
public String hello(String sHello){
return sHello;
} }
여기까지 해서 서비스 구현 빈까지 작성했다면 이를 웹 서비스로 공개하는 작업을 진행해보자.
● 웹 서비스 패키징과 배치
웹 서비스로 공개하기 위해 WAR 형태로 패키징 하는 작업은 이전의 From Java 방식의 웹 서비스 패키징 및 배치 작업과 유사하다. wsimport 스크립트를 통해 생성한 서비스 엔드포인트 인터페이스를 포함한 몇 가지의 산출물들과 서비스 구현 빈을 WEB-INF/classes에 두고 WAR 형태로 패키징 하면 된다. 이 때의 WAR 패키지의 이름을 HelloServiceTopdown.war라고 하였을 경우, 이를 제우스 6.0에 배치하면 다음과 같은 주소로 접근할 수 있게 된다.
http://localhost:8088/HelloServiceTopdown/ HelloServiceTopdown
실제 이 주소로 웹 브라우저 상에서 호출하면 다음과 같이 성공적으로 웹 서비스가 배치되는 것을 확인할 수 있다.
지금까지 From Java 방식과 From WSDL 방식의 웹 서비스 생성을 JAX-WS 2.0 환경에서 진행하는 방법을 예제와 함께 알아 보았다. J2EE 1.4 환경에서 웹 서비스 작성 작업을 진행한 경험이 있는 독자들은 이 작업들이 얼마나 간소해졌는지 쉽게 알 수 있었을 것이다.
웹 서비스 클라이언트의 작성과 웹 서비스 호출
웹 서비스에 접근하려면 먼저 웹 서비스 클라이언트를 작성하여야 한다. 웹 서비스 클라이언트 프로그램은 구동 환경에 따라 자바SE 클라이언트와 자바EE 클라이언트로 구분할 수 있다. 자바SE 클라이언트는 일반 자바 프로그램과 마찬가지로 구동되며 자바EE 클라이언트는 EJB나 웹 컨테이너 같이 자바EE 환경에서 구동된다는 특징이 있다. 먼저 간단한 자바SE 클라이언트의 작성법부터 살펴보자.
Java SE 클라이언트의 작성
JAX-WS 2.0에서는 기본적으로 웹 서비스 엔드포인트에 대응하는 동적 프록시를 내부적으로 생성하여 마치 이를 서비스 엔드포인트 인터페이스의 구현체인 것처럼 사용할 수 있다. 따라서 클라이언트 프로그램 개발자는 생성된 프록시를 통해 서비스 엔드포인트 인터페이스로 정의된 웹 서비스 메소드를 호출 할 수 있게 되는 것이다. 이와 같은 작업을 진행하려면 서비스 엔드포인트 인터페이스와 같은 몇 가지의 산출물들이 필요하다. 이 때 필요한 산출물들을 WSDL로부터 만들어 내기 위해서는 From WSDL 방식의 웹 서비스 생성에서와 마찬가지로 wsimport라는 스크립트 툴을 사용해야 한다. <리스트 7>은 그 사용 예이다.
// 클라이언트에서 필요한 SEI와 서비스 클래스가 생성이 된다.
wsimport -p fromjava.client.generated -d ./build http://localhost:8088/HelloService/HelloService?wsdl
서비스 엔드포인트 인터페이스와 서비스 클래스가 생성 되었다면, 이제 이를 사용하는 클라이언트 자바 프로그램을 작성한다. <리스트 8>은 웹 서비스 클라이언트 프로그래밍의 한 예를 보여준다. 이 부분은 기존 JAX-RPC에서 제공하던 웹 서비스 클라이언트 프로그래밍 예와 흡사하다. 기본적으로 서비스 인스턴스를 생성한 다음, 그 서비스 인스턴스로부터 서비스 엔드포인트 인터페이스를 구현한 프록시 객체를 얻어오는 작업이 주가 된다. 클라이언트 런타임 내부적으로는 많이 달라졌지만 어쨌든 겉으로 봐서는 자바SE 클라이언트에서는 유사하다고 할 수 있겠다.
자바 프로그램
package fromjava.client;
import fromjava.client.generated.*;
public class HelloClient {
public static void main (String[] args) {
try {
// 서비스 객체를 생성하고, 동적 프록시를 생성한다.
HelloServiceImpl port = new HelloServiceImplService().getHelloServiceImplPort();
System.out.println("Invoking HelloService");
// HelloService 웹 서비스를 호출한다.
String result = port.hello("Hi~ Micro Software");
System.out.println ("Following value has returned : "+result);
} catch (Exception ex) {
}
}
}
<리스트 8>과 같이 클라이언트 프로그램을 작성하였다면 실제 이를 컴파일 하여 실행시켜서 <리스트 9>와 같은 결과를 확인할 수 있다. 성공적으로 마쳤다면 다음으로 넘어가 보자.
Invoking HelloService
Following value has returned : Hi~ Micro Software
자바EE 클라이언트의 작성
자바EE는 클라이언트 프로그램의 구동 환경은 자바EE 환경이다. 크게는 서블릿 형태의 클라이언트와 EJB 형태의 클라이언트를 예로 들 수 있다. J2EE 1.4 환경에서의 웹 서비스 클라이언트는 web.xml이나 ejb-jar.xml에
package fromjava.client;
import javax.xml.ws.WebServiceRef;
import javax.servlet.http.*;
import fromjava.client.generated.*;
public class HelloJ2EEClient extends HttpServlet{
// @WebServiceRef 어노테이션을 추가하면 이 서블릿이 배치 되는 시점에 이 서블릿 클래스의
// svc라는 필드에 서비스 인터페이스의 인스턴스가 채워지게 된다.
@WebServiceRef(wsdlLocation="http://localhost:8088/ HelloService/HelloService?wsdl")
static HelloServiceImplService svc;
public void doGet(HttpServletRequest request, HttpServletResponse response) {
try{
HelloServiceImpl port = svc.getHelloServiceImplPort();
System.out.println("Invoking HelloService");
String result = port.hello("Hi~ Micro Software");
System.out.println ("Following value has returned : "+result);
}catch(Exception ex){
}
}
}
<리스트 8>과 <리스트 10>의 소스 코드를 비교해 보면 알 수 있듯이 두 클라이언트 프로그램의 내용은 거의 유사하다. 기존의 J2EE 1.4 환경에서의 클라이언트 작성할 때에는 별도의 배치 서술자를 작성해야 하는 번거로움이 있었다. JAX-WS 2.0에서는 @WebServiceRef 어노테이션을 추가함으로써 그러한 번거로움을 크게 줄일 수 있게 되었다.
이 서블릿을 구동하려면 WAR 형태로 패키징해야 하는데, 이때 서블릿에 관한 정보를 정의하는 web.xml이 필요하다.
< ?xml version="1.0" encoding="UTF-8"? >
< web-app … >
< description>Servlet Client for Hello Service
< display-name>Servlet HelloClient
< servlet>
< description> Endpoint for Servlet Hello Web Service
< display-name> Servlet HelloClient>
< servlet-name> HelloClient
< servlet-class> fromjava.client.HelloJ2EEClient
< load-on-startup> 0
< /servlet>
< servlet-mapping>
< servlet-name>HelloClient
< url-pattern>/HelloClient
< /servlet-mapping>
< /web-app>
웹 서비스 어노테이션
지금까지 기본적으로 웹 서비스 어노테이션을 활용하여 웹 서비스 엔드포인트를 생성하거나 클라이언트를 작성하는 방법들에 대해 알아보았다. 이렇듯 JAX-WS에서 어노테이션은 기존의 JAX-RPC 환경에서 수행해야 했던 작업량을 상당히 줄여주는 중요한 역할을 담당하고 있다. 자바와 WSDL의 매핑 및 자바 타입과 WSDL에서 참조하는 메시지의 스키마 타입으로의 매핑을 담당하고 실제 웹 서비스 메시지를 처리하는 런타임 프로세스 중에 필요한 정보들을 제공한다. JAX-WS 2.0에서 사용하게 되는 어노테이션의 정의는 웹 서비스에 국한된 어노테이션의 경우 Web Services Metadata(JSR-181) 명세와 JAX-WS 2.0 명세에 분산되어 정의되어 있다. 그 외에 메시지의 타입 매핑을 위해 범용적으로 사용되는 어노테이션은 JAXB 2.0 명세에 정의되어 있고, 리소스 인젝션과 생명 주기에 관련된 메소드들에 관련된 어노테이션들은 커먼 어노테이션(JSR-250)명세에 정의되어 있다. 여기서는 이러한 어노테이션들 중 웹 서비스 프로그래밍에 있어 자주 다루어 지는 것들을 위주로 좀 더 상세히 알아볼 것이다. 즉 웹 서비스 메타데이터 명세에 정의된 어노테이션이 소개 될 텐데, 참고로 JAX-WS 2.0과 JAXB 2.0 어노테이션은 웹 서비스 개발자가 직접 설정을 하는 것이 아니라 JAX-WS 툴에 의해서 생성된 코드에 자동으로 삽입이 된다.
웹 서비스 메타데이터(JSR-181) 명세에 정의된 어노테이션
원래 웹 서비스 메타데이터 명세는 자바EE 컨테이너 환경에서 자바 웹 서비스에 대한 정의를 쉽게 할 수 있도록 하기 위해 제안된 어노테이션을 정의하는 명세이다. 이 명세는 JAX-WS 명세가 정의되기 전에 이미 완성이 되어 있었으며, JAX-WS에서는 이 명세에 정의된 어노테이션을 활용하고 있다. 여기서 살펴 볼 어노테이션은 다음과 같다.
- javax.jws.WebService
- javax.jws.WebMethod
- javax.jws.OneWay
- javax.jws.WebParam
- javax.jws.WebResult
- javax.jws.soap.SOAPBinding
● javax.jws.WebService
@WebService 어노테이션은 어노테이션을 포함하고 있는 자바 빈 클래스가 웹 서비스를 구현한 엔드포인트 구현 빈 혹은 웹 서비스를 정의한 서비스 엔드포인트 인터페이스임을 명시할 때 사용한다. 이 어노테이션이 가질 수 있는 속성은 <표 1>과 같다.
| 속성 | 설명 | 타입 | 필수여부 |
| name | 웹 서비스의 이름. WSDL의 기본값은 자바 클래스나 인터페이스의 패키지명을 제외한 이름. |
String | No |
| targetNamespace | 웹 서비스로부터 생성된 XML 엘리먼트 와 WSDL에 사용될 XML 네임스페이스. 기본값은 JAX-RPC 스펙에 정의됨. |
String | No |
| serviceName | 웹 서비스의 서비스 이름. WSDL파일의 < wsdl:service>엘리먼트로 매핑 됨. 기본값은 자바 클래스나 인터페이스의 패키지 명을 제외한 이름에 “Service” 라는 스트링 값을 추가함. |
String | No |
| wsdlLocation | 미리 정의된 WSDL의 위치. wsdlLocation 값이 존재하면 SIB는 미리 정의된 WSDL 을 구현하고 있다는 것을 의미하며, WSDL에 정의된 portType, binding은 서비스 구현 빈에 구현된 값들과 충돌이 없어야 한다. |
String | No |
| endpointInterface | 존재하는 서비스 엔드포인트 인터페이스 의 패키지 명을 포함하는 클래스 이름으 로 이 속성은 클래스 경로에 엔드포인트 인터페이스 파일을 이미 생성하였을 때 설정할 수 있다. |
String | No |
| portName | WSDL에 표시되는 wsdl:portName | String | No |
<표 1> @WebService의 속성
● javax.jws.WebMethod
@WebMethod 어노테이션은 웹 서비스 오퍼레이션으로 공개하는 메소드를 설정할 때 사용한다. 이 어노테이션이 가질 수 있는 속성은 <표 2>를 참고하자.
| 속성 | 설명 | 타입 | 필수여부 |
| operationName |
주석이 사용된 자바 메소드가 wsdl상 에서 사용될 이름. |
String | No |
| action | 오퍼레이션에 적용될 “action” 속성. SOAPBinding의 경우, SOAP메시지에서 SOAPAction 헤더의 값을 결정하게 된다. 기본값은 “ ”이다. |
String | No |
<표 2> @WebMethod의 속성
● javax.jws.OneWay
@OneWay 어노테이션은 웹 서비스로 공개된 비즈니스 메소드가 반환 값이 존재하기 않고 단지 입력 파라미터만 존재할 때 사용한다. @WebMethod 어노테이션과 함께 사용된다. 웹 서비스 메소드의 반환 타입이 void가 아니거나 Holder 클래스 타입이 입력 웹 서비스 메소드의 파라미터의 타입으로 설정될 때, 웹 서비스 메소드가 필수처리예외(checked exception)을 던지는 경우에는 이 어노테이션을 붙일 수 없다. 이 어노테이션은 별도의 속성 정의가 필요하지 않다.
● javax.jws.WebParam
@WebParam 어노테이션은 웹 서비스 자바 메소드의 입력 파라미터와 WSDL 파일에서 파라미터를 표현 하는 XML 엘리먼트 간의 매핑을 설정하며 파라미터의 동작 특성도 설정할 수 있다. <표 3>과 같은 속성을 정의할 수 있다.
| 속성 | 설명 | 타입 | 필수여부 |
| name | 파라미터 이름. RPC스타일의 웹 서비스 에서는 파라미터를 나타내는 wsdl:part 엘리먼트에 대응이 되며, Document 스타일 웹 서비스에서는 파라미터를 나타 내는 XML 엘리먼트의 로컬 네임이 된다. 기본값은 메소드의 파라미터의 이름이다. |
String | No |
| targetNamespace | 파라미터의 XML 네임스페이스. 파라미터가 XML 엘리먼트로 대응되는 Document 스타일의 웹서비스에서만 사용된다. 기본값은 웹 서비스의 targetNamespace값이다. |
String | No |
| mode | 파라미터가 전달되는 방향. IN, OUT 혹은 INOUT중에 하나. OUT과 INOUT 모드는 JAX-RPC에서 Holder 타입으로 정의되 는 파라미터들을 설정할 때만 적용가능 하다. 기본값은 IN이다. |
enum | No |
| header | true로 설정되면 파라미터는 SOAP 메시 지 바디가 아니라 SOAP 메시지 헤더로 부터 가져오게 된다. 기본값은 false이다. |
boo-lean | No |
| partName | RPC 혹은 DOCUMENT/BARE 스타일의 웹 서비스에서 파라미터에 해당하는 partName을 설정한다. |
String | No |
<표 3> @WebParam의 속성
● javax.jws.WebResult
@WebResult 어노테이션은 웹 서비스로 공개되는 자바 메소드의 반환 값과 WSDL의 반환 값을 표현하는 XML 엘리먼트 간의 매핑을 설정한다. <표 4>와 같은 속성을 정의할 수 있다.
| 속성 | 설명 | 타입 | 필수여부 |
| name | WSDL에서 반환 값을 나타내는 엘리먼트 의 이름. RPC스타일의 웹 서비스에서는 반환 값을 나타내는 wsdl:part 엘리먼트 에 대응이 되며, Document 스타일 웹 서비스에서는 반환 값을 나타내는 XML 엘리먼트의 로컬 네임이 된다. 기본값은 RPC 및 DOCUMENT/WRA- PPED 스타일일 경우 “return”이며 DOCUMENT/BARE 스타일일 경우 메소드 이름+”Response” 이다. |
String | No |
| targetNamespace | 파라미터의 XML 네임스페이스. 파라미터가 XML 엘리먼트로 대응되는 Document 스타일의 웹서비스에서만 사용된다. 기본값은 웹 서비스의 targetNamespace값이다. |
String | No |
| mode | 반환값의 XML 네임스페이스. 반환값이 XML 엘리먼트로 대응되는 Document 스타일의 웹서비스에서만 사용된다. 기본값은 웹서비스의 targetNamespace 값이다. |
String | No |
| partName | RPC 혹은 DOCUMENT/BARE 스타일 의 경우, 응답에 해당하는 partName을 설정한다. 기본값은 @WebResult.name 이다. |
String | No |
<표 4> @WebResult의 속성
● javax.jws.soap.SOAPBinding
@SOAPBinding 어노테이션은 개발자가 웹 서비스의 SOAP 바인딩을 선택할 수 있게 해 준다. JAX-WS에서는 JAX-RPC에서 지원되었던 RPC/ENCODED 방식은 더 이상 지원하지 않는다. 즉 가능한 조합은 RPC/LITERAL, DOCUMENT/ LITERAL WRAPPED, DOCUMENT/LITERAL BARE위 세가지 타입이다. RPC/LITERAL 타입은 웹 서비스 메소드 이름에서 유추된 이름을 가지고 SOAP 요청/응답 메시지의 파라미터 부분을 한번 감싸게 된다. 이러한 메시지 형태의 생성은 SOAPBinding에 있어서의 하나의 약속이다. 그에 반해 DOCUMENT/LITERAL 방식은 WSDL에서 메시지의 형태를 스키마 타입으로 완전히 정의한다. 즉 SOAP 바디 내부의 모든 메시지는 WSDL내부의 스키마에 정의된 타입의 형태로만 만들어 질 수 있다. <표 5>는 @SOAPBinding의 속성을 나타낸다.
| 속성 | 설명 | 타입 | 필수여부 |
| style | 요청 및 응답 SOAP 메시지의 인코딩 스타일을 정의한다. DOCUMENT 혹은 RPC 중의 하나이다. |
enum | No |
| use | 요청 및 응답 SOAP 메시지의 포맷 스타일을 정의한다. LITERAL 혹은 ENCODED 중 하나이다. 기본값은 LITERAL 이다. |
enum | No |
| parameterStyle | 메소드 파라미터들이 SOAP 메시지 바디의 전체를 구성하는지(BARE), 혹은 파라미터들이 오퍼레이션 이름을 딴 최상위 엘리먼트의 안에 포함된 (WRAPPED) 엘리먼트인지를 결정한다. 기본값은 WRAPPED이다. |
enum | No |
<표 5> @SOAPBinding의 속성
예제의 사용
이제까지 설명된 모든 샘플은 이미 설명한 대로 wsgen이나 wsimport와 같은 스크립트 툴로 필요한 산출물을 생성하고, 직접 WAR나 JAR 형태로 패키징 하여 동일하게 실행해 볼 수도 있다. 더불어 독자들의 편의를 위해 ant 툴로 실행 할 수 있도록 별도로 작성하여 첨부하였다. 이 예제들을 실행 시키려면 다음과 같이 웹 서비스 엔드포인트 종류에 따라 <리스트 12> <리스트 13><리스트 14>와 같이 실행하면 된다.
이제까지 JAX-WS 2.0 환경에서의 간단한 웹 서비스를 생성하고 호출하는 방법에 대해 살펴보았다. 여기에 포함된 예제와 설명은 가장 기본적인 내용을 다루고 있으며 이 외에도 JAX-WS 2.0에는 많은 특성들이 있다. 하지만 가장 전형적면서도 일반적인 웹 서비스 예제를 다루며 설명하였으니, 앞으로 JAX-WS 2.0을 이용한 프로그래밍의 기회가 있거나 이제 막 웹 서비스를 시작하려는 독자에게 도움이 되지 않았을까 한다.
몇 년 전부터 변화와 진화를 거듭해온 웹 서비스는 기술적인 면에서 이미 괄목할 만한 성장을 이루었지만 여전히 진행형이다. 또한 현재 광풍 처럼 밀어 닥치고 있는 SOA(Service Oriented Architecture)와 ESB(Enterprise Service Bus)의 연관 기술로도 큰 관심을 끌고 있다. 이는 표준에 기반한 웹 서비스라는 기술이 그 만큼 활용도가 넓다는 반증일 것이다. 앞으로도 더 큰 발전이 기대되고 있는 웹 서비스 분야에 JAX-WS 2.0이 좋은 진입로가 되어주길 희망하면서 이만 마무리 할까 한다.
<리스트 12>From Java 방식의 서블릿 엔드포인트 웹 서비스 예제 // 웹 서비스의 생성 ant gen-service-bottomup // Java EE 웹 서비스 클라이언트의 생성 ant gen-client package-client // Java SE 웹 서비스 클라이언트의 생성 및 실행 ant gen-client run-client
<리스트 13>From Java 방식의 EJB 엔드포인트 웹 서비스 예제 // 웹 서비스의 생성 ant gen-service-ejb // Java SE 웹 서비스 클라이언트의 생성 및 실행 ant gen-client-ejb run-client-ejb
<리스트 14>From WSDL 방식의 서블릿 엔드포인트 웹 서비스 예제 // 웹 서비스의 생성 ant gen-service-topdown // Java SE 웹 서비스 클라이언트의 생성 및 실행 ant gen-client run-client
참고자료
1. Java EE 5 안내서 - http://java.sun.com/javaee/5/docs/tutorial/doc/
2. Java EE 웹 서비스 소개 링크 - http://java.sun.com/javaee/technologies/webservices/
3. JSR 181(Web Services Metadata for the Java Platform) 명세 - http://www.jcp.org/en/jsr/detail?id=181
4. JSR 224(JAX-WS) 명세 - http://www.jcp.org/en/jsr/detail?id=224
5. JSR 222(JAXB) 명세 - http://www.jcp.org/en/jsr/detail?id=222
6. JSR 250(Common Annotations) 명세 - http://www.jcp.org/en/jsr/detail - id=250
7. Tmaxsoft 홈페이지 - http://www.tmax.co.kr
8. Java EE 5 SDK - http://java.sun.com./javaee
9. GlassFish 프로젝트 - https://glassfish.dev.java.net/
10. JAX-WS 프로젝트 - https://jax-ws.dev.java.net/
설정
트랙백
댓글
글
이러한 팁은 Java SE 6을 사용하여 개발되었습니다. Java SE 6은 Java SE Downloads 페이지에서 다운로드할 수 있습니다.
이번 호 테크팁의 저자는 JZ Ventures사의 사장이자 주요 컨설턴트인 John Zukowski입니다.
이전에 다루었던 CookieHandler를 이용한 쿠키 관리 팁 에서는 J2SE 5.0이 네트워크 연결을 통해 쿠키 관리를 지원한다고 설명했습니다. 5.0 릴리스에서는 이러한 간략한 설명을 다루기 위한 프레임워크를 제공했지만 모든 작업을 수행하는 일은 개발자의 몫으로 남았습니다. 정의된 API를 따르기만 하면 되지만 실제로 프로그램에서 쿠키를 제대로 관리하려면 더 많은 작업이 수반됩니다.
J2SE 5.0 API를 다시 간략하게 살펴 보면 모호한 CookieHandler 클래스를 사용할 수 있게 되지만 실제 구현도, 스토리지 메커니즘도, 스토리지 정책도, 저장할 대상도 아무 것도 존재하지 않습니다. Java SE 6으로 이동하면서 CookieManager 클래스는 이러한 CookieHandler의 구현을 제공합니다. CookieStore는 스토리지 메커니즘이고, CookiePolicy는 쿠키를 수락하거나 거부하는 정책을 제공합니다. 그리고 HttpCookie는 저장할 개체입니다.
J2SE 5.0에서 수행하기 어려웠던 작업들이 Java SE 6에서는 기존 클래스를 활용한 간단한 작업이 되었습니다.
다음은 쿠키 작업을 위해 작동하는 J2SE 5.0 프로그램입니다.
import java.io.*;
import java.net.*;
import java.util.*;
public class Fetch {
public static void main(String args[]) throws Exception {
if (args.length == 0) {
System.err.println("URL missing");
System.exit(-1);
}
String urlString = args[0];
CookieHandler.setDefault(new ListCookieHandler());
URL url = new URL(urlString);
URLConnection connection = url.openConnection();
Object obj = connection.getContent();
url = new URL(urlString);
connection = url.openConnection();
obj = connection.getContent();
}
}setDefault 메소드는 중간에 CookieHandler를 호출합니다. ListCookieHandler 클래스는 기본 CookieHandler의 팁 구현이었습니다.
동일한 프로그램의 Java SE 6 버전은 거의 동일하며 다음 행만 다릅니다.
CookieHandler.setDefault(new CookieManager());추가 코드는 제공하지 않아도 됩니다. 간단하게 다른 API 사이를 이동할 수 있습니다. 다른 차이점은 있지만 페치(Fetch) 프로그램의 한 행을 변경하면 두 번째 네트워크 연결이 첫 번재 연결에서 반환된 쿠키를 사용합니다.
차이점은 다음과 같습니다. Java SE 6에는 CookiePolicy가 있습니다. 이것은 모든 쿠키를 수락하거나, 쿠키를 수락하지 않거나, 원래 호스트의 쿠키만 수락하는 기능인 CookieManager를 제공합니다. 다른 정책으로 CookieManager를 설정하려면 CookiePolicy 인터페이스의 상수 ACCEPT_ALL, ACCEPT_NONE 또는 ACCEPT_ORIGINAL_SERVER 중 하나를 사용합니다. 아무 것도 설정하지 않을 경우 마지막 옵션은 기본값이 됩니다. 쿠키 관리자를 구성하려면 아래에 표시된 대로 적절한 상수로 setCookiePolicy 메소드를 호출하십시오.
CookieManager manager = new CookieManager(); manager.setCookiePolicy(CookiePolicy.ACCEPT_NONE); CookieHandler.setDefault(manager);
그리고 CookieStore 및 CookiePolicy 인수 모두를 수락하는 CookieManager에 대한 두 번째 구성자를 호출할 수 있습니다.
CookieManager(CookieStore store, CookiePolicy cookiePolicy)
널 저장소에 전달되면 시스템이 사전 정의된 메모리 내장 버전을 사용합니다. 쿠키의 장기 스토리지를 제공하려면 고유한 인터페이스 구현을 정의할 수도 있습니다.
수정된 페치 프로그램 버전을 소개하기 전에 API 차이점을 하나 더 설명하겠습니다. 바로 쿠키 jar, err..., 관리자 등에서 쿠키 목록을 가져오는 방법입니다. CookieManager 클래스에는 CookieStore를 가져오는 getCookieStore 메소드가 있습니다. getCookies 메소드로 저장소에 쿠키 목록을 요청하면 목록 전체를 반복할 수 있습니다.
다음은 Java SE 6 버전의 쿠키 처리 API를 활용하는 이전 프로그램의 수정된 버전입니다. 기본 프로그램은 크게 변경되지 않았지만 지원되는 모든 사용자 정의 클래스는 이제 더 이상 필요하지 않습니다.
import java.io.*;
import java.net.*;
import java.util.*;
public class Fetch {
public static void main(String args[]) throws Exception {
Console console = System.console();
if (args.length == 0) {
System.err.println("URL missing");
System.exit(-1);
}
String urlString = args[0];
CookieManager manager = new CookieManager();
manager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);
CookieHandler.setDefault(manager);
URL url = new URL(urlString);
URLConnection connection = url.openConnection();
Object obj = connection.getContent();
url = new URL(urlString);
connection = url.openConnection();
obj = connection.getContent();
CookieStore cookieJar = manager.getCookieStore();
List<HttpCookie> cookies = cookieJar.getCookies();
for (HttpCookie cookie: cookies) {
console.printf("Cookie: %s%n", cookie);
}
}
}
특정 URL을 방문할 때 시스템에 쿠키가 남는지 확인하려면 프로그램을 컴파일하고 실행하십시오. ACCEPT_ALL을 사용할 수 없으면 http://www.sun.com/을 방문해도 쿠키가 표시되지 않지만 모두 사용 가능하게 설정하면 세 개가 표시됩니다. 여러분이 실행하면 다른 결과가 생성될 것입니다.
> java Fetch http://www.sun.com
Cookie: JROUTE=9999
Cookie: JSESSIONID=999999995d3f13ffffffffc68433979b7f5b0
Cookie: Starload=star-fep7
그렇습니다. J2SE 5.0 쿠키 처리 메커니즘에서 Java SE 6으로의 이동은 매우 쉽습니다. 기본 기능에 만족하면 추가로 인터페이스를 구현하지 않아도 됩니다.
설정
트랙백
댓글
글
Java DB는 완전히 자바로 만들어진 라이트웨이트 DBMS이다. 2MB의 메모리만 필요해서, 여러분의 애플리케이션에 직접적으로 데이터베이스의 기능을 충분히 할 수 있게 임베디드 하기 쉽게 되어 있다.
JavaDB는 또한 표준을 따르고, SQL과 JDBC API를 지원하며 J2EE와 쉽게 통합이 된다. Java 6버전의 릴리스를 시작으로, 썬은 JDK에 Java DB를 패키지 하기 시작했다.
DBMS 이후의 기술
아파치 더비(Apache Derby)는 Java DB의 핵심기술이다. 더비(Derby)의 데이터 베이스 엔진은 충분한 기능을 하는 관계형 임베디드 데이터 베이스 엔진이다. JDBC와 SQL은 API 프로그래밍의 주력이다.
Java DB를 구성하는 또 다른 핵심 구성요소는 더비 네트워크 서버이다. 네트워크 서버는 전통적인 클라이언트 서버 기능을 제공하는 더비 데이터 베이스 엔진의 범위를 확장한다. 네트워크 서버는 클라이언트가 표준 DRDA 프로토콜을 사용하는 TCP/IP 연결을 허용한다. 또 더비 엔진이 네트워크가 형성된 JDBC, ODBC/ CLI, Perl, 그리고 PHP 지원을 허용한다.
더비는 ij, dblook, 그리고 sysinfo의 3가지 유용한 유틸리티를 가지고 있다.
● Ij는 어떤 JDBC 데이터베이스와 연동하여 실행하는 SQL 스크립트를 허용하는 툴이다.
● dblook는 더비 데이터베이스를 위한 스키마 추출 툴이다.
● sysinfo는 버전 넘버와 클래스 패스를 표시하도록 허용하는 유틸리티이다.
멀티쓰레딩(Multithreading) 고민
애플리케이션이 임베디드된 더비 JDBC 드라이버를 사용한 더비 데이터베이스를 액세스 할 때, 더비 엔진은 별개의 프로세스에서 작동되지 않고 시작과 종료시 별개의 데이터베이스 프로세스가 없다.
대신에 더비 데이터 베이스는 애플리케이션처럼 같은 자바 가상 머신(JVM) 내에서 작동한다. 더비는 실제로 애플리케이션에서 사용하는 다른 jar파일처럼 애플리케이션의 한 부분이 된다.
더비는 주어진 데이터베이스에 다중 접속들을 지원한다. 임베디드 된 애플리케이션의 보기는 동시 사용자를 관리하는 임베디드 된 더비의 톰캣이나 제로니모 애플리케이션 서버이다. 어떠한 유저수도 웹서버를 통해 데이터베이스를 액세스 하는 웹 애플리케이션을 실행할 수 있다.
오직 하나의 JVM이 데이터베이스를 부팅할 수 있어서 다른 JVM에서 돌고 있는 여러 애플리케이션은 같은 데이터베이스를 액세스 할 수 없다.
JAVA DB 사용
DBMS 사용을 시작하기 위해서는 SDN(Sun Development Network)에서 Java DB를 다운 받아야 한다. 바이너리 파일은 임베디드 데이터베이스 애플리케이션을 하기 위해 필요한 모든 것을 제공한다.
파일을 다운로드 하고 나면 demo, frameworks, javadoc, docs 그리고 lib라는 서브디렉토리로 구성된 Java DB 디렉토리를 볼 수 있다.
● demo 2개의 데모 프로그램이 있다. 하나는 어떻게 임베디드 애플리케이션을 만드는지에 대한 견본이고, 다른 하나는 클라이언트-서버 환경에서 Java DB를 어떻게 사용하는지를 보여 주는 데모이다.
● frameworks 환경 변수, 데이터베이스 생성 및 작업의 셋팅을 위한 유틸리티를 가지고 있다(본고에서는 독립적인 애플리케이션으로 설명하기 때문에 이 서브디렉토리를 사용하지 않는다).
● javadoc API관련 문서가 있다. 만약 Java DB API Javadoc에서 지적하는 것 처럼 여러분의 IDE를 구성하려면 유용하다.
● docs Java DB의 제품 셋업, 어드민 및 레퍼런스 가이드가 있다.
● lib JAR 파일 같은 패키지 된 Java DB라이브러리가 있다.
(다양한 라이브러리에 대한 자료는 Java DB 문서를 참조하기 바란다.)
이 기사에서는 임베디드 된 데이터베이스 애플리케이션을 위해 derby.jar 라이브러리 파일만 사용할 것이다. 개발을 위해 Java DB를 설치하기 위해서는 derby.jar 파일을 애플리케이션 클래스패스의 부분으로 만드는 것만 요구된다.
바이너리 파일을 설치하고 클래스패스에 derby.jar 파일이 있으면 다른 JDBC 컴플라이언트 데이터베이스를 사용하는 것처럼 Java DB를 사용할 수 있다(만약 Java 6가 이미 설치되어 있다면, derby.jar파일을 클래스패스에 포함시키면 된다).
드라이버 관리
JDBC 기술의 드라이버의 로딩으로 DBMS를 사용할 수 있다(Java DB의 드라이버는 derby.jar 파일과 함께 있기 때문에 다른 것을 다운로드 받을 필요가 없다). 드라이버를 로드하기 위해 Class.forName 메소드를 사용하는 것을 참조한다. 임베디드 된 드라이버 이름은 org.apache.derby.jdbc.EmbeddedDriver이며, 다른 JDBC 드라이버를 로드하는 것처럼 할 수 있다.
Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
드라이버 매니저로부터 연결을 복구하려면 간단하게 데이터베이스를 정의하는 url 스트링을 제공하고 데이터베이스와 함께 상호 연결에 영향을 주는 프로퍼티(properties)의 세팅을 제공한다. 가장 일반적인 프로퍼티 사용은 연결시 유저명과 패스워드를 함께 하는 것이다.
url의 dbName 포션을 정의하는 것은 특정 데이터베이스이다. 데이터베이스는 현재 작업 디렉토리, JAR파일, 특정 Java DB 데이터베이스 홈 디렉토리, 파일 시스템상의 절대 위치 또는 클래스패스 상에서와 같이 많은 위치 중 한 곳에서 할 수 있다.
임베디드 된 환경에서의 데이터베이스 로케이션을 다루는 가장 쉬운 방법은 derby.system.home 시스템 프로퍼티에 세팅하는 것이다. 이 프로퍼티는 Java DB에 모든 데이터베이스의 디폴트 홈 위치를 말하는 것이다. propertyList의 옵션은 데이터베이스 시스템에 패스할 수 있는 프로퍼티 셋이다.
URL상의 Java DB 시스템에 프로퍼티를 패스하거나 별개의 프로퍼티 오브젝트로 패스할 수 있다. 만약 프로퍼티가 url의 일부이면, 세미콜론(;)은 각 프로퍼티의 소유권을 선행하여야만 한다. 아래에 가장 일반적인 프로퍼티가 있다.
databaseName=nameOfDatabase
user=userName
password=userPassword
shutdown=true
일단 어디에 모든 데이터 베이스가 존재할 것인지를 명시하면, 데이터베이스 연결을 복구한다. @
private void setDBSystemDir() {
// Decide on the db system directory: <userhome>/.addressbook/
String userHomeDir = System.getProperty("user.home", ".");
String systemDir = userHomeDir + "/.addressbook";
// Set the db system directory.
System.setProperty("derby.system.home", systemDir);
}
Connection dbConnection = null;
String strUrl = "jdbc:derby:DefaultAddressBook;user=dbuser;password=dbuserpwd";
try {
dbConnection = DriverManager.getConnection(strUrl);
} catch (SQLException sqle) {
sqle.printStackTrace();
}
출처 : 썬의 Java DB 사용법
: Get your feet wet with Sun’s tiny Java DB
RECENT COMMENT