[Spring] WebClient로 알아보는 Static Factory Method

이대건·2024년 9월 26일
0

Spring

목록 보기
6/7
post-thumbnail

Static Factoy Method

  • static method를 사용하여 객체를 생성하는 방식

    팩토리 매서드 패턴은 디자인 패턴중 하나로 서로 다른 개념이다.

WebClient 탐구

  • WebClient는 스프링 프로젝트의 Spring-webflux 모듈 내에 비동기 HTTP 통신을 지원하는 interface다.
  • Java 8부터 interfacestatic 매서드, default 매서드 사용이 가능해진 배경
  • Static Factory Method를 interface에서 제공하여 기존의 장점 + 추상화

	public class Client{
    	public static void main(String[] args){
			WebClient webclient = WebClient.create();        	
        }
    }
  • 처음 이 코드를 접했을 때 어떻게 interface에서 매서드를 호출하지? 라는 의문이 들었다.
  • 의문을 해결하기 위해 WebClient를 탐구하기로 결심했고 아래와 같은 코드를 마주쳤다.
	public interface WebClient{
      static WebClient create() {
          return new DefaultWebClientBuilder().build();
      }
      static WebClient create(String baseUrl) {
          return new DefaultWebClientBuilder().baseUrl(baseUrl).build();
      }
  	}
  • interface에서 객체를 만들어서 리턴하는 매서드가 있는 것을 발견
  • 이게 어떻게 가능한가 싶어 찾아본 결과 Static Factoy Method의 존재를 알게됐다.

왜 사용할까?

  • 가장 먼저 왜 사용할까에 대해 고민했다. 그 이후 적용점까지 고민했다.
  • 결론적으로 Open-closed principle을 지켜 유지보수성을 높일 수 있다.

기존 추상화된 서비스의 아쉬운 점

	public interface OrderService{
    	...
    }
    public class OrderServiceImpl implements OrderService{
    	@Override
        ...
    }
    ---
    public class OrderConfig{
    	public OrderService orderService(){
        	return orderServiceImpl();
        }
	}
  • 위 코드처럼 Service 추상화가 적용됐음에도 OrderServiceImpl 대신 다른 구현체를 사용하고자 한다면
    client 측인 OrderConfig 클래스 수정이 불가피하다.
  • 서비스 추상화를 실습하면서 2% 부족하다고 생각했던 지점이다.

위 코드에 interface + Static Factory Method 적용한다면?


	public interface OrderService{
    	static OrderService create(){
        	return new OrderServiceImpl();
        }
    }
    class OrderServiceImpl implements OrderService{
    	@Override
        ...
    }
    ---
    public class OrderConfig{
    	public OrderService orderService(){
        	return OrderService.create();
        }
	}

client 코드 수정 없이

  1. OrderService를 구현하는 새로운 클래스

  2. OrderServicecreate() 매서드 수정

    위 두 작업만으로 서비스 확장을 할 수 있다.

결론

client 코드 수정에는 닫혀있고, 확장에는 열려있는 개발이 가능해진다.

profile
일낸머스크

0개의 댓글

관련 채용 정보