Posts Tagged ‘패턴’

Java Singleton Pattern 구현

Friday, June 29th, 2007

최근 singleton 패턴 구현에 대한 질문을 받은 적이 있다. singleton 패턴은 인스턴스를 하나만 생성해서 그 객체를 공유해서 사용하는 패턴이다. 일반적으로 DB Pool과 같이 전체 시스템에서 하나의 자원을 공유해서 사용할 때 이 패턴을 활용할 수 있다.

이 패턴을 구현하는 방법은 synchronized getInstance(), double-checked getInstance(), static final instance 등 다양한데, 내 경우는 Singleton 클래스를 구현하기 위해 static initializer를 활용한 방법을 제안했다.

public class Singleton {
  private static Singleton _instance;

  static {
    _instance = new Singleton();
  }

  private Singleton() {}

  public static Singleton getInstance() {
    return _instance;
  }

}

이렇게 구현한 경우 클래스가 로딩되면서 객체가 생성되기 때문에 객체가 이중으로 생성될 수 없고, 가장 확실한 방법인 synchronized getInstance()에 비해서 매번 메소드 호출시에 동기화 작업을 안해줘도 되는 장점이 있다. (synchronized 키워드가 있는 경우 메소드 실행이 약 100배 정도 늦어진다고 한다.)

하지만 오늘 관련 정보를 찾아보니, 글 작성자는 명백히 이 방법보다는 synchronized getInstance()가 좋다고 한다.

getInstance()에서 객체를 생성할 때 장점은 lazy initialization(객체가 사용될 때까지 객체 생성을 연기)이 가능하다는 점과 내부 구현을 Pooling 등으로 변경할 때 쉽게 변경이 가능하다는 것이다. (이 부분은 static initializer도 가능하다.)

다만 Singleton 패턴을 사용해도 ClassLoader 마다 개별적으로 인스턴스가 생성되기 때문에 이 부분은 주의를 기울여야 한다. 특히 Servlet Container는 여러개의 ClassLoader를 사용할 수 있으니 이 점을 인지하고 있어야 한다.

Fearless Change 변화를 가져오는 패턴

Sunday, February 11th, 2007

조직에 변화를 가져오기 위해서 필요한 것은 무엇일까? 왜 정말 좋은 아이디어가 다른 사람들에게 받아들여지지 않고 사라져가는 것일까? Fearless Change는 새로운 아이디어를 조직에 도입하기 위해 사용할 수 있는 패턴들을 정리한 책이다.

최근 내가 속해있는 조직은 큰 변화를 앞두고 있다. 글로벌로 분산된 환경의 웹개발을 지원할 수 있는 새로운 형태로의 변화를 준비하고 있는데, 이 변화의 움직임은 주로 Top-Down 방식으로 진행되고 있다. 또 하나의 변화는 Agile 방법론을 조직에 적용시키려는 나를 중심으로 한 노력이 있다. 결국 변화에 능동적인 조직과 개인의 능력이 급변하는 환경에서 살아남을 수 있는 바탕이 된다고 생각한다. 그리고 무엇보다 조직 구성원 한명 한명이 새로운 아이디어를 받아들이고 실천할 때 그 조직이 변화할 수 있는 잠재력이 커지는 것이다.

Fearless Change 에서는 이런 상황에서 사용할 수 있는 다양한 패턴들을 소개하고 있다. 새로운 아이디어를 소개하는 큰 줄거리를 살펴보면 다음과 같다.

  1. Where Do I Start?
  2. What Do I Do Next?
  3. Meetings and More
  4. Take Actions!
  5. It’s All About People
  6. A New Role: Now You’re Dedicated!
  7. Convince the Masses
  8. More Influence Strategies
  9. Keep It Going
  10. Dealing with Resistance

새로운 아이디어를 소개하고, 전파하는 것부터 마지막 남은 보수적 성향의 사람들까지도 변화에 합류시킬 수 있는 다양한 패턴들을 볼 수 있다. 그 중 도입 단계에서 사용할 수 있는 몇가지 패턴을 소개하려고 한다.

[Where Do I Start?]
Evangelist : 변화를 가져오기 위해서는 확신과 열정이 있어야 한다.
Small Successes, Step by Step : 많은 실패 속에서도 조그만 성공을 축하해야 한다. 또한 너무 크고 빠른 결과보다는 장기간의 목표를 가지고 단계적으로 실패를 바탕으로 성공을 이끌어가야 한다.

[What Do I Do Next?]
Connector : 많은 사람들이나 조직과 연관이 있는 사람들을 참여시키면 그 효과가 매우 클 수 있다.
Guru on Your Side : 전문가를 나의 편으로 만들면 쉽게 다른 사람들을 설득시킬 수 있다.
Ask for Help : 주위에 도움을 요청하면 내 짐을 덜 수도 있지만, 그보다 그들을 변화에 참여시킴으로써 더 적극적으로 주인의식을 느낄 수 있게 하는 효과가 있다.

[Meetings and More]
Piggyback : 따로 회의를 잡기 보다는, 월간 회의와 같은 정기 회의에 편승해서 아이디어를 공유할 수 있도록 한다.
Next Steps : 회의의 마지막 30분은 다음에 어떤걸 할지 함께 논의하는 자리로 사용한다. 변화에 모두가 참여한다는 느낌을 부여해 줄 수 있다.

[Take Action!]
Just Do It : 완벽을 기하기 보다는 우선 시작해서 경험을 얻는 것이 중요하다.
Study Group : 돌아가면서 발표하는 형태의 스터디는 참가자가 새로운 아이디어에 대한 학습을 체계적이고 점진적으로 할 수 있게 해준다.
Mentor : 새로운 변화를 시도할 때, 주위에 나보다 조금 더 많이 아는 사람이 있을 때 심적 안정감을 얻을 수 있고 실질적으로 많은 도움을 받을 수 있다.

이런 패턴들은 적합한 타이밍에 적절하게 사용될 때 큰 효과가 발휘될 수 있다. 변화를 시작하기 전에 ‘Test the Waters’를 하게 되는데, 지금의 근무 환경은 변화에 매우 적극적이라고 생각된다. 하지만 그 변화가 조직별로 다르게 적용되고 있고 다른 모습으로 결과가 나타나고 있다. 관리자가 주도적으로 변화를 주도하려는 지금, 내가 할 수 있는 것은 무엇일지 고민해보게 된다.