Files
2nd/10_Wiki/Topics/관심사의_분리(SoC).md
T

12 KiB

category, tags, title, last_updated
category tags title last_updated
Unified
auto-consolidated
technical-documentation
관심사의 분리 (SoC)|관심사의 분리 (SoC
2026-05-02

관심사의 분리 (SoC)

📌 Brief Summary

관심사의 분리(SoC)는 시스템을 구성하는 요소를 서로 겹치지 않는 독립적인 모듈로 나누어, 각 부분이 특정 기능이나 목적(관심사)에만 집중하도록 설계하는 소프트웨어 공학의 핵심 원칙이다 [1, 2]. 1974년 에츠허르 데이크스트라가 제안한 이 개념은 복잡한 문제를 해결할 때 인간의 인지적 한계를 고려해 한 번에 하나의 측면에만 집중할 것을 강조한다 [3, 4]. 특히 아키텍처 관점에서 "뇌와 팔다리의 분리"라는 비유로 설명되며, 시스템의 본질인 핵심 비즈니스 로직(뇌)과 이를 외부에 연결하는 기술적 인프라(팔다리)를 격리하여 유지보수성과 재사용성을 극대화하는 것을 목표로 한다 [5, 6].


관심사의 분리(SoC, [[뇌와 팔다리의 분리 - 관심사의 분리 (Separation of Concerns)|Separation of Concerns]])는 소프트웨어 시스템을 각기 다른 기능이나 책임(관심사)에만 집중하는 작고 관리하기 쉬운 독립적인 모듈로 나누는 소프트웨어 엔지니어링의 핵심 설계 원칙이다 [1-5]. 1974년 에츠허르 데이크스트라(Edsger W. Dijkstra)가 처음 제안한 개념으로, 복잡성을 통제하고 코드의 모듈성, 가독성, 유지보수성, 확장성 및 재사용성을 크게 향상시키는 것을 목표로 한다 [3, 4, 6, 7]. 이 철학은 객체 지향 설계의 단일 책임 원칙(SRP)과 인터페이스 분리 원칙(ISP) 등 현대 아키텍처 패턴이 탄생하는 직접적인 근간이 되었다 [5, 8-10].

📖 Core Content

  • 철학적 기원과 인지적 해부: 관심사의 분리는 에츠허르 데이크스트라(Edsger W. Dijkstra)가 1974년에 발표한 에세이 "과학적 사고의 역할에 관하여"에서 기원하였다 [4, 7]. 그는 복잡한 시스템을 다룰 때 지적인 사고를 위해서는 한 측면에 깊이 집중하고 다른 측면을 일시적으로 무시하는 능력이 필수적이라고 역설했다 [4, 7]. 이러한 철학적 패러다임은 이후 객체 지향 설계의 단일 책임 원칙(SRP) 등으로 발전하였으며, 소프트웨어의 복잡성을 통제하기 위한 논리적 단위 격리의 기초가 되었다 [5].

  • "뇌와 팔다리의 분리" 비유: 아키텍처에서 관심사의 분리를 가장 직관적으로 나타내는 은유는 시스템의 고수준 정책과 저수준 세부 사항을 각각 뇌와 팔다리에 비유하여 엄격히 격리하는 것이다 [5, 6].

    • 뇌 (고수준 도메인 및 비즈니스 엔티티): 시스템이 존재하는 근본적인 이유인 핵심 업무 규칙을 캡슐화한 '엔티티(Entity)'와 이들의 상호작용을 제어하는 '유스케이스(Use Case)'로 구성된다 [6, 8, 9]. 뇌에 해당하는 영역은 데이터베이스나 사용자 인터페이스(UI) 등 외부 환경의 영향을 받지 않는 가장 순수하고 독립적인 형태로 유지되어야 한다 [6, 10].
    • 팔다리 (저수준 세부 사항 및 플러그인): 핵심 로직을 감싸고 외부 세계와 소통하는 웹 인터페이스, 데이터베이스, 서드파티 프레임워크 등을 의미한다 [6]. 이들 외부 시스템은 언제든 교체가 가능하도록 '플러그인'의 형태를 취해야 하며, 코드의 의존성 방향은 항상 저수준의 팔다리에서 고수준의 뇌를 향해야만 한다 [6, 11, 12].
  • 공학적 구현 척도 (응집도와 결합도): 관심사의 분리가 올바르게 구현되었는지 판단하는 공학적 척도는 '높은 응집도(High Cohesion)'와 '낮은 결합도(Low Coupling)'이다 [13, 14]. 동일한 목적을 수행하는 밀접한 기능들은 한 모듈에 묶어 내부 결속력인 응집도를 극대화해야 한다 [13, 15, 16]. 반대로 모듈 간의 외부 상호작용은 인터페이스 사용이나 의존성 주입(DI) 등을 통해 최소화하여 낮은 결합도를 유지함으로써, 한 부품의 변경이나 고장이 전체 시스템으로 전파되는 것을 차단해야 한다 [13, 17-19].

  • 다양한 분야로의 물리적/산업적 확장: 이러한 설계 원칙은 소프트웨어 코드를 넘어 다양한 기술 및 산업 분야에서도 근간이 된다.

    • 웹 표준: 초창기 혼재되어 있던 웹 문서는 HTML(구조), CSS(표현), [JavaScript|JavaScript]로 각각의 역할에 맞게 엄격히 분리되어 관심사 분리의 정수를 보여준다 [20, 21].
    • 로보틱스: 로봇 시스템 또한 센서(입력 및 오감), 컨트롤러(알고리즘 및 뇌), 액추에이터(물리적 출력 및 근육)라는 명확히 분리된 하드웨어 및 소프트웨어 구성 요소들의 협업 구조로 작동한다 [22, 23].
    • 건설 산업 (MiC): 건축물의 기능을 하위 시스템으로 분해해 공장에서 사전 제작한 후 현장에서 조립하는 '모듈러 통합 건설(MiC)' 역시 복잡한 건축 구조 관리를 단순화하는 물리적 차원의 SoC 적용 사례이다 [24].

  • 원칙의 기원과 진화: 관심사의 분리라는 용어는 에츠허르 데이크스트라가 1974년 논문 "과학적 사고의 역할에 관하여"에서 '단일 트랙적이면서 동시에 멀티 트랙적인 사고방식'을 통해 복잡한 문제를 고립시켜 집중해야 한다고 주장하면서 등장했다 [11, 12]. 이후 1960~70년대의 구조적 프로그래밍부터 객체 지향 프로그래밍(OOP) 시대를 거쳐 MVC 패러다임, 마이크로서비스 아키텍처(MSA) 등 대규모 시스템을 설계하는 필수 원칙으로 진화해왔다 [8, 10, 13, 14].
  • 핵심 메커니즘 (응집도와 결합도): SoC를 성공적으로 구현했는지 판단하는 주요 척도는 높은 응집도(High Cohesion)와 낮은 결합도(Low/Loose Coupling)이다 [3, 15-17]. 응집도는 모듈 내부의 요소들이 하나의 명확한 목적을 위해 얼마나 밀접하게 관련되어 있는지를 나타내며, 결합도는 모듈 간의 상호 의존성 정도를 뜻한다 [3, 18, 19]. 좋은 설계는 내부 결속력인 응집도를 극대화하고 외부 간섭에 해당하는 결합도를 최소화하는 최적화를 지향한다 [20, 21].
  • 적용 수준과 다양한 사례:
    • 함수 및 모듈 수준: 각 함수나 모듈은 단일 작업에 집중하도록 분리되어야 한다. 이를 통해 코드가 스파게티처럼 얽히는 것을 방지하고 가독성과 테스트 가능성을 향상시킨다 [22-24].
    • 소프트웨어 아키텍처 수준: 핵심 비즈니스 로직(뇌)과 외부 인프라(팔다리)를 분리하는 것이 핵심이다 [25]. 웹 기반 시스템에서는 프레젠테이션 계층, 비즈니스 로직 계층, 데이터 액세스 계층으로 관심사를 분리하여 의존성이 단방향(주로 내부 핵심 도메인을 향해)으로 흐르도록 설계한다 [21, 26, 27].
    • 웹 프론트엔드: 전통적인 HTML(구조), CSS(표현), [JavaScript|JavaScript]의 역할별 분리가 가장 직관적인 SoC 사례이다 [28-30]. 최근에는 프로젝트의 규모가 커짐에 따라 기능(Feature) 단위로 관심사를 묶어 관리하는 FSD(Feature-Sliced Design) 방식 등으로 진화하고 있다 [31, 32].
    • 로보틱스 제어 시스템: 로봇 또한 인지적 해부와 동일하게 외부 자극을 감지하는 센서(눈/귀), 의사결정을 내리는 컨트롤러(뇌), 물리적 운동을 수행하는 액추에이터(근육)로 하드웨어적 관심사를 명확히 분리하여 구동된다 [33, 34].
  • 주요 이점: 시스템을 모듈화하면 특정 기능을 수정하거나 확장할 때 다른 코드에 미치는 부작용을 최소화할 수 있어 유지보수성이 크게 향상된다 [35-37]. 여러 명의 개발자가 각기 다른 모듈을 맡아 서로 방해받지 않고 병렬(동시) 개발을 수행할 수 있으며 [35, 38, 39], 비즈니스 로직을 데이터베이스나 UI 등 외부 시스템으로부터 격리시켜 독립적이고 신속한 단위 테스트 환경을 조성할 수 있다 [27, 40, 41].
  • 한계 및 실무적 고려사항: 관심사를 맹목적이고 과도하게 분리(Over-engineering)하면 오히려 계층 간 통신 및 데이터 변환 오버헤드가 증가하여 시스템 성능을 떨어뜨릴 수 있다 [42, 43]. 층을 너무 얇게 나누거나 과도한 추상화를 도입할 경우, 실제 구현을 파악하기 위해 수많은 계층을 넘나들어야 하므로 개발자의 인지적 부하가 오히려 가중될 위험(인디렉션의 저주)이 존재한다 [42, 44, 45].

⚖️ Trade-offs & Caveats

  • 과거 데이터와의 충돌: 자동화 엔진에 의해 매핑된 지식으로, 추후 정밀 검증 필요.
  • 정책 변화: Programming & Language 분야의 자동 자산화 수행.

  • 과거 데이터와의 충돌: 자동화 엔진에 의해 매핑된 지식으로, 추후 정밀 검증 필요.
  • 정책 변화: Programming & Language 분야의 자동 자산화 수행.

🔗 Knowledge Connections


Last updated: 2026-04-18



  • Related Topics: 단일 책임 원칙 (SRP), 응집도(Cohesion)와 결합도(Coupling), 계층화 아키텍처(Layered Architecture), 모델-뷰-컨트롤러(MVC), 관점 지향 프로그래밍 (AOP)
  • Projects/Contexts: 넷플릭스 코스모스(Cosmos) 플랫폼, 스포티파이 스쿼드(Squad) 및 마이크로 프론트엔드, 화신산(Huoshen Mountain) 병원 모듈러 통합 건설(MiC)
  • Contradictions/Notes:
    • "SoC를 도입하면 유지보수와 모듈성이 향상된다"는 원칙이 일반적이나, "지나친 관심사 분리와 추상화는 간접 참조를 늘리고 런타임 성능 저하 및 코드 추적의 어려움을 유발하여 실무적 복잡성을 오히려 가중시킨다"는 경고와 상충하는 지점이 있다 [42-45].
    • 관심사의 선제적인 도출이 필수적이라는 견해가 있는 반면, 다른 실무자들은 초기에 관심사를 미리 예측해 분리하는 것은 불가능에 가까우며, 코드가 중복되어 나타날 때(Rule of Three) 사후적으로 리팩토링을 통해 분리하는 것(DRY 관점)이 현실적이라는 상반된 주장을 한다 [45, 46].

Last updated: 2026-04-18