목록BE (354)
오봉이와 함께하는 개발 블로그
스프링 핵심 원리 - 고급편 > 리플렉션이전 예제들을 보았을 때 로그 추적을 위한 프록시 클래스를 대상 클래스 수 만큼 만들어서 해결했다.그리고 프록시 코드는 거의 비슷한 형태의 코드의 반복이었다.자바가 기본적으로 제공하는 JDK 동적 프록시 기술이나, CGLIB 같은 프록시 생성 오픈소스 기술을 활용하면 프록시 객체를 동적으로 만들 수 있다.이로 인하여 프록시 클래스를 지금처럼 계속 찍어내지 않아도 된다. 프록시를 적용할 코드 하나만 생성하고 동적으로 주입하여 프록시를 찍어내기만 하면 된다.JDK 동적 프록시를 사용하기 위해서 먼저 리플렉션을 알아야 하니 리플렉션의 최소한을 알아보자.@Slf4jpublic class ReflectionTest { @Test void reflection0() { ..
스프링 핵심 원리 - 고급편 > 인터페이스 기반 프록시 vs 클래스 기반 프록시인터페이스가 없어도 클래스 기반으로 프록시를 생성할 수 있는 것을 확인했다.클래스 기반 프록시는 해당 클래스에만 적용할 수 있다.인터페이스 기반 프록시는 인터페이스만 같으면 모든 곳에 적용이 가능하다.클래스 기반 프록시는 상속을 사용하지 못하기 때문에 Java 기본 문법에 존재하는 몇 가지 제약이 존재한다.부모 클래스의 생성자를 호출해야 한다. (super(null))클래스에 final이 붙은 경우 상속이 불가능하다.메서드에 final이 붙은 경우 메서드 오버라이딩이 불가능하다.이렇게 보면 인터페이스를 사용한 프록시가 무조건 좋아 보이지만, 인터페이스를 생성이 강제되는 것 자체가 단점이 된다.인터페이스가 없다면 인터페이스 기반..
스프링 핵심 원리 - 고급편 > 구체 클래스 기반 프록시 적용실제 적용을 해보자.@RequiredArgsConstructorpublic class OrderRepositoryConcreteProxy extends OrderRepositoryV2 { private final OrderRepositoryV2 orderRepositoryV2; private final LogTrace logTrace; @Override public void save(String itemId) { TraceStatus status = null; try { status = logTrace.begin("orderRepositoryV2.save"); orderRepositoryV2.save(item..
스프링 핵심 원리 - 고급편 > 구체 클래스 기반 프록시이전 글에서 인터페이스 기반 코드에 프록시를 추가했다면, 이제는 구체 클래스에 프록시를 적용하자.@Slf4jpublic class ConcreteLogic { public String operation() { log.info("Concrete Login execute"); return "data"; }}위 ConcreteLogic 코드는 인터페이스를 기반으로 작성한 코드가 아닌, 그냥 순수한 클래스다.여기에 프록시를 도입하려면 어떻게 해야 좋을까?@RequiredArgsConstructorpublic class ConcreteClient { private final ConcreteLogic concreteLogic; public v..
스프링 핵심 원리 - 고급편 > 인터페이스 기반 프록시 적용인터페이스와 구현체가 있는 V1 버전에 지금까지 학습한 프록시 혹은 데코레이터(여기서는 부가 기능이기 때문에 데코레이터)를 도입하여 LogTrace를 사용해보자.이전 예시 코드들에서 보았듯, 프록시를 사용하면 기존 코드를 수정하지 않고 로그 추적 기능(부가 기능)을 도입할 수 있다.V1의 기본 클래스와 런타임시 의존 관계는 아래 그림과 같다.위 의존 관계를 바탕으로 로그 추적용 프록시를 추가하면 아래와 같은 의존 관계가 형성된다. (위 그림들에서 리포지토리는 생략)그렇다면 이제 해야할 것은 어플리케이션 실행 시 프록시를 사용하도록 의존 관계 설정이 필요하다.@RequiredArgsConstructorpublic class OrderReposito..