"FlexMate" Comming Soon!

[작렬허접코딩/Flex]
"FlexMate"
플렉스 메이트는?

히스토리는 이렇다.
기존에 ajax를 사용하기 위한 제품이 있었다.
서버는 java base로 동작하여 어느 플랫폼에나 적용할 수 있었다.
하지만 모두 아는 것과 같이 javascript 기반의 ajax는 코딩량이 작살이다.

3월 18일 Flex3 Launching 행사에 회사의 차장님과 과장님 한분이 다녀오셨다.
사실 그전 까지는 1.5버전때 잠깐 관심을 가졌었고 그 이후에는 무관심 했었다.
그 때 팜플렛 한번 보고 Flex3 쉐어판 설치해서 이것 저것 보다 보니
ajax 기반의 javascript와 동일한 기능을 하는 actionscript를 만들 수 있을까 하는 의구심에 코딩을 시작했다.
서버는 Tomcat을 이용하고(사실 servlet container나 WAS 종류는 가리지 않는다. war 파일로 배포가 되기 때문에)
살짝 발동을 걸었다.
최초에는 Socket방식으로 코딩을 했다.
과거에도 java에서 socket 기반으로 http 통신을 하는 프로그램을 짜본적이 있기에
flex에서도 socket을 이용해서 HTTP 프로토콜에 맞게 요청을 날리고 결과를 받아와서 가공하고....
하지만 실제 로컬에서 개발하고 서버에 탑재하니 보안문제가 발목을 잡더라...
그래서 3일만에 다 갈아 엎었다.
HTTPService를 사용하는 방식으로 급선회했다.
이것은 socket으로 데이터를 주고 받는 방식보다는 코드가 간결했다.
HTTPService가 내부로직을 모두 wrapping 하고 있었기에...
여기서 또 문제에 봉착한다.
기본적으로 flex는 event-driven방식의 언어이다.
다은 4GL기반의 언어도 event-driven방식인 것은 동일하다.
하지만 결정적으로 non-blocking 방식으로 동작을 하므로 선처리 작업의 결과에 따라서
후처리 작업이 진행되어야 하는데 매번 이벤트 리스너를 작성해서 처리해 주어야 한다.
가령 flex에서
select * from ... 를 수행하고 레코드를 수신한 다음 수신한 레코드의 조건에 따라서 insert, update 같은 작업을 처리해야 할 경우 아주 난감한 상황이 발생하더라.(거의 불가능하다고 생각이 든다.)
이럴 경우 데이터를 건바이건으로 처리할 때 마다 이벤트 리스너를 등록해야하는 삽질을 감수해야 한다.
그래서 또 다시 방향 급선회
기존에 javascript 기반에서 작성된 ajax 관련 함수가 엄연히 존재하기에
flex에서 ExternalInterface를 이용해서 인터페이스하는 방식으로 바꾸었다.
ExternalInterface.call()은 기본적으로 자스로부터 결과를 받기전까지 blocking 된다.
자스에서 필요한 정보를 Array타입으로 리턴시키면 flex에서 동일하게 Array 타입으로 사용하면 된다.
아주 간단하면서도 효율적인 방법이다.
하지만 이 역시 완벽하지는 않다.
문제점은
각 브라우저의 버전에 따라서 자바스크립트와 플렉스간의 로딩순서가 달라진다든가
브라우저에서 보고 있는 화면의 자바스크립트에 오류가 발생한 경우에 정상적인 처리가 안되는 것이다.
두번째 문제점은 자스쪽에서 trace를 해서 어느 정도 해결이 되었지만
전자의 경우에는 해결할 수 있는 방식이 조금 다르다.
이 경우를 해결하기 위해 생각해 낸 방법은
어차피 javascript는 보안문제 때문에 현재 자신이 돌고 있는 외부 사이트로는 접속이 되지 않는다.
이 전제를 깔고나니 의외로 해결점이 간단해 진다.
현재 판매하고 있는 솔루션은 /xxx 이렇게 특정 위치에 셋팅이 되게끔 구성되어 있으므로
URLLoader를 이용하여 javascript를 읽어와서 flex에서 사용하기 전에 ExternalInterface.call()을 이용해서
읽어온 내용을 수행하니 로딩순서에 지장을 받는 일은 없어졌다.

그 외 현재 다양한 기능을 추가하고 있다.
현재 거의 버그픽스는 끝났고 마지막 테스트를 수행하고 있다.
주요 기능을 살펴보면

- 사용자 세션생성
- 사용자 세션종료
- 서버의 버전조회
- 클라이언트 버전조회
- 현재 웹서버에 접속한 클라이언트의 IP조회
- 세션에 값 설정
- 세션에서 설정된 값 조회
- 데이터베이스 트랜잭션
- PL/SQL 및 StoredProcedure 수행
- COMMIT/ROLLBACK
- 데이터베이스 내용조회
- 서버의 쉘/커맨드 수행
- 서버의 응용프로그램 수행
- 다른웹사이트에 접속해서 결과를 받아오는 프록시기능
- 내부의 jsp 파일을 호출할 수 있는 기능(세션 유지)
- 서버의 웹리포트 호출 및 결과수신
- Oracle의 CLOB 파일 읽고 쓰기
- 서버에 있는 텍스트 읽기
- 서버에 텍스트파일 쓰기
- flex에서 SQL문 작성가능
- 서버에 등록된 SQL을 flex에서 id를 가지고 참조하기
- transaction 수행시 한번에 여러행을 동시에 처리하기

뭐 대략 이정도의 기능들이다.
서버는 servlet 환경으로 동작하므로
모든 종류의 servlet-container에서 동작한다.
단 j2sdk 1.4.2 이상 버전으로 스펙을 맞췄다.

사실 여담이지만 회사에서는 전통적인 event-driven 방식으로 event listener를 이용한 방식의 모듈을 삭제하라고 했지만 왠지 향후를 대비해 몰래 가지고 있다. 우훗~~

약간의 모험은 있지만 레퍼런스를 위해서 이를 이용해 프로젝트를 시작하게 된다.
잘 될거다. ㅋㅋ

또하나의 장점은
4GL 기반의 랭귀지들을 위해 dll 파일도 제공한다.
결국 javascript, flex, 4GL 언어들이 하나의 미들웨어를 통해서 공통적인 기능을 쓸 수 있다
이올린에 북마크하기(0) 이올린에 추천하기(0)
2008/05/22 19:22 2008/05/22 19:22

메일전송시 인증이 필요할 경우(JavaMail 사용시)

[작렬허접코딩/자바]
안녕하세요.

얼마전 인증을 해야하는 SMTP에 연결해야 했는데 그 방법 때문에 매우 고민했었습니다.
Mail API에서 Authenticator는 제공을 하면서 ID와 PW를 설정하는 부분이 없어서
참 난감했었습니다. 영어 실력이 짧아서 관련 Document를 읽어보다가 못찾고
다만 API에 있는 Session 클래스의 
getInstance(Properties prop, Authenticator auth) 메소드가 마음에 걸려
혹시나 하는 마음으로 만들어 봤었는데 잘 되더군요.
sendmail 과 qmail 및 윈도기반 smtp server 몇 곳을 테스트 해봤는데 잘 되었습니다.

클래스 전체 소스는 다음과 같습니다.

/*
 * MyAuthenticator.java
 * 2002.05.27.
 * Hyunho Kim(falllove@ducc.or.kr)
 *
 * Copyrightⓒ 2002 FancyArts Corps. All rights reserved.
 */

/**
 * SMTP Authenticator
 */
public final class MyAuthenticator extends javax.mail.Authenticator {

    private String id;
    private String pw;

    public MyAuthenticator(String id, String pw) {
        this.id = id;
        this.pw = pw;
    }

    protected javax.mail.PasswordAuthentication getPasswordAuthentication() {
        return new javax.mail.PasswordAuthentication(id, pw);
    }

}

사용하실 때는 session을 얻기 전에 프로퍼티에 mail.smtp.auth 항목을 추가하시고
MyAuthenticator의 인스턴스를 하나 만드셔서 인자로 넘기시면 됩니다.

Properties prop = new Properties();
prop.put("mail.smtp.host", "smtp_host_name");
prop.put("mail.smtp.auth", "true");

MyAuthenticator auth = new MyAuthenticator("smpt_id", "smtp_pw");

// 새로운 메일 세션
Session mailSession = Session.getInstance(props, auth);
// or Session mailSession = Session.getDefaultInstance(props, auth);

정말 간단하죠^^;; 정말 암 것도 없는데 전에 이것을 하기 위해서 그 많은 글을 뒤적일
때는 못찾겠더라구요. 전 만들긴 했었지만 실제 서비스는 sendmail에서
localhost relay를 허용해서 사용하고 인증없이 발송하고 있습니다.

즐프하세요 :)

JDF에 비슷한 내용이 없었던 것 같던데 인증을 요구하는 smtp사용을 위해서
필요하시면 추가해주세요.

==================================================
수정: 2002-09-14
MyAuthenticator 의 import부분 삭제되었습니다.
작업중인 다른 class의 소스를 복사해다가 고치다보니
앞에 사용하지 않는 import문장이 있었습니다.
==================================================



==================================================
Hyunho Kim
ICQ: 7443923
MSN: h2kfl__at__hotmail.com
email: falllove__at__intizen.com
homepage: in working
==================================================
이올린에 북마크하기(0) 이올린에 추천하기(0)
2008/01/04 11:48 2008/01/04 11:48

메일전송 - Jakarta Project Common-Email API 사용

[작렬허접코딩/자바]

출처 : 자바서비스넷

Jakarta Commons Email

I. Commons-Email
2005년 9월 27일 드디어 Commons-Email이 version 1.0이 배포되었습니다
Commons-Email은 Java Mail API를 근간으로 좀더 심플하게 메일을 보내는 방안을 제시합니다.
기능상으로는 첨부파일 뿐만 아니라 HTML Email도 쉽게 보낼수 있는 API를 제공합니다

II. Download!
Commons-Email을 사용하기 위해서는 JavaMail의 mail.jar와 JAF의 activation.jar 가 필요합니다
Commons-Email download
http://jakarta.apache.org/site/download ··· mail.cgi

JavaMail 1.3
http://java.sun.com/products/javamail/d ··· dex.html

JAF 1.0.2
http://java.sun.com/products/javabeans/glasgow/jaf.html

Commons-Email
http://jakarta.apache.org/commons/email/index.html

Commons-Email API
http://jakarta.apache.org/commons/email ··· .htmliii. Install

다운 받은 3개의 파일을 $tomcat_home/webapps/ROOT/WEB-INF/lib/ 밑에 복사합니다

IV. 샘플 소스

① 간단히 텍스트만 보내기

SimpleEmail email = new SimpleEmail();
email.setHostName("mail.myserver.com");
email.addTo("jdoe@somewhere.org", "John Doe");
email.setFrom("me@apache.org", "Me");
email.setSubject("Test message");
email.setMsg("This is a simple test of commons-email");
email.send();
 
org.apache.commons.mail.SimpleEmail 은 가장 중심이 되는 org.apache.commons.mail.Email을 상속받아
setMsg(java.lang.String msg)만을 구현한 가장 기본적인 클래스입니다.

setHostName(java.lang.String aHostName)으로 SMTP 서버를 지정하고,

addTo(java.lang.String email) or addTo(java.lang.String email, java.lang.String name)으로

받는 사람의 메일주소를, setFrom(java.lang.String email) or setFrom(java.lang.String email, java.lang.String name)으로

보내는 사람의 메일을 설정합니다

물론 addTo 함수의 추가로 여러 사람에게 메일을 보낼 수 있습니다.

가장 기본적인 setSubject(java.lang.String subject)와 setMsg(java.lang.String msg)로

메일 제목과 내용을 입력한 후 send() 함수로 전송합니다


② 파일 첨부하기

// 첨부할 attachment 정보를 생성합니다
EmailAttachment attachment = new EmailAttachment();
attachment.setPath("mypictures/john.jpg");
attachment.setDisposition(EmailAttachment.ATTACHMENT);
attachment.setDescription("Picture of John");
attachment.setName("John");

// 기본 메일 정보를 생성합니다

MultiPartEmail email = new MultiPartEmail();
email.setHostName("mail.myserver.com");
email.addTo("jdoe@somewhere.org", "John Doe");
email.setFrom("me@apache.org", "Me");
email.setSubject("The picture");
email.setMsg("Here is the picture you wanted");

// 생성한 attachment를 추가합니다
email.attach(attachment);

// 메일을 전송합니다
email.send();


첨부파일과 같이 보낼려면 EmailAttachment 를 생성하여 파일 정보를 입력해 줍니다

파일경로와 파일형태, 파일 설명등을 추가하며 마지막으로 setName(java.lang.String name)을 통해

첨부되는 파일명을 설정합니다

그 후 MultiPartEmail 을 통해 SimpleEmail 처럼 기본 메일정보를 설정합니다

마지막으로 MultiPartEmail의 attach() 함수를 통해 첨부 파일을 추가하여 전송합니다

만약 첨부파일이 두개 이상이라면 EmailAttachment 를 여러개 생성하여 파일 정보를 설정 한 후

attach()를 통해 추가해 주기만 하면 됩니다


③ URL을 통해 첨부하기

// 첨부할 URL정보 및 파일 기본 정보를 설정합니다
EmailAttachment attachment = new EmailAttachment();
attachment.setURL(new URL("http://www.apache.org/images/asf_logo_wide.gif"));
attachment.setDisposition(EmailAttachment.ATTACHMENT);
attachment.setDescription("Apache logo");
attachment.setName("Apache logo");

// 기본 메일 정보를 생성합니다
MultiPartEmail email = new MultiPartEmail();
email.setHostName("mail.myserver.com");
email.addTo("jdoe@somewhere.org", "John Doe");
email.setFrom("me@apache.org", "Me");
email.setSubject("The logo");
email.setMsg("Here is Apache's logo");

// attachment를 추가합니다
email.attach(attachment);

// 메일을 전송합니다
email.send();
 
파일 경로 정보를 setURL(java.net.URL) 으로 설정할 뿐 위의 첨부파일과 동일합니다


④ HTML 이메일 보내기

// 기본 메일 정보를 생성합니다
HtmlEmail email = new HtmlEmail();
email.setHostName("mail.myserver.com");
email.addTo("jdoe@somewhere.org", "John Doe");
email.setFrom("me@apache.org", "Me");
email.setSubject("Test email with inline image");

// 삽입할 이미지와 그 Content Id를 설정합니다
URL url = new URL("http://www.apache.org/images/asf_logo_wide.gif");
String cid = email.embed(url, "Apache logo");

// HTML 메세지를 설정합니다

email.setHtmlMsg("<html>The apache logo - <img src=\"cid:"+cid+"\"></html>");

// HTML 이메일을 지원하지 않는 클라이언트라면 다음 메세지를 뿌려웁니다
email.setTextMsg("Your email client does not support HTML messages");

// 메일을 전송합니다
email.send();
 
HtmlEmail 클래스는 setHtmlMsg()로 작성된 html을 보낼 수 있습니다

이미지 처리가 조금 까탈스럽네요


V. 인증처리

만약 SMTP 서버가 인증을 요구한다면 org.apache.commons.mail.Email 의

setAuthentication(java.lang.String username, java.lang.String password)를 통해 해결할 수 있습니다

이 함수는 JavaMail API의 DefaultAuthenticator 클래스를 생성하여 사용합니다


from http://www.jakartaproject.com/article/j ··· 06202560

==================================================
mail : unicorn@jakartaproject.com
home : http://www.jakartaproject.com
제목 : Re: 한글문제...
글쓴이: 권남~(kwon37xi) 2005/11/01 09:30:44 조회수:1390 줄수:3
email.setCharset("euc-kr");을 Email 객체를 생성하자마자 실행하면 한글문제도 없어요..

http://kwon37xi.egloos.com
제목 : Re: 인증처리..
글쓴이: 박재원(guest) 2006/06/27 21:14:42 조회수:795 줄수:5
인증처리는 그냥 아래처럼 작성해 주면 되는데..
위에 설명하신 부분은 좀 어렵게 느껴지네요..

  email.setAuthentication(userid,password);
 
제목 : Re: hotmail에서의 한글 깨짐현상...
글쓴이: 손님(guest) 2007/12/18 20:13:36 조회수:164 줄수:6
hotmail에서 보내는 이 에 한글이름을 넣으면 깨지는데..
다음이나 파란등 기타 한국 메일에서는 안깨지구요...

어떤 인코딩 타입을 적용해 봐도 소용이 없네용..

방법이 없나요??

이올린에 북마크하기(0) 이올린에 추천하기(0)
2008/01/04 11:25 2008/01/04 11:25