Programming/Java2011. 5. 10. 23:49

마샬링(Marshalling): 직렬화(Serialize)하는 작업을 마샬링 이라 한다. 데이터를 특정 통신 채널로 보낼 수 있는 형태로 바꾸어 준다.
 

언마샬링(Unmarshaling): 역직렬화(Deserialize)하는 작업을 언마샬링 이라 한다. 변환된 데이터를 읽어 들여 원래의 형태로 변환한다.
 

스텁(Stub): 클라이언트 프로그램에서 원격 객체가 마치 로컬에 있는 것 처럼 보이도록 해준다. 즉, proxy 역할을 하는 작은 객체로 마샬링과 언마샬링 작업을 한다.
 

스켈레톤(Skeletion): 스텁과 반대로 서버 프로그램에서 스텁에서 보낸 데이터를 언마샬링해 해석하고 결과 데이터를 마샬링해서 클라이언트로 보낸다.

  - 스텁과 스켈레톤의 더 자세한 사항 다음 블러그를 참조: http://cafe.naver.com/q69/116975 -

참고: Serialize와 Synchronize는 전혀 다른 개념이다. Synchronize는 스레드에서 동기화 문제때 사용된다.

Posted by Brian B. Lee
Programming/OSGi2011. 4. 12. 21:09
지난 SpringDM for OSGi Service에 서비스를 동적으로 관리하기 위한 추가 옵션이다.
SpringDM for OSGi Service <= Trackback 참조

<osgi:reference id="아이디입력" interface="인터페이스 입력">
<osgi:listener ref="서비스 추가시 컨트롤 하고 싶은 Bean의 아이디 입력" bind-method="서비스 추가시 컨트롤할 메서드명 입력" unbind-method="서비스 삭제시 컨트롤할 메서드명 입력" />
</osgi:reference>

위와 같이 서비스를 Bean으로 가져올 때 리스너를 추가해 주면 위에서 저장한 인터페이스의 서비스가 등록될 때
bind-method에 입력한 메서드가 동작하고  삭제 될 때 unbind-method에 입력한 메서드가 동작한다.
ref에 입력한 Bean 클래스에는 두 메서드를 추가해 주어야 하는데 다음과 같은 타입중 하나로 선언되어야한다.

public void 메서드명(ServiceType service, Map serviceProps);
public void 메서드명(ServiceType service, Dictionary serviceProps);
public void 메서드명(ServiceReference ref); 

참조: osgi:reference 뿐 아니라 osgi:set 이나 osgi:list에도 적용 가능하다.

다음 예를 보면 좀 더 이해가 편할 것이다. 
 
 <osgi:list id="Svcs" interface="kr.brian.api.Apis" cardinality="0..N">
<osgi:listener ref="svcsbean" bind-method="addSvcListener" unbind-method="removeSvcListener" />  
</osgi:list>
<bean id="svcsbean"
class="kr.brian.SvcListener">
</bean>

위와 같이 정의하고 클래스 kr.brain.SvcListener에 메서드 addSycListener와 removeSvcListener를 만들면 된다.
이때 주의할 점은 위에서 언급한 세가지 타입중 하나를 선택하여 파라미터를 정의해야 한다는 것이다. 
다음과 같이...

public void addSycListener(Apis service, Map serviceProps);
public void removeSvcListener(Apis service, Map serviceProps);


Posted by Brian B. Lee
Programming/Java2011. 3. 15. 09:55
String str = 'RTF 값';
  
byte[] bytes = null;
bytes = str.getBytes();
InputStream is = new ByteArrayInputStream(bytes);   
   
try {
//   rtf 파일의 경우
//   FileInputStream is = new FileInputStream("a.rtf");
RTFEditorKit kit = new RTFEditorKit();
Document doc = kit.createDefaultDocument();
kit.read(is, doc, 0);
String plainText = doc.getText(0, doc.getLength());
System.out.println("text:" + new String(plainText.getBytes("8859_1"),"KSC5601"));
} catch (Exception e) {
// TODO: handle exception
}

참고: DB에서의 한글 charset 변환

DB 입출력 기능을 하는 부분을 다음과 같은 형식으로 수정해 주면 됩니다.

ISO8859 인 DB에 한글을 넣을 땐 다음과 같은 코드를 사용합니다.

String str = "한글";

String result = new String(str.getBytes("KSC5601"),"8859_1") ;

DB에서 받아올 땐 앞 뒤의 charset을 표현하는 문자열의 위치를 바꾸면 됩니다.

String str = rs.getString();

String result = new String(str.getBytes("8859_1"),"KSC5601") ;

Posted by Brian B. Lee
Programming/OSGi2011. 2. 8. 11:24

일반 JAR 파일을 번들내에서만 사용 할 수 있는 방법에 대해 알아보자

1. 일단 JAR파일을 Workspace내의 폴더(New>folder=>lib)안에 넣는다.
2. Manifest 파일에 Bundle-Classpath에 저장 경로를 명시해 준다.
   ex)
   Manifest-Version : 1.0
   ...
   Bundle-Classpath: .,
     lib/log4j-1.2.15.jar
   위에서  주의 할 점은 기본 값의 첫 줄에 .,(번들 루트폴더)를 잡아주는 것이 중요하다.
3. 마지막으로 번들 Export를 위해 build.properties 파일에도 경로를 설정해 준다.
    ex)
   source.. = src/
   output..  = bin/
   bin.includes = META-INF/,\
                        .,\
                        lib/log4j-1.2.15.jar,\
                        log4j.properties
Posted by Brian B. Lee

코딩할 때 필요한 단축키
Ctrl + Space => 자동 완성 목록
F3 => 정의 부분으로 이동
Alt + 왼쪽키 => 브라우저의 Back
Alt + 오른쪽키 => 브라우저의 Forward키
Ctrl + F => 단어 찾기
Ctrl + Shift + / => /* */ 여러줄 주석달기
Ctrl + Shift + \ => /* */ 여러줄 주석풀기
Ctrl + / => // 한줄 주석달기
Alt + Shift + x, j => java application 실행 (x까지 누르면 그 이후 실행가능한 더 많은 옵션 나옴)

화면 보기에서 편하게 보기 위한 방법
Breadcrumb(해당 클래스나 파일 위치 전체 표시) => Alt + Shift + B
단축 없다 => Mark Occurrences(변수나 메서드 한꺼번에 하이라이트)

Posted by Brian B. Lee
Programming/OSGi2010. 12. 6. 11:20

Apache Felix Gogo 콘솔 확장하기

1. Felix Gogo

             Felix Gogo Apache에서 나온 OSGi framework를 위한 진보한 shell이다

2. 인터페이스

             Felix Gogo Console을 사용하기 위해 다음의 인터페이스를 구현하여 OSGi 서비스로 등록해야 한다. (서비스 등록방법은 지난 포스팅 참조) 하지만 인터페이스를 구현 한다고 해서 이 모든 메서드를 구현해 줄 필요는 없다. 자신이 원하는 메서드는 따로 만들어서 서비스 등록할 때 프로퍼티 파일에 참조해 주기만 하면 되기 때문이다.

public interface org.apache.felix.service.command.CommandSession {

Object execute(CharSequence commandline) throws Exception;

Object get(String name);

void put(String name, Object value);

    ...

}


Felix Gogo를 사요하기 위해 Maven에서 다음의 dependency를 추가해 줘야 한다.


            <dependency>

                      <groupId>org.apache.felix</groupId>

                      <artifactId>org.apache.felix.gogo.command</artifactId>

                      <version>0.6.0</version>

           </dependency>


 

3. 서비스 등록

             3-1. Console에서 실행할 메서드 구현

                          public class TestConsole implements CommandSession {

                                       public void test1(String x) {

                                                     System.out.println(x);

                                       }

                                       public void test2(String y) {

                                                     System.out.println(y);

                                       }

 

                                       //CommandSession를 구현하는 메서드

                                       @Override

                                       public Object execute(CharSequence arg0) throws Exception {

                                                    // TODO Auto-generated method stub

                                                     return null;

                                       }

                                       ….

                          }

             3-2. 서비스 등록

                          Dictionary<String, Object> dict = new Hashtable<String, Object>();

                           dict.put(CommandProcessor.COMMAND_SCOPE, "shell");

                           dict.put(CommandProcessor.COMMAND_FUNCTION, new String[] {"test1", "test2"});

                          context.registerService(org.apache.felix.service.command.CommandSession.class.getName(),

                             new TestConsole(context), dict);

 

위와 같이 인터페이스를 구현해서 서비스에 등록하면 프로퍼티로 넘겨준 dict에 담겨있는 메서드 test1, test2Console에서 실행할 수 있다. OSGi Console에서 help를 치면 shell:test1shell:test2가 등록되어 있는 것을 확인 할 수 있으며 test1 “Hello world” 라고 치면 Hello world OSGi Console에 찍히는 것을 확인 할 수있을 것이다.

객체 파라미터, 리턴 값에 대해서는 믿에 링크를 확인해 보길 바란다.
 

참고:

http://felix.apache.org/site/rfc-147-overview.html#RFC147Overview-StandardwaytoimplementandruncommandsforanyOSGi4.2framework

Posted by Brian B. Lee
Programming/OSGi2010. 12. 3. 10:56
본 내용은 실전 OSGi&SpringDM(위키북스) 책의 Chapter 7의 일부 내용입니다


OSGi 콘솔 확장하기 (for Eclipse Equinox Developers)

1. 인터페이스 추가

1.1 인터페이스

//org.eclipse.osgi.framework.console에 선언된 인터페이스

//Manifest Import-Package에 위의 인터페이스를 추가해 준다.

public interface CommandProvider {

           //콘솔창에서 help를 입력할 때 나오는 문장열

           public String getHelp();

}

 

1.2 구현체

//메소드 이름 앞에 “_”를 넣어줘야 자동으로 콘솔에 등록된다.

//inplements CommadProvider

public void _hello(CommandInterpreter ci) {

           System.out.println(“Hello “ + ci.nextArgument());

}

Posted by Brian B. Lee

객체지향 원리
1. 변하는 것은 캡슐화하라
2. 구현에 의존하기보다는 인터페이스에 의존하도록 코딩하라.
3. 각 클래스는 변경 요인이 오직 하나이어야 한다.
4. 클래스는 행동과 기능에 관한 것이다.

객체지향 원리 추가!
원리 #1
OCP(Open-Closed Principle) <= 유연성
 클래스 폐쇄와 개방
  폐쇄 - private 등
  개방 - 상속, 오버라이드, public 등

원리 #2
DRY(Don't Repeat Yourself) <= 중복코드 없세기
시스템의 각 정보와 기능을 말이되는 하나의 장소에 두는 것을 의미

원리 #3
SRP(Single Responsibility Principle) <= 하나의 책임만 같는 객체
 책임 찾기 방법
  1. ______ 이(가) 자신을 ______ 한다.    => 객체(클래스) 이(가) 자신을 메서드 한다.
  2. ______ 이(가) ______ 를 ______ 한다. => 객체(클래스) 이(가) 파라미터를 메서드 한다.  
  ex) 차가 자신을 운전 한다. (O)
  ex) 차가 자신을 세차 한다. (X) => 세차장이 자신을 세차 한다? (X) => 세차장이 스스로 차를 세차한다.

원리 #4
LSP(Liskov Substitution Principle) <= 부모 클래스 대체
자식 객체는 부모 객체를 대신할 수 있어야한다.

상속(Injeritance)? or 위임(Delegation)? or 구성(Composition)? or 집합(Aggregation)
=> 상속(is-a), 위임, 구성, 집합(has-a)는 상속 대신하며 상속보다 대개의 경우 선호된다 :
위의 3가지를 쓸 경우 상속보다 대개의 경우 소프트웨어는 더 유연하고 유지보수성, 확장성, 재사용성이 좋아진다.

위임: 기능 확장(포함 관계), 구성: 전체와 부분의 생명주기 동일(interface사용), 집합: 종속적 관계(생명주기 다름)

위의 내용은 Head First OOA&D Chapter 8을 요약한 것이다.
추가된 객체 지향 원리 중 마지막 4번째 LSP 원리는 아직도 이해가 잘 되지 않는다;;
UML에서 구성(Composition)과 집합(Aggregation)을 따로 표시하는데 (속이 꽉찬 다이아몬드와 속이 빈 다이아몬드)
구현 상 어떻게 다른지 그리고 interface를 사용하여 구성을 구현하는데 꼭 interface를 사용해야하는지
뭐 이런점이 의문이 남는다

Posted by Brian B. Lee
Programming/OSGi2010. 10. 19. 10:11

밑에 스프링 사이트에서 jar파일 및 Dependency를 찾을수있습니다.

http://www.springsource.com/repository/app/;jsessionid=A431F38984691BE6F71E5849F17C46E0.jvm1

또한 이곳에서도 jar파일 및 Devpendency를 찾을 수 있다.

http://mvnrepository.com/

Posted by Brian B. Lee
Programming/OSGi2010. 10. 19. 09:24
http://java.dzone.com/articles/osgi-event-admin-with-spring-d 소스코드를 참조했음

1. SpringDMd을 사용

           1-1. 이벤트 핸들러로 이벤트 받기

                     Manifest.mf Import-Package org.osgi.service.event 추가

                     1-1-1. 인터페이스

                                public interface EventHandler {

                                          void handleEvnet(Event event);

                                }

                     1-1-2. 구현체

                                public class 클래스명 implements EventHandler {

                                          //인터페이스 구현체

                                          public void handleEvent(Event event) {

                                                     System.out.println("\r\n[Event Received] Topic : " + event.getTopic());

                                                     for(String key : event.getPropertyNames()){

                                                                System.out.println("\t[Property] " + key + " : " + event.getProperty(key));

                                                     }

                                          }

                                }

                     1-1-3. spring.xml                     

                                <osgi:service id="EventAdminServiceBean" ref="구현EventAdminBean"           interface="org.osgi.service.event.EventHandler">

                                          <osgi:service-properties>

                                                     <entry key="event.topics" value="Topic주소" />

                                          </osgi:service-properties>

                                </osgi:service>

                               

                                <bean id="구현EventAdminBean" class="구현EventAdmin경로" />

          

           1-2. 이벤트 보내기

                     1-2-1. 구현체

                                public class 클래스명 {

                                          private EventAdmin eventAdmin;

 

                                          @ServiceReference

                                          public void setEventAdmin(EventAdmin eventAdmin) {

                                                     this.eventAdmin = eventAdmin;

                                          }

                                         

                                          private String EVENT_QUEUE;

 

                                          public void setEVENT_QUEUE(String EVENT_QUEUE) {

                                                     this.EVENT_QUEUE = EVENT_QUEUE;

                                          }

                                         

                                          public void sender(){

                                                     Properties props = new Properties();

                                                     props.put("key", "value");

                                                     //동기 전송: sendEvent, 비동기 전송: postEvent

                                                     eventAdmin.sendEvent(new Event(EVENT_QUEUE, props));

                                          }

                                }

                    

                     1-2-2. spring.xml

                                <bean id="클래스Bean" class="클래스 경로" init-method="실행 메서드">

                                          <property name="EVENT_QUEUE" value="Topic주소" />

                                </bean>

          

                                <bean class="org.springframework.osgi.extensions.annotation.ServiceReferenceInjectionBeanPostProcessor" />

          

                     1-2-3. event를 보내기 위해 spring-osgi-annotation jar파일 필요

                                Maven을 사용한다면 dependency를 추가 하거나 아니며 spring-osgi-annotation jar파일이 필요

                                                     <dependency>

                                                                <groupId>org.springframework.osgi</groupId>

                                                               <artifactId>org.springframework.osgi.extensions.annotation</artifactId>

                                                                <version>1.2.1</version>

                                                     </dependency>

Posted by Brian B. Lee