[java] Jigsaw 모듈화 개발에서의 디자인 패턴

Jigsaw는 자바 9부터 도입된 모듈 시스템입니다. 모듈 시스템을 사용하면 자바 애플리케이션을 모듈 단위로 나눌 수 있고, 모듈 간의 의존성을 명시적으로 정의할 수 있습니다. 이러한 모듈화 개발에서는 디자인 패턴을 적용하여 보다 효율적이고 유지보수 가능한 코드를 작성할 수 있습니다. 이번 포스트에서는 Jigsaw 모듈화 개발에서 주로 사용되는 디자인 패턴에 대해 알아보겠습니다.

1. 싱글톤 패턴 (Singleton Pattern)

싱글톤 패턴은 객체 생성을 제한하여 전역적으로 접근 가능한 단일 인스턴스를 유지하는 디자인 패턴입니다. Jigsaw 모듈 시스템에서는 모듈 간의 의존성을 명시적으로 정의하므로, 싱글톤 패턴을 사용하여 한 모듈에서 생성한 인스턴스를 다른 모듈에서 공유할 수 있습니다.

public class Singleton {
    private static Singleton instance;
    
    private Singleton() {
        // 객체 생성 제한
    }
    
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

2. 팩토리 메서드 패턴 (Factory Method Pattern)

팩토리 메서드 패턴은 객체 생성을 서브클래스에 위임하는 디자인 패턴입니다. Jigsaw 모듈화 개발에서는 모듈 간의 의존성을 명시적으로 정의하기 때문에, 팩토리 메서드 패턴을 사용하여 인스턴스를 생성하는 작업을 모듈 간의 인터페이스로 추상화할 수 있습니다.

public interface Animal {
    void makeSound();
}

public class Dog implements Animal {
    @Override
    public void makeSound() {
        System.out.println("멍멍");
    }
}

public class Cat implements Animal {
    @Override
    public void makeSound() {
        System.out.println("야옹");
    }
}

public interface AnimalFactory {
    Animal createAnimal();
}

public class DogFactory implements AnimalFactory {
    @Override
    public Animal createAnimal() {
        return new Dog();
    }
}

public class CatFactory implements AnimalFactory {
    @Override
    public Animal createAnimal() {
        return new Cat();
    }
}

3. 옵저버 패턴 (Observer Pattern)

옵저버 패턴은 객체의 상태 변화를 관찰하고, 이벤트가 발생하면 등록된 모든 옵저버에게 알려주는 디자인 패턴입니다. Jigsaw 모듈화 개발에서는 모듈 간의 의존성을 명시적으로 정의하기 때문에, 옵저버 패턴을 사용하여 모듈 간의 이벤트를 주고받을 수 있습니다.

import java.util.ArrayList;
import java.util.List;

public interface Observer {
    void update(String message);
}

public interface Subject {
    void attach(Observer observer);
    void detach(Observer observer);
    void notifyObservers(String message);
}

public class ConcreteSubject implements Subject {
    private List<Observer> observers = new ArrayList<>();
    
    @Override
    public void attach(Observer observer) {
        observers.add(observer);
    }
    
    @Override
    public void detach(Observer observer) {
        observers.remove(observer);
    }
    
    @Override
    public void notifyObservers(String message) {
        for (Observer observer : observers) {
            observer.update(message);
        }
    }
}

public class ConcreteObserver implements Observer {
    private String name;
    
    public ConcreteObserver(String name) {
        this.name = name;
    }
    
    @Override
    public void update(String message) {
        System.out.println(name + ": " + message);
    }
}

이렇게 Jigsaw 모듈화 개발에서 주로 사용되는 싱글톤 패턴, 팩토리 메서드 패턴, 옵저버 패턴에 대해서 알아보았습니다. 이러한 디자인 패턴을 활용하여 모듈화된 자바 애플리케이션을 보다 구조화하고 유지보수하기 쉬운 코드로 개발할 수 있습니다.

참고자료: