190 likes | 395 Views
Spring Di & Spring AOP Jeong, Jae-Keun PLUS, a division of TSB. Revision History. Agenda. 1. Spring DI 1.1 외부 설정 프로퍼티 1.2 MessageSource 를 이용한 메시지 처리 1.3 어노테이션을 이용한 설정 1.4 빈 객체 스캔. Agenda. 2. Spring AOP 2.1 AOP 소개 2.2 스프링에서의 AOP 2.3 스프링 API 를 이용한 AOP
E N D
Spring Di & Spring AOP Jeong, Jae-Keun PLUS, a division of TSB
Agenda 1. Spring DI 1.1 외부 설정 프로퍼티 1.2 MessageSource를 이용한 메시지 처리 1.3 어노테이션을 이용한 설정 1.4 빈 객체 스캔
Agenda 2. Spring AOP 2.1 AOP 소개 2.2 스프링에서의 AOP 2.3 스프링 API를 이용한 AOP 2.4 POJO 클래스를 이용한 AOP 2.5 @Aspect 어노테이션을 이용한 AOP 2.6 AspectJ의 Pointcut 표현식
외부 설정 프로퍼티 사용 • PropertyPlaceholderConfigurer클래스를 빈으로 등록한 후 사용 1.1 외부 설정 프로퍼티 ■ 프로퍼티 파일 ■ 스프링 설정 파일 - {프로퍼티 이름} ■ 1개 이상의 프로퍼티 설정 시 - <list>태그
메시지 출력 1.2 MessageSource를 이용한 텍스트 메시지 처리 ■ 파일 명이 messageSource인 빈 객체 생성 • ApplicationContext를 이용하여 메시지 가져오려면 스프링 설정파일에 이름이 “messageSource”인 빈 객체 정의 • 베이스 이름은 패키지를 포함한 완전한 이름이어야 함 • message.greeting 값은 message 패키지에 있는 greeting 프로퍼티파일로부터 메시지를 가져옴 ■ ApplicationContext.getMessage() 메서드 이용 • 스프링 설정 파일에 이름이 ‘messageSource’인 MessageSource 빈객체를 등록하여야 함
@Required 어노테이션을 이용한 필수 프로퍼티 검사 • @Required 어노테이션은 스프링 2 에서 부터 제공, 필수 프로퍼티를 명시할 때 사용 1.3 어노테이션을 이용한 설정 ■ @Required 어노테이션 추가 • @Required 어노테이션을 추가 했다고 필수 프로퍼티로 인식하지 않음 ■ @RequiredAnnotationBeanPostProcessor 클래스 등록 • 스프링 설정 파일에 RequiredAnnotationBeanPostProcessor 클래스를 빈으로 등록해야 비로소 필수 프로퍼티로 인식
@AutoWired 어노테이션을 이용한 자동설정 • @Autowired 어노테이션은 스프링 2.5에 추가된 기능 타입을 이용하여 의존하는 객체를 삽입 1.3 어노테이션을 이용한 설정 ■ 메서드 @Autowired 추가 • @Autowired 어노테이션은 생성자,필드,메서드 세 곳에 적용 가능 • Setter를 만들지 않고 get을 할 수 있다. • 자동적으로 프로퍼티 값을 설정하기 때문에 해당 타입의 빈 객체가 존재하거나 또는 2개 이상존재 할 경우 예외를 발생시킴 ■ AutowiredAnnotationBeanPostProcessor 클래스 등록 ■ 적용한 프로퍼티를 반드시 사용 할 필요가 없을 경우
@Qualifier 어노테이션을 이용한 자동 설정 제한 • 동일한 타입의 빈 객체들 중에서 특정 빈을 사용 할 때 1.3 어노테이션을 이용한 설정 ■ @Qualifier 추가 • @Autowired의 타입이 두 개 이상 존재 할 경우 특정 빈을 사용하기 위해 @Autowired 어노테이션과 함께 쓰인다. • 자동 연결될 빈 객체의 수식어 값을 가진다. • Camera 타입의 빈 객체 중 수식어가 “main”인 객체를 자동연결 ■ 설정 파일에서의 추가 • 생성자나 매서드가 2개 이상의 파라미터를 가지는 경우 Qualifier 어노테이션 값을 사용
@Resource 어노테이션을 이용한 프로퍼티 설정 • 스프링 2.5부터 @Resource 어노테이션 지원, 의존하는 빈 객체를 전달할 때 사용 1.3 어노테이션을 이용한 설정 ■ @Resource 어노테이션 추가 • @Resource 자원을 사용하려면 name 속성에 자동으로 연결할 빈 객체의 이름을 입력 ■ CommonAnnotationBeanPostProcessor 클래스 등록
@PostConstruct 어노테이션 및 @PreDestroy 어노테션과 라이프 사이클 • 자바 6 및 JEE 5에 추가된 어노테이션으로 라이프 사이클의 초기화 및 제거 과정을 제공 1.3 어노테이션을 이용한 설정 ■ @PostConstruct 어노테이션 및 @PreDestroy 어노테이션 추가 • @PostConstruct 어노테이션은 의존하는 객체를 설정한 이후 초기화 작업을 수행할 메서드에적용 • @PreDestroy 어노테이션은 컨테이너에서 객체를 제거하기 전에 호출 될 메서드에 적용 • 스프링 설정 파일에서 “init-method”속성 과 “destroy-method”속성을 이용하여 명시한 메서드와 동일한 시점에 실행
빈 객체 스캔 • 클래스 패스에 위치한 클래스를 검색하여 특정한 어노테이션이 붙은 클래스를 자동으로 빈으로 • 등록 1.4 빈 객체 스캔 ■ Component 어노테이션 추가 ■ getBean으로 빈 객체를 가져 옮 ■ 특정이름을 명시하는 방법 ■ 빈의 범위 지정
AOP 소개 • Aspect Oriented Programming (관점 지향 프로그래밍)으로써 문제를 해결하기 위한 핵심 관심 • 사항과 전체에 적용되는 공통 관심 사항을 기준으로 프로그래밍 하므로써 공통 모듈을 여러 코드에 • 쉽게 적용 할 수 있다. • 에스펙트 지향에서 중요한 개념은 “횡단 관점의 분리(Separation of Cross-Cutting Concern)” • 객체지향에서 기능과 관련 모듈로 부터 분리하는 것으로 성공했지만, 그 기능 사용을 위해 코드까지는 각 모듈로부터 분리할 수 없었다. • AOP에서는 분리한 기능의 호출까지 포함하여 “관점”으로 다룬다 각 모듈로 산재한 관점을 횡단 관점이라 한다. • AOP에서는 이러한 “횡단 관점”까지 분리함으로써 각 모듈로부터 관점에 관한 코드를 완전히 제거하는 것을 목표로 한다. 즉, 분리된 기능을 이용하기 위한 코드를 기술할 필요가 없도록 하여 개발자들이 횡단 관점에 대해 전혀 알 필요가 없도록 하는 데 목적을 둔다. 2.1 AOP 소개
AOP 용어 • Joinpoint : 클래스의 인스턴스 생성 시점, 메소드 호출 시점 및 예외 발생 시점과 같이 어플리케이션을 실행할 때 특정 작업이 시작되는 시점, Advice를 적용 가능한 시점을 의미한다. • Advice : 언제 공통 관심 기능을 핵심 로직에 적용할지를 정의. 예를 들어,”메서드를 호출하기 전”(언제)에 “트랜잭션을 시작한다”(공통 기능)기능을 적용한다는 것을 정의 • Pointcut : 여러 개의 조인포인트를 하나로 결합(묶은)한 것을 의미한다. • Advisor : 어드바이스와 포인트컷을 하나로 묶어 취급한 것 • Weaving : 어드바이스를 핵심 로직 코드에 삽입하는 것을 의미 • Aspect : 여러 객체에 공통으로 적용되는 공통 관점 사항 2.1 AOP 소개
세 가지 Weaving 방식 • 컴파일 시에 Weaving 하기 • - AspectJ에서 사용하는 방식으로 컴파일 시 핵심 로직을 구현한 자바소스 코드를 컴파일 • 할 때 알 맞은 위치에 공통코드를 삽입. 따라서, AOP가 적용된 클래스 파일이 생성 됨 • 클래스 로딩 시에 Weaving 하기 • - JVM이 클래스를 로딩할 때 클래스 정보를 변경할 수 있는 에이전트를 제공 • 로딩한 클래스의 바이너리 정보를 변경하여 알맞은 위치에 공통 코드를 삽입한 새로운 클래스 • 바이너리 코드를 사용. 즉 원본 클래스 파일은 변경하지 않음 • 런타임 시에 Weaving 하기 • - 소스 코드나 클래스 정보 자체를 변경하지 않음 • 대신 프록시를 이용하여 AOP를 적용 • 프록시 기반에서는 매서드가 호출될 때에만 Advice를 적용 할 • 수 있기 때문에 필드 값 변경 같은 Joinpoint에 대해서는 적용 • 할 수 없다 2.2 AOP 소개
스프링에서의 AOP • 스프링 자체적으로 프로시 기반의 AOP를 지원하고 있다. 따라서 스프링 AOP는 메서드 호출 Joinpoint만을 지원 • 필드 값 변경과 같은 Joinpoint를 사용하고 싶다면 AspectJ와 같이 풍부한 기능을 지원하는 AOP • 도구를 사용해야만 한다. • 스프링은 세 가지 방식으로 AOP를 구현할 수 있도록 하고 있다. • 어떠한 방식을 사용하더라도 내부적으로는 프록시를 이용하여 AOP가 구현되므로 메서드 호출에 대해서만 AOP를 적용할 수 있다. 즉 메서드 호출과 관련된 Pointcut만 사용 가능하다 2.2 스프링에서의 AOP
프록시를 이용한 AOP 구현 • 프록시는 공통 기능을 실행한 뒤 대상 객체의 실제 메서드를 호출 하거나 또는 대상 객채의 • 실제 메서드가 호출된 뒤 공통 기능을 실행 • 대상 객체가 인터페이스를 구현된 경우 • java.lang.reflect.Proxy를이용하여 프록시 객체를 생성 • 인터페이스에 정의되어 있지 않은 메서드에 대해 AOP가 • 적용되지 않는다. 2.2 스프링에서의 AOP
Advice 작성 • Advice는 언제 어떤 공통 관심 사항을 실행할지에 대한 정보를 담고 있다 • 스프링 AOP는 메서드 호출과 관련된 Advice만 지원, 인터페이스 형태로 제공 2.3 스프링 API를 이용한 AOP