본문 바로가기

아는 만큼 보인다/Spring Framework

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(..)로 생성한 프록시 오브젝트로 대체한다.빈 타입 => 대체할 빈과 같은 인터페이스 타입 더보기
서비스 추상화 그리고 DI (Dependency Injection) DI를 적용하게 되면 수직적인 계층구조를 갖게 된다.1. 애플리케이션 계층2. 추상화 계층3. 기술 서비스 계층 이 계층에 자바파일을 대응 시켜보면 다음과 같다.1. 서비스 로직을 구현한 클래스2. 인터페이스 (기술들의 공통 기능을 추상화하여 메소드로 선언)3. 인터페이스를 구현한 클래스들 눈치 챘을까? 완전히 전략 패턴이다. 이 계층 구조을 통해 DI를 설명해보자. 1. 서비스 로직을 구현한 클래스는 추상화된 2. 인터페이스를 사용함으로써 변경에는 닫혀있고 확장에는 열려있는 OCP 원칙을 따른다. 그리고 스프링 프레임워크가 DI를 통해 3. 인터페이스를 구현한 클래스들 중 전략에 맞는 클래스를 선정하여 singletone instance을 생성하여 2. 인터페이스에 대입해준다. 수직 계층구조의 예이다... 더보기
JdbcTemplate (쓰기 편한 database 접속 api) 스프링이 제공해주는 템플릿/콜백 패턴의 라이브러리(?)이다.즉, 변하지 않는 부분을 템플릿으로 미리 만들어주었다.우리가 사용할 때는 변하는 부분(콜백)만 템플릿 메소드에게 파라미터로 전달해주면 끝이다. 사용예)...JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);jdbcTemplate.update("delete from users");jdbcTemplate.update("insert into users(id, name, password) values(?,?,?)", user.getId(), user.getName(), user.getPassword());int count = jdbcTemplate.queryForInt("select count(*) f.. 더보기
DI Container = ApplicationContext의 또 다른 이름.. 다시 간단 정리하면 스프링이라는 프레임워크는 개발자의 코드를 수동적으로 만든다. 1. 개발자의 코드는 능동적으로 스스로 실행되지 않는다. (객체화되지 않는다.) --> 스프링 프레임워크가 실행시켜줘야 실행된다. 2. 개발자의 코드는 오브젝트와의 의존관계를 스스로 결정하고 맺지 않는다. --> 스프링 프레임워크가 런타임시에 오브젝트간 의존관계를 맺어준다. --> 스프링이 이런 역할을 해주기 때문에. Bean Factory/ ApplicationContext/ IoC 컨테이너/ SingltoneRegistry 등의 많은 이름(?)으로 불리우는 이 것이 DI 컨테이너라는 또 다른 이름으로 불리우는 이유다. 스프링이 DI Container 로서, Dependency Injection(의존성 주입)을 잘 할 수 .. 더보기
Singleton Registry = ApplicationContext의 또 다른 이름 BeanFactory = ApplicationContext = IoC Container = Spring Container 가 생성/관리하는 빈 오브젝트는 특별한 설정이 없는 한, (빈의 scope이 prototype scope, request scope, session scope 이 아닌 이상..)싱글톤 오브젝트이다. 이러한 이유로 Spring Container을 Sigleton Registry 라고도 부른다. 한 가지 기억해둘 것은 ..빈으로 등록되는 클래스가 디자인 패턴의 하나인 Singleton pattern을 적용한 클래스가 아니다라는 점빈으로 등록되는 클래스는 (private 생성자, public static getInstance() 메소드등이 없는) 평범한 클래스이다. 이 평범한 클래스를 빈 .. 더보기
Annotations 빈설정용 (자바코드로 등록할 빈을 설정) @Configuration * 클래스에 명시되며, 이 클래스는 스프링에서 클래스의 탈을 쓴 설정정보가 된다. * 스프링의 빈팩토리(ApplicationContext)가 빈을 생성하고 관계설정하는데 이 클래스를 설정정보로 사용하도록 알려주자. * xml 설정파일의 라는 root element와 그 역할이 같다. @Bean * 메소드에 명시되며, * 이 메소드는 스프링의 빈팩토리가 빈 객체를 생성하는데 사용된다. * 메소드 이름이 곧 빈의 이름이 된다 * xml 설정파일의 element와 그 역할이 같다. 빈등록용 (스캐너에 의해 자동으로 등록) @Component (@Controller, @Service, @Repository) * 빈스캐너에 의해 빈으로 등록된다 .. 더보기