개발이슈/디자인패턴

step builder pattern (스텝빌더 패턴)

kalkin 2023. 8. 28. 17:40

 

공통 인터페이스 개발중에, rest통신쪽 개발을  맡게 되어 

 

아래와 같은 조건이 필요 했다. 

 

 

1. rest api 호출전에 header를 생성해야 한다. 

2. 그 후 payload 를 생성 한다. 

3. payload로 요청을 날린다. 

4. 각 비지니스 타입에 맞게 Dto에 담아서 json객체를 Parsing 해준다.

 

 

 

먼저 stepBuilder pattern에 대해 검색해보면. 아래와 같이 정리할 수 있다. 

 

Step Builder 패턴은 객체 생성 과정을 단계별로 나눠서 처리할 수 있게 하는 디자인 패턴이다.
특히 복잡한 객체를 구축할 때, 필요한 조건이나 순서에 따라 생성 과정을 조절해야 할 때 유용하게 사용할 수 있다. 


Builder 패턴의 기본 아이디어는 객체 생성을 별도의 Builder 클래스에 위임하여 객체의 생성과 표현을 분리하는 것입니다. 

 

Step Builder는 이 아이디어를 확장하여 생성 과정을 여러 단계로 나눔으로써 더 명확하고 강력한 표현력을 제공한다.

Step Builder 패턴의 장점:
유연성: 복잡한 객체 생성 과정을 단계별로 나누면, 사용자는 원하는 단계만 선택하여 객체를 생성할 수 있습니다.
명확성: 각 단계는 그 목적에 따라 명확하게 구분되므로, 코드를 읽는 사람에게 해당 객체가 어떻게 생성되는지 명확하게 이해시킬 수 있습니다.
안정성: 특정 순서로 메서드를 호출해야 하는 경우, Step Builder 패턴을 사용하면 그 순서를 강제함으로써 안정성을 높일 수 있습니다.

 

 

public interface HeaderStep {
    PayloadStep withHeader(String interfaceId, HttpMethod httpMethod);
}


public interface PayloadStep {
    SendRequestStep withPayload(Map<String, Object> payload);
}

public interface SendRequestStep {
    SendRequestStep sendRequest();
    <T> List<T> extractBodyJson(Class<T> clazz);
}
public class RequestBuilder implements HeaderStep, PayloadStep, SendRequestStep {

    private final restClientUtil client;
    private  RequestHeaderDto header;
    private Map<String, Object> payload;
    private ResponseJsonDto response;


 private App2DbRequestBuilder(RestClientUtil client) {
        this.client = client;
    }
    
public static HeaderStep begin(RestClient client) {
        return new RequestBuilder(client);
    }
    
        @Override
    public PayloadStep withHeader(String interfaceId, HttpMethod httpMethod) {
        this.header = client.createHeader(interfaceId, httpMethod);
        return this;
    }
    
        @Override
    public SendRequestStep withPayload(Map<String, Object> payload) {
        this.payload = payload;
        return this;
    }
    
    
      @Override
    public SendRequestStep sendRequest() {
        String jsonBody = client.requestJsonString(header, payload);
        this.response = client.sendAgent(jsonBody);
        return this;
    }
    
        @Override
    public <T> List<T> extractBodyJson(Class<T> clazz) {
        return client.extractBodyJson(response, clazz);
    }​

 

    Cleint.java
    
    //생략
    
     public HeaderStep requestBuilder() {
        return RequestBuilder.begin(this);
    }
각 서비스에서 호출시, 



수정전.
  	RequestHeaderDto header = client.createHeader("IF_ON_0029", HttpMethod.GET);
		String payload = app2DbClient.requestJsonString(header, searchDate);
		ResponseJsonDto responseJsonDto = app2DbClient.sendAgent(payload);
		return  app2DbClient.extractBodyJsonApp2Db(responseJsonDto, PoUsrEaiResponse.class);
                
수정후.

 app2DbClient.requestBuilder()
				.withHeader("IF_ON_0001", HttpMethod.GET)
				.withPayload(searchDate)
				.sendRequest()
				.extractBodyJsonApp2Db(PoUsrEaiResponse.class);

 

 

 

 

참고자료 : 

https://java-design-patterns.com/patterns/step-builder/