Java2018. 11. 20. 14:13

CSV파일을 불러 들여와 데이터베이스에 넣거나 수정을 하는 로직을 만드는 중이었다.

컬럼이 두개인 경우에 아무 문제 없이 됐었는데 3개이상으로 만들어 놓은 상태에서 진행을 하니 데이터를 제대로 못가져오는 경우가 발생했다. 잘 실행 되던 코드였는데 컬럼하나 추가 했다고 안된다는게 이해가 안됐다.

디버깅을 했더니 데이터는 아주 잘 가져왔는데 List에서 Map으로 가져오고 거기에서 key값으로 값을 가져오는 부분에서 Null값이 나왔다.

그래서 디버깅을 할때 Key값을 복사해서 붙여 넣기해보니 키값 앞에 \uFEFF라는 문자가 붙어있었다.

검색을 해보니 CSV파일을 만들때 UTF-8인코딩을 이용해서 저장해서 생기는 문제였다.

엑셀에서 저장할때 인코딩 형식을 지정하는 방식이 아닌 단순히 쉼표로 구분하는 CSV형식으로 저장 하면 문제는 해결 된다.

Posted by Z700zZz
Java2018. 6. 12. 16:16

현재 프로젝트 진행하는데 환경은 SpringBoot, Gradle, IntelliJ를 조합하여 진행하고 있다.

처음에 설정한 환경으로 일년여 동안 사용 하다가 새로 환경을 구성해보려 Git에서 다른 브랜치를 다운 받아 세팅을 했는데..

이전에 개발하던 환경과 똑같이 구성을 했는데 아래와 같은 에러를 보이며 로컬에서 구동이 되지 않았다.



java.lang.NoClassDefFoundError: org/apache/tools/ant/util/ReaderInputStream



Gradle문제인가 싶어 Sync를 다시 해봐도 마찬가지..


해결은 File > Invalidate Caches / Restart 를 통해서 캐쉬를 지우거나 캐쉬를 지우고 IntelliJ를 재시작 하면 문제는 해결 된다.

IntelliJ가 평소에는 잘 작동하기는 하지만 가끔가다 Gradle이 제대로 싱크가 되지 않아 종종 문제를 일으키곤 한다.


출처 : https://stackoverflow.com/questions/27978908/java-lang-noclassdeffounderror-org-apache-tools-ant-util-readerinputstream-vaad?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa

Posted by Z700zZz
Java2018. 2. 28. 14:25

이니시스 결제 취소 연동 하다가 발생한 문제..


이니시스 라이브러리를 통해서 결제취소 완료까지 갔는데 메세지를 파싱하는 부분에서 문제가 생겼다.


ClassNotFoundException: org.apache.xpath.XPathAPI


이게 뭔 뚱딴지 같은 에러인가..

그래서 검색해보니 해당 클래스의 경로가 바뀐것..

이니시스 라이브러리에는 org.apache.xpath.XPathAPI로 되어 있고 내가 바꿀수 있는 권한은 없고..

그래서 방법을 찾아보니 xalan이라는 라이브러리 추가로 해결 할 수 있다고 했다.


출처 : http://sarc.io/index.php/forum/question-and-answer/89-classnotfoundexception-org-apache-xpath-xpathapi


각자 개발하는 환경이 다르니 낮은 버전에서 라이브러리를 개발해서 배포 한듯한데..

이것 때문에 한시간넘게 삽질을 했네..

Posted by Z700zZz
Linux2015. 8. 25. 14:10

우선은 Linux운영체제에 Java가 설치 되어 있는지부터 확인 해야 한다.


java -version


이 명령어를 쳤을때 자바에 관련된 정보가 나온다면 자바는 설치 되어 있는것..


java version "1.7.0_85"

OpenJDK Runtime Environment (rhel-2.6.1.2.el7_1-x86_64 u85-b01)

OpenJDK 64-Bit Server VM (build 24.85-b03, mixed mode)


위와 같은 방법으로 자바 버전을 확인 할 수도 있고.


rpm -qa | grep java


이방법도 가능하다.


java-1.7.0-openjdk-1.7.0.85-2.6.1.2.el7_1.x86_64

java-1.7.0-openjdk-headless-1.7.0.85-2.6.1.2.el7_1.x86_64


운영체제에 기본으로 설치 되어 있는 OpenJDK가 설치 되어 있음을 확인 할 수 있다.

설치 된 OpenJDK를 사용 할 수도 있겠지만..찾아보니 OracleJDK를 만들기전 완벽한 OpenSource로 배포한 버전이고 혹시 모를 문제점이 생길지 몰라 OracleJDK를 받아 설치..


우선 기존의 OpenJDK를 제거 해야한다.


yum remove JavaVersion


yum remove뒤에는 현재 설치 되어 있는 Java버전을 적어주면 된다.

rpm -qa로 검색된 자바는 java-1.7.0-openjdk-1.7.0.85-2.6.1.2.el7_1.x86_64와 같으니 이걸 적어주면 삭제 진행..

두번째 줄에 나온 것도 추가로 삭제 진행..

tzdata-java라든가 하는것들이 rpm -qa명령을 실행하면 세개나 더 생기는 것을 볼 수 있는데.

역시 이것들도 삭제 진행..


다시 rpm -qa | grep java를 실행하면 아무것도 안나오는 것을 볼 수 있다.


설치에 앞서서 OS버전을 알아야 한다.

근데 알아야 하나??몇비트 운영체제인지만 알면 되는건가??


rpm -qa *release


이건 운영체제의 전체적인 버전을 나타내는 것이고..


getconf LONG_BIT


이건 운영체제가 32bit인지 64bit인지를 알아내는 명령어..

운영체제에 맞는 Java를 다운 받는다. tar.gz파일을 다운..

이제 리눅스 서버에 올려야 하는데 이건 알아서..

리눅스 서버에 SFTP를 사용해 올리려고 설정 다해줬는데 파일질라고 접속이 안되서 반나절을 까먹었다.

설정이 잘못됐나 싶어서 이설정 저설정 다해줬는데도 되질 않아 회사 부장님께 헬프를 요청했는데..

한시간만에 해결하고 얻은 답은 파일질라 문제..WinSCP사용해서 접속도 잘되고 파일도 잘 올라가는것 확인했다.


파일을 복사한 위치는 /usr/local/


gunzip jdk-8-linux.tar.gz


tar -xvf jdk-8-linux.tar


위의 명령어를 차례로 실행하면 /usr/local경로에 자바 SDK를 압축해제 한다.


아마도 jdk1.8.0 이런식의 폴더가 생길것인데..

자바 설정에 이 폴더 그대로를 넣어 줄수도 있지만..추후 자바 업데이트를 위해서 링크를 사용하겠다.

자바폴더가 있는 /usr/local에서 


ln -s jdk1.8 java


이 명령어를 실행하면 /usr/local 경로에 java라는 링크가 생기는것 을 확인 할 수 있다.

다음 작업은 profile파일을 수정하는 작업이다.


vi /etc/profile


위 명령어를 실행하면 profile파일 수정화면으로..


JAVA_HOME=/usr/local/java

CLASSPATH=.:$JAVA_HOME/lib/tools.jar

PATH=$JAVA_HOME/bin

export JAVA_HOME CLASSPATH PATH


위에 적인 네줄을 최하단에 넣고 저장.

자바가 설치된 경로를 인식 시켜주는 구문..


변경된 profile의 내용을 적용 시켜줘야 하는데 그 명령어는 아래와 같다.


source /etc/profile


이로서 Java 설치는 끝이 났고 확인은 


java -version

javac -version


이 명령어로 확인하면 된다.

Posted by Z700zZz
Java2013. 2. 5. 23:35

현재 진행중인 유지 보수를 하는데 처음 접하는 브라우저에 올릴 웹페이지를 작업하다보니 타임아웃 테스트를 하기 위한


페이지를 만들어야 했다.


나는 아무것도 몰라 이것저것 검색해 간단한 타임아웃 테스트용 코드를 만들어 봤다.


브라우저가 20초간 응답이 없으면 요청했던 페이지를 다시 요청 하는것 같아 지연 시간은 30초로 설정하였다.


System.out.println("TimeoutTest!!");


long time = System.currentTimeMillis();

SimpleDateFormat dayTime = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss");

String str = dayTime.format(new Date(time));

System.out.println(str);


Thread.sleep(30000);


화면에 출력하는 내용을 위한건 그냥 건너 뛰도록 하고..


내용은 보면 위에것은 재 요청 시간이 얼마인지 보기 위한 테스트 코드라 보면 되고 제일 아래줄에 있는 소스 코드가 


Timeout테스트를 위한 코드라 보면 된다.


Thread.sleep(30000);


밀리세컨드로 파라미터를 넣게 된다. 그러면 그 시간동안 응답이 없게 되는 코드.

'Java' 카테고리의 다른 글

Java Object Copy(Clone)..  (0) 2013.12.12
java.lang.NoSuchMethodError..  (0) 2013.08.27
Https SSLHandshakeException..!  (0) 2012.10.16
EhCache의 Spring Framework(iBatis)적용...!  (0) 2012.09.18
json-lib-2.4-jdk15.jar  (0) 2012.08.24
Posted by Z700zZz
Java2012. 3. 15. 01:02
Was에 자바 컴파일한 클래스 파일을 올려놓고 실행을 하였더니..

java.lang.UnsupportedClassVersionError와 같은  에러가 발생할 때가 있다.

이는 Was의 자바 버전과 컴파일한 자바 버전이 맞지 않아 생기는 에러이다.

어떻게 해결 하느냐..

보통 자바를 깔때 최신버전을 깐다.

1.6버전을 많이 사용 할 것이다.

나의 개발 환경은 MacOSX 10.7이며 자바 1.6버전을 바탕으로 개발을 하였다.

그리고 Was의 환경은 Tomcat 5.5에 자바 1.5버전이다.

우선 이클립스의 프로젝트에서 우클릭 후 - Build Path - Configure  Build Path를 선택하자.


선택하게 되면 밑의 창이 나타나게 된다.

Java Build Path -  Libraries - JRE System Library - Edit를 선택한다.




선택 후 아래와 같은 창이 나타나면 Excution environment - 내가 컴파일할 자바 버전을 선택 후 Finish를 누르면 된다.


위의 방법대로 하면 될것 같지만..

절대로 안된다.

프로젝트 위에 빨간색 x표시를 보게 될 것 이다.

다시 한가지 더 해주어야 할 것이 있다.

다시 한번 프로젝트에서 우클릭 후 - Build Path - Configure  Build Path를 선택하자.

선택후 나타나는 창에서 Project Facets를 선택한 후 Java를 클릭하고 내가 컴파일 하고자 하는 버전으로 선택해주면 된다.


 
예전에는 버전 별로 자바를 모두 깔아 등록 해주고 사용을 해야 했지만 이제는 기본으로 모든 버전을 사용가능 한가보다.

 Was에 올리기전 자바의 버전을 확인하자.

'Java' 카테고리의 다른 글

Log4j의 Appender..!  (0) 2012.06.26
Log4j 설정..!  (0) 2012.06.25
Java의 문자열 비교..!  (0) 2011.10.04
Java - Lotto(로또)  (0) 2009.10.14
JavaScript...!  (0) 2009.07.07
Posted by Z700zZz
Java2009. 10. 14. 23:54
수업 시간에 내준 과제...

선생님이 숙제에 대한 조건??을 걸었다.

int[] balls = new int[45];
int[] lotto = new int[6];

공을 나타내는 배열과 뽑은 공이 들어갈 배열...

public class Lotto456 {
    private int[] balls = new int[45];
    private int[] lotto = new int[6];
    private int count = 0;
    Random random = new Random();
    public void inputNum(){
        for(int i = 0;i < balls.length;i++){
            balls[i] = i + 1;
        }
    }
//공 배열에 공마다 숫자를 넣어주는 작업...
   
    public void ballCatch(){
        int randomNum = 0;
        int ballNum = 0;
       
        while(true){
            randomNum = random.nextInt(45);
            ballNum = balls[randomNum];
            if(ballNum == 0){
                System.out.println("중복");
                ballCatch();
            }
            balls[randomNum] = 0;
            if(count == 6){
                return;
            }
            lotto[count] = ballNum;
            count++;
        }
    }
  //랜덤하게 공을 꺼내서 뽑힌 공이 들어갈 배열에 넣는 작업... 
   
   
    public int[] getLotto(){
       
        return lotto;
    }
}
//뽑힌 공을 주는 메소드

그외에 실행하는 부분은 알아서 하길...
공에 숫자넣는 작업 한번..공 뽑는거 한번...그다음엔 뽑힌 공을 주는거 한번..
너무 간단하니 이정도만 해도 되겠지..

'Java' 카테고리의 다른 글

Java Compile Version Error..!  (0) 2012.03.15
Java의 문자열 비교..!  (0) 2011.10.04
JavaScript...!  (0) 2009.07.07
Eclipse Galileo Ver...!  (0) 2009.07.02
Java Oracle JDBC 관련 부분...!  (0) 2009.06.24
Posted by Z700zZz
Java2009. 6. 24. 19:32


 public void regist(BoardVO boardVO){

//  1. 드라이버 Class 등록
  try {
   Class.forName("oracle.jdbc.driver.OracleDriver");
  } catch (ClassNotFoundException e1) {
   // TODO Auto-generated catch block
   e1.printStackTrace();
  }

Class.forName에서 클래스 명이 틀릴 경우 Exception 발생...Try Catch로 Exception을 처리해줘야 한다.
  
  Connection conn = null;
  Statement stmt = null;

Connection과 Statement를 선언
  
  try {
   
//   2. 커넥션 생성
   conn = DriverManager.getConnection(dbUrl,dbUserId,dbUserPw);
//   3. statement 생성 
   stmt = conn.createStatement();

//   4. SQL생성
   String sql = "";
    
   sql += " insert into TB_BOARD ";
   sql += " (TITLE, CONTENT, WRITER_NAME, PASSWD, REGIST_DATE, READ_COUNT) ";
   sql += " values ";
   sql += " ('"+boardVO.getTitle()+"','"+boardVO.getContent()+"','"+boardVO.getWriterName()+"','"+boardVO.getPasswd()+"',SYSDATE,0) ";
//   5. 실행
   stmt.executeUpdate(sql);
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } finally {
   try{
    stmt.close();
   } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
   }
  }
 }
 
 public List<BoardVO> list(){
  List<BoardVO> boardList = new ArrayList<BoardVO>();
  
  //1. JDBC Class 등록
  try {
   Class.forName("oracle.jdbc.driver.OracleDriver");
  } catch (ClassNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  
  try {
   //2. 커넥션 생성
   conn = DriverManager.getConnection(dbUrl, dbUserId, dbUserPw);
   
   //3. Statement 생성
   stmt = conn.createStatement();
   
   //4. SQL생성
   String sql = " select SEQ, TITLE, CONTENT, WRITER_NAME, PASSWD, REGIST_DATE, READ_COUNT from TB_BOARD ";
   
   //5. 실행
   rs = stmt.executeQuery(sql);
   
   //6. 결과 Java instance에 저장
   while(rs.next()){
    BoardVO boardVO = new BoardVO();
    
    boardVO.setSeq(rs.getInt("SEQ"));
    boardVO.setTitle(rs.getString("TITLE"));
    boardVO.setContent(rs.getString("CONTENT"));
    boardVO.setWriterName(rs.getString("WRITER_NAME"));
    boardVO.setPasswd(rs.getString("PASSWD"));
    boardVO.setRegistDate(rs.getDate("REGIST_DATE"));
    boardVO.setReadCount(rs.getInt("READ_COUNT"));
    
    boardList.add(boardVO);
   }
   
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }finally{
   try {
    rs.close();
    stmt.close();
    conn.close();
   } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
  return boardList;
 }

*-------------------------Read 부분(파라미터로 숫자를 입력받아 해당 게시물을 출력한다.--------------------*
public BoardVO read(String readSeq){<---------게시물 한개를 불러오기에 List와는 다르게 BoardVO로 리턴해주었다.
  //List<BoardVO> boardList = new ArrayList<BoardVO>();
  BoardVO boardVO = new BoardVO();
  
  //1. JDBC Class 등록
  try {
   Class.forName("oracle.jdbc.driver.OracleDriver");
  } catch (ClassNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  
  try {
   //2. 커넥션 생성
   conn = DriverManager.getConnection(dbUrl, dbUserId, dbUserPw);
   
   //3. Statement 생성
   stmt = conn.createStatement();
   
   //4. SQL생성
   String sql = " select SEQ, TITLE, CONTENT, WRITER_NAME, PASSWD, REGIST_DATE, READ_COUNT from TB_BOARD where SEQ = " + readSeq;
   
   //5. 실행
   rs = stmt.executeQuery(sql);
   
   //6. 결과 Java instance에 저장
   if(rs.next()){   <----------값이 한개이기 때문에 List와는 다르게 While이 아닌 if문으로 데이터 값을 저장.
    //BoardVO boardVO = new BoardVO();
 
    boardVO.setSeq(rs.getInt("SEQ"));
    boardVO.setTitle(rs.getString("TITLE"));
    boardVO.setContent(rs.getString("CONTENT"));
    boardVO.setWriterName(rs.getString("WRITER_NAME"));
    boardVO.setPasswd(rs.getString("PASSWD"));
    boardVO.setRegistDate(rs.getDate("REGIST_DATE"));
    boardVO.setReadCount(rs.getInt("READ_COUNT"));
 
    //boardList.add(boardVO);
   }
   
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }finally{
   try {
    rs.close();
    stmt.close();
    conn.close();
   } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
  return boardVO;
 }

Oracle과 Java 연동부분...!
1. 드라이버 Class등록
2. Connection 생성
3. Statement생성
4. SQL생성
5. 실행
6. 결과

위의 과정을 기억하자...! 더불어 코드도 외우자...!

'Java' 카테고리의 다른 글

Java Compile Version Error..!  (0) 2012.03.15
Java의 문자열 비교..!  (0) 2011.10.04
Java - Lotto(로또)  (0) 2009.10.14
JavaScript...!  (0) 2009.07.07
Eclipse Galileo Ver...!  (0) 2009.07.02
Posted by Z700zZz