프록시란? 프록시는 서버와 클라이언트 사이에서 통신을 대신해주는 역할을 하는 객체이다. 자바에서는 이 프록시를 통해서 JDK 동적 프록시와 CGLIB 프록시를 지원해서 프록시를 직접 생성하는 것이 아닌, 프록시 객체를 런타임 환경에서 자동으로 만들 수 있다. JDK 동적 프록시는 인터페이스의 구현체일 경우 생성되며, CGLIB 동적 프록시의 경우 인터페이스가 없는 구현체 클래스일 경우에 생성 된다. 스프링에서는 AOP 적용을 인터페이스 구현없이 할 수 있도록 기본 방식으로 CGLIB를 채택하여 사용하고 있다. (레거시는 JDK 동적 프록시 사용) JDK 동적 프록시와 CGLIB 프록시에 대해 알아보자. 프록시에 대한 개념은 하단의 포스팅을 참고하자. https://sasca37.tistory.com/27..
프록시란? 프록시(Proxy)란 대리의 의미를 갖고 있으며 서버와 클라이언트 사이에서 통신을 대신 처리해주는 역할을 한다. 프록시는 객체안에서의 개념(디자인 패턴), 웹 서버에서의 개념 (포워드 프록시, 리버스 프록시) 등으로 사용되며 근본적인 역할은 같다. 객체안에서의 프록시에 대해서 알아보자. 프록시 객체 프록시 객체는 서버와 클라이언트 사이에서 크게 2가지의 역할을 수행하고 있다. GoF 디자인 패턴에는 이 둘을 의도(intent)에 따라 프록시 패턴, 데코레이터 패턴으로 구분한다. 접근 제어 (권한, 캐싱, 지연 로딩 등) -> 프록시 패턴 부가기능 (추가 기능 수행, 값을 변형, 로그 등) -> 데코레이터 패턴 클라이언트와 서버 (직접 호출) 네트워크에서 클라이언트와 서버는 관점에 따라 다양하게..
템플릿 콜백 패턴 콜백(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 실행"); } }); } 전략..
전략 패턴 이전 장에서 살펴본 템플릿 메서드 패턴은 상속을 받는다는 단점이 있다. 자식 클래스 입장에서는 부모 클래스의 기능을 전혀 사용하지 않는데, 부모 클래스를 알아야하는 단점이 있다. 템플릿 메서드 패턴과 비슷한 역할을 하면서, 상속의 단점을 제거한 디자인 패턴이 바로 전략패턴이다. 전략 패턴 - 시작 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..
템플릿 메서드 패턴 템플릿 메서드 패턴은 핵심 기능과, 부가 기능을 분리하여 모듈화하는 디자인 패턴이다. 예제를 통해 템플리 메서드 패턴을 살펴보자. 이전 장에서 로그 추적기를 만들었다. 도입 전과 후의 코드를 비교해보자. 도입 전에는 핵심 기능만 남아 있는 반면, 도입 후에는 부가 기능이 훨씬 많고 복잡하다. 핵심 기능 vs 부가 기능 핵심 기능은 객체가 제공하는 고유의 기능이다. orderService는 주문이 핵심 기능이다. 부가 기능은 핵심 기능을 보조하기 위해 제공하는 기능이다. 예를 들면 로그, 트랜잭션 등을 들 수 있다. TemplateMethodTest @Slf4j public class TemplateMethodTest { @Test void templateMethodV0() { logi..
RestTemplate 이란? RestTemplate은 스프링 3.0 버전부터 지원하는 라이브러리로, REST 방식의 API를 요청하고 json, xml, String 등 응답받을 수 있다. Spring 5부턴 WebFlux와 함께 WebClient를 도입하여 동기식 방식 및 비동기 접근을 지원하고 있다. RestTemplate 동작 과정 RestTemplate restTemplate = new RestTemplate(); 애플리케이션에서 Http Rest API 요청을 위한 RestTemplate을 생성한다. private final List
@Transactional 란? @Transactional 어노테이션은 스프링에서 많이 사용되는 선언적 트랜잭션 방식이다. 해당 어노테이션은 getConnection(), setAutoCommit(false), 예외 발생 시 롤백, 정상 종료 시 커밋 등의 필요한 코드를 삽입해준다. @Transactional 사용 방법 레거시 스프링에선 해당 어노테이션을 사용하기 위해선 PlatformTransactionManager 와 어노테이션 활성화 설정이 필요하다. 스프링 부트에선 @EnableTransactionManagement 설정이 되어 있어서 자동으로 사용할 수 있으며 입맛에 맞게 클래스 또는 메서드에 @Transactional 어노테이션을 적용하면 된다. PlatformTransactionManager..
Spring Cloud Gateway Filter 적용 Spring Cloud Gateway는 다음과 같이 마이크로서비스들과 클라이언트단의 라우팅 역할을 해준다. 이때 Filter 기능을 통해 조건을 분기한다. 사전에 정의하는 PreFilter 와 사후에 정의하는 PostFilter가 있다. Filter 정의는 Java 코드 상에서 사용하거나, Property에 정의할 수 있다. 동작 과정 동작 흐름은 다음과 같이 이루어진다. 최초의 Request시에 Request-Header에 서비스명을 넣어 로직을 처리해주고, 마지막 Response 시에도 마찬가지로 Response-Header에 서비스명을 넣어 요청에 맞는 클라이언트에게 반환주는 방식이다. 공식문서에는 다음과 같이 정의되어 있다. 필터를 통해 Pr..