티스토리 뷰

연초에 쿼리 스트링 공통 객체를 만든 적이 있습니다.

 

쿼리 스트링 만들기

외부 API를 받아오는 WebClient 개발 관련 포스팅입니다. 해당 github 주소입니다. GitHub - laboratory-kkoon9/spring-batch-gradle Contribute to laboratory-kkoon9/spring-batch-gradle development by creating an account on GitHub. github.co

kkoon9.tistory.com

팀원들과의 지식 공유 자리에서 쿼리스트링 개발 내용을 발표했었습니다.

저는 발표에서 다음과 같은 고민을 공유했습니다.

디미터 법칙 위반

String queryString = QueryStringConverter.convert(JsonToMapConverter.convert(jsonParser.parse(dto)));

위 코드는 쿼리스트링을 만들기 위해 여러 객체를 호출합니다.

디미터 법칙을 위반하고 있죠.

디미터 법칙은 "모듈은 자신이 조작하는 객체의 속사정을 몰라야 한다는 법칙"입니다.

위 코드는 쿼리스트링을 만드는 객체가 jsonParser와 JsonToMapConverter를 사용한다고 모두에게 알려주고 있죠.

디미터 법칙 리팩터링

팀원들도 다음과 같은 사항에 대해 의견을 주셨고, 저는 다음과 같이 코드를 리팩터링하였습니다.

String queryString = queryStringConverter.convert(dto);

이 코드는 queryStringConverter가 Dto를 받아서 어떻게 처리하는지에 대한 내부 구현은 알리지 않습니다.

대신 스태틱 메서드였던 convert는 제너릭 타입의 QueryStringConvert 객체의 convert 메서드로 바뀌게 되었습니다.

package com.laboratorykkoon9.springbatchgradle.infra.boxoffice.util;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.util.ObjectUtils;
import org.springframework.web.util.UriComponentsBuilder;

import java.util.Map;

import static com.laboratorykkoon9.springbatchgradle.global.constant.CommonConstants.EMPTY_ERROR_MESSAGE;

public class QueryStringConverter<T> {
    private static final ObjectMapper mapper = new ObjectMapper();
    public String convert(T object) throws JsonProcessingException {
        Map<String, Object> messages = parse(object);
        if (messages == null) {
            throw new NullPointerException(EMPTY_ERROR_MESSAGE);
        }
        UriComponentsBuilder queryString = UriComponentsBuilder.newInstance();
        for (String key : messages.keySet()) {
            if(messages.get(key) == null) {
                continue;
            }
            queryString.queryParam(key, messages.get(key).toString());
        }

        return queryString.toUriString();
    }

    private Map<String, Object> parse(T object) throws JsonProcessingException {
        String json = mapper.writeValueAsString(object);
        if(ObjectUtils.isEmpty(json)) {
            throw new IllegalArgumentException(EMPTY_ERROR_MESSAGE);
        }
        return mapper.readValue(json, Map.class);
    }
}

해당 메서드의 설명은 이전 포스팅에 나와있으니, 설명은 생략하겠습니다.

대신 리팩터링한 pr 링크를 공유해드릴테니, 참고하시면 될 것 같습니다.

 

refactor: 쿼리스트링 메서드 리팩터링 by kkoon9 · Pull Request #1 · laboratory-kkoon9/spring-batch-gradle

 

github.com

혹시 더 나은 방법이 생각나시면 댓글이나 해당 깃헙에 pr 올려주시면 감사하겠습니다!

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함