티스토리 뷰
연초에 쿼리 스트링 공통 객체를 만든 적이 있습니다.
쿼리 스트링 만들기
외부 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 올려주시면 감사하겠습니다!

'개발 노트' 카테고리의 다른 글
[스프링+코틀린] spring boot 3 Class 'Foo' should have [public, protected] no-arg constructor (0) | 2023.07.20 |
---|---|
[스프링+코틀린] spring boot 3 webflux spring docs(swagger) 404 에러 (0) | 2023.07.15 |
[스프링+코틀린] Execution failed for task ':test'. > No tests found for given includes (0) | 2023.01.21 |
JpaRepository 파라미터 Mocking 시 NullPointerException (0) | 2023.01.09 |
쿼리 스트링 만들기 (0) | 2023.01.02 |
- Total
- Today
- Yesterday
- 코테
- 객체지향
- kotest
- Java
- 테라폼
- MSA
- BAEKJOON
- 디자인패턴
- C++
- Effective Java
- Kotlin
- Algorithm
- node.js
- 프로그래머스
- programmers
- kkoon9
- 클린 코드
- 클린 아키텍처
- 정규표현식
- AWS
- 이팩티브 자바
- 백준
- 알고리즘
- JPA
- Spring Boot
- 이펙티브 자바
- Spring
- BOJ
- Olympiad
- 디자인 패턴
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |