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
Java2016. 5. 16. 21:29

Http Request에 GET과 POST는 아주 많이 사용하니 다들 알고 있을것이다.

그 외에 HEAD, OPTIONS, PUT등 여러 Method 들이 여럿 존재한다.

Tomcat을 설치하고 따로 설정을 해주지 않으면 모든 Method들을 사용 할 수 있다(맞나?)

이것을 제한하지 않으면 Method들을 이용하여 서버에 파일을 생성하는 공격이 들어 올수 있다고 한다.

Tomcat의 설정 하나로 원하는 Method만을 접근 가능하도록 할 수 있다.


<security-constraint>

    <web-resource-collection>

    <web-resource-name></web-resource-name>

    <url-pattern>/*</url-pattern>

    <http-method>HEAD</http-method>

    <http-method>OPTIONS</http-method>

    <http-method>PUT</http-method>

    <http-method>DELETE</http-method>

    <http-method>TRACE</http-method>

    <http-method>CONNECT</http-method>

    </web-resource-collection>

    <auth-constraint>

    <role-name></role-name>

    </auth-constraint>

  </security-constraint>


위의 코드를 현재 돌아가고 있는 서비스의 web.xml 제일 마지막 쯤에 적어주고 Tomcat을 재가동 시켜주면 된다.

http-method가 사용하지 않을 Method명을 적어주면 된다.


재가동 한뒤 제대로 설정이 됐는지 확인 하는 방법은..


$ telnet 200.100.70.50 80

Trying 200.100.70.50...

Connected to 200.100.70.50

Escape character is '^]'.

MOVE

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">

<html><head>

<title>403 Forbidden</title>

</head><body>

<h1>Forbidden</h1>

<p>You don't have permission to access /

on this server.</p>

<hr>

<address>Apache Server at <a href="mailto:webmaster@dummy-host2.example.com">kcacontents.kr</a> Port 80</address>

</body></html>

Connection closed by foreign host.


telnet 명령어로 설정한 서버 IP와 포트번호이 80을 입력하고..

Escape Character is라는 문구가 나오고 커서가 껌벅껌벅 할때..

접근 제한을 한 Method 명을 적어 넣으면 된다.

아마도 막혀 있다면 위와 같은 문구가 나오겠지..아마 맞을거야..

아니면 지적 해주시길..

Posted by Z700zZz
Java2014. 11. 24. 21:10

Post방식이 아닌 Get방식으로 한글 파라미터를 넘길 때 제대로 넘어가지 않고 아랍어 마냥 꼬불꼬불한 글씨로 파라미터가 넘어가는 경우가 생긴다. 이럴땐 자바 스크립트에서 UTF-8로 인코딩해서 넘겨주고 뭐 이런 방식 보다는 서버 설정을 바꿔 줌으로 문제를 해결 할 수 있다. Apache Tomcat의 Server.xml파일을 수정 하면 문제 해결!!




server.xml파일 어디 있는지 한참을 찾았다. 보통 개발은 Eclipse에서 진행 하기에 Eclipse를 기준으로 설명..


<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="utf8"/>


설정 부분중 빨간색으로 되어 있는 부분을 추가 하면 문제는 해결된다.

Posted by Z700zZz
Java2014. 5. 9. 18:01

HttpServletRequest의 getContextPath..


사용자가 요청한 URL에서 ContextPath만 알고 싶다면 HttpServletRequest의 getContextPath를 사용하면된다.


http://www.aaa.com:9999/bbb/ccc.jsp


사용자가 위의 URL을 입력했을때 getContextPath를 사용하면 bbb를 얻게 되고 getContextURI를 사용하게 되면 bbb/ccc.jsp를 얻게된다. getServerPort를 사용하면 9999를 얻을 수 있다.

Posted by Z700zZz
Java2014. 4. 28. 14:27

Build path specifies execution environment J2SE-1.4. There are no JREs installed in the workspace that are strictly compatible with this environment.

 

Mac OS에서 개발을 해오다 이직을 하면서 윈도우로 개발 환경을 꾸미고 있었다.

그러다 이클립스로 Hello World를 보고 Problems에 보니 위와 같은 Warings가 있는것..

위는 알맞는 JRE를 찾지 못해 발생하는 경고일뿐..당황하지 말자.

 

프로젝트에서 우클리한뒤 Properties - Java Build Path에서 현재 성택되어 있는 JRE를 지우고..

Default JRE를 선택해주면 문제는 해결된다.

'Java' 카테고리의 다른 글

Get 방식으로 한글 파라미터 깨짐 문제..  (0) 2014.11.24
HttpServletRequest의 getContextPath..  (0) 2014.05.09
Java Try Catch Finally..  (0) 2014.01.08
Java Object Copy(Clone)..  (0) 2013.12.12
java.lang.NoSuchMethodError..  (0) 2013.08.27
Posted by Z700zZz
Java2014. 1. 8. 14:06

프로그래밍을 하던 도중 Java의 Try Catch Finally에 대해서 궁금증이 하나 생겼다.

Try에서는 오류가 있거나 없거나 그안에 있는 구문을 처리하고, Catch에서는 Try에서 일어나는 오류에 대해서 처리를 한다.

그럼 Finally는 Try가 실행되고 오류가 없을경우 실행이 되는지 아님 Try와 Catch가 모두 실행 되고 오류에 상관없이 실행이 되는지에 대해서 궁금했다.


http://msdn.microsoft.com/ko-kr/library/vstudio/k4hea629(v=vs.100).aspx


결과는 후자였다.

오류가 나든말든 Try Catch를 모두다 실행하고 Finally를 실행한다.


그리고 내용을 읽다보면 중요한 정보가 하나 있다.

오류가 발생했을때 오류에 대한 내용을 반환하기 위해서 Catch안에 return문을 이용해 어떠한 결과값을 반환하는 코드가 있다면 Finally는 실행이 될까?

위 링크의 내용에 있지만 Try나 Catch에서 return을 만나게 된다면 그 return문이 실행 되기전에 Finally가 실행된다. 그래서 Finally문에는 가급적이면 return문을 사용하지 말것을 이야기하고 있다.


너무 기본적인걸 모르고 있었던건가..

Posted by Z700zZz
Java2013. 12. 12. 17:53

어제 저녁부터 나의 앞길을 가로 막은것이 자바 객체 복사..

서버가 시동 되면서 서버에 있는 데이터 파일을 읽어다가 Map형태로 서버에 들고 있는 형태.

그러다 요청이 오면 그 맵파일을 그대로 보내주기만 하면 되는 그런 구조.

데이터는 오라클 디비에서 불러온 값을 자바 Object형태를 파일로 쓴걸 다시 읽어온것이다.

데이터를 싱글톤 패턴으로 읽다보니 이 데이터를 가공하게 되면 다른 데이터에도 영향을 미치는 상황이었다.


data = CachedXPG.getInstance().getData();


위와 같은 코드로 서버에 저장된 데이터를 가지고 오는것이었고.

불러온 데이터를 가공하게 되면 서버를 다시 동작 시키지 않는 이상 가공된 데이터를 내보내게 되는 상황.


Map<String, Object> copyData = data;


위와 같은 코드로 아무리 복사를 해봐야 같은 주소를 바라보기 때문에 원래의 데이터를 변경하게 된다.

그래서 알아본게 얕은 복사와 깊은 복사인데..

이건 클래스에 Cloneable 인터페이스를 상속받아 clone()메소드를 구현해 줘야 한다.

이러기가 싫다라는 분은 아래와 같은 방법을 써보기 바란다.


public Object deepCopy(Object oldObj) {

ObjectOutputStream oos = null;

ObjectInputStream ois = null;

Object result;

try {

ByteArrayOutputStream bos = new ByteArrayOutputStream();

oos = new ObjectOutputStream(bos);

oos.writeObject(oldObj);

oos.flush();

ByteArrayInputStream  bin = new ByteArrayInputStream(bos.toByteArray());

ois = new ObjectInputStream(bin);

result = ois.readObject();

}catch(Exception e) {

e.printStackTrace();

result = null;

}finally {

try {

if(oos != null) oos.close();

if(ois != null) ois.close();

}catch(Exception e) {}

}

return result;

}


객체를 그대로 아웃풋 스트림으로 내보냈다가 인풋 스트림으로 읽어 들여오는 방법.

왜이런 생각을 하지 못했을까..

아직은 실력부족이다.

위의 방법으로 일겅 들여와 그걸 알맞은 타입으로 캐스팅 하면 객체 복사 완료.

Cloneable을 사용 못하는 경우에는 위와 같은 방법으로 해보길 바란다.

Posted by Z700zZz
Java2013. 8. 27. 22:53

어제부터 문제를 해결한 조금전까지 만 하루동안 나를 속썩이던 문제였다.

이번에 발생한 문제는 정말 나를 미치게 만들었다.


우선 서버는 4대..

각각의 서버의 webapps밑에 aaa,bbb,ccc라는 세개의 폴더가 존재하고, 각 폴더 밑에는 JSP파일들이 들어 있었다.

작동을 시켜보면 aaa와 bbb폴더 밑의 소스들은 제대로 잘 돌아가고 유독 ccc라는 폴더밑의 소스들만 java.lang.NoSuchMethodError라는 메세지를 내 뱉으며 작동이 되지 않는 상황.

처음에는 소스 문제인가 싶어 소스에 System.out.println()으로 값들을 확인해봐도 틀린점은 없는 상황.(현재 디버깅으로 확인을 못하는 상황)

제대로 잘 돌아가는 소스를 그대로 붙여넣어 작동을 해봐도 안되는 상황이었다.

그러다 java.lang.NoSuchMethodError로 검색을 하게 되었고, 이 에러가 왜 발생하는지에 대해서도 알게 되었다. 

일단 임포트한 라이브러리가 중복으로 존재해서 실행하려는 메소드를 어떤걸 참조해야 할지 모를때 발생하는 에러라는게 주된 내용.

모든 블로그에 설명이 라이브러리 중복 되어 있으니 찾아서 지워라는 설명뿐..


그중 좀 괜찮은 내용의 블로그는 http://ntalbs.tistory.com/143 요블로그..


위의 블로그를 참고해서 지웠다는건 아니다.

라이브러리가 중복 됐나 아무리 찾아도 안보이다가 결국에는 찾았는데 어디서 찾은지 설명을 하겠다.

보통 라이브러리 파일들은 apache폴더 밑에 lib에 넣어두는게 기본인데 이번에 중복된 라이브러리 파일은 ccc폴더 밑에 WEB-INF폴더가 실수로 들어가면서 라이브러리 파일이 중복 된것.


이번 프로젝트를 하면서 ant를 쓰기 시작했는데 아마도 여러개의 프로젝트를 하나로 합치고 그 합친 그로젝트를 서버에 올리는 과정에서 실수로 올라간것 같다.

찾아서 지우고 다시 돌려보니 제대로 돌아간다..


실력이 없다보니 나름 풀어서 설명을 한다고 했는데 이건뭐 내가 쓰면서도 제대로 된 설명인가 싶기도 하다.

하루가 걸리긴 했지만 그래도 오류를 찾아내니 뿌듯하긴..ㅜㅜ

'Java' 카테고리의 다른 글

Java Try Catch Finally..  (0) 2014.01.08
Java Object Copy(Clone)..  (0) 2013.12.12
Java Server Timeout Test하기.  (0) 2013.02.05
Https SSLHandshakeException..!  (0) 2012.10.16
EhCache의 Spring Framework(iBatis)적용...!  (0) 2012.09.18
Posted by Z700zZz