2013년 3월 20일 수요일

java.sql.SQLException: Access denied for user... Error 해결


해당 HOST에 대한 USER 접근 권한이 없어 발생하는 오류로 아래의 명령으로 해결할 수 있다.

mysql> grant all privileges on DATABASE.TABLE_NAME to USER@HOST_NAME identified by "PASSWD";

Java Project와 Java Web Project의 참조 Package

o Java Project
 * Package Name List
  - org.eclipse.core.resources.prefs
  - org.eclipse.jdt.core.prefs
  - org.eclipse.jdt.ui.prefs

 * .class File
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="output" path="bin"/>
</classpath>
 * .project File

<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>ProjectName</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>
o Java Web(Dynamic) Project
* Package Name List
 - org.eclipse.jdt.core.prefs
 - org.eclipse.jst.common.project.facet.core.prefs
 - org.eclipse.wst.common.component
 - org.eclipse.wst.common.project.facet.core.xml

* .classpath File
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="con" path="org.eclipse.jst.server.core.container/org.eclipse.jst.server.tomcat.runtimeTarget/Apache Tomcat v5.5"/>
<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.web.container"/>
<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/>
<classpathentry kind="output" path="WebContent/WEB-INF/classes"/>
</classpath>
* .project File

<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>ProjectName</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.wst.common.project.facet.core.builder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.wst.validation.validationbuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
<nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
</natures>
</projectDescription>

Google Web Toolkit


  • Sample code for this article
  • The Maven plugin for use with GWT
  • The Google-Web-Toolkit group on Google Groups
  • The GWT Team Blog
  • The GWT Home Page
  • Finder에서 숨김 파일 보기


    Terminal에서 아래 명령을 실행
    $ defaults write com.apple.Finder AppleShowAllFiles YES

    Mac용 Java Decompiler Eclipse Plug-in


    Mac용 Eclipse Plug-in으로 사용할 수 있는 Java Decompiler

    Eclipse의 "Install New Software" Menu를 이용해 아래 URL로 plug-in을 Install한다.

    URL:  http://java.decompiler.free.fr/jd-eclipse/update

    Potential resource leak: may not be closed

    본 오류는 선언한 Object에 Assign된 Resource가 어떤 경우에 정상적으로 Release(반환)되지 않을 수 있음을 경고하는 것이다.
    일반적인 경우 문제가 되지 않겠지만,
    예를 들어 두 개의 선언된 Object가 있고 그 Object 모두에 대해 Exception을 Throw하는 Method를 호출하는 경우를 예상해보자.
    그럼 그 두 Object의 Method에 대해 catch를 할 것이고
    finally Block에는 Release하는 Code가 들어갈 것이다.
    그런데 대개의 경우 Release하는 Code 또한 관련 Exception을 Throw하는 것이 일반적이다.
    따라서 Release Code에서 catch를 하게 될 것이고
    Code를 줄일 목적으로 두 개의 Release Code를 하나로 묶어 catch를 하게 된다면
    그 때 바로 이 경고를 보게 될 것이다.

    즉, 이는 아래의 Sample Code에서 처럼,
    finally Block 내 두 개의 Release Code 중 첫 번째 Code에서 Exception이 발생했을 경우
    나머지 하나(두 번째)의 Object에 대한 Release Code를 실행할 수 있을 것이란 보장을 할 수 없기 때문이다.
    왜냐하면, 첫 번째 Code에서 Exception이 발생하면 두 번째 Release Code를 실행하지 못 하고 catch Block으로 갈 것이기 때문이다.
    따라서 이를 알리기 위한 똑똑한 경고라 하겠다.

    "Potential resource leak: 'xxx' may not be closed"를 발생시키는 Code
    try {
    // do something with br and bw;
    } catch(Exception e) {
    e.printStackTrace();
    } finally {
    try {
    if(br != null) {
    br.close();
    br = null;
    }
    if(bw != null) {
    bw.close();
    bw = null;
    }
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    옳은 Exception Handling...


    BufferedReader br = null;
    BufferedWriter bw = null;


    try {
    // do something with br and bw;
    catch(Exception e) {
    e.printStackTrace();
    finally {
    if(br != null) {
    try {
    br.close();
    br = null;
    catch (IOException e) {
    e.printStackTrace();
    }
    }
    if(bw != null) {
    try {
    bw.close();
    bw = null;
    catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
    위 Code에서 보는 바와 같이 finally Block내 두 개의 Object Release를 위한 Code별로 Exception을 Handling하고 있다.


    2012년 6월 26일 화요일

    Adding a TCP/IP Route to the Routing Table



    2개 이상의 Ethernet Card나 노트북의 유선과 무선 등을 이용해 2개 이상의 Network을 사용할 경우가 있는데
    이때 보통은 OS 또는 사용자가 정한 우선순위에 따라 Routing된 Network을 사용하게 된다.
    그러나 경우에 따라서는 반드시 지정된 Network으로 Routing이 되어야할 필요가 있는데,
    예를 들어, 사용하고 있는 노트북의 유선과 무선을 통해 두 개의 서로 다른 Network을 사용하는 경우를 생각해 보자.


    아래 그림은 서로다른 두 개의 Network A, B를 표현한 것으로,
    A Network은 VPN망을 사용하며 Printer가 연결되어 있고, B Network은 광캐이블이 연결된 Modem으로 구성된 일반적인 인터넷 구성 Network으로
    이 곳에 할당된 Public IP는 방화벽을 갖는 제 3의 Network에 있는 서버로 접근할 수 있도록 Inbound가 열려있는 Network이라고 가정하자.


    그림의 Host#1과 같이 유선으로는 B Network에 연결되어 있고 무선으로는 A Network에 연결되어있고 유선의 Ethernet Card가 높은 우선순위를 같는다고 하자.
    이때 Host#1은 특별한 설정이 없다면 10.10.10.2로 Print 요청을 보내면 우선순위가 높은 B Network에서 10.10.10.2를 찾으려 할 것이고, B Network은 이 IP에 대한 Routing정보를 어떠한 Routing Table에도 가지고 있지 않으므로, 이 요청은 B Network에 Broadcasting되었다가 어떠한 응답도 받지 못한채 Time-out이 될 때까지 대기하다 결국 요청은 실패하게 된다.
    이럴때 특정 IP 대역에 대해 Routing되어야할 적절한 Network을 지정해 줌으로써
    필요한 요청을 처리할 수 있다.






    그럼 위의 예에서 처럼 A Network에 있는 Printer#1으로 요청이 전달될 수 있도록 설정하는 방법을 Unix-like Machine과 Windows Machine으로 구분해 알아보도록 하자.
    • Unix-like
    Syntax:
    route add [xnet|-host] target [netmask ] [gw Gw] dev
    route del [-net|-host] target [gw Gw] [netmask Nw] [[dev] If]
    route add default gw dev

    • Windows
    Syntax:
    route add xxx.xxx.xxx.xxx mask xxx.xxx.xxx.xxx xxx.xxx.xxx.xxx metric xx if xx
    route add "network" mask "subnet mask" "gateway ip" matric "metric number" if "ethernet number"
    route add 157.0.0.0 mask 255.0.0.0  157.55.80.1 metric 3 if 2
                  ^destination    ^mask      ^gateway    metric^   ^Interface
    예를 들어 Network A, B를 모두 갖는 Host#1에서 Network A에 있는 Printer#1을 이용해 어떤 문서를 출력하고자 한다고 가정하자. 그러면 Subnet Mask가 255.255.255.0이고 10.10.10.0에 해당하는 IP를 갖는 Network A로 Routing될 수 있도록 설정해 주어야 하는데 그 방법은 아래와 같다.  이때 Network A에 연결된 무선 Ethernet Card의 번호는 15번(eth1)이고 Printer#1의 IP는 그림에서와 같이 10.10.10.2이고 Network A로의 Default Gateway는 192.168.0.1이라고 가정한다.

    Example:
    • Unix-like
    route add -net 10.10.10.0 netmask 255.255.255.0 gw 192.168.0.1 dev eth1
    • Windows
    route -p add 10.10.10.0 mask 255.255.255.0 192.168.0.1 if 15
    • -p : 영구적으로 설정해 이 Option을 사용하지 않을 때와 달리 Rebooting 후에도 유지된다.
    • 참고로, 본 명령을 실행하려면 Command창을 관리자 권한으로 실행해야한다.

      2010년 4월 27일 화요일

      Oracle JDBC의 CachedRowSet Implement Bug

      CachedRowSet을 사용하는 경우 Oracle JDBC의 CachedRowSet Implementation Bug 때문에 더 이상 고생하는 개발자가 없기를 바라며 이 글을 작성한다.

      결론부터 말하자면 Oracle의 JDBC Driver가 CachedRowSet을 Implement한 Class의 Method 중 Date Type에 대한 Bug로 인해 CachedRowSet을 이용한 Code에서 오류가 발생될 수 있다는 것이다. 그리고 이는 Patch된 최신 Version인(현재 시점) 'ojdbc5.jar' 이상을 사용해야 해결될 수 있는 문제라는 것이다.

      아래의 몇 몇 오류들은 Bug가 있는 - 오류가 Patch되지 않은 - Oracle JDBC를 이용해 CachedRowSet을 사용할 경우 발생될 수 있는 Error Message들의 예로, 궁극적인 문제의 원인은 Date Type의 DB Field를 CachedRowSet의 'getDate()' Method로 참조할 때 발생하는 'java.lang.ClassCastException'이 바로 그 것이다.
       
      org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.transaction.TransactionSystemException: Could not roll back JDBC transaction; nested exception is java.sql.SQLException: Connection is closed.
      org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:583)
      org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:501)
      javax.servlet.http.HttpServlet.service(HttpServlet.java:627)
      javax.servlet.http.HttpServlet.service(HttpServlet.java:729)

      [ErrorMessage-1]
      • ErrorMessage-1
             Spring Framework를 연동했을 때 발생될 수 있는 예로 'ClassCastException' 발생으로 인해 해당 Transaction에 대한 Roll back을 Spring Framework이 AOP를 통해 수행하려는 상황에서 발생된 오류인데, 이 오류는 엄밀히 말하면 일반적인 상황에서는 발생하지 않을 수도 있다. 왜냐하면 이 상황은 필자의 경우로 'Javassist'를 이용해 Connection Object를 Intercept한 경우이기 때문이다.

      org.springframework.jdbc.UncategorizedSQLException: SqlMapClient operation; uncategorized SQLException for SQL []; SQL state [null]; error code [0];
      --- The error occurred in sqlMap.xml.
      --- The error occurred while applying a result map.
      --- Check the scope.select.
      --- Check the result mapping for the 'createDate' property.
      --- Cause: java.lang.ClassCastException: java.sql.Timestamp; nested exception is com.ibatis.common.jdbc.exception.NestedSQLException:
      --- The error occurred in sqlMap.xml.
      --- The error occurred while applying a result map.
      --- Check the scope.select.
      --- Check the result mapping for the 'createDate' property.  
      --- Cause: java.lang.ClassCastException: java.sql.Timestamp
      [ErrorMessage-2]

      • ErrorMessage-2
             Spring Framework와(과) iBATIS를 연동했을 경우 debugging 과정에서 추출한 Error Message로 오류의 원인을 정확히 짚어내고 있다. 하지만 오류내용을 보면 마치 'java.sql.Timestamp' Type을 다른 Type으로 잘 못 Casting해 발생한 오류인 것 처럼 보인다.
      사실과 다르게 말이다. Error Message에 보이는 'createDate'라는 Field는 분명 'Date' Type인 것이다. 또한 CachedRowSet이 아닌 ResultSet으로는 전혀 문제가 발생하지 않은 Code이다.

      이 문제의 원인을 찾는데 상당히 많은 시간을 소요했으며 정신적 스트레스 또한 말 할 수 없이 많았다. 지금까지의 Posting 글이 그러했듯 같은 오류에 대해 적어도 필자 보다는 적은 시간과 노력으로 좋을 결과를 얻기를 바라는 마음이다.
      국내 검색 Site에서는 관련 오류 내용을 검색조차 할 수 없었으나 역시 Googling을 통해 알게된 외국의 한 Community Site에 올린 누군가의 글로 해결의 실마리를 찾게 되었다. 물론 이 도 쉽지많은 않앗지만 말이다. 아무튼 도움이 되길 바라며 Posting한다.

      2007년 8월 23일 목요일

      Windows Shutdown command

      TSSHUTDN [대기 시간] [/SERVER:서버 이름] [/REBOOT] [/POWERDOWN] [/DELAY:로그오프 지연] [/V]대기 시간 사용자에게 알린 후 모든 사용자 세션을 종료하기 전까지 기다리는 시간(초)
      (기본값은 60).
      /SERVER:서버 이름 종료할 서버(기본값은 현재 서버).
      /REBOOT 사용자 세션이 종료된 후 서버를 다시 부팅.
      /POWERDOWN 서버가 전원 꺼짐을 준비함.
      /DELAY:로그오프 지연 연결된 모든 세션을 로그오프한 후 기다리는 시간(초)(기본값은 30).
      /V 수행 중인 동작에 대한 정보를 표시.

      2007년 7월 31일 화요일

      Trackback

      Linkbacks(Refback, Trackback, Pingback)의 세 가지 type 중 하나로,
      한 게시자의 글을 누군가가 link할 때 글 게시자에게 link되었음을 알리는 요청을 하기위한 방법이다. 이것은 게시글에 대해 누가 link하고 있거나, 누가 참조하고 있다는 것을 게시자가 추적할 수 있다.

      참조: http://en.wikipedia.org/wiki/Trackback