커맨드 패턴의 주요 목적은 작업을 요청하는 쪽과 작업을 처리하는 쪽을 분리하여서로 의존관계가 없도록 하는 것 입니다. (서로 상대방의 존재 여부를 알지도, 알 필요도 없습니다.) 또한, 커맨드 패턴 적용 시 연속된 작업의 이력 관리와 작업 취소 로직을 쉽게 적용할 수 있습니다. 샘플 코드를 작성하기에 앞서 기본적인 용어를 정리하도록 하겠습니다. Invoker : 작업을 요청하는 객체 Receiver : 작업을 처리하는 객체 Command : 작업 클래스들이 구현해야 하는 인터페이스 간단하게 원과 네모를 그리는 로직으로 샘플을 구현해 보겠습니다. x,y 좌표를 가진 원과 네모를 그리거나 지우는 작업을 합니다. 작업 이력을 stack에 넣어 보관하고, 필요시 undo 할 수도 있습니다. 우선 Command ..
싱글턴 패턴은 클래스의 인스턴스 갯수를단 하나만 생성 가능 하도록 제한하는 방법입니다. 중요한 상태값 정보를 가지고 있는 클래스일 경우인스턴스가 여러 개 생성되어다양한 상태값을 갖게 되면프로그램에 큰 문제를 발생 시킬 수 있어싱글턴 클래스 사용이 필요합니다.또는 불필요하게 인스턴스의 수가 많이 생성되어메모리를 쓸데 없이 잡아먹고 있는 것이 싫은 때에도싱글턴 클래스를 사용할 수 있습니다. 싱글턴 패턴의 구현 방법은 다음과 같습니다.기본적으로 default 생성자를 private으로 선언하여new 키워드를 이용한 객체 생성을 막습니다.그리고 public static method인 getInstance를 만들고해당 method만 이용하여 인스턴스를 전달 받도록 합니다.getInstance method 안에서 ..
개인 프로젝트에서 Jenkins를 통해 지속적 통합(CI)를 구현하고자 합니다.그런데, 제가 사용하는 Git Server에 기본적인 속도 제한이 있어서Jenkins에서 소스코드를 다운받는데 timeout이 자꾸 발생하였습니다. 기본적으로 Jenkins는 git 관련 명령어에 timeout을 10분으로 설정하고 있어해당 설정을 변경하는 방법을 공유하고자 합니다. Project > Configuration > Git 설정에서Additional Behaviours의 Advenced checkout behaviours, Advanced clone behaviours 의 timeout 설정 변경이 가능합니다.
Decorator Pattern은 기존 객체가 가진 기능에 새로운 기능을 추가하는 방법에 대한 내용입니다. 기존 객체를 수정하지 않고, 좀더 유연하게 새로운 기능을 추가하는 방식을 제공합니다. 새로 추가된 기능들은 손쉽게 조합해서 통일된 방식으로 사용할 수 있습니다. Decorator Pattern의 가장 대표주자는 Java IO API라고 할 수 있습니다.InputStream input = new BufferedInputStream( new FileInputStream("text.txt"));단순하게 파일을 읽는 FileInputStream 객체에 버퍼를 통한 성능향상 기능을 추가할 수 있으며, 그 외에 다양한 기능들을 손쉽게 추가하여 사용할 수 있습니다. Decorator Pattern을 이용해서 S..
Spring 4.0 이상 버전을 사용하며,maven을 이용해 Test 진행 시다음과 같은 오류가 발생할 수 있습니다. java.lang.NoClassDefFoundError: javax/servlet/SessionCookieConfig Spring 4.0 이후 부터는 unit test 진행 시Sevelet 3.0 API을 사용하기 때문에pom.xml에 다음과 같이 라이브러리 버전을 변경해 주어야 합니다. javax.servlet javax.servlet-api 3.0.1
Observer Pattern 옵저버 패턴은 흔히 신문사 - 구독자 관계로 설명 되곤 합니다. 신문사는 구독자 리스트를 관리하고, 새로운 신문이 발행되면 새 신문을 모든 구독자에게 전달합니다. 새로운 구독자가 추가될 수도 있고, 기존의 등록 되었던 구독자가 해지될 수도 있습니다. 신문 발행 시에는 그 시점에 등록되어 있는 구독자들에게만 신문을 전달해야 합니다. 신문사 - 구독자 관련 설명은 개념을 이해하기에는 쉽지만, 개발자들이 피부로 와 닿게 느낄만 한 것은 아닌 것 같아 Click Event 발생 시, 다양한 View 객체들에게 이벤트를 전파하는 방식으로 코드를 작성해 보도록 하겠습니다. Subject Interface는 신문사 역할을 하는 인터페이스로 Observer들을 등록/해지 해주며, 이벤트 ..
Maven을 이용한 실행 가능한 jar 파일을 만드는 방법입니다. pom.xml 파일에 아래 플러그인을 추가 후 프로젝트의 루트 디렉토리에서 maven package 를 실행하면 됩니다. $mvn package * pom.xml ... org.apache.maven.plugins maven-shade-plugin 2.4.3 package shade META-INF/spring.handlers META-INF/spring.schemas com.test.MainProcess false * Jar 파일 실행 방법 $java -jar filname.jar maven-shade-plugin은 package의 모든 파일들을 하나의 jar파일로 묶어주는 플러그인 입니다. 실행 가능한 jar 파일을 만들기 위해서는 m..
비트연산을 처리하는 중에 1의 개수가 하나인지 여부를 확인해야 할 경우가 있었습니다.비트 수 만큼 루프를 돌면서 카운트를 하는 방법도 있겠지만,왠지 간단한 연산만으로 처리가 가능할 것 같았고,고민 끝에 아래 와 같은 방법으로 처리가 가능하다는걸 알게 되었습니다. public boolean isOneBitEnable(int value) { return (Math.log(value) / Math.log(2)) != (int)(Math.log(value) / Math.log(2)); }
프로젝트 진행 중 여러 외부장비에 명령을 전송해야 하는 이슈가 있었습니다. Request 호출 시 순차적으로 외부장비의 API를 호출하는 방식이었습니다. 문제는 외부 장비들도 서로 통신을 하기 때문에 연속된 요청을 하나의 트랜잭션 처럼 동작 시켜야만 했습니다. 필요한 로직은 아래와 같습니다. A, B, ... Z 장비들에게 순차적으로 작업을 요청하며, 각 작업 요청 시 마다 성공 여부를 전달받아 성공일 경우에만 다음 작업을 시작합니다. 단, 특정 작업이 실패했을 경우 이전에 진행되었던 모든 작업에 대한 복구 로직이 실행되어야 합니다. 복구 로직을 실행시키기 위해서는 모든 작업 성공 시, 필요한 복구 작업을 등록해 주어야 할 필요가 있습니다. 위와 같은 프로세스를 구현하기 위해 아래와 같은 방식으로 코드를..