수업 시간에 xce를 이용하여 미들릿을 만들어 에뮬레이터에 실행을 해보곤 한다. 음.. 그런데 이 미들릿을 컴파일 하는게 조금 복잡 하다. 어떻게 복잡하냐? 자바 버전은 source 는 1.2로 맞추어야 하고, bootclasspath 도 기존 자바의 것과 다른 xce에서 사용하는 classpath 를 사용하고, 또 이 생성된 class 파일 같은 경우 xce 프로그램이 설치 되어 있는 루트 디렉토리에 있어야 에뮬레이터에서 인식이 잘 된다.

에구에구 뭐가 이렇게 셋팅 해줄께 많은지....

갑자기 문뜩 떠오른 아이디어!!! 자바프로그램을 처음 입문하면서 난 컴파일에 대한 두려움을 하나도 못느끼게 해준 놈이 있다. 바로 ant란 놈이다. 이놈은 컴파일을 할때 path나 그런 설정들을 혹은 ftp접속 파일 삭제 jar파일 생성 같은 것을 일괄적으로 만들어 주는 놈이라 할 수 있다. 그래서 내가 자바 프로그램을 하는 회사에서도 자바 컴파일 버전이나 어떤 라이브러리를 임포트 할지에 대한 것을 자세히 몰라도 컴파일이 알아서 되고, ftp로 원하는 서버에 전송 까지 되는 것이였다.

이놈을 그렇게 힘들게 쓰지는 않더라도, 약간만 수정 한다면 쉽게 컴파일시 쉽게 만들수 있을것 같다는 생각이 문뜩 떠오르고 이렇게 한번 실행을 해보았다.

여기서 xce를 이용한 프로그램 방법은 설명 하지 않겠다.

자바 소스
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class HelloWorldKbs extends MIDlet{
 
 private Display display;
 private TextBox t;
 
 /**
  * @param display
  */

 public HelloWorldKbs() {
  display = Display.getDisplay(this);
  t = new TextBox("Title", "HelloWorld", 80, 0);
 }
 protected void destroyApp(boolean unconditional) throws MIDletStateChangeException {
  // TODO Auto-generated method stub
 
 }
 protected void pauseApp() {
  // TODO Auto-generated method stub
 
 }
 protected void startApp() throws MIDletStateChangeException {
  // TODO Auto-generated method stub
  display.setCurrent(t);
 }
}


위의 소스는 이클립스 xce프로젝트를 생성하여 만든 HelloWorld 프로그램 이다. 핸드폰 화면에 텍스트 박스를 넣어서 HelloWorld라는 단어를 출력 하였다.

그리고 아래는 ant를 실행하는 build.xml 파일이다.
<?xml version="1.0"?>
 
<project name="HelloWorld" basedir="." >
 
<property name="src.dir" value="${basedir}/src" />
<property name="classes.dir" value="C:/Program Files/xce/WIPI-JAVA 2.0.2" />
<property name="org.classes.dir" value="${basedir}/classes"/>
<property name="jar.dir" value="c:/Program Files/xce/WIPI-JAVA 2.0.2" />
<property name="bootclasspath.dir" value="C:/Program Files/xce/WIPI-JAVA 2.0.2/classes"/>
 
<target name="compile" >
   <javac srcdir="${src.dir}" destdir="${classes.dir}" source="1.2" bootclasspath="${bootclasspath.dir}/classes.jar"/>
   <javac srcdir="${src.dir}" destdir="${org.classes.dir}" source="1.2" bootclasspath="${bootclasspath.dir}/classes.jar"/>
</target>
<target name="jar" depends="compile">
   <jar jarfile="${jar.dir}/HelloWorld.jar" basedir="${org.classes.dir}" includes="**/*.class" />
</target>
<target name="build" depends="compile">
 <antcall target="compile"/>
 <antcall target="jar"/>
</target>
</project>



User inserted image





위의 파일을 프로젝트의 기본에 build.xml로 만들어 주고, window view의 ant창을 연다음 build.xml파일을 ant창에 드롭 한다.그럼 ant창에서 리스트들이 나오게 되는데, compile 혹은 jar를 선택 그것의 오른쪽 클릭을 하게 되면 Run as -> Ant Build를 하게 되면 일일이 컴파일 하지 않아도 컴파일 되게 되고 jar도 생성 되게 된다.







위의 ant의 기본 path 는  xce를 설치 했을때의 path이다. 센스가 있으신 분은 알아서 변경 하실수 있을 것이다. 이렇게 ant를 사용하면 매번 일일이 컴파일 옵션을 기억하고 있다가 컴파일 하지 않아도 쉽게 빌드 할수 있다. ant의 다른 설정들은 알아서 찾아 보길 바란다.

User inserted image

이놈의 귀차니즘 때문에 @.@ 글을.. 쓰고 싶은데 쏘스가 주어지고 해야될일이 생기니 에휴 ~~ 이놈의 핑계~ 어째던 이번에 알아볼 것은 db에 접속 하는것을 알아 보겠다. 그것도 동일한 sql문에 param 값을 설정 하여서 한개의 sql문으로 처리 하는 방법을 해보는 것이다.


자바 소스
import java.sql.*;
public class CallableTest {
 public static void main(String[] args) throws SQLException{
  Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/mysql", "root", "apmsetup");
 
  PreparedStatement stmt;
 
  String sqlStr = "select * from db where id=?";
 
  stmt = conn.prepareStatement(sqlStr);
 
  stmt.setInt(1, 10);
 
  ResultSet rs = stmt.executeQuery();
 
  while(rs.next())
  {
   System.out.println(rs.getString(1));
  }
 
  stmt.close();
  conn.close();
 }
}



 

그리고 C# 소스
using System;
using System.Data;
using System.Data.SqlClient;

class SqlParamTest
{
    static void Main(string[] args)
    {
        string connStr = "Provider=MySQLProv;Data Source=mysql;" +
                         "Location=localhost;User Id=root;Password=apmsetup";
        string query = "select * from db where id=@ID";
        SqlConnection conn = new SqlConnection(connStr);
        conn.Open();
        SqlCommand comm = new SqlCommand(query, conn);
        comm.Parameters.Add("@ID", SqlDbType.Int);
        comm.Parameters["@ID"].Value = "10";
        SqlDataReader sr = comm.ExecuteReader();
        while (sr.Read())
        {
            Console.WriteLine(sr.GetInt32(0)));
        }
        sr.Close();
        conn.Close();
    }
}



위의 코드는 솔직히 실행해보지는 못했다. 일단 실행을 할려면 MySql 설치해야 하고, 공급자도 설치해야 하고.. 아마도 자바와 닷넷용 모두 설치해야 할것이다. 그렇다고 MSSql을 설치하기도 그렇고. 그러니 이해해 주시기를 바랍니다 ^^

어째던 DB 접속에 둘다 문제가 없다면 두개의 소스가 비슷한 동작을 할것이다. 일단 둘다 각각의 Connection 객체를 통해 일단 DB에 접속 했다. 그런데 여기서 약간의 차이점은 자바에서는 DBManager 를 사용하여 객체를 생성하고, C#에서는 객체 스스로 생성되었다. 그래서 그런지는 모르겠지만 C#으로는 Connection 객체를 open을 해주는데 자바에서는 해주지 않는다.

그리고 다음은 비슷한 동작을 하는 command == statement 이두 객체가 비슷한 동작을 한다. 커넥션 객체에서 각 쿼리를 실행 하기 위한 Sql명령을 가지고 있는 객체이다. 여기서 바뀌게 되는 파라 미터 값을 command 에서는 @param 으로 구분했고 statement 에서는 ?로 구분했다. 그리고 자바에서는 preparedstatement라는 객체를 따로 만들어야 했으나, C#에서는 command라는 객체의 다른 종류는 없었다.

그리고 데이터를 읽는 것은 각각의 Reader로 읽어 값을 읽었고, 마지막으로 각 파라미터에 값을 넣을때 Java에서는 셋팅을 할때 메서드를 호출에서 ? 순서에 따라 각각의 값을 지정하였고, C#에서는 각 파라미터의 @param를 가지고 셋팅후 값을 대입 2번의 수행을 하였다.

뭐 두개다 큰 차이는 없겠지만 자바에서는 param 들이 ?로 표시되어 각각을 지정하는데 유연함이 조금 떨어질수 있겠지만, C#에서는 2번 셋팅을 해주어야 해서 불편하다는 점이 내가 내린 결론!!



에구에구 오랜만에 쓰는데 왜이리 피곤한지.. 그리고 자바에서는 또 특이하게 callablestatement라는 놈이 있다. 이놈은 preparedstatement라는 놈과는 비슷하지만 다른부분이 있다. 좀더 알아보고 기회가 된다면 다름 글에 이야기 해보겠다.

Java 2007/01/15 22:07

Java 세팅

일단 JVM을 설치 해야 할것이다. 맞나? Java Runtime Environment (JRE) 이건가? 이것을 썬사의 홈페이지 들어가서 설치 한다. 일단 내가 사용하는 버전은 1.4버전

그 다음 왼쪽링크들중에 있는 이클립스를 설치 한다. 음.. 그리고 톰캣을 설치.. 그 링크도 왼쪽에 있다. 그리고 톰캣 설정법은 긁어 왔다. 쩝..

설정

아래의 예제는 awt의 이벤트 처리 부분을 사용하여 구현해 본 간단한 에플릿 프로그램

같이구현

따로구현


div>