결합도를 낮추는 방법
결합도의 종류 :
자료 결합도 : 인터페이스가 자료요소로만 결합
스탬프 : 인터페이스로 배열 자료구조 형태 전달
제어 결합도 : 논리적인 흐름을 제외
외부 결합도 :외부 모델에서 참조한다
공유 결합도 : 공유되는 공유 데이터 영역이 있음
내용 결합도: 내용이나 내부 자료와 기능등을 참조 (정보처리기사 참조)
모듈간의 결합도는 낮고, 응집도는 높아야한다.
*예시
MemberSignupSevice에서 , memberrepository,couponservice,emailservice등을
모두 주입받으면 어떡할까?
+ 트랜잭션으로 signup이라는 method에서 -> 1.entity 생성, 2. 회원가입 3. coupon 발급을 모두 진행하면,
트랜잭션상 문제가 발생할 수 있다.
또한, 트랜잭션으로 묶여 회원가입시 메일을 보낸다면, 이후 쿠폰 등의 문제가 발생하여 rollback이 되었음에도 불구하고
이미 메일은 전송된 상태일 수 있다.
#TransactionalEventListener를 활용하자 ! + EVENT와, EVENTHANDLER.
transaction이 commit이 진행된 이후에, listener가 작동한다. -> commit되지 않으면, 이후가 진행되지 않는다.
1. 기본적으로, MEMBERSIGNUPSERVICE.
@Transactional으로 signup을 묶었다.
변경한점 1. member,coupon, signup 모두 service를 주입받던 것에서 변경.
일단, signup에 대한 요청이오면, 1. 해당 member를 memberrepository를 활용하여 db에 저장한다.
2. 그 이후 EVENT를 발생시킨다. 해당 EVENT는, 회원가입에 대한 이후 EVENT이다.
(EMAIL을 전송한다)
이렇게 , TRANSACTIONALEVENTLISTENER로 이메일 전송과정을 묶었다.
이제 , 전체 SIGNUP의 TRANSACTION이 완료된 후에야, EMAIL이 전송되게 될 것이다.
쿠폰 SERVICE까지 완료. 어떤 것 하나라도 EXCEPTION이 발생시, EMAIL은 가장 마지막의 순서를 지니므로
작동되지 않을 것이다 .
++추가적으로, 성능적인 문제를 해결시는 @ASYNC로, 트랜잭션을 끊어줄 수 있다.