首页>itarticle>HandlerMethodArgumentResolver 인터페이스를 이용한 Controller 커스텀 파라미터 객체 만들기HandlerMethodArgumentResolver 인터페이스를 이용한 Controller 커스텀 파라미터 객체 만들기
HandlerMethodArgumentResolver 인터페이스를 이용한 Controller 커스텀 파라미터 객체 만들기HandlerMethodArgumentResolver 인터페이스를 이용한 Controller 커스텀 파라미터 객체 만들기
admin11月 13, 20200
이 인스터페이스는 전략 패턴의 일종으로 컨트롤러 메서드에서 특정 조건에 해당하는 파라미터에 바인딩 해주는 전략 인터페이스이다. 따라서 AOP로 모든 메서드를 일일이 찾아서 데이터를 바인딩 할 필요없이 어노테이션을 만들어 쉽게 바인딩 할 수 있다.
예를 들어 컨트롤러에서 세션을 조회해야 하거나 HttpServletRequest에서 토큰 또는 쿠키 정보를 기반으로 인증 객체를 만들어야 한다고 가정해보자. 그렇게 되면 이러한 객체를 만들기 위해서는 아래의 소스같이 session에서 유저정보를 가져오거나 request 정보에서 인증정보를 가져오는 중복 코드가 발생할 수 있다. 이러한 문제를 HandlerMethodArgumentResolver를 이용하면 쉽게 해결할 수 있다.
HandlerMethodArgumentResolver 사용 안한 경우
1 2 3 4 5 6 7 8 9 10 11 12 13 14
@RequestMapping("/members") publicclass{
@GetMapping public ResponseEntity<Member> getMember(){ Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
HandlerMethodArgumentResolver 사용한경우
HandlerMethodArgumentResolver 를 사용하면 위와 같이 컨트롤러마다 인증정보를 만들 필요 없이 아래와 같이 커스텀 어노테이션을 정의하고 HandlerMethodArgumentResolver를 동록 해놓으면 아래와 같이 유저정보를 바인딩 해서 사용할 수 있다.
1 2 3 4 5 6 7 8 9 10
@RequestMapping("/members") publicclass{
@GetMapping public ResponseEntity<Member> getMember(@MemberSession Member member){ returnnew ResponseEntity<>(member, HttpStatus.OK); }
}
HandlerMethodArgumentResolver를 등록하기위해서는 아래의 HandlerMethodArgumentResolver 인터페이스를 구현해야한다.
그리고 실제 HandlerMethodArgumentResolver 구현에서는 컨트롤러 메소드 파라미터에 MemberSession이 존재하고, 해당 parameter type이 Member 클래스이면 “test” member를 리턴하게 하고 그 결과값을 Rest API로 받아 볼것이다.
이것은 예제지만 실제 세션정보를 불러온다거나 HTTP Request에 정보를 바탕으로 유저 객체를 만드는 로직을 넣을 수도 있다.