JAVA/Spring
Factory Pattern within Spring
hun.a
2020. 7. 18. 02:12
반응형
스프링에서 팩토리 패턴을 사용하기 좋은 방법을 발견해서 기록해둔다.
한번 봐보자. 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;
}
getter
랑 constructor
구현하기 귀찮은데 우리의 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); // << 짠 요롷게 쓰자
}
}
간단하게 예제를 만들려다 보니 허접해진 것 같은 기분이다.
아무튼 스프링은 참 편리하구나.
반응형