Spring 기초/Spring 기초 지식

가볍게 알아보는 디자인 패턴 - 팩토리 메서드 패턴(Factory Method Pattern)

Stark97 2023. 12. 11. 02:49
반응형
 
 

팩토리 메서드 패턴에 대해서 알아보자

 

팩토리 메서드 패턴
팩토리 메서드 패턴

 

 

1. 팩토리 메서드 패턴이란?

팩토리 메서드 패턴은 객체 생성을 추상화하고 캡슐화하는 디자인 패턴이다. 스프링에서 이 패턴은 BeanFactory와 ApplicationContext를 통해 구현된다. 객체를 직접 생성하는 대신, 팩토리를 통해 객체를 요청하면, 이 팩토리가 객체 생성의 복잡성을 숨기고 필요한 객체를 제공한다.

 

1-1. 팩토리 메서드 패턴의 기본 구조

  1. 정의
  • 팩토리 메서드 패턴은 객체의 생성 과정을 서브 클래스에 위임하는 디자인 패턴이다. 이를 통해 클라이언트 코드는 구체적인 클래스의 인스턴스화 과정을 알 필요 없이, 객체를 생성할 수 있다.
  2. 구현 방식
  • 이 패턴은 팩토리 메서드를 정의하여, 이 메서드가 객체를 생성하고 반환하는 역할을 한다. 클라이언트는 팩토리 메서드를 호출하여 필요한 객체를 받는다.
  3. 장점
  • 객체 생성 로직의 변경이나 확장이 필요할 때, 클라이언트 코드를 변경하지 않고도 새로운 객체 생성 로직을 쉽게 추가할 수 있다.

 

 

1-2. 스프링 프레임워크에서의 팩토리 메서드 패턴

  1. 스프링 빈 팩토리
  • 스프링의 BeanFactory 인터페이스는 객체(빈) 생성과 관리의 복잡성을 추상화하는 팩토리 메서드 패턴의 한 예이다. 이를 통해 스프링 컨테이너는 빈의 생명주기를 관리하며, 개발자는 생성된 빈을 사용할 수 있다.
  2. 빈 생성 과정의 추상화
  • 스프링에서 빈 생성 과정은 팩토리 메서드를 통해 추상화된다. 개발자는 구체적인 객체 생성 과정을 몰라도 스프링 컨테이너를 통해 필요한 빈을 요청하고 사용할 수 있다.
  3. ApplicationContext와
       BeanFactory
  • ApplicationContext는 BeanFactory를 확장한 더 고급 인터페이스로, 객체 생성뿐만 아니라 다양한 추가 기능(예: 이벤트 발행, 리소스 로딩)을 제공한다.

 

 

1-3. 팩토리 메서드 패턴의 유용성

  1. 유연성
  • 팩토리 메서드 패턴은 객체 생성 과정을 클라이언트 코드와 분리함으로써, 유연성과 확장성을 제공한다.
  2. 재사용과 유지보수
  • 팩토리 메서드 패턴은 코드의 재사용성을 높이고 유지보수를 용이하게 한다. 객체 생성 로직을 한 곳에 집중함으로써, 수정이 필요할 때 한 곳만 변경하면 되기 때문이다.
  3. 의존성 관리
  • 스프링 프레임워크에서 팩토리 메서드 패턴은 의존성 주입과 결합도를 낮추는 데 중요한 역할을 한다.

 

 

 

내가 주로 사용하는 정적 팩토리 메서드를 선언하는 방법을 소개한다.

 

 

1-4. 인터페이스를 사용하지 않고 클래스 내부에서 정적(static) 팩토리 메서드를 선언하기

  1. 생성자를 Private으로 선언
  • 이렇게 하면 클래스 외부에서 생성자를 직접 호출할 수 없게 되어, 객체의 생성이 클래스 내부로 제한된다.
  2. 정적 팩토리 메서드 구현
  • 클래스 내부에 하나 이상의 정적(static) 메서드를 구현한다. 이 메서드는 객체를 생성하고 반환하는 역할을 한다.
  3. 객체 생성의 제어
  • 정적 팩토리 메서드를 통해 객체 생성 과정의 제어가 가능해진다. 예를 들어, 메서드 내에서 객체의 타입을 결정하거나, 특정 상황에 따라 다른 객체를 반환할 수 있다.

 

  • 아래와 같이 코드를 작성한다.
public class MyClass {
    private MyClass() {
        // Private 생성자
    }

    public static MyClass of() {
        // 객체 생성 로직
        return new MyClass();
    }
}

 

  • 이 방식의 장점은 다음과 같다.
  1. 명시적인 메서드 이름
  • 생성자 대신 명시적인 이름을 가진 메서드를 사용할 수 있어, 객체 생성 로직을 더 명확하게 표현할 수 있다.
  2. 유연성
  • 반환되는 객체의 타입을 서브 클래스로 만들 수 있어, 구현의 유연성이 높아진다.
  3. 조건부 객체 생성
  • 필요에 따라 매번 새로운 객체를 생성하거나 기존 객체를 재사용할 수 있다.

 



실전 예시를 통해 팩토리 메서드 패턴을 알아보자



2. 팩토리 메서드 패턴 예시코드

2-1. 예시코드 설명

  • 예를 들어, 쇼핑몰 프로젝트에서 상품 정보를 나타내는 Product 엔티티가 있다고 가정하자. 이 엔티티에 대한 DTO(Data Transfer Object)를 생성할 때, 팩토리 메서드를 사용할 수 있다.

 

2-2. ProductDto 클래스 내부에 정적(static) 팩토리 메서드 작성하기

  • 이 코드에서 ProductDTO 클래스는 Product 엔티티의 데이터를 담기 위한 DTO다. of라는 정적 팩토리 메서드를 통해 Product 인스턴스로부터 ProductDTO를 생성한다.
  • 이 방식은 new 키워드를 직접 사용하는 대신, 팩토리 메서드를 통해 객체 생성의 세부 사항을 추상화하고, 클라이언트 코드에서 객체 생성 방법의 변경에 덜 민감하게 만든다.
import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@RequiredArgsConstructor
public class ProductDTO {

    private Long id;
    private String name;
    private Double price;

    private ProductDTO(Long id, String name, Double price) {
        return new ProductDTO(id, name, price);
    }

    // 팩토리 메서드
    public static ProductDTO toEntity(Product product) {
        return new ProductDTO(product.getId(), product.getName(), product.getPrice());
    }

    public static ProductDTO of(String name, Double price) {
        return new ProductDTO(2L, name, price);
    }
}

 

 

 

 

팩토리 메서드의 장단점은 다음과 같다.


 

3. 팩토리 메서드 패턴의 장단점

3-1. 장점

  1. 객체 생성 과정의 캡슐화
  • 클라이언트는 객체 생성 방법을 몰라도 된다.
  2. 유연성과 확장성
  • 객체 생성 방법을 변경하거나 확장하기 쉽다.
  3. 의존성 관리
  • 스프링과 같은 프레임워크에서 의존성 주입을 통해 더 깔끔한 코드 관리가 가능하다.

 

3-2. 단점

  1. 코드 복잡성 증가
  • 추가적인 코드와 추상화 레이어가 필요하다.
  2. 디자인의 오버헤드
  • 간단한 객체 생성에는 오버엔지니어링일 수 있다.

 

 

이렇게 팩토리 메서드 패턴을 이해하고 사용하면, 스프링 기반의 애플리케이션에서 보다 깔끔하고 유지보수가 쉬운 코드를 작성할 수 있다. 실무에서는 객체 생성의 복잡성을 관리하고 코드의 가독성을 높이기 위해 이 패턴을 자주 사용하곤 한다.

 

 

 

 

팩토리 메서드 패턴은 생각보다 많이 사용된다. JPA엔티티에서도 사용되고 Dto객체에서도 많이 사용된다.





싱글톤 패턴도 가볍게 알아보고 싶다면? 👇🏻👇🏻

 

가볍게 알아보는 디자인 패턴 - 싱글톤 패턴(Singleton Pattern)

스프링에 적용된 싱글톤 패턴에 대해서 간단히 알아보자 1. 싱글톤 패턴의 구조 이해하기 1-1. 스프링 컨테이너 이해하기 스프링 컨테이너는 ApplicationContext를 통해 정의된다. 이 컨테이너는 IoC(Inv

curiousjinan.tistory.com

 

반응형