6.3.4 다이내믹 프록시를 위한 팩토리 빈
- 팩토리 빈의 설정 방법
'&'를 빈 앞에 붙여주면 팩토리 빈 자체를 돌려준다.
- 다이내믹 프록시를 만들어주는 팩토리 빈
- 트랜잭션 프록시 팩토리 빈
- 트랜잭션 프록시 팩토리 빈 테스트
6.3.5 프록시 팩토리 빈 방식의 장점과 한계
- 프록시 팩토리 빈의 재사용
- 프록시 팩토리 빈 방식의 장점
1. 타깃 인터페이스를 구현하는 클래스를 일일이 만드는 번거로움을 제거할 수 있다.
2. 팩토리 빈을 이용한 DI까지 더해주면 번거로운 다이내믹 프록시 생성 코드도 제거할 수 있다.
- 프록시 팩토리 빈의 한계
중복의 한계
6.4 스프링의 프록시 팩토리 빈
6.4.1 ProxyFactoryBean
프록시를 생성해서 빈 오브젝트로 등록하게 해주는 팩토리 빈
- 어드바이스: 타깃이 필요 없는 순수한 부가기능
MethodInterceptor처럼 타깃 오브젝트에 적용하는 부가기능을 담은 오브젝트를 스프링에서는 어드바이스라고 부른다.
- 포인트컷: 부가기능 적용 대상 메소드 선정 방법
어드바이스와 포인트컷을 묶은 오브젝트를 인터페이스 이름을 따서 어드바이저라고 부른다.
6.4.2 ProxyFactoryBean 적용
- TransactionAdvice
- 스프링 xml 설정파일
- 테스트
- 어드바이스와 포인트컷의 재사용
이미 만둘어둔 TransactionAdvice를 그대로 재사용할 수 있다. 메소드의 선정을 위한 포인트컷이 필요하면 이름 패턴만 지정해서 ProxyFactoryBean에 등록해 주면 된다.
6.5 스프링 AOP
6.5.1 자동 프록시 생성
타깃 오브젝트마다 거의 비슷한 내용의 ProxyFactoryBean 빈 설정정보를 추가해 주는 중복을 제거할 방법은 없는 것일까?
- 중복 문제의 접근
- 빈 후처리기를 이용한 자동 프록시 생성기
빈 후처리기를 사용하면 일일이 ProxyFactoryBean 빈을 등록하지 않아도 타깃 오브젝트에 자동으로 프록시가 적용되게 할 수 있다.
- 확장된 포인트컷
- 포인트컷 테스트
6.5.2 DefaultAdvisorAutoProxyCreater의 적용
- 클래스 필터를 적용한 포인트컷 작성
- 어드바이저를 이용하는 자동 프록시 생성기 등록
- 포인트컷 등록
- 어드바이스와 어드바이저
- ProxyFactoryBean 제거와 서비스 빈의 원상복구
- 자동 프록시 생성기를 사용하는 테스트
- 자동생성 ㅡㅍ록시 확인
6.5.3 포인트컷 표현식을 이용한 포인트컷
- 포인트컷 표현식
AsepectJExpressionPointcut 클래스를 사용하면 된다.
- 포인트컷 표현식 문법
1. publlic - 접근제한자
2. int - 리턴 값의 타입을 나타내는 패턴
3. springbook.learningtest.spring.pointcut.Target - 패키지와 타입 이름을 포함한 클래스의 타입 패턴
4. minus - 메서드 이름 패턴
5. (int,int) - 메소드 파라미터의 타입 패턴
6. throws java.lang.RuntimeException - 예외 이름에 대한 타입 패턴
- 포인트컷 표현식 테스트
- 포인트컷 표현식을 이용하는 포인트컷 적용
- 타입 패턴과 클래스 이름 패턴
6.5.4 AOP란 무엇인가?
- 트랜잭션 서비스 추상화
인터페이스와 DI를 통해 무엇을 하는지는 남기고, 그것을 어떻게 하는지를 분리한 것이다.
- 프록시와 데코레이터 패턴
- 다이내믹 프록시와 프록시 팩토리 빈
JDK 다이내믹 프록시와 같은 프록시 기술을 추상화한 스프링의 프록시 팩토리 빈을 이용해서 다이내믹 프록시 생성 방법에 DI를 도입했다.
- 자동 프록시 생성 방법과 포인트컷
- 부가기능의 모듈화
- AOP: 애스팩트 지향 프로그래밍
애플리케이션을 구성하는 한 가지 측면
애플리케이션의 핵심적인 기능에서 부가적인 기능을 분리해서 애스팩트라는 독특한 모듈로 만들어서 설계하고 개발하는 방법을 애스펙트 지향 프로그래밍 또는 약자로 AOP라고 부른다.
6.5.5 AOP 적용 기술
- 프록시를 이용한 AOP
스프링 AOP = 프록시 방식의 AOP
- 바이트코드 생성과 조작을 통한 AOP
AspectJ는 프록시를 사용하지 않는 대표적인 AOP 기술이다.
6.5.6 AOP의 용어
- 타깃
부가기능을 부여할 대상
- 어드바이스
타깃에게 제공할 부가기능을 담은 모듈
- 조인 포인트
어드바이스가 적용될 수 있는 위치를 말한다.
- 포인트컷
어드바이스를 적용할 조인 포인트를 선별하는 작업 또는 그 기능을 정의한 모듈을 말한다.
- 프록시
클라이언트와 타깃 사이에 투명하게 존재하면서 부가기능을 제공하는 오브젝트
- 어드바이저
포인트컷과 어드바이스를 하나씩 갖고 있는 오브젝트
- 애스펙트
OOP의 클래스와 마찬가지로 애스펙트는 AOP의 기본 모듈
6.5.7 AOP 네임스페이스
- 자동 프록시 생성기
다른 빈을 DI 하지도 않고 DI 되지 않으며 독립적으로 존재, 애플리케이션 컨텍스트가 빈 오브젝트를 생성하는 과정에 빈 후처리기로 참여한다.
- 어드바이스
부가기능을 구현한 클래스를 빈으로 등록한다.
- 포인트컷
스프링의 AspectJExpressionPointcut을 빈으로 등록하고 expression 프로퍼티에 포인트컷 표현식을 넣어주면 된다. 코드를 작성할 필요는 없다.
- 어드바이저
어드바이스와 포인트컷을 프로퍼티로 참조하는 것 외에는 기능은 없다.
- AOP 네임스페이스
- 어드바이저 내장 포인트컷
6.6 트랜잭션 속성
6.6.1 트랜잭션 정의
트랜잭션 기본개념 - 더 이상 쪼갤 수 없는 최소 단위의 작업
- 트랜잭션 전파
트랜잭션의 경계에서 이미 진행 중인 트랜잭션이 있을 때 또는 없을 때 어떻게 동작할 것인가를 결정하는 방식을 말한다.
- PROPAGATION_REQUIRED
가장 많이 사용되는 트랜잭션 전파 속성이다. 진행 중인 트랜잭션이 없으면 새로 시작하고, 이미 시작된 트랜잭션이 있으면 이에 참여한다.
- PROPAGATION_REQUIRES_VIEW
항상 새로운 트랜잭션을 시작한다.
- PROPAGATION_NOT_SUPPORTED
이 속성을 사용하면 트랜잭션 없이 동작하도록 만들 수도 있다.
- 격리수준
모든 DB 트랜잭션은 격리수준을 갖고 있어야 한다. 성능 저하를 막기 위해 가능한 한 많은 트랜잭션을 동시에 진행시켜야한다.
- 제한시간
트랜잭션을 수행하는 제한시간을 설정할 수 있다.
- 읽기전용
읽기전용으로 설정해두면 트랜잭션 내에서 데이터를 조작하는 시도를 막아줄 수 있다. 또한 데이터 액세스 기술에 따라서 성능이 향상될 수도 있다.
6.6.2 트랜잭션 인터셉터와 트랜잭션 속성
- TransactionInterceptor
- 메소드 이름 패턴을 이용한 트랜잭션 속성 지정
- tx 네임스페이스를 이용한 설정 방법
6.6.3 포인트컷과 트랜잭션 속성의 전략
- 트랜잭션 포인트컷 표현식은 타입 패턴이나 빈 이름을 이용한다.
- 공통된 메소드 이름 규칙을 통해 최소한의 트랜잭션 어드바이스와 속성을 정의한다.
- 프록시 방식 AOP는 같은 타깃 오브젝트 내의 메소드를 호출할 때는 적용되지 않는다.
6.6.4 트랜잭션 속성 적용
- 트랜잭션 경계설정의 일원화
- 서비스 빈에 적용되는 포인트컷 표현식 등록
- 트랜잭션 속성을 가진 트랜잭션 어드바이스 등록
- 트랜잭션 속성 테스트
6.7 애노테이션 트랜잭션 속성과 포인트컷
6.7.1 트랜잭션 애노테이션
- @Transactional
- 트랜잭션 속성을 이용하는 포인트컷
메소드마다 @Transactional을 부여하고 속성을 지정할 수 있다. 이렇게 하면 유연한 속성 제어는 가능하겠지만 코드는 지저분해지고 동일한 속성 정보를 가진 애노테이션을 반복적으로 메서드마다 부여해 주는 바람직하지 못한 결과를 가져올 수 있다.
- 대체 정책
1. 타깃의 메서드에 @Transaction이 있는지 확인
2. 부여되어 있다면 이를 속성으로 사용하고 만약 없으면 다음 대체 후보인 타깃 클래스에 부여된 @Transactional 애너테이션을 찾는다.
3. 타깃 클래스의 메서드 레벨에는 없었지만 클래스 레벨에 @Transaction이 존재한다면 이를 메서드의 트랜잭션 속성으로 사용한다.
- 트랜잭션 애노테이션 사용을 위한 설정
<tx:annotation-driven />
6.7.2 트랜잭션 애노테이션 적용
6.8 트랜잭션 지원 테스트
6.8.1 선언적 트랜잭션과 트랜잭션 전파 속성
선언적 트랜잭션 - AOP를 이용해 코드 외부에서 트랜잭션의 기능을 부여해주고 속성을 지정할 수 있게 하는 방법
프로그램에 의한 트랜잭션 - 직접 코드 안에서 사용하는 방법
6.8.2 트랜잭션 동기화와 테스트
- 트랜잭션 매니저와 트랜잭션 동기화
- 트랜잭션 매니저를 이용한 테스트용 트랜잭션 제어
- 트랜잭션 동기화 검증
트랜잭션의 속성 중에서 읽기전용과 제한시간 등은 처음 트랜잭션이 시작할 때만 적용되고 그 이후에 참여하는 메소드의 속성은 무시된다.
- 롤백 테스트
테스트를 진행하는 동안에 조작한 데이터를 모두 롤백하고 테스트를 시작하기 전 상태로 만들어줌
그러나 DB의 처리 방법에 따라 롤백이 커밋보다 더 많은 부하를 주는 경우도 있으니 단지 성능 때문에 롤백 테스트가 낫다고는 볼 수 없다.
6.8.3 테스트를 위한 트랜잭션 애노테이션
- @Transactional
테스트에도 @Transactional을 적용 가능
'Spring-Boot' 카테고리의 다른 글
토비의 스프링 3.1 Vol.1 650p ~ 750p 정리 (2) | 2024.01.04 |
---|---|
토비의 스프링 3.1 Vol.1 550p ~ 650p 정리 (0) | 2024.01.02 |
토비의 스프링 3.1 Vol.1 350p ~ 450p 정리 (0) | 2023.12.31 |
토비의 스프링 3.1 Vol.1 250p ~ 350p 정리 (1) | 2023.12.30 |
토비의 스프링 3.1 Vol.1 145p ~ 250p 정리 (1) | 2023.12.28 |