의존성 주입_첫번째 기능
Dependency Injection으로 약어는 DI,
의존성 주입은 '의존하는 부분을 외부에서 주입하는 것'이다.
다시 말하자면 'DI는 프로그램에서 의존 부분을 외부에서 주입한다'로 이해하면 된다.
관점 지향 프로그래밍_두번째 기능
Aspect Oriented Programming으로 약어는 AOP,
AOP는 다음 두 가지 요소로 구성된다.
간단히 설명하면 공통 처리 등의 '횡단적 관심사'를 추출하고 프로그램의 여러 곳에서 호출할 수 있게 설정함으로써 개발자는 실현해야 할 기능인
'중심적 관심사'에만 집중해서 작성하면 되는 구조이다.
의존성
어떤 프로그램에 '사용하는 객체'와 '사용되는 객체'의 관계가 있다고 가정해보자
A클래스에서 B클래스를 사용하려면 new 키워드를 이용해 B클래스의 인스턴스를 생성하고 B클래스의 메서드를 사용하게 된다.
이때 B클래스에서 구현했던 메서드를 변경하면 그 영향으로 A클래스에서도 메서드를 변경해야한다.
이런 관계를 'A클래스는 B클래스에 의존한다' 라고 한다.
의존성 유형
클래스 의존
가정 1) A클래스에서 B클래스의 methodX 메서드를 호출
변경사항) 설계가 변경돼서 '사용되는 객체'를 새롭게 생성된 C클래스로 변경하고 methodY 메서드를 호출하도록 변경해야함
수정사항) A클래스에서 기존 B클래스가 아닌 C클래스 요소로 전부 수정해야함
이렇게 가정 1 처럼 '사용하는 객체' 클래스에서 '사용되는 객체' 클래스 타입을 직접 지정해버리면 '사용되는 객체' 클래스를 변경 할 경우
이를 사용하고 있는 곳을 모두 수정해야한다.
이러한 요소가 한두 군데라면 문제가 없지만 10군데, 100군데 그 이상이 있을 경우 수정 작업과 수정에 의한 테스트 작업이 엄청 늘어난다.
인터페이스 의존
가정 2) I 인터페이스가 있고 그것을 구현한 B클래스가 있다. A클래스에서 B클래스의 methodX를 호출한다.
주의할 점) A클래스에서는 인터페이스로 추상화된 I를 이용한다.
변경사항) 설계가 변경돼서 '사용되는 객체'를 새롭게 생성된 C클래스로 변경하고 methodX 메서드를 호출하도록 변경해야함
수정사항) 클래스 의존과 다르게 A클래스의 한 곳만 수정하면 된다.
장점
인터페이스에 의존하는 프로그램 만들기 -> 생략
DI 컨테이너
지금까지는 인스턴스를 생성하는데 new 키워드를 사용했지만 인스턴스 생성과 같은 작업을 프레임워크에 맡길 수 있고 그 역할을 하는 것이 DI컨테이너이다.
스프링 프레임워크는 임의로 구현한 클래스를 인스턴스로 만들어주는 기능을 제공한다.
다섯 가지 규칙
DI 프로그램 만들기 -> 생략
어노테이션을 세 가지 항목으로 설명
레이어별로 사용할 인스턴스 생성 어노테이션
애플리케이션을 만들 때는 레이어로 나누는 것이 좋다.
레이어(Layer)는 '층'이라는 의미로, 계층 구조로 되어 있는 각 층을 말한다.
쉽게 설명하자면 복잡한 전체 내용을 한 번에 정리해 이해하지 말고 계층화 해
각 계층별로 대상의 의미를 이해하는 것이다.
도메인 레이어 : 도메인 레이어는 애플리케이션의 중심이 되는 레이어로서 업무 처리를 수행하는 레이어이다.
인프라스트럭처 레이어 : 인프라스트럭처 레이어는 데이터베이스에 대한 데이터 영속성 등을 담당하는 레이어이다.
레이어별 인스턴스 생성 어노테이션 설명
<주요처리>
- @Controller : 애플리케이션 레이어의 컨트롤러에 부여
- @Service : 도메인 레이어의 업무 처리에 부여
- @Repository : 인프라 레이어의 데이터베이스 액세스 처리에 부여
<보조처리>
- @Compoenet : @Controller, @Service, @Repository의 용도 이외의 인스턴스 생성 대상 클래스의 부여, 하위 로직을 처리할 때 사용
커스텀 어노테이션
AOP 예제
데이터베이스 액세스 처리에는 예외 발생 시 처리하는 내용이 반드시 포함되어야한다.
'구현하고 싶은 프로그램 = 중심적 관심사'
'부수적 프로그램 = 횡단적 관심사'
위 2개로 분리하여 프로그램을 작성하는 법을 알아보겠다.
어드바이스(Advice) : 횡단적 관심사의 구현, 로그 출력 및 트랙잭션 제어
에스팩트(Aspect) : 어드라이스를 정리한 것(클래스)
조인포인트(JoinPoint) : 어드바이스를 중심적인 관심사에 적용하는 타이밍. 메서드 실행 전, 메서드 실행 후 등 실행되는 타이밍
포인트컷(Pointcut): 어드바이스를 삽입할 수 있는 위치
인터셉터(Interceptor) : 처리의 제어를 인터셉트하기 위한 구조 또는 프로그램
타깃(Target) : 어드바이스가 도입되는 대상
@Before : 중심적 관심사가 실행되기 이전에 횡단적 관심사를 싱행
@AfterReturning : 중심적 관심사가 정상적으로 종료된 후에 횡단적 관심사를 실행
@AfterThrowing : 중심적 관심사로부터 예외가 던져진 후로 횡단적 관심사를 실행
@After : 중심적 관심사의 실행 후에 횡단적 광심사를 실행
@Around : 중심적 관심사가 호출 전후에 횡단적 관심사를 실행
포인트컷 식
execution 지시자의 구문
execute(반환값 패키지.클래스,메서드(인수))
와일드 카드
*(애스터리스크) : 임의의 문자열, 임의의 패키지 한 계층
. .(점두개) : 패키지의 경우 0개 이상의 패키지, 인수의 경우 0개 이상의 인수
+(플러스) : 클래스명 뒤에 기술해 클래스와 그 서브클래스 및 구현 클래스를 모두 나타낸다.
AOP 프로그램 만들기 -> 생략
요약
AOP에서는 프로그램을 2개의 요소인 중심적 관심사와 횡단적 관심사로 구성되어 있다고 생각한다.
중심적 관심사란 구현해야 할 기능, 비즈니스 로직을 말한다.
횡단적 관심사란 품질이나 유지보수 등의 관점에서 꼭 필요한 기능이다.
AOP에서 횡단적 관심사를 분리함으로써 기존 코드를 수정하지 않아도 프로그램 중에 특정 기능(공통 처리)을 추가할 수 있다.
스프링 프레임워크는 다양한 공통 기능을 AOP에서 제공한다.