본문 바로가기
Spring-Boot

토비의 스프링 3.1 Vol.1 450p ~ 550p 정리

by 준형코딩 2024. 1. 2.

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을 적용 가능