JVM(Java Virtual Machine)1. 개념이해‘CPU에 대한 추상화를 수행하고, 각각의 컴퓨터에서 이 추상화된 CPU를 구현해주면 어떨까?’라는 것이 자바언어의 개발자들이 처음 자바를 개발할 때의 아이디어였다. 만약 어떤 컴퓨터에서 이러한 가상 컴퓨터가 구현되어있다면, 가상 컴퓨터에서 수행될 수 있도록 작성된 프로그램들은 이 시스템에서 동작할 것이고, 따라서 프로그래머가 한 번만 프로그램을 작성하면 이 프로그램이 모든 시스템에서 실행될 수 있다. 이러한 가상 컴퓨터를 자바 가상 머신(Java Virtual Machine, JVM)이라고 부른다. JVM이 어떤 특정한 CPU에 기반을 두고 있지 않기 때문에, 각 CPU에서 제공해주는 비트나 바이트 수준의 메모리 접근보다는. 보다 일반적으로 메모리에 접근할 수 있는 고 수준의 추상화가 제공되어야만 했다. 그래서 JVM에서는 메모리를 객체들의 집합이라는 개념으로 다루어준다.컴파일 : 자바 프로그램은 자바 언어로 쓰여진, 클래스 정의의 집합이라고 할 수 있다. 자바 컴파일러는 자바 프로그램을 JVM이 이해할 수 있는 형식으로 바꾸어준다. 이 변환 작업을 컴파일이라고 한다. 컴파일 과정을 거쳐 변환된 자바 프로그램은 바이트들의 집합으로 나타내어지는 클래스 파일 형식으로 바뀌어진다. 이 바이트들은 파일, 메모리, 웹서버 또는 데이터베이스등, 바이트를 저장할 수 있는 곳이라면 어디에라도 저장 할 수 있다.2. JVM의 정의와 역할자바 가상머신이 어떻게 구성되어야 하는지를 나타내는 공식적인 문서는, 팀 린드홀름과 프랭크 엘린이 쓴 ‘자바 가상 머신 명세서(Java Virtual Machine Specification)”이다.이 명세서는 다음의 세 가지가 정의되어 있다.명령어들의 집합과 각 명령어의 의미의 정의: 이 명령어들은 바이트 코드(Bytecode)라고 불렀다.클래스 파일 형식이라고 불리는 바이너리 형식: 이 형식은 바이트 코드를 전송하는데 사용되며, 클래스가 플랫폼에 독립적으로 동작할 수 있도록 해 준다.time linking이 지원되므로, 여러 클래스들이 한 프로그램을 구성하는 경우에, 한 클래스를 수정해야 할 일이 발생할 경우, 전체를 다시 컴파일할 필요가 없이, 단지 변경된 클래스가 속한 파일만을 컴파일해주면 된다는 장점을 갖게 된다. garbage collection은 더 이상 사용하지 않는 메모리 영역을 시스템 자원으로 돌려주는것이라고 말할 수 있다. 이것은 프로그래머의 실수로 인한 memory leak(메모리 누수 현상)을 방지해주며, 그에 따라 프로그래머의 부담을 덜어주게 된다.JVM의 단점은 다른 인터프리터 방식의 언어(ex. BASIC)보다는 상당히 빠른 수행능력을 보이지만, 일괄 컴파일 방식 언어(ex. C, C++)보다는 수행 속도가 느리다는 것이다. 이것은JVM이 컴파일하여 생성한 byte code를 사용하긴 하지만, JVM이 실행 중에 byte code를Native code로 변환하는 시간을 필요로 하기 때문이다.3. JVM의 구성Class Area : 프로그램 코드와 상수가 저장된다.Java Stack : 프로그램의 수행 도중 어떤 메소드가 호출되었는지를 기록하고, 각 메소드의 호출과 관련된 데이터들의 정보를 기록한다.Heap : 객체가 저장된다.Native method stacks : 네이티브 메소드를 지원하기 위해 존재한다.1) Class Area시스템에 로드된 클래스들이 저장된다. 구현된 메소드는 메소드 영역이라는 공간에 저장되며, 상수들은 상수풀이라는 곳에 저장된다. 클래스 정의는 객체를 생성하기 위한 템플리트로 사용되며, 생성된 객체들은 힙에 저장된다.클래스는 다양한 구성요소를 가지고 있다.수퍼클래스인터페이스들의 리스트필드들의 리스트메소드들의 리스트와 구현된 메소드상수들의 리스트2) Java Stack메소드가 호출될 때마다, 스택 프레임이라고 불리는 새로운 데이터 영역이 생성된다. 이러한 스택 프레임이 모여서 Java Stack을 생성한다. 자바 스택에서 스택의 최상단에 존재하는 스택 프레임은 활성화된 스택프레임이라고 불린다.은 방식으로 사용된다. 그러나 이 스택을 사용하는 메소드들은 JVM의 명령어들이 아닌, 다른 언어를 사용해서 구현된다. 이것은 프로그래머가 자바만을 사용해서는 해결할 수 없는 일, 예를 들면, 플랫폼에 독립적인 인터페이스를 제작하는 일들을 다른 프로그래밍 언어를 사용하여 처리할 수 있도록 해 준다.JVM의 구조“java App hello everyone”App 클래스의 main() 메쏘드가 시작점나머지 인자들은 main()의 String 매개변수에 전달된다.실행 환경을 설정하고 초기화시스템으로부터 힙을 할당“Object”, “Class”, “String”, “Thread” 등의 클래스 적재프로그램 시작 클래스 적재main() 메쏘드 호출클래스 로더(Class loader)동적 클래스 적재(Dynamic, on-demand loading)-적재(loading)클래스가 처음 참조될 때 시스템에 적재된다클래스 파일을 메모리에 바이트 스트림으로 읽는다.-연결(linking)적재된 클래스 내의 심볼 참조를 링크한다.플랫폼 독립을 위해 주소를 사용하지 않고 심볼 참조만 사용-초기화(initialization)정적 변수 초기화연결(Linking)-검증(Verification)적재된 클래스의 구조적 정확성을 검사한다.-준비(Preparation)클래스의 정적 필드를 생성하고 초기화한다.-해결(Resolution)심볼 참조의 유효성을 검사하고이들을 직접 참조(direct reference)로 대치한다.클래스 검증기(Class Verifier)-왜 클래스 검증이 필요한가?네트워크를 통한 신뢰할 수 없는 클래스로부터 시스템 보호-클래스 파일의 무결성 검증클래스 파일이 JVM 명세의 제약 조건을 만족하는지 검사스택과 변수 등의 비정상적 사용을 찾기 위해 실행 전에 실행 과정 시뮬레이션4단계 검증 과정-패스 1클래스 파일 포맷을 만족하는지 검사-패스 2바이트코드를 보지 않고 클래스 파일이 의미 있는지 검사모든 클래스는 수퍼클래스가 있어야 한다.최종 클래스(final class)는 상 따른 메모리 할당쓰레기 회수미사용 객체의 자동 회수실행 시간 데이터 영역-pc 레지스터바이트코드 명령어의 주소로쓰레드 당 하나의 pc-자바 스택쓰레드 당 하나의 자바 스택메쏘드 프레임을 위한 기억공간-힙객체와 배열을 위한 기억공간쓰레기 수집모든 쓰레드가 공유하는 기억 공간실행 엔진(Execution Engine)-JVM의 핵심부명령어의 꺼내오기(fetch), 해독(decode), 실행(execute)다른 부분의 동작을 촉발시킨다.-소프트웨어 혹은 하드웨어 구현소프트웨어빠른 해석기 구현Just-in-Time 컴파일러하드웨어Java 프로세서예외 관리자(Exception Manager)-예외Java의 예외 처리 메커니즘프로그래머가 예외 처리를 제어할 수 있다.try – catch – finally-예외 테이블(Exception table)각 메쏘드는 catch 블록들을 나열하는 예외 테이블을 포함-예외 관리자예외가 발생하면 예외 관리자는 예외 테이블을 검색하여 해당 처리기로 제어를 이전한다.네이티브 메쏘드 연결-네이티브 메쏘드(Native Method)C나 C++ 같은 언어로 구현된 메쏘드하드웨어에 대한 접근성능 개선e.g.) MPEG 해독DLL 같은 라이브러리-JNI (Java Native Interface)Java 시스템과 네이티브 메쏘드 사이의 표준 인터페이스JVM의 데이터 타입-기초 타입(Primitive types)정수 관련 타입byte(8 bits), short(16 bits), int(32 bits), long(64 bits), char(16 bits, UNICODE)부동소수점 : float(32 bits), double(64 bits)boolean : true /falsereturnAddress : 바이트코드 명령어 주소-참조 타입(Reference types)클래스(class)배열(array)인터페이스(interface)바이트 코드 명령어-8비트 연산코드를 갖는 202개 명령어-스택 기반 실행오퍼랜드 스택을 이용명령어 실행 전 오퍼랜드들을 스택에 변수 : this-invokespecial실체 초기화 메쏘드, 전용 메쏘드, 수퍼클래스 메쏘드 호출묵시적 매개변수 : this-invokestatic클래스의 정적 메쏘드(static method) 호출메소드 호출과 프레임-메쏘드 m 호출 전호출의 대상 객체(target object) 주소를 스택에 적재실 매개변수 값들을 스택에 적재메쏘드 m 호출 후-m을 위한 새로운 프레임을 자바 스택에 적재호출자의 오퍼랜드 스택으로부터 m의 실 매개변수를 제거m의 지역변수(형식 매개변수)에 실 매개변수 값 복사m 의 다른 지역 변수 초기화메소드 호출 예InvokevirtualInvokestatic메소드 테이블(Method Table)-클래스 당 자료 구조클래스의 메쏘드들에 대한 포인터를 갖는 테이블메쏘드 호출을 위한 자료구조각 객체는 해당 클래스의 메쏘드 테이블 포인터를 갖는다.-메쏘드 호출 구현객체로부터 메쏘드 테이블 포인터를 얻는다.메쏘드 아이디를 이용하여 해당 메쏘드의 주소를 얻는다.그 주소로 점프한다.-상속과 재정의서브클래스는 수퍼클래스의 메쏘드 테이블을 상속 받는다.메쏘드가 재정의되면 상응하는 메쏘드 테이블 엔트리도 갱신된다.메소드 테이블(Method Table)메소드 호출 예예외 처리-예외 관리자예외 발생 지점의 문맥(context)를 저장한다.예외를 처리할 수 있는 가장 가까운 catch 절을 찾는다.발생된 예외의 타입과 예외 테이블의 catch 절에 선언된 타입을 비교한다.찾으면 예외(에 대한 참조)를 오퍼랜드 스택에 넣고 catch 절을 실행한다.찾지 못하면 해당 자바 쓰레드를 종료한다.-정상적인 실행 흐름은 catch 절의 예외 처리기와 분리된다.JVM의 try-catchJVM의 도전적인 주제-실행 속도해석 오버헤드(Interpretation overhead)가상 호출 대 직접 호출(Virtual call vs. direct call)쓰레드 동기화(Thread synchronization)예외 관리(Exception management)-메모리 관리메모리 ed.
1. JAVA Platform : Java API + Java Virtual Machine-Java API : 프로그램을 짤 때 사용하기 위한 라이브러리의 집합-Java Virtual Machine: 작성된 프로그램을 실행시키기 위한 환경2. 정의: Java Virtual Machine의 약자, Machine이라고 칭하지만 소프트웨어2.1 JVM의 구조2.2 JVM의 시작1) 클래스의 main() 메소드가 시작점, 나머지 인자들은 main() String 매개변수에 전달된다2)시작 과정-실행 환경을 설정하고 초기화-시스템으로부터 힙 할당-Object, Class, String, Thread 등의 클래스 적재-프로그램 시작 클래스 적재-main() 메소드 호출2.3 클래스 로더(Class Loader)1) 동적 클래스 적재(Dynamic, on-demand loading)-클래스가 처음 참조될 때 시스템에 적재된다.-클래스 파일을 메모리에 바이트 스트림으로 읽는다.-적재된 클래스 내의 심볼 참조를 링크한다. (플랫폼 종속을 없애기 위해 주소를 사용하지 않고 심볼 참조만 사용함)2) Java 클래스 classloader-클래스 로더를 사용자가 정의 가능하여 자신만의 적재 정책을 만들 수 있다.3. JVM의 역할: byte code 실행을 위한 가상 CPU역할-byte code : 자바 컴파일 시 생성되는 class 파일, native code의 중간단계의 언어-byte code를 생성하는 이유: 이식성, native code는 CPU종속적(컴파일 된 CPU에서만 돌아감), byte code는 JVM에서 돌아가기 때문에 어떤 플랫폼이든 JVM만 있으면 실행 가능함.3.1 바이트코드 명령어-8bit 연산코드를 갖는 202개 명령어-스택 기반 실행: 오퍼랜드 스택을 이용하고, 명령어 실행 전 오퍼랜드들을 스택에 적재하고 결과 값도 스택에 적재한다. 레시스터는 없고 대신 지역변수를 사용한다.-오퍼랜드 타입 명시: iadd(정수 덧셈)-복잡한 명령어들: 메모리 할당, 모니드 내의 한 모듈에서 참조하고 있는 다른 모듈의 상대적 위치를 결정하는 작업을 말한다. 링크 편집이 완료되면 로드모듈이라는 결과물이 만들어 지는데, 로드모듈이 작성되었다는 것은 실행에 대한 모든 지침이 마련되었다는 것을 뜻한다. 그것은 변수 a의 데이터 타입이 런타임 이전에 이미 파엘 내에 기록되는 셈이다.컴파일 언어가 프로그램 전체를 번역한 후 실행된다면, 인터프리터 언어는 명령 줄 단위로 번역 한 후 그 결과를 머신에 전달하는 방식을 취한다.do {byte opcode = fetch an opcode;switch (opcode) {case opCode1 :fetch operands for opCode1;execute action for opCode1;break;case opCode2 :fetch operands for opCode2;execute action for opCode2;break;case ...} while (more to do)1)클래스로더가 클래스파일의 바이트코드를 가져온다.2)JVM은 메모리에서 바이트코드(opcode) 하나를 꺼내온다.3)가져온 바이트코드에 매핑되어 있는 동작을 찾아가서 수행한다.다른 클래스의 메소드를 호출하는 경우라면 해당 클래스를 메모리에 적재한 후 수행한다.4)인터프리트할 바이트코드가 없을 때까지 2)번과 3)번 과정을 반복한다.SWITCH/CASE 구문 자체가 말해주는 바대로, 명령줄 단위로 번역하고 실행하는 것이 인터프리팅 동작의 원리다. 이와 같이 인터프리팅 언어는 명령 줄 단위로 실행되기 때문에 개발자의 즉각적인 테스트가 가능하다. 또한 프로그램 전체가 로딩될 필요가 없기 때문에 컴파일 언어에 비해 메모리를 적게 사용할 수 있다.4.2 인터프리팅 또는 실행의 지연-메모리 사용의 효율성, 디버깅의 편리성 등 인터프리트 언어에는 여러 가지 장점들이 있지만 자바에서는 인터프리팅이 갖는 ‘지연 성질’에 주목한 것 같다. 명령의 실행을 늦춘다는 것은 그것이 행해지는 시점의 문맥에 맞추어 해석하고 판단할 수 있는 여지를 서 바인딩은 컴파일 타임에 이루어진다. 이렇게 정해진 이름과 속성은 로딩 과정에서 메모리에 그대로 적재되고 실행된다. 이에 비해 인터프리트 언어는 런타임 시점에 이름에 대한 속성을 결정할 수 있다. 전자가 정적 바인딩, 후자가 동적 바인딩이다.동적 바인딩은 객체지향 언어의 가장 중요한 성질인 다형성을 실현하는 데 크게 기여한다. 데이터 타입이 실행 시점의 상황에 따라 여러 형태로 캐스팅되는 성질이 바로 다형성의 핵심 내용이기 때문이다. 객체지향에서 타입은 데이터뿐만 아니라 메소드에도 영향을 미친다. 따라서 철수.일하다() 라는 메소드는 그것에 어떤 타입이 할당되었느냐에 따라 다르게 수행될 수 있다. '철수'에 '교수' 타입이 할당되었다면 강의가 행해질 것이고, '운전자' 타입이 할당되었다면, 운전하기가 행해질 것이다. 컴파일 언어인 C++에서는 이를 위해 가상 함수라는 것을 특별히 사용해야 하지만 자바에서는 디폴트로 구현된다.3) 동적 링크동적 바인딩의 한 맥락이다. 모듈 A가 모듈 B를 호출할 때, A는 B의 상대적 참조값 또는 위치 정보를 알고 있어야 한다. 컴파일 언어에서는 런타임 이전에 링크 편집을 완료하기 때문에 실행 시에는 이미 확정되어 있는 심볼 정보를 바탕으로 참조하고 있는 모듈들을 찾아가기만 하면 된다. 이 같은 정적 링크 방식은 프로그램 관리를 번거롭게 만드는 요인이 된다. B 모듈 중 참조값과 관련된 사항이 바뀌었다면, 바뀌는 대로 B는 물론 A도 재컴파일 및 링크하여야 한다는 것을 의미한다. 그렇게 하지 않는다면, 치명적인 오류가 발생할 수도 있다. 이에 반해 인터프리트어의 경우에는 실행 시점에 호출 함수들에 대한 참조값을 알아낸다. 이렇게 함으로써 인터프리트어는 컴파일 언어가 갖는 '관련된 모듈의 재컴파일 및 링크'라는 과정을 피할 수 있게 된다.4) 보안성웹 서핑 중 브라우저를 통해 특정한 프로그램 코드가 자동으로 배포되고 실행된다면, 시스템은 항상 위험으로부터의 노출을 고려해야 한다. 왜냐하면 배포되는 코드를 통해 악의적인 데이터나 collection-자바 프로그램이 더 이상 참조되지 않는 메모리를 모아 시스템에 되돌려 주는 것-프로그래머는 메모리에 대해 관여하지 않음① simple garbage collectionMark-sweep 방식*mark단계-주기적으로 전체 메모리를 탐색하여 garbage를 찾음.-local variable array와 stack에서 참조하는 각 객체를 ‘유효함’ 상태로 체크*sweep단계-유효함 체크 과정이 끝나고 유효함 체크를 받지 못한 객체를 garbage로 간주-garbage로 간주된 객체는 garbage collector에 의해 수거된다.=>garbage collection이 진행중인 경우, garbage collector 이외의 모든 쓰레드는중지되어야 한다. Garbage collection 하는 중에, 유효하다고 체크되는 경우는 없지만 실제 유효한 객체에 대한 참조를 다른 쓰레드가 메모리에서 옮기고 다닐 수 있기 때문에 그 객체가 garbage로 간주될 수 있다.② generational garbage collection-메모리 일부만 탐색하여 garbage를 찾는 방식으로 mark-sweep 방식보다 전체처리 속도 향상-자바 프로그램에서 만들어지는 대부분의 객체들은 매우 짧은 시간 동안만 참조되어진다는 것과 오랫동안 유효했던 객체는 계속적으로 유효할 것이라는 전제를 바탕으로 함-객체들의 생성 시기를 기준으로 세대별로 묶이게 된다.-heap이 객체들의 한 ‘세대(generation)’에 의해 두 개 이상의 각 subheap으로나뉘어 진다.-객체가 처음 생성되면 특정 subheap에 메모리를 할당해 준다.-대부분의 객체가 수명이 짧으므로 첫 번째 garbage collection이 일어나면 살아있는 객체는 아주 적음. 이 때 가장 어린 세대로서 살아 남은 객체는 다음 세대로 등급이 올라가고, 다른 subheap으로 옮겨진다.-어린(young) 객체는 늙은(older) 객체보다 더 자주 garbage collection 한다.6. JVM의 단점: BAthod();}static void secondMethod() {System.out.println("secondMethod()");}}(1)~(2): JVM에 의해 main메소드가 호출되고 프로그램 시작, 스택에 main메소드를 위한메모리공간이 할당되고 main메소드 코드가 수행되기 시작함.(3): main메소드에서 firstMethod()를 호출한 상태, main메소드가 끝나지 않았으므로 main메소드는 스택에 대기상태로 남아있고 firstMethod()의 수행이 시작됨.(4): firstMethod()에서 다시 secondMethod()호출, firstMethod()역시 secondMethod()가 수행을 마칠 때까지 대기상태에 있는다. secondMethod()의 수행이 끝나야 firstMethod()의 나머지 문장이 수행될 수 있다.(5): secondMethod()에서 println메소드 호출, println메소드에 의해 “secondMethod()”출력(6): println메소드의 수행이 완료되어 스택에서 사라지고 자신을 호출한 secondMethod()로 돌아간다. 대기 중이던 secondMethod()는 println메소드를 호출한 이후부터 수행 재기(7): secondMethod()에 더 이상 수행할 코드가 없어 종료되고, 자신을 호출한 firstMethod()로 돌아간다.(8): sfirstMethod()에 더 이상 수행할 코드가 없어 종료되고, 자신을 호출한 main메소드로 돌아간다.(9): main메소드에도 더 이상 수행할 코드가 없어 종료되고, 스택은 완전히 비우고 프로그램은 종료된다.[예]StackTest2.Javaclass CallStackTest2 {public static void main(String[] args) {System.out.println("main(String[] args)이 시작되었음.");firstMethod();System.out.println("main(String[] args)이 끝났음.");}static ace)
..PAGE:1J 2 E E2006. 04. 13박 긍 휼..PAGE:2J2EE 의 개요J2EE 등장 배경J2EE 의 정의J2EE 의 구성 요소EJB (3/3)JDBCJNDIRMI-IIOP, JAVAIDL기타목 차..PAGE:31. J2EE의 개요- 인터넷 사용자의 증가는 대다수의 기업으로 하여금 WAS의 시장확대를 가져왔고,그 중 자바 근간의 WAS는 안정성과 성능에서 가장 알맞은 표준으로 각광받게 되었다.- J2EE(Java 2 Enterprise Edition)는썬(Sun)社가 내놓은 엔터프라이즈 급 개발 환경이다.기업 내 인트라넷외부 WEB 서비스외부 WEB 서비스..PAGE:42. J2EE의 등장 배경1네트워크 환경3-TIER로의 전환네트워크 기반의C / S 개발23WEB 환경HTTP의 세션불가단점극복 등이 필요Enterprise급환경은 폐쇄적 C/S,개발적 웹환경으로급속한 탈바꿈 중분산 환경분산자원에 대한효과적 활용이중요한 이슈가 됨(분산객체기술)자원관리컴포넌트 지원Enterprise급 개발환경의 특징/요구사항- WEB환경의 발달로 인한 Enterprise급 개발환경이 표준화되는 양상이 나타남..PAGE:53. J2EE의 정의- J2EE란 ?JavaEnterprise급개발 환경표준 규약Java 2 Enterprise Edition전사적 차원에서 필요로 하는패키지들을 모아놓은 것Java 2 standard EditionJava의 Core,프로그래밍 중 필요로될 수 있는 기반 라이브러리를 가짐Java 2 Micro Edition컴퓨터가 아닌 전자제품의 제어를 위해서필요한 것이다.J2EE는 분산 객체, 효율적 자원 관리, 컴포넌트 기반 개발 등을 자바 환경에서사용할 수 있도록 하는 표준 규약...PAGE:6분산 객체와 컴포넌트 기반 개발을 지원하는 기업 자바빈(EJB)효율적 자원 관리를 위한 JTA(Java Transaction API), JDBC웹 환경을 담당하는 Servlet과 JSP기타 자바 네이밍 디렉터리 인터페이스(JNDI), 자바메일, 자바 메시지 서비스(JMS) 등3. J2EE의 구성요소- 개방적 웹 환경을 지원하는 J2EE의 구성요소..PAGE:7EJB기술을 이용하면 다른 곳에 떨어진 EJB서버의 클래스의 메소드 호출 가능3. J2EE의 구성요소- EJB의 기능 및 구성 (Enterprise Java Beans): 대규모 분산 객체 시스템을 구축하기 위한 기술: 자바로 서버 측 비즈니스 로직을 작성하기 위한 Enterprise 환경의 자바 표준EJB도 내부적으로 컴포넌트의 통신을 위해 RMI를 사용EJB (1/3)..PAGE:83. J2EE의 구성요소- Session BeanStateful Session Bean* 클라이언트와 관련된 상태를 계속 유지하는 세션빈.* EJB객체의 연결이 종료되면 빈 인스턴스도 종료Stateless Session Bean* 관련된 서비스를 하는데 상태정보를 유지하지 않은 빈.* 클라이언트와 연결 종료 시 대기 상태로 돌아감- Stateless & StatefulEJB (2/3)※ 둘 다 클라이언트의 상태를 DB에 저장하지 않으며, 저장시에는 EntityBean이 된다..PAGE:93. J2EE의 구성요소- Entity Bean데이터를 객체화하여재사용이 가능한 컴포넌트객체는 관계형 데이터베이스에 저장이 되며, 테이블의 한 레코드와 대응됨컨테이너 관리 퍼시스턴스 (CMP), 빈 관리 퍼시스턴스 (BMP)가 있음Message Driven Bean비동기 메시지에 의해 호출되는 엔터프라이즈빈JMS 메시지가 도착하면 EJB 컨테이너가 자동으로 호출EJB (3/3)..PAGE:10자바 프로그램 내에서 데이터베이스 질의문 즉, SQL을 실행하기 위한 자바 API3. J2EE의 구성요소- JDBCJDBC를 사용하면, 어떠한 관계 데이터베이스에서도 SQL문을 사용하기 쉽다.윈도우 계열사용가능JDBC문을 직접개별 DB 프로토콜로 변환개별적 DB서버가프로토콜을 받아자제척 번역/실행..PAGE:113. J2EE의 구성요소- JNDI (Java Naming and Directory Interface)자바 플랫폼 기반의 애플리케이션이 명칭 부여 및 디렉터리 서비스를 처리할 수 있는 응용 프로그램 인터페이스 (API).
Windows Applications 간의 자료 공유* 세 가지 방법- Clipboard 활용- DDE(Dynamic Data Exchange) 활용- OLE(Object Linking and Embedding) 활용* 활용 목적에 따라 선별하여 사용1. Clipboard 활용* 가장 단순한 형태의 자료교환 방식- 자료를 만들기 위한 application 실행- 자료의 editing- 자료를 clipboard 로 복사- 다른 application 으로 들어가서 Paste(갖다붙이기)* 한계점: 복사된 자료는 그 application(예를 들면 Excel)과의 연결이 안되어 있음- 자료의 수정을 위해서는 상기 작업의 반복적 수행이 필용+ Demo- 아이디어: 기본적으로 만들어진 VB application에 Excel 자료를 연결- 프로젝트 명: Clipbd* VB 실행하여 해당 프로젝트 불러들임* Excel 실행- 미리 만들어져 있는 Excel 화일(Sales.xls)을 불러들임- 해당 워크쉬트 A1..B6 의 select- 복사함* VB를 active 시킴* Image 콘트롤을 click 함* Paste 함=> 이렇게 하여 자료교환을 완성하였음; 그러나 Excel에서 자료를 변경하여도 VB엔반영이 안됨2. DDE 활용* 자료를 만들어내는 application을 source application, 그 자료를 받아들이는 application을 destination application 이라고 함* 모든 application이 이 DDE 기능을 지원하는 것이 아님- VB에서는 text box, picture box, 그리고 label control 만이 DDE를 통한 자료복사가 가능함* Demo- VB에서 해당 프로젝트(dde.vbp) 불어들임- 해당 form을 click- toolbox 에 있는 Picture Box를 더블클릭+ 해당 속성 변경(Autosize true로, Left 360, Top 360)- Excel 실행- 이미 만들어져 있는 파일(bonus.xls) 불러들임- 워크쉬트 영역 잡음- 복사- VB active 시킴- Picture Box 클릭- Edit 메뉴에서 Paste Link 실행=> 이 경우, 자료를 해당 콘트롤에 복사할 뿐만 아니라 원자료와 복사자료와의 연결고리를 유지시켜줌** 자료수정 후 확인Excel 에 가서 해당 자료의 일부를 수정후, save,/ VB로 가면 자료변경이 되어 있는지확인3. OLE 활용* 자료(개체 또는 Object)를 만들어내는 application을 source application 또는 server application 이라 하고, 그 자료가 복사되어 들어오는 application을 container 또는 client application 이라함* OLE가 Clipboard 및 DDE 와 다른 점: 다른 application(예로 VB)에서 특정 application(예로 Excel)의 실행이 가능
Form 1Dim db As DatabaseDim rs As RecordsetPrivate Sub Command1_Click()Form2.ShowUnload MeEnd SubPrivate Sub Command2_Click()Form3.ShowUnload MeEnd SubPrivate Sub Command3_Click()EndEnd SubPrivate Sub Form_Load()Set db = DBEngine.Workspaces(0).OpenDatabase("db.mdb")Set rs = db.OpenRecordset("db", dbOpenTable)MSFlexGrid1.RefreshEnd SubForm2Dim rs As RecordsetDim db As DatabasePrivate Sub Command1_Click()rs.AddNewrs.Fields("name") = Text1.Textrs.Fields("age") = Val(Text2.Text)rs.Fields("birth") = Text5.Textrs.Fields("email") = Text3.Textrs.Fields("phone") = Text4.Textrs.Fields("address") = Text6.Textrs.UpdateMsgBox "당신의 친구가 성공적으로 추가되었습니다."Form1.ShowUnload MeEnd SubPrivate Sub Command2_Click()Text1.Text = ""Text2.Text = ""Text3.Text = ""Text4.Text = ""Text5.Text = ""Text6.Text = ""End SubPrivate Sub Command3_Click()Form1.ShowUnload MeEnd SubPrivate Sub Form_Load()Set db = DBEngine.Workspaces(0).OpenDatabase("db.mdb")Set rs = db.OpenRecordset("db", dbOpenTable)End SubForm 3Dim db As DatabaseDim rs As RecordsetPrivate Sub Command1_Click()YesNo = MsgBox("특정 필드를 삭제하시겠습니까?", vbOKCancel + vbCritical, "데이터 삭제")If YesNo = vbOK Thenrs.DeleteElseIf YesNo = vbCancel ThenExit SubEnd IfEnd SubPrivate Sub Command2_Click()Form1.ShowUnload MeEnd SubPrivate Sub Command3_Click()EndEnd SubPrivate Sub Form_Load()Set db = DBEngine.Workspaces(0).OpenDatabase("db.mdb")Set rs = db.OpenRecordset("db", dbOpenTable)End Sub