DevBoi

[Spring] ObjectProvider + FuntionalInterface 본문

Develop/[Spring]

[Spring] ObjectProvider + FuntionalInterface

HiSmith 2023. 6. 22. 14:33
반응형

Functional Interface와 인터페이스를 결합하는 방법에 대해서 알아보자

1개의인터페이스가 있고 이를 가지고 Configuration을 만들어보자

 

ObjectProvider를 활용해서 한개의 인터페이스로 여러개의 빈을 만드는 과정이다.

간단하지만 아래와 같이 설계했다.

 

public interface Food {

  public String getEat();
  
   interface FoodHandler {
   public String eat();
  }
}
public interface FoodFunc {
  Food.FoodHandler supply();
}
public class FoodImpl implements Food{

  FoodHandler handler;
  public Food with(FoodFunc handler){
    this.handler = handler.supply();
    return this;
  }


  @Override
  public String getEat() {
    return this.handler.eat();
  }
}
public class KoreanFood implements Food.FoodHandler{

  @Override
  public String eat() {
    return "korean";
  }
}
public class EngFood implements Food.FoodHandler{
  @Override
  public String eat() {
    return "eng";
  }
}
@Configuration
public class FoodConfiguration {

  @Bean
  Food food(ObjectProvider<Food.FoodHandler> handlers){
    
    return new FoodImpl().with(()->new KoreanFood());
  }
}

 

 

이렇게 되면 FoodConfiguration 의 Food로 주입되는 빈은 코리안 푸드가 되고

푸드를 사용하는 객체에서는 geteat을 하면, korea가 나오게 된다.

@RestController
public class FoodController {
  @Autowired
  Food food;

  @RequestMapping("/food")
  public String foodeat(){
    return food.getEat();
  }
}

 

이렇게 하면 어떤게 좋을까?

아래와 같이, 같은 인터페이스를 사용하는 빈이라도, 여러개의 빈으로 생성할 수있다.

@Configuration
public class FoodConfiguration {

  @Bean
  Food koreafood(ObjectProvider<Food.FoodHandler> handlers){

    return new FoodImpl().with(()->new KoreanFood());
  }
  @Bean
  Food engfood(ObjectProvider<Food.FoodHandler> handlers){

    return new FoodImpl().with(()->new EngFood());
  }
}

 

 

사용하는 곳에서는 아래와 같다.

@RestController
public class FoodController {
  @Autowired
  Food koreafood;

  @Autowired
  Food engfood;

  @RequestMapping("/food")
  public String foodeat(){
    System.out.println(engfood.getEat());
    return koreafood.getEat();

  }
}

 

Food에 대해서 동일 인터페이스를 쓰지만 빈의 구성을 다르게 가져가고싶을때 유용하다,

해당으로 하면 빈에 할당되는 별도 특성을 다르게 줄수 있어서, 좀더 확장성 측면에서 유리하게 된다.

ObjectProvider에서 제공해주는 리스트를 화면에 출력해보고싶을떄는 아래와 같이 뿌려보면 된다.

 @Bean
  Food koreafood(ObjectProvider<Food.FoodHandler> handlers){
    handlers.stream().iterator().forEachRemaining(System.out::println);
    return new FoodImpl().with(()->handlers.stream().filter(KoreanFood.class::isInstance));
  }

 

반응형

'Develop > [Spring]' 카테고리의 다른 글

[Spring] Springboot 3.2 Swagger 설정  (0) 2023.07.22
[Spring] ObjectMapper 사용  (0) 2023.07.10
[Spring] ObjectProvider에 대해서.  (0) 2023.06.20
[Spring] 멀티모듈의 개념  (0) 2023.06.18
[Spring] Fegin 잘 쓰기  (0) 2023.06.14