본문 바로가기
  • Where there is a will there is a way.
개발/spring

java spring retrofit2 gson custom serializer 구현

by 소확행개발자 2020. 5. 7.

 

 

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

댓글