- 중소기업인력지원사업 종합관리시스템 관리자단 설문조사 기능 개발중 (2달짜리)

- 관리자가 설문조사 작성하고 설문요청자 명단에게 SMS 보내는 중 URL을 구글 축약 기능을 원해서 추가함.

- 내가 찾아본 방법은 2가지

  1. JavaScript 화면단(현재 웹스퀘어5)

  2. Java


- 설문조사 만들고, 해당 설문조사 요청 명단에게 'SMS' 보내야 한다.

  어차피 화면에 요청자 명단 데이타 있어서, 화면단에서 스크립트로도 가능하지만 JAVA 로 하기로 설정


- 준비물

  1. Google Developers Console 프로젝트 생성 > 사용할 구글 API(URL Shortener API) 등록 > 사용자 인증키 발급

  2. Library

org.json-20130603.jar

gson-2.5.jar

jackson-all-1.9.0.jar

  3. 코딩(URL Shortener 변환 클래스 만들기)

     - ShortenerURLGoogle.java

     (※ 해당파일 내에 상수 SHORTENER_API_KEY 는 1번 에서 발급받은 사용자 인증키 입력, 하루에 100만건이 제한)

     (※ JavaScript 로 하는게 훨씬 편해보이긴 한다.)




'공부 > JAVA' 카테고리의 다른 글

JAVA_[SMTP mail 전송(Gmail)]  (0) 2015.05.06
JAVA_[ Collection.srot (리스트 정렬)]  (0) 2015.03.26
JAVA_[ 제어자 ]  (0) 2015.02.10
JAVA_[ JVM의 메모리구조 ]  (0) 2015.02.10
JAVA_[Thread join()]  (0) 2015.02.09

import java.io.UnsupportedEncodingException;

import java.util.List;

import java.util.Properties;


import javax.mail.Address;

import javax.mail.Authenticator;

import javax.mail.Message;

import javax.mail.MessagingException;

import javax.mail.Session;

import javax.mail.Transport;

import javax.mail.internet.InternetAddress;

import javax.mail.internet.MimeMessage;

import javax.mail.internet.MimeUtility;


import com.srpost.salmon.lang.StringUtil;


public class SMTPMailSend {


    public static void mailSend(List<String> toMails, String fromMail, String fromName, 

 String contents, String title, String mailId, 

 String mailPwd) throws MessagingException, UnsupportedEncodingException {


        if (StringUtil.isEmpty(mailPwd)) {


            // 내 메일 Access 허용 비밀번호,

            mailPwd = "구글에서 발급받은 16자리"; (gmail 로그인 비밀번호 아님)

        }


        Properties props = new Properties();


        props.put("mail.smtp.user", "내 Gmail 주소"); // "user@gmail.com"

        props.put("mail.smtp.host", "smtp.gmail.com");

        props.put("mail.smtp.port", "465");

        props.put("mail.smtp.starttls.enable", "true");

        props.put("mail.smtp.auth", "true");

        props.put("mail.smtp.debug", "true");

        props.put("mail.smtp.socketFactory.port", "465");

        props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");

        props.put("mail.smtp.socketFactory.fallback", "false");


        Authenticator auth = new SMTPAuthenticator(mailId, mailPwd);


        Session mailSession = Session.getInstance(props, auth);

        mailSession.setDebug(true); // 메일 전송할 때 상세한 상황을 콘솔에 출력한다.


        Address fromMailAddress = null;


        if (StringUtil.isEmpty(fromName)) { // 메일 보낸사람이름 등록시

            fromMailAddress = new InternetAddress(fromMail);

        }

        else { // 메일 보낸사람이름 미등록시

            fromMailAddress = new InternetAddress(fromMail, MimeUtility.encodeText(fromName, "UTF-8", "B"));

        }


        MimeMessage mailMsg = new MimeMessage(mailSession);

        mailMsg.setFrom(fromMailAddress);

        mailMsg.setSubject(title, "UTF-8");


        InternetAddress[] toMailAddress = new InternetAddress[toMails.size()];


        for (int i = 0; i < toMails.size(); i++) {


            toMailAddress[i] = new InternetAddress(toMails.get(i));

        }

        mailMsg.setRecipients(Message.RecipientType.TO, toMailAddress);

        mailMsg.setContent(contents, "text/html;charset=utf-8");


        // 전송

        Transport.send(mailMsg);

    }

}



import javax.mail.Authenticator;

import javax.mail.PasswordAuthentication;


public class SMTPAuthenticator extends Authenticator {


    private String mailId;

    private String mailPwd;


    public SMTPAuthenticator(String mailId, String mailPwd) {

        this.mailId = mailId;

        this.mailPwd = mailPwd;

    }


    @Override

    public PasswordAuthentication getPasswordAuthentication() {


        return new PasswordAuthentication(mailId, mailPwd);

    }

}


PS. 위의 작업 전 구글 계정 2단계 인증을 등록해야만, 가능하다. 인증 안 받고 해보진 않았다. 
     인터넷에서 인증을 받아야 된다고 해서..

1. https://myaccount.google.com/

2. https://accounts.google.com/b/0/SmsAuthConfig?hl=ko 
> 설정 시작

3. 재로그인

4. https://accounts.google.com/b/0/SmsAuthSettings?Setup=1
> 전화번호 입력 후 코드 전송

> 인증코드 입력

5. https://security.google.com/settings/security/apppasswords?pli=1
> 기기선택과 앱(MAIL) 선택 후 생성

6. 생성된 비밀번호를 위 소스의 pwd란에 입력한다.
          > mailPwd = "구글에서 발급받은 16자리";     여기 입력 할 비밀번호.


'공부 > JAVA' 카테고리의 다른 글

JAVA_[Google URL Shortener API]  (0) 2017.11.22
JAVA_[ Collection.srot (리스트 정렬)]  (0) 2015.03.26
JAVA_[ 제어자 ]  (0) 2015.02.10
JAVA_[ JVM의 메모리구조 ]  (0) 2015.02.10
JAVA_[Thread join()]  (0) 2015.02.09

- 정렬하는데 쓰는 Interface 2가지가 있다.

1. Java.lang Interface Comparable<T>

2. Java.util Interface Comparator<T>


- Comparable Implements<T>

Implements Comparable 하면, public int compareTo(object o) {} 메서드가 생성이 되는데..

해당하는 객체로 타입을 변경하고, 정렬부분을 구현하면된다.(총 점수 내림차순)

Collections.srot();


- Implements Comarator<T>

Collections.sort(studentList, new ClassStudentNoComparator());

Collections.sort(studentList, new ClassTotalComparator());

'공부 > JAVA' 카테고리의 다른 글

JAVA_[Google URL Shortener API]  (0) 2017.11.22
JAVA_[SMTP mail 전송(Gmail)]  (0) 2015.05.06
JAVA_[ 제어자 ]  (0) 2015.02.10
JAVA_[ JVM의 메모리구조 ]  (0) 2015.02.10
JAVA_[Thread join()]  (0) 2015.02.09

- 제어자 분류

1. 접근제어자 : public, protected, default, private

2. 그외제어자 : static(클래스), final, abstract(추상), native, transient(직렬화 X), synchronized(동기화), volatile, strictfp


public - 접근제한이 전혀 없다.

protected - 같은 패키지 내에서, 그리고 다른패키지의 자손클래스에서 접근이 가능하다.

default - 같은 패키지내에서만 접근이 가능하다.

private - 같은 클래스 내에서만 접근이 가능하다.


private < default < protected < public 




- 제어자의 조합자

  

- 제어자 조합시 주의사항

1. 메서드에 static 과  abstract(추상) 함꼐 사용할 수 없다.

: static 메서드는 몸통(구현)있는 메서드만 사용 가능하다.

2. 클래스에 abstract(추상) 와 final 을 동시에 사용할 수 없다.

: 클래스에서 사용되는 final 은 확장할 수 없다는 의미이고, abstract 는 상속을 통해 완성해야한다는 의미로

  모순이다.

3. abstract(추상) 메서드의 접근제어자가 private 일 수 없다.

: abstract 메서드는 자손클래스에서 구현해 주어야 하는데 접근제어자가 private 이면, 자손클래스에서 접근할 수 없다.

4. 메서드에 private 와 final 을 같이 사용할 필요는 없다.

: 접근제어자가 private 인 메서드는 오버라이딩할 수 없기 때문이다.

'공부 > JAVA' 카테고리의 다른 글

JAVA_[SMTP mail 전송(Gmail)]  (0) 2015.05.06
JAVA_[ Collection.srot (리스트 정렬)]  (0) 2015.03.26
JAVA_[ JVM의 메모리구조 ]  (0) 2015.02.10
JAVA_[Thread join()]  (0) 2015.02.09
JAVA_[Thread start() & run()]  (0) 2015.02.06

- 응용프로그램이 실행되면, JVM 은 시스템으로부터 프로그램을 수행하는데 필요한 메모리를 할당받고 JVM은 이 메모리를 용도   에 따라 여러 영역으로 나누어 관리한다.


1. 메서드 영역(Method Area)

- 프로그램 실행 중 어떤 클래스가 사용되면, JVM 은 해당 클래스의 *.class 읽어서 분석하여 클래스에 대한 정보를

  Method Area 에 저장한다. 이 때, 클래스 내의 클래스변수 도 이 영역에 함꼐 생성된다.


2. 힙(Heap)

- 인스턴스가 생성되는 공간.

  프로그램을 실행 중 생성되는 인스턴스 모두 이 곳에 생성된다. 즉, 인스턴스변수(Instance variable)들이 생성되는 공간


3. 호출스택(Call Stack 또는 Execution Stack)

- 호출스택은 메서드의 작업에 필요한 메모리 공간을 제공한다.

  메서드가 호출되면, 호출스택에 호출된 메서드를 위한 메모리가 할당되며, 이 메모리는 메서드가 작업을 수행하는 동안 

  지역변수(매개변수)들과 연산의 중간결과 등을 저장하는데 사용된다. 그리고, 메서드가 작업을 마치게 되면 할당되었던 메모리

  공간은 반환되어 비워진다.

  

  각 메서드별 메모리상의 작업공간은 서로 구별되며, 호출된 메서드는 작업공간에 쌓이게 되는데, 순차적으로 쌓이게 되며,

  젤 최근에 호출된 메서드 작업공간이 가장위에 쌓인다.

  - 언제나 호출스택의 제일 위에 있는 메서드가 현재 실행 중인 메서드이다.

  - 아래에 있는 메서드가 바로 위의 메서드를 호출한 메서드이다.

  


'공부 > JAVA' 카테고리의 다른 글

JAVA_[ Collection.srot (리스트 정렬)]  (0) 2015.03.26
JAVA_[ 제어자 ]  (0) 2015.02.10
JAVA_[Thread join()]  (0) 2015.02.09
JAVA_[Thread start() & run()]  (0) 2015.02.06
JAVA_[ 리눅스 권한변경 ]  (0) 2014.12.26

▶ join()

- 지정된 시간동안 쓰레드가 실행되도록 한다. 지정된 시간이 지나거나 작업이 종료되면, join() 을 호출한 쓰레드로 다시 돌아와

  실행을 계속한다.


- ex (th1 start() 후에 th1.join() 하면 th1 쓰레드가 종료되기전까지 main 메서드가 대기중으로 th2 쓰레드를 실행하지 않고 대기)

public class Thread_Ex14 {


    public static void main(String args[]) {

        ThreadEx14_1 th1 = new ThreadEx14_1();

        ThreadEx14_2 th2 = new ThreadEx14_2();


        th1.start();

        try {

            th1.join();

        } catch (InterruptedException e) {

            e.printStackTrace();

        }

        th2.start();

    }

}


class ThreadEx14_1 extends Thread {

    @Override

    public void run() {

        for (int i = 0; i < 300; i++) {

            System.out.println("-");

        }

    }

}


class ThreadEx14_2 extends Thread {

    @Override

    public void run() {

        for (int i = 0; i < 300; i++) {

            System.out.println("|");

        }

    }

}

'공부 > JAVA' 카테고리의 다른 글

JAVA_[ 제어자 ]  (0) 2015.02.10
JAVA_[ JVM의 메모리구조 ]  (0) 2015.02.10
JAVA_[Thread start() & run()]  (0) 2015.02.06
JAVA_[ 리눅스 권한변경 ]  (0) 2014.12.26
JAVA_[ map의 Key, Value Iterator 으로 자동으로 불러오기 ]  (0) 2014.12.10

● Run()

- run()을 호출하는 것은 생성된 쓰레드를 실행시키는 것이 아니라 단순히 클래스내에 속한 메서드 하나를 호출하는 것이다.


● Start()

- start()는 run()과 달리 쓰레드가 작업을 실행하는데 필요한 호출스택(Call Stack)을 생성한 다음,

  run()을 호출해서, 생성된 호출스택에  run() 이 첫 번째로 저장되게 한다.

 모든 쓰레드는 독립적인 작업을 수행하기 위해 자신만의 호출스택을 필요로 하기 때문에, 새로운 쓰레드를 생성하고 

 실행시킬 때 마다 새로훈 호출스택이 생성되고 쓰레드가 종료되면 작업에 사용된 호출프택은 소멸된다.

1) main 메서드에서 쓰레드의 start 메서드 호출

2) start 메서드는 쓰레드가 작업을 수행하는데 사용될 새로운 호출스택을 생성

3) 생성된 호출스택에 run 메서드를 호출해서 쓰레드가 작업을 수항하도록 한다.

4) 이제는 호출스택이 2개이기 때문에 스케쥴러가 정한 순서에 의해서 변갈아 가면서 실행된다.


※ 결론은 start() 를 쓰는게 확실함.


'공부 > JAVA' 카테고리의 다른 글

JAVA_[ JVM의 메모리구조 ]  (0) 2015.02.10
JAVA_[Thread join()]  (0) 2015.02.09
JAVA_[ 리눅스 권한변경 ]  (0) 2014.12.26
JAVA_[ map의 Key, Value Iterator 으로 자동으로 불러오기 ]  (0) 2014.12.10
JAVA_[ EJB란? ]  (0) 2014.11.05

- JAVA 에서 폴더 생성시 권한 및 소유주 설정

String Folder = "/root/file";

String chmod = "chmod -R 755 " + Folder;

Runtime runtime = Runtime.getRuntime();

Process process = runtime.exec(chmod);

process.waitFor();


- chown 방법도 동일하다.


연계서비스 개발중에..

Client 쪽에서 XML 타입의 문자열을 보내주면 Map 으로 변환해서(XMLEncoder 이용)

내가 Map 안에 쿼리문과 파라미터를 받아서 Query 실행 후에 데이터를 다시 XML 타입으로 변환해서(XMLDecoder)

 보내줘야하는 거 만드는 중인데..


Map 까서 일일이 Client 와 Key 값 정의해서 Value 빼와서 세팅하기가 번거러운거 같아서 구글링!

Iterator() 로 이게 가능하다는걸 암! 잊어버릴까봐 남긴다.


일단 Client 에서 보내주는 Map 의 양식은 다음과 같다.

Key : "sql", Value(String) : "SELECT * FROM WHERE PARAM1 = ?, PARAM2 = ? PARAM3 = ?"

Key : "params" Value(Map) :

Key : PARAM1, Value: 값

Key : PARAM2, Value: 값

Key : PARAM3, Value: 값


* 우선 PrepareStatement 를 쓸것이고, Params 의 갯수는 모른다. 항상 같은 쿼리문이 들어오는 것이 아니라,(총 연계 3부분)

   연계마다 따로 서비스를 개발하면 일일이 Key 값을 넣어서 코딩하면 되겟지만.. 싫다.


여기서 부터 구현

// Class.forName, DriverManager.getConnection 은 생략한다.

// Client 에서 Map 이 "paramMap" 으로 온다고 가정

// 두개의 키값, "sql", "params" 는 변함이 없다.


String sql = String.valueof(paramMap.get("sql"));

HashMap<String, Object> sqlMap = (HashMap<String, Object>) paramMap.get("params");


Set<String> key = sqlMap.keySet();

int paramIndex = 1;


for( Iterator<String> iterator = key.iterator(); iterator.hasNext(); ) {

String paramsKey = String.valueOf(iterator.next());

String paramsVal = String.valueOf(sqlMap.get(paramsKey));

// sql Query 에 값 넣기

stmt.setString(paramIndex, paramsVal);

paramIndex++;

}


요렇게 하면, 자동으로 index 증가하면서 params 입력

주의점 : sql Query 입력해야 할 ? 의 순서와 갯수가, params 에 담겨있는 순서&갯수 가 같아야한다.

이건 구지 얘기안해도 알아야 될 것;;


이렇게 데이타 조회해서 Map 으로만든 다음 다시 -> XMLDecoder 로 변환해서 소켓으로 리턴하면 끝!


'공부 > JAVA' 카테고리의 다른 글

JAVA_[Thread start() & run()]  (0) 2015.02.06
JAVA_[ 리눅스 권한변경 ]  (0) 2014.12.26
JAVA_[ EJB란? ]  (0) 2014.11.05
JAVA_[ Dynamic Web Project 에서 Tomcat(Catalina) Home 경로 얻기 ]  (1) 2014.11.04
JAVA_[ transient ]  (0) 2014.10.31

EJB란 


 오늘은 첫 번째 강좌로서 EJB에 대한 개념을 정리해 보도록 하겠습니다. 음.. EJB라고 하면 엔터프라이즈 자바 빈(Enterprise Java Bean)이라고 하는 건 다들 아시죠^^  썰렁했나? 그런데 이말가지고는 EJB의 뜻을 해석 하기는 어려우실 건니까 분산환경, RMI등을 이해 한 후 EJB에 대해 알아 보기로 하겠습니다. 


우선 EJB를 보시기 전에 자바 RMI라고 하는것에 대해 알아 보자구요, Java RMI는 Remote Method Invocation의 머리말을 딴 말인데 JDK1.1부터 자바에 내장된 기술입니다. Java 환경에서 Computer 간 또는 Program 간에 통신(객체를 주고 받을 수 있습니다)을 할 수 있는 기능을 제공합니다. 자바에 내장 되었다는 것은 CORBA, DCOM, EJB등은 통신을 대신 해주는 미들웨어(Middleware)가 필요한데(EJB를 사용하기 위해서는 이 사이트에서 강좌가 진행 중인 웹 로직, 웹 스피어등의 미들웨어가 필요하다는 겁니다.),  RMI는 이미 JVM에서 지원을 한다는 이야기죠… 제 생각엔 분산 시스템 환경을 구축하는데 간단한 것이라면 RMI를 추천 합니다.  그리고 미들웨어라는 말이 자주 보이는데 이것은 분산 환경에서 애플리케이션들이 연결되어 서로 데이터를 교환할 수 있게 해 주는 Software정도로 보시면 되겠습니다. 


객체 지향의 개념에서 프로그램이 객체들 간의 메세지 전송으로 실행 된다는 이야기를 많이 보셨을 겁니다. 그런데 만약 그 객체들이 서로 다른 컴퓨터에 존재한다면 어떨까요? 과거 분산 시스템은 서로 다른 프로그램들이 다른 컴퓨터에 존재하고 실행되는 것이었는데 최근의 객체 지향에서는 각 객체가 분산되어 존재하는 개념인 것입니다. 그래서 서로 통신을 하는데 다른 컴퓨터에 있는 객체의 메소드를 호출 한다든지 또는 객체들도 던졌다 받았다 한다는 것이 RMI 입니다. 


분산컴퓨팅, 분산객체에 대한 개념에 대해 정리하면 아래와 같습니다. 물론 Java Network 강좌에 나와 있는 내용 입니다. 


분산 컴퓨팅 이란? 네트워크에서 서로 다른 시스템 간에 응용 프로그램을 분산해서 처리하는 환경을 말합니다. 즉 하나의 컴퓨터에 존재하는 Application이나 프로세스에서 스스로 처리하거나 수행하기 어려운 작업을 다중 프로세서나 컴퓨터에 분산 시키는 것입니다. 분산 컴퓨팅을 적용한 Application을 Distributed Application 이라고 합니다. 

  

분산 객체 (Distributed Object) 란? 분산 컴퓨팅 기술이 객체 지향과 접목되어 하나의 프로세서나 컴퓨터에서 실행되는 객체가 다른 프로세서나 컴퓨터에서 객체와 통신이 가능 하도록 하는 기술이 분산 객체 기술이며 분산 객체란 자신이 존재하는 런타임 환경과는 다른 런타임에 있는 객체와 통신이 가능한 객체 입니다. 


이제 EJB로 돌아와서 개념을 정리해 보죠… EJB는 대규모 분산 객체 시스템을 구축하기 위한 기술 또는 자바로 서버 측  비즈니스 로직을 작성하기 위한 Enterprise 환경에서의 자바 표준이라고 보시면 됩니다. 흔히 프리젠테이션 로직이라고 하는 것이 화면에 보여지게 되는 정보의 타입, 포맷을 자동으로 처리하는 반면 비즈니스 로직은 급여계산 한다든지 하는 보이지 않는 어떤 처리를 하는 겁니다. 만약 EJB를 사용하기 위해 웹로직 서버를 이용한다고 하면 프로그램 개발자는 웹로직 서버의 컨테이너를 이용하여 작업을 하게 되는데 이는 트랜잭션의 지원, 보안, 동시 접근 처리 등 비즈니스 로직을 처리하는데 있어 필요한 모든 것을 제공 한다고 보면 됩니다. EJB는 엔티티빈, 메시지 드리븐 빈, 상태유지 세션 빈, 비상태유지 세션 빈등 4가지의 타입이 있으며 아마도 오라클자바에 오시는 여러 분들은 수준이 높아 공부하시는데 크게 어렵지 않으리라 생각 됩니다. ^^ EJB는 명세, 스펙만 잘아시면 쉽게 공부 할 수 있습니다. 


EJB에 대한 이해를 위해서는 앞서 설명 한 분산 환경, 분산 객체, RMI등을 잘 알고 있어야 합니다. 그래서 RMI의 기초가 부분에 대해 부족하시다고 생각이 드는 분은 Java Network의 RMI강좌중 HelloWorld를 따라해 보시고 오시기를 부탁 드리구요, JSP, Servlet등도 공부를 하시기 바랍니다. 


 EJB기술을 이용하면 다른 곳에 떨어진(원격의) EJB서버 메모리에 떠 있는 클래스를 참조할 수 있습니다. 다시 말씀 드리면 그 클래스의 메소드를 호출 할 수 있다는 이야기 입니다.  즉 EJB도 내부적으로 컴포넌트의 통신을 위해 RMI를 사용 한다는 겁니다. 그리고 분산 환경이라고 무조건 EJB를 쓰시면 큰일 납니다. 미들웨어 구입을 위한 비용은 둘째 치더라도 EJB는 추가적인 overhead가 있으므로 성능 향상을 위한 EJB 보다는 안정성, 재사용 가능한 시스템, 프리젠테이션 영역과 비즈니스 로직의 분리, 신뢰성 있는 N-Tier 환경, 분산 환경이 꼭 필요한가 등을 고려하여 사용 하는 것이 바람 직 합니다. EJB를 사용하기 위해서는 전용 서버(미들웨어)를 사용해야 하는데 SUN에서 제공하는 J2EE서버의 경우 거의 실무에서는 쓰이지 않으며 주로 웹로직, 웹스피어 등을 이용하셔서 개발을 하게 됩니다.

출처 : 오라클자바커뮤니티 (http://www.oraclejavanew.kr/bbs/board.php?bo_table=LecEJB&wr_id=1)


위의 내용은 퍼온글이다.

근데 읽어도, 확실히는 모르겟다. 간단하게 정리해본다. 

(이것도 퍼온글이지만, 위에 글보단 좀 간결해서 보기도 편하고 이해하기도 그나마 쉽다'- ')


- EJB 배경

1. 종래의 어플리케이션 개발시 비지니스로직 뿐만 아니라, 시스템 서비스를 이용한 데이타베이스치리 와 트랙잭션처리

    와 같은 프로그램이 필요로 하기 때문에 모두 개발해야하는 과정에서 시간이 오래 걸렸다.

2. 1번과 같이 각각의 서버 어플리케이션의 시스템서비스가 달라 어플리케이션간의 이동성이 없고, 부품화가 곤란

3. 이 같은 문제를 해결해서, 서버 어플리케이션의 생산성의 향상과 이동성을 실현하기 위해서 생겨난 것이

    EJB(Enterprise Java Bean)이다.



- EJB 

1. Enterprise Java Bean 은 독립한 부품이 아닌, SUN 사가 만든 규약(?)

2. EJB는 서버 어플리케이션의 개발을 용이하게 해 다중다양한  플랫폼과 제품간의 이동성을 실현하기 위하여

    같은 비지니스로직과 시스템서비스를 이용하는 로직을 분산해 그 사이의 규약을 구정한 것.


- EJB 기본구성

1. Enterprise Bean

2. Container

3. EJB Server

4. Client Application

(위 4가지 요소 중 어플레케이션 개발자가 용이한 것은 1, 4 번)


- Enterprise Bean

1. 비지니스 로직 서버 컴포넌트

2. Enterprise Bean 2가지 모델

2-1) Session Bean

클라이언트의 대화처리를 실현하는 오브젝트이다.

2-2) Entity Bean

DataBase 에 격납된 레코드를 오브젝트로 뽑아내거나, 격납하기 위하여 이용하는 오브젝트

※ 일반적으로 클라이언트가 Session Bean을 불러 Enitiy Bean을 불르는 것으로 데이터 베이스에 접근한다.


- Container

1. EJB서버와 Enterprise Bean 의 중간에 위치해, 클라이언트 어플리케이션은 그 컨테이너를 경유해서 Enterprise Bean 

    에 접근한다.

2. 컨테이너가 데이터베이스처리와 트랜잭션처리 등을 숨기기위해 개발자와 그것들을 의미하지 않는 어플리케이션을

    개발하는것이 가능하다.


- EJB Server

1. EJB서버는 컨테이너를 관리하는 EJB로써 필요한 시스템 레벨의 서비스(데이타 베이스 처리, 트랜잭션 처리 등)을

   실현한다.


- Client Application

1. EJB에 준거한 클라이언트 어플리케이션이다.

    (Java Applet, Java Application, Servlet, JavaServer Page(JSP) 베이스의 어플리이션 등이 있다.)

2. Enterprise Bean 기본동작

    클라이언트부터 서버의 Enterprise Bean의 접근은 컨테이너를 경유해서 행한다,

    컨테이너는 Enterprise Bean 의 대리가 되는 EJB 오브젝트와 EJB 오브젝트의 생성/삭제를 행하는 EJB 홈을 의미함.

    클라이언트는 컨테이너가 갖는 이 두가지 오브젝트를 통해서 Enterprise Bean 에 접근한다.

    클라이언트가 컨테너를 통해서 Enterprise Bean 에 접근하는 흐름


    1) JNDI(Java Naming and Directory Interface)의 lookup 메서드에서 EJB home을 검색한다.

    2) 클라이언트가 습득한 EJB HOME 에 대해서 create 또는 find 메소드를 호출하면 컨테이너가 Enterprise Bean의 

        대리 Object 에 있는 EJB Object 를 생선한다.

        이 때, 컨테이너 내부에는 실제로 비지니스 로직이 갖춰져있는 Enteerprise Bean의 인스턴스가 생성된다.

    3) 클라이언트는 Enterprise Bean 의 대리가 되는 EJB Object 의 비지니스 메소드를 호출한다.

        컨테이너가 그것을 중계해서 Enterprise Bean 의 메소드를 호출한다.

- 실행환경

EJB 서비스에는 EJB의 컨테이너라고 하는 개념이 포함되어 있다,

컨테이너는 EJB 어플리케이션을 넣기 위한 용기이다.

개발환경에서 작성된 EJB 어플리케이션은 전개된 후 서버에 전송하는 컨테이너에 설치하는 것에 의해 실행가능한

상태로 된다. EJB 어플리케이션을 전개하는 것을 'Deployment'라고한다(디플로이먼트?)



+ Recent posts