JavaBookStudy / JavaBook

책읽기 스터디
https://javabookstudy.github.io/
Apache License 2.0
19 stars 2 forks source link

[토비의 스프링] 7.5.3_트랜잭션을 적용할 때 AOP를 이용하는 방법? #130

Closed kjsu0209 closed 2 years ago

kjsu0209 commented 2 years ago

642p 두 번째 문단에 트랜잭션 경계가 DAO 밖에 있고 범위가 넓은 경우라면 AOP를 이용하는 것이 편리하다고 나와 있습니다.

쇼핑몰 시스템에서 장바구니, 주문정보에 접근하는 DAO 두 개가 있고, 장바구니 상품 결제 시 주문정보를 생성 후 장바구니에 등록된 것 중 결제한 상품은 삭제하는 기능을 예시로 들겠습니다. 주문정보 생성과 장바구니 상품 삭제는 한 트랜잭션 안에서 이루어져야 하니 책에서 말하는 AOP 적용 대상이 될 것 같은데 구체적으로 어떻게 적용하는 걸까요?

kjsu0209 commented 2 years ago

6.6의 트랜잭션 속성 내용을 보면 AOP로 트랜잭션 설정을 지정한다는 것을 알 수 있습니다. DAO에 접근하는 두 메서드의 트랜잭션 전파를 PROPAGATION_REQUIRED로 하고, 이 두 메서드를 호출하는 메서드에도 트랜잭션을 사용하도록 해 주면 두 개의 트랜잭션이 하나로 합쳐지게 됩니다.

AOP라고 하면 프록시부터 생각나는데 642p에서 얘기한 건 프록시를 직접 만드는 게 아니라 트랜잭션이랑 관련된 것 같기도 합니다.. 🤔

kjsu0209 commented 2 years ago

644p 리스트 7-81을 보면 트랜잭션 템플릿을 이용해서 트랜잭션 기능을 적용하는 코드가 나옵니다.

TransactionTemplate.execute()의 인자로 TransactionCallbackWithoutResult를 구현한 것을 넘겨 주는데, 이때 구현하는 doInTransactionWithoutResult 메서드 안에 트랜잭션 경계 안에서 동작할 코드를 넣어 주면 됩니다.

daebalprime commented 2 years ago

코드는 책에서 찾아보셨을 테니 트랜잭션이 AOP 프록시로 적용하면 좋은 이유에 대해 recap 하고자 합니다.

  1. 기존의 트랜잭션부터 실제 DB에 쓰이는 로직까지 하나의 메서드 내에 모두 구현되었던 원시적인 코드에서
  2. 중복을 피하기 위해 해당 트랜잭션 코드를 분리하여 프록시 팩토리 빈으로 구현을 분리하였습니다.
  3. 포인트 컷을 이용하여 부가기능(여기서는 트랜잭션)을 적용할 대상을 선정하여 프록시를 통해 부여합니다.

근데 644p 코드를 살펴보면 직접 트랜잭션을 수행하는 로직이 업데이트를 하는 비즈니스 로직과 합쳐져 있는건 좀 혼란스럽네요. AOP를 따로 적용한건 아닌듯 싶습니다..

kjsu0209 commented 2 years ago

TransactionTemplate.execute()는 트랜잭션을 수행하는 로직보다는 '이 안에 있는 콜백 코드는 트랜잭션이 적용된다`는 의미에 더 가까운 것 같습니다.

말씀하신 것처럼 AOP는 안 쓰는 것 같네요.. EmbeddedDbSqlRegistry는 트랜잭션 매니저를 공유할 필요가 없다고 하니까요.