Spring

Facade Layer 도입하게 된 이유

leeheefull 2022. 2. 16. 14:40

이번에 게시물 서비스를 구현하면서 두 번의 시행착오를 겪고 퍼사드 레이어를 도입하게 됐습니다. 어떤 이유인지 예제 코드로 문제점을 확인하여 설명하겠습니다.

 

회원과 게시판, 게시글의 연관 관계

회원과 게시판, 게시글의 연관 관계

 

위처럼 Post를 생성할 때는 Member의 정보와 Board의 정보가 필요합니다. 이것을 고려하여 Post를 생성해 보겠습니다.

 

 

 

Repository를 주입하여 Post 생성하기

https://user-images.githubusercontent.com/58816862/154196171-0c12b72a-0ebf-448b-8075-18caab860b55.png

 

PostService에서 다른 도메인의 레포지토리를 주입하여 구현했습니다.

 

이것은 PostService의 역할과 책임을 적절하게 나누지 못한 케이스입니다. 결국에 위의 코드처럼 레포지토리를 주입하는 곳마다 똑같은 로직을 구현해야 하는 문제가 발생하게 됩니다. 그래서 각 도메인의 레포지토리는 각 서비스에서 구현해야 합니다.

 

그렇다면, PostService에서 다른 도메인의 서비스를 주입하여 구현해 보겠습니다.

 

 

 

Service 주입하여 Post 생성하기

https://user-images.githubusercontent.com/58816862/152724459-53089260-8277-4618-8744-4931153bd86d.png

 

위 코드처럼 PostService에서 BoardService를 주입하면, 결국 BoardService에서도 PostService를 주입하게 되는데, 그러면 아래와 같은 문제가 발생하게 됩니다.

 

https://user-images.githubusercontent.com/58816862/154199176-bf978b9c-96d0-44b7-83e4-24bf8d1b89fd.png

 

스프링 빈의 종속성 순환 참조 에러인데, 서비스가 서로 참조하고 있기 때문에 발생한 에러입니다.

 

그래서 생각한 방법이 퍼사드 레이어이고, 이를 이용하여 위와 같은 문제들을 해결할 수 있었습니다.

 

그렇다면, 먼저 퍼사드 패턴에 대해 설명하겠습니다.

 

 

 

퍼사드 패턴

롯데 타워의 외부와 내부

롯데 타워의 외부와 내부

 

퍼사드란 직역하면 건물의 정면이라는 뜻이라고 합니다. 건물을 생각해보면, 건물 내부에는 많은 구조물들이 있는데, 실제 외부에서 보이는 것은 건물 외부 모습뿐입니다.

 

퍼사드 패턴이란, 어떠한 소프트웨어의 복잡하고 양이 많은 라이브러리를 한 번에 관리하여 간단한 인터페이스를 제공하는 것입니다.

 

간단한 예제를 통해서 설명해보겠습니다.

 

 

롯데 타워 프로그램이 있고 롯데 타워에서 연인이 데이트를 한다고 가정할 때, 안에 있는 매장들을 이용하는 프로그램을 퍼사드로 구현해보겠습니다.

 

Class diagram

Class diagram

 

우선, 롯데 타워 안에 있는 매장들을 구현합니다.

 

스타벅스 서비스

스타벅스 서비스

 

구찌 서비스

구찌 서비스

 

롯데시네마 서비스

롯데시네마 서비스

 

매드 포 갈릭 서비스

매드 포 갈릭 서비스

 

롯데 타워에서 데이트를 하기 위해서는 위의 각 서비스 코드를 사용해야 하는데, 이를 한 번에 묶어주는 퍼사드 객체를 이용하면 간단하게 사용할 수 있습니다.

 

퍼사드

퍼사드

 

이렇게 퍼사드 객체에 필요한 서비스를 주입하여 간단하게 사용할 수 있는 것이 퍼사드 패턴입니다. 이것을 응용하여 실제 프로젝트에 적용해 보겠습니다.

 

 

 

적용

PostFacade

PostFacade

 

PostService

PostService

 

위처럼 PostFacade를 구현해 보았습니다. 훨씬 코드가 직관적으로 보이게 됐고 기존의 문제점들을 보완할 수 있게 되었습니다. 또한, 각 비즈니스 로직을 퍼사드 레이어에서 사용함으로써 추후의 동기 처리나 이벤트성 메서드를 처리 하기에 유리한 조건이 되었습니다.

 

 

 

이상입니다. 수정 사항이나 피드백이 있으시다면 편하게 댓글 부탁드리겠습니다. 글 읽어 주셔서 감사합니다