발생일: 2009.11.05 문제: 디자인 패턴 책을 읽으면서 예제를 따라해보던 중, double 의 합계 계산에서 뭔가 이상한 점을 발견했다. double a = 1.13; double b = 0.86; System.out.println(a + b); 이렇게 했을 때, 그 결과가 1.99가 나와야 정상인데, 1.9899999999999998 가 나와버린다. 움메... 이거 왜 이럴까... 해결책: float 과 double 타입은 과학과 엔지니어링 분야의 계산을 위한 목적으로 설계되었다. 그러나 정확한 결과를 제공하지는 않기 때문에, 주의해서 사용해야 한다고 한다. 그렇기 때문에 float 과 double 타입은 특히 화폐 계산에 부적합하다. float이나 double은 0.1(혹은 negative p..
발생일: 2009.11.05 문제: 메이븐이 뭐지...? 해결책: 메이븐 시작하기
발생일: 2009.11.05 문제: unix 에서 실행하고 있는 java 클래스가 있다. sh 파일 내에서 호출해서 실행하고 있는데, 한글이 깨지더라. 클래스 파일을 수정할 수 없는 상황이라 -Dfile.encoding=EUC-KR 를 실행 시에 넣어 인코딩을 설정해줬다. 전체적인 모습은 대략 java -classpath $CLASSPATH -Dfile.encoding=EUC-KR Test 이런 모습이다. 그러고보니, java 만 따로 실행해 본 적이 하도 오래 돼서 컴파일이나 실행 시 옵션에 대한 내용이 잘 기억나지 않는다. 정리된 문서가 있을까? 해결책: 'java 옵션' 키워드로 구글링 해보니 정리된 문서가 많다... ^^; 그 중에 쉽게 잘 정리되어 있는 포스트 몇 개를 찾아냈다. [강좌] Jav..
발생일: 2009.10.26 문제: 자바는 디컴파일러가 있어서 중요 정보를 코드 내에 두지 말라고 한다. 실제로 디컴파일러를 써보기도 했고, 후배들한테도 그렇게 얘기해주고 있다... 그러다 문득 아주 기본적인 궁금증이 생겼다. 아니 그럼 중요 정보는 어디다 두지? (예: 암호화키, 디비 아이디/패스워드) 프로퍼티 파일에 두면 오히려 더 조회하기 쉬운 거 아닌가...? 해결책: 자바 디컴파일러 문제는 주로 자바 애플릿과 관련된다고 한다. WAS 에 저장되는 class 는 사용자에게 직접 노출되지는 않기 때문이다. 일반적으로 인터넷뱅킹 등 금융 프로그램들이 자바 애플릿 대신 Active-X 를 활용하고 있는 이유도 이 때문이라고 한다. 일단, 웹어플리케이션이라면 자바 코드 내에 중요 정보를 둬도 괜찮다는 얘..
발생일: 2009.09.22 문제: 현재 담당하고 있는 시스템은 스트럿츠로 구현되어 있다. 다른 일반 자바 엔터프라이즈 시스템처럼, 프리젠테이션 레이어 - 서비스 레이어 - 데이터액세스 레이어의 3-tier 구조다. 그리고 그 가운데 데이터 전달을 위한 도메인 객체가 있다. 처음 프로젝트를 할 때에는 이게 표준이구나 싶어서 별 생각없이 구현했는데, 어느 날 문득 궁금해졌다. 왜 도메인 객체들을 단순 VO로만 사용하는 걸까...? 좀 더 객체지향적으로 도메인 객체를 활용하면 좋지 않을까...? 해결책: 위와 같이 단순한 데이터 값의 저장을 위한 VO 역할만 하는 도메인 객체를 anemic domain 이라고 한다. anemic domain model의 한계를 느끼고 나타난 것이 도메인 객체에 직접 도메인과..
발생일: 2009.09.17 문제: 이때까지 log4j 랑 commons.logging 이랑 같은 건 줄 알고 있었는데... 아니었구나!!! 해결책: commons.logging 은 log 객체를 가져와서 쓰는 창구 역할을 하는 거였다. (인터페이스랄까...) 실제 구현체는 java 의 logging API 나 log4j 나 기타 로거 모듈을 가져다 사용하는 거였다. (LogFactory 에서 생성) log4j 와 commons.logging 에 대해 잘 정리되어 있는 포스트가 있으니 읽어보자. http://blog.naver.com/kotaeho0512/50033476064 가벼운 마음으로 이것도 읽어보자. http://devyongsik.tistory.com/74 #.참고 log4j 설정 방법
발생일: 2009.09.02 문제: 다운로드 버튼을 누르면 원하는 파일(지금은 jpg 파일)을 다운로드 받을 수 있도록 하고 싶다. Download 하는 서블릿을 만들어서 응답으로 해당 파일을 뿌려주면 될 것 같은데, 어떻게 하면 될까? 해결책: 브라우저는 요청 후 돌아오는 서버의 응답을 종류에 따라 적합한 형태로 보여준다. 서버는 응답 헤더에 content-type 을 설정해 줌으로써 응답의 종류가 어떤 것인지 알려준다. (content-type은 MIME에 정의된 메세지 타입 표준이다.) 각 브라우저는 응답 헤더에 있는 content-type 를 파악하여 적합한 형태로 보여주게 된다. 예를 들어, content-type 이 text/plain 라면 일반 문자로 보여주고, image/gif 와 같은 형..
발생일: 2009.08.11 문제: IP에 따라 각각 다른 페이지를 보여주고 싶다. 지난 번에 브라우저의 헤더를 가지고 구분하는 방법을 썼었는데, (Accept-Language 로 언어 자동 설정하기 참고) 더 간단하게 IP 를 가지고 구분할 수는 없을까? 해결책: 지난 번 제시했던 곳보다 더 간단하게 국가별 IP 정보를 제공해 주는 사이트가 있다. (IPInfoDB.com 참고) 위 사이트에서 제공하는 API 에 따라 get 방식으로 요청을 하면 XML 형태로 정보를 리턴해준다. 요청 예) http://ipinfodb.com/ip_query.php?ip=74.125.45.100 응답 예) 74.125.45.100 OK US United States 06 California Mountain View 94..
발생일: 2009.08.07 문제: 이클립스에서 디버그 모드 사용 시 source 를 찾지 못해 source lookup path 를 설정해주라는 메세지가 뜰 때가 있다. Edit Source Lookup Path... 버튼을 눌러 소스 경로를 잡아주면 정상적으로 소스가 표시되기는 하는데... 따로 이 Lookup Source Path를 설정할 수는 없을까? 해결책: Debug View 에서 해당 창을 띄울 수 있다. Debug View 를 띄운다. (Window > Show View > Debug) 뷰의 Context Menu (오른쪽 마우스 클릭)를 열면 Edit Source Lookup... 메뉴가 있다.
발생일: 20009.08.07 문제: Class.getResource() 로 해당 클래스의 절대 경로를 읽어오는 걸 사용하고 있었는데, ClassLoader.getResource() 도 같은 정보를 리턴한다. 두 방법의 차이점이 뭘까? 해결책: 이에 대해 아주 잘 정리해놓은 블로그가 있다. DEV용식의 Class.getResource() 와 ClassLoader.getResource() 이 외에도 API 를 비교하며 설명해 놓은 holycall 의 블로그도 참고하자.