발생일: 2011.06.01 문제: 처음 디자인 패턴을 공부할 당시 프록시 패턴과 데코레이터 패턴을 꽤 헷갈려했던 기억이 난다. 얼마 전에 책을 읽다가 이 차이점을 명확하게 설명해놓은 부분이 있어 메모해둔다. 프록시 패턴, 데코레이터 패턴에서 사용하고 있는, 전반적인 '프록시'에 대한 개념부터 설명을 시작해 쏙쏙~ 이해된다.^^ 해결책: 프록시: 자신이 클라이언트가 사용하려고 하는 실제 대상인 것처럼 위장해서 클라이언트의 요청을 받아준다. 대리자, 대리인과 같은 역할을 한다고 해서 프록시(proxy)라고 부른다. 프록시를 통해 최종적으로 요청을 위임받아 처리하는 실제 오브젝트를 타깃(target) 또는 실체(real subject)라고 한다. 프록시의 특징은 타깃과 같은 인터페이스를 구현했다는 것과, 프..
발생일: 2010.05.06 문제: 현업이 종종 특정 데이터를 엑셀로 뽑아달라는 요청을 합니다. 요청이 간헐적이고 같은 데이터를 시도 때도 없이 새로 뽑아달라는 요청을 해서, 좀 효율적으로 처리하고자 동적 쿼리를 수행하는 메뉴를 하나 만들었습니다. 해당 쿼리가 자주 변하고 보안 문제도 있었기 때문에, 관리를 편하게 하기 위해 DB 대신 파일 기반으로 설계했습니다. 서버에 올라가 있는 sql 파일을 읽어 목록을 구성하고, 해당 쿼리를 담은 sql 파일을 읽어 엑셀로 다운로드 받을 수 있는 기능입니다. (우리는 요청 쿼리를 담은 sql 파일을 서버에 올리기만 하면 되도록 말이죠.) iBATIS 를 사용하고 있어 파일에서 읽은 쿼리를 아래와 같이 $sql$ 형태로 전달하도록 했는데, $sql$ 첫 번째는 정상..
문서를 정리하다가 예전에 헤드퍼스트 디자인 패턴 책을 읽고 정리해 놓은 파일이 있어 옮겨봅니다. ============================================================== 디자인 원칙 - 애플리케이션에서 달라지는 부분을 찾아내고, 달라지지 않는 부분으로부터 분리한다. - 구현이 아닌 인터페이스에 맞춰서 프로그래밍한다. - 상속보다는 구성을 활용한다. - 서로 상호작용을 하는 객체 사이에서는 가능하면 느슨하게 결한하는 디자인을 사용해야 한다. - 클래스는 확장에 대해서는 열려 있어야 하지만 코드 변경에 대해서는 닫혀 있어야 한다. (OCP : Open-Closed Principle) - 추상화된 것에 의존하도록 만들어라. 구상클래스에 의존하도록 만들지 않도록 한다. -..
발생일: 2010.03.11 문제: 후배 P와 같이 시스템 운영 이관을 하다 문득 배치 파일 옵션에 빌드와 컴파일이 구분되어 있는 걸 보고, 궁금한 마음에 '빌드와 컴파일 차이가 뭐죠?' 라고 물었습니다. 뭘까요...? 같은 용어라 생각하고 다르단 생각을 못해봤는데 구분되어 있네요. 뭘까요... 해결책: 빌드와 컴파일의 차이 빌드와 컴파일의 차이에 대해 명확하고 쉽게 설명해 놓은 좋은 포스트가 있습니다. 컴파일은 빌드의 부분 집합이며, 단순한 컴파일에 비해 빌드는 실행할 수 있는 소프트웨어로 변환하는 과정이라고 합니다. 그러고 보니, 시스템 이관을 할 때에도, 개인 작업을 할 때에도, 빌드 버전을 따거나 '빌드'라는 것에 중점을 두고 수행한 적은 없었습니다. 같은 분이 작성하신 빌드의 중요성 글도 좋으니..
발생일: 2010.03.09 문제: 꽤 오랫동안 시스템을 운영해왔고 프로젝트도 여러 번 있었지만, properties 파일들은 별 생각 없이 가이드 대로 사용하고 있었습니다. 만들어진 시스템을 받을 때 쯤이면, 이미 properties 파일들은 제 위치에 놓여져 있기 때문이기도 했고요. 이번에 작은 라이브러리를 만들어 배포해 보려고 하니, 사용자 별 설정을 읽어와야 해서 properties 에 대해 고민할 기회가 생겼습니다. 해결책: 날이 갈수록 좋은 프레임웍이 만들어지고 하다보니, 기본적인 것보다는 만들어 진 라이브러리의 사용법 학습에 더 치중하게 되는 경향이 생기는 것 같네요. 위 내용은 구글링 해보니 쉽게 찾을 수 있었습니다. Smartly load your properties (영문) 꽤 오래된 ..
발생일: 2010.02.10 문제: iBatis 에 parameterClass 로 List 를 넘긴 후, iterate 태그 사용을 시도하였을 경우 아래와 같은 예외가 발생한다. Error getting ordinal list from JavaBean. Cause java.lang.StringIndexOutOfBoundsException 이 때 사용된 iBatis 구문은 아래와 같다. // select something and use iterate #someList[]# 잘못된 게 없는 것 같은데, 왜 이럴까. 해결책: 정확한 원인은 모르겠으나, 일단 패러미터를 Map 형태로 전달해주면 문제 없이 작동한다. queryForList 등의 메서드를 호출하기 전, 패러미터로 전달할 list 객체를 Map 객체..
발생일: 2009.01.06 문제: 진행 중인 미니 프로젝트에서 웹 어플리케이션이 로딩될 때 설정해야 할 것들이 있다. 여기서는 contextRealRoot 를 메모리에 미리 올려둘 목적으로 쓰려고 하는데, 그 외에도 리소스나, 권한 등 일반적으로도 초기화 때 설정할 사항들이 많다. 스트럿츠 프레임웍의 경우, 웹 어플리케이션의 초기 환경 설정을 위해 PlugIn 기능을 제공한다. 스트럿츠 프레임웍의 경우는 이런 식으로 사용한다. 스트럿츠 프레임웍은 웹 어플리케이션 환경 설정을 위해 Plug-In 기능을 제공하며, 컨텍스트 로드 시 해당 플러그인이 작동한다. 구현 방법은 아래와 같다. 1. PlugIn 인터페이스를 구현한 PlugIn 클래스를 만든다. init() 과 destroy() 메서드를 구현하면 된..
발생일: 2010.01.05 문제: 시스템에서 Fasoo DRM 이라는 암호화 모듈을 사용하고 있다. 내부적으로는 문서 다운로드 요청이 들어왔을 때, 암호화 처리를 한 후 돌려주는 방식으로 사용하고 있는데, 얼마 전 서버를 옮긴 이후부터 클래스 패스를 찾을 수 없다는 메세지가 나온다. javax.servlet.ServletException: no fasoopackager in java.library.path 서버는 JEUS 를 쓰는데, 업체에서 제공해준 jar 파일을 각 라이브러리 폴더(WEB-INF/lib, JEUS_HOME/lib/application 등)로 옮겨보며 테스트 해보아도 해결되지 않는다. 뭐가 문제일까...? 해결책: javax.servlet.ServletException: no faso..
발생일: 2009.12.15 문제: 친구 홍이 문제점에 봉착했다며 묻는다. Abstract Class 를 어떻게 Singleton 으로 만들 수 있을까? Abstract Class 를 상속한 클래스들은 다 싱글턴으로 구현되도록 해야 한다고 한다. 음... 그럼 Abstrac class 안에 싱글턴 패턴인 getInstance 를 구현하되, 그 안에 팩토리 메서드 패턴으로 동적 타입으로 만들 수 있게 하면 안될까...? private static AbstractSingleton uniqueInstance; public static AbstractSingleton getInstance(Class cls) { // uniqueInstance 가 존재하는지 확인 // 없을 경우, 동기화해서 class 에 따라 ..
발생일: 2009.12.08 문제: xper 그룹스 메일링을 받아보고 있는데, 오늘 누군가가 TDD(Test Driven Development) 진행 중 생긴 문제점에 대해 질문을 한 내용이 있다. 유닛 테스트를 위해 모든 메서드를 public 으로 선언하다보니, "public 메서드가 너무 남발되는 게 아닌가, 객체지향의 원칙을 깨버리는 게 아닌가." 하는 생각이 들었다고 한다. 나도 예전에 같은 문제로 질문한 적이 있었는데, 그 당시에 멤버 변수는 private 으로, 메서드는 모두 public 으로 설정하는 쪽으로 결론을 냈었다. 그에 따라 (테스트를 위해) private 으로 작성된 메서드의 접근자를 단순히 모두 public 으로 바꾸는 식으로 구현했었다. 이 때는 마틴파울러의 Refactorin..