Spring 썸네일형 리스트형 [Spring] 객체 지향 설계 5가지 - SOLID 단일 책임 원칙 (Single Responsibility Principle) - "모든 클래스 단 한개의 책임을 가져야 한다" 하나의 클래스가 두가지 다른 원인으로 변경되어야 한다면 두 개 이상의 책임을 가진것이므로 원칙에 어긋난다. 개방-폐쇄 원칙 (Open-Closed Principle) - "확장에는 열려있고, 수정에는 닫혀 있어야 한다" 기존의 코드의 수정(수정에 닫혀)없이 새로운 기능을 추가(확장에 열려)할 수 있게 해준다. 공통되는 기능들을 인터페이스로 추상화하여 기능을 고정 지키지 않을 시 기능 추가 시 마다 타입 체크 및 if문을 통한 조건이 같이 추가됨. 리스코프 치환 원칙 (Liskov Substitution Principle) - "상위 타입의 객체를 하위 타입의 객체로 치환해도 상위.. 더보기 [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' 클래스를 제공한다. 필드 타입 스레.. 더보기 이전 1 2 다음