본문 바로가기

아는 만큼 보인다

Synchronizers (동기화 클래스들) Synchronizers : 스레드들을 기다리게 하는 것들 (스레드들을 제어) 클래스 특징 대표적 사용 예 LinkedBlockingQueue put, take시 대기 가능 Producers - Consumers 여러 스레드가 하나의 큐 사용 LinkedBlockingDeque put, take시 대기 가능 Crawler 스레드들을 이용한 파일 검색, 여러 스레드가 각자 큐 사용, Job stealing FutureTask Future.get() 하여 미리 시켜놓은 일이 종료될 때까지 대기 CountDownLatch Count 0 일때 await() 중인 스레드들 모두 시작 서비스 구동시 의존 서비스들 먼저 구동시키기 CyclicBarrier 모든 스레드가 await()할 때 대기 종료하여 스레드들의 작.. 더보기
ConcurrentHashMap 특징 비교 HashMap Hashtable Collections.synchronizedMap() ConcurrentHashMap 단일 스레드용 병렬성 병렬성 + 활동성 lock 하나만 사용 lock striping (세분화) fail fast weakly consistent Iterator에서 ConcurrentModificationException 던짐 Iterator에서 ConcurrentModificationException 안던짐 더보기
eclipse에서 java compiler 변경시.. 에러 eclipse에서 java compiler 변경 후에도.. 이전 컴파일러로 빌드하려고 한다면.. 아래 폴더를 지움 \.metadata\.plugins\org.eclipse.debug.core\.launches 더보기
AOP (Aspect Oriented Programming) 관점지향프로그래밍 스프링의 3가지 주요 특징이다.1. IoC/DI => 전략 패턴을 바탕으로 스프링이 runtime시에 의존관계를 주입해준다.2. 서비스 추상화 => 다양한 서비스 기술들의 추상화 계층을 제공함으로써 확장성을 높여준다3. AOP => 데코레이터 패턴을 바탕으로(프록시 오브젝트를 활용하는) 관점 지향 프로그래밍을 지원한다. AOP ??관점지향프로그래밍..객체지향프로그래밍(OOP)의 서포터다.부가기능이 핵심기능의 로직안에 들어가지 않도록.. 부가기능을 핵심기능으로부터 분리하여 모듈화함으로써핵심기능이 완전하게 객체 지향 프로그래밍될 수 있도록 도와준다. 스프링의 AOP는 다이나믹한 프록시 오브젝트를 활용하여 간접적으로 부가기능을 수행한다. (직접 .class파일을 수정하지 않는다)스프링은 아래의 기술/기법들의 .. 더보기
프록시 팩토리빈 ==> 빈 후처리기(BeanPostProcessor) 프록시 팩토리빈을 사용해서..Pointcut과 Advice를 재사용할 수 있게되었다. 그런데 target 설정을 위해 ApplicationContext 설정파일 내에서 프록시 팩토리빈의 설정은 줄일 수 없다.단지 타겟만 바꿔가면서 프록시를 생성하고 싶은 타켓의 수 만큼 프록시 팩토리빈을 설정해줘야 한다. 그러나, 빈후처리기를 사용하면 프록시 팩토리빈의 설정을 단 한번도 안해도 된다. 위와 같이 ApplicationContext 설정파일에 빈후처리기를 등록하면, 스프링은 먼저 등록된 빈중에 모든 Advisor 들을 취합하여 빈후처리기에게 준다. 그리고 빈후처리기는 등록된 빈을 생성할 때 마다.. 생성된 빈의 클래스(타입)가 취합된 Advisor의 Pointcut에서 지정한 클래스 패턴과 일치하는 지 검사하.. 더보기
다이나믹프록시 + 팩토리빈 ==> 프록시 팩토리빈 스프링이 다이나믹프록시와 팩토리빈을 썩어서 제공하는 추상화된 서비스 => 프록시 팩토리빈 프록시 팩토리빈은 다이나믹프록시처럼 타겟의 인터페이스를 구현한 프록시 오브젝트를 손쉽게 만들어준다. getObject() 프록시 팩토리빈은 팩토리빈처럼 스프링에 빈으로 등록할 수 있다. 프록시 팩토리빈과 팩토리빈이 다른 점은 다이나믹하게 생성되는 프록시오브젝트가 부가기능을 추가하여 타겟을 호출하는 invoke()메소드의 인터페이스가 다르다. 팩토리빈은 InvocationHandler 인터페이스 프록시 팩토리빈은 MethodInterceptor 인터페이스 또 다른 점은 부가기능을 적용할 메소드 선정 알고리즘이다. 팩토리빈은 InvocationHandler 인터페이스의 invoke 메소드 구현시 해당 알고리즘을 구현해야.. 더보기
데코레이터 패턴 ==> 다이나믹프록시(자바) + 팩토리빈(스프링) 데코레이터 또는 프록시 패턴을 적용하는 데 어려움은.. 부가기능을 구현할 클래스가 부가기능과 관계없는 메소드들도 인터페이스에 선언된 메소드라면 전부 구현해야 하는 번거로움과 부가기능과 관계된 메소드들에 구현되는 코드 중복을 들 수 있다. 이 두 가지 어려움을 한 방에 해결하는 방법이 자바의 reflection에서 제공하는 다이나믹 프록시이다. Proxy.newProxyInstance(..)을 통해 프록시 오브젝트를 손쉽게 생성할 수 있다. 일일이 특정 인터페이스의 모든 메소드들을 구현하지 않아도 된다. Proxy.newProxyInstance(..)를 호출할 때 전달하는 InvocationHandler 인터페이스 구현체의 단일 메소드인 invoke() 메소드에 부가기능을 단 한번 만 구현함으로써 코드 중.. 더보기
스프링이 빈 오브젝트를 생성하는 방법 1. 일반 클래스가 빈의 클래스로 지정된 경우빈 오브젝트 => Class.forName("지정된 클래스 이름").newInstance();빈 타입 => 지정된 클래스 타입 2. FactoryBean 인터페이스를 구현한 클래스가 빈의 클래스로 지정된 경우빈 오브젝트 => FactoryBean오브젝트.getObject();빈 타입 => FactoryBean오브젝트.getObjectType(); 3. BeanPostProcessor(빈후처리기) 인터페이스를 구현한 클래스가 빈의 클래스로 지정된 경우빈 오브젝트 => 생성된 빈이 후처리 대상인 경우, Proxy.newProxyInstance(..)로 생성한 프록시 오브젝트로 대체한다.빈 타입 => 대체할 빈과 같은 인터페이스 타입 더보기
데코레이터 패턴과 프록시 패턴 데코레이터 패턴과 프록시 패턴은 둘 모두가 프록시 오브젝트를 사용한다. 프록시 오브젝트란? 타깃/실체와 같은 인터페이스를 구현한 클래스를 말한다. 전략패턴에서는 같은 인터페이스를 구현한 클래스들은 여러가지 구체적인 기술들을 각각 구현한 클래스들로서 클라이언트에게 여러 기술에 대해 선택의 폭을 확장해 주기 위해서 였다. 그러나 프록시 오브젝트는 전략패턴에서 처럼 또 다른 기술을 구현한 오브젝트가 아니고, 타킷/실체라는 하나의 기술을 사용하면서 그 실체에 부가기능을 더하거나 또는 그 실체로의 접근 방법을 제어하기 위해 구현된다. 결국, 프록시 오브젝트는 타깃/실체의 메소드를 사용한다. 이를 실체에게 위임한다 라고 말한다. 1. 프록시 오브젝트가 부가기능을 더한 것이라면, 데코레이터 패턴이라 부른다. 실례를 .. 더보기
서비스 추상화 그리고 DI (Dependency Injection) DI를 적용하게 되면 수직적인 계층구조를 갖게 된다.1. 애플리케이션 계층2. 추상화 계층3. 기술 서비스 계층 이 계층에 자바파일을 대응 시켜보면 다음과 같다.1. 서비스 로직을 구현한 클래스2. 인터페이스 (기술들의 공통 기능을 추상화하여 메소드로 선언)3. 인터페이스를 구현한 클래스들 눈치 챘을까? 완전히 전략 패턴이다. 이 계층 구조을 통해 DI를 설명해보자. 1. 서비스 로직을 구현한 클래스는 추상화된 2. 인터페이스를 사용함으로써 변경에는 닫혀있고 확장에는 열려있는 OCP 원칙을 따른다. 그리고 스프링 프레임워크가 DI를 통해 3. 인터페이스를 구현한 클래스들 중 전략에 맞는 클래스를 선정하여 singletone instance을 생성하여 2. 인터페이스에 대입해준다. 수직 계층구조의 예이다... 더보기