공통 인터페이스 개발중에, 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);
참고자료 :
'개발이슈 > 디자인패턴' 카테고리의 다른 글
멀티스레드 환경에서 안전한 Step Builder 패턴 이해하기 (0) | 2023.11.25 |
---|---|
Builder Pattern (빌더패턴) (0) | 2022.09.07 |
추상 팩토리 (Abstract factory) 패턴 (0) | 2022.08.31 |
팩토리 메소드 패턴2 (factory method pattern) (0) | 2022.08.29 |
팩토리 메소드 패턴1 (factory method pattern) (0) | 2013.11.12 |