귀하의 일정을 비워 두십시오! | |||||||||||||||||||
|
성군.story
- 개발자들의 열린 축제! 썬 테크 데이 2008 서울에 초대합니다. 2008.09.17
- [developerWorks]코리아 솔루션 페어 2008 2008.09.17
- java에서 windows registry를 컨트롤 (java.util.prefs.Preferences 를 이용) 2008.09.16
- java에서 windows registry를 컨트롤 (JNI를 이용) 2008.09.16
- 기본 웹 브라우저 경로 알아오기 2008.09.16
- Jar 자원 활용 및 JNLP API 이용 2008.09.12
- JNI (Java Native Interface) 2008.09.11
- 자바 날짜/시간 계산 예제 코드 모음 2008.09.10
- 이클립스 플러그인 메모리 모니터링 ( Status Memory Monitor ) 2008.09.09
- RIA(Rich Internet Application) 란 무엇인가? 2008.09.08
개발자들의 열린 축제! 썬 테크 데이 2008 서울에 초대합니다.
[developerWorks]코리아 솔루션 페어 2008
java에서 windows registry를 컨트롤 (java.util.prefs.Preferences 를 이용)
Access Windows Registry using 'pure' Java
(rehash of my old post since all those wonderful blog post drafts I was planning to publish are unfortunately out-dated or irrelevant)
One can use the private code of Sun's Preferences
API to access values of type REG_SZ
in the Windows Registry. Stupid hack. Maybe I should make a library out of this. I have used this soooo many times.
java.util.prefs.WindowsPreferences
is the concrete implementation of AbstractPreferences
in the Windows platform. This class provides methods like WindowsRegQueryValueEx
, etc. Using Reflection, one can use the methods in this class to query string values under HKEY_LOCAL_MACHINE
and HKEY_CURRENT_USER
Given below is a code-snippet that demonstrates how to get the
ProxyServer
setting on Windows (this is what IE uses/sets) and the Internet Explorer version
import java.lang.reflect.Method;
import java.util.prefs.Preferences;
public class JavaRegistryHack {
private static final int HKEY_CURRENT_USER = 0x80000001;
private static final int KEY_QUERY_VALUE = 1;
private static final int KEY_SET_VALUE = 2;
private static final int KEY_READ = 0x20019;
public static void main(String args[]) {
final Preferences userRoot = Preferences.userRoot();
final Preferences systemRoot = Preferences.systemRoot();
final Class clz = userRoot.getClass();
try {
final Method openKey = clz.getDeclaredMethod("openKey",
byte[].class, int.class, int.class);
openKey.setAccessible(true);
final Method closeKey = clz.getDeclaredMethod("closeKey",
int.class);
closeKey.setAccessible(true);
final Method winRegQueryValue = clz.getDeclaredMethod(
"WindowsRegQueryValueEx", int.class, byte[].class);
winRegQueryValue.setAccessible(true);
final Method winRegEnumValue = clz.getDeclaredMethod(
"WindowsRegEnumValue1", int.class, int.class, int.class);
winRegEnumValue.setAccessible(true);
final Method winRegQueryInfo = clz.getDeclaredMethod(
"WindowsRegQueryInfoKey1", int.class);
winRegQueryInfo.setAccessible(true);
byte[] valb = null;
String vals = null;
String key = null;
Integer handle = -1;
//Query Internet Settings for Proxy
key = "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings";
handle = (Integer) openKey.invoke(userRoot, toCstr(key), KEY_READ, KEY_READ);
valb = (byte[]) winRegQueryValue.invoke(userRoot, handle.intValue(),
toCstr("ProxyServer"));
vals = (valb != null ? new String(valb).trim() : null);
System.out.println("Proxy Server = " + vals);
closeKey.invoke(Preferences.userRoot(), handle);
// Query for IE version
key = "SOFTWARE\\Microsoft\\Internet Explorer";
handle = (Integer) openKey.invoke(systemRoot, toCstr(key), KEY_READ, KEY_READ);
valb = (byte[]) winRegQueryValue.invoke(systemRoot, handle, toCstr("Version"));
vals = (valb != null ? new String(valb).trim() : null);
System.out.println("Internet Explorer Version = " + vals);
closeKey.invoke(Preferences.systemRoot(), handle);
} catch (Exception e) {
e.printStackTrace();
}
}
private static byte[] toCstr(String str) {
byte[] result = new byte[str.length() + 1];
for (int i = 0; i < str.length(); i++) {
result[i] = (byte) str.charAt(i);
}
result[str.length()] = 0;
return result;
}
}
<출처 : http://lenkite.blogspot.com/2008/05/access-windows-registry-using-java.html >
java에서 windows registry를 컨트롤 (JNI를 이용)
일반적으로 시스템쪽을 컨트롤 하려면 JNI를 사용해야 되는것 같더군요.
일단 레지스트리 컨트롤 할 수 있는 라이브러리 관련 자료 정리해 봅니다.(JNI를 이용하여)
http://www.bayequities.com/tech/projects.shtml <-- 사이트가 사라진듯..안되는군요 ^^;
![사용자 삽입 이미지](http://www.anfamily.net/mcsong/attach/1/1623980449.jpg)
jRegistryKey is a Java™ Native Interface (JNI) wrapper around the Microsoft® Windows® Win32® application programming interface (API) registry functions, designed to facilitate Windows® registry access for Java™ developers. jRegistry Key User Manual
ClassPath에 포함시킬 파일들 입니다.
![](https://i1.daumcdn.net/cfs.tistory/v/0/blog/image/extension/dll.gif)
jRegistryKey.dll
예제소스입니다.
import ca.beq.util.win32.registry.*;
public class AppMain
{
public AppMain()
{
super();
}
public static void main(String[] args)
{
RegistryKey r = new RegistryKey(RootKey.HKEY_LOCAL_MACHINE, "Software\\Ncsoft\\L2Client");
String key = "workingdir";
if(r.hasValue(key))
{
RegistryValue v = r.getValue(key);
String value = v.toString();
value = value.replaceAll(v.getName()+":", "").replaceAll("REG_SZ:", "").replaceAll("REG_DWORD:", "");
System.out.println("lineage2 working dir : " + value);
RegistryValue vs = r.getValue("global_version");
System.out.println(vs.toString());
}
else
System.out.println("Not Existed Key");
}
}
레지스트리 편집기를 이용하여 값과 결과 화면을 확인해 보세요.^^
--------------------------------------------------------------------------------------------------------------------------------------
밑에 자료는 다른 패키지를 이용하는 방법이다.
Windows Registry API Native Interface
Release 3.1.3, September 11, 2003
The com.ice.jni.registry package is a Java native interface for the Windows Registry API. This allows Java program to access, modify, and export Windows Registry resources.
The com.ice.jni.registry package has been placed into the public domain. Thus, you have absolutely no licensing issues to consider. You may do anything you wish with the code. Of course, I always appreciate it when you properly credit my work.
The package will work only with Java 1.1 and greater, and uses the Javasoft native interface, not the Netscape interface. The package also includes a DLL that implements the interface. The package has been used with JDK1.2, and JDK1.3, JDK1.4, as well as JDK1.1.8.
The package includes the pre-built DLL (debug and release), source code (both the Java and the DLL's C code), as well as the compiled Java classes.
The original release was posted on November 17, 1997. The current release is 3.1.3, which was posted on September 11, 2003.
http://www.trustice.com/java/jnireg/index.shtml <-- 여기에서 다운받으면 된다.
--------------------------------------------------------------------------------------------------------------------------------------
http://sourceforge.net/projects/java-registry/ <-- 이것도 다른 패키지인듯...
기본 웹 브라우저 경로 알아오기
기본 웹 브라우저란, 기본적으로 HTML 파일등을 실행하였을 때 실행되는 프로그램이다.
단지, 브라우저에 웹 주소를 실행하기 위해서는 ShellExecute 를 이용한 간단한 코드로도 가능하지만, 이 방식은 몇가지 문제가 있다.
바로, 이미 실행되고 있는 인터넷 브라우저가 있는 경우, 이 브라우저를 사용하여 이동할수도있다는 것이다.
만약, 항상 새로운 창에 브라우저를 띄워야 한다면, 이러한 일은 매우 곤혹스러운 일이다.
그것을 해결하기 위해서 사용할 수 있는 한 방법이 바로 기본 웹 브라우저의 경로를 얻어와, 실행시키는 방법이다.
그렇다면, 기본 웹 브라우저의 정보는 어디에 저장되어 있을까?
간단히 생각해보면, 기본 웹 브라우저는 html 파일을 실행하면 동작하기 때문에, Windows 가 html 파일을 실행하고자 할 때 참조하는 ' 연결된 프로그램' 을 찾아보면 쉽게 알 수 있다.
이 연결 프로그램에 대한 정보는 HKEY_CLASSES_ROOT 에 있는데, 자세한 정보는 다음과 같다.
[HKEY_CLASSES_ROOT\htmlfile\shell\open\command]
기본값 : "E:\Program Files\Internet Explorer\iexplore.exe" -nohome
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\http\shell\open\command]
기본값 : "E:\Program Files\Internet Explorer\iexplore.exe" -nohome
이 부분의 값을 읽어서 사용하면 기본 브라우저의 경로를 얻을 수 있다.
정리
레지스트리에서 기본 웹 브라우저의 정보를 얻어오는 방법을 알아보았다.
<출처: http://www.gosu.net/GosuWeb/Article-detail.aspx?ArticleCode=1385 >
Jar 자원 활용 및 JNLP API 이용
다음은 jar화일에 묶여있는 이미지 화일로부터 Icon 객체를 생성해내는 예제이다.
Icon myIcon = new ImageIcon(loader.getResource("imgs/myImg.gif"));
이 밖에도 java.lang.ClassLoader의 getResourceAsStream(String name) 메소드를 이용하면 다양한 자원을 InputStream을 통하여 얻을 수 있다.
자바웹스타트 환경에서는 Java 2 SE API에서 제공하지 않는 추가적인 기능을 하는 API를 제공한다. 이것은 JNLP API라고 한다. JNLP API를 이용하여 개발할 경우는 jnlp.jar가 필요한데 이러한 파일은 JNLP Developer's Pack에 포함 되어 있다. 다음은 Developer's Pack을 다운로드 할 수 있는 URL이다.
JNLP API가 추가적으로 제공하는 클레스는 javax.jnlp package로 묶여 있으며 BasicService, ClipboardService, DownloadService, FileOpenService, FileSaveService, PrintService, PersistenceService 등이 있는데 이들은 ServiceManager 클레스를 통하여 사용할 수 있다. 각각의 기능은 다음과 같다.
- javax.jnlp.BasicService
BasicService는 웹스타트의 환경적인 면이나 브라우져를 통제하기 위한 API를 제공하는데 자바 애플릿의 경우 AppletContext와 비슷한 역할을 한다. 다음 예제는 웹스타트 환경에서 웹브라우져로하여금 특정 URL로 가도록 하는 것이다.
.....
BasicService bs = (BasicService)ServiceManager.lookup("javax.jnlp.BasicService");
bs.showDocument(new URL("http://www.javanuri.com"));
- javax.jnlp.ClipboardService
ClipboardService는 시스템에서 사용하는 클립보드에서 복사 객체를 가져오거나 클립보드로 복사하는 서비스를 제공한다. 자바웹스타트는 이 기능을 사용할 때 보안을 위하여 경고창을 보여준다. 다음은 간단한 스트링을 클립보드에 복사하는 예제이다.
.............
ClipboardService cs = (ClipboardService)ServiceManager.lookup("javax.jnlp.ClipboardService");
StringSelection ss = new StringSelection("Hello Web Start");
cs.setContents(ss);
- javax.jnlp.DownloadService
DownloadService는 자신의 자원을 Cache에 저장, 삭제등 Cache를 통제할 수 있는 서비스 API를 제공하는 클레스이다. 다음은 myapp.jar를 Cache에서 확인하고 있으면 삭제한후 다시 Cache에 저장하는 예제이다.
...........
DownloadServicd ds = (DownloadService)ServiceManager.lookup("javax.jnlp.DownloadService");
URL url = new URL("http://www.javanuri.com/jws/myapp.jar");
boolean isCached = ds.isResourceCached(url, "1.0");
if(isCached) {
DownloadServiceListener dsl = ds.getDefaultProgressWindow();
ds.loadResource(url, "1.0", dsl);
- javax.jnlp.FileOpenService
FileOpenService는 권한이 제약된 환경에서도 이를 사용자에게 알리고 화일을 열 수 있는 다이얼로그 윈도우를 열어주는 서비스이다. 다음 예제는 FileOpenService를 이용하여 화일을 여는 예제이다.
..............
FileOpenService fo = (FileOpenService)ServiceManager.lookup("javax.jnlp.FileOpenService");
FileContents fc = fo.openFileDialog(null, null);
- javax.jnlp.FileSaveService
FileSaveService는 권한이 제약된 환경에서도 local disk에 화일을 저장할 수 있는 기능을 제공하는 서비스 클레스이다. 이는 FileOpenService의 경우와 반대인 기능을 제공하는 클레스이다. 다음은 FileOpenService를 이용하여 화일을 연 후에 FileSaveService를 이용하여 화일을 저장하는 예제이다.
.....................
FileOpenService fo = (FileOpenService)ServiceManager.lookup("javax.jnlp.FileOpenService");
FileContents fc = fo.openFileDialog(null, null);
FileContents newfc = fss.saveFileDialog(null, null, fc.getInputStream(), "newfile.txt");
- javax.jnlp.PrintService
PrintService는 권한이 제약된 웹스타트 환경에서도 프린트를 가능하게 해주는 API 를 갖고 있는 서비스 클레스이다. 이 API를 이용하여 프린트를 요청하면 사용자에게 허가할 것인가를 묻는 다이얼로그가 나타난다. 다음은 PrintService를 이용한 프린트 요청 예제이다.
.....................
PrintService ps = (PrintService)ServiceManager.lookup("javax.jnlp.PrintService");
// default page format
PageFormat pf = ps.getDefaultPage();
// customizing page format
PageFormat npf = ps.showPageFormatDialog(pf);
ps.print(new Doc());
// printable class
- javax.jnlp.PersistenceService
PersistenceService는 브라우져의 쿠키와 마찬가지고 사용자의 클라이언트에 간단한 자료를 저장할 때 사용된다. 저장되는 형태는 url형태로 자장된다.
다음은 간단한 url을 저장하고 내용을 읽어들이는 예제이다.
.....................
PersistenceService ps = (PersistenceService)ServiceManager.lookup("javax.jnlp.PersistenceService");
String addr = "www.javanuri.com/some.txt";
java.net.URL = new URL(addr);
// create
ps.create(url, 1024);
FileContents fc = ps.get(url);
OutputStream os = fc.getOutputStream(false);
os.write(...);
// read
fc = ps.get(url);
InputStream in = fc.getInputStream();
in.read(...);
.......
- javax.jnlp.FileContents
FileContents 는 FileOpenService, FileSaveService, PersistenceService와 같은 서비스에서 input과 output을 처리할 수 있도록 만들어진 클레스이다. 일반적인 File 클레스와 비슷하게 생각하면 된다. 보안과 자료 저장 형태 등이 일반 File 클레스와는 다르다.
JNI (Java Native Interface)
1. JNI (Java Native Interface) 란 ?
- 자바가 다른 언어로 만들어진 어플리케이션과 상호 작용할 수 있는 인터페이스를 제공한다.
- 자바가상머신(JVM)이 원시 메소드(native method)를 적재(locate)하고 수행(invoke)할 수 있도록 한다
- JNI가 자바가상머신내에 포함됨으로써, 자바가상머신이 호스트 운영체제상의 입출력, 그래픽스, 네트워킹, 그리고 스레드와 같은 기능들을 작동하기 위한 로컬시스템호출(local system calls)을 수행할 수 있도록 한다.
* 쉽게 말해 Java와 다른 언어를 연동하는 솔루션입니다.
[그림1] C로 만들어진 Library와 JAVA를 연결해주는 JNI
2. Why do you need JNI ?
자바 네이티브 메쏘드(Java Native method, 이하 JNI)는 다른 언어로 작성된 코드를 자바에서 호출하도록 만들어진 규약이다. 현재는 C/C++에 대한 호출만을 정확하게 지원한다. 어떻게 보면 JNI는 자바가 만들어진 철학과 정반대되는 것이다.
그러나. Java에도 한계가 있다.
1. 속도 문제가 있는 계산 루틴
> 자바가 Native Code(플랫폼에 종속적인 기계어 코드)에 비해 느리다.
2. 자바에서 하드웨어 제어
3. 자바에서 지원되지 않은 특정 운영체제 서비스
> 자바의 클래스 라이브러리는 방대하고 다양한 서비스를 제공하지만, 특정 플랫폼에서 제공하는 고유의 서비스의 기능을 모두 포함할 수는 없다. 특히, 특수한 목적으로 제작된 하드웨어를 자바에서 제어해야 할 필요가 있다고 한다면, 자바만으로 해결하기는 힘들다.
4. 기존의 프로그램에서 자바가 제공하는 서비스를 이용
> 기존에 작성된 프로그램이나 기존의 시스템(legacy)과의 연계 문제
∴ JNI를 써서 해결해보자.
3. C를 이용한 JNI 예제
VC++을 이용해 C문법으로 작성되어 만들어진 DLL을 로딩하여 Java에서 사용해보겠습니다.
1단계 : Native Method를 선언하는 자바 클래스 작성
2단계 : 1단계에서 작성한 클래스 컴파일
3단계 : javah를 사용해서 Native Method가 사용할 헤더 파일 생성
4단계 : C언어로 Native Method 실제 구현
5단계 : C 코드와 헤더 파일을 컴파일
6단계 : 자바 프로그램 실행
1단계 : Native Method를 선언하는 자바 클래스 작성
Java 소스 파일 : HelloJni_Jsource.java
import java.util.*;
class HelloJniClass {
native void Hello();
static { System.loadLibrary("Hello_DLL"); }
public static void main(String args[]) {
HelloJniClass myJNI=new HelloJniClass();
myJNI.Hello();
}
}
// 아래는 좀 위의 내용 보충 그림
2단계 : 1단계에서 작성한 클래스 컴파일
* 컴파일시에는 일반 java 컴파일때와 마찬가지로 환경변수 셋팅이 되어 있어야 합니다.
-> Path가 JDK의 Javac.exe가 있는 폴더에 설정되어 있어야 합니다.
3단계 : javah를 사용해서 Native Method가 사용할 헤더 파일 생성
<참고: eclipse 사용시 컴파일된 클래스 파일 위치에서 javah 실행. 패키지 최상위에서
패키지명까지 명시 ex) c:\>javah com.pmguda.HelloJniClass >
HelloJniClass.h을 열어보면
JNIEXPORT void JNICALL Java_HelloJniClass_Hello (JNIEnv *, jobject);
위의 함수를 Implement만 해서 DLL을 만들면 됩니다. (4단계)
4단계 : C언어로 Native Method 실제 구현(1)
1) VC++ 프로젝트 만들기 : Win32용 DLL 프로젝트로 만듭니다.
New - Projects : Win32 Dynamic-Link Library
2) Add Files Projects : HelloJniClass.h 파일 추가
3) Projects Setings(Alt+F7)
- Link탭에 Output file Name : 1단계의 2. 라이브러리 적재시 작성한 DLL파일명(Hello_DLL.dll)
- C/C++탭 Preprocessor 카테고리의 Additional Include directories
JDK의 Include폴더와 Include폴더 밑의 win32폴더
예) C:\Program Files\Java\jdk1.5.0_03\include\,
C:\Program Files\Java\jdk1.5.0_03\include\win32
4. 값의 전달과 리턴
1단계 : Java 소스 파일 StringPass_Jsource.java
* 일반 자바 메쏘드 선언과 동일합니다.
class JNI_Message {
native byte[] Message(String input);
// 라이브러리 적재(Load the library)
static {
System.loadLibrary("Msg_DLL");
}
public static void main(String args[]) {
byte buf[];
// 클래스 인스턴스 생성(Create class instance)
JNI_Message myJNI=new JNI_Message();
// 원시 메소드에 값을 주고 받음
buf = myJNI.Message("Apple");
System.out.print(buf); // 받은값 출력
}
}
2단계 : 컴파일
javac StringPass_Jsource.java
3단계 : header파일 생성
javah JNI_Message
4단계 : method구현 : StringJNIDLLSource.c
#include <stdio.h>
#include <jni.h>
#include <string.h>
#include "JNI_Message.h"
JNIEXPORT jbyteArray JNICALL Java_JNI_1Message_Message (JNIEnv * env, jobject jobj, jstring input)
{
jbyteArray jb;
jboolean iscopy;
char* buf;
static char outputbuf[20];
buf=(*env)->GetStringUTFChars(env, input, &iscopy); // 입력 String 읽어오는 함수
printf ("\nDLL receive Data from JAVA : %s\n",buf); // 입력받은 내용을 출력
strcpy(outputbuf,"Delicious !!\n");
jb=(*env)->NewStringUTF(env, outputbuf); // 출력할 내용의 java버퍼에 output버퍼값을 셋팅
return(jb); // java버퍼 리턴
}
(*env)->함수명 형태로, JAVA의 메쏘드를 C에서 이용할수 있습니다.
* JAVA는 C로 문자열을 넘겨줄때 UTF-8형태를 사용합니다.
5단계 : 실행
C:\test\C_JNI\Paramerter Pass>java JNI_Message
DLL receive Data from JAVA : Apple
Delicious !!
5. KVM ? KNI ?
KVM은 J2ME의 일부로서 작고 자원이 한정된 기계장치를 위해 설계된 소형 JVM.
JVM에서는 JNI가 KVM의 KNI가 있다.
<출처: http://sinuk.egloos.com/2676307>
자바 날짜/시간 계산 예제 코드 모음
시스템의 밀리초 구하기.(국제표준시각(UTC, GMT) 1970/1/1/0/0/0 으로부터 경과한 시각)
// 밀리초 단위(*1000은 1초), 음수이면 이전 시각
long time = System.currentTimeMillis ( );
System.out.println ( time.toString ( ) );
현재 시각을 가져오기.
Date today = new Date ();
System.out.println ( today );
결과 : Sat Jul 12 16:03:00 GMT+01:00 2000
경과시간(초) 구하기
long time1 = System.currentTimeMillis ();
long time2 = System.currentTimeMillis ();
system.out.println ( ( time2 - time1 ) / 1000.0 );
Date를 Calendar로 맵핑하기
Date d = new Date ( );
Calendar c = Calendar.getInstance ( );
c.setTime ( d );
날짜(년/월/일/시/분/초) 구하기
import java.util.*;
import java.text.*;
SimpleDateFormat formatter = new SimpleDateFormat ( "yyyy.MM.dd HH:mm:ss", Locale.KOREA );
Date currentTime = new Date ( );
String dTime = formatter.format ( currentTime );
System.out.println ( dTime );
날짜(년/월/일/시/분/초) 구하기2
GregorianCalendar today = new GregorianCalendar ( );
int year = today.get ( today.YEAR );
int month = today.get ( today.MONTH ) + 1;
int yoil = today.get ( today.DAY_OF_MONTH );
GregorianCalendar gc = new GregorianCalendar ( );
System.out.println ( gc.get ( Calendar.YEAR ) );
System.out.println ( String.valueOf ( gc.get ( Calendar.MONTH ) + 1 ) );
System.out.println ( gc.get ( Calendar.DATE ) );
System.out.println ( gc.get ( DAY_OF_MONTH ) );
날짜(년/월/일/시/분/초) 구하기3
DateFormat df = DateFormat.getDateInstance(DateFormat.LONG, Locale.KOREA);
Calendar cal = Calendar.getInstance(Locale.KOREA);
nal = df.format(cal.getTime());
- 표준시간대를 지정하고 날짜를 가져오기.
TimeZone jst = TimeZone.getTimeZone ("JST");
Calendar cal = Calendar.getInstance ( jst ); // 주어진 시간대에 맞게 현재 시각으로 초기화된 GregorianCalender 객체를 반환.// 또는 Calendar now = Calendar.getInstance(Locale.KOREA);
System.out.println ( cal.get ( Calendar.YEAR ) + "년 " + ( cal.get ( Calendar.MONTH ) + 1 ) + "월 " + cal.get ( Calendar.DATE ) + "일 " + cal.get ( Calendar.HOUR_OF_DAY ) + "시 " +cal.get ( Calendar.MINUTE ) + "분 " + cal.get ( Calendar.SECOND ) + "초 " );
결과 : 2000년 8월 5일 16시 16분 47초
영어로된 날짜를 숫자로 바꾸기
Date myDate = new Date ( "Sun,5 Dec 1999 00:07:21" );
System.out.println ( myDate.getYear ( ) + "-" + myDate.getMonth ( ) + "-" + myDate.getDay ( ) );
"Sun, 5 Dec 1999 00:07:21"를 "1999-12-05"로 바꾸기
SimpleDateFormat formatter_one = new SimpleDateFormat ( "EEE, dd MMM yyyy hh:mm:ss",Locale.ENGLISH );
SimpleDateFormat formatter_two = new SimpleDateFormat ( "yyyy-MM-dd" );
String inString = "Sun, 5 Dec 1999 00:07:21";
ParsePosition pos = new ParsePosition ( 0 );
Date frmTime = formatter_one.parse ( inString, pos );
String outString = formatter_two.format ( frmTime );
System.out.println ( outString );
숫자 12자리를, 다시 날짜로 변환하기
Date conFromDate = new Date();
long ttl = conFromDate.parse ( "Dec 25, 1997 10:10:10" );
System.out.println ( ttl ); //예 938291839221
Date today = new Date ( ttl );
DateFormat format = DateFormat.getDateInstance ( DateFormat.FULL,Locale.US );
String formatted = format.format ( today );
System.out.println ( formatted );
특정일로부터 n일 만큼 이동한 날짜 구하기
특정일의 시간을 long형으로 읽어온다음..
날짜*24*60*60*1000 을 계산하여.
long형에 더해줍니다.
그리고 나서 Date클래스와 Calender클래스를 이용해서 날짜와 시간을 구하면 됩니다
특정일에서 일정 기간후의 날짜 구하기2
//iDay 에 입력하신 만큼 빼거나 더한 날짜를 반환 합니다.
import java.util.*;
public String getDate ( int iDay )
{
Calendar temp=Calendar.getInstance ( );
StringBuffer sbDate=new StringBuffer ( );
temp.add ( Calendar.DAY_OF_MONTH, iDay );
int nYear = temp.get ( Calendar.YEAR );
int nMonth = temp.get ( Calendar.MONTH ) + 1;
int nDay = temp.get ( Calendar.DAY_OF_MONTH );
sbDate.append ( nYear );
if ( nMonth < 10 )
sbDate.append ( "0" );
sbDate.append ( nMonth );
if ( nDay < 10 )
sbDate.append ( "0" );
sbDate.append ( nDay );
return sbDate.toString ( );
}
현재날짜에서 2달전의 날짜를 구하기
Calendar cal = Calendar.getInstance ( );//오늘 날짜를 기준으루..
cal.add ( cal.MONTH, -2 ); //2개월 전....
System.out.println ( cal.get ( cal.YEAR ) );
System.out.println ( cal.get ( cal.MONTH ) + 1 );
System.out.println ( cal.get ( cal.DATE ) );
달에 마지막 날짜 구하기
for ( int month = 1; month <= 12; month++ )
{
GregorianCalendar cld = new GregorianCalendar ( 2001, month - 1, 1 );
System.out.println ( month + "/" + cld.getActualMaximum ( Calendar.DAY_OF_MONTH ) );
}
해당하는 달의 마지막 일 구하기
GregorianCalendar today = new GregorianCalendar ( );
int maxday = today.getActualMaximum ( ( today.DAY_OF_MONTH ) );
System.out.println ( maxday );
특정일을 입력받아 해당 월의 마지막 날짜를 구하는 간단한 예제.(달은 -1 해준다.)...윤달 30일 31일 알아오기.
Calendar cal = Calendar.getInstance ( );
cal.set ( Integer.parseInt ( args[0] ), Integer.parseInt ( args [1] ) - 1, Integer.parseInt ( args [2] ) );
SimpleDateFormat dFormat = new SimpleDateFormat ( "yyyy-MM-dd" );
System.out.println ( "입력 날짜 " + dFormat.format ( cal.getTime ( ) ) );
System.out.println ( "해당 월의 마지막 일자 : " + cal.getActualMaximum ( Calendar.DATE ) );
해당월의 실제 날짜수 구하기 ( 1999년 1월달의 실제 날짜수를 구하기 )
Calendar calendar = Calendar.getInstance ( );
calendar.set ( 1999, 0, 1 );
int maxDays = calendar.getActualMaximum ( Calendar.DAY_OF_MONTH );
어제 날짜 구하기
오늘날짜를 초단위로 구해서 하루분을 빼주고 다시
셋팅해주면 쉽게 구할수 있죠..
setTime((기준일부터 오늘까지의 초를 구함) - 24*60*60)해주면 되겠죠..
어제 날짜 구하기2
import java.util.*;
public static Date getYesterday ( Date today )
{
if ( today == null )
throw new IllegalStateException ( "today is null" );
Date yesterday = new Date ( );
yesterday.setTime ( today.getTime ( ) - ( (long) 1000 * 60 * 60 * 24 ) );
return yesterday;
}
내일 날짜 구하기
Date today = new Date ( );
Date tomorrow = new Date ( today.getTime ( ) + (long) ( 1000 * 60 * 60 * 24 ) );
내일 날짜 구하기2
Calendar today = Calendar.getInstance ( );
today.add ( Calendar.DATE, 1 );
Date tomorrow = today.getTime ( );
오늘날짜에서 5일 이후 날짜를 구하기
Calendar cCal = Calendar.getInstance();
c.add(Calendar.DATE, 5);
날짜에 해당하는 요일 구하기
//DAY_OF_WEEK리턴값이 일요일(1), 월요일(2), 화요일(3) ~~ 토요일(7)을 반환합니다.
//아래 소스는 JSP일부입니다.
import java.util.*;
Calendar cal= Calendar.getInstance ( );
int day_of_week = cal.get ( Calendar.DAY_OF_WEEK );
if ( day_of_week == 1 )
m_week="일요일";
else if ( day_of_week == 2 )
m_week="월요일";
else if ( day_of_week == 3 )
m_week="화요일";
else if ( day_of_week == 4 )
m_week="수요일";
else if ( day_of_week == 5 )
m_week="목요일";
else if ( day_of_week == 6 )
m_week="금요일";
else if ( day_of_week == 7 )
m_week="토요일";
콤보박스로 선택된 날짜(예:20001023)를 통해 요일을 영문으로 가져오기
//gc.get(gc.DAY_OF_WEEK); 하면 일요일=1, 월요일=2, ..., 토요일=7이 나오니까,
//요일을 배열로 만들어서 뽑아내면 되겠죠.
GregorianCalendar gc=new GregorianCalendar ( 2000, 10 - 1 , 23 );
String [] dayOfWeek = { "", "Sun", "Mon", .... , "Sat" };
String yo_il = dayOfWeek ( gc.get ( gc.DAY_OF_WEEK ) );
두 날짜의 차이를 일수로 구하기
각각의 날짜를 Date형으로 만들어서 getTime()하면
long으로 값이 나오거든요(1970년 1월 1일 이후-맞던가?- 1/1000 초 단위로..)
그러면 이값의 차를 구해서요. (1000*60*60*24)로 나누어 보면 되겠죠.
두 날짜의 차이를 일수로 구하기2
import java.io.*;
import java.util.*;
Date today = new Date ( );
Calendar cal = Calendar.getInstance ( );
cal.setTime ( today );// 오늘로 설정.
Calendar cal2 = Calendar.getInstance ( );
cal2.set ( 2000, 3, 12 ); // 기준일로 설정. month의 경우 해당월수-1을 해줍니다.
int count = 0;
while ( !cal2.after ( cal ) )
{
count++;
cal2.add ( Calendar.DATE, 1 ); // 다음날로 바뀜
System.out.println ( cal2.get ( Calendar.YEAR ) + "년 " + ( cal2.get ( Calendar.MONTH ) + 1 ) + "월 " + cal2.get ( Calendar.DATE ) + "일" );
}
System.out.println ( "기준일로부터 " + count + "일이 지났습니다." );
두 날짜의 차이를 일수로 구하기3
import java.io.*;
import java.util.*;
public class DateDiff
{
public static int GetDifferenceOfDate ( int nYear1, int nMonth1, int nDate1, int nYear2, int nMonth2, int nDate2 )
{
Calendar cal = Calendar.getInstance ( );
int nTotalDate1 = 0, nTotalDate2 = 0, nDiffOfYear = 0, nDiffOfDay = 0;
if ( nYear1 > nYear2 )
{
for ( int i = nYear2; i < nYear1; i++ )
{
cal.set ( i, 12, 0 );
nDiffOfYear += cal.get ( Calendar.DAY_OF_YEAR );
}
nTotalDate1 += nDiffOfYear;
}
else if ( nYear1 < nYear2 )
{
for ( int i = nYear1; i < nYear2; i++ )
{
cal.set ( i, 12, 0 );
nDiffOfYear += cal.get ( Calendar.DAY_OF_YEAR );
}
nTotalDate2 += nDiffOfYear;
}
cal.set ( nYear1, nMonth1-1, nDate1 );
nDiffOfDay = cal.get ( Calendar.DAY_OF_YEAR );
nTotalDate1 += nDiffOfDay;
cal.set ( nYear2, nMonth2-1, nDate2 );
nDiffOfDay = cal.get ( Calendar.DAY_OF_YEAR );
nTotalDate2 += nDiffOfDay;
return nTotalDate1-nTotalDate2;
}
public static void main ( String args[] )
{
System.out.println ( "" + GetDifferenceOfDate (2000, 6, 15, 1999, 8, 23 ) );
}
}
파일에서 날짜정보를 가져오기
File f = new File ( directory, file );
Date date = new Date ( f.lastModified ( ) );
Calendar cal = Calendar.getInstance ( );
cal.setTime ( date );
System.out.println("Year : " + cal.get(Calendar.YEAR));
System.out.println("Month : " + (cal.get(Calendar.MONTH) + 1));
System.out.println("Day : " + cal.get(Calendar.DAY_OF_MONTH));
System.out.println("Hours : " + cal.get(Calendar.HOUR_OF_DAY));
System.out.println("Minutes : " + cal.get(Calendar.MINUTE));
System.out.println("Second : " + cal.get(Calendar.SECOND));
날짜형식으로 2000-01-03으로 처음에 인식을 시킨후
7일씩 증가해서 1년정도의 날짜를 출력해 주고 싶은데요.
SimpleDateFormat sdf = new SimpleDateFormat ( "yyyy-mm-dd" );
Calendar c = Calendar.getInstance ( );
for ( int i = 0; i < 48; i++ )
{
c.clear ( );
c.set ( 2000, 1, 3 - ( i * 7 ) );
java.util.Date d = c.getTime ( );
String thedate = sdf.format ( d );
System.out.println ( thedate );
}
쓰레드에서 날짜 바꾸면 죽는 문제
Main화면에 날짜와시간이Display되는 JPanel이 있습니다.
date로 날짜와 시간을 변경하면 Main화면의 날짜와 시간이 Display되는 Panel에
변경된 날짜가 Display되지 않고 Main화면이 종료되어 버립니다.
문제소스:
public void run ( )
{
while ( true )
{
try{
timer.sleep ( 60000 );
}
catch ( InterruptedException ex ) { }
lblTimeDate.setText ( fGetDateTime ( ) );
repaint ( );
}
}
public String fGetDateTime ( )
{
final int millisPerHour = 60 * 60 * 1000;
String DATE_FORMAT = "yyyy / MM / dd HH:mm";
SimpleDateFormat sdf = new SimpleDateFormat ( DATE_FORMAT );
SimpleTimeZone timeZone = new SimpleTimeZone ( 9 * millisPerHour, "KST" );
sdf.setTimeZone ( timeZone );
long time = System.currentTimeMillis ( );
Date date = new Date ( time );
return sdf.format ( date );
}
해답:
// 날짜와 요일 구한다. timezone 으로 날짜를 다시 셋팅하시면 됨니다.
public String getDate ( )
{
Date now = new Date ( );
SimpleDateFormat sdf4 = new SimpleDateFormat ( "yyyy/MM/dd HH:mm EE" );
sdf4.setTimeZone ( TimeZone.getTimeZone ( "Asia/Seoul" ) );
return sdf4.format ( now );
}
날짜와 시간이 유효한지 검사하려면...?
import java.util.*;
import java.text.*;
public class DateCheck
{
boolean dateValidity = true;
DateCheck ( String dt )
{
try
{
DateFormat df = DateFormat.getDateInstance ( DateFormat.SHORT );
df.setLenient ( false );
Date dt2 = df.parse ( dt );
}
catch ( ParseException e ) { this.dateValidity = false; }
catch ( IllegalArgumentException e ) { this.dateValidity = false; }
}
public boolean datevalid ( )
{
return dateValidity;
}
public static void main ( String args [] )
{
DateCheck dc = new DateCheck ( "2001-02-28" );
System.out.println ( " 유효한 날짜 : " + dc.datevalid ( ) );
}
}
두 날짜 비교하기(아래보다 정확)
그냥 날짜 두개를 long(밀리 세컨드)형으로 비교하시면 됩니다...
이전의 데이타가 date형으로 되어 있다면, 이걸 long형으로 변환하고.
현재 날짜(시간)은 System.currentTimeMillis()메소드로 읽어들이고,
두수(long형)를 연산하여 그 결과 값으로 비교를 하시면 됩니다.
만약 그 결과값이 몇시간 혹은 며칠차이가 있는지를 계산할려면,
결과값을 Calender의 setTimeInMillis(long millis) 메소드를 이용해
설정한다음 각각의 날짜나 시간을 읽어오시면 됩니다
두 날짜 비교하기2
//Calendar를 쓸 경우 데이타의 원본을 고치기 때문에 clone()을 사용하여
//복사한 후에 그 복사본을 가지고 비교한다
import java.util.*;
import java.util.Calendar.*;
import java.text.SimpleDateFormat;
public class DayComparisonTest
{
public static void main(String args[])
{
Calendar cal = Calendar.getInstance();
SimpleDateFormat dateForm = new SimpleDateFormat("yyyy-MM-dd");
Calendar aDate = Calendar.getInstance(); // 비교하고자 하는 임의의 날짜
aDate.set(2001, 0, 1);
Calendar bDate = Calendar.getInstance(); // 이것이 시스템의 날짜
// 여기에 시,분,초를 0으로 세팅해야 before, after를 제대로 비교함
aDate.set( Calendar.HOUR_OF_DAY, 0 );
aDate.set( Calendar.MINUTE, 0 );
aDate.set( Calendar.SECOND, 0 );
aDate.set( Calendar.MILLISECOND, 0 );
bDate.set( Calendar.HOUR_OF_DAY, 0 );
bDate.set( Calendar.MINUTE, 0 );
bDate.set( Calendar.SECOND, 0 );
bDate.set( Calendar.MILLISECOND, 0 );
if (aDate.after(bDate)) // aDate가 bDate보다 클 경우 출력
System.out.println("시스템 날짜보다 뒤일 경우 aDate = " + dateForm.format(aDate.getTime()));
else if (aDate.before(bDate)) // aDate가 bDate보다 작을 경우 출력
System.out.println("시스템 날짜보다 앞일 경우 aDate = " + dateForm.format(aDate.getTime()));
else // aDate = bDate인 경우
System.out.println("같은 날이구만");
}
}
<출처 : 서비의 다락방 ( http://www.yunsobi.com )>
-출처를 밝혀주신 당신은 아름다운 사람입니다.-
이클립스 플러그인 메모리 모니터링 ( Status Memory Monitor )
이클립스 플러그인 중에 메모리 상태를 보여주는 플러그인입니다.
사용시에 좀 느리다 싶으시면 강제로 가비지컬렉션 버튼을 과감히 클릭하세요 ㅎㅎ
자세한 내용은 참조 하시길.. 프리웨어이니 맘껏 사용해도 됩니다..ㅋ
http://www.kyrsoft.com/downloads/downloads.html
위 링크가시면 그외 다른 플러그인 좋은게 많이 있네요..
![]() ![]() ![]() |
![]() |
![](http://www.kyrsoft.com/screenshots/stmemmon5.gif)
RIA(Rich Internet Application) 란 무엇인가?
웹2.0이 인터넷 기술의 새로운 이슈로 등장하고 있다. 웹2.0과 관련된 여러 기술들 중RIA는 웹2.0을 완성하기 위한 사용자와의 접점으로서 많은 주목을 받고 있다.
백문이 불여일견! 우선RIA로 구현된 사이트를 간단히 살펴보도록 하자.
RIA가 적용된 첫 번째 사례는2002년 TravelClick(http://www.travelclick.net)에 의해 제작된 BroadMoor 호텔(http://www.broadmoor.com)의OneScreen이라는 예약 시스템이다.
![](http://pds5.egloos.com/pds/200709/03/98/d0043398_46db5e6a69aa2.jpg)
[브로드무어 호텔의 OneScreen 예약 시스템]
플래시와 콜드퓨전(CFML)로 만들어진 이 시스템은 기존의 5단계 페이지를 거쳐서 진행되었던 예약 업무를 플래시의 화려한 그래픽 사용자 인터페이스를 이용하여 한 페이지로 구현한 것이었다. 이것은 그 당시까지의 여러 페이지를 거쳐 시스템을 구현하던 웹 사용자 인터페이스의 새로운 전환을 가져오게 한 사건이었다.
국내 사례를 한번 살펴보자. Adobe의 플래시(Flash)를 이용하여 구현된 CGV 영화관(http://www.cgv.co.kr)의 예매 서비스로 페이지의 전환 없이 한 페이지에서 영화 정보 확인 및 예매를 할 수 있다.
![](http://pds5.egloos.com/pds/200709/03/98/d0043398_46db5ea7e55c9.jpg)
[CGV 극장 영화 예매 시스템]
사용자 인터페이스의 향상과 더불어 사용의 편리성까지 제공할 수 있는 것이 바로 RIA의 가장 강력한 힘인 것이다.
RIA를 구현하려면
RIA를 구현하기 위해 다양한 웹 브라우저에서 동작하면서 개발자의 편의를 제공하려는 시도는 여러 업체들에 의해 지금도 계속 중이다. RIA를 구현할 수 있는 기술들을 살펴보면 다음과 같다.
l AJAX/DHTML: 자바 스크립트와 XML을 이용한 비동기 호출을 사용하는 방식으로 웹 2.0에서 많은 주목을 받고 있는 기술의 조합이다. 현재 많은 업체에 의해 AJAX를 쉽게 개발할 수 있도록 툴 킷들이 공개되고 있다.
l 플래시(Flash): Adobe(이전 Macromedia)의 대표적인 벡터 방식의 그래픽 환경으로 현재 대부분의 브라우저에서 동작한다. 화려한 사용자 인터페이스를 구현하고, 액션스크립트(ActionScript)를 이용하여 비즈니스 로직을 구성할 수 있다.
l 플렉스(Flex): Adobe가 소개한 엔터프라이즈 개발을 위한 플랫폼으로 플래시의 SWF로 그 결과물을 출력하나 플래시와는 완전히 다른 새로운 기술이다.
l 오픈라즐로(OpenLaszlo): Laszlo System에 의해 시작된 오픈소스 플랫폼으로 RIA 구현을 위해 사용할 수 있으며, LZX라는 새로운 인터페이스 언어를 사용한다. 그 결과물은 플래시 플레이어에서 동작하는 SWF 파일로 출력된다.
l WPF: Microsoft에서 새롭게 소개하는 차세대 벡터 방식의 그래픽 환경으로WPF/E를 활용하여 RIA를 구현할 수 있으며, XAML과 Jscript의 기반한 프로그래밍 모델을 가진다.
l XUL: XML 기반의 사용자 인터페이스 마크업 언어(User Interface Markup Language)로 모질라(Mozilla) 기반의 웹 브라우저에서 HTML/XHTML을 대신하여 사용할 수 있다.
l 액티브X(ActiveX): 윈도우 응용 프로그램을 웹 페이지상에 실행할 수 있는 기술로 마이크로소프트에 의해 소개되었다. 인터넷 익스플로러(IE)에만 동작하는 단점을 가지고 있다. 또한 다른 방식의 RIA 구현과는 다르게 일반적으로 클라이언트에 설치되어 실행하기 위해서는 공인 인증서를 발급(유료)받아야 하는 번거로움이 있다. 물론 브라우저 설정에 따라 이런 과정 없이 설치 및 실행할 수 있으나 클라이언트의 자원을 제어할 수 있는 보안의 취약성이 큰 문제를 발생하기도 한다.
l 스마트클라이언트(SmartClient): Microsoft의 닷넷(.NET) 기반의 윈도우 프로그램을 웹 상에서 실행할 수 있는 기술이다. 보안설정과 클라이언트에 닷넷 프레임워크의 설치가 필수이다.
l 자바 애플릿(Java applet): 자바 응용 프로그램을 웹 페이지 상에서 실행할 수 있는 기술로 오래 전부터 사용되었다. 다양한 클라이언트의 제어를 할 수 있는 장점에도 불구하고, 느린 속도와 대체 가능한 기술들에 의해 그 사용이 점점 줄어들고 있는 상황이다.
l 자바 응용프로그램(Java application): 자바 웹 스타트(Java Web Start)는 자바 응용 프로그램 자체를 웹을 통해 클라이언트에서 실행할 수 있도록 허용한다. 웹을 통해 자바 응용 프로그램을 실행하는 방식으로 RIA를 구현할 수 있다.
이들 중 현재 주류를 이루는 RIA 기술로는 HTML 기반의 RIA 구현에 주로 사용하고 있는 AJAX/DHTML과 화려한 사용자 인터페이스를 구현할 수 있는 플래시가 있다. 새로운 RIA 시장을 선도하기 위해 경쟁적으로 펼치고 있는 새로운 개발 툴의 출시는 정말 흥미진진하게 보인다. 어떤 RIA 기술이 일반 사용자들에게 매력을 줄 것인지, 어떤 개발 툴이 가장 많이 선택 받을지 관심을 가지고 지켜보도록 하자.
RIA(Rich Internet Application)란?
Rich Internet Application(RIA)이란 전통적인 데스크톱 응용 프로그램의 특징과 기능을 가지는 웹 응용 프로그램이다. 웹 응용 프로그램의 많은 장점에도 불구하고 웹 초창기부터 서버/클라이언트 환경의 윈도우 프로그램에 비해 사용자 인터페이스가 부족하다고 지적되어왔다. 이런 단점을 극복하기 위해 Macromedia(현재 Adobe)는 2002년 리치 인터넷 애플리케이션(RIA)을 처음으로 소개하였다.
RIA를 한 마디로 표현한다면 ‘한 페이지로 구현된 웹 응용 프로그램’이라 할 수 있다. 실제 많은 비즈니스 로직이 존재하지만 사용자는 한 페이지를 이용하여 모든 기능을 이용하게 된다. 일반적인 웹 페이지의 페이지 이동과 새로 고침의 깜박임 없이 모든 내용의 확인과 기능을 이용할 수 있는 RIA. 매력적이지 않은가?
왜 RIA인가?
그러면 RIA를 왜 사용하는 것일까? 그 첫 번째로 우리는 웹 응용 프로그램이 가지는 한계점에 대해서 먼저 이해해야 한다. 전통적인 웹 응용 프로그램의 모델은 서버를 중심으로 모든 처리가 수행되고, 사용자의 웹 브라우저를 통해 그 결과를 출력하는 구조로 이루어진다. 우리는 이를 씬 클라이언트(thin client)라 부른다. 즉 클라이언트는 단순히 결과의 디스플레이에만 사용하는 것이다. 그렇기 때문에 서버에서 많은 작업 프로세스가 있는 경우 사용자는 결과가 처리될 때 무작정 기다려야만 하고, 서버의 처리시간이 길어지는 경우 서버와의 통신이 끊어져 더 이상 프로그램을 이용할 수 없는 상황이 발생할 수 있다. 이런 단점을 보안하고, 사용자 인터페이스를 향상하기 위한 시도가 바로 RIA인 것이다.
그렇다면 RIA를 사용하여 얻을 수 있는 장점이 과연 무엇일까?
대표적으로 리치(rich)한 클라이언트 사용자 인터페이스 제공이 있다. RIA 방식으로 구현하면 사용자에게 HTML 위젯(widget)을 사용하는 효과 이상의 보다 그래픽적인 사용자 인터페이스를 공급할 수 있다. 예를 들어, 웹 페이지에서 드래그 & 드롭(drag & drop)이 가능하고, 슬라이드 바를 이용하여 데이터 변경이 가능하게 된다. 또한 클라이언트에 비즈니스 로직 부분을 구현하여 복잡한 계산을 서버가 아닌 클라이언트에서 수행할 수 있다. 그렇기 때문에 일반적으로 보다 향상된 서버의 응답을 구현.할 수 있는 것이다.
이처럼 RIA를 사용하면 사용자 인터페이스의 향상뿐만 아니라 성능 향상의 장점을 가질 수 있다. 즉 RIA에서는 서버와 클라이언트 사이의 부하의 분산이 가능하게 되어 서버의 성능 향상에 도움을 주는 것이다. 또한 비동기 통신(asynchronous communication)을 이용하여 사용자에게 보다 빠른 응답속도를 보이는 것처럼 구현할 수 있다. 사용자가 클릭 하였을 때 그 결과를 미리 비동기 통신으로 저장한 뒤 바로 보여줄 수 있으므로 사용자가 느끼는 체감 속도는 상당히 빨라지고, 서버의 응답 이전에 다른 작업을 수행할 수 있다. 이는 구글 맵(Google Maps)에서 쉽게 확인할 수 있는 방식으로 사용자가 지도를 드래그하면 바로 처리가 되는 것을 확인할 수 있다.
![](http://pds3.egloos.com/pds/200709/03/98/d0043398_46db5ec0cd35e.jpg)
[구글 맵 서비스 (http://maps.google.com)]
마지막으로 네트워크 효율성이 있다. 전통적인 웹 응용 프로그램의 방식은 새로운 결과를 표현하기 위해 전체 페이지의 정보를 전달하고 그 결과를 클라이언트에 다시 보여준다. 하지만 RIA 방식을 이용하면 해당 페이지에서 실제 필요한 일부분의 데이터만 서버로 전달하고, 그 결과를 클라이언트 페이지의 일부 영역에 반영할 수 있기 때문에 네트워크 자원의 사용량도 감소하는 것이다.
더불어 RIA 방식은 초기 프로그램 구동에 시간이 소요된다는 단점이 있지만, 반면에 프로그램 설치가 필요 없다는 장점을 갖고 있다. 그렇기 때문에 사용자들은 어디에서나 쉽게 사용할 수 있고, 프로그램의 버전이 올라가더라도 쉽게 배포할 수 있는 것이다.
이처럼 RIA는 사용자 인터페이스 개선 및 성능 향상이라는 두 마리의 토끼를 잡을 수 있는 현재 진행형의 기술이다. 물론 개발의 난이도가 높아지는 문제가 있지만 사용자들은 이런 개발자들의 고충은 모른다. 자신들이 사용하기 쉽고, 매력적인 프로그램을 선택할 것은 뻔한 이야기라는 것이다.
-------------------------------------------------------------------------------------------------------
RIA의 역사
RIA는 2002년 Macromedia에 의해 소개되었지만 개념적으로 유사한 내용들은 이전에도 있었다. 1998년 Microsoft는 Remote Scripting을 소개하였고, 2000년 Forrester Research는 X Internet을 소개하였다. 더불어 리치 클라이언트, 리치 웹 클라이언트 또한 RIA와 유사한 기술적인 분류로 이야기할 수 있다.
그러던 중 2002년에야 비로서 RIA의 실제 적용사례가 소개된다. 앞서 이야기한 플래시와 콜드퓨전(CFML)을 이용한 TravelClick의 Broadmoor 호텔의 OneScreen이라는 예약 시스템이었다.
2004년에는 Macromedia는 플렉스를 엔터프라이즈 개발자를 위한 새로운 플랫폼으로 소개하였다. 기존 플래시가 가졌던 단점을 해결하고 새로운 RIA 개발 환경을 위해 새로운 서버 제품으로 출시하였다. 현재 2.0 버전까지 출시되었으며, 국내외 여러 적용 사례들이 있다.
이러던 중 RIA는 2005년 구글에 의해 사용자들에게 강렬한 인상을 남기게 된다. 바로 구글 맵(http://maps.google.com/) 서비스를 통해 웹 지도에서 드래그, 줌 인/줌 아웃이 구현하였고, 부드러운 화면 전환 및 스크롤을 제공하였다. 이는 마치 윈도우 프로그램을 사용하고 있다는 착각을 가지게 한 아주 충격적인 사건이었다.
이후 웹 2.0에 대한 소개와 실제 구현 사례들을 통해 RIA는 웹 비즈니스의 중요한 요소로 성장하였다. ‘사용자의 눈을 만족시키지 못하는 서비스는 성공하기 힘들다’는 이야기처럼 지금도 사용자들에게 새로운 모습을 보여주기 위하여 여러 웹 사이트들이 RIA를 채택하고 발전을 위한 노력을 계속하고 있는 것이다.
-------------------------------------------------------------------------------------------------------
도스 환경에서 윈도우 프로그램을 처음 사용하였을 때의 GUI 변화에 대한 충격을 기억하는가? 내년에는 윈도우 XP에서 윈도우 Vista로의 새로운 GUI 환경 변화가 우리를 기다리고 있다. 또 얼마나 많은 충격과 변화가 일어날지 아직까지는 느낄 수 없을 것이다. 하지만 분명 변화는 이미 시작되었다는 것이다.
사용자에게 보다 멋진 GUI 환경을 제공하려는 시도는 운영체제, 웹의 구분 없이 계속 될 것이다. 이와 함께 사용자 경험에 아주 밀접한 관계가 있는 RIA는 향후 웹 비즈니스 구현에 가장 중요한 기술로 거듭 자리매김을 할 것이다. 지금의 RIA는 과도기의 모습이다. AJAX와 같은 기술은 잠시 스쳐 지나가는 하나의 흐름일 뿐이다. 앞으로 웹 환경은 벡터 그래픽 환경이 기본이 되고, 3D를 이용한 실제 체험이 가능한 모습으로 변화할 것으로 필자는 확신한다. 쇼핑몰을 이용하면서 자기의 3D 캐릭터에 직접 옷을 입혀본 뒤 제품 구매를 선택하고, 다양한 각도에서 실제 물건 보듯이 살펴볼 수 있는 서비스가 바로 눈앞에 있는 것이다. 여러분들은 RIA와 웹의 미래 모습이 어떨 것이라 생각하는가?
출처: 스마트플레이스