'개발 이야기'에 해당되는 글 73건

  1. 2007.05.07 | ORM 이란 무엇인가?
  2. 2006.12.19 | [본문스크랩] JAVA FTP 프로그램 
  3. 2006.09.02 | eclipse tutorial - workbench

ORM 이란 무엇인가?

개발 이야기/ORM | 2007. 5. 7. 13:46
Posted by 시반

ORM(Object-Relational Mappings)라는 건 과연 무엇일까?

근래 많이 보고 듣는 단어이고 ORM Framework이나 Tool이니 하면서 Hibernate iBatis, Toplink등등의 이름들도 많이 듣게 된다. 과연 이 ORM이라는 것이 무엇이길래 왜 이렇게 많은 사람들의 입에 오르내리는 것일까?

 

ORM이라는 것을 단순하게 표현해보자면 객체와 관계와의 설정? 정도일까? 그럼 여기서 말하는 객체라는 것은 우리가 흔히 말하는 OOP(Object-Oriented Programming)의 그 객체를 이야기 하는 것 이라면, 과연 관계라는 것이 의미하는 것은 무엇일까? 뭐 지극히 기초적인 이야기지만 우리(개발자)가 흔히 사용하고 있는 관계형 데이터베이스를 의미한다.

 

그렇다면 도대체 무엇이 문제여서 객체와 관계형 데이터베이스 간의 매핑을 지원해주는 Framework이나 Tool들이 나오는 것일까? 이미 우리는 OOP를 하면서 객체와 관계형 데이터베이스를 모두 잘 사용하고 있지 않은가? 그런데도 굳이 이런 새로운 개념들이 나오게 되는 이유는 흔히 말해서 Back to basics 라고 볼 수 있겠다. , 보다 OOP다운 프로그래밍을 하자는 데 에서부터 출발한 것이다.

 

그럼 과연 무엇이 문제였던 것일까? 생각해보면 당연하게 문제가 있을 수 밖에 없다고 생각되어진다. 스스로 한번 생각해보자. 우리가 어떤 어플리케이션을 만든다고 할 때 관련된 정보들은 객체에 담고 있게 된다. 많이들 예를 드는 주소록을 만든다고 생각을 해보자. 일단은 주소록의 주체가 될 사람이라는 객체가 있다고 가정해보면 주민등록번호, 이름, , 몸무게 등등이 저장될 것이다. 그리고 주소라던지 전화번호등이 저장 될 다른 객체(여기서는 주소만을 가정해보고 주소라는 객체라고 가정한다.)도 있게 될 것이다. 그럼 이것을 영구적으로 저장하기 위해서 파일이나 데이터베이스에 입력을 한다고 하면, 객체와 객체들의 관계를 데이터베이스의 테이블에 저장을 하게 된다는 말과 동일하게 된다. table들에 객체가 가지고 있던 정보를 입력하고 이 table들을 join과 같은 sql query문을 통해서 관계를 설정해주게 된다. 여기서 문제는 이 table들과 객체간의 이질성이 발생을 한다는 것이다.

 

보통 ORM Framework들은 이러한 이질성을 해결하기 위해서 객체와 table간의 관계를 설정하여 자동으로 처리를 해준다는 것이다. 개인적으로 많은 ORM Framework를 접해본 것이 아니라서 어떤 방법들이 사용되는지는 잘 모르겠지만, 예를 들어서 눈으로 확인해보자면 다음과 같은 Person이라는 객체가 있다고 가정한다.


public class Person {

   private String name;

   private String height;

   private String weight;

   private String ssn;

  // implement getter & setter methods

}



iBatis의 경우에는 다음과 같이 mapping file내에서 해당 query의 결과를 받을 객체를 지정해 줄 수 있다.

<select id="getPerson" resultClass="net.agilejava.person.domain.Person">
 
  SELECT name, height, weight, ssn FROM USER WHERE name = #name#;


</
select>

, getPerson라고 정의된 query의 결과는 net.agilejava.person.domain Person객체에 자동으로 mapping 되는 것이다. Hibernate의 경우에는 mapping 파일에서 다음과 같이 표현을 해준다.

<hibernate-mapping>

        <class name="net.agilejava.person.domain.Person" table=person”>

               <id name="name" column="name" />

               <property name="height" column="height" />

               <property name="weight" column="weight" />

               <property name="ssn" column="ssn" />

        </class>

</hibernate-mapping>

위 두개의 Framework의 예시를 보면 알 수 있듯이 setter 메소드가 있다면 객체에 결과를 set하는 작업들이 따로 필요한 것이 아니라 자동으로 setting 되는 것이다. 물론 여기에 추가적으로 1:m 이나 m:1 등의 관계들이 형성되면 추가적인 작업이 필요하긴 하지만 어쨌든 일단 눈에 보이는 간단한 부분은 처리가 되는 것을 볼 수 있다. 물론 반대의 경우에도 객체를 던져주면 ORM Framework에서 알아서 get을 해와서 해당하는 column에 넣어주게 된다.

 

어떻게 보면 더 복잡해 보일 수 도 있는 ORM이지만 막상 사용해보면 그 편리함에 몸을 떨게 된다. 단순하게 get/set만 해주는게 목적이 아니라 객체지향적인 시스템을 위해서 관계형데이터베이스의 설계부터 변화를 주고, 설계된 데이터베이스와 객체와의 관계에 대한 설정 등을 포함하여 보다 객체지향적인 시스템의 완성을 위한 도구라고 말할 수 있겠다. 물론 ORM이라는 것이 흔히 말하는 silver bullet은 절.. 아니다. 이 녀석이 쓰여서 이득을 볼 수 있는 부분이 존재할 것이며, 쓰지 않아서 이득을 볼 부분이 존재 할 것이다. 많은 사람들이 ORM에 대하여 우려하고 있는 부분은 객체지향적으로 설계되지 않은 데이터베이스에서의 사용에 따른 폐혜라고 생각한다. 이미 데이터베이스 중심적인 사고를 통하여 만들어 놓은 데이터베이스에 ORM을 도입을 해서도 분명 이점이 있긴하겠지만, 그에 비해서 개발자들의 학습곡선 이라던지, 기존에 존재하는 코드나 시스템들과의 연계 또는 유지보수적인 측면, 그리고 성능 등에서 생각해보면 부정적으로 볼 수 밖에 없다. , 전체적인 시스템의 분석,설계 단계에서부터 객체와 데이터베이스를 따로 생각하는 것이 아니라 하나의 덩어리로 인지하고 양쪽 모두를 고려한 설계를 해나갈 수 있을 때, ORM은 보다 좋은 모습을 보여주고 각광을 받을 수 있을 것이다

 

출처 : evilimp's Blog

 

[본문스크랩] JAVA FTP 프로그램 

개발 이야기/Java | 2006. 12. 19. 10:51
Posted by 시반

JAVA 로 FTP Client를 만드시려는 분들께 도움이 될만한 자료 같습니다.
발췌:http://blog.empas.com/juxtapose/7388152
//------------------------------------------------
// ftp 프로그램 :  Ftp.java
// 이 프로그램은 ftp 서버에 접속하여 파일을 전송한다.
// 사용법 :  java  Ftp  서버주소
// 사용예 :  java Ftp  netlab.woosong.ac.kr
//------------------------------------------------

// 라이브러리의 이용
import java.net.*;
import java.io.*;

// Ftp 클래스
public class Ftp {
    // 소켓의 준비
    Socket ctrlSocket;//    제어용 소켓
    public PrintWriter ctrlOutput;//  제어 출력용 스트림
    public BufferedReader ctrlInput;//  제어 입력용 스트림

    final int CTRLPORT = 21 ;//   ftp 제어용 포트

    // openConnection  메소드
    // 주소와 포트 번호로부터 소켓을 만들고 제어용 스트림을 작성한다.
    public void openConnection(String host)
        throws IOException,UnknownHostException
    {
        ctrlSocket = new Socket(host, CTRLPORT);
        ctrlOutput = new PrintWriter(ctrlSocket.getOutputStream());
        ctrlInput
          = new BufferedReader(new InputStreamReader(ctrlSocket.getInputStream()));
    }

    // closeConnection  메소드
    // 제어용 소켓을 닫는다.
    public void closeConnection()
        throws IOException
    {
        ctrlSocket.close() ;
    }


    // showMenu 메소드
    // Ftp의 명령 메뉴를 출력한다.
    public void showMenu()
    {
        System.out.println(">Command?") ;
        System.out.print("2 ls") ;
        System.out.print("    3 cd") ;
        System.out.print("    4 get") ;
        System.out.print("    5 put") ;
        System.out.print("    6 ascii") ;
        System.out.print("    7 binary") ;
        System.out.println("    9 quit") ;
    }

    // getCommand 메소드
    // 이용자가 지정한 명령 번호를 읽어 처리한다.
    public String getCommand()
    {
       String buf = "" ;
       BufferedReader lineread
         = new BufferedReader(new InputStreamReader(System.in)) ;
       
       while(buf.length() != 1){// 1 문자의 입력을 받을 때까지 반복한다.
         try{
           buf = lineread.readLine() ;
         }catch(Exception e)
         {
          e.printStackTrace();
          System.exit(1);
         }
       }
       return (buf) ;
     }

    // doLogin 메소드
    // ftp 서버에 로그-인 한다.
    public void doLogin()
    {
       String loginName = "" ;
       String password = "" ;
       BufferedReader lineread
          = new BufferedReader(new InputStreamReader(System.in)) ;

       try{
            System.out.println("로그인 이름을 입력하세요 : ") ;
            loginName = lineread.readLine() ;
            // USER 명령에 의한 로그인
            ctrlOutput.println("USER " + loginName) ;
            ctrlOutput.flush() ;
            // PASS 명령에 의한 패스워드의 입력
            System.out.println("패스워드를 입력하세요 : ") ;
            password = lineread.readLine() ;
            ctrlOutput.println("PASS " + password) ;
            ctrlOutput.flush() ;
       }catch(Exception e)
       {
            e.printStackTrace();
            System.exit(1);
       }
    }

    // doQuit 메소드
    // ftp 서버로부터 로그 아웃한다
    public void doQuit()
    {
       try{
            ctrlOutput.println("QUIT ") ;//  QUIT 명령의 송신
            ctrlOutput.flush() ;
       }catch(Exception e)
       {
            e.printStackTrace();
            System.exit(1);
       }
    }

    // doCd  메소드
    // 디렉토리를 변경한다.
    public void doCd()
    {
       String dirName = "" ;
       BufferedReader lineread
          = new BufferedReader(new InputStreamReader(System.in)) ;

       try{
            System.out.println("디렉토리 이름을 입력하세요 : ") ;
            dirName = lineread.readLine() ;
            ctrlOutput.println("CWD " + dirName) ;// CWD 명령
            ctrlOutput.flush() ;
       }catch(Exception e)
       {
            e.printStackTrace();
            System.exit(1);
       }
    }

    // doLs 메소드
    // 디렉토리 정보를 얻는다.
    public void doLs()
    {
       try{
            int n ;
            byte[] buff = new byte[1024] ;

            // 데이터용 연결(connection)을 만든다.
            Socket dataSocket = dataConnection("LIST") ;
            //  데이터를 읽어 처리하는 스트림을 사용한다.
            BufferedInputStream dataInput
              = new BufferedInputStream(dataSocket.getInputStream()) ;
            //  디렉토리 정보를 읽고 처리한다.
            while((n = dataInput.read(buff)) > 0){
                System.out.write(buff,0,n)  ;
            }
            dataSocket.close() ;
       }catch(Exception e)
       {
            e.printStackTrace();
            System.exit(1);
       }
    }

    // dataConnection 메소드
    // 서버와의 데이터 교환용 소켓을 만든다.
    // 또한, 서버에게 port 명령으로 포트를 알린다.
    public Socket dataConnection(String ctrlcmd)
    {
       String cmd = "PORT " ; //PORT 명령으로 송신할 데이터 저장 변수
       int i ;
       Socket dataSocket = null ;//  데이터 전송용 소켓
       try{
             //  자신의 주소를 얻는다.
             byte[] address = InetAddress.getLocalHost().getAddress() ;
             //  적당한 포트 번호의 서버 소켓을 만든다.
             ServerSocket serverDataSocket = new ServerSocket(0,1) ;
             // PORT 명령용의 송신 데이터를 이용한다.
             for(i = 0; i < 4; ++i)
                 cmd = cmd +  (address[i] & 0xff) + "," ;
             cmd = cmd + (((serverDataSocket.getLocalPort()) / 256) & 0xff)
                       + ","
                       + (serverDataSocket.getLocalPort() & 0xff) ;
             // PORT 명령을 제어용 스트림을 통해 전송한다.
             ctrlOutput.println(cmd) ;
             ctrlOutput.flush() ;
             // 처리 대상 명령 (LIST, RETR, STOR)을 서버로 보낸다.
             ctrlOutput.println(ctrlcmd) ;
             ctrlOutput.flush() ;
             // 서버로부터 접속을 받는다.
             dataSocket = serverDataSocket.accept() ;
             serverDataSocket.close() ;
       }catch(Exception e)
       {
            e.printStackTrace();
            System.exit(1);
       }
       return  dataSocket ;
    }

    // doAscii 메소드
    // 텍스트 전송 모드로 셋팅한다.
    public void doAscii()
    {
       try{
            ctrlOutput.println("TYPE A") ;// A 모드
            ctrlOutput.flush() ;
       }catch(Exception e)
       {
            e.printStackTrace();
            System.exit(1);
       }
    }

    // doBinary 메소드
    // 이진 전송 모드로 셋팅한다.
    public void doBinary()
    {
       try{
            ctrlOutput.println("TYPE I") ;// I 모드
            ctrlOutput.flush() ;
       }catch(Exception e)
       {
            e.printStackTrace();
            System.exit(1);
       }
    }

    // doGet 메소드
    // 서버상의 파일을 가져온다.
    public void doGet()
    {
       String fileName = "" ;
       BufferedReader lineread
          = new BufferedReader(new InputStreamReader(System.in)) ;

       try{
            int n ;
            byte[] buff = new byte[1024] ;
            // 서버상의 파일의 이름을 지정한다.
            System.out.println("파일 이름을 입력하세요 : ") ;
            fileName = lineread.readLine() ;
            // 클라이언트상에 수신용 파일을 준비한다.
            FileOutputStream outfile =  new FileOutputStream(fileName) ;
            // 파일 전송용 데이터 스트림을 작성한다.
            Socket dataSocket = dataConnection("RETR " + fileName) ;
            BufferedInputStream dataInput
              = new BufferedInputStream(dataSocket.getInputStream()) ;
            // 서버로부터 데이터를 받아 파일로 저장한다.
            while((n = dataInput.read(buff)) > 0){
                outfile.write(buff,0,n) ;
            }
            dataSocket.close() ;
            outfile.close() ;
       }catch(Exception e)
       {
            e.printStackTrace();
            System.exit(1);
       }
    }

    // doPut 메소드
    // 서버에 파일을 전송한다.
    public void doPut()
    {
       String fileName = "" ;
       BufferedReader lineread
          = new BufferedReader(new InputStreamReader(System.in)) ;

       try{
            int n ;
            byte[] buff = new byte[1024] ;
            FileInputStream sendfile = null ;

            // 파일 이름을 지정한다.
            System.out.println("파일명을 입력하세요 : ") ;
            fileName = lineread.readLine() ;
            // 클라이언트상의 파일을 읽어 보낼 준비를 한다.
            try{
                sendfile =  new FileInputStream(fileName) ;
            }catch(Exception e){
                System.out.println("&#44594;?&#44541;&#44625;&#44437;&#44423;&#44511;&#44495;&#44455;&#44522;") ;
                return ;
            }

            // 전송용 데이터 스트림을 사용한다.
            Socket dataSocket = dataConnection("STOR " + fileName) ;
            OutputStream outstr =  dataSocket.getOutputStream() ;
            // 파일을 읽어 네트워크를 경유하여 서버로 보낸다.
            while((n = sendfile.read(buff)) > 0){
                outstr.write(buff,0,n) ;
            }
            dataSocket.close() ;
            sendfile.close() ;
       }catch(Exception e)
       {
            e.printStackTrace();
            System.exit(1);
       }
    }


    // execCommand 메소드
    // 명령에 대응하는 각 처리를 호출한다.
    public boolean execCommand(String command)
    {
          boolean cont = true ;

          switch(Integer.parseInt(command)){
          case 2 : //  서버의 디렉토리 표시 처리
              doLs() ;
              break ;
          case 3 : //  서버의 작업 디렉토리 변경 표시
              doCd() ;
              break ;
          case 4 : //  서버로부터의 파일 얻기 처리
              doGet() ;
              break ;
          case 5 : //  서버로 파일 전송 처리
              doPut() ;
              break ;
          case 6 : //  텍스트 전송 모드
              doAscii() ;
              break ;
          case 7 : //  바이너리 전송 모드
              doBinary() ;
              break ;
          case 9 : //  처리 종료
              doQuit() ;
              cont = false ;
              break ;
          default : // 그 이외의 입력 처리
              System.out.println("번호를 선택하세요 : ") ;
          }
          return(cont) ;
    }

    // main_proc 메소드
    // Ftp의 명령 메뉴를 출력하여 해당되는 처리를 호출한다.
    public void main_proc()
        throws IOException
    {
         boolean cont = true ;
        try {
            //  로그인 처리를 한다.
            doLogin() ;
            while(cont){
                //  메뉴를 출력한다.
                showMenu() ;
                //  명령을 받아서 처리한다.
                 cont = execCommand(getCommand()) ;
             }
        }
        catch(Exception e){
            System.err.print(e);
            System.exit(1);
        }
    }

    // getMsgs 메소드
    // 제어 스트림의 수신 슬롯을 개시한다.
    public void getMsgs(){
        try {
            CtrlListen listener = new CtrlListen(ctrlInput) ;
            Thread listenerthread = new Thread(listener) ;
            listenerthread.start() ;
        }catch(Exception e){
            e.printStackTrace() ;
            System.exit(1) ;
        }
    }

    // main 메소드
    // TCP 연결(connection)을 열어서 처리를 개시한다.
    public static void main(String[] arg){
        try {
            Ftp f = null;

            if(arg.length < 1){
              System.out.println("usage: java Ftp <host name>") ;
              return ;
            }
            f = new Ftp();
            f.openConnection(arg[0]); //  제어용 연결의 설정
            f.getMsgs() ;             //  수신 슬롯의 개시
            f.main_proc();            // ftp 처리
            f.closeConnection() ;     //  연결 닫기
            System.exit(0) ;          //  프로그램 종료
        }catch(Exception e){
            e.printStackTrace();
            System.exit(1);
        }
    }
}

// CtrlListen 클래스
class CtrlListen implements Runnable{
        BufferedReader ctrlInput = null ;
        //  constructor 읽고 처리하기 위한 상대방 지정
        public CtrlListen(BufferedReader in){
            ctrlInput = in ;
        }

        public void run(){
            while(true){
                try{ //  
                    System.out.println(ctrlInput.readLine()) ;
                } catch (Exception e){
                    e.printStackTrace() ;
                    System.exit(1) ;
                }
            }
        }
}

 

'개발 이야기 > Java' 카테고리의 다른 글

jxl을 통한 엑셀 저장하기  (0) 2008.01.16
JAVA API Chm파일 다운로드 링크  (0) 2007.12.21
[JBoss 보안] DataSource 패스워드 암호화  (0) 2007.06.26
[java] 예약어 enum  (0) 2007.06.04
JAVA SE의 정규표현식  (0) 2007.05.30
 

eclipse tutorial - workbench

개발 이야기/이클립스 | 2006. 9. 2. 22:38
Posted by 시반

시작하기 전에..

 

시리즈 소개

Rational® Application Developer for WebSphere Software는 웹, 웹 서비스, 자바, J2EE, 포탈 애플리케이션의 디자인, 개발, 분석, 테스트, 프로파일링, 전개를 위한 IBM Software Development Platform이다. 본 튜토리얼 시리즈는 IBM certification Test 255(Developing with IBM Rational Application Developer for WebSphere Software V6 to become an IBM Certified Associate Developer) 대비를 위한 것이다. 초급 개발자와 IBM Rational Web Developer 또는 IBM Rational Application Developer for WebSphere Software V6.0을 처음 사용하는, 특히 IBM 제품을 사용하여 웹 개발을 하려는 전문가와 학생을 위한 튜토리얼이다.

 

튜토리얼 소개

본 튜토리얼은 IBM Certification Test 255: Developing with IBM Rational Application Developer for WebSphere Software V6 인증 시험을 대비하기 위해 기획되었다. 제품의 기능에 초점을 맞춰 설명하겠지만 스스로 직접 제품을 사용하면서 익히는 것 만한 교육은 없다. Rational Application Developer for WebSphere Software Workbench의 기본적인 사용 방법을 설명한다. Workbench를 시작하는 것에서부터 매일 매일의 개발 작업에서 Workbench의 기본적인 사용법을 소개한다. 본 튜토리얼을 끝마치면 두 번째 튜토리얼로 진행되는데, 두 번째 튜토리얼에서는 Workbench에 포함된 자바 개발 환경의 개요를 설명한다.

 

목표

Workbench 프레퍼런스 설정 방법, 워크스페이스 관리 방법, 뷰와 퍼스펙티브로 작업하는 방법들을 익힌다. 위자드의 반입과 반출, 로컬 히스토리와 도움말 기능도 배운다.

 

사전 조건

본 튜토리얼은 초급 및 중급 수준의 기술과 경험을 지닌 개발자용이다. 통합 개발 환경을 사용해 본 경험이 있어야 한다.

 

시스템 요구 사항

본 튜토리얼의 예제를 실행하려면 Rational Application Developer for Software 또는 Rational Web Developer for WebSphere Software를 설치해야 한다. 본 제품이 없다면 Rational Application Developer for WebSphere Software 를 다운로드 하기 바란다.

소프트웨어에 대한 하드웨어 및 소프트웨어 요구 사항들은 IBM Rational Application Developer System Requirements를 참조하라.

시작하기

 

여러분이 Rational Software Development 기반 Workbench를 설치한 것으로 간주하겠다. Rational Application Developer 제품군은 Eclipse Workbench에 기반하고 있다. Rational Application Developer for WebSphere Software를 간단히 Application Developer라고 하겠다.

Application Developer Workbench의 설치 디렉토리는 설치 프로세스의 일부로 지정되었다. 이 디렉토리가 <RAD_Install>이다.

본 튜토리얼은 Workbench를 여는 것부터 설명한다. Windows 버전의 Application Developer를 설치했다면 Windows Start 메뉴에 이를 위한 엔트리가 있다. Windows에서 다음과 같이 선택한다:
Programs > IBM Rational > IBM Rational Application Developer V6.0 > Rational Application Developer.

리눅스나 Windows 버전의 애플리케이션의 경우에 명령어 윈도우를 열고 다음 디렉토리에서 시작한다:
<RAD_Install>.

Windows에서 다음을 실행한다:
Onrationalsdp.exe.

리눅스에서는 다음을 실행한다:
Onrationalsdp.sh.

Application Developer가 Eclipse 3.0에 기반하고 있기 때문에 Workbench를 시작할 때, 작동을 수정하거나 기능을 실행하기 위해 명령어에 대해 지정할 수 있는 옵션들이 있다. 몇몇 매개변수들은 Eclipse에 있는 것들이고 몇몇은 IBM Rational Software Development Platform 플러그인에서 추가된 것들이다. 두 개의 매개변수를 소개하겠다:

  • On-data <workspace directory> (지정된 워크스페이스 디렉토리에 Workbench를 연다.)
  • On-showlocation (Workbench 타이틀 바에서 워크스페이스 디렉토리를 보여준다.)

Eclipse 3.0에는 Workbench 내에서 워크스페이스를 변환할 수 있는 신기능이 도입되었다. Workbench에 있는 동안 워크스페이스를 변환하려면 메인 메뉴 바에서 File > Switch Workspace를 선택할 수 있고, 기존 워크스페이스로 전환하거나 새로운 워크스페이스를 만들 수 있다. Workbench는 자동으로 닫히고 지정된 워크스페이스에서 자동으로 열린다.

새로운 워크스페이스에 Application Developer를 처음으로 열 때 워크스페이스에 .metadata 디렉토리가 만들어진다. 이것이 Workbench 메타데이터 디렉토리이다. 대부분의 경우 이 디렉토리에 직접 액세스 할 필요가 없다. 새로운 워크스페이스를 열면 Rational Software Development Platform Welcome 페이지가 열린다.



그림 1. Workbench Welcome Page

 

Welcome Page에서 다양한 기능으로 액세스 할 수 있다. 페이지 중앙에 있는 여섯 개의 아이콘들은 Overview, What's New, Tutorials, Samples, First Steps, Web Resources로 연결된다. 페이지의 우측 하단 코너에 있는 사람 모양의 아이콘은 Enable Roles 버튼이다.

Overview는 Rational Software Development Platform이 처음인 사람들은 반드시 봐야 한다. 제품 Flash Player로 연결되고 Workbench의 Java, Web, EGL, XML, Team programming, Test development 툴이 설명되어 있는 링크가 있다. Workbench에는 Workbench 툴을 사용하는 방법을 설명하는 많은 시뮬레이션(오디오 포함)이 포함되어 있다.

What's New (Overview 아이콘 옆에 있는 별 모양의 아이콘)에서는 WebSphere Studio 제품군의 기능들이 설명되어 있다.



그림 2. What's New


Tutorials (What's New 아이콘 옆에 있는 칠판 모양의 아이콘)에는 개발 태스크를 수행하는 방법을 설명하는 심도 깊은 콘텐트가 포함되어 있다. Tutorials 안에는 Watch and Learn, Play and Learn, Do and Learn 태스크를 포함하여 Launch the Tutorials Gallery 옵션이 들어있다.



그림 3. Launch the Tutorials Gallery


"Understand the Workbench environment" Play and Learn을 주목하기 바란다.

Samples에는 Swing, SWT, Portal, Faces, Faces Clients, Web Services, J2C Connector Architecture 등에 기반한 애플리케이션용 샘플 코드가 포함되어 있다. Application Developer 제품에 이렇게 많은 교육 툴이 있다는 것을 많은 사람들이 모르고 있다니 안타까울 뿐이다. 시간을 내서 Application Developer Workbench에 있는 내용들을 숙지하기 바란다.



그림 4. Samples


 

First Steps는 J2EE 개발이 처음이거나, WebSphere Studio Application Developer에서 Application Developer로 마이그레이션을 하거나, Workbench의 Import 기능을 배우고자 하는 사람들에게는 중요한 툴이다. 반입하는 것에 대해서는 나중에 자세히 설명하겠다.

마지막 링크인 Web Resources에서는 기술, 퍼블리케이션, 표준, IBM 툴 웹 사이트로 연결된다.



그림 5. Web Resources


 

마지막으로 Enable Roles 버튼이 있다. Eclipse 2.0이나 WebSphere Studio 제품군을 사용했던 고객들로부터 온 피드백의 산물이다. 개발 툴이 위자드와 툴바 같이 많은 역할들을 지원하는 기능을 갖고 있더라도 어지럽게 널려진 Workbench는 사용에 방해가 될 뿐이라고 많은 개발자들은 생각했다. 이 아이콘을 사용하여 개발자의 역할에 따라 제품의 기능을 실행할 수 있다. Enable roles 패널은 아이콘을 클릭하면 실행된다. (그림 6)



그림 6. Enable roles 윈도우
12개의 역할 정의:
  • Advanced J2EE
  • Database Developer
  • Eclipse Developer
  • EGL Developer
  • Enterprise Java
  • Java Developer
  • Team
  • Tester
  • Web Developer (고급)
  • Web Developer (일반)
  • Web Service developer
  • XML Developer


 

이 기능은 Welcome Page를 통해 역할 별로 실행되고 Workbench Preferences 윈도우를 통해 역할 또는 개별 기능에 따라 실행된다. 그림 7은 Workbench Preferences에서 기능을 실행하는 모습이다. 똑 같은 12개의 역할들이 있고, 각 역할들을 확장하면 역할 밑에 추가된 기능들을 볼 수 있다.



그림 7. Enabling Capabilities


실행 불가 상태로 되었던 기능을 실행하거나 프레퍼런스 페이지에서 아직 실행되지 않는 기능을 수행하려고 할 때 Confirm Enablement 프롬프트에서는 원하는 기능을 실행할 것인지의 여부를 묻는다.

퍼스펙티브와 뷰

 

퍼스펙티브

이제 Workbench를 실행했으니 하나씩 살펴보도록 하자. Welcome 페이지를 닫는다. (Welcome 탭에서 X를 클릭한다.) Workbench 윈도우는 퍼스펙티브로 구성되어 팀 내의 다양한 개발 역할에 따른 개발 태스크들을 지원한다. 각각의 퍼스펙티브는 초기 레이아웃과 뷰 세트를 정의한다.

TApplication Developer 제품을 설치할 때 디폴트 퍼스펙티브는 J2EE 퍼스펙티브 이다. 이 디폴트 퍼스펙티브는 Window > Open Perspective에 언제나 나타난다. 디폴트 퍼스펙티브는 Workbench 프레퍼런스를 통해 설정할 수 있다.

작업을 수행하면서 다른 퍼스펙티브를 열 수도 있다. 또 다른 퍼스펙티브를 여는 한 가지 방법은 메인 메뉴 바에서 Window > Open Perspective를 선택하는 방법이다. 여기에서 퍼스펙티브를 선택할 수 있는 짧은 리스트가 열린다.



그림 8. Open Perspective

Other...를 선택하고 Show all을 체크하면 제품에 있는 퍼스펙티브의 전체 리스트가 나온다.



그림 9. Perspectives
Application Developer에 있는 퍼스펙티브:
  • CVS Repository Exploring
  • Data
  • Debug
  • EGL
  • Generic Log Adapter
  • J2EE
  • Java Browsing
  • Java Type Hierarchy
  • Plug-in Development
  • Profiling and Logging
  • Resource
  • Team Synchronizing
  • Test
  • Web

 

기본적으로 다른 퍼스펙티브를 열 때 Workbench와 같은 윈도우에서 열린다.

 

새로운 윈도우로 퍼스펙티브를 열고 싶다면 Workbench 프레퍼런스에서 설정을 변경한다. 같은 윈도우에서 열리도록 퍼스펙티브를 설정하면 타이틀 바의 첫 단어는 현재 실행되는 퍼스펙티브의 이름이다. 퍼스펙티브 스위처 바(빨간색)를 통해 퍼스펙티브 열기를 변환할 수 있다.

 

스위처 바 위치도 설정할 수 있다. 스위처 바를 오른쪽 클릭하여 Dock On 옵션 밑에 위치 옵션을 볼 수 있다. 이것은 우측 상단 밑에 위치해 있다. 다른 옵션들은 왼쪽 상단에 위치해 있다.

 

퍼스펙티브 아이콘들은 디스크립션 아이콘과 텍스트로 나타난다.

Show Text 옵션을 실행 불가로 만들어 각 퍼스펙티브 아이콘이 있는 텍스트를 제거할 수 있다.

노란색 박스에 있는 아이콘은 Open Perspective 버튼이고 퍼스펙티브르 여는 두 번째 방법이다.



그림 10. Perspective Switcher Bar

 

뷰를 통해서는 다양한 리소스들의 유형을 디스플레이 하고, 리소스 유형에 접근 및 생성할 수 있다. 뷰를 사용해서 개발 작업 동안 새로운 리소스를 만들 수 있다. 기존 프로젝트, 패키지, 폴더를 선택하면 다른 위자드를 호출할 때 콘텐트를 파퓰레이트 한다.

 

예를 들어, 다음 그림에서 패키지는 기존 Java 프로젝트에서 선택되고 패키지 엘리먼트에서 콘텍스트 메뉴(오른쪽 클릭) > New > Class를 선택한다. 결과로 생긴 New Java Class 위자드에는 Source FolderPackage엔트리가 있다.



그림 11. 선택을 통해 위자드 엔트리 채우기

 

작업할 퍼스펙티브를 선택했다면 뷰를 드래그/드롭 하여 Workbench의 다른 위치에 둔다.

뷰를 드래그/드롭 하면 커서는 모양을 바꿔 뷰가 현재 뷰를 오버레이 할 것인지 아니면 두 개의 기존 뷰들 사이에 삽입할 것인지를 나타낸다.

오버레이 된 두 개의 뷰들은 스택이다. 두 개의 기존 뷰들 사이에 삽입된 뷰는 dock이다.

커서가 파일 폴더 아이콘처럼 보이면 뷰를 쌓고, 검은색 확살표가 되면 뷰를 도킹(docking)한다. chevron >> symbol 밑에 있는 우측 상단 코너에 있는 숫자에 주목하라.

이는 해당 뷰 밑에 쌓인(stack) 뷰의 수를 가리킨다. 이것을 클릭하면 뷰 리스트가 나온다.

다음 그림에서 Palette 뷰는 왼편에 Page Data 뷰 위에 도킹되고 Palette 뷰는 오른편에 Page Data 뷰에 쌓인다.



그림 12. View Actions

 

현재 뷰를 이동하는 것 외에도, 메인 메뉴 바에서 Window > Show View를 선택하면 활성 퍼스펙티브에 뷰를 추가할 수 있다. 퍼스펙티브를 커스터마이징 한 후에 이를 새로운 퍼스펙티브로 저장하거나 Application Developer 디폴트 퍼스펙티브로 저장한다. Application Developer에 있는 디폴트 퍼스펙티브를 커스터마이징은 물론 겹쳐 쓰기가 가능하다. 디폴트 퍼스펙티브의 커스터마이징 기능을 사용하는 것에 대해 걱정할 필요가 없다. Workbench 프레퍼런스 설정을 통해 언제든지 디폴트 퍼스펙티브의 원래 설정으로 돌아갈 수 있다. 현재 활성 퍼스펙티브의 변경 사항이나 수정 사항을 없애려면 Window > Reset Perspective를 선택하여 현재 변경 사항들을 없앤다.




Fast Views

뷰를 숨기지만 닫지 않거나 퍼스펙티브에서 없애려면 Fast View를 만든다. Fast views는 숨겨진 뷰이기 때문에 퍼스펙티브 윈도우에 공간을 차지하지 않는다. Fast View를 만드는 두 가지 방법이 있다:

  1. 원하는 뷰의 타이틀 바를 왼쪽 클릭한다. 마우스 버튼을 계속 누른다.
  2. 뷰를 Shortcut으로 드래그하고 마우스 버튼을 푼다. 기본적으로 Shortcut 바는 Workbench의 좌측 하단 코너에 있다.


그림 13. Shortcut bar

 

뷰의 타이틀 바를 오른쪽 클릭하고 콘텍스트 메뉴에서 Fast View를 선택한다.



그림 14. Fast View 메뉴

 

Workbench 뷰에서 Fast View를 만들었다면 Fast View 아이콘을 클릭하면 된다. 이를 클릭할 때 마다 뷰를 숨기고 복원하는 토글 스위치로서 작동한다.



중요한 뷰

이전 WebSphere Studio Application Developer 사용자들은 태스크에 따라 두 개의 뷰를 사용했던 것을 기억할 것이다. 바로 J2EE Hierarchy 뷰와 Project Navigator 뷰이다. 주요한 사용상의 문제는 이러한 뷰들을 새로운 Project Explorer 뷰로 결합하면서 해결되었다. Project Explorer 뷰는 모든 프로젝트 리소스들에 대해 통합된 뷰를 제공한다.



그림 15. Project Explorer 뷰
Project Explorer 뷰에 대하여:
  • 프로젝트 폴더는 J2EE 유형에 따라 구성되고 자바 프로젝트는 Other Projects 폴더 밑에 저장된다.
  • EJB Projects의 Enterprise JavaBean (EJB) 컴포넌트는 EJB 전개 디스크립터 엘리먼트를 확대하면 볼 수 있다.
  • EJB 소스와 생성된 전개 코드는 Project Explorer의 ejbModule 폴더 밑에 있다.
  • J2EE Web 리소스들은 웹 전개 디스크립터를 확장하면 볼 수 있다.
  • Dynamic Web Projects에서, 개발자의 자바 서블릿, 필터, 유틸리티 소스 코드는 Java Resources 엘리먼트를 확장하면 볼 수 있다
  • Dynamic Web Projects에서 HTML 파일, JSP, 웹 전개 디스크립터는 WebContent 폴더에 있는 디렉토리에서 개발자들이 만든다. Java Resources 엘리먼트에서 컴파일 된 코드는 Workbench에 의해 자동으로 WebContent 폴더로 복사된다. 기본적으로 WebContent 폴더는 애플리케이션 서버에 퍼블리시 되어야 하는 웹 콘텐트를 나타낸다.
  • Struts 리소스를 볼 수 있는 Struts 엘리먼트가 있다.


 

 

Snippets 뷰는 재사용 가능한 프로그래밍 객체들을 유형 별로 범주화 한다. 개발자들은 자바 코드나 웹 리소스를 개발하면서 이를 사용할 수 있다. Snippets 뷰에는 EGL, EJB components, J2C, Web Service, WebSphere PMEs, JSP, XSL, Portlet, Portal 같은 사전에 정의된 드로어들이 있다. 이러한 드로어에는 재사용 가능한 객체들이 포함되어 있을 뿐만 아니라 "Call an EJB create method" 같은 것들이 구현되어 Service Locator 패턴 같은 잘 알려진 디자인 패턴을 사용할 수 있다.



그림 16. Snippets 뷰

 

Struts, Faces, 일반 JSP를 개발할 때 Page Data 뷰를 이용하면 편리하다. Page Data 뷰는 애플리케이션, 세션, 요청, 페이지 객체들(각각 (applicationScope, sessionScope, requestScope, param)을 나타내는 표준 스크립팅 변수들로 액세스 가능하다.



그림 17. Page Data 뷰
JSP 파일 유형에 따른 기타 Page Data 객체들:
  • JavaBeans
  • Session beans
  • Web Services
  • Relational Records and Relational Record Lists
  • Portlet data objects
  • Struts Form Beans
  • EGL data items and records


 

 

Palette 뷰는 JSP와 HTML 파일의 콘텐트를 만들 때 도움이 된다. 드로어를 확장하면 Page Designer 같은 에디터를 드래그/드롭 할 수 있는 아이템을 찾을 수 있다.



그림 18. Palette 뷰

Properties 뷰에서 선택된 엘리먼트의 필요 속성과 선택적 속성을 Page Designer 같은 에디터에서 설정할 수 있다.



그림 19. Properties 뷰

 

Quick Edit 뷰는 Page Designer와 통합되어 짧은 스크립트를 HTML과 JSP 파일에 추가할 수 있다. JSP 페이지에 있는 버튼 태그를 선택하면 클릭 이벤트를 버튼과 제휴시키고 여기에 스크립트를 추가할 수 있다. 또한 JavaServer Faces 기능과도 통합되어 Faces Component JSP와 제휴된 페이지코드 클래스에 코드를 추가할 수 있다.



그림 20. Quick Edit 뷰

 

Workbench 프레퍼런스

이제 여러분의 필요에 맞는 개발 환경을 설정하는 방법에 대해 논해보자. Workbench 기능과 디폴트 작동은 Workbench Preferences 윈도우를 통해 수정될 수 있다. Window >를 선택하면 메인 메뉴 바에서 Workbench 프레퍼런스 다이얼로그에 액세스 할 수 있다. .



그림 21. Workbench 프레퍼런스

 

본 튜토리얼은 Application Developer의 Workbench 기초에 초점을 맞추기 때문에 Preferences 윈도우는 Workbench 섹션을 확장한 것으로 보면 된다. Build automatically 옵션이 기본적으로 실행된다. 리소스가 변경될 때 마다 Workbench는 점증적인 구현을 자동으로 실행한다. 또한 워크스페이스 저장 간격이 있어서 워크스페이스의 상태가 디스크에 자동으로 저장되는 빈도수를 나타낸다. 큰 프로젝트를 개발하고 있다면 이러한 옵션들을 완성하는데 시간과 리소스가 많이 든다. Workbench 프레퍼런스 섹션을 선택하고 F1 키를 누르면 Workbench 프레퍼런스 섹션의 Help System 콘텐츠가 디스플레이 된다. 자신의 프레퍼런스 설정을 선택할 때 필요한 상세 설명들이 디스플레이 된다. F1 키는 Application Developer의 많은 기능들에 대해 이를 실행한다.

 

프레퍼런스

Appearance
Workbench의 모양을 관리한다. 뷰 탭과 에디터 탭의 위치, 퍼스펙티브 스위처의 위치 등을 조정한다.
Capabilities
Workbench 기능들을 실행한다.
Colors and Fonts
Workbench 뷰와 데이터 타이틀 텍스트, 에디터와 콘솔 텍스트, 콘솔 아웃풋 텍스트 등의 기본 색상과 폰트를 변경한다.
Compare/Patch
리소스들을 비교하고 패치(픽스)를 코드에 적용할 때 옵션들을 관리한다.
Editors
기본 텍스트 파일 인코딩, 에디터의 주석의 색상과 위치, QuickDiff 설정, 라인 넘버 작동, 기타 텍스트 에디터 기능들을 결정한다.
File Associations
Workbench에서 인식된 파일 유형들을 추가 또는 제거하고 에디터를 파일 유형 리스트에 있는 파일 유형들과 연결시킨다.
Color and Fonts
폰트와 색상을 관리한다. Eclipse 컴포넌트에서 사용된다.
Keys
키 스트로크와 키 시퀀스를 커스터마이징 하여 특정 명령어를 호출한다.
Label Decorations
레이블이나 아이콘을 수정하여 아이템에 대한 추가 정보를 보여준다.
Local History
히스토리에서 관리될 파일 저장 일수, 파일 당 엔트리 수, 최대 파일 사이즈 등을 설정한다.
Perspectives
퍼스펙티브가 새로운 윈도우에서 열리는지, 새로운 뷰가 윈도우에서 열리는지 아니면 Fast View로서 열리는지, 새로운 프로젝트를 생성할 때 적절한 퍼스펙티브로 전환되는지 등을 관리한다.
Search
사용자가 검색용 프레퍼런스를 설정할 수 있다.
Startup and Shutdown
시작하는 동안 워크스페이스에 프롬프트 할 것인지 Workbench 시작 시 플러그인을 자동으로 활성화 시킬 것인지를 선택할 수 있다.

반입과 반출 위자드

Application Developer에는 다양한 개발 태스크에 도움이 되는 반입과 반출 위자드가 있다. 드래그/드롭 이나 카피/페이스트를 사용하여 파일을 반입하기는 운영 체계 지원 여부에 달려있다. 여러분이 사용하고 있는 플랫폼에서 지원되지 않으면 반입 위자드를 사용할 수 있다. 본 튜토리얼에서는 보다 유용한 위자드를 소개하겠다. 메인 메뉴 바에서 File > ImportFile > Export를 선택하여 위자드에 액세스 한다.

App Client JAR file
J2EE 애플리케이션 클라이언트 프로젝트(전개 디스크립터 포함)는 JAR 파일로서 전개된다. 위자드는 J2EE 애플리케이션 클라이언트 프로젝트 JAR 파일을 반출하거나 JAR 파일로 전개된 J2EE 애플리케이션 클라이언트를 반입한다. (아래 Zip 옵션 참조)
EAR file
기존 J2EE 엔터프라이즈 애플리케이션 아카이브 파일은 이 옵션을 사용하여 워크스페이스로 반입 또는 반출된다. EAR 파일을 반입한 후에 Project Explorer 뷰를 사용하여, 압축된 J2EE 프로젝트 유형을 검색한다.
EJB JAR file
EJB 프로젝트는 JAR 파일로서 전개된다. 이 위자드는 JAR 파일로 전개되었던 엔터프라이즈 빈 프로젝트를 반입하거나 EJB JAR 파일로서 개발했던 EJB 프로젝트를 반출할 수 있다.
WAR file
웹 아카이브 파일 프로젝트는 WAR 파일로서 전개된다. 반입 위자드는 WAR 파일로서 전개된 동적 웹 프로젝트를 엔터프라이즈 애플리케이션 프로젝트로 반입할 수 있다. 반입 위자드는 콘텍스트 루트를 프롬프트 한다. 동적 웹 프로젝트를 WAR 파일로서 방출할 수 있다.
RAR file
Java 2 Connectors는 리소스 아카이브 파일로 전개된다. RAR 파일을 반출하거나 RAR 파일로 전개된 커넥터 프로젝트를 반입할 수 있다.
Existing Project into Workspace
WebSphere Application Developer version 5.1.X로 생성된 프로젝트를 반입하는데 사용된다. 또한 이전에 워크스페이스에서 삭제된 프로젝트를 추가하는데도 사용된다. (파일 시스템이 아닌 워크스페이스에서 프로젝트를 삭제할 수 있다. Workbench 리소스를 소비하지 않도록 하기 위해서이다.) Workbench 메타데이터 디렉토리가 오염되었다고 생각한다면 Workbench를 닫고, 워크스페이스의 메타데이터 디렉토리를 삭제하고, 워크스페이스를 열고, 워크스페이스에 있는 각 프로젝트에 Import > Existing Project into Workspace를 사용하여 워크스페이스 메타데이터를 만들어서 복구한다.
File system
JAR 파일에서 추출하지 않고 JAR 파일을 lib 디렉토리에 복사하려면 이 옵션이 알맞다. 로컬 파일 시스템과 워크스페이스에 파일을 복사한다.
FTP
파일 전송 프로토콜을 사용하여 전체 웹 사이트를 웹 프로젝트로 전송한다. 반입의 범위를 제한하는 옵션이 있다. 웹 프로젝트를 URL로 반출할 수도 있다.
HTTP
HTTP 프로토콜을 사용하여 전체 웹 사이트를 웹 프로젝트에 전송한다. 반입의 범위를 제한하는 옵션이 있다.
Project Interchange
데이터를 다른 개발자들과 공유하는 훌륭한 대안이다. 워크스페이스에서 콘텐트를 얻을 뿐만 아니라 이와 관련된 메타데이터도 얻는다.
Zip file
아카이브 파일에서 파일을 반입 및 반출한다. ZIP 파일과 JAR 파일 모두 적용된다. 반출 위자드는 반출 ZIP 파일 옵션과 개별 반출 JAR 파일 옵션을 갖고 있다.

Workbench 프레퍼런스들 중 하나를 살펴보자. 다음 그림은 선택된 프레퍼런스를 보여주고 있다. 웹 퍼스펙티브가 선택되었다는 것에 주목하라. Make Default를 클릭하면 웹 퍼스펙티브는 디폴트 퍼스펙티브가 된다. 다른 퍼스펙티브를 선택하고 Reset 버튼을 선택하면 그 퍼스펙티브는 커스터마이징 한 것을 잃는다. 이는 퍼스펙티브의 메인 메뉴 바에서 Window > Reset Perspective를 선택하는 것과 같다. Restore Defaults 버튼은 모든모든 퍼스펙티브들을 Application Developer 제품 기본으로 재설정한다. 이 옵션은 Window > Save Perspective As... 옵션을 사용하여 겹쳐 쓰여졌던 빌트인 퍼스펙티브에만 적용된다. 좌측 하단 코너의 Import와 Export 버튼을 사용해서 커스터마이징 된 Application Developer 프레퍼런스를 다른 개발자들과 공유할 수 있다.



그림 22. Perspective Preferences

 

Help System

도움말에서는 제품 문서를 검색하고, 검색 결과를 보고, 문서를 프린트 할 수 있다. 메인 메뉴 바에서 Help > Help Contents를 선택하여 도움말 브라우저를 호출한다. 도움말은 지속적으로 업데이트 및 향상되어 Application Developer 제품 소프트웨어를 업데이트 할 때 업데이트 된다.

도움말을 적절하게 사용하는 방법을 배우면 검색 결과들을 거르는데 드는 시간을 줄일 수 있다. 예를 들어, Search 브라우저의 상단에 있는 Search 필드에 많은 용어들을 타이핑 하면 이 단어들 사이에 AND가 있는 것으로 간주된다. 특정 결과를 배제하려면 필터링 하고 싶은 단어 앞에 NOT을 타이핑 한다.



그림 23. Search Keywords

 

위 검색 브라우저(빨간색 박스)에서 검색 단어는 project이지만 ejb라는 단어가 포함되지 않은 검색 결과를 요청하고 있다. 이러한 검색은 대소문자 구분이 되지 않으므로 EJB라는 용어를 배제한다. 검색 시 사용할 수 있는 기타 키워드로는 AND, OR, ? (싱글 캐릭터 와일드카드), * (멀티 캐릭터 와일드카드) 등이 있다. 구문(phrase)으로 되어있는 단어에는 물음표를 사용하라.

또한 특정 검색 결과(위 노란색 박스) 위에 커서를 놓을 때 나타나는 도움말을 보면 검색 결과의 위치가 나타난다. 어떤 토픽을 찾고 싶은지, 아니면 적어도 어떤 토픽을 찾고 싶지 않은지를 알 경우에는Search 텍스트 엔트리 필드 옆에 있는 Search scope을 사용할 수 있다. 다음 그림에서 Search scope을 클릭했고, 그 다음에 Search only the following topics 라디오 버튼을, 그리고 New를 클릭했다. 일단 토픽 범위가 만들어지면 이것을 사용하여 검색을 제한할 수 있다.



그림 24. Search scope



그림 25. Edit search list

 

Local History

Application Developer Workbench는 리소스를 저장할 때마다 로컬에서 개발된 리소스의 카피들을 관리한다. 이전 리소스 카피로 돌아가거나 현재 리소스를 이전 것과 비교할 때 유용하다. 이 기능은 Workbench > Local History에서 사용할 수 있다. 이 설정에는 Days to keep files, Entries per file, Maximum file size (MB)가 포함된다. 파일이 최대 파일 크기를 초과하면 초과분에 대한 히스토리 파일은 저장되지 않는다.



그림 26. History Preferences

 

버전 제어 시스템 서버와 이 기능으로 액세스 하는 것은 중복적이기 때문에 버전 제어 시스템으로 체크인 되지 않았던 로컬 카피를 변경하거나 비교하려면 파일을 선택하고, 컨텍스트 메뉴에서 Compare with > Local History 또는 Replace With > Local History를 선택한다. 이렇게 하면 여러분이 수행했던 모든 파일들이 있는 윈도우가 나타난다. Local History 프레퍼런스에 지정된 것 까지가 한계이다.



그림 27. Local History

 

로컬 파일 시스템에 저장된 리소스 버전이 있고, 각자의 타임 스탬프, Workbench 프레퍼런스에 지정된 날의 수 까지 노란색 업다운 화살표를 사용하여 파일과 이것의 로컬 히스토리 카피 까지 검색할 수 있다. Project Explorer에서 두 개의 파일을 선택하면 Compare With > Each Other 또한 선택할 수 있다. 이는 비슷한 파일에 유용하다.

로컬 히스토리는 버전 제어 시스템에 저장하지 않았던 리소스를 우연히 삭제했을 때에도 유용하다. 이를 포함하고 있는 폴더나 프로젝트를 선택하고 콘텍스트 메뉴에서 Restore from Local History...를 선택한다. 여러 파일들을 삭제했다면 복원할 파일들을 선택할 수 있다.



그림 28. Restore from Local History

 

결론

본 튜토리얼에서는 뷰와 퍼스펙트가 무엇인지, 퍼스펙티브를 어떻게 커스터마이징 하는지, Application Developer 프레퍼런스 설정, 반입과 반출 위자드, 로컬 히스토리와 검색 기능들에 대해 살펴보았다. Test 255: Developing with IBM Rational Application Developer for WebSphere Software V6을 준비하는데 필요한 것들을 이해할 수 있으리라 믿는다. 하지만 무엇보다도 제품을 직접 사용해보는 것이 최상의 방법이다.

본 튜토리얼이 도움이 되었기 바라며 인증 시험을 준비하는 여러분에게 행운을 빈다.

참고자료


필자소개

Bobby McChesney는 IBM Application Development 팀의 교육 전문가이다. WebSphere Application Server Version 6와 Rational Application Developer for WebSphere® Software 과정을 전문으로 하고 있다. 또한 Java Servlet, JavaServer Pages, Struts, JavaServer Faces, Enterprise JavaBeans 프로그래밍 과정도 강의하고 있다. 현재 그는 WebSphere Administrative 콘솔 개발 팀의 개발자로 일하고 있다.

 

 

출처 : 한국IBM DeveloperWorks

 
블로그 이미지

시반

시반(詩伴)이란 함께 시를 짓는 벗이란 뜻을 가지고 있습니다. 함께 나눌수 있는 그런 공간이길 바라며...

카테고리

분류 전체보기 (233)
개발 이야기 (73)
WEB2.0 (57)
DB2 (24)
MySQL (6)
오라클 (26)
기타 (44)
취미 (0)
잡담 (2)