본문 바로가기

JAVA/Coding Habit

[Story 01] 디자인 패턴 꼭 써야 한다.

* Pattern 이란?

Pattern [명사] : a model, guide or set of instructions for making something
(무엇인가를 만들기 위한 모델이나 가이드, 설명의 집합을 의미함)


시스템을 만들기 위해서 전체 중 일부 의미 있는 클래스들을 묶은 각각의 집합을 디자인 패턴 이라고 생각하면 된다.
 


*  Service Locator 패턴

시스템에 성능에 영향을 주는 Service Locator  패턴이다.

Service Locator 패턴은 가장 빈번히 사용되는 EJB Home  객체나  DB Datasource 를 찾을 때 (lookup 할 때 )
소요되는 응답속도를 감소시키기 위해서 사용된다.


package com.pettern;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

import javax.naming.InitialContext;

public class ServiceLocator {
 private InitialContext ic;
 private Map cache;
 private static ServiceLocator me;
 
 static {
  me = new ServiceLocator();
 }

 
 private ServiceLocator() {
  cache = Collections.synchronizedMap(new HashMap()) ;
 }
 
 public InitialContext getInitialContext() throws Exception {
  try {
   if (ic == null) {
    ic = new InitialContext();
   }

  } catch (Exception e) {
   // TODO: handle exception
  }
  return ic ;
 }
 
 public static ServiceLocator getInstance() {
  return me;
 }
 
 public EJBLocalHome getLocalHome (String jndiHomeName) throws Exception {
  EJBLoclaHome home = null;
  try {
   if (cache.containsKey(jndiHomeName)) {
    home = (EJBLocalHome)cache.get(jndiHomeName);
   } else {
    home = (EJBLocalHome)getInitialContext().lookup(jndiHomeName);
    cache.put(jndiHomeName, home);
   }
  } catch (Exception e) {
   throw new Exception(e.getMessage());
  }
  return home;
 }
}

위의 소스를 간단히 보면  cache  라는 Map 객체에 home  객체를 찾은 결과를 보관하고 있다가, 누군가 그 객체를 필요로 할 때 메모리에서 찾아서 제공하도록 되어 있다. 만약 해당 객체가 cache 라는 맵에 없으면 메모리에서 찾는다.

EJB home 객체를 찾거나 Datasource  객체를 찾는 시간을 일반적으로 30ms 가 소요 된다.
위의 예에는  EJB local home 을 사용했지만,
EJB Remote home 을 찾을 때에는 시스템에 따라서 1초가 소요되는 시스템도 있다.
하지만 메모리에서 찾으면 0.01 ms 도 소요되지 않으므로 적어도 100배 이상의 성능 향상을 가져 올 수 있다.

(ms 단위는 1/1000 초를 의미)