반응형
제육's 휘발성 코딩
반응형
article thumbnail
스프링 프록시 정리 (2) - 프록시 팩토리, Advice, Advisor, Pointcut
🔷 Spring/Advanced 2023. 2. 19. 23:20

프록시 팩토리 프록시 팩토리란 스프링에서 동적 프록시를 통합해서 관리해주는 클래스 팩토리이다. 프록시 팩토리를 사용하면, 인터페이스가 있을 경우 JDK 동적 프록시를 사용하고, 구체 클래스만 있으면 CGLIB 동적 프록시를 사용하도록 처리해준다. client의 요청이 오면 대상 Target 클래스의 정보를 파악하여 동적 프록시를 선택하여 반환해준다. JDK 동적 프록시는 InvocationHandler, CGLIB 동적 프록시는 MethodInterceptor를 각각 구현해야 하는데, 스프링에선 Advice라는 개념을 통해 공통 구현을 할 수 있도록 지원한다. Advice 개발자가 Advice를 구현하게 되면 동적 프록시 별로 요청오는 핸들러의 정보를 받아 실제 타겟의 로직을 실행시켜 준다. 즉, Adv..

article thumbnail
스프링 프록시 정리 (1) - JDK 동적 프록시, CGLIB 동적 프록시
🔷 Spring/Advanced 2023. 2. 19. 17:24

프록시란? 프록시는 서버와 클라이언트 사이에서 통신을 대신해주는 역할을 하는 객체이다. 자바에서는 이 프록시를 통해서 JDK 동적 프록시와 CGLIB 프록시를 지원해서 프록시를 직접 생성하는 것이 아닌, 프록시 객체를 런타임 환경에서 자동으로 만들 수 있다. JDK 동적 프록시는 인터페이스의 구현체일 경우 생성되며, CGLIB 동적 프록시의 경우 인터페이스가 없는 구현체 클래스일 경우에 생성 된다. 스프링에서는 AOP 적용을 인터페이스 구현없이 할 수 있도록 기본 방식으로 CGLIB를 채택하여 사용하고 있다. (레거시는 JDK 동적 프록시 사용) JDK 동적 프록시와 CGLIB 프록시에 대해 알아보자. 프록시에 대한 개념은 하단의 포스팅을 참고하자. https://sasca37.tistory.com/27..

article thumbnail
[디자인패턴] 프록시 (프록시 패턴, 데코레이터 패턴) 정리
🔷 Spring/Advanced 2023. 2. 12. 15:31

프록시란? 프록시(Proxy)란 대리의 의미를 갖고 있으며 서버와 클라이언트 사이에서 통신을 대신 처리해주는 역할을 한다. 프록시는 객체안에서의 개념(디자인 패턴), 웹 서버에서의 개념 (포워드 프록시, 리버스 프록시) 등으로 사용되며 근본적인 역할은 같다. 객체안에서의 프록시에 대해서 알아보자. 프록시 객체 프록시 객체는 서버와 클라이언트 사이에서 크게 2가지의 역할을 수행하고 있다. GoF 디자인 패턴에는 이 둘을 의도(intent)에 따라 프록시 패턴, 데코레이터 패턴으로 구분한다. 접근 제어 (권한, 캐싱, 지연 로딩 등) -> 프록시 패턴 부가기능 (추가 기능 수행, 값을 변형, 로그 등) -> 데코레이터 패턴 클라이언트와 서버 (직접 호출) 네트워크에서 클라이언트와 서버는 관점에 따라 다양하게..

article thumbnail
[디자인 패턴] 템플릿 콜백 패턴
🔷 Spring/Advanced 2023. 2. 9. 00:01

템플릿 콜백 패턴 콜백(callback)이란 다른 코드의 인수로서 넘겨주는 실행 가능한 코드를 의미한다. 콜백을 넘겨받는 코드는 이 콜백을 필요에 따라 즉시 실행하거나 나중에 실행할 수 있다. (call - 호출은 되었고, back - 실행은 뒤에서) @Test void strategyV2() { ContextV2 context = new ContextV2(); context.execute(new Strategy() { @Override public void call() { log.info("비즈니스 로직1 실행"); } }); context.execute(new Strategy() { @Override public void call() { log.info("비즈니스 로직2 실행"); } }); } 전략..

article thumbnail
[디자인 패턴] 전략 패턴 - Strategy
🔷 Spring/Advanced 2023. 2. 8. 22:53

전략 패턴 이전 장에서 살펴본 템플릿 메서드 패턴은 상속을 받는다는 단점이 있다. 자식 클래스 입장에서는 부모 클래스의 기능을 전혀 사용하지 않는데, 부모 클래스를 알아야하는 단점이 있다. 템플릿 메서드 패턴과 비슷한 역할을 하면서, 상속의 단점을 제거한 디자인 패턴이 바로 전략패턴이다. 전략 패턴 - 시작 package hello.advanced.trace.strategy; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; @Slf4j public class ContextV1Test { @Test void strategyV0() { logic1(); logic2(); } private void logic1() { long star..

article thumbnail
[디자인패턴] 템플릿 메서드 패턴
🔷 Spring/Advanced 2023. 2. 7. 22:13

템플릿 메서드 패턴 템플릿 메서드 패턴은 핵심 기능과, 부가 기능을 분리하여 모듈화하는 디자인 패턴이다. 예제를 통해 템플리 메서드 패턴을 살펴보자. 이전 장에서 로그 추적기를 만들었다. 도입 전과 후의 코드를 비교해보자. 도입 전에는 핵심 기능만 남아 있는 반면, 도입 후에는 부가 기능이 훨씬 많고 복잡하다. 핵심 기능 vs 부가 기능 핵심 기능은 객체가 제공하는 고유의 기능이다. orderService는 주문이 핵심 기능이다. 부가 기능은 핵심 기능을 보조하기 위해 제공하는 기능이다. 예를 들면 로그, 트랜잭션 등을 들 수 있다. TemplateMethodTest @Slf4j public class TemplateMethodTest { @Test void templateMethodV0() { logi..

article thumbnail
[Advanced] 스프링 - 쓰레드 로컬
🔷 Spring/Advanced 2022. 6. 15. 20:38

쓰레드 로컬 이전 포스팅에서 로그 추적기에서 트랜잭션 ID 동기화를 위해 TraceId 를 파라미터로 넘기도록 구현했었다. 동기화는 정상 동작했지만, 모든 메서드에 파라미터를 추가해야하는 문제가 발생했다. 이번엔 프로토타입이 아닌 정식 버전으로 개발해보자. LogTrace package hello.advanced.trace.logtrace; import hello.advanced.trace.TraceStatus; public interface LogTrace { TraceStatus begin(String message); void end(TraceStatus status); void exception(TraceStatus status, Exception e); } 다양한 구현체로 변경할 수 있도록 인터..

article thumbnail
[Advanced] 스프링 로그 추적기 구현
🔷 Spring/Advanced 2022. 6. 15. 01:58

프로젝트 생성 https://start.spring.io/ 에서 다음과 같이 프로젝트를 생성하자. 상품을 주문하는 프로세스로 가정하고, Controller , Service, Repository로 이어지는 흐름을 단순하게 만들어보자. OrderRepositoryV0 package hello.advanced.app.v0; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; @Repository @RequiredArgsConstructor public class OrderRepositoryV0 { public void save(String itemId) { // 저장 로직 if (itemId.equal..

반응형
반응형