Programming/Design Pattern

서비스 로케이터 패턴 (Service Locator Pattern)

휘탱 2018. 2. 19. 22:00

개요

서비스 로케이터 패턴은 소프트웨어 디자인 패턴으로, 애플리케이션 내의 서비스 위치를 추상화하여 서비스에 대한 검색을 캡슐화합니다. 이 패턴은 애플리케이션 내에서 서비스의 위치를 중앙 집중화하여 유연성을 향상시킵니다.

작동 원리

  1. 서비스 등록: 애플리케이션 시작 시, 서비스 로케이터에 서비스를 등록합니다. 이때 서비스는 인터페이스를 통해 등록됩니다.
  2. 서비스 검색: 서비스가 필요한 클라이언트는 서비스 로케이터를 사용하여 필요한 서비스를 검색합니다.
  3. 서비스 반환: 서비스 로케이터는 등록된 서비스를 찾아서 반환합니다.

장점

  • 중앙 집중화된 서비스 위치: 서비스 로케이터를 통해 서비스의 위치를 중앙 집중화하여 관리할 수 있습니다.
  • 유연성: 서비스의 위치를 동적으로 변경할 수 있으며, 클라이언트는 서비스의 구체적인 위치를 알 필요가 없습니다.
  • 서비스 검색의 캡슐화: 서비스 로케이터를 통해 서비스 검색을 캡슐화하여 클라이언트 코드를 단순화할 수 있습니다.

단점

  • 의존성: 서비스 로케이터에 의존하게 되므로, 의존성이 높아질 수 있습니다.
  • 숨겨진 의존성: 서비스 로케이터를 사용하면 서비스의 위치가 숨겨져 있어서 코드를 이해하기 어려울 수 있습니다.

사용 사례

  • 다중 구현을 가진 서비스의 위치를 추상화할 때 유용합니다.
  • 서비스 위치를 동적으로 변경해야 할 때 사용할 수 있습니다.
  • 프레임워크나 라이브러리에서 많이 사용됩니다.
using System;
using System.Collections.Generic;

// 인터페이스: ILogger
public interface ILogger
{
    void Log(string message);
}

// 구현 클래스: ConsoleLogger
public class ConsoleLogger : ILogger
{
    public void Log(string message)
    {
        Console.WriteLine("[Console] " + message);
    }
}

// 구현 클래스: FileLogger
public class FileLogger : ILogger
{
    public void Log(string message)
    {
        Console.WriteLine("[File] " + message);
    }
}

// 서비스 로케이터 클래스
public class ServiceLocator
{
    private Dictionary<string, ILogger> services;

    public ServiceLocator()
    {
        services = new Dictionary<string, ILogger>();
        // 서비스 등록
        services["ConsoleLogger"] = new ConsoleLogger();
        services["FileLogger"] = new FileLogger();
    }

    // 서비스 검색 메서드
    public ILogger GetLogger(string serviceName)
    {
        if (services.ContainsKey(serviceName))
        {
            return services[serviceName];
        }
        else
        {
            throw new KeyNotFoundException("Service not found: " + serviceName);
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        // 서비스 로케이터 생성
        ServiceLocator locator = new ServiceLocator();

        // 로깅 서비스 가져오기
        ILogger consoleLogger = locator.GetLogger("ConsoleLogger");
        ILogger fileLogger = locator.GetLogger("FileLogger");

        // 로깅
        consoleLogger.Log("This is a log message to console");
        fileLogger.Log("This is a log message to file");
    }
}
반응형