FrameWork/Spring&Spring-boot
-
Spring Core - 동적 프록시 (리플렉션)FrameWork/Spring&Spring-boot 2024. 3. 12. 14:20
동적 프록시 - 리플렉션 지금까지 프록시를 사용해서 기존 코드를 변경하지 않고, 로그 추적기라는 부가 기능을 적용할 수 있었다. 그런데 문제는 대상 클래스 수 만큼 추적을 위한 프록시 클래스를 만들어야 한다는 점이다. 자바가 기본으로 제공하는 JDK 동적 프록시 기술이나 CGLIB 같은 프록시 생성 오픈소스 기술을 활용하면 프록시 객체를 동적으로 만들어낼 수 있다. 쉽게 이야기해서 프록시 클래스를 이전의 예시에서 처럼 계속 만들지 않아도 된다는 것이다. 프록시를 적용할 코드를 하나만 만들어두고 동적 프록시 기술을 사용해서 프록시 객체를 찍어 낼 수 있다. JDK 동적 프록시를 이해하기 위해서는 먼저 자바의 리플렉션 기술을 이해해야 한다. 리플렉션 기술을 사용하면 클래스나 메서드의 메타정보를 동적으로 획득..
-
Spring Core - 구체 클래스 기반 프록시(예제1, 예제2,적용)FrameWork/Spring&Spring-boot 2024. 3. 12. 12:45
구체 클래스 기반 프록시 - 예제1 이번에는 구체 클래스에 프록시를 적용하는 방법을 학습해보자 다음 보이는 ConcreteLogic은 인터페이스가 없고 구체클래스만 있다. 이렇게 인터페이스가 없어도 프록시를 적용할 수 있을까? 먼저 프록시를 도이바기 전에 기본 코드를 작성해보자. ConcreteLogic package com.core.springproxy.pureproxy.concreteproxy.code; import lombok.extern.slf4j.Slf4j; @Slf4j public class ConcreteLogic { public String operation(){ log.info("ConcreteLogic 실행"); return "data"; } } ConcreateLoic은 인터페이스가 ..
-
Spring Core - 인터페이스 기반 프록시(V1)FrameWork/Spring&Spring-boot 2024. 3. 11. 15:28
인터페이스 기반 프록시 - 적용 인터페이스와 구현체가 있는 V1 App에 앞서 학습한 프록시를 도입해서 LogTrace를 사용해보자. 프록시를 사용하면 기존 코드를 전혀 수정하지 않고 로그 추적 기능을 도입할 수 있다. V1의 App의 기본 클래스 의존 관계와 런타임시 객체 인스턴스 의존 관계는 다음과 같다. V1 기본 클래스 의존 관계 V1 런타임 객체 의존 관계 여기에 로그 추적용 프록시를 추가하면 다음과 같다. V1 프록시 의존 관계 추가 Controller , Service , Repository 각각 인터페이스에 맞는 프록시 구현체를 추가한다.(그림에서 Repository는 생략되었다.) V1프록시 런타임 객체 의존 관계 그리고 애플리케이션 실행 시점에 프록시를 사용하도록 의존 관계를 설정해주어..
-
Spring Core - 데코레이터 패턴 (예제1, 예제2, 예제3)FrameWork/Spring&Spring-boot 2024. 3. 11. 12:23
데코레이터 패턴 - 예제 코드1 Component 인터페이스 public interface Component { String operation(); } Component 인터페이스는 단순히 String operation()메서드를 가진다. RealComponent package com.core.springproxy.pureproxy.decorator.code; import lombok.extern.slf4j.Slf4j; @Slf4j public class RealComponent implements Component{ @Override public String operation() { log.info("RealComponent 실행"); return "data"; } } RealComponent는 Com..
-
Spring Core - 프록시 패턴(예제1,예제2,Cache Proxy)FrameWork/Spring&Spring-boot 2024. 3. 8. 13:43
프록시 패턴 - 예제 코드1 테스트 코드에 Lombok 적용하기 테스트코드에 Lombok을 사용하려면 build.gradle에 테스트 lombok을 사용할 수 있도록 의존관계를 추가 해야 한다. build.gradle에 추가 dependencies { //테스트에서 lombok 사용 testCompileOnly 'org.projectlombok:lombok' testAnnotationProcessor 'org.projectlombok:lombok' } 이렇게 해야 테스트코드에서 @Slfj4 같은 애노테이션이 작동한다. 프록시 패턴 - 예제 코드 작성 프록시 패턴을 이해하기 위해 예제 코드를 작성해보자. 먼저 프록시 패턴을 도입하기 전 코드를 아주 단순하게 만들어 보자 Subject public inter..
-
Spring Core - 프록시 패턴, 데코레이터 패턴 - 소개(요구사항 추가)FrameWork/Spring&Spring-boot 2024. 3. 8. 12:10
요구사항 추가 지금까지 로그 추적기를 만들어서 기존 요구사항을 모두 만족했다. 기존 요구사항 모든 PUBLIC 메서드의 호출과 응답 정보를 로그로 출력 애플리케이션의 흐름을 변경하면 안된다. (로그를 남긴다고 해서 비지니스 로직의 동작에 영향을 주면 안된다.) 메서드 호출에 걸린 시간 정상 흐름과 예외 흐름 구분 예외 발생시 예외 정보가 남아야 한다. 메서드 호출의 깊이 표현 HTTP 요청을 구분 HTTP 요청 단위로 특정 ID를 남겨서 어떤 HTTP 요청에서 시작된 것인지 명확하게 구분이 가능해야한다. 트랜잭션 ID(DB 트랜잭션 X), 이때 의 트랜잭션으 HTTP요청이 시작해서 끝날 때 까지를 하나의 트랜잭션이라고 한다. 하지만 하지만 이 요구사항을 만족하기 위해서 기존 코드를 많이 수정해야 한다. ..
-
Spring Core - 프록시 패턴(예제 프로젝트)FrameWork/Spring&Spring-boot 2024. 3. 8. 11:02
프록시패턴 - 예제 프로젝트 다양한 상황에서 프록시 사용법을 이해하기 위해 다음과 같은 기준으로 기본 예제 프로젝트를 만들어보자 예제는 크게 3가지 상황으로 만든다. v1 - 인터페이스와 구현 클래스 - 스프링 빈으로 수동 등록 v2 - 인터페이스 없는 구체 클래스 - 스프링 빈으로 수동 등록 v3 - 컴포넌트 스캔으로 스프링 빈 자동 등록 실무에서는 스프링 빈으로 등록할 클래스는 인터페이스가 있는 경우도 있고 없는 경우도 있다. 그리고 스프링 빈을 수동으로 직접 등록 하는 경우도 있고, 컴포넌트 스캔으로 자동으로 등록하는 경우도 있다. 이러한 다양한 케이스에 프록시를 어떻게 적용하는지 알아보기 위해 다양한 예제를 준비해보자. 예제 프로젝트 만들기 v1 v1 - 인터페이스와 구현 클래스 - 스프링 빈으로..
-
Spring Core - 템플릿 콜백 패턴(시작, 적용, 정리)FrameWork/Spring&Spring-boot 2024. 3. 7. 13:41
템플릿 콜백 패턴 - 시작 ContextV2는 변하지 않는 템플릿 역할을 한다. 그리고 변하는 부분은 파라미터로 넘어온 Strategy의 코드를 실행해서 처리한다. 이렇게 다른 코드의 파라미터로서 넘겨주는 실행 가능한 코드를 콜백(callback)이라 한다. 💡tip) 콜백 정의 프로그래밍에서 콜백(callback)또는 콜애프터 함수(call-after-function)는 다른 코드의 파라미터로서 넘겨주는 실행 가능한 코드를 말한다. 콜백을 넘겨받는 코드는이 콜백을 필요에 따라 즉시 실행할 수도 있고, 아니면 나중에 실행 할 수도 있다. 쉽게 이야기해서 callback은 코드가 호출(call)은 되는데 코드를 넘겨준 곳의 뒤(back)에서 실행 된다는 뜻이다. ContextV2 예제에서 콜백은 Strat..