Closed kjsu0209 closed 2 years ago
6.6의 트랜잭션 속성 내용을 보면 AOP로 트랜잭션 설정을 지정한다는 것을 알 수 있습니다. DAO에 접근하는 두 메서드의 트랜잭션 전파를 PROPAGATION_REQUIRED로 하고, 이 두 메서드를 호출하는 메서드에도 트랜잭션을 사용하도록 해 주면 두 개의 트랜잭션이 하나로 합쳐지게 됩니다.
AOP라고 하면 프록시부터 생각나는데 642p에서 얘기한 건 프록시를 직접 만드는 게 아니라 트랜잭션이랑 관련된 것 같기도 합니다.. 🤔
644p 리스트 7-81을 보면 트랜잭션 템플릿을 이용해서 트랜잭션 기능을 적용하는 코드가 나옵니다.
TransactionTemplate.execute()
의 인자로 TransactionCallbackWithoutResult
를 구현한 것을 넘겨 주는데, 이때 구현하는 doInTransactionWithoutResult
메서드 안에 트랜잭션 경계 안에서 동작할 코드를 넣어 주면 됩니다.
코드는 책에서 찾아보셨을 테니 트랜잭션이 AOP 프록시로 적용하면 좋은 이유에 대해 recap 하고자 합니다.
근데 644p 코드를 살펴보면 직접 트랜잭션을 수행하는 로직이 업데이트를 하는 비즈니스 로직과 합쳐져 있는건 좀 혼란스럽네요. AOP를 따로 적용한건 아닌듯 싶습니다..
TransactionTemplate.execute()
는 트랜잭션을 수행하는 로직보다는 '이 안에 있는 콜백 코드는 트랜잭션이 적용된다`는 의미에 더 가까운 것 같습니다.
말씀하신 것처럼 AOP는 안 쓰는 것 같네요.. EmbeddedDbSqlRegistry
는 트랜잭션 매니저를 공유할 필요가 없다고 하니까요.
642p 두 번째 문단에 트랜잭션 경계가 DAO 밖에 있고 범위가 넓은 경우라면 AOP를 이용하는 것이 편리하다고 나와 있습니다.
쇼핑몰 시스템에서 장바구니, 주문정보에 접근하는 DAO 두 개가 있고, 장바구니 상품 결제 시 주문정보를 생성 후 장바구니에 등록된 것 중 결제한 상품은 삭제하는 기능을 예시로 들겠습니다. 주문정보 생성과 장바구니 상품 삭제는 한 트랜잭션 안에서 이루어져야 하니 책에서 말하는 AOP 적용 대상이 될 것 같은데 구체적으로 어떻게 적용하는 걸까요?