Spring65 스프링 핵심원리(심화) - 빈 후처리기(BeanPostProcessor) 이전 글에서는 프록시 팩토리를 이용해서 V1, V2 애플리케이션에 LogTrace 기능을 적용해봤다.그 과정에서 꽤 많은 문제가 해결됐다.인터페이스가 있으면 JDK 동적 프록시구체 클래스만 있으면 CGLIBAdvisor, Advice, Pointcut을 통해 어떤 기능을 어디에 적용할지도 명확하게 분리할 수 있었다여기까지 보면 꽤 깔끔해 보인다.그런데 막상 애플리케이션에 적용하려고 하면 또 다른 문제가 드러난다. 예를 들어 V1, V2 각각에 대해 프록시 설정 클래스를 따로 만들어야 했고,빈이 많아질수록 이런 설정 코드도 계속 늘어난다.게다가 컴포넌트 스캔을 사용하는 경우에는, 원본 객체가 이미 스프링 빈으로 등록된 뒤라서 지금까지의 방식으로는 프록시를 끼워 넣기가 쉽지 않다. 바로 이 지점에서 등장하는.. Spring/SpringCore - advance 2026. 3. 30. 스프링 핵심원리(심화) - 하나의 프록시, 여러 어드바이저 그리고 프록시 팩토리 적용 이전 글에서는 Advisor의 개념과 함께, 여러 어드바이저를 하나의 대상에 적용하려면 어떻게 해야 하는지 살펴봤다.가장 먼저 떠오르는 방법은 프록시를 여러 개 겹쳐서 만드는 방식이었다. 즉,target을 감싼 프록시를 하나 만들고그 프록시를 다시 또 다른 프록시로 감싸는 식으로여러 어드바이스를 순차적으로 적용하는 구조였다.이 방식 자체가 틀린 것은 아니지만,어드바이저가 늘어날수록 프록시도 계속 늘어나야 한다는 점에서 구조가 점점 복잡해진다.그렇다면 스프링은 이 문제를 어떻게 해결할까? 이번 글에서는 바로 그 다음 단계인하나의 프록시에 여러 어드바이저를 적용하는 방식을 먼저 보고,이어서 그 구조를 실제 애플리케이션에 적용하는 흐름까지 정리해보려고 한다. 하나의 프록시, 여러 어드바이저스프링은 여러 프록시.. Spring/SpringCore - advance 2026. 3. 26. 스프링 핵심원리( 심화 ) - 프록시 팩토리(ProxyFactory, Advisor, Advice , Pointcut) 이전 글에서는 스프링의 ProxyFactory를 사용하면JDK 동적 프록시와 CGLIB를 직접 구분해서 다루지 않아도 된다는 점을 정리했다.정리해보면 프록시 팩토리는 다음 문제를 꽤 깔끔하게 해결해줬다. 인터페이스가 있으면 JDK 동적 프록시 사용구체 클래스만 있으면 CGLIB 사용개발자는 구체 기술보다 Advice 중심으로 부가 기능을 작성하면 됨여기까지 보면 프록시를 적용하는 방식 자체는 꽤 편리해진다.그런데 여기서 또 다음 질문이 생긴다. 부가 기능은 알겠는데, 어디에 적용할지는 어떻게 정할까?모든 메서드에 다 적용하지 않고 특정 메서드에만 적용할 수는 없을까?그리고 Advice, Pointcut, Advisor는 서로 뭐가 다른 걸까?이번 글에서는 바로 이 부분을 정리해보려고 한다. Advisor.. Spring/SpringCore - advance 2026. 3. 25. 스프링 핵심원리( 심화 ) - 프록시 팩토리 앞에서 JDK 동적 프록시와 CGLIB를 각각 살펴봤다.JDK 동적 프록시는 인터페이스가 있을 때 사용할 수 있고, CGLIB는 구체 클래스를 기반으로 프록시를 만들 수 있다는 점도 확인했다. 그런데 마지막에 다음과 같은 의문으로 글을 마무리 하였다. 인터페이스가 있으면 JDK 동적 프록시를 쓰고인터페이스가 없으면 CGLIB를 써야 하는데 이걸 개발자가 매번 직접 구분해서 적용해야 할까? 그리고 부가 기능을 넣기 위해서도JDK 동적 프록시에서는 InvocationHandlerCGLIB에서는 MethodInterceptor를 따로 만들어야 했다.게다가 앞에서 해봤던 것처럼 특정 조건에만 프록시 로직을 적용하는 기능까지 넣으려면 코드가 점점 번거로워진다. 위와 같은 번거로움과 문제점을 해결해주는 스프링이 지.. Spring/SpringCore - advance 2026. 3. 23. 스프링 핵심원리( 심화 ) - 동적 프록시( CGLIB ) 이전 글에서 살펴본 것처럼 JDK 동적 프록시는 인터페이스가 필수이다.따라서 인터페이스가 존재하는 경우에는 JDK 동적 프록시를 사용할 수 있지만,인터페이스 없이 구체 클래스만 존재하는 경우에는 같은 방식으로 프록시를 적용할 수 없다.이 문제를 해결하기 위해 사용할 수 있는 기술이 바로 CGLIB이다. CGLIB란?CGLIB(Code Generator Library) 는 바이트코드를 조작해서 동적으로 클래스를 생성하는 기술을 제공하는 라이브러리이다.JDK 동적 프록시는 인터페이스를 구현해서 프록시를 만들지만,CGLIB는 구체 클래스를 상속해서 프록시를 생성한다.즉, CGLIB를 사용하면 인터페이스가 없어도 구체 클래스만 가지고 동적 프록시를 만들어낼 수 있다.( 원래 CGLIB는 외부 라이브러리였지만, .. Spring/SpringCore - advance 2026. 3. 17. 스프링 핵심원리( 심화 ) - 동적 프록시(JDK 동적 프록시 2) 이전 글에서는 JDK 동적 프록시가 무엇인지, 그리고 InvocationHandler를 이용해 공통 로직을 동적으로 적용할 수 있다는 점을 정리했다. 이번에는 실제 애플리케이션에 JDK 동적 프록시를 적용해보자.다만 JDK 동적 프록시는 인터페이스 기반으로 동작하기 때문에, 인터페이스가 존재하는 V1 애플리케이션에만 적용할 수 있다. JDK 동적 프록시 - 적용1먼저 LogTrace를 적용할 수 있는 InvocationHandler 구현체를 만들어보자.LogTraceBasicHandlerpackage hello.proxy.config.v2_dynamicproxy.handler;import hello.proxy.trace.TraceStatus;import hello.proxy.trace.logtrace.L.. Spring/SpringCore - advance 2026. 3. 17. 스프링 핵심원리( 심화 ) - 동적 프록시(JDK 동적 프록시 1) JDK 동적 프록시 및 CGLIB 기술을 활용하여, 프록시 기술을 적용하는 방법에 대해서 학습한 내용을 정리해보겠다. 지금부터 다루는 내용에 대해서 정리하자면, 프록시가 필요한 대상마다 직접적으로 각각의 프록시 클래스를 만드는 것이 아닌 하나의 프록시 객체를 통해 적용 대상에 필요한 부가적인기능을 일괄적으로 적용하는 것이다. JDK 동적 프록시 및 CGLIB 기술에 대해서 이해해보자. JDK 동적 프록시 JDK 동적 프록시는 JAVA가 기본적으로 제공해주는 기능이다.Interface를 기반에 두고 동적으로 프록시 객체를 런타임에 생성하며 필요한 실행 로직을 수행해주는 기술이다.( JDK 동적 프록시 기술을 사용하여면, Interface가 필수이다. ) 기본 예제 JDK 동적 프록시를 적용하기 위.. Spring/SpringCore - advance 2026. 3. 15. 스프링 핵심원리( 심화 ) - 동적 프록시(리플렉션) 지금까지 프록시를 통한 원본 코드에 대한 변경 없이 부가 기능을 적용하는 방법에 대해 알아보았다.처음 컨트롤러 - 서비스 - 레포지토리 각 계층 코드의 직접적인 변경을 요구하던 형태에서본 기능의 코드는 부가 기능으로 인하여 더렵혀지지 않는 방법까지 알아보았다.보다 유지보수에 수월한 형태와 방법을 적용한 것이다! 그러나 여전히 로그 추적기라는 부가 기능을 적용하기 위해서 각 계층의 대상 클래스에 모두 프록시 클래스나 인터페이스들을 만들어야하는 작업은 별도로 필요하다. 반복을 줄이기 위한 방법은 없을까?? 이에 대한 방법으로 자바는 기본적으로 JDK 동적 프록시 기술이나 CGLIB 같은 프록시 생성 오픈소스 기술을 활용하여 프록시 객체를 동적으로 만들어낼 수 있도록 제공한다. 그리고 이 JDK 동적 프록시 .. Spring/SpringCore - advance 2026. 1. 26. 스프링 핵심원리( 심화 ) - 구체클래스 기반 프록시 앞서 다룬 인터페이스의 기반의 프록시 뿐만 아니라, 구체클래스 기반의 프록시를 적용하는 방법에 대해 학습을 이어간다.상속을 통한 프록시 적용결론부터 말하자면, 인터페이스가 존재하지 않아도 '상속'을 통해 프록시 적용이 가능하다. 코드 예시를 통해 살펴보자. 상속을 통한 프록시 적용 예시 코드 프록시 적용 이전 예시먼저, ConcreteLogic이며, 인터페이스가 존재하지 않는 구체클래스이다.(ex, 서비스 로직)import lombok.extern.slf4j.Slf4j;@Slf4jpublic class ConcreteLogic { public String operation() { log.info("ConcreteLogic 실행"); return "data"; }} 그리고 이를 사용하는.. Spring/SpringCore - advance 2026. 1. 14. Spring 개발 환경 세팅하기(STS) - DB 연결 세팅하기 / JDBC 드라이버 / JDBC 의존성 / HikariCP 커넥션풀 설정 / properties 생성 및 설정 앞서 Spring 세팅에 있어, 스프링 컨테이너를 실행하고 ComponentScan을 통해 스프링 Bean 관리 하는 내용까지 살펴보았다. 이제 DataBase 연결과 관련한 세팅에 대해 다뤄보겠다. 단, DB 설치와 관련한 내용은 다루지 않으며 Oracle 11g XE가 설치된 상황을 전제로 설명한다. 먼저, Spring MVC 에서 Oracle 데이터베이스에 연결하기 위한 설정 방법을 단계별로 작성해보겠다.[ 사용환경 ]- Spring Framework 5.0.7- Java 11- Oracle 11g XE- HikariCP 4.0.3- Maven 프로젝트 , Oracle 데이터베이스와 통신하기 위해 필요한 드라이버 설치가 필요하다. 이를 위해선 드라이버를 직접 다운받아 설치하거나 혹은 pom... Spring/Spring(legacy) - MVC 2025. 12. 24. Spring 개발 환경 세팅하기(STS) - root-context.xml 설정을 통해 스프링 Bean 관리(ComponentScan), componentscan 사용 관련 xml 설정 내용 지금까지 스프링 legacy project 구성을 위한 기본적인 환경 설정을 다뤘다. 이제 스프링의 핵심 역할인 DI Container로의 기능을 살펴보고, ComponenScan을 활용한 사용법에 대해서 알아보자.DI Container로 스프링의 역할 및 기능을 살펴보기 위해앞서 구성했던, 프로젝트에 아래와 같이 sample 패키지에 클래스를 만들었다. 먼저, Computer.java의 코드이다. package sample;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component;import lombok.Getter;import lombok.Setter;@Com.. Spring/Spring(legacy) - MVC 2025. 12. 11. Spring 개발 환경 세팅하기(STS) - pom.xml / IDE JRE 라이브러리 설정(Java Build Path) / 스프링, 자바 버젼 변경하기 https://deeep-diver.tistory.com/146 Spring 프레임워크 개발 환경 세팅하기(STS) - 스프링 프로젝트 생성, 라이브러리(.m2 폴더), 프로젝앞서, [File - New - Spring Legacy Project] 메뉴를 이용하여 MVC 프로젝트를 구성했던 것처럼이클립스(STS), 인텔레제이(Ultimate Version) 와 같은 IDE를 사용하여 쉽게 프로젝트를 구성할 수 있다. 프로젝트를deeep-diver.tistory.com이전에 다룬 프로젝트 구조에서 pom.xml은 Maven 관련 환경 설정 파일이다. 구체적으로는 아래와 같은 내용을 설정하는 것이다. '내 프로젝트를 Maven이 어떤 Java 버전으로 컴파일하고, 어떤 라이브러리와 옵션으로 빌드할지' 를 정.. Spring/Spring(legacy) - MVC 2025. 12. 10. 이전 1 2 3 4 ··· 6 다음