목표
파라미터 바이딩 일부 구현하기!
어제 Custom하게 만든 Controller를 찾아 그 안의 각각 메서드를 형식에 맞게 등록시켜놓았습니다. 이제는 그 메서드 안으로 들어왔을 때 파라미터들이 스프링 프레임워크가 해주는 것처럼 보낸 데이터로 채워지도록 구현해야 합니다. 다시 말하면 파라미터로 User
객체가 들어있을 때 우리는 Socket 연결 중인 User
를 소켓 세션 정보를 이용하여 알아낸 다음 미리 주입시켜놔야 한다는 것입니다.
특정 타입 밖에 안되기 때문에 이전에 스프링 프레임워크에서 썼던 HandlerMethodArgumentResolver
와 같이 구현하여 특정 조건일 때 실행될 수 있도록 만들겠습니다.
public interface HandlerMethodArgumentResolver {
boolean supportsParameter(Class<?> parameterType);
Object resolveArgument(MessageDto messageDto);
}
매개변수는 다르지만 스프링 프레임워크와 같이 supportsParameter() 가 True일 때 resolveArgument() 가 실행되고 그 안에 처리하면 됩니다.
그래서 파라미터 바인딩 하는 클래스를 만들고 그 안에 아래와 같이 메서드를 만들었습니다.
public Object[] bind(Method method, MessageDto messageDto) throws Exception {
Object[] args = new Object[method.getParameterCount()];
Class<?>[] types = method.getParameterTypes();
for (int i = 0; i < args.length; i++) {
args[i] = types[i].newInstance();
log.debug(types[i].getName());
for (HandlerMethodArgumentResolver methodArgumentResolver : methodArgumentResolvers) {
if (methodArgumentResolver.supportsParameter(types[i])) {
args[i] = methodArgumentResolver.resolveArgument(messageDto);
}
}
}
return args;
}
4번째 줄의 for문은 그 메서드 안의 파라미터들에 대한 반복문입니다. 그리고 7번째 줄의 for문은 제가 이제부터 만들 HandlerMethodArgumentResolver
구현체 개수에 대한 반복문입니다. 그리고 파라미터가 해당 조건을 만족하면 그것에 한해 처리되게 됩니다.
아직 리팩토링은 진행하지 못해 깔끔하지 못하네요. 테스트를 통해 가장 처음에 만들어둔 UserHandlerMethodArgumentResolver
가 User를 바인딩하는데 성공적으로 처리한 것을 확인하였습니다(WebSocketSession
에서 유저를 꺼내오는데 이게 테스트 데이터 만들기가 어려워 정상적으로 꺼냈다고 처리하고 테스트하였습니다). 내일은 시간이 되면 이 부분을 리팩토링하여 복잡도를 줄여야겠습니다.
'TIL' 카테고리의 다른 글
Todays' Dev Notes(2018-03-15) (0) | 2019.03.16 |
---|---|
Todays' Dev Notes(2018-03-11) (0) | 2019.03.12 |
Today's Dev Notes(2019-03-09) (0) | 2019.03.10 |
Intellij에서 디버깅 사용하기 (0) | 2019.02.24 |
Today's Dev Notes(2019-02-07) (0) | 2019.02.07 |