달력

42024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

새마음으로..

JAVA/JEE 2004. 8. 17. 19:48

크헐... EJB 해본지 어언 2년 가까이.... 아무것도 생각 안나네 ㅠㅠ

 

PHP 하다... JSP 하다.. 리눅스 서버 만졌다가..... 네트워크 관리하다가..

 

IP 분배 하다가... 보니....

 

EJB 해볼 시간이 전혀 없었다..

 

퇴근하고 저녁 짜투리 시간에....

 

간단하게 쇼핑몰이라도 만들어 봐야겠다...

Posted by tornado
|

에그... 이리 간단한걸.. ㅡㅡ;;

       

    <bean:size id="len" name="SearchEmp" />

 

    <!-- 내용 없을 때 -->
    <logic:equal name="len" value="0" >        
    <tr>
      <td height="150" ALIGN="CENTER" colspan="4">
        검색된 직원이 없습니다!!
      </td>
    </tr>
  </logic:equal>

 

Posted by tornado
|

ctrl + e 를 무심결에 눌렀더니.... 열려있는 파일들이 우측에 열리네 ^^

Ctrl + Shift + e 누르니 또 열리네 ^^

마우스로 블록 지정하고

Ctrl + Shift + c 누르니 한줄 주석이 토글되네 ^^

 

 

Posted by tornado
|

 public boolean sendMail(String filePath,String host, String receiver, String sender, String subject, String contents, InquireFile[] files){
  
  boolean flag = false;
  
  Properties prop = new Properties();
  
  prop.put("mail.smtp.host" , host);
  
  Session mailSession = Session.getDefaultInstance(prop, null);
  
  try{
   
   InternetAddress from = new InternetAddress(sender);
   
   Message msg = new MimeMessage(mailSession);
   
   msg.setFrom(from);
   
   msg.setRecipient(Message.RecipientType.TO, new InternetAddress(receiver));
   
   msg.setSubject(subject);
   
   Multipart multi = new MimeMultipart();      
   
   MimeBodyPart mbp = new MimeBodyPart();
   
   mbp.setContent(contents, "text/html; charset=ms949");
   
   multi.addBodyPart(mbp);
   
   if(files != null){
    
    for(int i = 0; i < files.length; i++){
     
     if(files[i] == null ) continue;
     
     DataSource fds = new FileDataSource(filePath + "/" + files[i].getFileName() );
     
     MimeBodyPart m = new MimeBodyPart();
     
     m.setDataHandler(new DataHandler(fds));
  
     m.setFileName(  toEng(fds.getName() ) );
     
     multi.addBodyPart(m);
     
    }
   }
   
   msg.setContent(multi);
   
   msg.setSentDate(new Date());
   
   Transport.send(msg);
   
   
   flag = true;
   
   
  }catch(Exception e){
   
   Logger logger = Logger.getLogger(this.getClass());   
   
   logger.error(this.getClass().getName() + " : " + e);
   
  }
  
  return flag;
  
 }

 

 public static String toEng(String origin) throws Exception{
  
  
  return new String(origin.getBytes(), "ISO-8859-1");
 }

 

==================================================================================

 

재미 있는건  한글 변환 부분 에서 new String(한글.getBytes("KSC5601"), "ISO-8859-1") 처럼 안해두 된다는것임...

 

다운로드시 한글 변환도 위와 같이 하면 URLEncoding 을 안해도 됨 ㅡㅡ 

 

daum.net , naver.com, hotmail.com, outlook express 에서 테스트 함

 

테스트 환경 : Win xp , tomcat 4.1.30 , Apache 2.0.49 , j2sdk 1.4.2_05

 

사용 디비 :  MySQL, Informix , Oracle

Posted by tornado
|

              JSP 에서의 파일 업로드

작성자 : (tornado@dolpung.pe.kr)

 

파일을 업로드 한다는 것은 원격의 사용자가 서버 측으로 네트워크를 통해 파일을 전송하는 일이다

보통 WEB 환경에서 사용자의 입력 값을 다른 페이지로 이동시키기 위해서는 Form 통한 데이터 전송을 하게 된다.

간단하게 사용자의 이름을 입력 받고 내용을 JSP 페이지나 기타 파일로 전송을 해야 때는 아래와 같은 HTML 폼이 작성이 되어야 것이다.

 

<Form action=receive.jsp Method=POST>

이름 : <Input type=TEXT name=userName> <BR>

<input type=SUBMIT value= >

</Form>


..more


Posted by tornado
|
Posted by tornado
|

http://java.sun.com/webservices/docs/1.0/tutorial/index.html

 

공부해야혀~~~~ 기초 까먹으면 골아퍼~~~

Posted by tornado
|

http://otn.oracle.co.kr/products/jdev/htdocs/jdevcategory.jsp

 

Oracle9i JDeveloper 기술 정보

제품 개요
Oracle9i JDeveloper Reviewer's Guide (ZIP)
이 문서는 Oracle9i JDeveloper의 실습을 통해 평가하는 문서입니다. 여기에는 Oracle9i JDeveloper의 개요 및 특징,Oracle9i JDeveloper를 이용하여 J2EE 애플리케이션과 웹 서비스를 개발하는 방법에 대해 자세히 설명되어 있습니다.
9.0.29.0.3.x
Oracle9i JDeveloper 신기능9.0.29.0.3.x
Oracle9i JDeveloper 백서 (PDF) 9.0.2 
Oracle9i JDeveloper 9.0.3.x 신기능 (Broadband Demos)
New features in the IDE
Support for EJBs and BC4J
Modeling, Web services & SCM
Database Integration
View Technologies, ANT and JUnit
  
Oracle9i JDeveloper FAQ (Java 유저 그룹에서 나온 질문과 답변)   

기술
IDE
Oracle9i JDeveloper - Hands on Labs
이 문서는 Oracle9i JDeveloper 9.0.3을 바탕으로 구성되었으며 일부 실습에 필요한 추가 요구 사항은 실습 자체 안에 설명되어 있습니다. 요구 사항과 설명은 반드시 읽어 보시기 바랍니다.
Developing Custom JSP Tag Libraries in Oracle9i JDeveloper
이 문서는 Oracle9i JDeveloper를 이용하여 사용자 JSP 태그 라이브러리를 생산적으로 구축하는 방법에 대해 설명합니다.
편리해진 Oracle9i JDeveloper로의 마이그레이션
이 문서는 기존 소스를 Oracle9i JDeveloper로 마이그레이션하는 방법에 대한 가이드라인을 제공합니다. 또한 개발자들이 좋아할만한 생산성 향상을 위한 힌트를 제공합니다.
JDeveloper extension for developing J2ME applications
Oracle9i JDeveloper 9.0.3 설치 가이드
 
J2EE 개발
Using Struts with Oracle9i JDeveloper - Hands On Exercises
Business Components for Java Statement of Direction
이 문서는 BC4J의 현재 상황에 대한 개요 및 오라클의 향후 전략에 대한 프레임워크를 제공합니다.
BC4J Performance Report: Sample Response Times Under Load
이 문서는 BC4J와 오라클 J2EE 프레임워크의 성능 및 확장성에 대해 알 수있는 벤치마크 결과를 제공합니다.
BC4J Business Rules in BC4J (PDF)
이 문서는 BC4J의 모델링 및 구현 비즈니스 법칙에 대한 메소드를 제공합니다.
Introduction to JClient: A Guide for Forms Developers
이 문서는 Oracle9i JDeveloper를 이용하여 Java Clients를 구축하고자 하는 Oracle Forms 개발자를 위한 문서입니다.
Overview of Temporary Tables Used by BC4J
이 문서는 임시 데이타들을 저장하기 위해 BC4J를 사용하는 데이타베이스 테이블에 대해 설명합니다.
Configuring OC4J to work with BC4J
Simplifying J2EE and EJB Development with BC4J
이 문서는 오라클의 J2EE 호환 BC4J 프레임워크를 어떻게 하면 간소화할수 있는지에 대해 설명합니다.
Business Components for Java Feature Overview
Java Client Statement of Direction
Introduction to JClient: A Simplified Guide
Business Components for Java Whitepaper
Business Components for Java 기술 백서(PDF)
 
웹 서비스
Oracle9i JDeveloper를 이용한 웹 서비스의 개발 및 구축 (PDF)
Web Services Tutorials
자바와 데이타베이스 웹 서비스를 구축 및 게시하기 위한 15개 이상의 스텝 바이 스텝 튜토리얼 자료입니다.
Automated Invocation of a .NET Web Service
Oracle9i JDeveloper와 .NET 웹 서비스와의 연동 가이드
Database Web Services
데이타베이스 웹 서비스의 게시 및 소비에 대한 예제 및 문서
Web Services Center
웹 서비스에 대한 샘플, 기술자료, 라이브 데모 및 튜토리얼 리소스
 
UML 모델링
모델링 툴 안내서
Oracle9i Designer 및 Oracle9i JDeveloper 등의 모델링 툴에 대한 방향
Optimizing Development Productivity Using UML in Oracle9i JDeveloper (PDF)
이 문서는 모델링이 개발 환경에 추가될 수 있는 가치에 대해 설명합니다. JDeveloper에 소개된 UML 클래스 모델링 및 액티비티 모델링 등의 특정 기술과 개발자에게 이 모델러가 왜 중요한지에 대해서도 설명하고 있습니다.
 
데이타베이스 개발
Oracle9i JDeveloper 9.0.3 announces support for PL/SQL development and debugging
이 문서는 PL/SQL 개발을 위한 기능 및 Oracle9i JDeveloper 9.0.3에 포함된 일반 데이타베이스 개발에 대해 설명합니다.
 
확장(Extensions)
Developing Business Intelligence applications using BI Beans within Oracle9i JDeveloper
 
이전(Migration)
WebGain Developer Center
WebGain 사용자에게 제공하는 JDeveloper의 이점을 알고 싶으십니까? VisualCafe에서 Oracle9i JDeveloper로의 손쉬운 마이그레이션에 대한 리소스 및 VisualCafe 플러그인을 확인해보십시오.
편리해진 Oracle9i JDeveloper로의 마이그레이션
이 문서는 기존 소스를 Oracle9i JDeveloper로 마이그레이션하는 방법에 대한 가이드라인을 제공합니다. 또한 개발자들이 좋아할만한 생산성 향상을 위한 힌트를 제공합니다.
Forms Application을 J2EE로 마이그레이션
Java 및 J2EE 플랫폼은 웹 애플리케이션 구축의 표준으로 알려져있습니다. 이러한 개방형 표준 아키텍처로의 움직임과 함께 조직은 어떤 개발 툴을 사용할 것인가 그리고 기존 Oracle Forms 애플리케이션을 J2EE 플랫폼으로 이전할 것인지에 대해 결정해야합니다.
 
기타 리소스
Explore the Oracle9i JDeveloper Handbook
Chapter 3, "Creating BC4J Applications with the IDE Tools."
Chapter 9, "Introducing Business Components for Java."
Buy the Oracle9i JDeveloper Handbook from Oracle Press.
Read our conversation with the authors.
FAQ on JSR 198 and Eclipse related announcement
New Free Internet Seminar Series: "Oracle9i JDeveloper - Meet The Developers"
Oracle9i JDeveloper Team과 개발자 간의 토의 내용을 들어보세요.
J2EE Web Apps Tutorial
 


 

 

Posted by tornado
|

정리가 무쟈 깔끔~~

 

 

http://blog.empas.com/inter999/

 

 

 

'JAVA > JSP_Servlet' 카테고리의 다른 글

[펌] JSP 에서의 파일 업로드  (3) 2004.08.12
java.sun.com ===&gt; web Service  (0) 2004.08.09
[struts] &lt;html:options /&gt; 태그 ...  (0) 2004.08.03
[펌] &lt;bean:size .. /&gt;  (0) 2004.07.20
[펌] Struts Tips  (0) 2004.07.20
Posted by tornado
|
Dear All
Can any body complete this oode , I mean to say that what needs to be done in
configuration file struts-config, where ARRAY information must be kept.. Can any body
complete the code that it will be directly a working code .I have  successfully
completed select using simple options .

<html:select  name="StudentForm" property="passwd" >
<html:options name="StudentForm" property="languages" />
</html:select>

But want to learn using collections I am suing struts1.1.
I am trying from so many days ...pl. help
Many many thanks in advance pl. help..

Kind Regards
Strutsguy
If nay boy needs all code for  above I can send all with java class and config file .

<html:options>
ARRAY information
ArrayList prod = new ArrayList();
prod.add( new org.apache.struts.util.LabelValueBean( "Widget", "20" ) );
prod.add( new org.apache.struts.util.LabelValueBean( "Sprocket", "29-2a" ) );
prod.add( new org.apache.struts.util.LabelValueBean( "Cog", "29s" ) );
prod.add( new org.apache.struts.util.LabelValueBean( "Dunsel", "943" ) );

LabelValueBean takes the first String argument as the displayed name and the second as
the value returned. We’ll see more about this in a bit.
Now that you have prod set up, you pass that as a session or request bean to the JSP.
request.setAttribute( Constants.PRODUCT_KEY, prod );
(the Constants.PRODUCT_KEY is set to our bean name: "products"; we use this to
centralize bean name management)
To use the data in the JSP, add the following code:
  <html:select property="product_id" styleClass="prodselect" >
    <html:options collection="products" property="value" labelProperty="label" />
  </html:select>
Notes: product_id is the variable the JSP will set to the product ID value of the
product selected by the user. products is the name of the bean (it must match what is
in Contants.PRODUCT_KEY -- we probably could've said
... collection="<%= Constants.PRODUCT_KEY %>" ...
in place of hard-coding the name. The choice is up to you.
property="value" and labelProperty="label" are automatically set by
org.apache.struts.util.LabelValueBean, so only use the values shown here.
The resulting HTML will look something like:
<select name="product_id" size="1">
<option value="20">Widget</option>
<option value="29-2a">Sprocket</option>
<option value="29s">Cog</option>
<option value="943">Dunsel</option>
</select>

Posted by tornado
|

<logic:present name="searchForm" property="results">

<hr width="100%" size="1" noshade="true">

<bean:size id="size" name="searchForm" property="results"/>
<logic:equal name="size" value="0">
<center><font color="red"><b>No Employees Found</b></font></center>
</logic:equal>

<logic:greaterThan name="size" value="0">
<table border="1">
<tr>
<th>Name</th>
<th>Social Security Number</th>
</tr>
<logic:iterate id="result" name="searchForm" property="results">
<tr>
<td><bean:write name="result" property="name"/></td>
<td><bean:write name="result" property="ssNum"/></td>
</tr>
</logic:iterate>
</table>
</logic:greaterThan>

</logic:present>

 

http://otn.oracle.com/oramag/oracle/04-may/o34dev_struts_l1.html

Posted by tornado
|

[펌] Struts Tips

JAVA/JSP_Servlet 2004. 7. 20. 09:57
Posted by tornado
|
RSS란?

RSS는 뉴스, 블로그 등 자주 갱신(update)되는 성격의 사이트를 위한 XML 기반의 포맷입니다. A라는 사이트 (또는 사용자)가 B라는 사이트의 RSS 파일을 정기적으로 수집하면 B 사이트의 갱신된 컨텐츠 제목, 링크, 발췌 내용을 자동화된 과정에 의해 자신의 사이트에 올려놓을 수도 있고, 개인 사용자는 RSS 리더 (reader) 프로그램을 사용해 B 사이트를 직접 방문하지 않고도 최신 컨텐츠를 편리하게 볼 수 있습니다.

블로그 사이트들을 지나다 보면 'Syndicate this site (XML)' 또는 과 같은 아이콘이 있는 것을 보셨을 겁니다. 이것은 모두 RSS 파일의 링크를 표시하는 것으로서 보통 파일명은 index.xml, index.rdf, rss.xml 등이고, RSS는 'RDF Site Summary' 또는 'Really Simple Syndication'의 약자입니다.

RSS 규격들은?

'RSS' 하나에 대해 두 가지의 용어가 있는 이유는, 최초 개발은 Netscape사에 의해 이루어졌으나 Netscape사가 개발을 포기하고 난 후 두 개의 개발 주체에서 규격 개발이 진행되어 왔기 때문입니다. 현재는 RSS-DEV Working Group의 RSS (RDF Site Summary) 1.0UserLand의 RSS (Really Simple Syndication) 2.0이 업계 표준 채택을 위한 경합을 벌이고 있습니다. 두 개의 규격이 기능상 약간씩의 차이가 있지만 UserLand의 2.0이 좀 더 상세한 기능을 제공하고 있습니다.

RSS의 활용분야는 앞에서 설명했듯이 현재 크게 두 가지로 볼 수 있습니다. 사이트의 컨텐츠 배급 [신디케이션, syndication] 또는 수집 [어그리게이션, aggregation], 그리고 개인 사용자의 컨텐츠 사용 편리성 제공이 바로 그것입니다.

사이트에서 활용하려면?

A 사이트가 B 사이트의 컨텐츠를 배급하기로 했다면 A 사이트는 B 사이트의 RSS 파일이 저장된 주소(URL) 파악, 갱신 주기 결정 등을 하고 이 컨텐츠가 표시될 A의 웹 페이지를 구성합니다.

그 후 A 사이트의 RSS 수집/발행 시스템이 작동하면 해당 시스템은 자동적으로 B 사이트 컨텐츠의 제목, 링크, 발췌 내용을 결정된 주기에 따라 갱신하여 A 사이트에 보여주게 됩니다.

또는 A 사이트가 특정 주제에 대한 블로그나 뉴스를 모두 수집하여 서비스하고 싶다면, 그 주제에 관한 컨텐츠를 제공하는 C, D, E 사이트의 RSS 파일을 수집하여 같은 방식으로 서비스하면 됩니다.

이 단계 이전에 B 사이트는 자신의 사이트에서 RSS 파일을 제공해야 하는데 무버블 타입 (Movable Type), 라디오 유저랜드 (Radio UserLand), 블로거 (Blogger), 뉴클리어스 (Nucleus) 등의 블로그 출판 시스템들은 대부분 이 기능을 제공하고 있습니다. 이 시스템들에서는 새 글을 올리면 지정된 RSS 템플릿에 따라 RSS 파일이 자동으로 생성되어 지정한 위치에 저장됩니다.

개인이 활용하려면?

개인 사용자의 경우 웹브라우저를 이용해 B, C, D, E 사이트를 하나씩 방문해서 최신 컨텐츠를 확인하기에는 시간도 많이 걸리고 불편합니다. 이 경우 역시 RSS 리더 프로그램에 각 사이트의 RSS 파일 URL과 갱신 주기를 저장해 놓습니다. 그러면 RSS 리더 프로그램를 이용해 각 사이트의 최신 컨텐츠를 한 눈에 파악하고 어떤 것을 읽어야 할 지 파악할 수 있습니다.

RSS 리더 프로그램은 윈도우, 맥 OS 등 각각의 플랫폼마다 무료 또는 상용 버전들이 개발되어 있습니다. 각자의 필요에 따라 선택해서 사용하면 되겠습니다. 개인적으로는 제가 사용하고 있는 SharpReader (윈도우용)를 추천합니다. 무료이고 RSS 사이트의 분류, 한글 처리, 속도, 사용편이성, 필수 기능 등에 있어서 만족할만 합니다. [스크린샷 보기]

상용으로 많이 쓰이는 것으로는 NewzCrawler가 있습니다. 시험판을 사용해 본 소감은 불필요하게 느껴지는 고급 기능들이 좀 많은 것 같습니다. 다양한 기능들을 원하시는 분은 사용해 보셔도 괜찮을 듯 합니다.

국내에서는 어떻게 쓰이고 있나?

국내 블로그 서비스 업체들은 한미르를 제외하고는 RSS 파일을 제공하지 않고 있습니다. 몇몇 사이트가 제공하고 있는 '링블로그', '다른 블로그 구독' 등의 서비스는 해당 블로그 서비스 내에서만 가능하므로 RSS의 활용 범위와 목적과는 너무나도 큰 차이가 있습니다.

이후 서비스 업그레이드 범위에 이 부분도 포함시키는 것을 서비스 업체들께 권유하고 싶습니다. 블로그는 개별 업체 서비스의 울타리 안에 가둬둔 채로 활성화 시키기에는 아까울 뿐 아니라 적합하지 않은 서비스라고 생각합니다. 이 틀을 깨는 업체가 블로그 서비스 업계에서 앞서나갈 수 있지 않을까 하는 생각이 듭니다.

국내 뉴스 사이트의 경우 RSS를 공개하는 곳은 전무합니다. 외국의 경우 BBC, 뉴욕 타임즈, 가디언, 와이어드 등 유명 언론들이 RSS를 제공, 공개하고 있는 것과 비교했을 때 큰 차이가 있습니다. 빠른 시일 내에 많은 국내 사이트들도 RSS를 제공하게 되기를 기대해 봅니다.

현재 RSS를 제공하고 있지 않은 개인 블로그 사이트들도 이것을 제공한다면 블로그 간의 활발한 커뮤니케이션과 네트워크를 형성하는 데 큰 도움이 되지 않을까 합니다. 아직까지 국내에는 BlogdexMetaFilter와 같은 메타 블로그 서비스가 없는 관계로 개인 블로그들이 그 진가를 발휘하지 못하고 있다는 느낌도 있지만 이후 이런 서비스들이 반드시 생겨날 것이고, 그 때에는 국내 블로그들의 가치가 RSS를 통해 빛을 더할 것이라고 예상해 봅니다.

☞ 관련 링크



/최호찬 기자 (choi@hochan.net)
덧붙이는 글
PS. 국내 사용자들도 RSS 관련 기술에 대해 많이 파악하고 있는 것 같습니다. 하지만 검색을 해보면 해당 국내 자료는 매우 부족한 상황입니다. 관련 전문가들께서 정보 및 자료 제공을 해주신다면 국내에서도 풍부한 논의와 환경을 갖추게 되지 않을까 하고 생각해 보았습니다.

이 기사는 기자의 홈페이지인 HOCHAN.NET에도 함께 실립니다.

Posted by tornado
|

<Listener className="org.apache.catalina.startup.UserConfig"
            directoryName="public_html"
            userClass="org.apache.catalina.startup.PasswdUserDatabase"/>

 

 

사용하고자 하는 host 안에  넣어주면 /etc/passwd 안에 들어있는 user 의 이름으로 된

주소를 인식하여 브라우저에 표현해 준다.

 

xxx.com/~계정/   과 같이 접근..

 

 

사이트가 읍어져서리.. 생각나는대로 계속 블로그에 적는중...

Posted by tornado
|

Tomcat 클러스터링

등록일: 2002년 08월 20일

저자: 시암 쿠마르 도다불라(Shyam Kumar Doddavula)

본 기사는 클러스터링이 웹 애플리케이션에 어떤 이익을 줄 것인지, 자바스페이스(JavaSpaces) 기술을 사용한 고도의 확장성, 부하분산(load-balancing), 고가용성(availability)을 제공하는 자카르타 톰캣(Jakarta Tomcat) 서블릿 엔진을 위해 개발한 클러스터링 솔루션에 대해 기술한 글이다.

소개

웹 기반 애플리케이션 사용이 증가함에 따라 성공에 결정적인 영향을 주는 요인으로 확장성과 가용성이 대두되고 있다. 웹 애플리케이션을 수용하는 서버에 클러스터링 솔루션을 구축하는 것은 간단하면서도 비용을 절감시켜주는 솔루션이라 할 수 있다.

자바스페이스 기술은 클러스터링 솔루션을 설계하는데 사용 될 수 있는 분산 공유 메모리 모델을 제공한다. 원격 절차 호출(RPC: remote procedure calling)을 가능하게 하거나 메시지 교환을 반복적으로 실행하는 전형적인 분산시스템 기법과는 달리, 이 기술을 사용하는 솔루션은 오브젝트를 전달하는 능력을 수행한다. 이들 오브젝트는 일반적인 원격시스템에서 작업을 수행하는데 필요한 모든 정보(심지어 소스코드까지)를 연상, 공유, 분산 메모리를 사용하여 운반한다. 자바스페이스는 오브젝트를 스페이스에 추가하고, 오브젝트 복사본을 읽어오고, 스페이스로부터 오브젝트를 가져오는 간단한 쓰기, 읽기, 가져오기 연산 집합을 제공한다.


[그림 1] 자바스페이스를 사용한 분산시스템(Sun Microsystems승인 하에 사용)

자바스페이스는 지니(Jini) 기술 서비스의 핵심이다. 지니 프로그래밍 모델은 리스 모델(leasing model)과 동적 서비스 디스커버리(dynamic service discovery)를 통해 자체적으로 구성되는(self-configuring) 능동적인 분산시스템을 만드는데 필요한 하부구조를 제공한다. 이 기술에 대해 보다 많은 정보는 아래 관련자료를 참고하면 된다.

지니 프로그래밍 모델과 결합된 자바스페이스 기술은 높은 시공완화(spatial and temporal decoupling)를 제공하기 때문에 고도로 확장가능하며, 장애 허용적이고(fault-tolerant), 동적으로 구성할 수 있는 분산시스템 설계를 가능하게 해준다. 본 기사에서는 이와 같은 기술들을 사용하여 서블릿 API 구축에서 각광 받는 오픈 소스인 톰캣 서블릿 엔진(Catalina 4.x)을 위한 간단한 클러스터링 솔루션에 대해 살펴보고자 한다.

왜 클러스터링인가?

클러스터링 솔루션이 일반적으로 제공하는 것은 다음과 같은 것들이다.
  • 확장성(Scalability)
  • 고가용성(High Availability)
  • 부하분산(Load Balancing)
확장성

여기서 핵심질문은 '하나의 요청을 처리하는데 T라는 시간이 소요된다면 N개의 동시 요청을 처리하는 데는 얼마의 시간이 걸릴까?'하는 것이다. 목표는 부하가 증가됨에 따라 컴퓨팅 자원을 증가시켜 가능한 한 T에 가깝게 시간을 가져가는 것이다. 이상적인 솔루션은 수직적(서버의 컴퓨팅 자원을 증가시키는 것) 및 수평적(서버 수를 늘리는 것) 확장을 모두 지원해야 하며 확장은 선형적이어야 한다.

고가용성

여기서의 목표는 오류극복 기능을 제공하는 것이다. 클러스터의 한 서버가 작동이 불가능하게 되면 클러스터 내의 다른 서버가 작업을 대신 수행해야 하며 최종 사용자에게는 가능한 한 투명하게 진행되어야 한다.

서블릿 엔진의 경우 클러스터링 솔루션에 의해 제공되는 전형적인 오류극복 기능이 있으며 이는 다음과 같은 두 단계로 이루어 진다.
  • 요청단계 오류극복(Request-level Failover)
  • 세션단계 오류극복(Session-level Failover)
요청단계 오류극복 클러스터 내 하나의 서버가 작동할 수 없게 되면 모든 후속 요청은 클러스터 내의 정상적인 서버에 재전달 되어야 한다. 일반적인 클러스터링 솔루션에서는 서버의 상태를 지속적으로 추적하고 응답이 없는 서버에는 요청을 전송하지 않는 심장박동 메커니즘(heartbeat mechanism)을 이용하는 것을 포함한다.

세션단계 오류극복 HTTP 클라이언트는 서버에서 관리되는 세션을 가질 수 있다. 따라서 세션단계 오류극복이라는 것은 클러스터의 서버가 작동 할 수 없게 되면 클러스터 내의 다른 서버들이 오류발생 서버가 관리하던 세션의 연속성 상실을 최소화하며 연계하여 작동할 수 있어야 한다는 것이다. 일반적인 클러스터링 솔루션에서는 세션 정보를 클러스터 간(적어도 클러스터 내의 다른 한 서버)에 복제하는 것으로 구현된다.

부하분산

부하분산의 목표는 솔루션이 최종사용자에게 최대한의 응답시간을 제공하기 위해 클러스터 서버 간에 부하를 나눠주어야 한다는데 있다.

일반적인 클러스터링 솔루션에서는 간단한 라운드 로빈 알고리즘(round robin algorithm)이나 서버상의 부하와 가용자원을 지속적으로 추적하여 요청을 분산하는 복잡한 알고리즘 같은 부하분산 알고리즘을 사용하여 구현된다.

제안 솔루션

일반적인 클러스터링 솔루션은 분산 시스템 솔루션 구축하기 위해 클라이언트-서버 패러다임을 사용하는데 확장성에 제한이 있다.

여기서 사용될 스페이스 패러다임에서는 클러스터링이 하나의 서버에서 다른 서버로 오브젝트 이동을 통해서 이뤄지는데 이 오브젝트는 실행되는 현 상태와 바이트코드, 필요하다면 연상, 분산, 공유 메모리를 포함하는 다른 모든 것을 전달한다.

자카르타 톰캣 서블릿 엔진이 어떻게 작동하는지 살펴보자. 이것은 [그림 2]와 같이 요청을 접수하고 수행하기 위해 커넥터(connector)와 프로세서(processor)를 사용한다.


[그림 2] 독립 톰캣 서블릿 엔진의 아키텍처

커넥터는 다른 소스로부터의 요청에서 접수 상세를 추출하며, 프로세서는 요청 수행 상세를 추출한다.

아래 [그림 3]은 제안 클러스터링 솔루션의 아키텍처를 보여준다.


[그림 3] 클러스터링 톰캣 서블릿 엔진의 아키텍처

클러스터 서버 커넥터(Cluster Server Connector)는 클라이언트의 요청을 접수하고 클러스터 서버 프로세서(Cluster Server Processor)는 RequstEntry 오브젝트로 요청을 캡슐화(encapsulate) 하고 자바스페이스에 오브젝트를 기록한다. 클러스터 워커 커넥터(Cluster Worker Connector)는 자바스페이스로부터 이 요청들을 가져오고 클러스터 워커 프로세서(Cluster Worker Processor)는 요청을 수행한다.

이 클러스터 서버와 클러스터 워커들은 복수의 인스턴스로 존재할 수 있으며 여러 대의 기계에 분산될 수도 있다.

RequestEntry는 다음과 같이 정의된다.
public class RequestEntry extends net.jini.entry.AbstractEntry { private static int ID = 0; public RequestEntry(){ id = String.valueOf(ID++); } public String id; public RemoteSocketInputStream input; public RemoteOutputStream output; } 
id 필드는 요청을 식별한다. 입력 필드인 RemoteSocketInputStream 오브젝트형은 원격 기계상의 소켓의 입력 스트림 접속을 제공하고 출력 필드 오브젝트인 RemoteOutputStream은 원격 출력 스트림 접속을 제공한다.

하나의 요청이 접수되었을 때, 소켓의 입출력 스트림은 원격 기계상에서 접속할 수 있는 원격 스트림으로 감싸진다. 요청등록이 이 원격 스트림으로 생성되고 아래의 클러스터 서버 프로세서 코드를 통해 자바스페이스에 기록된다.
... /** * 이 프로세서에 할당된 소켓에 들어오는 HTTP 요청을 처리한다. * 수행 중 발생한 어떤 예외도 적절하게 흡수, 처리되어야 한다. * * @param socket 클라이언트와 접속하는 소켓 */ private void process(Socket socket) { RemoteSocketInputStream input = null; RemoteOutputStream output = null; try{ // TC 클래스 로더의 쓰레딩 문제로 인해 동기화 되어야 한다. synchronized(this.getClass()){ input = new RemoteSocketInputStreamImpl(socket, connector.getPort()); output = new RemoteOutputStreamImpl(socket.getOutputStream()); } log("socket address = " + input.getSocketAddress() + ", port " + input.getServerPort()); RequestEntry entry = new RequestEntry(); entry.input = input; entry.output = output; requestGenerator.write(entry); }catch(Exception ex){ log("parse.request", ex); } } ... 
클러스터 워커 커넥터와 프로세서는 아래 코드에서처럼 이들 엔트리를 가져오고 요청을 수행한다.
... public void run() { // 셧다운 신호를 받을 때까지 요청을 수행한다 while (!stopped) { log("waiting for entry in JavaSpace..."); RequestEntry requestEntry = null; try{ synchronized(this){ ... requestEntry = (RequestEntry)requestReader.take(); ... } }catch(Exception ex){ log("internal error while getting request entry from JavaSpace", ex); } log("got an entry " + requestEntry); // 요청을 수행한다 if (requestEntry != null) process(requestEntry); } ... } ... 
제안 솔루션이 제공하는 것들은?

이 솔루션은 부하가 증가함에 따라 클러스터 워커의 수를 증가시킬 수 있다. 또한 이들 클러스터 워커는 여러 대의 기계에 걸쳐 분산될 수 있으므로 고도의 확장성을 제공한다. 이 외에도 여러 대의 기계에서 동작하는 복수의 자바스페이스 서비스 인스턴스가 존재할 수 있고, 집단을 구성하며, 클러스터 서버가 그 중 하나에 기록을 결정할 수 있기 때문에 네트워크 트래픽을 관리를 할 수 있도록 유지한다.

클러스터 서버와 워커는 구현된 자바스페이스 서비스들을 찾기 위해 지니 서비스 디스커버리 메커니즘을 사용하므로 그들의 위치는 하드코딩될 필요가 없다. 따라서 이 솔루션은 동적으로 설정할 수 있다. 지니 리스 모델을 사용하므로 전체 시스템을 셧다운할 필요 없이 추가적인 자원을 첨부할 수 있다. 마찬가지로 현재 자원도 더 이상 지니 라이센스를 갱신하지 않고 현재 라이센스가 만료된 후에 우아하게 제거할 수도 있다.

클러스터 내의 여러 서버에 분산된 요청은 밀어내기식이 아닌 끌어오기식이므로 동작하지 않는 서버에 요청이 전달되는 일은 전혀 없기 때문에 요청단계 오류극복이 제공되는 것이다.

이 솔루션에서 세션정보는 자바스페이스에 있고 필요할 때마다 HHTP 클라이언트가 제공하는 세션 ID를 이용하여 나중에 검색된다. 따라서 이것은 애초에 세션정보를 생성했던 서버가 더 이상 동작하지 않을 때에도 클러스터 내의 다른 서버들은 계속 세션을 가지고 있기 때문에 세션단계 오류극복을 제공하고 있는 것이다. 왜냐하면 우리는 지니 리스 모델을 사용하고 있으므로 자바스페이스에 등록된 세션을 세션종료기간 후에 만료되도록 설정할 수 있고 만료된 세션 정보를 제거하는 도구를 제공한다.
한빛네트워크 기사
톰캣 사용하기 IV - 자바 애플리케이션에 톰캣 임베딩하기
톰캣 사용하기 III - 톰캣 설치와 설정
톰캣 사용하기 II - 톰캣에 웹 애플리케이션 배치하기
톰캣 사용하기 I - 자바 웹 애플리케이션

오라일리 기사
Using SOAP with Tomcat
Using Tomcat 4 Security Realms


부하분산은 끌어오기 기반이기 때문에 여유 자원이 많은 서버가 더 많은 작업을 끌어오는 식으로 부하분산이 자동적으로 이루어진다.

이 설계는 세션 정보 관리 책임을 자바스페이스에 전가하고, 자바스페이스 서비스 구현은 지속적인 형태와 트랜잭션 형태로 제공되기 때문에 필요하다면 보다 쉽게 지속적인 세션을 제공하는 셈이 된다.

현재 우리는 요청을 담아두는 가방 형태로 스페이스를 사용하고 있으나
Build and use distributed data structures in your JavaSpace에서 기술한 대로 최소한의 수정을 통해 채널형태로 만드는 것도 가능하다. 마찬가지로 요청을 필터하는 필터링 서비스 구현도 할 수 있을 뿐만 아니라 서비스품질(QoS) 기능을 제공하도록 우선권을 부여하는 식의 구현도 가능하다.

제안 솔루션의 한계

클러스터 서버가 하나 이상 존재하는 것이 가능하고 모두 동작하게 하는 데에는 별 차이가 없으나 HTTP 클라이언트는 전형적으로 웹 자원에 접속하는데 URL을 사용하므로 클라이언트는 클러스터를 (서버 유연성 향상을 위해) 하나의 IP 주소를 가진 기계로 볼 수 있도록 해야 한다. 따라서 하나의 클러스터 서버가 필요하다. 하지만 이것이 단일 오류 발생지점(single point of failure)이 될 수 있으므로 이 한계는 하드웨어 부하 분산기를 이용하여 극복될 수 있고(그렇다고 하더라도 바로 이 부하 분사기 자체가 단일 오류 발생지점이 될 수도 있다), 이런 경우에 이 솔루션은 웹 서버 프록시(아브라함 캉(Abraham Kang)이 쓴
J2EE Clustering에 대한 기사) 형태로 사용되거나 하나 이상의 기계가 단일 도메인명을 지원하는 기술을 사용할 수 있다. 그밖에 다른 기술은 'ONE-IP: Techniques for Hosting a Service on a Cluster of Machines'에서 찾아볼 수 있다.

결론

이 솔루션은 다른 소프트웨어 솔루션들과 비교할 때 고도의 확장성, 고가용성, 우수한 부하분산 기능을 제공한다. 동적 자가 설정 기능을 제공하므로 유지보수 노력을 절감할 수 있으며 품질서비스(QoS) 기능 구현이라는 유망성도 보유하고 있다.

이 솔루션과 관련된 소스코드 다운받기

관련자료

시암 쿠마르 도다불라(Shyam Kumar Doddavula)
Infosys Technologies의 연구개발부서인 SETLabs에서 기술전문가로 근무 중이다.
Posted by tornado
|

Commons BeanUtil 에는 참 유용한게 많다..

 

그중 RowSet 과 비스무리(?) 한 것이 하나 있는데..

 

바로 RowSetDynaClass 이다...

 

 

일반적 JDBC 프로그래밍에서는 아래와 같은 순서를 가진다.

 

pstmt = t.prepareStatemet(query);

pstmt.setXXX(....);

rs = pstmt.executeQuery();

 

while(rs.next()){

 ... 작업들.....

}

 

rs.close();

 

이런 구조를 가지고 가게 되며, 커넥션이 닫히기 전에 resultSet 을 순차적으로 내려가면서 작업을 한다.

 

Commons BeanUtils 안에는 RowSetDynaClass 라는 클래스가 있다.

이 클래스는 JDBC 연결이 끊어진 이후에도 사용가능한 CachedRowSet 과 비슷한 기능을 제공해준다.

 

이것의 사용법은 상당히 간단하다. 참조 코드는 다음과 같다.

 

   pstmt = t.prepareStatement(query);
   rs = pstmt.executeQuery();
   rsdc = new RowSetDynaClass(rs);
   
   rs.close();

....

 

finally{   ... conn.close(); }

 

요기까지가 끝이다.. 이후에는 rsdc 라는 녀석을 이용해서 데이터를 취득하면 된다.

이렇게 데이터를 가져오게 되면

rsdc 에서는 getRows() 메소드를 이용하여 List 객체를 취득할 수 있다.

 

List arr = rsdc.getRows();

 

또한 검색해 온 컬럼의 이름들을 Property 로 얻을 수도 있다.

 

 DynaProperty[] dynas = rsdc.getDynaProperties();
  
 for(int i = 0; i < dynas.length; i++){
  System.out.println(dynas[i].getName());
 }

 

DynaProperty 클래스는 일반적인 Property 개념으로 보면 된다.

 

또한 이렇게 얻어온 DynaProperty 배열객체를 이용하여 RowSetDynaClass 를 순환하며 내용을 참조할 수 있다.

 

List 형태로 반납된 rows 들을 순환하게 되면 DynaBean 이라는 객체를 반납하게 된다.

이 형태를 이용하여 rs.next() 작업과 동일한 결과를 얻을 수 있다.

 

 Iterator iter = arr.iterator();
 
 while(iter.hasNext()){
  DynaBean bean = (DynaBean)iter.next();
  
  for(int i = 0; i < dynas.length; i++){
   System.out.println(bean.get(dynas[i].getName()));
  } 
 }

 

 

사용하다 주의할 것은 테이블 컬럼명이 regiDate 와 같이 중간에 대문자가 끼어있을 경우이다

이렇게 중간에 대문자가 끼어있는 것들은 RowSetDynaClass 를 생성하는 과정에서

전부 소문자로 바뀌게 된다.

SQL 상에서는 대소문자를 가리지 않지만 객체에서 값을 얻어올때는 가린다는것에 주의!!!

 

그렇기 때문에 bean.get("regidate") 와 같이 프라퍼티를 전부 소문자로 적어야

제대로 출력될 것이다.

 

 

DAO Layer 측에서 해야할 일들이 DAO를 이용하는 Layer 에 종속적인 작업이 진행될 경우

RowSetDynaClass 를 이용하여 Action 측에서 사용하면 각 레이어의 할일이 조금더 분명해 질수 있다.

 

 

 

 

 

 

 

 

 

 

Posted by tornado
|

Apache 와 톰캣을 연동 했을경우에 골때리는 문제가 하나 생긴다.

 

아파치에서는 Domain 별 디렉토리를 가상호스트로 지정하여 사용하여야 하는데 주소는 다음과 같다.

 

http://aaa.com

 

이 주소에 대하여 DocumentRoot 를 지정할 경우 아래와 같이 특정 디렉토리를 명시하게 된다.

DocumentRoot /usr/local/tomcat4/webapps/ROOT

 

만약 가상호스트로 설정되어있다면

<VirtualHost ....>

   DocumentRoot /usr/local/.......

   .....

</VirtualHost>

 

 

 

또한 aaa.com/test/images 라고 요청 할 경우 디렉토리는 당연히

/usr/local/tomcat4/webapps/ROOT/test/images 와 같은 형태로 요청하게 된다.

 

문제는 test 라는 디렉토리가 하나의 컨텍스트 였을 경우 발생하게 된다.

 

톰캣에서 하나의 웹 애플리케이션의 구성은 webapps/ 를 기준으로 /ROOT  , /examples 등이 있게 된다.

 

이것은 하나의 가상호스트처럼 동작하게 되지만 Apache 에서 볼때는 하나의 디렉토리로 인식하게 되는 것 같다.

 

즉 이 얘기는 http://aaa.com:8080/test 라고 요청할 경우 test 라는 하나의 컨텍스트로 인식하여

 

test 웹 애플리케이션을 호출해 주겠지만 아파치와 연동 되었을 경우에는

 

/test 를 단지 ROOT 애플리케이션의 서브디렉토리로 인식하게 된다는 것이다.

 

아파치에서 톰캣으로 요청을 넘길때 /test/*.jsp  ... /test/*.do 와 같이 넘기게 되면

톰캣에서는 test 라는 하나의 컨텍스트 차원에서 처리를 하지만 아파치에서는 .jsp 와 .do 를 제외한 모든 자원을 test 라는 디렉토리로 보고 처리를 한다는 것이다.

 

이때는 이 컨텍스트를 하나의 도메인으로 빼는게 맞는것 같고...

 

네임서버에서 test.aaa.com 과 같은 형태로 주던지... bbb.com 이라는 완전한 도메인을 빼던지

해주고... Apache 에서 DocumentRoot 를 따로 지정해 주는게 바른 방향 같다.

 

글쓰다가 회의해서리.. 뭔소린지.. 꼬이네.. 캬캬캬

 

 

 

Posted by tornado
|
 

Strategic Planning, SPA-19-5971 Research Note

 

Y. Natis, R. Schulte 14 April 2003

 

서비스 지향 아키텍처 소개

 

웹 서비스의 모멘텀에 이끌려 서비스 지향 아키텍처는 첨단 소프트웨어 프로젝트에서 주류로 위상을 옮기게 될 것이다. 하지만 대부분의 기업들이 SOA의 이점에 대해 혼란을 느끼고 있고 리스크는 제대로 이해하지 못하고 있다.

서비스 지향 아키텍처(SOA)는 클라이언트/서버 소프트웨어 설계 방식으로서 이 설계 방식에서 애플리케이션은 소프트웨어 서비스와 소프트웨어 서비스 소비자(또는 클라이언트나 서비스 요청자)로 구성된다. 소프트웨어 구성 요소들간의 느슨한 결합을 중시하고 별도의 독립적 인터페이스를 사용한다는 면에서 SOA는 비교적 보편화된 클라이언트/서버 모델과는 차이가 있다.

 

SOA 원리는 애플리케이션 설계, 개발 및 배치 중에 반영된다. 이들은 봉입과 유연한 결합이라는 필수 원칙은 공유하지만 자세히 보면 차이가 있다. SOA의 근본 의도는 새로운 실시간 상황에서 소프트웨어 구성 요소(서비스)를 독립적으로 재활용하는 것이다. SOA의 설계와 개발은 이러한 기민한 실시간 환경의 확보를 목적으로 수행된다.

 

서비스 인터페이스는 SOA 설계의 정수


설계에서 서비스는 서로 구분되어 정의된 한 쌍의 요소들(서비스 인터페이스와 서비스 구축)로 표현되는 포장된 비즈니스 소프트웨어 구성 요소들이다. 인터페이스는 서비스에서 근본적이고 일정한 구성 요소이다. 서비스는 항상 다른 소프트웨어 구성 요소(서비스 소비자)로부터의 프로그램 액세스를 위해 존재한다. 서비스 인터페이스는 서비스에 대한 프로그램 액세스 "계약"을 정의한다.
서비스 구현은 서비스의 비즈니스 기능을 충족시킨다. 설계 작업의 구체화 수준에 따라 서비스 구현은 개발 도중에 시험해 보아야 할 "블랙 박스"로 남을 수 있다. 그 밖의 경우에는 새로운 모듈로서 이전 SOA 모듈에 대한 숨겨진 액세스 또는 새롭고 선행하는 소프트웨어 모듈에 대한 복수의 조건부 호출의 합성물이 될 것이다

서비스 구현의 설계는 SOA의 설계에서 부차적인 문제이지만 서비스 인터페이스의 설계는 중요하다. SOA는 근본적으로 서비스 인터페이스의 흐름 및 관계이다. SOA의 설계에는 서비스 인터페이스간, 그리고 서비스 인터페이스와 서비스 소비자 사이의 인터랙션과 서비스 인터페이스에 대한 정의가 관련된다.

 

블랙 박스적 속성은 서비스에 필수적이다.


서비스 인터페이스는 서비스의 정체성과 서비스 호출의 규칙을 수립하는 계약이다. 서비스 인터페이스는 내부 디자인 및 컨텐츠를 고려하지 않고 서비스를 규명(찾고 이해함)하고 사용할 수 있기에 충분한 수준의 정보를 갖고 있어야 한다. 블랙 박스적 성격은 서비스에 필수적이다. 이는 모든 입력 데이터, 모든 응답 데이터(응답 데이터가 있는 경우), 그리고 발생된 모든 예외적 조건들이 인터페이스에 기록되어야 함을 의미한다. 또한 서비스의 목적과 함수를 파악하기 위해 인터페이스에 충분한 메타 데이터가 제공되어야 함을 의미한다. 서비스의 이름에 의존하는 것은 수용할 수는 있지만 약한 형태의 아이덴티티이다. 서비스의 기능을 정의하는 검색할 수 있는 저장소는 보다 세밀한 밀도로 수많은 서비스를 지원할 수 있고 많은 수의 독립적 소스로부터 올 수 있다.
느슨한 결합은 SOA를 기본적인 소프트웨어 모듈와와 차별화시킨다.
SOA는 느슨하게 결합된 형태의 서비스와 서비스 소비자 배치이다. 설계에서 느슨한 결합이란 서비스를 특정 서비스 소비자에게 유사하게 설계하지 않는다는 것을 의미합니다. 서비스 내부에서는 서비스 소비자의 목적, 기술 특성 또는 비즈니스 성격과 관련한 어떤 정보도 전제되지 않는다. 따라서 서비스는 서비스 소비자와 완전히 분리된다.
하지만 서비스 소비자는 서비스에 종속되어 있다(다시 말해 서비스 인터페이스에 대해 엄밀한 의미에서의 참조가 내장되어 있다). 따라서 SOA는 어느 정도는 결합된, 즉 느슨하게 결합된 아키텍처이다. SOA는 모든 참여 소프트웨어 구성 요소들이 다른 구성 요소들과 분리되어 있다는 면에서 사건 기반(event-driven) 아키텍처와 다르며, 모든 소프트웨어 구성 요소가 최초 의도했던 맥락에서만 작동하도록 설계된다는 면에서(다시 말해 논리적으로 타이트하게 결합된) 단일형 아키텍처(monolithic architecture)와 차이가 있다.
설계 당시의 느슨한 결합은 서비스 인터페이스를 비 침해적 재사용을 가능케 하기 때문에 SOA에 필수적이다. 하지만 툴들로는 설계 과정에서의 느슨한 결합을 보장할 수 없다. 논리적으로 서비스 소비자에게 묶이도록 잘못 설계된 서비스는 SOA 스타일의 기술을 사용하고서도 애플리케이션을 단일형 아키텍처로 만들 수 있다.

 

서비스의 최적 입도는 사용, 툴 및 기술에 좌우된다.


서비스 인터페이스는 여러 개의 엔트리 포인트(메소드) 또는 한 개의 엔트리 포인트를 나타내도록 디자인된다. 고객 관리는 여러 개의 메소드를 노출시키는 서비스의 예가 될 수 있다(예를 들어 고객을 만들고 삭제하거나 고객 정보를 수집). "고객 정보 수집" 메소드는 그 자체로 단일 엔트리 포인트를 갖는 완전한 서비스가 될 수도 있다. 최적의 서비스 인터페이스 입도는 많은 요소들에 좌우된다("Service-Oriented Integration Architectures for Healthcare" 참조).
서비스 인터페이스 개념은 SOA 개발의 핵심이다.
개발 과정에서 서비스 인터페이스는 별개의 독립적인 인터페이스 정의 파일로서 표현된다. 설계 과정에서와 마찬가지로 서비스 인터페이스는 SOA의 필수 구성 요소로 남는다. 인터페이스 파일은 합의된 모든 구문론을 사용해 정의할 수 있지만 표준 기반 구문론을 사용할 경우 서비스의 폭 넓은 도입을 활성화시킬 수 있다.
웹 서비스 기술 언어(WSDL; Web Services Description Language)를 사용해 서비스 인터페이스를 인코딩할 때 서비스는 웹 서비스이다.
WSDL은 새로운 개발 툴 대부분에서 서비스 인터페이스 정의를 위해 사용되는 추천 표준이다. 초기의 SOA 개발은 CORBA IDL(Interface Definition Language), COM/DCOM Microsoft IDL(MIDL), CICS(Customer Information Control System) COMMAREA(common area) 및 기타 좁은 범위로 정의된 사양들을 바탕으로 했다.
전형적인 SOA 애플리케이션 개발 프로세스는 인터페이스 정의로 시작되고 그 뒤에 서비스 구현 소프트웨어와 서비스 소비자 소프트웨어의 개발이 뒤따른다. 대부분의 개발 툴들은 인터페이스 정의의 정확한 언어를 숨기지만 SOA 지향 툴들의 개발 방식은 서비스 인터페이스의 정의, 발견 및 상호 연결을 중심으로 남는다.
서비스 구현 소프트웨어는 고유한 아키텍처를 갖고 있다.
개발 중에 서비스 구현은 어댑터를 통해 오래 된 애플리케이션에 연결하는 새로운 프로그램 또는 래퍼이거나 여러 개의 기존 및 새 프로그램들이 조건적으로 통합된 형태가 될 수 있다. 서비스 구현 개발은 단순히 새로운 프로그래밍 시도, 순수한 레거시 래핑 및 수정, 또는 애플리케이션 통합 시도가 될 수 있다. 각각의 작업을 위해서는 서로 다른 툴과 개발 기법이 필요하다.

충분한 서비스 분리가 이루어지지 못할 경우 결과적으로 애플리케이션이 단일 체제로 된다.


개발 과정에서의 느슨한 결합에는 여러 상황에서 호출할 수 있는 프로그래밍 서비스 구현이 필요하다. 서비스 구현 소프트웨어 개발자들은 서비스의 핵이 새로운 상황에서 재사용될 수 있는가 여부라는 점을 이해해야 한다. 서비스 구현은 서비스 소비자의 기술이나 비즈니스 로직에 관한 어떤 가정도 해선 안 된다. 하지만 툴들은 이러한 요건을 강요할 수 없다. 개발자와 개발자들의 프로젝트 리더들은 서비스 구현의 분리성을 보장해야 한다. 서비스 구현 내부 설계의 분리가 제대로 이루어지지 못할 수록 서비스 재사용 비용이 비싸질 것이다. 충분한 분리가 이루어지지 못하면 SOA 툴과 미들웨어를 사용하더라도 서비스 구현의 재사용이 힘들어지며 최종 애플리케이션이 단일 체제 형태가 된다.
독립적인 서비스의 조합을 위해선 통합이 필요하다.
서비스 분리는 재사용을 가능케 하지만 복잡성이 증대된다. 독립적인 서비스는 독립적이지만 충돌 가능성이 있는 정보와 프로세스 모델을 갖게 된다. 이는 서비스의 조화 유지를 힘들게 만든다. 대부분의 경우 서비스 조합을 위해선 서비스 간 차이점을 해결하고 공통된 상황과 오류 해결을 위해 별도의(통합) 기술이 필요하다.
실시간 SOA는 동적으로 재사용할 수 있는 전사적 범위의 소프트웨어 구성 요소에서 명확하다.
실행 중에 서비스 인터페이스는 일반적으로 인터페이스 정의 파일로부터 개발 툴에 의해 생성되지만 수작업에 의해 개발되어 개발 과정에서 다른 소프트웨어에 내장되기도 하는 서비스 인터페이스 스텁과 서비스 인터페이스 프록시 등 한 쌍의 프로그램으로 유지된다.

이 스텁은
 . 서비스 구현용 서버에 배치된다.
 . 서비스 구현에 적합한 로컬 커뮤니케이션 메소드와 데이터 인코딩을 사용해 서비스 구현과

      상호 작용한다.
    . 프록시는 서비스 소비자에 로컬로 배치된다.
 . 서비스 소비자의 구현에 적합한 로컬 커뮤니케이션 메소드와 데이터 인코딩을 사용해 서비스

      소비자와 상호 작용한다.

 

일반적인 예로는 Java 서블릿으로서의 스텁과 Visual Basic 구성 요소로서의 프록시를 들 수 있다. 이 프로그램 쌍은 서비스 인터페이스를 구현한다. 모든 새로운 실시간 애플리케이션은 자체 인터페이스 프록시를 통해 서비스에 액세스하여 서비스의 비 침해적 실시간 재사용을 제공한다.

 

서비스 스텁과 서비스 프록시 커뮤니케이션에서 SOAP가 재사용될 때 서비스는 웹 서비스이다.
이론적으로 생성된 인터페이스 스텁과 프록시 모듈 쌍은 서비스 인터페이스 매개 변수를 전달하기 위해 XML, SOAP 메시지 인벨로프, HTTP, 메시지 지향 미들웨어(MOM) 또는 공유 메모리를 사용한다.
서비스 스텁과 서비스 프록시 커뮤니케이션은 "사적인 비즈니스"이지만 벤더의 형태와 툴 독립성을 유지하기 위해 대부분의 생성 툴은 표준 프로토콜을 사용해 연결을 한다. 하지만 실제로 "표준" 프로토콜은 자동적인 상호운용성을 보장할 정도의 "표준" 자격은 갖고 있지 못하다. 성능 최적화를 위해서도 덜 표준적이면서 융통성이 좋은 커뮤니케이션 프로토콜을 사용할 필요가 있다. 따라서 표준에도 불구하고 2006년까지 서비스 인터랙션을 위해 서비스 스텁 및 서비스 프록시 인코딩 구현의 조정이 필요해질 것이다(확률: 80%).


실시간에서 기술적으로 느슨한 결합은 HTTP 또는 MOM과 같이 기반이 되는 "sessionless" 커뮤니케이션에 의해 이루어진다. 이 낮은 수준의 느슨한 결합은 서비스를 논리적인 느슨한 결합으로 설계하고 개발한 경우에만 효과적이다. 그렇다면 느슨하게 결합된 미들웨어 사용은 새로운 서비스 소비자의 동적인 실시간 추가를 허용한다(즉, 기존 시스템에 사실상의 아무런 영향도 주지 않으면서 실행 중인 시스템에 새로운 사용자 경험을 추가함). 아니면 느슨하게 결합된 미들웨어가 전체 시스템을 위해 더 큰 처리 능력을 제공하겠지만 시스템의 민첩성은 높이지 못한다.
SOA의 실시간 미들웨어는 견고하게 결합된다(예: Java Reomote Method Invocation(RMI) 또는 Microsoft .NET 리모팅). 서비스 설계 및 개발이 논리적으로 느슨하게 결합되면 밀접하게 결합된 실시간 미들웨어에 관계 없이 SOA가 갖고 있는 민첩성이 실시간으로 구현된다.

 

SOA가 항상 올바른 아키텍처인 것은 아니다.
SOA는 체계적인 애플리케이션 엔지니어링에 유용하다. 특히 요청/응답이 소프트웨어 구성 요소들 간의 자연스런 관계 패턴인 환경에서는 더욱 그러하다. 하지만 SOA는 추가적인 설계 및 개발 시도를 희생함으로써 가능해지며 또한 미들웨어 결합의 필요성이 수반된다. 짧은 시간 동안 사용할 제한적 범위의 애플리케이션들은 가용 수명 기간 중에 비즈니스 로직을 재사용하거나 변경하지 않기 때문에 SOA로부터 아무런 혜택도 받지 못한다. SOA는 또한 비 동기 단방향 인터랙션을 사용하는 애플리케이션 용으로는 좋지 않다. 여기서 SOA의 느슨한 결합은 불필요하고 바람직하지도 않다.
결론: 서비스 지향 아키텍처는 요청/응답 패턴의 애플리케이션을 체계적으로 설계하는 데 있어서는 추천할 만한 아키텍처이다. SOA의 주요 목적은 비즈니스 레벨에서의 소프트웨어 모듈화 및 새로운 환경에서의 빠르면서도 비 침해적인 비즈니스 소프트웨어 재사용에 있다. 사용자들은 SOA의 정수를 이해하고 그와 동시에 장단점을 제대로 인식해 현대적인 전사적 IT의 전체 아키텍처에서 SOA가 어떤 역할을 하는지 파악해야 한다.



 

Posted by tornado
|

struts taglib 사용 --- html 태그


html 태그중에서 link 를 걸어야 할 경우가 생기게 되는데 ,
보통 struts 프로그램을 짜다보면 Controller 에서 Model 측을 접근하여
데이터를 가져온 후 해당 데이터를 Java Beans 스타일(또는 Collections) 에
저장하고, 그 객체들을 request 에 담아서 forward 시키게 된다.

jsp 페이지에서는 이러한 객체를 <html:iterate /> 태그와 같은 것들을 이용해서 사용하게 되는데
request 에 저장되어 있는 객체를 ?a=beanValue&b=beanValue 와 같이 사용할
경우에는 아래와 같은 방법으로 이용한다.

 

BoardConfigBean <-- Action 부분에서 Model 측에 접근하여 Wrapping 한
                              사용자 정의 객체이다.

request.setAttribute("BoardConfigBean", new BoardConfigBean().setIdx(1)); 처럼 저장하겠죠.

 

이렇게 저장된 객체를 JSP 에서는 아래와 같이 불러다가 씁니다.

 

<html:link page="/siteMgr/BoardConfig.do?method=delete"
                paramProperty="idx"
                paramId="idx"
                paramName="BoardConfigBean"
                scope="request">삭제</html:link>


html:link 속성 중에 paramName 이라는 속성은 특정 속성에 지정된 객체를
이름으로 지정한다.

paramId 속성은 쿼리스트링 중 key 부분에 해당한다.
paramProperty 속성은 쿼리스트링 중 value 부분에 해당하며
request 와 같은 속성에 저장된 객체의 getter 부분에 해당한다.


html:link 태그에는 map 속성을 이용할 수 있으며
Map 에 담고 그 형태를 html:link 에 넣어줄 경우 자동으로 링크를 만들어 주기도 한다.

편리한거는 자동으로 ?key=value&key1=value1 과 같이 해준다.

 

자세한 거는 struts 사이트를 뒤져주세용...  또 너무 남용하지 마세용

 

Posted by tornado
|

별건 아니지만.. 자칫 실수하면 짜증나는 문제이기에.. 적어놔야징..

 

 

# Struts 에서 Message Resource 를 여러개 설정해야할 경우 방법

 

조건)

          titleResource.properties   <-- 브라우저의 타이틀 메세지 관리

          adminResource.properties  <-- 관리 페이지의 각종 메세지 관리

          ..... 등등등

 

 

이렇게 두개가 있을 경우 먼저 web.xml 파일에 ActionServlet 등록 태그에 아래와 같이 메세지 리소스를 추가.

 

(web.xml)

 

 <!-- Struts ActionServlet -->
 <servlet>
  <servlet-name>action</servlet-name>
  <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> 
  
  <init-param>
   <param-name>adminResource</param-name>
   <param-value>conf.adminResource</param-value>
  </init-param>
  
  <init-param>
   <param-name>titleResource</param-name>
   <param-value>conf.titleResource</param-value>
  </init-param>

 

... 기타 설정들

 

 

 

(strtus-config.xml)

 

 <message-resources parameter="conf.adminResource" />
 <message-resources parameter="conf.titleResource" />

 

 

 

설정하고

<bean:message key="main.title.index" />

... 기타 필요한 메세지들.... 뿌리면 잘 되더만..

 

자세한 사항은 struts 사이트에서 참고바람

 

'JAVA > JSP_Servlet' 카테고리의 다른 글

apache + tomcat 연동시 Context 문제  (0) 2004.04.16
&lt;html:link /&gt; 태그 중에서 ^^  (0) 2004.04.07
[펌] MVC 모델과 Observer 패턴  (0) 2004.04.01
[펌] 스트럿츠 이디엄  (0) 2004.04.01
[펌] JavaServer Faces 입문  (0) 2004.04.01
Posted by tornado
|