본문 바로가기

반응형

전체 글

[Spring] 빈 후처리기 - BeanPostProcessor 빈 후처리기 - 객체를 빈 컨테이너에 등록하기 전에 등록할 객체를 조작 또는 바꿀 수 있다. 순서 - 빈 대상의 객체를 생성 -> 해당 객체를 빈 후처리기에 전달 -> 빈 후처리기 작업 -> 작업 된 객체를 빈 컨테이너에 등록 스프링의 BeanPostProcessor 인터페이스의 구현체에서 postProcessBeforeInitialization 또는 postProcessAfterInitialization 메소드를 상속받아 후처리 작업 코드 작성 * 빈으로 등록될 객체는 스프링에서 기본적으로 생성되는 객체도 많이때문에 직접 작업할 객체를 필터링 해줘야함. 더보기
[Spring] 프록시 팩토리 프록시 팩토리 jdk 동적 프록시, cglib 를 통합 추상화하여 스프링에서 제공해주는 라이브러리 인터페이스가 있는 경우에는 jdk 동적 프록시를 사용하고, 구체 클래스가 있을경우에는 CGLIB를 사용해준다. * CGLIB 만 사용하도록 설정 가능 프록시 팩토리의 'Advice' 를 통해 두개의 상황을 구분하지 않고 'Advice' 를 만들어주기만 하면 된다. * 프록시 팩토리 내부에서 InvocationHandler 와 MethodInterceptor 를 내부에서 사용 어드바이저, 어드바이스, 포인트컷 어드바이스 - 프록시가 호출하는 부가 기능. 프록시 로직 org.aopalliance.intercept.MethodInterceptor // 인터페이스 구현 포인트컷 - 부가 기능을 적용할지, 적용하지 .. 더보기
[Spring] 프록시 패턴 프록시 - 클라이언트가 요청한 결과를 서버에 직접 요청하는것이 아니라 어떤 대리자를 통해 대신 간접적으로 서버에 요청할 수 있다. 여기서 대리자를 프록시 라고 한다. 프록시의 주요 기능 접근 제어, 캐싱 권한에 따른 접근 차단 캐싱 지연 로딩 부가 기능 추가 원래 서바가 제공하는 기능에 더해서 부가 기능을 수행 (ex - 요청 값 / 응답 값을 중간에 변형, 로그) 프록시 체인 * 클라이언트는 서버에게 요청 한 것인지, 프록시에게 요청 한 것인지 몰라야한다. * 서버와 프록시는 같은 인터페이스를 사용 -> 클라이언트가 사용하는 서버 객체를 프록시 객체로 변경해도 클라이언트 코드를 변경하지 않고 동작할 수 있어야 한다. (DI 사용) 프록시 패턴 - 접근 제어가 목적 데코레이터 패턴 - 새로운 부가 기능 .. 더보기
[Spring] 전략 패턴 GOF 디자인 패턴에서 정의한 전략 패턴의 의도 알고리즘 제품군을 정의하고 각각을 캡슐화하여 상호 교환 가능하게 만들자. 전략을 사용하면 알고리즘을 사용하는 클라이언트와 독립적으로 알고리즘을 변경할 수 있다. 전략 패턴은 변하지 않는 로직(부가 기능)을 Context라는 곳에 두고, 변하는 부분(핵심 기능)을 Strategy 라는 인터페이스를 만들고 해당 인터페이스를 구현하도록 하여 문제를 해결한다. -> 상속이 아닌 위임으로 템플릿 메서드 패던의 문제 해결 Context - 변하지 않는 템플릿 역할 Strategy - 변하는 알고리즘 // 템플릿 역할을 할 Context.class class Context{ fun template(strategy: Strategy){ //부가 기능 strategy.lo.. 더보기
[Spring] 템플릿 메서드 패턴 코드에는 크게 핵심기능과 부가기능으로 구분된다. 핵심 기능은 해당 객체가 제공하는 고유의 기능이다. 예를들어 주문 요청에 대해서는 주문이 핵심 기능이 된다. 부가 기능은 핵심 기능을 보조하기 위해 제공되는 기능이다. 예를 들어 주문 요청에 대해 로그를 남기는 로직, 데이터를 저장하기 위한 트랜잭션 기능이 있다. 부가 기능은 단독으로 사용되지 않고, 핵심 기능과 함께 사용된다. 핵심 기능 부분은 주로 변하고, 부가 기능 부분은 변하지 않는 부분이다. 이를 분리하여 설계하는것이 좋은 설계라고 할 수 있다. 템플릿 메서드 패턴은 이러한 문제를 해결할 수 있는 디자인 패턴이다. 추상 클래스를 이용한 템플릿 메서드 패턴 적용 // 템플릿 메서드 패턴을 적용해줄 추상 클래스 abstract class Abstrac.. 더보기
[Spring] 동시성 문제 + 해결 방법 (쓰레드 로컬) 동시성 문제 스프링에서 빈으로 등록된 객체를 여러 쓰레드에서 사용하게되면 이때 사용되는 객체는 싱글톤이므로 여러 쓰레드는 하나의 인스턴스를 사용하게 된다. 만약 인스턴스의 필드 값 변경이 이루어질 경우 여러 스레드는 각각 고유한 필드 값이 아닌 공유된 인스턴스의 필드를 사용하게 되므로 각 스레드에서 기대했던 값을 사용하지 못하게 된다. * 한 인스턴스의 필드를 조회만 한다면 문제는 발생하지 않고 필드의 값을 변경하게 된다면 동시성 문제가 발생할 확율이 생긴다. (확율은 트레픽에 비례) 해결 방법 - 스레드 로컬을 사용하면 해당 쓰레드만 접근할 수 있는 특별한 저장소에 접근할 수 있다. * 자바에서는 쓰레드 로컬을 지원하기 위한 'java.lang.ThreadLocal' 클래스를 제공한다. 필드 타입 스레.. 더보기
[AWS] 아주 쉽게 AWS ElastiCache 도입하여 spring 에서 redis 기능 구현 aws elastiCache redis + spring/kotlin aws elastiCache 콘솔 화면에서 redis탭의 생성 버튼으로 redis 메모리 생성 진행 * 클러스터 모드 - 클러스터 모드를 활성화하면 샤드를 추가 가능하다. 샤드를 추가하면 샤딩 방식에 따라 메모리에 저장되는 데이터를 특정 집단으로 분리하여 저장하므로 워크로드를 분산(성능 개선)한다. 샤딩 - 메모리에 데이터를 분리하여 저장하는 방식 elastiCache redis의 샤딩기법 - 모든 캐시 키가 해시 슬롯에 매핑되는 방식으로 샤딩을 활용. 1개의 클러스터는 16,384개의 슬롯을 사용할 수 있고 클러스터 내 총 샤드에 균등하게 배포 포트 - 일반적으로 redis는 6379 포트 사용 (건들지 말자) 샤드 수 - 분산시킬 파.. 더보기

반응형