spring java 서버에서 api 연동을 구현하려면 http 통신이 필요하다.
http 통신을 하게 해주는 라이브러리는 restTemplate 와 retrofit2 정도를 알고 있는데, 우리는 retrofit2 를 사용하였다.
retrofit2 는 gson 라이브러리를 사용하고 있다. 기본적인 설정만으로도 잘 되는게 많지만 비즈니스의 요구사항이 많아지면 당연 custom 을 피할 수 없다고 본다.
retrofit2 gson dynamic serializer 구현
나는 관련 업체에 특정 필드를 dynamic 하게 exclude 해야하는 요구사항이 있었고 해당 api 를 호출할때 이 기능을 사용하고 싶었다.
우선 configuration 설정을 해준다.
@Configuration
@ConfigurationProperties("agent.api")
public class ApiServiceConfig {
private String url;
private String accessKey;
// retrofit 은 final class 로 선언되어 있다.
private Retrofit connector;
@Bean
public SsgApiService ssgApiService() {
OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
httpClient.addInterceptor(chain -> {
Request original = chain.request();
// 해당 api 서비스는 authorization 이 필요하다.
Request request = original.newBuilder().header("Authorization", accessKey)
.header("Accept", "application/json").header("Content-Type", "application/json")
.method(original.method(), original.body()).build();
return chain.proceed(request);
});
// 1. http client 를 빌드한 뒤,
OkHttpClient client = httpClient.build();
// 2. retrofit2 를 빌드한다.
Retrofit.Builder connectorBuilder = new Retrofit.Builder();
this.connector = connectorBuilder.baseUrl(url).addConverterFactory(
ConverterFactory.createGsonConverter(Item.class, new ItemSerializer()))
.client(client).build();
return this.connector.create(ApiService.class);
}
// 해당 Factory 는 현재 bean 에서만 사용할 뿐이기 때문에 inner class 로 선언하였다.
private static class ConverterFactory {
private static Converter.Factory createGsonConverter(Type type, Object typeAdapter) {
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(type, typeAdapter);
Gson gson = gsonBuilder.create();
return GsonConverterFactory.create(gson);
}
}
}
그런 뒤 내가 사용할 dynamic Serializer 를 만든다.
-> deserializer 가 필요하다면 deserializer 를 만들면 된다.
public class SsgItemSerializer implements JsonSerializer<Item> {
@Override
public JsonElement serialize(Item item, Type typeOfSrc, JsonSerializationContext context) {
JsonObject jObj = (JsonObject) new GsonBuilder().create().toJsonTree(ssgItem);
if(item.getInvMngYn().equals("N")) {
jObj.remove("baseInvQty");
}
return jObj;
}
}
이렇게 되면 나는
'위와 같은 조건이 있을대 해당 필드를 사용하지 않는다'
를 retrofit2 connector 에 설정하게 된다.
'개발 > spring' 카테고리의 다른 글
스프링이란 무엇인가? (0) | 2020.07.12 |
---|---|
spring security custom filter 인증 구현 (0) | 2020.05.20 |
spring transaction 이란 (0) | 2020.04.23 |
JPA 애플리케이션 영속성 관리 (0) | 2020.04.13 |
JPA 연관관계 (0) | 2020.03.16 |
댓글