본문 바로가기
server

모든 API 엔드포인트에 공통 파라미터가 필요하다.

by Younji! 2020. 4. 30.

 

기존에 있던 API 모듈에 특정 파라미터를 거의 모두 추가해줘야 하는 요건이 생겼다.

 

 

추가할 파라미터를 String addParameter; 라고 하자.

 

아래와 같이 두 가지 정도로 방안을 생각해 볼 수 있다.

Request DTO Object에 추가

@GetMapping
public void get(@RequestBody DtoObject dto) {}

public class DtoObject {
    private String addParameter;
    private ...
}

RequestParam을 모두 명시적으로 파라미터를 추가

@GetMapping
public void get(@RequestBody DtoObject dto,
                @RequestParam(required=false) String addParameter) {}

결론부터 말하자면 DTOObject에 addParameter가 추가되는 첫 번째 방안으로 결정하였다.


이유는 DTO를 Entity Model로 변환하는 ModelMapper 를 사용하고 있는데 DTO에 추가할 경우 기존 로직에 변함이 없기 때문이다. 두 번째의 경우를 보면 dto.set(addParameter) 가 필요하게 되지 않겠는가 생각하였다. (실제로 그런 경우가 발생했음)

객체 변환을 ModelMapper에 의존하고 있기 때문에 첫 번째 방안이 좀 더 지금 구조에 적합했다.

 

결론은 났으나.. 모든 DTO 오브젝트마다 파라미터를 추가하기 귀찮다 생각이 드는데, 공통으로 빼줄 방안이 없을까?

 

 

나랑 비스무리한 생각을 한 사람이 있긴 있었다.

@ControllerAdvice(“com.am3tt.earlgrey")
public class ParameterInjector {
    @ModelAttribute
    public void myMethod(@RequestParam String addParameter) {
        RequestContext.addParameter.set(addParameter);
    }
}

public class RequestContext {
    public static ThreadLocal<String> addParameter = new ThraedLocal<>();
    public static void clear() {
        addParameter.remove();
    }
}

@GetMapping
public void get(@RequestBody DtoObject dto) {
	dto.set(RequestContext.addParameter.get());
}

@ControllerAdvice 은 Controller에 글로벌하게 코드를 적용할 수 있는 Annotation 이다. ExceptionHandler로도 잘 사용하고 있는데 요긴하게 쓰일 수 있겠다 싶었다. 거기에 쓰레드마다 값이 달라질 수도 있으니 ThreadLocal에 저장하면 좋겠다 싶어 위처럼 작성하였다.

 

장점은 거의 모든 요청에 공통으로 필요한 `addParemter`를 추가해주지 않아도 된다는 것이 있겠다.
하지만 아까도 언급했지만 두 번째 방안처럼 기존 Request DTO에 ModelMapper로 변환하기 위해서 저장해줘야하는 번거로움이 발생하게 되므로 첫 번째 방안을 택하게 되었다.

 

 급하게 마무리하는 느낌이 들지만 ㅎㅎ 다시 한 번 느꼈지만 기존 코드에 영향이 없고, 개발자가 최대한 귀찮지 않은 방향으로 고민해보는게 가장 좋은 방법이지 않을까 생각한다. 급급하게 처리하는게 아니라 좋은 방향이 있을까 고민해보는 것은 나를 성장하게 할 수 있는 좋은 방법이다.

'server' 카테고리의 다른 글

멀티모듈에 한 방으로 적용되는 application.yml  (0) 2020.06.08
tcpdump mtr  (0) 2020.05.15
어째서 엔티티가 계속 업데이트 되는가..  (0) 2019.06.28
fluentd와 함께하는 검색 데이터 수집  (0) 2019.06.26
Redisson  (0) 2019.06.26

댓글