서비스 로케이터란?

스프링을 공부하던 중 의존 해결을 위한 방법으로 서비스 로케이터와 DI가 있다고 배웠다.

하지만 서비스 로케이터를 제대로 설명하는 경우는 별로 없는듯 하다.

많은 부분에서 알지는 못하지만 이해한 곳까지는 적어보려 한다.

서비스 로케이터(Service Locator)는 마틴 파울러에 의해 유명해진 디자인 패턴이다.

JNDI를 생각하면 빠르게 이해할 수 있을 듯 하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public class ServiceLocator {
private InitialContext ic;
private Map cache;
private static ServiceLocator me;
static {
me = new ServiceLocator();
}
private SerivceLocator() {
cache = Collections.synchronizedMap(new HashMap());
}

public InitialContext getInitialContext() throws Exception {
try{
if( ic == null) {
ic = new InitialContext();
}
} catch (Exception e) {
throw e;
}
return ic;
}

public static ServiceLocator getInstance(){
return me;
}

public EJBLocalHome getLocalHome(String jndiHomeName)
throws Exception {
EJBLocalHome home = null;
try{
if (cache.containsKey(jndiHomeName))
{
home = (EJBLocalHome)cache.get(jndiHomeName);
} else{
home = (EJBLocalHome)getInitialContext().lookup(jndiHomeName);
cache.put(jndiHomeName, home);
}
} catch (NamingException ne) {
throw new Exception(ne.getMessage());
} catch (Exception e) {
throw new Exception(e.getMessage());
}
return home;
}
};

서비스 로케이터 패턴은 위의 소스와 같이 cache에 담아두고 객체가 필요할 경우
메모리에서 바로바로 찾아서 제공하는 구조를 가진다.

cache에서 키를 찾아 존재하는 경우, 반환하고 없는 경우 cache에 담아주는 형태를 가진다.

인용 https://code.i-harness.com/ko-kr/q/17c515
Dependency Injection과 Service Locator의 차이점은 무엇입니까? 두 패턴 모두 종속성 반전 원리를 구현하는 데 적합합니다. Service Locator 패턴은 공용 인터페이스를 변경하지 않고 전체 디자인을 느슨하게 만들기 때문에 기존 코드베이스에서 사용하기가 더 쉽습니다. 이와 동일한 이유로 Service Locator 패턴을 기반으로하는 코드는 Dependency Injection을 기반으로하는 동일한 코드보다 읽기 쉽지 않습니다.

Dependency Injection 패턴은 클래스 (또는 메소드)가 가질 종속성 서명 이후에 명확하게 나타냅니다. 이러한 이유로 결과 코드는보다 깨끗하고 읽기 쉽습니다.

Share