스프링 4

스프링 고급편 - 스프링 AOP 구현

✔️ 구현@Slf4j@Aspectpublic class AspectV1 { @Around("execution(* hello.aop.order..*(..))") public Object doLog(ProceedingJoinPoint joinPoint) throws Throwable { log.info("[log] {}", joinPoint.getSignature()); return joinPoint.proceed(); }}AspectV1을 만든다. @Around : 포인트 컷 부분에 해당* 모든 타입, hello.aop.order 패키지와 그 하위 패키지(..)를 지정 // 자세한건 다음 포스트에서 설명@Around가 달린 메서드 doLog는 어드바이스가 된다.  ..

스프링 고급편 - 빈 후처리기

✔️ 빈 후처리기 - BeanPostProcessor스프링이 빈 저장소에 등록할 목적으로 생성한 객체를 빈 저장소에 등록하기 직전에조작이 가능하다.한 마디로 빈 생성후무언가 처리하는 용도이다.  이를 사용하면 컴포넌트 스캔 대상들도 프록시로 등록할 수 있게 된다.      BeanPostProcessor 인터페이스 - 스프링 제공public interface BeanPostProcessor { Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException Object postProcessAfterInitialization(Object bean, String beanName) throws Bean..

스프링 고급편 - 동적 프록시 기술

핵심 내용만 정리하고  자세한 구현 코드는 올리지 않는다. 스프링 부트 3.3.3 버전 기준 ✔️ 리플렉션 이전까지 프록시를 사용해 로그 추적기 부가 기능을 적용했지만 대상 클래스만큼 프록시 클래스를 만들어야 한다는 단점이 있다.따라서 자바의 기본 제공 기술인 JDK 동적 프록시, CGLIB 같은 프록시 생성 오픈소스 기술을 활용하면 프록시 객체를 동적으로 만들어 낼 수 있다. 하지만 JDK 동적 프록시 생성을 이해하려면 리플렉션을 알아야한다. 리플렉션은 한다미로 메타 데이터 이다. void reflection1() throws Exception { //클래스 정보 Class classHello = Class.forName("hello.proxy.jdkdynamic.ReflectionTest$Hell..

스프링 고급편 - 템플릿 메서드 패턴과 콜백 패턴

✔️ 템플릿 메서드 패턴이전에 만들었던 로그 추적기를 더 향상시켜보자 템플릿 메서드 패턴은 변하지 않는 부분과 변하는 부분을 분리해서 변하지않는 부분을 템플릿(기본 틀)로 정의하고, 변하는 부분은 하위 클래스에서 정의하는 패턴이다.  로그 추적기의 변하지 않는 부분TraceStatus status = null;try { status = trace.begin("message"); //핵심 기능 호출 trace.end(status);} catch (Exception e) { trace.exception(status, e); throw e;}이 부분을 템플릿으로 정의한다. 추상 템플릿 클래스public abstract class AbstractTemplate { private final LogTrace ..