김종민 님의 <스프링 입문을 위한 자바 객체지향의 원리와 이해> 중 7장 IoC/DI, AOP 실습 코드입니다.
- 스프링의 3대 프로그래밍 모델
- IoC/DI
- AOP
- PSA
- 의사코드
운전자가 자동차를 생산한다. // new Car();
자동차는 내부적으로 타이어를 생산한다. // Car 객체의 생성자 안에서 new Tire();
- 의사코드
운전자가 타이어를 생산한다. // Tire tire = new KoreaTire();
운전자가 자동차를 생산하면서 타이어를 장착한다. // Car car = new Car(tire);
- 의사코드
운전자가 타이어를 생산한다. // Tire tire = new KoreaTire();
운전자가 자동차를 생산한다. // Car car = new Car();
운전자가 자동차에 타이어를 장착한다. // car.setTire(tire);
- 의사코드
// ApplicationContext context = new ClassPathXmlApplicationContext("expert002.xml", Driver.class);
운전자가 종합쇼핑몰에서 타이어를 구매한다. // Tire tire = (Tire)context.getBean("tire");
운전자가 종합쇼핑몰에서 자동차를 구매한다. // Car car = (Car)context.getBean("car");
운전자가 자동차에 타이어를 장착한다. // car.setTire(tire);
- 의사코드
운전자가 종합 쇼핑몰에서 자동차를 구매 요청한다.
종합 쇼핑몰은 자동차를 생산한다.
종합 쇼핑몰은 타이어를 생산한다.
종합 쇼핑몰은 자동차에 타이어를 장착한다.
종합쇼핑몰으 운전자에게 자동차를 전달한다.
- 의사코드
- 위와 동일
DI가 의존성(new)에 대한 주입이라면, AOP는 로직(code)에 대한 주입이다.
- 핵심관심사와 횡단관심사
- 핵심관심사: 예) 입금, 출금, 이체
- 횡단관심사: 예) 로깅, 보안, 트랜잭션
- 여러 모듈에서 공통적으로, 중복적으로 나타남 -> 분리해서 한 곳에서 관리할 경우 편리
- 메서드에서 코드를 주입할 수 있는 위치
- 메서드 전 구역 Around
- 메서드 시작 직후 Before
- 메서드 종료 직전 After
- 메서드 정상 종료 직전 AfterReturning
- 메서드에서 예외가 발견되면서 종료된 직전 AfterThrowing
스프링 AOP는 인터페이스 기반이다.
스프링 AOP는 프록시 기반이다.
스프링 AOP는 런타임 기반이다.
- Pointcut
- 스프링 AOP의 경우
- Pointcut = 횡단관심사를 적용할 타깃 메서드를 선택하는 지시자(메서드 필터)
- Pointcut = 타깃 클래스의 타깃 메서드 지정자
- 다른 AOP 프레임워크의 경우(예: AspectJ)
- 메서드 뿐만 아니라 속성 등에서도 Aspect를 적용할 수 있음
- 따라서 Pointcut = Aspect 적용 위치 지정자(지시자)
- 스프링 AOP의 경우
- 포인트컷 형식
-
[접근제한자] 리턴타입 [패키지명.클래스명.] 메서드명(파라미터) [throws 예외] //대괄호 []는 생략 가능
-
- 포인트컷 표현식의 예)
-
public void aop002.Boy.runSomething() //접근제한자가 public이고 리턴타입이 void이며 aop002 패키지 이하의 Boy 클래스 안의 runSomething() 메서드를 Pointcut으로 지정하라 * runSomething() //접근제한자는 무엇이든 좋으며(생략됨) 리턴타입도 무엇이든 좋으며(*) 모든 패키지 밑의(생략됨) 모든 클래스 안의(생략됨) 파라미터가 없으며 던져지는 에러가 있든 없든 이름이 runSomething인 메서드들을 Pointcut으로 지정하라
-
- Joinpoint
- 광의의 Joinpoint
- **Aspect 적용이 가능한 모든 지점"
- 스프링프레임워크가 관리하는 빈의 모든 메서드
- 협의의 Joinpoint
- 호출된 객체의 메서드
- Pointcut은 Joinpoint의 부분집합임
- 왜냐하면 포인트컷의 후보가되는 모든 메서드들이 조인포인트가 되기 때문
- 광의의 Joinpoint
- Advice
- Pointcut에 언제 무엇을 적용할지 정의한 메서드
- 타긱 객체의 타깃 메서드에 적용될 부가 기능
- Aspect
- Advice들(언제? 무엇을?) + Pointcut들(어디에?)
- Advisor
- 한 개의 Advice + 한 개의 Pointcut
- Advisor는 스프링AOP에서만 사용하는 용어
- 스프링 버전이 올라감에 따라 이지는 사용하지 말라고 권고하는 기능
- 스프링의 발전과정에 따라 다수의 Advice와 다수의 Pointcut을 다양하게 조합해 사용하는 방법, 즉 Aspect가 나왔으므로 Advisor를 사용할 필요가 없어짐
- 서비스 추상화
- 어댑터 패턴을 적용해 같은 일을 하는 다수의 기술을 공통의 인터페이스로 제어할 수 있게 함
- 예)
- JDBC
- JDBC라는 표준 스펙이 있기에 오라클을 사용하든, MySQL을 사용하든 Connection, Statement, ResultSet을 이용해 공통된 방식으로 코드 작성 가능
- DB 종류에 상관없이 같은 방식으로 제어할 수 있는 이유
- JDBC가 어댑터패턴을 활용하고 있기 때문
- JDBC
- 스프링 프레임워크에서 제공하는 다양한 어댑터
- 여러 OXM(Object XML Mapping) 기술(예: Castor, JAXB, XMLBeans, ...)에 대하여 일관된 방식으로 코드를 작성할 수 있게 지원
- 하나의 OXM에서 다른 OXM으로 변경할 때 큰 변화없이 세부 기술 교체하여 사용 가능
- ORM에 대한 PSA
- 캐시에 대한 PSA
- 트랜잭션에 대한 PSA
- 여러 OXM(Object XML Mapping) 기술(예: Castor, JAXB, XMLBeans, ...)에 대하여 일관된 방식으로 코드를 작성할 수 있게 지원