본문 바로가기

스프링

[spring] aop_리플렉션_데코레이터패턴_프록시_1

1.     Com.springsource.javax.activation : Spring java-mail

2.     Com.springsource.javax.mail : Spring java-mail

3.     Com.springsource.junit : junit

4.     Commons-logging : Spring-context가 사용

5.     Mail : java-mail

6.     Mockito : 목 프레임워크 중 Mockito

7.     Mysql-connector : Mysql JDBC

8.     Org.springframework.context.support : Spring java-mail

9.     Spring-aop : 스프링 기능 자체의 aop

10.   Spring-bean : 스프링 빈을 활용하는 경우 필요. 스프링의 XML 설정파일과 자바 애노테이션을 파싱 하는데 필요한 클래스 포함

11.   Spring-context : 스프링 코어를 확장한 많은 클래스가 들어 있는데 모든 클래스는 EJB, JNDI(Java Naming Directory Interface), JMX용 클래스와 연동하는데 applicationcontext기능을 사용해야 하며 스프링 리모팅 클래스, 동적 스크립팅 언어(제이루비, 그루비등)와 연동하는 클래스, 빈 유효성검증(JSR-303) API, 스케줄링을 하는 클래스도 포함되어 있다.

12.   Spring-core : 모든 스프링 모듈에서 필요한 모듈. 다른 스프링 모듈에서 사용하는 공통 클래스가 포함됨.

13.   Spring-dao : EmpltyResultDataAccessException 등 사용을 위한 jar

14.   Spring-expression : 스프링 표현언어(SpEL) 지원 클래스 포함.

15.   Spring-jdbc : 스프링이 지원하는 jdbc.

16.   Spring-test.jar

-       @RunWith : Junit 프레임워크의 테스트 실행방법을 확장시 사용.

-       SpringJUnit4ClassRunner : 어플리케이션컨텍스트를 만들고 관리하는 확장 클래스

-       @ContextConfiguration(경로) : 자동으로 만들어줄 어플리케이션 컨텍스트 설정파일

17.   Spring-tx : DuplicateKeyException.class 파일 존재 및 스프링 트랜잭션

 

 

리플렉션

자바의 코드 자체를 추상화(Class)해서 접근하도록 만든 것

클래스 코드의 메타정보를 가져오거나, 오브젝트 조작 가능.

-       메타정보

1)     클래스 이름은 무엇인지? 어떤 클래스를 상속하는지? 어떤 인터페이스를 사용?

2)     어떤 필드를 가지고 있고, 각각의 타입이 무엇인지

3)     메소드는 어떤 것이 있고, 메소드의 파라미터와 리턴 타입은 무엇인지?

-       오브젝트 조작

1)     오브젝트 필드의 값을 읽고 수정

2)     원하는 파라미터 값을 이용해 메소드를 호출

더 자세한 내용은 java.lang.reflect 자바문서를 참조

String 클래스의 메소드 호출 방식과 Method를 이용해 리플렉션 방식으로 호출하는 방법

17. Class 타입의 오브젝트를 가져오는 법. 스트링이 가진 메소드 중 “length” 라는 이름을 갖고 있고, 파라미터는 없는 메소드의 정보를 가져오는 것.

> 자바의 모든 클래스는 그 클래스 자체의 구성정보를 담은 Class 타입의 오브젝트를 하나씩 가지고 있다.

> 클래스이름.class (17, 26라인)

> getClass() : 18~19라인

> Class.forName() : 27~29라인

21. Method 인터페이스의 invoke() 사용시 대상 메소드 실행(Object 타입으로 리턴옴 아래 스샷 확인)

 

 

프록시(타깃과 같은 인터페이스로 구현체, 클라이언트가 실제 대상인 것처럼 위장한 오브젝트)를 적용할 인터페이스

 

타깃 클래스

 

데코레이터 패턴 : HelloTarget 부가기능 추가. 문자를 전부 대문자로 바꿔주는 것.

대문자로 출력이 필요한 경우를 위해 HelloUppercase 프록시 생성

4~7. Hello 타입의 타깃 오브젝트를 DI 받기 위함.

* 위임과 기능 부가라는 두 가지 프록시의 기능을 모두 처리하는 프록시 클래스

 

데코레이터 패턴 프록시의 문제점

인터페이스의 모든 메소드를 구현해 위임하도록 코드를 만들어야함

>  부가기능인 리턴 값을 대문자로 바꾸는 기능이 중복돼서 나타난다.

 

 

 

14~17. 타깃 클래스에 대한 테스트

20~23. 프록시를 통해 타깃 오브젝트에 접근

Class<?> : JDK1.5 제네릭스 오브젝트 타입으로 받을 수 있다. Class<T> 는 타입으로 받기 때문에 안됨