Anyway

[Spring] 정적 팩토리 메서드 패턴 본문

Java/Spring

[Spring] 정적 팩토리 메서드 패턴

dyana 2024. 8. 27. 13:24

이전에 개발했을 때는 객체를 인스턴스화 할 때 직접적으로 생성자를 호출하여 생성하였는데 별도의 객체 생성의 역할을 하는 Class 메서드를 통해 객체 생성할 수 있다는 것을 알았다! 정적 팩토리 메서드 패턴이라고 하는 개발자가 구성한 Static Method를 통해 간접적으로 생성자를 호출하여 객체를 생성하는 디자인 패턴이라고 한다. 좀 더 명확하게 정리해보자. 

 

[정적 팩토리 메서드 패턴(Static Factory Method Pattern]

정적 팩토리 메서드 패턴은 객체 생성의 복잡성을 감추고, 객체 생성을 위한 더 나은 가독성, 유연성을 제공하는 패턴이다. 이 패턴은 'new' 키워드를 직접 사용하지 않고 클래스 내에서 정의된 정적 메서드를 통해 객체를 생성하는 방법을 의미한다. 이 메서드는 일반적으로 객체를 생성하거나 변환할 때 사용된다. 

 

[정적 팩토리 메서드 패턴의 주요 특징]

  1. 정적 메소드 사용 :
    객체를 생성하기 위해 'static' 메서드를 사용한다. 이 메서드는 클래스의 인스턴스를 생성하여 반환한다. 
  2. 명명된 메서드 :
    정적 팩토리 메서드의 이름을 개발자가 결정할 수 있다. 이로 인해 메서드 이름을 통해 객체의 의도나 생성 방법을 명확하게 알 수 있다. 
  3. 캡슐화된 생성 로직 :
    객체 생성 로직이 메서드 내부에 캡슐화되어 있기 때문에 복잡한 객체 생성 과정을 메서드 내부에 감출 수 있다. 
  4. 객체 재사용 :
    정적 팩토리 메서드는 동일한 객체를 반환하거나 캐싱을 통해 객체를 재사용할 수 있다. 이는 성능 최적화에 유리하다.
  5. 상속을 통한 유연성 제공 :
    팩토리 메서드는 클래스의 서브클래스를 반환할 수 있다. 이를 통해 다양한 하위 클래스의 객체를 생성할 수 있다. 

[정적 팩토리 메서드 패턴의 장점]

  1. 가독성 : 
    메서드 이름을 통해 생성될 객체의 의도나 용도를 명확하게 나타낼 수 있어 코드의 가독성이 높아진다.
  2. 객체 재사용 :
    동일한 객체를 반환하거나 캐싱 메커니즘을 통해 객체를 재사용할 수 있어 메모리 효율을 높일 수 있다.
  3. 유연한 객체 생성 :
    팩토리 메서드를 통해 생성 로직을 변경해도 외부 코드에 영향을 미치지 않으므로 유지보수가 용이하다.
  4. 추가적인 생성 로직 :
    객체 생성 시 추가적인 로직을 포함할 수 있다. 예를 들어, 입력 값 검증, 초기화 작업 등을 포함할 수 있다.
  5. 다형성 제공 :
    서브 클래스를 반환하거나 상황에 다라 다른 객체를 반환할 수 있어 다형성을 쉽게 구현할 수 있다. 

[정적 팩토리 메서드 예시]

public class CommonResult {

    private int code;
    private String message;

    private Object data;
    public static CommonResult data(Object data) {
        return new CommonResult(CommonResultCode.SUCCESS, data);
    }
    
 }

 

static이 아니면 ?

익히 쓰고 아는 인스턴스 팩토리 메서드가 된다. 

 

[인스턴스 팩토리 메서드]

  1. 클래스의 인스턴스가 필요하며, 해당 인스턴스를 통해 메서드를 호출해야 한다.
  2. 'static' 키워드가 없으며 인스턴스마다 호출할 수 있다.
  3. 여러 인스턴스가 각기 다른 방식으로 객체를 생성해야 하는 경우 유용하다.
  4. 주로 상태를 기반으로 객체를 생성하거나 상속 구조에서 사용된다. 

[인스턴스 팩토리 메서드의 사용 시 고려사항]

  • 인스턴스 필요성 :
    인스턴스 팩토리 메서드는 메서드를 호출하기 전에 반드시 클래스의 인스턴스를 생성해야 한다. 따라서 단순히 객체를 생성하는 것보다 인스턴스가 필요한 더 복잡한 상황에 적합하다.
  • 상태 관리 :
    인스턴스 팩토리 메서드는 클래스의 인스턴스 필드와 상호작용하여 객체를 생성할 수 있다. 이를 통해 객체 생성 시 더 많은 컨텍스트를 제공할 수 있다.
  • 다형성 :
    인스턴스 팩토리 메서드는 상속을 통해 다양한 하위 클래스에서 다른 방식으로 객체를 생성할 수 있다. 

[인스턴스 팩토리 메서드 예시]

public class UserFactory {
    private String defaultName;
    private int defaultAge;

    public UserFactory(String defaultName, int defaultAge) {
        this.defaultName = defaultName;
        this.defaultAge = defaultAge;
    }

    // 인스턴스 팩토리 메서드
    public User createUser() {
        return new User(defaultName, defaultAge);
    }
}

// 인스턴스 팩토리 메서드 호출
UserFactory factory = new UserFactory("DefaultName", 20);
User user = factory.createUser();

 

 

즉 정적 팩토리 메서드 'static'이 아니게 되면, 메서드 호출에 인스턴스가 필요해지며 그 성격이 인스턴스 팩토리 메서드로 변하게 된다. 

이 경우, 메서드를 호출하기 위해 클래스를 먼저 인스턴스화해야 하므로 인스턴스 상태를 반영한 객체 생성이 가능해지지만 단순한 객체 생성이 목적이라면 정적 팩토리 메서드가 더 적합할 수 있다.