본문 바로가기

Spring&SpringBoot/<토비의 스프링 3.1 Vol1.1>, 이일민29

애노테이션 트랜잭션과 테스트 트랜잭션 애노테이션 지금까지 포인트컷 패턴이나 트랜잭션 속성을 이용해 트랜잭션을 일괄적으로 적용하는 방법을 알아보았다. 이번에는 클래스나 메소드에 세밀하게 튜닝된 트랜잭션 속성을 적용할 때 사용하면 좋은 트랜잭션 애노테이션을 사용해본다. 일괄적으로 속성을 부여하는 대신 직접 타깃에 트랜잭션 속성정보를 가진 애노테이션을 지정하는 방법을 사용한다. 포인트컷은 따로 지정할 필요가 없다. 애노테이션이 붙은 메소드나 클래스가 곧 포인트컷으로 선정한 결과가 되기 때문이다. 트랜잭션 속성을 애노테이션에 지정하면 된다. 애노테이션으로 트랜잭션을 지정하는 방법은 유연하면서도 직관적이고 간단해서 애용되는 방법이다. 하지만 일괄적인 패턴에 트랜잭션을 적용할 때는 포인트컷을 사용하는 것이 더 경제적이고 빠뜨릴 위험도 적을 것.. 2023. 4. 20.
TransactionInterceptor 적용하기 TransactionInerceptor는 스프링이 제공하는 트랜잭션 경계설정 어드바이스이다. 프록시로 동작하므로 타깃이 호출될 때 트랜잭션을 시작해서 부가기능을 적용한다. TransactionInerceptor는 트랜잭션 정의를 메소드 이름 패턴을 이용해서 다르게 지정할 수 있는 방법을 제공한다. 트랜잭션 정의 TransactionDefinition 인터페이스는 트랜잭션의 동작방식에 영향을 줄 수 있는 네 가지 속성을 정의한다. 트랜잭션 전파 : 트랜잭션 실행 도중에 독자적인 트랜잭션을 가진 코드를 실행해야할 때 어떤 영향을 미치게 할 것인지 결정한다. PROPAGATION_REQUIRED : 이미 진행중인 트랜잭션이 있으면 참여한다. PROPAGATION_REQUIRES_NEW : 새로 시작한다. PR.. 2023. 4. 20.
스프링 AOP 요약 : 부가기능은 핵심기능에 강하게 의존하므로 OOP의 객체 DI 방식으로는 중복을 완벽하게 제거할 수 없다. 그래서 관점(부가기능)을 중심으로 프로그래밍하는 AOP를 도입하여 부가기능을 완벽하게 모듈화했다. 스프링 AOP는 프록시를 사용하여 타깃 메소드가 호출되는 순간에만 부가기능을 적용하다록 만들었다. 프록시를 사용하면 별다른 설정 없이 스프링 컨테이너와 JDK 프록시만으로도 처리가 가능하기 때문이다. 5장부터 6장까지 트랜잭션 코드를 서비스 코드로부터 완벽하게 분리하는 방법을 알아보았다. 그 결과 트랜잭션 코드는 어떠한 서비스에도 중복 없이 적용될 수 있게 되었다. 이 과정에서 다이나믹 프록시, 빈 후처리기 등과 같은 다양한 기술을 사용했다. 목표는 중복 제거와 변경 유연성 목표는 핵심기능에 부여.. 2023. 4. 20.
트랜잭션 코드 분리를 위한 개선 과정 : 프록시, 다이나믹 프록시, 팩토리 빈, 빈 후처리기, 포인트컷 목표 서비스의 트랜잭션 코드 분리. 확장 가능한 설계를 고려하여 서비스나 부가기능이 늘어나더라도 코드 변경을 최소화할 것 개선 과정 Step1 : 서비스에 데코레이터 적용 서비스의 트랜잭션 코드를 분리하기 위해 데코레이터 패턴을 적용하여 프록시를 만듦. 이때 프록시는 클라이언트와 타깃 사이에서 요청을 중개하며 기능 위임과 부가기능을 적용할 메소드를 선택하고 부가기능을 적용하는 역할을 한다. 프록시를 코드로 직접 생성하면 기능위임 코드를 일일이 작성해야하고, 부가기능 코드가 메소드와 타깃마다 반복된다. Step2 : 다이나믹 프록시로 변경 프록시 클래스를 코드로 작성해서 발생한 문제이므로 런타임 시점에 동적으로 프록시 클래스를 만드는 방법을 적용한다. 다이나믹 프록시는 리플렉션으로 생성한다. 리플렉션을 사.. 2023. 4. 20.
Step5. 자동 프록시 생성기와 포인트컷 표현식 개선 목표 스프링 팩토리 빈을 사용하여 타깃과 부가기능의 조합마다 Handler 클래스가 만들어지던 문제를 해결했다. 하지만 빈 설정 정보에는 타깃과 어드바이저 조합마다 설정이 중복된다. 어드바이저 등록 설정은 똑같은데 타깃만 달라지는 설정 정보 중복이 발생하는 것이다. 설정 중복을 제거하기 위해 팩토리 빈을 스프링 빈으로 등록하는 방법이 아닌 자동 프록시 생성기를 만드는 방법을 선택한다. transactionAdvisor 빈 후처리기 빈 후처리기는 스프링에 제공하는 확장 포인트다. 빈 후처리기를 빈으로 동록하여 사용한다. 빈 오브젝트가 생성될 때마다 빈 후처리기에 보내서 후처리 작업을 요청한다. 프록시에 적용하려면 빈 오브젝트가 생성될 때마다 빈 후처리기가 프록시 적용 여부를 판단하고, 프록시를 생성하.. 2023. 4. 20.
Step4. JDK 팩토리 빈을 추상화하는 스프링 팩토리 빈 스프링의 프록시 팩토리 빈 지금까지 알아본 프록시 생성 방법은 JDK가 제공하는 방법이다. JDK가 제공하는 프록시 팩토리 빈을 사용하면 InvokeHandler 구현 클래스가 기능 위임과 부가기능 적용 메소드 판별, 부가기능 수행 등 여러 책임을 가진다. 변경의 이유가 여러가지기 때문에 쉽게 변경되고, 확장에도 불리하다. 앞에서 살펴본 바로는 타깃에 따라 부가기능이 달라지면 새로운 InvokeHandler가 필요해서 중복 문제가 발생했다. 그렇다면 기능 위임과 부가기능 메소드 판별, 부가기능 수행이라는 책임을 각기 다른 객체에 할당하고, 서로 협력해서 다이나믹 프록시를 생성하도록 만들면 되지 않을까? 특히 부가기능 책임을 가진 객체를 타깃이라는 구현으로부터 분리해서, 다양한 타깃과 협력할 수 있도록 재.. 2023. 4. 11.