본문 바로가기
Spring

[Spring] Spring Facade Pattern

by 도전하는 린치핀 2024. 5. 18.

1. Facade 패턴이란?

포스팅에 앞서, Spring Boot에서는 Bean이 Controller, Service, Repository를 어노테이션만으로 알아서 의존성을 주입해주는 좋은 기능을 가지고 있다.

그렇다면 우리가 개발을 진행하면서 하나의 Controller가 하나의 Service를 참조하고, 하나의 Service는 하나의 Repository만 참조해가면서 간단하게 데이터만 반환하는 상황만 있을까??

 

간단한 기능을 만들면서도 확인한 결과 절대 아니다. 왜냐하면 하나의 데이터(DTO로 변환해서)를 반환할 때도 여러 엔티티를 참조해서 상황에 맞는 데이터를 잘 조립해서 반환해야 했기 때문이었다.

 

Service 레이어에서 Repository를 너무 많이 의존하고 여러 엔티티를 통해 데이터를 가져온다는 것은 유지보수가 어렵고 좋지 못한 코드인 응집도가 낮은 상태가 되어버린다.

이에 더해 Service가 서로를 의존해버린다면(참조해버리면) 서로 순환 참조가 일어나면서 문제가 발생할 가능성이 커진다.

 

그렇다면 Facade 패턴이라는 것은 무엇일까?

Facade의 기본 개념은 "건물의 정면"을 의미로 어떤 소프트웨어의 다른 커다란 코드 부분에 대하여 간략화된 인터페이스를 제공해주는 디자인 패턴을 의미한다.

즉, 쉽게 말하자면 여러 개의 복잡한 의존 관계를 가진 계층들에 추가적인 계층을 만들어 관계를 간략하게 만들었다고 생각하면 될 것 같다.

2. Facade 패턴 사용 이유

내가 Facade 패턴을 사용했던 이유를 간략하게 적어본다면 아래와 같다.

  • 복잡한 서브시스템을 대신하여 관계를 연결해줄 수 있는 단순하고 일관된 인터페이스를 제공해주는 역할
  • 상위 계층에서 서브 시스템의 기능들을 직접 사용하지 않고, 단순한 형태로 통한된 메소드를 호출하여 코드의 응집도를 낮춘다.
  • 상위 계층 및 여러 계층에서 다뤄야 하는 객체 수가 줄어들어 쉽게 객체들의 기능들을 사용할 수 있다.
  • 코드의 결합도를 낮추고 응집도를 높여 유지보수가 편해지고 코드의 가독성이 높아진다.
  • 사용되었던 하위 계층의 메소드가 변경되어도 실제 사용하는 코드에는 변경이 없다.

즉, 하나의 시스템에서 여러 개의 빈을 참조하며 관계가 복잡해지면서 서로의 의존 관계가 순환 참조가 일어나거나 코드의 결합도가 높아지고 응집도가 낮아질 때, 중간에 하나의 계층을 추가하여 관계를 간단하게 만들고 응집도를 높여 코드나 구조의 가독성을 높일 때 사용하면 된다.

 

3. 결론

Spring boot 에서 Bean을 통해서 굉장히 간편하게 계층을 분리하고 기능들을 사용했지만 점점 관계가 복잡해지면서 뭔가 본능적으로 "이렇게 많은 Repository를 참조해도 된다고,,,?" 나 "이 서비스에서 다른 서비스를 참조해도 되나,,,?"에 대한 걱정이 생겼었다. 근데 Facade 패턴이라는 것을 알게 되어 생각보다 간편하게 계층을 나누고 응집도를 낮출 수 있어 머리에서 번개가 쳤었다.

역시 어떤 기능에 대해서 알고 모르고의 차이가 문제를 해결할 때 굉장히 어렵게 돌아가거나 쉽게 문제를 해결하거나의 차이인 것 같아서 다시 한번 공부를 열심히 하고 아직 배울 것이 한참 많구나 라는 생각을 하게 되었다.

 

 

+ 추가적으로 기회가 된다면 직접 Facade 패턴을 사용한 코드를 예시로 블로그를 한번 더 작성해야겠다.

 

더보기