반응형
들어가기전에 핵심 기능과 부가 기능 어플리케이션 로직은 크게 핵심기능과 부가기능으로 나눌 수 있다. 핵심기능 객체가 제공하는 고유의 기능 예) 회원 등록 로직, 주문 로직 등 부가기능 핵심기능을 보조하는 기능 예) 로그 로직, 트랜젝션 로직, 보안 로직 보통 부가기능은 여러 곳에서 공통으로 사용되는 경우가 많다. 예를들어 모든 호출에서 로그를 남기는 경우, 보안을 강화하는 로직을 이용하는 경우 등이 있다. 이러한 부가 기능은 횡단 관심사 (cross-cutting concerns) 라고 한다. 이렇게 부가기능을 여러 클래스에 적용하려면 어떻게 해야할까? 클래스의 수 대로 모든 클래스에 동일한 코드를 추가하면 될까? 이는 매우 번거롭고 바람직하지 못하다. 만약, 로그 로직에 변경이 발생한다면 그 클래스 수..
빈 후처리기(BeanPostProcessor) 스프링이 빈 저장소에 등록할 목적으로 생성한 객체를 빈 저장소에 등록하기 직전에 조작하고 싶을때 이용한다. BeanPostProcessor 를 번역하면 빈 후처리기로 이름 그대로 빈 생성 후에 어떤 처리를 하는 용도로 사용한다. 객체를 조작할 수도 있고, 완전히 다른 객체로 바꿔치기 하는 것도 가능하다. 여기서 조작이라는 것은 해당 객체의 특정 메소드를 호출하는 것을 뜻한다. 일반적으로 스프링 컨테이너가 등록하는, 특히 컴포넌트 스캔의 대상이 되는 빈들은 중간에 조작할 방법이 없는데, 빈 후처리기를 사용하면 개발자가 등록하는 모든 빈을 중간에 조작할 수 있다. 즉 빈(Bean) 객체를 프록시로 교체하는 것도 가능하다는 의미이다. 프록시 팩토리 (ProxyFa..
1. 프록시 팩토리 (Proxy Factory) 프록시 생성에 있어 인터페이스 유무에 따라 적용되는 기술이 다르다. 그 때문에 각 기술에 맞춰 InvocationHandler 와 MethodInterceptor 를 중복으로 만들어야 하는가? 하는 문제가 있다. 같은 코드일텐데 공통으로 사용할 수는 없을까? JDK 동적 프록시 (링크) 인터페이스와 구현 클래스가 있는 경우 InvocationHandler 사용 CGLIB (링크) 구체 클래스만 존재하는 경우 MethodInterceptor 사용 스프링은 이렇게 유사한 기술이 있을 때 통합해서 일관성있게, 편리하게 사용할 수 있도록 추상화된 기술을 제공한다. 스프링은 동적 프록시를 통합해서 편리하게 만들어주는 프록시 팩토리 (ProxyFactory) 기능을 ..
1. CGLIB 란? Code Generator Library 의 약자로, 클래스의 바이트 코드를 조작하여 프록시 객체를 생성해 주는 라이브러리이다. CGLIB 를 사용하면 인터페이스가 없어도 구체 클래스만으로 동적 프록시를 만들수 있다. 외부 라이브러리이지만, 스프링 프레임워크의 내부에 포함되어 있다. 따라서 스프링을 사용하면 별도로 라이브러리를 추가하지 않아도 사용할 수 있다. 직접 CGLIB 를 다루는 일은 거의 없지만, 개념을 정리한다. 2. 예제코드 인터페이스 없이 구체 클래스에 정의된 업무 로직의 실행 시간을 출력하는 부가기능을 추가한다. 구체 클래스만 있는 경우 : ConcreteService /** 구체 클래스만 있는 경우 */ @Slf4j public class ConcreteServic..