'IBM developerWorks@'에 해당되는 글 21

  1. 2011.05.29 DB2
  2. 2011.01.01 [IBM dWs] Java SE 6, Ecipse, Ant 를 이용한 간단한 웹 서비스
  3. 2010.08.17 FindBugs
  4. 2010.06.02 단위 테스트에서 외부 자원을 대체하기
  5. 2010.04.13 JUnit4
  6. 2010.04.12 Java XPath API
  7. 2010.01.31 유닉스에 톰캣 컴파일해서 설치하기
  8. 2009.10.15 Getting started with JavaServer Faces 1.2, Part 1
  9. 2009.08.23 Eclipse Galileo + Subversive
  10. 2009.08.09 스프링 2와 JPA 시작하기 - 에러해결
  11. 2009.08.08 Spring 2 + JPA + Tomcat
  12. 2009.07.26 Eclipse, WTP, Derby로 웹 애플리케이션 구현하기
  13. 2009.07.26 Java EE 5 스펙에서 JSTL 구현
  14. 2009.07.25 [IBM dWs] SchemaSpy - 데이터베이스 문서화하기
  15. 2009.07.24 Apache Derby
  16. 2009.07.23 Eclipse에서 OpenJPA 사용하기
  17. 2009.07.07 Eclipse에서 Ant사용하기
  18. 2009.05.04 [IBM dWs] Ajax에서 XML 처리하기
  19. 2009.04.10 [IBM dWs] Grails 마스터하기: GORM: 재미있는 이름, 진지한 기술
  20. 2009.03.06 [IBM dWs] Grails 마스터하기: 첫 번째 Grails 애플리케이션 구축하기
  21. 2009.02.21 Eclipse 3.4 Ganymede

DB2

[IBM dWs] Java SE 6, Ecipse, Ant 를 이용한 간단한 웹 서비스

- Eclipse와 Java SE 6을 사용하여 독립형 웹 서비스 개발하기, Part 1: 웹 서비스 서버 애플리케이션
Create stand-alone Web services applications with Eclipse and Java SE 6, Part 1: The Web service server application
- Eclipse와 Java SE 6을 사용하여 독립형 웹 서비스 개발하기: Part 2: 웹 서비스 클라이언트 응용프로그램
Create stand-alone Web services applications with Eclipse and Java SE 6: Part 2: The Web service client application

- Java SE 6, Ecipse, Ant 를 이용해서 간단한 웹서비스를 구현하고 모니터링한다.

Java SE 6 JDK 설치
Eclipse JRE 설정

서버
Ant 를 실행시키면 com.myfirst.wsServer.jaxws 가 생김 서버를 실행시키고, Internal Web Browser 로 http://localhost:8080/wsServerExample?wsdl 을 입력하면 WSDL 을 볼 수 있다.

Eclipse 의 Web Services Explorer 를 이용해서 웹서비스를 테스트해 볼 수 있다.
Java EE Perspective 에서 Run - Launch the Web Services Explorer 을 선택하고
http://localhost:8080/wsServerExample?wsdl 를 호출해서 getGreeting 을 직접 호출해 본다.

클라이언트
wsimport 태스크를 실행하면 WSDL 를 참조해서 JAX-WS 관련 스텁?이 생성된다.
  • wsgen은 서비스 엔드 포인트 클래스를 읽고서 웹 서비스 전개 및 호출에 필요한 모든 아티팩트를 생성한다.
  • wsimport는 WSDL을 읽고서 웹 서비스 개발, 전개 및 호출에 필요한 모든 아티팩트를 생성한다.

- Eclipse TCP/IP Monitor 를 이용해서 모니터링을 할 수 있다.

FindBugs

- http://findbugs.sourceforge.net/

- 어플리케이션으로 직접 실행시키기
findbugs-1.3.9> java -jar lib/findbugs.jar
- or -
findbugs-1.3.9/bin/findbugs.bat 실행

프로젝트를 만들고 클래스, 부가적으로 사용되는 클래스, 소스 위치를 지정한다.

특정 패키지의 클래스만 분석하는 경우 패키지를 지정하고 소스는 루트 디렉토리로 지정해야 한다.
(소스도 특정 패키지로 지정하면 제대로 안나옴)

찾지 못한 클래스는 콘솔에 나온다.
Auxillary class locations에 포함시켜준다.

- 이클립스 플러그인
개발중에 사용하면 좋을거 같다.
플러그인이 싫다면 GUI 를 이용해서 확인하도록 할 것.

- Ant 로 실행시키기
findbugs.home=D:/resources/programs/java/findbugs-1.3.9/

devlib/에 findbugs-ant.jar를 넣어둔다.[각주:1]

  1. 2012-03-18 findbugs/lib/ 를 클래스패스에 포함시켰으므로 이 작업은 더이상 필요없다. [본문으로]

단위 테스트에서 외부 자원을 대체하기

테스트를 할때 데이터베이스 연결, 네트워크상에 존재하는 자원 참조등 외부 자원을 사용해야 하는 경우에는 단위 테스트를 하기가 쉽지 않다.
단위 테스트는 테스트 대상이 제대로 동작하는지 검사하는 것이 목적이므로 여기에 집중하기 위해 외부 자원, 의존 클래스를 Mock 객체로 대체한다.

- 참고
Mock Object 를 사용해서 쉽게 테스트 하기
Using mock objects for complex unit tests

- 우리가 일반적으로 작성하는 DAO
public class DatabaseExample {
    public String readAbc(Connection con, String tableName) throws SQLException{
        int resultNum = 1;
        Statement st = con.createStatement(); //대상(#1)
        ResultSet rs = st.executeQuery("SELECT empno, empid FROM " + tableName); //대상(#1)
        String result = "";
        
        while(rs.next()){ //대상(#2)
            int no = rs.getInt(1); //대상(#2)
            String id = rs.getString(2); //대상(#2)
            result += resultNum++ + ":" + no + "," + id + "\n";
        }
        return result;
    }
}

- 데이터베이스없이 테스트가 가능하도록 Mock객체를 만든다.(대상 #1)
public class MockConnection implements Connection {
    ...
    @Override
    public Statement createStatement() throws SQLException {
        return new MockStatement();
    }
}

public class MockStatement implements Statement {
    ...
    @Override
    public ResultSet executeQuery(String sql) throws SQLException {
        return new MockResultSet();
    }
}

public class MockResultSet implements ResultSet

- 테스트 코드를 작성한다.
public class DatabaseExampleTest {
    @Test
    public void testReadAbc() throws SQLException {
        Connection con = new MockConnection();
        DatabaseExample example = new DatabaseExample();
        assertEquals("1:101,John\n", example.readAbc(con, "TestTable"));
    }
}

- 결과는 테스트 실패다.
org.junit.ComparisonFailure: expected:<[1:101,John]> but was:<[]>
MockResultSet.next()가 제대로 구현되지 않아서 false를 리턴해서 결과적으로 테스트가 실패했다.

- 테스트를 다시 작성한다.
public class DatabaseExampleTest {
    @Test
    public void testReadAbc() throws SQLException {
        
        MockResultSet rs = new MockResultSet();
        rs.addRow(new Object[]{101, "John"});
        
        MockStatement st = new MockStatement();
        st.setResultSet(rs);
        
        MockConnection con = new MockConnection();
        con.setStatement(st);
        
        DatabaseExample example = new DatabaseExample();
        assertEquals("1:101,John\n", example.readAbc(con, "TestTable"));
    }
}

- Mock 객체를 다시 작성한다.(대상 #2)
외부에서 입력한 값에 따라 결과를 반환하도록 구현한다.
public class MockResultSet implements ResultSet {

	List<Object[]> list;
	Object[] currentRow;
	int index = -1;
	
	public MockResultSet(){
		list = new ArrayList<Object[] >();
	}
	
	public void addRow(Object[] row){
		list.add(row);
	}

	@Override
	public boolean next() throws SQLException {
		if(++index < list.size()){
			currentRow = list.get(index);
			return true;
		}else{
			return false;
		}
	}
	
	@Override
	public String getString(int columnIndex) throws SQLException {
		return currentRow[columnIndex - 1].toString();
	}
	
	@Override
	public int getInt(int columnIndex) throws SQLException{
		return ((Number)currentRow[columnIndex - 1]).intValue();
	}
	...
}

- 필드로 뺄수 있는 부분은 빼고 setUp()를 활용한다.
결과가 여러 줄을 리턴하는 경우 테스트도 추가한다.


JUnit4

JUnit 4로 뛰어들기
Andrew Glover

기존 버전과 차이점을 비교해서 잘 보여주고 있어서 기존 JUnit 사용법도 배울수 있다.

- 기존 버전의 문제
테스트 메서드는 test라는 단어로 시작해야 한다.
테스트를 포함하는 클래스는 TestCase를 상속받아야 한다.

JUnit4
- JUnit 4에서는 테스트 메서드에 @Test 를 추가한다.
- import static 을 이용해서 org.junit.Assert.assert* 메서드를 사용한다.

- 예외 테스트
예전 버전 JUnit4 - TestSuite - 전/후처리
setUpBeforeClass
setUp
method1
tearDown
setUp
method2
tearDown
tearDownAfterClass

- 매개변수 테스트
1. 매개변수를 사용하지 않는 일반 테스트를 작성한다. 2. Collection 유형을 반환하는 static 피더 메서드를 작성하고 @Parameters 주석으로 표시한다. 3. 첫 번째 단계에서 정의한 일반 메서드에 필요한 매개변수 유형에 대한 클래스 멤버를 만든다. 4. 이러한 매개변수 유형을 사용하고 이를 세 번째 단계에서 정의한 클래스 멤버와 연결하는 생성자를 만든다. 5. @RunWith 주석을 통해 Parameterized 클래스와 함께 실행할 테스트 케이스를 지정한다. 테스트를 실행하면 verifyGoodZipCode() 테스트 메서드가 regExValues() 데이터 피더 메서드에 정의된 각 값에 대해 한번씩 네번 실행된다.

- timeout, @Ignore, 명령행에서 실행, ant에서 사용, 배열을 검사하는 assertEquals() 추가

Java XPath API

- http://www.ibm.com/developerworks/kr/library/x-javaxpathapi.html

- Java 5에서 javax.xml.xpath패키지를 도입

- XML에서 저자가 Neal Stephenson인 모든 책을 찾으라는 XPath 쿼리는 다음과 같다.
//book[author="Neal Stephenson"]/title

유닉스에 톰캣 컴파일해서 설치하기

- 유닉스에서 개발 웹 서버 설치, 설정하기
- Install and configure a development Web server in UNIX

- 시스템 요구 사항
  • 하드디스크 용량 10GB, 메모리 최소 512MB
  • 웹 브라우저
  • JRE 5.0 이상: Tomcat 6에서는 해당 JRE가 필요
  • C 컴파일러 : 솔라리스나 IBM AIX의 기본 설치본에는 이런 컴파일러가 없다. Using the GNU C/C++ compiler on AIX를 참고한다.
  • 파일 추출 도구 : 서버에서 파일을 적절히 추출하려면 gunzip, tar, bzcat, 그리고 가능하다면 GNU make와 tar(gmake, gtar로서 GNU 사이트에서 다운로드 가능)가 필요하다.
    서버에서 도구들이 제대로 동작하는지 체크해 보려면 다음 명령어를 실행해본다.
    # cd /usr
    # find . –name *.tar //(repeat for *make, *zip, etc.)
  • 톰캣 코드
- 유닉스와 윈도에서 톰캣 설정 차이점
  • 유닉스 서버에서는 bzcat, gunzip, tar(혹은 gtar)가 필요
  • PATH 설정
  • 기본 운영체제 파일 시스템(/var, /tmp 등)에 적절한 권한이 필요
  • ID, 그룹, 적절한 접근 권한에 대해 고려해야 함
  • GUI가 아닌 CLI
  • 윈도우는 자동화된 배치 파일 처리에 .bat을, 실행 파일에 .exe 파일을 쓴다.
  • 유닉스에서는 기본적으로는 실행 스크립트 등에 .sh나 .ksh 확장자를 사용한다.
- 경로 설정
JAVA_HOME
# export JAVA_HOME=/usr/jdk/instances/jdk1.5.0 //JRE 또는 JDK
# JAVA_HOME=/usr/bin/java; export JAVA_HOME

# echo $JAVA_HOME
/usr/jdk/instances/jdk1.5.0

CATALINA_HOME
# export CATALINA_HOME=/opt/apache-tomcat-6.0.16

- 셸 설정
홈디렉터리에 .profile 파일을 생성한다.
bash-3.00# cd ~/ (home dir)
bash-3.00# vi .profile
# /bin/sh
stty istrip
PATH=$PATH:/usr/bin:/usr/local/bin:/usr/ucb:/etc
export PATH
umask 077

export SHELL=/usr/bin/ksh
export ENV=$HOME/.kshrc
export EDITOR=vi
export FCEDIT=vi

#Tomcat specific PATHs
export JAVA_HOME=/usr/jdk/instances/jdk1.5.0
export CATALINA_HOME=/opt/apache-tomcat-6.0.16

bash-3.00# PATH=/usr/ccs/bin:$PATH; export PATH (for make cmd)
bash-3.00# PATH=/usr/sfw/bin:$PATH; export PATH

- 사용자와 그룹
여러 사용자가 서버를 사용하게 된다면 당연히 각기 다른 사용자가 다양한 도구와 파일 시스템에 접근할 수 있도록 허용할 사용자와 그룹 권한을 설정하고 싶을 것이다. root가 아닌 사용자로 톰캣을 설치하여 동작시키려 한다면 이 또한 필수다(대부분의 실 서비스 환경에서 추천되는 방식이다).

# /usr/sbin/groupadd -g {구체적인 gid 명시. 명시하지 않으면 OS가 gid를 알아서 할당해줄 것이다.} {그룹 이름}
# /usr/sbin/groupadd -g 10004 tomcatgroup

# /usr/sbin/useradd -d {사용자 홈 디렉터리} -g {사용자가 속한 주 그룹} -u {구체적인 UID 명시. 이 란은 비워둘 수 있다. 명시하지 않으면 운영체제가 UID를 알아서 할당해줄 것이다.) -s {해당 사용자에 대한 기본 셸} -c "{사용자에 대한 상세 정보 명기}" {사용자 이름}
# /usr/sbin/useradd -d /export/home/tomcat -g tomcatgroup -u 10010 -s /bin/ksh -c "Main Tomcat Administrative User" tomcat

- 서버 설치 파일 다운로드, 추출하기
//파일을 /opt 디렉터리 아래로 옮긴다(/opt 디렉토리는 대부분의 신규 소프트웨어가 설치되는 디렉터리다).
# mv *tar.gz /opt
# ls -ltr /opt

//권한 설정하기
# cd /opt
# chmod +x *gz //same as chmod 775
# umask 007 //사용자가 770 권한을 갖고 신규 파일을 생성할 수 있도록 한다. chmod를 역으로 생각해 보라.

//설치 파일 추출하기
# gunzip *.gz
# tar -xvf *.tar
# ls -latr

# rm *.exe
# rm *.bat

- 서버 설정, 컴파일
# cd $CATALINA_HOME/bin
# ./configure --with-java=/usr/java
//- or -
# export JAVA_HOME
# ./configure

//코드 컴파일하기
# gunzip jsvc.tar.gz
# pwd
/opt/apache-tomcat-6.0.16/bin
# tar -xvf jsvc.tar
# gmake //gmake가 위치한 경로가 PATH에 있는지 확인하기 바란다(예를 들어 ./sfw/bin/).
//톰캣 사이트에서는 FreeBSD 시스템의 자체 BSD make 명령어 대신 GNU make(gmake)를 사용해야 한다고 언급하고 있다.

# chmod 775 jsvc[각주:1]
# cp jsvc ..
# cd ..

- 서버 시작[각주:2]
# cd $CATALINA_HOME/bin
# ./startup.sh
# cd ../logs

# tail -50 catalina.out

- 시작 데몬[각주:3] 구동하기
#./jsvc \
–home /usr/jdk/instances/jdk1.5.0 \
–Dcatalina.home=/opt/apache-tomcat-6.0.16 \
-cp ./bin/bootstrap.jar \
-outfile ./logs/catalina.out \
-errfile ./logs/catalina.err \
org.apache.catalina.startup.Bootstrap
//root가 아닌 사용자로 구동하려면 -user 옵션을 사용
//특정 .pid 파일 위치를 명시하려면 -pid 옵션을 사용

# ./jsvc -help

- 톰캣 설치 테스트하기
기본 톰캣은 http 포트 8080에 내부 HTTP 서버를 설치한다(Coyote HTTP/1.1).

- 톰캣 웹 애플리케이션 매니저에 특정 사용자 접근 허용하기
tomcat-users.xml에 role과 user 추가
//보안을 위해 tomcat-user.xml 파일을 파일 소유자만 접근할 수 있도록 제한한다.
# chmod 600 tomcat-users.xml

* 엔터프라이즈 웹 아키텍처 대 독립형(stand-alone) 웹 아키텍처에 대한 비교
  1. jsvc 는 런처(launcher) 프로세스, 통제(controller) 프로세스, 통제되는(controlled) 프로세스 이렇게 세 개의 프로세스를 사용한다. 통제되는 프로세스는 주 자바 쓰레드다. 이 주 자바 가상 머신(JVM)이 비정상적으로 종료되면 통제 프로세스, 즉 컨트롤러 다음에 재시작한다. jsvc는 데몬 프로세스이므로 root로 시작해야 한다. 인자값으로 -user를 주면 root 권한이 없는 사용자로도 동작시킬 수 있다. [본문으로]
  2. LifecycleListeners를 구현하여 시작 프로세스를 입맛에 맞게 고칠 수도 있다. [본문으로]
  3. 데몬은 비 대화형(non-interactive) 서버 애플리케이션으로서 명시한 시그널(signal)들을 운영체제가 통제하게 된다. 윈도에서 서비스를 떠올려보자. 윈도의 서비스는 서버 애플리케이션의 정상적인 셧다운을 위해 제공된다. 운영체제는 셧다운이 절박한 상황인 경우 서버 애플리케이션에게 이를 고지하게 되고 애플리케이션은 수행중인 과정을 끝내기 전에 어떤 작업을 수행할 수 있도록 할 여지가 생기게 된다. [본문으로]

Getting started with JavaServer Faces 1.2, Part 1

JSF 1.2 시작하기, Part 1
Getting started with JavaServer Faces 1.2, Part 1

- Dynamic Web Project에 JSF 예제 돌리기
  1. 필요한 라이브러리를 PROJECT/WEB/WEB-INF/lib/에 추가한다.
    1. C:\Program Files\glassfish-v3-prelude\glassfish\modules\web\jsf-impl.jar
    2. C:\Program Files\glassfish-v3-prelude\glassfish\modules\jsf-api.jar
    3. jstl.jar
  2. 환경설정파일을 추가, 수정한다.
    1. faces-config.xml
    2. web.xml
  3. 예제 소스를 추가한다.
    1. /index.jsp
    2. /pages/calculator.jsp
    3. src/com/arcmind/jsfquickstart/model/Calculator.java
  4. 브라우저로 확인한다.
- MyFaces 구현체로도 가능할거야. [todo]

[todo] 원리를 좀더 추가해야 하지 않나?

Eclipse Galileo + Subversive

- Eclipse Galileo 살펴보기
Galileo 에 포함된 프로젝트 소개 : CDT, EMF, Equinox, GEF, GMF, JDT, Mylyn, PDT, TPTP, WTP 등
(Galileo 에 대한 내용은 아님)

- Subversive 설치
Team Provider만 설치하면 될듯 ([todo] 종속적인 플러그인은 어떻게 되나?)

Connector 만 설치하면 된다고도 함.
http://www.polarion.org/projects/subversive/download/eclipse/2.0/update-site/

- 다양한 레이아웃이 있다.
Subclipse에서는 볼수 없었던 부분이다. 처음 소스형상관리를 할때 많이 고민했던 부분이었다.

- 또 다른 점
Galileo에서 추가되었는지 잘 모르겠지만 Synchronize with Repository에 단축키가 할당되어 있다.
그동안 별도로 키를 바인딩하거나 다른 방법을 썼었는데, 이거 마음에 든다.

- Compare with Each Other
Subversive, Subclipse도 가능함.
Subversive에서는 각 리비전별로 비교가 가능함.

- 참고
[리뷰] SVN 플러그인 Subversive 설치 정리

스프링 2와 JPA 시작하기 - 에러해결

통합테스트 실행시 아래와 같은 에러 발생

1.
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'employeeService' defined in class path resource [com/ibm/dw/spring2/dwspring2-service.xml]: Cannot resolve reference to bean 'entityManagerFactory' while setting bean property 'entityManagerFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [com/ibm/dw/spring2/dwspring2-service.xml]: Invocation of init method failed; nested exception is java.lang.IllegalStateException: No persistence units parsed from {classpath*:META-INF/persistence.xml}
...
Caused by: java.lang.IllegalStateException: No persistence units parsed from {classpath*:META-INF/persistence.xml}

persistence.xml 이 src/META-INF/ 에 있는지 확인한다.

2.
java.lang.IllegalArgumentException: Can not set java.lang.Object field org.springframework.test.jpa.AbstractJpaTests.shadowParent to com.ibm.dw.spring2.EmployeeServiceIntegrationTest
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:146)
...
    at org.springframework.test.jpa.AbstractJpaTests.runBare(AbstractJpaTests.java:246)
...
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)

스프링 라이브러리를 2.0 RC2 로 한다. 2.5 에서는 위와 같은 에러가 발생한다.
필요한 라이브러리는 toplink-essentials.jar, junit.jar, spring.jar, spring-mock.jar, commons-logging.jar, hsqldb.jar

AbstractJpaTests.java:246 (왜그런지...)

Spring 2 + JPA + Tomcat

- 스프링 2와 JPA 시작하기

* 도메인 분석을 수행함
* 비즈니스 객체와 서비스를 구현함
* 비즈니스 객체에 대한 단위 테스트
* 스프링 JPA를 사용해 비즈니스 객체에 데이터 접근 코드 쉽게 추가
* 스프링 DAO(Data Access Object)를 사용해 서비스 구현
* DB2® Express-C와 연동한 서비스에 대한 통합 테스트 코드 작성
* 사용자 인터페이스에 기반을 둔 스프링 Model-View-Controller(MVC)를 위한 컨트롤러 생성
* 사용자 인터페이스를 위한 뷰(view) 디자인
* 애플리케이션을 위한 배치 가능한 WAR 파일 생성
* 아파치 톰캣(Apache Tomcat) 서버에 애플리케이션을 구성하고 배치함

- 도메인 모델 분석
직원엔터티에서 주소를 분리한다.
오퍼레이션을 정의한다.
Employee.java 에서 setEmpid() 를 제거한다.(JPA 에 의해서 관리된다.)

- JPA 어노테이션에 대한 설명
Employee와 Address 인스턴스가 일대일 관계(@OneToOne(casecade=CascadeType.ALL)) 어노테이션으로 기술되어)를 맺고 있는 것을 기억하자. 이 어노테이션은 Employee 객체를 대상으로 하는 모든 엔티티 매니저 오퍼레이션이 그 객체와 관련된 Address 객체에도 영향을 준다는 것을 의미한다. 이 말은 RDBMS에 Employee 기록을 추가하는 어느 작업이든지 그에 대응하는 Address 기록도 만들어지는 것을 뜻한다. 이것은 RDBMS에서 종종 찾을 수 있는 연속되는 삭제 참조 무결성 개념의 확장된 개념이라 보면 되겠다.

- HSQLDB 이용, DB2 로 변경

- RDBMS로 수행하는 DAO 통합 테스트 작성하기

- SpringMVC

- 스프링 2를 위해 톰캣 준비하기
   1. 톰캣에 스프링 2 클래스로더 추가 : server/lib/spring-tomcat-weaver.jar, META-INF/context.xml
   2. 톰캣에 스프링 2 컨텍스트 로더 리스너(context loader listener) 추가
   3. 톰캣에 DB2 JDBC 드라이버 복사
   4. 톰캣을 위해 JNDI DB2 데이터소스 구성

- 참고
스프링 2와 JPA 시작하기 - 에러해결
Spring -JPA-Tomcat

[todo] 이거 설정만 바꾸면 다른 JPA 구현체로 바꿀수 있나?(2.0에서는 다른 구현체를 지원하지 않음. 2.5 는 에러남. 결국은 에러를 해결해야 하는데...)
[todo] 직접 해보기...금방될거야

Eclipse, WTP, Derby로 웹 애플리케이션 구현하기

http://www.ibm.com/developerworks/kr/library/dm-0509cline/
  1. Import LowFareAir.war
  2. Import derbyclient.jar, jstl.jar, standard.jar
  3. Import /data/airlinesDB/
  4. Import /devlib/derby.jar, derbynet.jar, derbyrun.jar
  5. build.xml : Derby를 서버로 구동시키는 Ant 스크립트, derby.properties
  6. web.xml 수정 : 데이터베이스 경로, 사용자/암호
  7. com.ibm.sample.DerbyDatabase.java 수정 : 데이터베이스 경로, 사용자/암호
  8. Data Source Explorer에 Derby 설정
  9. Tomcat 시작
- web.xml

Java EE 5 스펙에서 JSTL 구현

- Geronimo의 배신: GlassFish JSTL 1.2와 Apache Geronimo 2.0 통합 패키지 사용하기 (한글)

- JSF와 JSP 1.2
JSF 1.0에서는 JSTL의 EL과 비슷하게 동작하는 고유의 EL을 갖고 있으며, 이 때까지는 JSF EL과 JSTL EL은 호환성이 없었다.

- 통합 표현식 언어(Unified expression language)
자바 EE 5에서는 JSTL과 JSF의 EL이 합쳐져 JSTL과 JSF를 혼합해 쓰는 것이 가능해졌다.

- 자바 EE 5의 일부로서 EL
J2EE 1.4 스펙까지는 JSTL 구현이 필수 사항이 아니었지만 자바 EE 5 스펙에서는 JSTL 구현이 필수 사항이다.

- 제로니모와 글래스피시 JSTL
아파치 제로니모 개발자들은 자바 EE 5 구현체인 제로니모 2.0을 만들 때, JSTL 구현체를 포함해야만 했다.
통합 표현식 언어는 JSTL 구현체의 주요 요구사항이었지만, 많은 JSTL 구현체는 JSF와 함께 동작할 수 없어서 기존 구현체 중에서 선택할 수 없었다.
다행히도 제로니모 팀은 직접 JSTL과 통합 표현식 언어 구현체를 만드는 대신 썬의 글래스피시를 활용할 수 있었다.
글래스피시는 자바 EE 5 스펙을 위한 썬의 참조 구현체다.

[IBM dWs] SchemaSpy - 데이터베이스 문서화하기

- 사람을 위한 자동화: 전자동 문서화

- SchemaSpy - Graphical Database Schema Metadata Browser

- Graphviz 가 필요함.
이클립스를 사용하면 설치후 이클립스 재시작 필요
재시작하지 않으면 PATH에 추가된 Graphviz를 Ant로 실행시키지 못한다.

- Ant
- 실행 옵션
  • -s : SQL Server 2005에서는 테이블명이 dbo.TABLE로 되어 있음. dbo로 지정해야 함.
  • -i : TB.* 는 TB로 시작하는 테이블/뷰만을 대상으로 한다.
  • -cp : path 태그는 안되고 property로 해야 함. 드라이버 위치를 지정해 준다.
  • -charset : 지정하지 않으면 한글이 깨짐
- 뷰도 보임
그러나 다른 데이터베이스 개체는 안보임.

Apache Derby

- http://db.apache.org/derby/

- 더비는 임베디드되거나 서버 형태로 구동될 수 있다.

- Embedded Derby
  • jdbc:derby:testDerbyDB;create=true
  • create=true 옵션은 데이터베이스가 없는 경우 생성하도록 한다.
  • 데이터베이스명만 있는 경우 사용자 디렉토리에 데이터베이스가 생긴다.(이 경우 C:\Documents and Settings\USER\testDerbyDB)
  • /testDerbyDB 이면 C드라이브에 생성됨, 절대경로로 지정할 수도 있음.
  • org.apache.derby.jdbc.EmbeddedDriver
  • derby.jar: contains the Derby engine and the Derby Embedded JDBC driver

- Derby Network Server
  • jdbc:derby://localhost:1527/testDerbyDB;create=true
  • DERBY/bin/startNetworkServer 로 서버를 시작할 수 있다.
  • 데이터베이스는 서버를 실행시킨 디렉토리에 생성된다. Eclipse에서 Ant로 실행시키면 프로젝트 루트에 생긴다.
  • org.apache.derby.jdbc.ClientDriver
  • 클라이언트 : derbyclient.jar
  • 서버 : derbyrun.jar, derbynet.jar, derby.jar

- 참고
Apache Derby로 개발하기 -- Trifecta: Apache Derby 소개 (한글)
Derby 소개
Cloudscape FAQ (한글)
derby의 유용한 기능

Eclipse에서 OpenJPA 사용하기

- 이클립스 유로파로 웹 개발하기, Part 1: 이클립스를 위한 Java EE (한글)

- Data Source Explorer 사용하기
  • Database 접속 설정하기
  • 테이블 생성
  • SQL 실행
  • 데이터 입력하고 저장하기
- OpenJPA 설정하기

- /baseball/src/org/developerworks/baseball/Player.java

- /baseball/src/META-INF/persistence.xml
- 테스트 코드
- 필요한 라이브러리
  • openjpa-1.2.1.jar : User Libraries로 추가
  • geronimo-jpa_3.0_spec-1.0.jar : JPA 구현체
  • geronimo-jta_1.1_spec-1.1.jar
  • serp-1.13.1.jar
  • commons-collections-3.2.jar
  • commons-lang-2.1.jar
- 참고
Java Persistence API
Implementation of Java Persistence API Downloads : 이 구현체는 toplink-essentials.jar, toplink-essentials-agent.jar 임

Eclipse에서 Ant사용하기

- 이클립스를 사용한 앤트 활용법 (한글)

- 이클립스의 Ant Editor 기능
  • 코드 하이라이트(highlighting)
  • 코드 완성(code completion)
  • 접기(folding)
  • 이름 변경(renaming) : 여러 곳에 사용된 변수(?)를 한번에 수정해준다.
  • 발생한 문제 해결(marking occurrences and problems)

- 디버깅 기능

- Ant Builder
파일저장시 컴파일이 되는 것은 Java Builder 를 사용하기 때문인데, 빌더를 Ant Builder로 지정할 수도 있다.

파일 저장시 컴파일을 하고 jar파일을 생성하는 작업이 자동으로 처리되게 할 수 있다.
native2ascii를 매번 실행할 수도 있고[각주:1]

[todo] 다시 해볼것.(오늘 수정한 파일만 목록으로 만들기, 또는 별도 디렉토리에 넣기)
  1. Properties Editor를 사용하면 되긴 하지만. [본문으로]

[IBM dWs] Ajax에서 XML 처리하기

웹에서 XML 자료를 가져온 후 파이프라인을 거쳐 원하는 정보를 정해진 형식으로 추출해서 출력하는 여러 방법을 보여준다.

Ajax에서 XML 처리하기, Part 1: 네 가지 방법
Ajax에서 XML 처리하기, Part 2: Ajax와 XSLT를 이용하는 방법 두 가지 

Ajax에서 XML 처리하기, Part 2- Ajax와 XSLT를 이용하는 방법 두 가지.pdf

Ajax에서 XML 처리하기, Part 3: JSON을 사용하고 프록시 피하기


이 글에서는 간단한 Ajax 라이브러리를 만들어 사용한다.(ajax-simple.js)
미국립 기상청(NWS) 사이트에서 날씨 정보를 가져온다.

접근 방법 1. DOM 트리 탐색
웹프록시를 거쳐서 데이터를 가져온 뒤 브라우저가 DOM에서 값을 추출해서 보여준다.

- Ajax 의 XMLHttpRequest 객체는 같은 도메인으로만 요청이 가능한데 이를 해결하기 위해 웹 프록시를 사용한다.
웹 프록시는 한 서버로 보낸 요청을 다른 서버로 전달하는 방법이다.
아파치 웹 서버에서 프록시는 ProxyPass 규칙으로 구현한다.(웹 서버 구성을 바꿀 권한이 있어야 하겠지)

- DOM에서 값을 추출하기
접근 방식 2: 서버쪽 XSLT
서버에서 데이터를 가져온 뒤 XSLT 를 사용하여 XML 을 HTML 로 변환한 다음, HTML 코드를 브라우저로 전송한다.

- 리눅스에 있는 xsltproc 이라는 명령행 XSLT 프로세서를 이용한다.
Perl 스크립트로 xsltproc, wget 을 사용해서 파이프라인 구성 =-=> wget 은 자바 URLConnection 으로 가능하지 않나?

접근 방식 3: 클라이언트쪽 XSLT
웹프록시를 거쳐 데이터를 가져온 뒤 브라우저에서 XSLT 변환을 해서 보여준다.

- 인터넷 익스플로러, 파이어폭스, 오페라 등 주요 브라우저는 모두 나름대로 XSLT 처리를 지원한다.
파이어폭스와 오페라는 XSLTProcessor 객체를 제공한다. 인터넷 익스플로러는 문서 모델을 확장하여 XSLT 처리를 지원한다.
 
접근 방식 4: JSON과 동적 script 태그
야후 파이프를 거쳐 데이터를 가져온 뒤 브라우저에서 보여준다.

- Ajax 동일 도메인 제약 문제(same domain problem) 해결하기
(아파치 ProxyPass 규칙을 설정하는 등) 웹 서버 구성을 변경
다른 서버의 데이터를 긁어오는 서버 스크립트를 작성
야후 파이프(Yahoo! Pipes) 같은 외부 서비스 이용(여기에는 script tag hack 같은 기법이 추가된다.)

- script 태그를 동적으로 생성하기
 페이지를 읽은 후에 자바스크립트 코드를 읽어들인다. =-=> onload 에 두면 안되나?
- JSON



[IBM dWs] Grails 마스터하기: GORM: 재미있는 이름, 진지한 기술

- Grails 마스터하기: GORM: 재미있는 이름, 진지한 기술
- Mastering Grails: GORM: Funny name, serious technology

- 일대다 관계 만들기
Law of Leaky Abstractions, hasMany 설정, naked object pattern
class Trip{
    String name
    String city
    ...
    Airline airline //object composition
}

class Airline{
    static hasMany = [trip:Trip]
    ...
}
- PK가 노출되는 것을 막기 위해 toString()를 재정의
(이 방법 말고 다른 방법은 없나? 디버깅 때문에)

- static constraints
필드 순서 지정
데이터 유효성 검증(grails-app/i18n/messages.properties)

- GORM DSL
하이버네이트 HBM 매핑이나 어노테이션을 사용할 수도 있지만 Grails는 static mapping에서 한다.(naked-object 방식)
레거시 테이블 사용시 유용

- DataSource.groovy
새로운 환경을 추가할 수 있다.
dbCreate 설정(hibernate.hbm2ddl.auto)
    create-drop, create, update
데이터베이스 변경




[IBM dWs] Grails 마스터하기: 첫 번째 Grails 애플리케이션 구축하기

- Installation

- Sample
> grails create-app trip-planner
> cd trip-planner
> grails create-domain-class Trip
Add member variable to grails-app/domain/Trip.groovy
> grails generate-all Trip
> grails run-app

Browse to http://localhost:8080/trip-planner
- 포트 변경




- 동적 스캐폴딩
trip-planner/grails-app/controllers/TripController.groovy
class TripController{
    def scaffold = Trip
}
전체 코드 15줄(grails stats 로 확인가능)로 CRUD 기능을 처리하는 웹어플리케이션을 작성할 수 있다.

- 참고자료
IBM developerWorks : Grails 마스터하기
NetBeans : Introduction to the Grails Web Framework

[Grails1.0 사용자 가이드] 전체 목록
Grails Korean Home

Eclipse 3.4 Ganymede

Eclipse IDE for Java EE Developers
Tools for Java developers creating JEE and Web applications, including a Java IDE, tools for JEE and JSF, Mylyn and others.

이클립스 V3.4 완전 정복, Part 1: 이클립스 IDE 워크벤치

Ganymede에 배포된 WTP 3.0에는 JSDT(JavaScript Development Environment)가 포함되어 있다.
이클립스 프로젝트에서 지원되니깐 계속 발전될 것이다.
자바스크립트 개발환경으로는 Aptana도 있다.(Europa에서 설치했다가 써보지는 못했는데 이클립스 플러그인말고 어플리케이션도 있음)
- JavaScript Development Toolkit (JSDT) Features를 참고할 것.
- 자바스크립트(JavaScript) 개발환경 확장하기
 
* Synchronize with Repository에 단축키를 할당했는데 안먹는다. Category가 CVS지만 3.3 에서는 되었는데...
대신 "마우스 오른쪽 - e - 엔터"