날아라쩡글이의 블로그입니다.

@어노테이션만들기 ArgumentResolve 본문

중앙 HTA (2106기) story/spring java framwork story

@어노테이션만들기 ArgumentResolve

날아라쩡글이 2022. 1. 10. 14:07
반응형

지금까지 코딩의 모습을 보면 

@GetMapping("/add.do")
public ResponseDto<?> add,int bookNo) {
User user = (User)(SessionUtils.getAttribute("LOGIN_USER"));
if(user == null) {
throw new CartErrorException("장바구니 아이템 추가는 로그인 후 가능합니다");
}
}
이렇게 User의 객체를 SessionUtils에서 뽑아서 확인하는 방법을 이용했다. 
그러나 이런 반복적인 업무를 이제는 spring의 어노테이션으로 등록하여, SessionUtils의 User을 생성하게 만들고 객체의 획득을 이용해서 사용하고, 제공받길 원한다. 

그것을 AgumentResolve를 이용하여 획득하는 것이다. 

public class CartController{
@GetMapping("/add.do")
public ResponseDto add,int bookNo) {
User user = (User)(SessionUtils.getAttribute("LOGIN_USER"));
if(user == null) {
throw new CartErrorException("장바구니 아이템 추가는 로그인 후 가능합니다");
}
}
@GetMapping("/delete.do")
public ResponseDto<?> delete(int no) {//아무거나 와도 상관없다 <?>
//SessionUtil를 사용해서 세션객체에 저장된 인증된 사용자 정보를 조회한다.
User user = (User)(SessionUtils.getAttribute("LOGIN_USER"));
if(user == null) {
throw new CartErrorException("장바구니 아이템 삭제는 로그인 후 가능합니다");
}
}
이런 반복적인 업무를 하는 것은 좋지 않다. 그러나  spring은 매개변수에 작성이 되어 있다면 새로운 User라는 객체에 매개변수를 만들어서 객체를 담아 둔다.우리는 새로운 User생성을 원치 않아 Session에 저장된 객체를 전달해줘라는 의미로 @LoginedUser을 붙여서 User user라고 작성해줄 것이다. 
public ResponseDto<?> add(@LoginedUser User user,int bookNo);
public ResponseDto<?> delete(@LoginedUser User user, int no); 
이렇게 작성을 해주면 HandlerAgumentResolver가 어노테이션을 찾아서 넣어준다. 

사용 방법

  • 사용할 어노테이션의 이름의 어노테이션 클래스를 생성한다. 
    • @interface 가 붙여져있으면 어노테이션 클래스가 된다. 
    • public @interface LoginedUser {
      }
    • 어노테이션의 적용대상과 유지대상을 붙여야 사용할 수 있다.
    • 2021.12.29 - [중앙 HTA (2106기) story/spring java framwork story] - 어노테이션 설정하기 
      • 내용이 없다면 그냥 null값이 들어가게된다. 
    • @Target(ElementType.PARAMETER)
      • 메소드나 생성자의 매개변수에 부착할 수 있는 어노테이션임을 나타낸다.
      • 엘리먼트타입으로 매개변수에 부착할 수 있다는 의미이다.
    • @Retention(RetentionPolicy.RUNTIME)
      •  해당하는 어노테이션이 프로그램 실행시점까지 유지됨을 나타낸다.
  • LoginUserArgumentResolver 클래스를 만든다. HandlerMethodArgumentResolver를 implements한다. 
    <요청 핸들러 메소드의 매개변수를 분석해서 해당 매개변수에 적절한 값을 전달하는 객체이다. >
    • 값을 전달할 수 있는 핸들러 클래스를 만들고, handlerMethodArgumentResolver를 구현한다. 
    • 메소드 재정의 한다. 
      • 주요 API
      •  boolean supportsParameter(MethodParameter parameter)
        • 이 메소드가 true를 반환하면 resolveArgument()메소드가 실행된다. 
        • 사용자가 지정한 매개변수에 대해서 true를 반환하도록 수행문을 작성해야한다. 
        • 사용자 정의 HandlerMethodArgumentResolver의 적용대상 매개변수인지 true/false값으로 반환한다. 
        • 즉, @LoginUser가 붙여져 있다면 true 없다면 false를 출력한다. 모든 매개변수를 확인하여 출력하는 것이다. 
        • return parameter.hasParameterAnnotation(LoginedUser.class);
          • 파라미터가 hasparameter 해당 어노테이션이 있는지 반환하는 것이다. 
        • 그냥 일반 매개변수
          • (String, Criteria, Model)
            10:45:19  INFO [c.s.a.LoginedUserArgumentResolver] @LoginedUser 어노테이션을 가지고 있는가? false
            10:45:19  INFO [c.s.a.LoginedUserArgumentResolver] 매개변수의 클래스 이름 : criteria
            10:45:19  INFO [c.s.a.LoginedUserArgumentResolver] 매개변수의 이름 : java.lang.Class
            String 과 Model은 만들어서 criteria만 만든다
        • 해당 매개변수 (int book과 @LoginUser를 비교시 )
          • 10:46:23  INFO [c.s.a.LoginedUserArgumentResolver] @LoginedUser 어노테이션을 가지고 있는가? true
            10:46:23  INFO [c.s.a.LoginedUserArgumentResolver] 매개변수의 클래스 이름 : user
            10:46:23  INFO [c.s.a.LoginedUserArgumentResolver] 매개변수의 이름 : java.lang.Class
          • 10:46:23  INFO [c.s.a.LoginedUserArgumentResolver] @LoginedUser 어노테이션을 가지고 있는가? false
            10:46:23  INFO [c.s.a.LoginedUserArgumentResolver] 매개변수의 클래스 이름 : bookNo
            10:46:23  INFO [c.s.a.LoginedUserArgumentResolver] 매개변수의 이름 : java.lang.Class
        • static final Logger logger = LogManager.getLogger(LoginedUserArgumentResolver.class);//로고를 가져온다.
        • 로고를 이용하여 확인할 수 있다. 
          • import org.apache.logging.log4j.LogManager;
            import org.apache.logging.log4j.Logger; -- 이 Logger와 Logmanger를 사용해야한다.
      •  Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
         NativeWebRequest webRequest, WebDataBinderFactory binderFactory)
        • supportsParameter()메소드가 true를 반환할 때만 실행된다. 
        • 이 메소드가 반환하는 값이 요청핸들러 메소드의 매개변수에 전달된다.
        • 요청 핸들러 메소드의 요청파라미터에 적절한 값을 반환한다.
        • return SessionUtils.getAttribute("LOGIN_USER");
          • return값은 Session으로 보내서, 위의 어노테이션에 해당하면 true로 넘어와서 로그인된 사용자 정보를 보낼 수 있다. 
          • HttpSession객체에 "LOGIN_USER"라는 속성명으로 저장된 사용자 정보를 반환한다. 
    • spring에게 만들었다는 사실을 전달해준다. 
      • context-web.xml로 간다. 
      • mvc:view설정아래에 
        • mvc:annotation을 입력한다. 
        • 그사이에 mvc:argument를 적는다. 
        • 그리고 그 사이에 bean을 작성하고 해당 LoginUserArgumentResolver를 입력한다. 
        • <mvc:annotation-driven>
          <mvc:argument-resolvers>
          <bean class="com.sample.argumentResolver.LoginedUserArgumentResolver"></bean>
          </mvc:argument-resolvers>
          </mvc:annotation-driven>
      • logger파일로 확인 할 수 있다. 
      • 인터셉터를 연결하여 자동으로 로그인 정보를 확인 할 수 있다. 
        그렇게 사용하면 인터셉터의 전처리 작업으로 인하여, 로그인 객체 @LoginUser User user 객체에는 null값이 들어가 있지 않다. 
반응형
Comments