스프링 이벤트를 활용하여 서로 다른 서비스 간의 의존성 줄이기

Louie·2023년 3월 1일
0

프로젝트

목록 보기
1/6

서론

이벤트를 통해 프로젝트 코드를 리팩터링한 과정을 정리해보겠습니다.

리팩터링 전

현재 제 프로젝트에는 위 사진과 같이 게시글이 등록되면 해당 게시글에 대한 키워드 알림과 마감 알림을 생성합니다. 해당 기능을 아래와 같은 코드로 구현했습니다.

// BoardService.class
public class BoardService {

	private final KeywordNotifiactionService keywordNotifiactionService;
	private final DeadlineNotifiactionService deadlineNotifiactionService;
		
	public void register() {
		// 게시글 등록 로직(생략)
		
	    // NotificationService의 키워드 알림 생성 메서드 호출
	    keywordNotifiactionService.createKeywordNotification();
		
	    // NotificationService의 마감 알림 생성 메서드 호출
		deadlineNotifiactionService.createDeadlineNotification();
	}
}

게시글 등록 메서드에 키워드 알림과 마감 알림을 생성하는 코드를 볼 수 있습니다. 만약 게시글 등록 이후에 추가로 실행되어야 하는 로직이 많아질수록 게시글 등록 메서드는 더 많은 책임을 지게 되고 서로 다른 서비스 간의 의존성이 강해집니다.

리팩터링 후

게시글 등록 메서드의 로직을 아래와 같이 리팩터링 했습니다.

public class BoardService {

	private final ApplicationEventPublisher publisher;
		
	public void register() {
	    // 게시글 등록 로직(생략)
		
		// 게시글 등록 이벤트 발행
		publisher.publishEvent(new BoardRegisterEvent());
	}
}

그리고 @EventListener를 통해 게시글 생성 이벤트가 발생하는 경우 키워드 알림과 마감 알림 생성 로직을 실행하도록 구현했습니다.

public class NotificationEventListener {

    @EventListener
    public void registerKeywordNotification(BoardRegisterEvent event) {
        // 키워드 알림 생성 로직 
    }

    @EventListener
    public void registerDeadlineNotification(BoardRegisterEvent event) {
        // 마감 알림 생성 로직 
    }

}

이벤트를 적용하고 아래 사진과 같은 의존 관계를 지니게 되었습니다.

리팩터링 전에는 게시글 등록 메서드에서 키워드 알림과 마감 알림에 대해 의존하고 있었지만 리팩터링 후에는 게시글 등록 메서드가 오직 게시글 등록과 게시글 등록 이벤트를 발행하는 책임만 담당하게 되었습니다.

또한 BoardService에서 서로 다른 서비스(KeywordNotificationService와 DeadlineNotificationService)에 대해 의존할 필요가 없어졌습니다.

이렇게 이벤트를 사용해서 서로 다른 서비스 간의 의존성을 줄일 수 있었습니다!

profile
백엔드 개발자를 준비하고 있는 Louie입니다.

0개의 댓글