'분류 전체보기'에 해당되는 글 1012건
- 2010.11.14 테스트 시작하기, 좋은 시작~
- 2010.11.11 왜 소스를 보지 못하나.
- 2010.11.07 Sbarro
- 2010.11.07 대성수산
- 2010.11.05 Oracle APEX 를 실행하는 프로그램 찾기
- 2010.10.28 [Book] Mastering Enterprise JavaBeans
- 2010.10.22 외부 시스템과의 연동 테스트시 로컬에서 진행하기???
- 2010.10.21 최악의 경우
- 2010.10.18 소스 병합(Merge) Tip
- 2010.10.18 여러 장으로 나누어서 인쇄하기 2
- 2010.10.14 구글 캘린더 한글 검색
- 2010.10.14 치졸한 LG 인터넷(파워콤, Xpeed) 1
- 2010.10.14 파일 스트림을 이용해서 복사하기
- 2010.10.11 outside of
- 2010.10.10 복리 - 72 마법의 법칙
- 2010.10.07 황당한 실수
- 2010.10.05 이제는 테스트케이스를 만들지 않으면 불안하다.
- 2010.09.13 WebMatrix, Razor
- 2010.09.08 Eclipse 프로젝트에 에러 표시가 없어지지 않는 경우 해결방법
- 2010.09.06 순번 구하기
- 2010.09.05 Spring JNDI Mock
- 2010.09.05 이클립스 신기한 기능
- 2010.09.01 큰 로그 파일 자르기 - Windows
- 2010.08.27 Tomcat 표준출력을 파일로 남기기
- 2010.08.25 이클립스 버그 경고 기능
- 2010.08.25 Subversion에서 Tag를 잘못 단 경우
- 2010.08.25 편리한 UI - skydrive
- 2010.08.25 이클립스에 설치된 플러그인 확인하기
- 2010.08.24 이거 왜 마무리...안되었나?[미완]왜...법을 어긴 사람이 장관이 되려고 할까?
- 2010.08.22 [야구기록지] 2010-08-20
- 테스트 시작하기, 좋은 시작~
- 日常茶飯事
- 2010. 11. 14. 13:21
H가 우리 팀으로 합류했다.
계속 테스트에 대한 이야기를 했더니 이번 수정사항에 대해서 테스트 코드를 짜왔다.
오호...
- 기존 소스
1. 별도의 main 메서드를 이용했다.
2. 테스트를 해야 하는 부분이 해당 업무의 끝부분이다.
데이터베이스 접근도 많이 하고 각종 설정이 필요하다.
그래서 테스트하려고 하는 부분의 소스 코드 조각을 따로 떼어서 테스트 코드에 복사했다.
3. 테스트하려는 코드내에서 데이터베이스를 접근하는 코드가 있다.
데이터베이스를 접근하는 코드는 위와 같이 해서 제거했는데 이 부분은 뺄 수가 없다.
그래서 별도의 메서드로 만들어서 테스트 데이터를 리턴하게 만들었다.
- H가 작성한 테스트 코드
- 좀 더 개선한다면
계속 테스트에 대한 이야기를 했더니 이번 수정사항에 대해서 테스트 코드를 짜왔다.
오호...
- 기존 소스
1. 별도의 main 메서드를 이용했다.
그래, 방법이 중요한게 아니야.
2. 테스트를 해야 하는 부분이 해당 업무의 끝부분이다.
데이터베이스 접근도 많이 하고 각종 설정이 필요하다.
그래서 테스트하려고 하는 부분의 소스 코드 조각을 따로 떼어서 테스트 코드에 복사했다.
필요한 부분만 복사해서 테스트한거는 나름대로 고민한 끝에 나온 방법이네.
그런데 복사한 소스는 중복이 되고, 나중에 업무 로직이 변경되어서 소스가 변경되었는데 테스트 코드는 변경되지 않을 수도 있잖아.
그런데 복사한 소스는 중복이 되고, 나중에 업무 로직이 변경되어서 소스가 변경되었는데 테스트 코드는 변경되지 않을 수도 있잖아.
3. 테스트하려는 코드내에서 데이터베이스를 접근하는 코드가 있다.
데이터베이스를 접근하는 코드는 위와 같이 해서 제거했는데 이 부분은 뺄 수가 없다.
그래서 별도의 메서드로 만들어서 테스트 데이터를 리턴하게 만들었다.
좋은 시도다.
ERPDAO가 외부에서 변경이 가능했다면 더 좋았을텐데.
아니면 이 부분도 별도의 메서드로 빼서 구현해 놓으면 교체가 쉬울텐데.
ERPDAO가 외부에서 변경이 가능했다면 더 좋았을텐데.
아니면 이 부분도 별도의 메서드로 빼서 구현해 놓으면 교체가 쉬울텐데.
ERPDAO처럼 우리가 데이터를 마음대로 변경할 수 없는 경우 테스트하기가 곤란하다.
지금 테스트를 통과하는 데이터가 내일은 없을지도 모른다.
이런 곳은 Mock이 좋겠다. 아니면 동의어를 사용해서 로컬에 테이블을 만든다.
지금 테스트를 통과하는 데이터가 내일은 없을지도 모른다.
이런 곳은 Mock이 좋겠다. 아니면 동의어를 사용해서 로컬에 테이블을 만든다.
- H가 작성한 테스트 코드
- 좀 더 개선한다면
- 왜 소스를 보지 못하나.
- 日常茶飯事
- 2010. 11. 11. 14:20
SOAP을 통해서 데이터를 주고 받는 시스템
데이터가 조금 많기는 하지만 내부 업무 로직이 더 복잡하다.
금액을 계산하고 과거 데이터를 조회하고.
나는 서버측과 클라이언트측 중간에서 데이터를 전달하는 모듈을 맡고 있다.
이 시스템을 유지보수하는 인력들의 기술력은 그다지 높지 않다.
업무를 잘 알기는 하지만 자바 기초 문법 정도만 알고 있다.
이런 상황에서 서버측 문제가 발생하면 해결을 하지 못한다.
담당자들이 소스를 아무리 들여다보고 있어도 추측만 할 뿐이지 명확하게 이야기하지 못한다.
SOAP 메세지를 파싱하고 복호화를 해서 데이터(XML)를 가져와서 내부 업무 로직을 태우는데 자바에 익숙지 않아서 무리가 따른다.
덩치 큰 업무 시스템이어서 로컬에서 돌리기에도 힘들고 - 이것저것 세팅을 해야 하고, IP도 변경해야 하고
서버에서 돌아가는 로그만 보고 있으니 디버깅하기가 참 힘들겠다는 생각이 든다.
그런데 이 프로그램을 로컬에서 간단하게 돌릴수 있으면, 콘솔에 변수를 찍어가며 데이터를 확인해 보면서 디버깅을 할 수 있지 않을까하는 생각이 든다.
자바에 익숙하지 않아도 눈으로 보면서 해보면 업무를 아니깐.
그래! 테스트를 작성하자!
로컬에서 언제든지 동작하는 테스트케이스를 작성해 두면 담당자들이 디버깅하기도 쉽고, 소스를 안보려고 회피하는 모습을 더이상 안봐도 된다.
- 클라이언트측에서 전송한 데이터를 처리하는 부분은 XML 데이터를 입력받을 수 있게 하고
- 데이터베이스 연결은 WAS에 종속적이지 않게 하고
- 에러가 발생하는 부분의 클래스만 생성해서 돌려보면 된다.
데이터가 조금 많기는 하지만 내부 업무 로직이 더 복잡하다.
금액을 계산하고 과거 데이터를 조회하고.
나는 서버측과 클라이언트측 중간에서 데이터를 전달하는 모듈을 맡고 있다.
이 시스템을 유지보수하는 인력들의 기술력은 그다지 높지 않다.
업무를 잘 알기는 하지만 자바 기초 문법 정도만 알고 있다.
이런 상황에서 서버측 문제가 발생하면 해결을 하지 못한다.
담당자들이 소스를 아무리 들여다보고 있어도 추측만 할 뿐이지 명확하게 이야기하지 못한다.
SOAP 메세지를 파싱하고 복호화를 해서 데이터(XML)를 가져와서 내부 업무 로직을 태우는데 자바에 익숙지 않아서 무리가 따른다.
덩치 큰 업무 시스템이어서 로컬에서 돌리기에도 힘들고 - 이것저것 세팅을 해야 하고, IP도 변경해야 하고
서버에서 돌아가는 로그만 보고 있으니 디버깅하기가 참 힘들겠다는 생각이 든다.
그런데 이 프로그램을 로컬에서 간단하게 돌릴수 있으면, 콘솔에 변수를 찍어가며 데이터를 확인해 보면서 디버깅을 할 수 있지 않을까하는 생각이 든다.
자바에 익숙하지 않아도 눈으로 보면서 해보면 업무를 아니깐.
그래! 테스트를 작성하자!
로컬에서 언제든지 동작하는 테스트케이스를 작성해 두면 담당자들이 디버깅하기도 쉽고, 소스를 안보려고 회피하는 모습을 더이상 안봐도 된다.
- 클라이언트측에서 전송한 데이터를 처리하는 부분은 XML 데이터를 입력받을 수 있게 하고
- 데이터베이스 연결은 WAS에 종속적이지 않게 하고
- 에러가 발생하는 부분의 클래스만 생성해서 돌려보면 된다.
- Oracle APEX 를 실행하는 프로그램 찾기
- 日常茶飯事
- 2010. 11. 5. 19:05
간만에 개발서버에 접속하려는데 Oracle APEX 에 접속이 되지 않는다.
어떤 서비스를 실행시켜야 하는지 모르겠다.
포트가 8080이니깐 찾아보자.
PID가 1388인 프로세스를 찾자.
아마 오라클 서비스겠지.
어떤 서비스를 실행시켜야 하는지 모르겠다.
포트가 8080이니깐 찾아보자.
> netstat -nao | findstr 8080
TCP 127.0.0.1:8080 0.0.0.0:0 LISTENING 1388
(외부에서는 접속 못하게 되어 있네.)TCP 127.0.0.1:8080 0.0.0.0:0 LISTENING 1388
PID가 1388인 프로세스를 찾자.
> tasklist | findstr 1388
TNSLSNR.EXE 1388 RDP-Tcp#133 0 7,852 K
TNSLSNR.EXE 1388 RDP-Tcp#133 0 7,852 K
아마 오라클 서비스겠지.
>sc qc "OracleXETNSListener"
[SC] GetServiceConfig SUCCESS
SERVICE_NAME: OracleXETNSListener
TYPE : 10 WIN32_OWN_PROCESS
START_TYPE : 2 AUTO_START
ERROR_CONTROL : 0 IGNORE
BINARY_PATH_NAME : C:\oraclexe\app\oracle\product\10.2.0\server\BIN\tn
slsnr.exe
LOAD_ORDER_GROUP :
TAG : 0
DISPLAY_NAME : OracleXETNSListener
DEPENDENCIES :
SERVICE_START_NAME : LocalSystem
[SC] GetServiceConfig SUCCESS
SERVICE_NAME: OracleXETNSListener
TYPE : 10 WIN32_OWN_PROCESS
START_TYPE : 2 AUTO_START
ERROR_CONTROL : 0 IGNORE
BINARY_PATH_NAME : C:\oraclexe\app\oracle\product\10.2.0\server\BIN\tn
slsnr.exe
LOAD_ORDER_GROUP :
TAG : 0
DISPLAY_NAME : OracleXETNSListener
DEPENDENCIES :
SERVICE_START_NAME : LocalSystem
- [Book] Mastering Enterprise JavaBeans
- 日常茶飯事
- 2010. 10. 28. 01:07
- 외부 시스템과의 연동 테스트시 로컬에서 진행하기???
- 日常茶飯事
- 2010. 10. 22. 05:30
상대방의 서버에서 SOAP 메세지를 보내오면 첨부된 XML 파일을 읽어서 데이터를 처리하는 기능이 있다.
이 XML 파일을 처리하면서 어떤 오류가 발생했다.
이 오류를 확인하기 위해서는 상대방에게 계속 동일 데이터를 매번 요청해야 한다.
이게 의심이 나면 수정하고 WAS 내렸다 올리고 전화해서 데이터 보내달라고 하고, 몇 분 기다렸다 데이터 보내주면 다시 디버깅하고.
상대방이 데이터를 바로 보내주면 다행이다.
그 사람들도 본업이 있는지라 1시간 뒤에 보내줄때도 있고, 가끔 시스템 장애로 다음 날 보내주는 경우도 있다.
SOAP 메세지는 문제없으니깐 XML 처리하는 부분만 테스트하자.
로그에서 첨부된 XML을 가져와서 이 부분만 테스트하자. - 데이터를 다시 보내달라고 할 필요없음.
- WAS 재기동 필요없음.
- 여기까지만 하다보니 문제점이 보였다.
우캬캬.
이 XML 파일을 처리하면서 어떤 오류가 발생했다.
이 오류를 확인하기 위해서는 상대방에게 계속 동일 데이터를 매번 요청해야 한다.
이게 의심이 나면 수정하고 WAS 내렸다 올리고 전화해서 데이터 보내달라고 하고, 몇 분 기다렸다 데이터 보내주면 다시 디버깅하고.
상대방이 데이터를 바로 보내주면 다행이다.
그 사람들도 본업이 있는지라 1시간 뒤에 보내줄때도 있고, 가끔 시스템 장애로 다음 날 보내주는 경우도 있다.
SOAP 메세지는 문제없으니깐 XML 처리하는 부분만 테스트하자.
로그에서 첨부된 XML을 가져와서 이 부분만 테스트하자. - 데이터를 다시 보내달라고 할 필요없음.
- WAS 재기동 필요없음.
- 여기까지만 하다보니 문제점이 보였다.
우캬캬.
http://www.godowon.com/last_letter/view.gdw?no=2845
지금도 나는
강연이 시작되기 전에
언제나 최악의 경우를 예상합니다.
이를테면, 아무도 없는 텅 빈 강당에서
단상 앞에 홀로 서 있는 내 모습이나 사람들의 호응을
제대로 얻지 못하는 광경을 상상하는 것입니다.
그렇게 하면 사람들이 '뜻밖에' 나를 환대해줄 때
나는 그 반응을 더한층 '깊이' 음미하게 됩니다.
그리고 정말로 청중석이 텅 비었다 해도
깜짝 놀라거나 당황하지 않을 겁니다.
- 알랙상드르 졸리앙의《고마워요 철학부인》중에서
지금도 나는
강연이 시작되기 전에
언제나 최악의 경우를 예상합니다.
이를테면, 아무도 없는 텅 빈 강당에서
단상 앞에 홀로 서 있는 내 모습이나 사람들의 호응을
제대로 얻지 못하는 광경을 상상하는 것입니다.
그렇게 하면 사람들이 '뜻밖에' 나를 환대해줄 때
나는 그 반응을 더한층 '깊이' 음미하게 됩니다.
그리고 정말로 청중석이 텅 비었다 해도
깜짝 놀라거나 당황하지 않을 겁니다.
- 알랙상드르 졸리앙의《고마워요 철학부인》중에서
- 소스 병합(Merge) Tip
- 日常茶飯事
- 2010. 10. 18. 22:38
1. 먼저 SVN Repositories에서 trunk의 History를 확인한다.
trunk의 변경사항을 알면 merge 작업시 도움이 된다.
(어떤 파일을 수정했는지)
2. 충돌난 소스를 확인한다. : 아주 많을것이다.
3. trunk에서 변경된 파일을 확인한다. : 이 부분은 branch에서도 같은 부분을 작업했을수도 있으므로 자세히 확인한다.
4. 나머지 충돌난 파일은 branch에서 작업한 내용이므로 한꺼번에 충돌을 해소해도 된다.(Edit Conflict, Mark as Merged)
- trunk에서는 존재하는 파일인데 branch에서 삭제한 파일은 추가된 이미지( )로 보인다.
JEE Perspective에서 직접 삭제한다.
- Override and Update로 잘못 받은 파일은 Revert하면 된다.
(어차피 merge는 로컬에서만 발생하였다.)
- branch에서 어떤 부분을 수정했는지 보려고 할때 trunk와 머지해보면 알수 있다.
머지하면 로컬 소스가 변경되므로 Revert 기능으로 되돌리면 된다.
(이때 branch에서 삭제되어서 trunk와 머지하면 추가되는 파일은 Revert를 해도 안지워진다. 직접 지운다. 그리고 나서 branch와 동기화를 해본다.)
trunk의 변경사항을 알면 merge 작업시 도움이 된다.
(어떤 파일을 수정했는지)
2. 충돌난 소스를 확인한다. : 아주 많을것이다.
3. trunk에서 변경된 파일을 확인한다. : 이 부분은 branch에서도 같은 부분을 작업했을수도 있으므로 자세히 확인한다.
4. 나머지 충돌난 파일은 branch에서 작업한 내용이므로 한꺼번에 충돌을 해소해도 된다.(Edit Conflict, Mark as Merged)
- trunk에서는 존재하는 파일인데 branch에서 삭제한 파일은 추가된 이미지( )로 보인다.
JEE Perspective에서 직접 삭제한다.
- Override and Update로 잘못 받은 파일은 Revert하면 된다.
(어차피 merge는 로컬에서만 발생하였다.)
- branch에서 어떤 부분을 수정했는지 보려고 할때 trunk와 머지해보면 알수 있다.
머지하면 로컬 소스가 변경되므로 Revert 기능으로 되돌리면 된다.
(이때 branch에서 삭제되어서 trunk와 머지하면 추가되는 파일은 Revert를 해도 안지워진다. 직접 지운다. 그리고 나서 branch와 동기화를 해본다.)
- 여러 장으로 나누어서 인쇄하기
- 雜동사니
- 2010. 10. 18. 22:32
- 구글 캘린더 한글 검색
- 雜동사니
- 2010. 10. 14. 21:09
- 치졸한 LG 인터넷(파워콤, Xpeed)
- 雜동사니
- 2010. 10. 14. 20:59
꽤 오랜 기간 파워콤을 사용하다가 올 3월 이사를 하면서 인터넷 정지 신청을 했다.
이사가는 아파트에 인터넷이 들어올지도 몰라서 그렇게 했는데 정지 신청한게 풀려서 요금이 부과된다는 문자가 왔다.
이런저런 일로 바빠서 해지를 못하고 있다가 고객센터로 전화를 해서 해지를 할려고 보니 그동안의 모든 요금이 부과되는거다.
이런...
1, 2주 정도의 요금은 내 잘못이니깐 부담해야지 했는데 정지 신청을 했음에도 불구하고 그동안의 모든 요금을 내라고 한다.
난 정지를 시켰는데 LG쪽 잘못으로 요금이 부과된거 같은데 확인을 해달라고 하니 그래도 요금을 내란다.
하도 답답해서 그동안 아예 인터넷을 사용하지도 않았는데 정, 그러면 내가 사용한 네트워크 트래픽 양을 봐라.
그런거 정도는 볼 수 있지 않냐. 나는 이사하느라 모뎀이 어디에 있는지도 모른다.
장장 1시간을 통화했는데 무조건 내라고 한다.
어떻게든 따지려고 정지 신청을 또 했다.
해지하면 이놈들이 내 말을 안들어줄거 같아서.
그러다 회사일로 바빠서 항의는 못하고 정지 신청 기간이 다되어서 고객센터로 전화를 했다.
해지할려구요.
고객님은 장기우대고객이라 할인혜택이 많으시고.....
지겹도록 들은 이야기, 장기고객인데 이따구로 하냐.
다 필요없고, 더이상 나한테 그런 말하지 말고 해지만 시켜줘요. 바빠요.
처음 해지신청이 제대로 안되었을때는 고객센터에 전화해도 아무런 말이 없이 매번 할인혜택 이야기만 했다.
거기에 두번째로 해지신청할때는 내가 상담원이랑 1시간 넘게 통화한 기록도 없어졌단다.
(우씨 고의로 지운거 같다. 그렇게 오래 통화를 했는데 기록이 없어? 기가 찬다)
그게 LG다. 너네는 절대 1등은 못한다. ㅂㅅ.
모든 인터넷 서비스사가 마찬가지겠지.
경쟁이 붙어서 이러니.
누구 말맞다나 1년 약정하고 돈받고 다른 회사로 옮기는게 최고라.
그래도 상담한 기록도 없고, 모뎀을 아예 켜지도 않았는데 요금은 부과되고. 해지 처리는 이상하고.
쩝.
이사가는 아파트에 인터넷이 들어올지도 몰라서 그렇게 했는데 정지 신청한게 풀려서 요금이 부과된다는 문자가 왔다.
이런저런 일로 바빠서 해지를 못하고 있다가 고객센터로 전화를 해서 해지를 할려고 보니 그동안의 모든 요금이 부과되는거다.
이런...
1, 2주 정도의 요금은 내 잘못이니깐 부담해야지 했는데 정지 신청을 했음에도 불구하고 그동안의 모든 요금을 내라고 한다.
난 정지를 시켰는데 LG쪽 잘못으로 요금이 부과된거 같은데 확인을 해달라고 하니 그래도 요금을 내란다.
하도 답답해서 그동안 아예 인터넷을 사용하지도 않았는데 정, 그러면 내가 사용한 네트워크 트래픽 양을 봐라.
그런거 정도는 볼 수 있지 않냐. 나는 이사하느라 모뎀이 어디에 있는지도 모른다.
장장 1시간을 통화했는데 무조건 내라고 한다.
어떻게든 따지려고 정지 신청을 또 했다.
해지하면 이놈들이 내 말을 안들어줄거 같아서.
그러다 회사일로 바빠서 항의는 못하고 정지 신청 기간이 다되어서 고객센터로 전화를 했다.
해지할려구요.
고객님은 장기우대고객이라 할인혜택이 많으시고.....
지겹도록 들은 이야기, 장기고객인데 이따구로 하냐.
다 필요없고, 더이상 나한테 그런 말하지 말고 해지만 시켜줘요. 바빠요.
처음 해지신청이 제대로 안되었을때는 고객센터에 전화해도 아무런 말이 없이 매번 할인혜택 이야기만 했다.
거기에 두번째로 해지신청할때는 내가 상담원이랑 1시간 넘게 통화한 기록도 없어졌단다.
(우씨 고의로 지운거 같다. 그렇게 오래 통화를 했는데 기록이 없어? 기가 찬다)
그게 LG다. 너네는 절대 1등은 못한다. ㅂㅅ.
모든 인터넷 서비스사가 마찬가지겠지.
경쟁이 붙어서 이러니.
누구 말맞다나 1년 약정하고 돈받고 다른 회사로 옮기는게 최고라.
그래도 상담한 기록도 없고, 모뎀을 아예 켜지도 않았는데 요금은 부과되고. 해지 처리는 이상하고.
쩝.
- 파일 스트림을 이용해서 복사하기
- 日常茶飯事
- 2010. 10. 14. 19:35
서버가 여러 대인 시스템 구성에서 FCKeditor를 이용하면서 파일을 업로드하는 기능을 구현
업로드한 파일이 여러 대의 서버에 저장되거나 단일 파일 서버에 저장되어야 함.
웹에디터의 특성으로 인해 파일(업로드된 이미지)이 웹어플리케이션내에 존재해야 함.
각 서버에 업로드된 이미지 파일이 있어야 하므로 업로드하면서 파일을 각 서버에 복사하기로 함.
- 윈도우즈 환경이라서 네트워크 드라이브를 바로 가기로 만들어서 했는데 안된다고 함.(뭔 말이고???)
- 어떻게 파일 업로드하는 부분을 찾아서 왔다.
net.fckeditor.connector.impl.AbstractLocalFileSystemConnector 를 수정했다고 한다.
그러나 적합한 디렉토리가 아니라는 둥, 에러가 난다.
- 여차저차 디렉토리를 생성하도록 하고 나니 이번에는 파일은 생성되는데 크기가 0이라고 한다.
메서드의 인자중 하나가 inputStream(FileInputStream)으로 넘어온다.
이 스트림을 가지고 org.apache.commons.io.IOUtils.copyLarge(InputStream input, OutputStream output) 을 이용해서 복사한다.
스트림을 이용해서 파일을 복사하고 나면 스트림 끝에 도달했으므로 두번째 복사부터는 파일을 쓸수가 없다.(WRITE)
스트림을 어딘가에 저장해 두었다가 파일 복사할때 스트림을 처음으로 되돌려서 사용하는게 좋겠다.
적당한 녀석이 ByteArrayInputStream 이다.
(RamdomAccessFile 도 될수 있을라나?)
파일 스트림을 읽어서 바이트 배열로 만들어야 하는데 System.arraycopy() 를 쓰면 되겠다 싶었다.
- 물어보기만 하던 녀석이 ByteArrayOutputStream 을 쓸거라고 한다.
오...호
읽어들인 스트림을 처음으로 돌리려면 reset()을 호출한다.
- 덧붙이면,
업로드한 파일이 여러 대의 서버에 저장되거나 단일 파일 서버에 저장되어야 함.
웹에디터의 특성으로 인해 파일(업로드된 이미지)이 웹어플리케이션내에 존재해야 함.
각 서버에 업로드된 이미지 파일이 있어야 하므로 업로드하면서 파일을 각 서버에 복사하기로 함.
- 윈도우즈 환경이라서 네트워크 드라이브를 바로 가기로 만들어서 했는데 안된다고 함.(뭔 말이고???)
- 어떻게 파일 업로드하는 부분을 찾아서 왔다.
net.fckeditor.connector.impl.AbstractLocalFileSystemConnector 를 수정했다고 한다.
그러나 적합한 디렉토리가 아니라는 둥, 에러가 난다.
- 여차저차 디렉토리를 생성하도록 하고 나니 이번에는 파일은 생성되는데 크기가 0이라고 한다.
메서드의 인자중 하나가 inputStream(FileInputStream)으로 넘어온다.
이 스트림을 가지고 org.apache.commons.io.IOUtils.copyLarge(InputStream input, OutputStream output) 을 이용해서 복사한다.
스트림을 이용해서 파일을 복사하고 나면 스트림 끝에 도달했으므로 두번째 복사부터는 파일을 쓸수가 없다.(WRITE)
스트림을 어딘가에 저장해 두었다가 파일 복사할때 스트림을 처음으로 되돌려서 사용하는게 좋겠다.
적당한 녀석이 ByteArrayInputStream 이다.
(RamdomAccessFile 도 될수 있을라나?)
파일 스트림을 읽어서 바이트 배열로 만들어야 하는데 System.arraycopy() 를 쓰면 되겠다 싶었다.
- 물어보기만 하던 녀석이 ByteArrayOutputStream 을 쓸거라고 한다.
오...호
읽어들인 스트림을 처음으로 돌리려면 reset()을 호출한다.
- 덧붙이면,
IOUtils.copyLarge()의 리턴값도 체크할 것. 방어적인 코딩이 정신건강에 좋지 않나.
- outside of
- 雜동사니
- 2010. 10. 11. 01:00
outside of
1. …의 바깥쪽에, 밖에[으로]
2. …의 범위·한계를 넘어서
3. …이외에(except)
refer to somebody/something
1. ~을 나타내다[~와 관련 있다]
2. (정보를 알아내기 위해) …을 보다[… 에게 문의하다]
1. …의 바깥쪽에, 밖에[으로]
2. …의 범위·한계를 넘어서
3. …이외에(except)
refer to somebody/something
1. ~을 나타내다[~와 관련 있다]
2. (정보를 알아내기 위해) …을 보다[… 에게 문의하다]
- 복리 - 72 마법의 법칙
- 雜동사니
- 2010. 10. 10. 16:10
- 이제는 테스트케이스를 만들지 않으면 불안하다.
- 日常茶飯事
- 2010. 10. 5. 23:00
업무단에서 에러가 발생해서 응답 XML을 생성하지 못하는 경우 통신단에서 SOAP Envelope에 에러를 넣어준다.(eb:ErrorList)
그러나 에러 메세지를 제대로 처리하지 못해서 테스트를 작성해서 수정했다.
SOAPEnvelope라는 클래스에서 처리하는데 다행히 POJO 형태이고 외부 설정이나 기타 다른 의존성이 없었다.
테스트케이스를 작성하는데 어려움은 없었고, 테스트케이스를 작성하면서 잘못 구현된 부분을 발견하였다.
잘못 구현된 부분이 프로그램에서 영향을 주는 부분이 아니고, 수정한 프로그램을 20개가 넘는 고객사에 다시 배포를 해야 하는 문제때문에 확인만 하고 넘어간다.
이제는 테스트케이스를 만들지 않으면 불안하다.
- SOAP 메세지를 동일 패키지에 있는 파일에서 읽어오도록 한다.(언제든지 테스트가 실행될 수 있도록, 클래스패스로 읽어들이는 것이 가장 좋지 않나?)
그러나 에러 메세지를 제대로 처리하지 못해서 테스트를 작성해서 수정했다.
SOAPEnvelope라는 클래스에서 처리하는데 다행히 POJO 형태이고 외부 설정이나 기타 다른 의존성이 없었다.
테스트케이스를 작성하는데 어려움은 없었고, 테스트케이스를 작성하면서 잘못 구현된 부분을 발견하였다.
잘못 구현된 부분이 프로그램에서 영향을 주는 부분이 아니고, 수정한 프로그램을 20개가 넘는 고객사에 다시 배포를 해야 하는 문제때문에 확인만 하고 넘어간다.
이제는 테스트케이스를 만들지 않으면 불안하다.
- SOAP 메세지를 동일 패키지에 있는 파일에서 읽어오도록 한다.(언제든지 테스트가 실행될 수 있도록, 클래스패스로 읽어들이는 것이 가장 좋지 않나?)
- WebMatrix, Razor
- 日常茶飯事
- 2010. 9. 13. 23:57
- Razor & WebMatrix 웹 개발 강좌
WebMatrix는 웹 개발자가 웹사이트를 쉽고 빠르게 제작, 커스터마이징이 가능하도록 돕는 새로운 개발 도구 & 플랫폼 이라고 한다.
다음의 기술들을 포함하고 있다.
IIS Developer Express
SQL Server Compact Edition 4
개발 프레임워크 - "Razor" : ASP.NET 기반의 엔진
초간단 샘플
- http://www.microsoft.com/web/webmatrix/
- 2010-10-15, Beta2
WebMatrix는 웹 개발자가 웹사이트를 쉽고 빠르게 제작, 커스터마이징이 가능하도록 돕는 새로운 개발 도구 & 플랫폼 이라고 한다.
다음의 기술들을 포함하고 있다.
IIS Developer Express
SQL Server Compact Edition 4
개발 프레임워크 - "Razor" : ASP.NET 기반의 엔진
초간단 샘플
Hello, @name, the year is @DateTime.Now.Year
- http://www.microsoft.com/web/webmatrix/
- 2010-10-15, Beta2
- Eclipse 프로젝트에 에러 표시가 없어지지 않는 경우 해결방법
- 日常茶飯事
- 2010. 9. 8. 12:57
하위 디렉토리에 에러는 없는데 프로젝트에는 에러 표시가 있다.
Problems 뷰를 보면 원인을 찾을 수 있다.
- 위 경우는 컴파일러 버전이 맞지 않은 경우다.
Problems 뷰를 보면 원인을 찾을 수 있다.
- 위 경우는 컴파일러 버전이 맞지 않은 경우다.
Java compiler level does not match the version of the installed Java project facet.
Java Compiler - Compiler compliance level과 Project Facets의 버전을 맞춘다.
Java Compiler-Compiler compliance level, Generated .class files compatibility, Source compatibility에서 버전을 변경할 수 있다.(org.eclipse.jdt.core.prefs에 저장됨)
Dynamic Web Project에서는 직접 변경해야 되는 경우가 생길 수 있다.
- 형상관리시스템에서 소스를 update했는데 test/ 가 없어진 경우도 있었음.
- ClassNotFoundException 이 발생했는데 확인해 보니 클래스 파일이 생성되지 않았다.
Problems 뷰에 자세히 나와 있다.
The project was not built due to "Could not delete
'/Sample/build/classes/com'.". Fix the problem, then try refreshing this
project and building it since it may be inconsistent
TB_DATA에 pk1, pk2, pk_old 가 기본키로 존재했음.
pk_old는 중복된 값이 들어올 수 있어서 pk_new 가 새로운 키로 들어와서 pk_old와 교체해야 하는 상황이 생겼음.
pk_new는 순번이다.
pk_new를 추가하고 기존 기본키를 삭제.
pk_new는 데이터가 들어가 있지 않으므로 순번을 넣어야 함.
- 순번을 rank()를 사용하지 않고 구하는 방법도 있음.
- 위 구문에서 SET 절의 pk_new를 a.pk_new로 하면 다음과 같은 에러가 발생한다.
pk_old는 중복된 값이 들어올 수 있어서 pk_new 가 새로운 키로 들어와서 pk_old와 교체해야 하는 상황이 생겼음.
pk_new는 순번이다.
pk_new를 추가하고 기존 기본키를 삭제.
pk_new는 데이터가 들어가 있지 않으므로 순번을 넣어야 함.
UPDATE TB_DATA --SQL Server 2005 SET pk_new = b.ser FROM TB_DATA a, ( SELECT rank() OVER (PARTITION BY pk1, pk2 ORDER BY pk_old) as ser , pk1, pk2, pk_old FROM TB_DATA ) b WHERE a.pk1 = b.pk1 and a.pk2 = b.pk2 and a.pk_old = b.pk_old
- 순번을 rank()를 사용하지 않고 구하는 방법도 있음.
- 위 구문에서 SET 절의 pk_new를 a.pk_new로 하면 다음과 같은 에러가 발생한다.
메시지 4104, 수준 16, 상태 1, 줄 2
여러 부분으로 구성된 식별자 "a.pk_new"은(는) 바인딩할 수 없습니다.
여러 부분으로 구성된 식별자 "a.pk_new"은(는) 바인딩할 수 없습니다.
- Spring JNDI Mock
- 日常茶飯事
- 2010. 9. 5. 19:01
일반적인 웹어플리케이션은 WAS에서 JNDI를 통해서 데이터베이스 커넥션을 가져온다.
이런 방법이 편한듯 하면서도 형상관리 서버에서 소스를 가져올 때 매번 WAS 설정을 해야 해서 귀찮았다.
테스트 코드에 관심을 가지면서 가장 문제된 부분이 데이터베이스 커넥션인데 WAS를 기동하지 않은 상태에서 JNDI를 가져오는게 쉽지 않았다.
별별 이상한 방법(?, 고민 1, 방법1 2, 방법2)을 사용해서 소스를 리팩토링했는데 스프링 Mock에 포함된 3SimpleNamingContextBuilder 를 알고 나서 반나절동안 패닉 상태에 빠졌다.
그냥 이 코드 한줄이면 JNDI를 WAS에 종속적이지 않게 lookup 할 수 있었다.
- 오늘의 교훈
역시 사람은 배워야 한다.
모르면 손발이 고생한다.
이런 방법이 편한듯 하면서도 형상관리 서버에서 소스를 가져올 때 매번 WAS 설정을 해야 해서 귀찮았다.
테스트 코드에 관심을 가지면서 가장 문제된 부분이 데이터베이스 커넥션인데 WAS를 기동하지 않은 상태에서 JNDI를 가져오는게 쉽지 않았다.
별별 이상한 방법(?, 고민 1, 방법1 2, 방법2)을 사용해서 소스를 리팩토링했는데 스프링 Mock에 포함된 3SimpleNamingContextBuilder 를 알고 나서 반나절동안 패닉 상태에 빠졌다.
그냥 이 코드 한줄이면 JNDI를 WAS에 종속적이지 않게 lookup 할 수 있었다.
- 오늘의 교훈
역시 사람은 배워야 한다.
모르면 손발이 고생한다.
- 이클립스 신기한 기능
- 日常茶飯事
- 2010. 9. 5. 11:41
그동안 다른 프로젝트에 있던 소스가 필요해서 복사해서 붙여넣곤 했다.
더 좋은 기능 발견
소스를 복사해서 소스 디렉토리에 붙여넣으면 해당 클래스가 생기고 소스가 저장된다.
거기에 패키지까지 자동으로 만들어 진다.
우와...
더 좋은 기능 발견
소스를 복사해서 소스 디렉토리에 붙여넣으면 해당 클래스가 생기고 소스가 저장된다.
거기에 패키지까지 자동으로 만들어 진다.
우와...
- 큰 로그 파일 자르기 - Windows
- 日常茶飯事
- 2010. 9. 1. 19:30
- 빵집으로 파일 분할
빵집에 이 기능이 있는데 첫번째 파일은 exe로 되어 있어서 내용을 볼 수 없다.
나머지 파일은 볼 수 있음.
- Text File Cleaver
텍스트파일 나누기 - Text file cleaver
무설치, 한글이 깨진다.
제작사 : http://www.bartdart.com/
- iHP TxT Split
텍스트파일 간단히 분할하기 - iHP TxT Split v0.2
무설치, 한글이 깨지기도 한다.
빵집에 이 기능이 있는데 첫번째 파일은 exe로 되어 있어서 내용을 볼 수 없다.
나머지 파일은 볼 수 있음.
- Text File Cleaver
텍스트파일 나누기 - Text file cleaver
무설치, 한글이 깨진다.
제작사 : http://www.bartdart.com/
- iHP TxT Split
텍스트파일 간단히 분할하기 - iHP TxT Split v0.2
무설치, 한글이 깨지기도 한다.
- Tomcat 표준출력을 파일로 남기기
- 日常茶飯事
- 2010. 8. 27. 01:14
고객사에 모듈 업그레이드를 했는데 에러가 난다.
로그를 확인해야 하는데 로그가 없다.
클래스 로딩되는 상황을 확인해야 하는데 표준출력이 어디로 가는건지...
콘솔에서 starup.bat 를 실행시키거나 startup.bat 를 더블클릭해서 Tomcat을 시작하는 경우 표준출력이 콘솔에 출력되어서 지나간 로그를 확인하기가 힘들다.
(Tomcat 버전에 관계없이 당연한 현상임)
Tomcat이 새창으로 구동되어서 표준출력을 파일로 리다이렉션을 시켜도 파일이 제대로 남지 않는다.
로그가 많아서 필요한 로그는 새창에서 지나가 버림.
startup.bat, catalina.bat 를 이것저것 수정해도 안됨.
로그를 남기려면 새창을 띄우면 안됨.
새창을 띄우는 부분을 찾아서 수정하면 될거 같다.
또는
이렇게 하면 표준출력이 파일로 떨어진다.
(서비스로 구동시키면 stdout.log, stderr.log 가 생길거야.)
- 회고
운영되는 서버를 왜 이렇게 구동시키지? 우....띠
예전에 이런 문제가 발생했을때 확실히 분석해서 방법을 알아뒀으면 오늘같은 고생은 안했을건데.
로그보고 에러 잡는 일이 남았다. 이제부터 진짜 일이지.
로그를 확인해야 하는데 로그가 없다.
클래스 로딩되는 상황을 확인해야 하는데 표준출력이 어디로 가는건지...
콘솔에서 starup.bat 를 실행시키거나 startup.bat 를 더블클릭해서 Tomcat을 시작하는 경우 표준출력이 콘솔에 출력되어서 지나간 로그를 확인하기가 힘들다.
(Tomcat 버전에 관계없이 당연한 현상임)
Tomcat이 새창으로 구동되어서 표준출력을 파일로 리다이렉션을 시켜도 파일이 제대로 남지 않는다.
로그가 많아서 필요한 로그는 새창에서 지나가 버림.
startup.bat, catalina.bat 를 이것저것 수정해도 안됨.
로그를 남기려면 새창을 띄우면 안됨.
새창을 띄우는 부분을 찾아서 수정하면 될거 같다.
또는
rem Execute Java with the applicable properties
if not "%JPDA%" == "" goto doJpda
if not "%SECURITY_POLICY_FILE%" == "" goto doSecurity
%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION% > c:/tomcat.log
goto end
if not "%JPDA%" == "" goto doJpda
if not "%SECURITY_POLICY_FILE%" == "" goto doSecurity
%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION% > c:/tomcat.log
goto end
이렇게 하면 표준출력이 파일로 떨어진다.
(서비스로 구동시키면 stdout.log, stderr.log 가 생길거야.)
- 회고
운영되는 서버를 왜 이렇게 구동시키지? 우....띠
예전에 이런 문제가 발생했을때 확실히 분석해서 방법을 알아뒀으면 오늘같은 고생은 안했을건데.
로그보고 에러 잡는 일이 남았다. 이제부터 진짜 일이지.
- 이클립스 버그 경고 기능
- 日常茶飯事
- 2010. 8. 25. 23:00
- Subversion에서 Tag를 잘못 단 경우
- 日常茶飯事
- 2010. 8. 25. 21:30
Subclipse에서 태그를 달았는데 trunk/ 가 생겼다.
URL을 변경하지 않고 그냥 달아서 발생했음.
Subclipse에서는 URL을 직접 적어야 한다.
http://1.2.3.4/rep/project/tags/R20100703A
URL을 변경하지 않고 그냥 달아서 발생했음.
Subclipse에서는 URL을 직접 적어야 한다.
http://1.2.3.4/rep/project/tags/R20100703A
- 편리한 UI - skydrive
- 日常茶飯事
- 2010. 8. 25. 20:00
- 이클립스에 설치된 플러그인 확인하기
- 日常茶飯事
- 2010. 8. 25. 20:00
- 이거 왜 마무리...안되었나?[미완]왜...법을 어긴 사람이 장관이 되려고 할까?
- 雜동사니
- 2010. 8. 24. 20:00
위장전입, 투기...
유전무죄
자신의 부도덕함이 공개되었는데도 굳굳이 꿋꿋이 버티는 당신에게 박수를 보냅니다.
장관, 그거 아무나 하는게 아니구나.
모카드사에서 장애어린이 재활치료 지원 캠페인을 한다고 메일이 왔다.
지원이와 미소 때문인지 요즘 이런걸 보면 그냥 넘어갈 수가 없다.
그동안 쌓인 포인트로 기부를 하려고 했는데 포인트가 얼마 없었다.
그렇게 줄기차게 썼는데 고작 그거밖에 안쌓이니...
다른 카드사에서는 이런 행사를 안하나?
내가 한방 크게 쏠건데.
유전무죄
자신의 부도덕함이 공개되었는데도 굳굳이 꿋꿋이 버티는 당신에게 박수를 보냅니다.
장관, 그거 아무나 하는게 아니구나.
모카드사에서 장애어린이 재활치료 지원 캠페인을 한다고 메일이 왔다.
지원이와 미소 때문인지 요즘 이런걸 보면 그냥 넘어갈 수가 없다.
그동안 쌓인 포인트로 기부를 하려고 했는데 포인트가 얼마 없었다.
그렇게 줄기차게 썼는데 고작 그거밖에 안쌓이니...
다른 카드사에서는 이런 행사를 안하나?
내가 한방 크게 쏠건데.
- [야구기록지] 2010-08-20
- 野生野死
- 2010. 8. 22. 11:26
두산 - 롯데(사직)
8회말 롯데 공격
8회말 롯데 공격
2번 타자 손아섭 중견수 앞 안타로 출루
3번 타자 조성환 2-3루간 내야 땅볼, 손시헌이 2루로 송구하다 에러, 주자 2, 3루
4번 타자 이대호 1루수 앞 땅볼, 에러, 3루 주자 득점, 1루로 고영민에게 송구하다 에러, 2루 주자 득점
투수 교체, 2루 주자 이대호 이승화로 교체
5번 타자 가르시아 투수앞 땅볼, 2루 주자 태그 아웃
6번 타자 강민호 볼넷
7번 타자 전준우 좌중간 홈런 비거리 125
3번 타자 조성환 2-3루간 내야 땅볼, 손시헌이 2루로 송구하다 에러, 주자 2, 3루
4번 타자 이대호 1루수 앞 땅볼, 에러, 3루 주자 득점, 1루로 고영민에게 송구하다 에러, 2루 주자 득점
투수 교체, 2루 주자 이대호 이승화로 교체
5번 타자 가르시아 투수앞 땅볼, 2루 주자 태그 아웃
6번 타자 강민호 볼넷
7번 타자 전준우 좌중간 홈런 비거리 125
Recent comment