Skip to content

계층형 설계 II

지난 글에서는 계층형 설계의 직접 구현 패턴을 살펴보았습니다.

이번 글에서는 남은 세 가지 패턴 추상화 벽, 작은 인터페이스, 편리한 계층 을 통해 코드의 유지보수성, 테스트성, 재사용성을 어떻게 높일 수 있는지 알아보겠습니다.

1. 추상화 벽 (Abstraction Barrier)

추상화 벽은 세부 구현을 감춘 함수 계층입니다. 즉, 위 계층에서는 데이터 구조나 로직을 몰라도, 추상화 벽을 통해 필요한 동작만 호출할 수 있습니다.

1.1 장바구니 데이터 구조 바꾸기

예를 들어 장바구니 구조가 배열에서 객체로 바뀐다 해도, 상위 계층에서는 calc_total 같은 추상화 벽 함수만 사용하기 때문에 아무런 수정이 필요 없습니다.

이는 곧 상·하위 계층의 독립성을 보장해 줍니다.

1.2 언제 쓰면 좋을까?

  • 구현을 쉽게 바꾸고 싶을 때
  • 코드를 읽고 쓰기 쉽게 하고 싶을 때
  • 팀 간 협업 비용을 줄이고 싶을 때
  • 문제의 본질에 집중하고 싶을 때

다만, "혹시 몰라서" 불필요하게 벽을 만들면 오히려 복잡성만 늘어나니 필요할 때만 적용하는 것이 좋습니다.

2. 작은 인터페이스

새로운 함수를 추가할 때는 하위 계층에 넣기보다, 최소한의 인터페이스를 유지하는 것이 좋습니다.

예를 들어, 장바구니에 아이템을 담는 add_item 함수 안에 로그 기록 기능을 넣으면 add_item이 단순 계산이 아니라 액션이 됩니다. 그 결과, 상위 계층에서 테스트 목적으로 add_item을 호출했을 때도 불필요한 로그가 남게 됩니다.

따라서 이런 부수효과는 상위 계층에서 다루고, 하위 계층은 계산에만 집중해야 합니다.

👉 즉, 추상화 벽은 작고 단순할수록 좋다는 원칙이 여기서 드러납니다.

3. 편리한 계층

이 패턴은 “얼마나 계층화를 할 것인가”에 대한 실용적인 지침입니다.

  • 코드가 불편하다면, 계층을 나눠 추상화를 적용합니다.
  • 코드가 이미 충분히 편리하다면, 거기서 멈추면 됩니다.

즉, 계층화는 목적이 아니라 도구이며, 항상 "편리함"이 기준이 됩니다.

호출 그래프와 비기능적 요구사항

계층형 설계를 평가할 때는 호출 그래프를 통해 유지보수성, 테스트성, 재사용성 같은 비기능적 요구사항을 살펴볼 수 있습니다.

  • 유지보수성: 상위 계층일수록 변경의 파급 효과가 적으므로, 자주 바뀌는 비즈니스 규칙을 올려야 합니다.
  • 테스트성: 하위 계층은 변화가 적기 때문에 테스트의 가치가 오래 유지됩니다.
  • 재사용성: 범용적으로 쓰일 가능성이 큰 함수는 하위 계층에 두는 것이 효과적입니다.

마무리

이번 글에서는 계층형 설계의 세 가지 패턴을 살펴보았습니다.

  • 추상화 벽: 세부 구현을 숨겨 계층 간 독립성을 높인다.
  • 작은 인터페이스: 불필요한 액션을 배제하고 계산 로직을 단순하게 유지한다.
  • 편리한 계층: 코드가 편리해질 때까지만 계층화를 적용한다.

궁극적으로 이 모든 패턴의 목적은 복잡성을 줄이고, 코드의 수명과 생산성을 높이는 것입니다. 다음에 계층형 설계를 적용할 때는 “이게 지금 편리한가?”라는 질문을 꼭 던져 보시기 바랍니다.