
지난주에는 계층형 설계의 기본 구조와 직접 구현 패턴에 대해 이야기했었다.
이번엔 그 흐름을 이어서,
코드를 더 명확하고 안전하게 만들기 위한
세 가지 설계 패턴을 정리해보려고 한다!
1️⃣ 추상화의 벽 (Abstraction Barrier)
상위 계층은 하위 계층의 구현 세부사항을 몰라도 동작할 수 있어야 한다는 원칙
즉, 하위 함수가 어떻게 작동하는지는 몰라도,
“그 기능이 어떤 의미를 갖는지만 알고” 사용할 수 있어야 한다.
📌 예시
function getActiveUsers(users) {
return users.filter(user => user.active);
}
function getUserEmails(users) {
const active = getActiveUsers(users); // ✅ 의미만 보고 사용
return active.map(user => user.email);
}
✅ 여기서 getUserEmails()는
filter()를 쓴다거나, user.active를 검사한다는 사실을 몰라도 된다.
이게 바로 추상화의 벽이 잘 세워진 구조
2️⃣ 작은 인터페이스 (Narrow Interface)
함수나 모듈은 꼭 필요한 정보만 받아야 한다는 원칙
불필요하게 큰 데이터 구조를 통으로 넘기면,
의존성은 커지고 테스트나 변경이 어렵다.
📌 예시
// ❌ Bad: 모든 user를 넘김
function updateUser(user) {
user.updatedAt = Date.now();
}
// ✅ Good: 필요한 값만 넘김
function updateUser(updatedAt) {
return { updatedAt };
}
✅ 작은 인터페이스를 만들면
함수는 더 독립적이 되고,
변경이 생겨도 파급 효과가 줄어든다.
3️⃣ 편리한 계층 (Convenient Layer)
계층을 너무 강력하게 나눌 필요가 없다
만약 작업하는 코드가 편리하다고 느끼면 설계는 멈춰!
화살표가 너무 길거나, 다른 계층과 섞여도 사용하기 편하다면 설계를 멈추자
tip 호출그래프

함수들이 서로 어떻게 호출하고 연결되어 있는지를 시각적으로 표현한 그래프
각 함수는 노드으로, 함수 호출 관계는 화살표로 표시
그래서 이걸 보면 프로그램의 흐름과 계층 구조를 한눈에 이해할 수 있다.
호출 그래프는 단순히 시각화 용도가 아님,
설계가 잘 되어 있는지, 계층 간 의존성이 깨지지는 않았는지를 확인하는 역할을 가진다.
🔷 호출 그래프의 비기능적 요구사항
1️⃣ 유지보수성
계층 간 의존 구조가 명확하면,
위로 연결된 것이 적은 함수 일수록 바꾸기 쉽다.
-> 자주 바뀌는 함수는 위에 있어야 한다.
2️⃣ 테스트 가능성
위로 연결된 것이 많은 함수를 테스트 하는 것이 더 가치 있다.
특정 계층만 단독 테스트가 가능하다.
-> 전체 코드에 영향을 주는 코드를 테스트 함으로써 버그 발생률을 낮춘다.
3️⃣ 재사용성
아래쪽에 함수가 적을 수록 재사용하기 좋다.
-> 낮은 수준의 단계의 함수가 재사용성이 높다
🔈
계층 설계 전에는 함수 하나하나를 잘 만드는 것의 중요성에 대해서 설명해왔다.
결국에는 함수들을 어떤 계층에 놓고 조합할지 고민하는 설계의 힘도 중요하다는 것이다.
설계는 거창한 것은 아니다.
함수 하나의 위치에 대해서 고민하고, 지금까지 배운 패턴들을 적용해보면서
복잡했던 코드 속에도 질서가 생기는 것을 느낄수 있지 않을까 생각한다.
사실 스터디에서 일급함수1까지 책은 읽었으나 같이 적기 애매해 다음주에 읽는것과 함께 작성 예정
'FE > BOOK' 카테고리의 다른 글
[함수형코딩]WEEK6 일급함수, 너 뭐 돼? (0) | 2025.04.15 |
---|---|
[함수형코딩]WEEK4 계층형 설계- 직접 구현 (0) | 2025.04.03 |
[함수형코딩]WEEK3 불변성 이야기 (2) | 2025.03.29 |
[함수형코딩]WEEK2 함수형 사고: 더 좋은 액션 만들기 (1) | 2025.03.19 |
[함수형 코딩] WEEK1 액션, 계산, 데이터 (2) | 2025.03.12 |