[F-Lab 챌린지 35일차] TIL : 토비의 스프링 6장 AOP

성수데브리·2023년 8월 1일
0

f-lab_java

목록 보기
27/73

토비의 스프링 6장 - AOP

학습 방향

  1. AOP의 필연적 등장배경
  2. 스프링이 도입한 이유
  3. 장점

테스트

  • 단위 테스트를 할 때는 테스트할 객체를 고립된 환경으로 만들어줘야 한다. 연관관계에 있는 객체가 외부 리소스에 의존하고 있는 상태라면 대역 객체로 대체해주면 된다.
  • 단위 테스트의 번거로운 점은 이 대역을 만드는 일이다. 그래서 이것을 대신해주는 여러 Mock 프레임워크가 있는 것이다.
  • Mockito 프레임워크

프록시 도입 배경

  • 비즈니스 로직에 트랜잭션 경계설정 코드 처럼 비즈니스 로직과 관련은 없지만 반드시 필요한 부가기능 코드를 분리하기 위한 방법
  • DI 를 활용하여 서비스 인터페이스를 두고 비즈니스 로직이 담긴 구현체, 부가기능을 역할을 하는 구현체를 만든다. 부가기능을 하는 구현체가 비즈니스 로직이 담긴 구현체를 참조하여 기능 호출을 대리하고 부가기능을 추가한다.
  • 프록시 : 클라이언트가 사용하려는 실제 대상인 것처럼 위장하는 객체를 프록시
  • 타깃, 실체 : 프록시를 통해 요청을 위임받아 처리하는 실제 오브젝트를 타깃이라 한다.

프록시

  • 프록시의 사용 목적에 따른 구분을 아우르는 것으로서 클라이언트와 사용 대상 사이의 대리 역할을 맡은 오브젝트를 두는 방법을 총칭
  • 사용 목적에 따른 구분
    1. 클라이언트가 타깃에 접근하는 방법 제어 (프록시 패턴)
    2. 타깃의 부가적인 기능 추가 (데코레이터 패턴)

다이나믹 프록시

  • 프록시의 장점은 타깃의 기능을 확장하거나 접근 방법을 제어할 수 있지만
    단점으로는
    1. 인터페이스를 구현하는 프록시 클래스를 매번 정의해야 하며 인터페이스 메서드 구현과 위임 코드도 전부 만들어줘야 한다.
    2. 부가기능 코드 중복

  • 다이나믹 프록시는 프록시 오브젝트를 구현할 때 단점을 보완해준다.

  • java.lang.reflect 패키지에 프록시처럼 동작하는 오브젝트를 다이나믹하게 생성해주는 기능을 제공하는 클래스들이 있다. → JDK 다이내믹 프록시

  • Proxy 클래스의 newProxyInstance() 를 사용하면 된다.

    • 다이나믹 프록시 오브젝트는 타깃의 인터페이스와 같은 타입으로 만들어 진다.
    • 인터페이스의 정보만 제공해주면 해당 인터페이스를 구현한 클래스의 오브젝트를 자동으로 만들어 준다.

    • newProxyInstance() 파라미터
      - loader : 동적으로 생성되는 다이나믹 클래스의 로딩에 사용할 클래스 로더
      - interfaces : 구현할 타깃의 인터페이스
      - h : 부가기능과 위임 코드를 담은 핸들러
    • InvocationHandler 인터페이스
      1. 다이나믹 프록시가 받는 모든 요청을 핸들러 invoke() 메서드로 보낸다.
      2. 핸들러에서 타깃 객체로 위임한다.
      3. ❗부가기능은 프록시 객체가 아닌 이 핸들러에 담는다❗

1개의 댓글

comment-user-thumbnail
2023년 8월 1일

감사합니다. 이런 정보를 나눠주셔서 좋아요.

답글 달기