2014년 6월 10일 화요일

자바 jdk 버전 바꾸기


다른 버전을 설치하고 나서 PATH 설정 다 해도
cmd 창에서 자바버전을 확인했는데 계속 전에 사용하던 버전이 뜨면

regedit 이라고 실행창에 입력하고

SOFTWARE -> JavaSoft -> Java Runtime Envieronment 에서
Current Version을 사용하고 싶은 jdk 버전으로 변경하면 된다.

2014년 4월 8일 화요일

RMI plug-in Setting & How to use



URL : http://www.genady.net/rmi/v20/demos/

This site will teach you how to install and use the rmi plug-in for eclipse.


What i missed was
 

  Run Configurations -> RMI category -> RMI VM Properties tab ->

  Value of java.rmi.server.codebase column ->

  Compute from classpath CLICK!!  (NO Add button)

2014년 3월 10일 월요일

RMI 간단한 예제소스

이전 포스팅에서 말했듯이 이번에는 간단히 RMI를 구현해 보도록 하겠다.
Remind하는 차원에서 RMI의 작성순서를 생각해 보면,
1. 인터페이스 작성
2. 서비스 해줄 class작성
3. 서버 프로그램 작성
4. 클라이언트 프로그램 작성
5. 1~4 컴파일
6. rmic.exe를 이용해 stub 생성 : ex) rmic HelloImpl
7. start rmiregistry 포트번호 : 대게 기본으로 1099를 쓴다.
8. start 3번 프로그램 실행  : 예) start java HelloServer
9. 클라이언트 프로그램 실행 : 예) java HelloClient
---------------------------------------------------------
그럼 지금부터 본격적으로 RMI를 구현해 보자.
우선 생성할 파일들의 이름을 나열해 보자.
인터페이스            : Hello.java
서비스해줄 class     : HelloImpl.java
서버 프로그램        : HelloServer.java
클라이언트 프로그램 : HelloClient.java

첫번째로 인터페이스를 구현한다.
java.rmi.RemoteException
//원격 인터페이스를 만들기 위해 Remote interface를 상속받아야 한다.
public interface Hello extends Remote{
    public String sayHello(String name) throws RemoteException;
}

두번째로 서비스 해줄 클래스를 구현한다.
import java.rmi.Naming;
import java.rmi.server.UnicastRemoteObject;
import java.rmi.RemoteException;
public class HelloImpl extends UnicastRemoteObject implements Hello{
    //기본 생성자 호출...안해줘도 되는데..ㅡㅡ;;;
    public HelloImpl() throws RemoteException{
       super();
    }
    public String sayHello(String name){
       return "Hello RMI "+name+"!!";
    }
}

세번째로 서버 프로그램을 구현한다.
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.net.MalformedURLException;
public class HelloServer{
  public static void main(String[] args){
    try{
      HelloImpl remObj = new HelloImpl();
      //매개변수로 (url, 원격객체)가 들어간다.
      Naming.rebind("rmi://localhost:1099/HelloRemote", remObj);
      System.out.println("HelloRemote객체에 대한 레지스트리 등록후 클라이언트 호출 대기");
    }catch(RemoteException e){
      System.out.println("원격 객체 처리과정에 에러 발생");
    }catch(MalformedURLException e){
      System.out.println("URL문자열 에러!!!");
    }
 }
}

네번째로 클라이언트 프로그램을 작성한다.
import java.rmi.*;
import java.net.MalformedURLException;
public class HelloClient
{
  public static void main(String[] args){
    try{
      //lookup의 return type은 remote이다.
      //따라서 remote를 상속받는 Hello가 반환된다.
      //그래서 반환받는 값으로 Object타입이나 Hello타입으로 반환 받으면 된다.
      Object obj = Naming.lookup("rmi://localhost:1099/HelloRemote");
      Hello h = (Hello)obj;
      String msg = h.sayHello("bbbb");
      System.out.println("Hello 원격 객체로부터 받은 메세지:["+msg+"]");
    }catch(RemoteException e){
      System.out.println("원격 메소드 호출 실패");
    }catch(NotBoundException e){
      System.out.println("바운딩 실패 :"+e.getMessage());
    }catch(MalformedURLException e){
      System.out.println("잘못된 URL 문자열");
    }
  }
}

다섯번째로 위에 작성한 파일들을 컴파일 한다.
->src\package명\*.java  파일들을 모두 컴파일 한다.  (javac -d . *.java)

여섯번째로 rmic.exe를 이용해 stub을 생성한다.
stub가 생성된 것을 확인할 수 있다.

일곱번째로, rmiregistry를 등록한다.
위와 같이 rmiregistry를 등록하면 빈 cmd창이 열린다. 닫으면 안된다.

여덟번째로 서버를 실행시킨다.
->bin\ 에서 start 한다
위와 같이 새로운 cmd창이 뜬다. 닫으면 안된다.

아홉번째로 client프로그램을 실행시켜서 테스트 해본다.
위와 같이 메시지가 출력되는 것을 볼 수 있다.
이상으로 간단하게 RMI를 구현해 보았다.

참고로, 구현하면서 사용한 인터페이스, 클래스에 대해 간단히 설명하겠다.
<Remote 인터페이스>
- Remote 객체
∙ 서버 측에 존재하며 실제 호출되는 method를 정의하고 있는 객체는 반드시 이 interface를 구현해야 한다.
∙ 원격지의 객체들을 RMI시스템 상에서 구분하는데 사용
∙ 이 인터페이스에 정의되어 있는 method들만이 원격지에서 호출된다.
주의) 선언되는 method는 반드시 RemoteException을 처리해야 한다.

<UnicastRemoteObject 클래스>
- RemoteServer 클래스를 상속받는 클래스.
- 자신의 생성자에게 원격 객체를 등록하는 기능을 정의
∙  원격 객체를 생성하고 노출시켜주어 client가 method를 호출할 수 있도록 도와주는 클래스
∙  이 클래스를 상속받은 원격 객체는 원격 객체가 메모리에 상주해 있는 동안에만 client로부터 method 호출을 받을 수 있다.
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 

2014년 2월 10일 월요일

log4j.properties 파일 패스 변경

web에서 log4j.properties파일을 배치하는 곳은 기본적으로 "/WEB-INF/classes/log4j.properties"에 배치합니다.
log4j.properites파일을 다른곳에 넣고 참조하게 시킬려면 어떻게 할까요?
패스만 바꿔주면 될것 같은데.....
어떻게 해야 할지 몰라서 또 헤맸습니다. ㅜㅜ

찾아보니 또 영문으로 되어있네요...^^ㅋ
시간 나시는 분들은 아래의 메뉴얼을 참조하세요.

방법은 두가지가 있는데 자바 소스에 직접 패스를 설정하는 방법과 어플리케이션 실행시 Java옵션에 추가 하는방법이 있습니다.

첫번째, 자바 소스에 직접 설정하는 방법은 아래와 같습니다.
import org.apache.log4j.Logger;
 import org.apache.log4j.PropertyConfigurator;
 
 public class MyApp {
 
   static Logger logger = Logger.getLogger(MyApp.class.getName());
 
   public static void main(String[] args) {
 
 
     // BasicConfigurator replaced with PropertyConfigurator.
     PropertyConfigurator.configure(args[0]);
 
     logger.info("Entering application.");
     Bar bar = new Bar();
     bar.doIt();
     logger.info("Exiting application.");
   }
 }
PropertyConfigurator.configure("파일 패스") <-- 이런식으로 소스에 직접 파일패스를 설정 할수 있습니다.



두번째 자바 옵션 방법은 프로그램 실행시 옵션에 아래와 같이 추가합니다.
-Dlog4j.configuration=file:/c:/foobar.properties
ex) java -Dlog4j.configuration=file:/c:foobar.properties  -jar foobar.jar


개인적으론 두번째 방법을 추천합니다.
정말 고정이고 패스가 바뀌지 않는다면 첫번째도 괜찮지만... 경험상으로 봐선 어쩔수 없이 바꿔야 할때도 있어서...
쉽게 바꿀수 있는 두번째방법이 좋지 않을까 합니다.
감사합니다.


[출처] http://forum.falinux.com/zbxe/index.php?document_srl=781519

svn 설정 및 사용방법

소스코드 관리 프로그램중 Tortoisesvn를 대해 기본적인 사용법이다.
서버 PC가 없는 관계(???)로 ,
내 PC에 있는 별도의 디스크를 Local 저장소로 사용할 예정이다.

Tortoisesvn를 아래 사이트로 접속 후

32bit or 64bit중 선택해서 클릭 후, 아래 창이 뜨면 저장을 클릭후 적당한 디렉토리에 다운을 받고,

다시 전 화면으로 와서 밑으로 스크롤해서 언어팩중 한국어를 다운받는다.


설치를 위해
다운받은 TortoiseSVN-1.7.3.22386-win32-svn-1.7.2.msi를 실행을 한다.
"실행"클릭… 화면 뜨는데로 진행을 해준다à go


Next 클릭


Agree후 next 클릭


Next 클릭


Install 클릭


설치중…..


Finish 클릭


탐색기 실행후 좌측 아무 디렉토리 선택 후 오른쪽마우스 버튼 클릭시,
아래 적색부분의 SVN Checkout 과 TortoiseSVN 메뉴가 나오면 정상적으로 설치가 된것이다.

메뉴를 한글로 보이기 위해 다운받은 한글팩을 설치해준다.(설치안 해도 무방)
LanguagePack_1.7.3.22386-win32-ko.msi 를 실행한다.
실행 클릭


Next 클릭


설치중……………………..


Finish 클릭


탐새기 임의의 디렉토리 선택후 오른쪽 마우스 버튼 클릭하면 아래와 같이 한글 메뉴들이 보인다.


이제부터 저장소(repository)를 만들고 , 이곳에 소스나 data들을 저장 및 관리를 한다.
  1. 저장소는 나의 경우 F:/repository/project1만들고
  2. 생성된 디렉토리 안으로 들어가 우측 선택 후 오른쪽 마우스 클릭-> TortoiseSVN 커스 위치->" 현재위치에 저장소 생성(Y)" 클릭




    "폴더 구조 생성" 클릭 ---> "확인" 클릭
    (폴더구조 생성 클릭을 하면 project1안에 3개의 폴더 trunk,branch,tags가 생기지만,
    보이지는 않는다. Trunk에 최초로 import후 check-out,commint를 주로 사용 하게 된다.)

  3. 아래와 같은 디렉토리들이 project1안에 생성이 된다.


  4. Repository/project1/ trunk로 improt할 project를 import를 시켜준다.
Import 할때는 탐색기를 통해 해당 project 경로로 이동후

디렉토리 선택 후 TortiseSVn -> "임포트" 클릭

  1. 저장소 URL를 위에서 생성한 저장소 경로가 안 나오면 아래 화면에서 우측 상단의 버튼으로
저장소 경로 file://F:/repository/project1/trunk " 를 선택 해주고 -> "확인" 클릭


아래와 같이 저장소로 파일들이 import가 되고, 완료가 되면 좌측 하단에 import건수 표시가 되고 "확인" 클릭


그다음에는 임포트를 받은 원래 project 작업공간 check-out를 해 준다.

저장소 디렉토리인 repoitory 오른쪽 마우스 클릭 -> SVN 체크아웃(K)클릭


체크아웃받을 디렉토리 익스포트(D)에 지정 후 "확인" 클릭


목적지 경로로 파일들이 추가가 되며,
완료가 되면 -> "확인" 클릭


정상적으로 check-out이 되었으면 녹색 체크 표시로 나타난다.
    


Project1에서 수정작업 후 project1 디렉터리 내부를 보면

위와 같이 수정된 파일은 적색의 느낌표로 표시되며,

Commit를 해 보자…

      
    
SVN 커밋(C)를 클릭 하면 아래 화면과 같이 수정된 파일들이 뜨고 -> 확인 클릭(최근 메시지 박스에 내용도 필요한 내용이 있으면 적어준다.)


commit이 정상적으로 되었으면 아래 창이 뜨고 -> "확인" 클릭

출처-http://hotcoffee.tistory.com/entry/Tortoise-SVN-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EA%B8%B0%EB%B3%B8%EC%82%AC%EC%9A%A9%EB%B2%95

log4j 설정방법

1. log4j 다운.
    - http://logging.apache.org/log4j/1.2/download.html 접속.
    - apache-log4j-1.2.16.zip 을 다운받고 압축을 푼다.
    - 압축을 푼 폴더안에 og4j-1.2.16.jar 파일이 있는지 확인 한다.
  
2. 이클립스 설정.
    - 프로젝트 WEB_INF/lib 폴더에 log4j-1.2.16.jar 파일을 복사 붙여넣기 한다.  
    - 프로젝트 src에 new - file 만들기로 log4j.properties 파일을 만든다.
    - log4j.properties 파일에 소스를 붙여넣기 한다.
     
log4j.rootLogger = debug, stdout, dailyfile //debug를 info,error,warn,fatal 로 조정만 하여 레벨 조정이 가능하다.//콘솔창에 찍히는 부분 설정.
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p ({%t} %F[%M]:%L) [%d] - %m%n

//file에 기록되는 부분 설정.log4j.appender.dailyfile.Threshold = DEBUG
log4j.appender.dailyfile = org.apache.log4j.DailyRollingFileAppender
log4j.appender.dailyfile.File = c:\\log\\logfile.log //여기에 지정된 폴더로 날짜별로 로그파일이 생성된다
log4j.appender.dailyfile.layout = org.apache.log4j.PatternLayout
log4j.appender.dailyfile.layout.ConversionPattern=%5p ({%t} %F[%M]:%L) [%d] - %m%n

3. 라이브러리 추가
   - 프로젝트 우측클릭 properties 설정 - Java Build Path - Libraries - Add Libary... 클릭
   - JUnit 클릭 - JUNIT library version : JUnit 3 - Finish

4. 사용해보기.
    - log4j import
       private static Logger logger = Logger.getLogger(TestLog4j.class);

    -   logger.debug("dddd");
        logger.info("info");
        logger.warn("warn");
        logger.error("error");
        logger.fatal("fatal");
        요런식으로 찍어보면 된다.
        찍힌 내용은 설정파일의 경로에 파일로도 저장된다.
        설정파일의 debug를 warn이라고 해놓으면 info, debug의 메시지는 당연히 안찍힌다.
        설정파일 한방으로 찍히고 안찍히고를 결정 지을 수 있다.


[출처]http://sabper.tistory.com/139