JAVA/Spring

Factory Pattern within Spring

hun.a 2020. 7. 18. 02:12
반응형

출처: https://ko.m.wikipedia.org/wiki/%ED%8C%8C%EC%9D%BC:Factory_1.png

스프링에서 팩토리 패턴을 사용하기 좋은 방법을 발견해서 기록해둔다.

한번 봐보자. DI와 팩토리의 만남. 기가막힌다.


인터페이스 정의

먼저 인터페이스를 하나 만들어 보자.
뭐가 좋을까?
간단하게 자동차로 해보자.

public interface Car {
    Color getColor();
}

그냥 색깔만 보여준다.

이제 색깔별 차들을 구현해보자.


색깔별 자동차 클래스 구현

@Component
public class RedCar implements Car {
    @Override
    public Color getColor() {
        return Color.RED;
    }
}

빨간차...

@Component
public class BlackCar implements Car {
    @Override
    public Color getColor() {
        return Color.BLACK;
    }
}

까만차...

@Component
public class BlueCar implements Car {
    @Override
    public Color getColor() {
        return Color.BLUE;
    }
}

파란 차!


아! 컬러가 없구나. 컬러 enum을 구현해보자.


Enum: Color

@RequiredArgsConstructor
@Getter
public enum Color {
    RED("Red"),
    BLUE("Blue"),
    BLACK("Black");

    private final String name;
}

getterconstructor 구현하기 귀찮은데 우리의 lombok씨가 정말 편하게 생성해준다.

아무튼, 그렇고 이제 대망의 팩토리 클래스를 만들어보자.


두둥! 스프링에서 DI 기법을 활용한 팩토리!

@Component
@RequiredArgsConstructor
public class CarFactory {

    private final List<Car> carList;

    public Car getCar(Color color) {
        return carList.stream()
                .filter(car -> car.getColor().equals(color))
                .findFirst()
                .orElseThrow(() -> new IllegalArgumentException("Color not found"));
    }
}

두둥! 끝났다.

요 클래스는 빈으로 정의가 되어 있으므로 스프링에서 List<Car> 타입에 알맞는 클래스들을 가져다가 쏙쏙 넣어준다.
우리는 그냥 요 쏙쏙 들어온 리스트들 중 필요한 객체만 쏙쏙 뽑아서 쓰면 끝이다.

@RestController
@RequiredArgsConstructor
public class Controller {

    private final CarFactory factory;

    ...() {
        factory.getCar(Color.RED);    // << 짠 요롷게 쓰자
    }
}


간단하게 예제를 만들려다 보니 허접해진 것 같은 기분이다.

아무튼 스프링은 참 편리하구나.

반응형