분류 전체보기
-
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..
-
Spring Core - 전략 패턴(시작, 예제1, 예제2)FrameWork/Spring&Spring-boot 2024. 3. 7. 10:34
전략 패턴 - 시작 ContextV1Test package com.spring.core.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 startTime = System.currentTimeMillis(); //비지니스 로직 실행 log.info("비지니스 로직1 실행"); //비지니스 로직 종료 long endTime = System.currentTimeMillis(); long resultTime = e..
-
Spring Core - 템플릿 메서드 패턴(예제3, 적용1, 적용2)FrameWork/Spring&Spring-boot 2024. 3. 6. 14:04
템플릿 메서드 패턴 - 예제3 익명 내부 클래스 사용하기 템플릿 메서드 패턴은 SubClassLogic1, SubClassLogic2 처럼 클래스를 계속 만들어야 하는 단점이 잇다. 익명 내부 클래스를 사용하면 이런 단점을 보완할 수 있다. 익명 내부 클래스를 사용하면 객체 인스턴스를 생성하면서 동시에 생성할 클래스를 상속 받은 자식 클래스를 정의할 수 있다. 이 클래스는 SubClassLogic1 처럼 직접 지정하는 이름이 없고 클래스 내부에 선언되는 클래스여서 익명 내부클래스라 한다. /** * 템플릿 메서드 패턴, 익명 내부 클래스 사용 */ @Test void templateMethodV2(){ //익명내부 클래스로 // 객체를 생성하는 동시에 구현할 수 있다. //즉 추상 클래스를 상속 받은 클..
-
Spring Core - 템플릿 메서드 패턴(시작, 예제1, 예제2, 정의)FrameWork/Spring&Spring-boot 2024. 3. 6. 10:38
템플릿 메서드 패턴 - 시작 로그 추적기 도입 전 - V0코드 //OrderControllerV0 코드 @GetMapping("/v0/order") public String createOrder(String itemId){ orderService.orderItem(itemId); return "ok"; } //OrderServiceV0 코드 public void orderItem(String itemId){ orderRepository.save(itemId); } 로그 추적기 도입 후 - V3코드 //OrderControllerV3코드 @GetMapping("/v3/order") public String createOrder(String itemId){ TraceStatus status = null; t..