프로젝트/리팩토링

결합도를 낮추는 방법

임지혁코딩 2024. 1. 21. 14:56

결합도의 종류 : 

 

자료 결합도 : 인터페이스가 자료요소로만 결합 

스탬프 : 인터페이스로 배열 자료구조 형태 전달

제어 결합도 : 논리적인 흐름을 제외 

외부 결합도 :외부 모델에서 참조한다 

공유 결합도 : 공유되는 공유 데이터 영역이 있음

내용 결합도: 내용이나 내부 자료와 기능등을 참조 (정보처리기사 참조)

 

 모듈간의 결합도는 낮고, 응집도는 높아야한다. 

 

*예시 

 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을 전송한다) 

 

그 EVENT.

 

이렇게 , TRANSACTIONALEVENTLISTENER로 이메일 전송과정을 묶었다.

이제 , 전체 SIGNUP의 TRANSACTION이 완료된 후에야, EMAIL이 전송되게 될 것이다. 

 

쿠폰 SERVICE까지 완료. 어떤 것 하나라도 EXCEPTION이 발생시, EMAIL은 가장 마지막의 순서를 지니므로

작동되지 않을 것이다 . 

 

++추가적으로, 성능적인 문제를 해결시는 @ASYNC로, 트랜잭션을 끊어줄 수 있다.