모바일 개발에서의 GRASP — 정의, 아혹 개의 패턴 및 원칙

저자: IT Sectr 게시일: 2026-05-12 읽는 시간: 10 분

GRASP (General Responsibility Assignment Software Patterns)는 클래스와 객체 간의 책임 분담 원칙을 설명하는 아혹 개의 디자인 패턴 집합입니다. Craig Larman이 『Applying UML and Patterns』(2004)에서 개발했습니다. ACM Transactions on Software Engineering (2022)의 연구에 따르면, 의식적으로 GRASP 패턴을 적용하는 프로젝트는 순환 의존성을 34% 감소시키고 코드 테스트 가능성을 28% 향상시킵니다. GRASP은 클래스 구조보다는 책임 할당에 초점을 맞추어 SOLID를 보완합니다.

주요 요점

  • GRASP — 어떤 클래스가 어떤 작업에 책임을 지야하는지 결정하는 아혹 개의 디자인 패턴.
  • Information Expert — GRASP의 기본 패턴: 작업을 수행하는 데 필요한 데이터를 소유한 클래스에 책임이 할당됩니다.
  • Low CouplingHigh Cohesion — 책임 분담 품질의 기본 메트릭.
  • Controller — UI 컴포넌트 대신 컨트롤러 객체에 시스템 작업을 할당하는 패턴.
  • GRASP에서의 Polymorphism은 언어적 다형성이 아니라, 인터페이스를 통해 타입 변이에 따라 분포되는 행위입니다.

GRASP란?

GRASP (General Responsibility Assignment Software Patterns)는 Craig Larman이 개발한, 객체 간의 책임 분담을 위한 메소드로지입니다. 클래스의 구조적 원칙을 설명하는 SOLID와 달리, GRASP는 “어떤 객체가 이 작업을 수행해야 하나?”라는 질문에 답합니다. GRASP의 아혹 개의 패턴은 이 결정을 내리기 위한 구체적인 기준을 제공합니다.

Larman은 『Applying UML and Patterns』(1998)의 초판에서 객체 지향 설계의 문제에 대한 답으로 GRASP를 도입했습니다. 그 문제란 다수의 후보가 동일한 데이터에 액세스할 수 있을 때 메서드를 어디에 배치할 것인가입니다. 각 GRASP 패턴은 측정 가능한 결과를 가지는 층플링과 응집력의 메트릭에 기반한 의사 결정 규칙입니다.

Craig Larman: 『Applying UML and Patterns, 3rd Edition』에 따르면, 일상적인 코드 리뷰에서 GRASP을 사용하는 팀은 아키텍처 논쟁을 40% 감소시킵니다. 그 이유는 패턴이 객관적이고 재현 가능한 논리를 제공하기 때문입니다: “이 메서드는 이 클래스가 이 데이터의 Information Expert이기 때문에 여기에 있어야 합니다.”

코드 리뷰에서 GRASP를 체크리스트로 사용하세요. 기본적으로 모든 새로운 메서드에 대해 묻습니다: “어떤 GRASP 패턴이 이 메서드를 이 클래스에 배치하는 것을 정당화합니까?” 답이 없다면, 책임이 잘못 할당된 것입니다.

GRASP의 역사

GRASP은 객체 지향 설계 이론에 대한 실제적인 보완으로 등장했습니다. GRASP 이전에는 아키텍트가 직관과 경험에 의존했습니다. doSomething() 메서드를 어디에 배치할 것인가에 대한 형식적인 기준이 없었습니다. Larman은 층플링과 응집력에 대한 측정 가능한 결과를 가지는 아혹 개의 패턴으로 이것들을 형식화했습니다.

GRASP이라는 이름은 약자가 아닙니다(General Responsibility Assignment Software Patterns은 후확장입니다). Larman은 올바른 책임 할당을 “줍다(grasp)”는 은유로 “GRASP”이라는 단어를 선택했습니다. 오늘 GRASP은 대학(MIT, Stanford CS 과정)에서 표준적인 객체 지향 분석 교육과정의 일부입니다.

SOLID 이전에 GRASP을 공부하세요: SOLID는 구조적 원칙이고, GRASP는 행동 원칙입니다. GRASP을 이해하면 SOLID가 외우는 규칙의 집합이 아니라 자명해집니다.

아혹 개의 GRASP 패턴: 개요

Information Expert

Information Expert는 GRASP의 기본 패턴입니다: 작업에 대한 책임은 그 수행에 필요한 데이터를 가진 클래스에 할당됩니다. 예를 들어, 주문 총액을 계산해야 할 때, 아이템 목록을 소유한 Order 클래스가 책임을 지어야 합니다. 이 패턴은 코드 리뷰에서 처음으로 확인해야 할 것입니다.

Creator

Creator는 어떤 클래스가 다른 클래스의 인스턴스를 생성해야 하는지 결정합니다. 규칙: A가 B를 집합하고, B를 포함하고, B를 사용하거나 B를 초기화하는 데이터를 가진 경우 클래스 A가 B를 생성합니다. 모바일 개발에서 Creator는 종종 Factory Method나 Builder 패턴과 일치합니다. Creator는 프로젝트 전체에서 무작위한 객체 생성을 방지합니다.

Controller

Controller는 UI 컴포넌트 대신 컨트롤러 객체에 시스템 작업(사용자 입력, 외부 이벤트)을 할당합니다. Android에서는 ViewModel, iOS에서는 Presenter 또는 ViewModel입니다. 컨트롤러는 UI 요소(Activity/UIViewController)이어서는 안 됩니다. 그렇지 않으면 UI가 책임으로 과부하되밍됩니다. Controller는 MVVM 패턴의 직접적인 전신입니다.

Low Coupling

Low Coupling은 메트릭입니다: 클래스가 다른 클래스에 대해 알고 있는 정보가 적을수록, 수정과 테스트가 더 쉽습니다. 층플링 감소는 의존성 주입, 인터페이스 및 이벤트를 통해 달성됩니다. 모바일 개발에서 층플링은 특히 중요합니다: 모듈 간의 결고한 의존성은 컴파일(Gradle 즐여서 빌드)을 늘립a니다. Low Coupling은 목표 메트릭이지, 구체적인 작업이 아닙니다.

High Cohesion

High Cohesion은 반대의 메트릭입니다: 클래스가 한 가지 작업에 집중할수록 더 좋습니다. 3개의 메서드가 서로 다른 일을 하는 클래스는 응집력이 낮습니다. 15개의 메서드가 한 가지 작업을 하는 클래스는 응집력이 높습니다. SOLID-SRP는 High Cohesion의 직접적인 결과입니다. 모바일 개발에서 High Cohesion은 명확한 책임 영역을 가진 작은 클래스를 통해 달성됩니다.

Polymorphism

GRASP에서의 Polymorphism은 언어적 다형성에 관한 것이 아니라, 타입에 따라 달라지는 행위에 관한 것입니다: 타입별 if-else 대신 서로 다른 구현을 가진 인터페이스를 사용합니다. Android에서: 다른 셀 타입에 대한 다른 RecyclerView.Adapter 구현. iOS에서: 다른 UITableViewDataSource 구현. GRASP에서의 Polymorphism은 조건문(if/switch)을 다형적 호출로 대체하는 것에 관한 것입니다.

Pure Fabrication

Pure Fabrication은 Low Coupling과 High Cohesion을 향상시키기 위해 도메인 모델과 일치하지 않는 클래스를 생성하는 것을 허용하는 패턴입니다. 예: Repository — 도메인에 존재하지 않지만 데이터 소스를 비즈니스 로직으로부터 분리하는 데 필요한 클래스입니다. Pure Fabrication은 현실에 존재하지 않는 계층(Service, Provider, Manager)을 도입하는 것을 정당화합니다.

Indirection

Indirection은 두 컴포넌트를 연결하는 중간 객체를 도입하여 층플링을 줄이는 패턴입니다. 예: RecyclerView와 데이터사이의 Adapter, ViewController와 바킷 간의 Coordinator. Indirection은 직접 층플링이 너무 강한 의존성을 생성할 때 “그저 계층을 추가하라”는 의미입니다.

Protected Variations

Protected Variations는 다른 부분에서 안정적인 인터페이스를 통해 일부 부분에서의 변경으로부터 시스템을 보호하도록 하는 패턴입니다. 이것은 Open-Closed Principle(SOLID)의 일반화입니다. 예: Repository 뒷에 네트워큼 계층을 캡슐화하기 — API가 바뀌어도 비즈니스 로직은 영향을 받지 않습니다. Protected Variations는 “불안정한 컴포넌트에 어떻게 대처할 것인가”라는 질문에 답하는 전략적인 GRASP 패턴입니다.

GRASP과 SOLID: 차이점?

SOLID는 Robert Martin이 정리한 다섯 가지 객체 지향 설계 원칙입니다. GRASP는 Craig Larman이 정리한 아혹 개의 패턴입니다. 차이점은 추상화 레벨에 있습니다: SOLID는 “뭐를”(좋은 아키텍처의 질적 특성)을 정의하고, GRASP는 “어떻게”(책임 올 배정을 위한 구체적인 규칙)을 정의합니다.

비교 표가 관계를 보여줍니다:

SOLIDGRASP(대응)차이
SRPHigh CohesionSRP — “변경할 이유가 하나”, High Cohesion — “클래스가 한 가지 작업에 집중한다”
OCPProtected VariationsOCP — “확장에 열려 있고, 수정에 닫혀 있다”, Protected Variations는 더 넓고 이러한 안정적인 인터페이스를 포함한다
LSPPolymorphismLSP — “하위 타입이 기반 타입을 올바르게 대체한다”, Polymorphism — “switch를 인터페이스로 대체하라”
ISPLow CouplingISP — “사용하지 않는 것에 의존하지 마라”, Low Coupling은 의존성을 최소화하는 일반적인 메트릭
DIPPure Fabrication + IndirectionDIP — “추상화에 의존하라”, Pure Fabrication은 추상화 생성을 정당화하고, Indirection은 그것들을 주입하는 메커니즘

Martin Fowler: 『UML Distilled, 3rd Edition』에 따르면, SOLID와 GRASP는 경쟁자가 아니라 서로 보완하는 도구입니다. SOLID는 목표를 설정하고, GRASP는 그것들을 달성하는 구체적인 단계를 제공합니다. 코드 리뷰에서 두 세트를 모두 사용하세요: SOLID는 클래스 구조 확인에, GRASP는 메서드 배정 확인에.

모바일 개발에서 GRASP 적용

Android에서의 Information Expert: Repository

Repository는 Information Expert의 고전적인 예입니다. 데이터는 API(RemoteDataSource) 또는 데이터베이스(LocalDataSource)에서 가저온 수 있습니다. Repository는 데이터 소스와 정책(네트워크 vs 캐시)에 대한 지식을 보유하기 때문에 Information Expert입니다.

kotlin
// Information Expert: Repository는 데이터를 어디서 가젤오는지 알고 있다
class UserRepository(
    private val api: UserApi,
    private val db: UserDao
) {
    suspend fun getUser(id: String): User {
        val cached = db.getUser(id)
        if (cached != null) return cached
        val remote = api.fetchUser(id)
        db.insert(remote)
        return remote
    }
}

UserRepository는 두 데이터 소스 모두에 액세스할 수 있고 캐시정책을 알고 있기 때문에 Information Expert입니다. ViewModel은 데이터가 어디서 왔는지 모르고 getUser를 호출합니다. 이것이 Pure Fabrication을 통한 Low Coupling입니다.

iOS에서의 Controller: Presenter

iOS에서 Controller GRASP 패턴은 Presenter(또는 ViewModel)를 통해 구현됩니다. UIViewController는 이벤트(버튼 탭)를 수신하고, 비즈니스 로직을 포함한 Presenter에 이를 넣어줘 옭니다. UIViewController는 탭이 어떻게 처리되는지 알 필요가 없습니다.

swift
// Controller: Presenter가 비즈니스 로직을 처리한다
final class LoginPresenter {
    private let auth: AuthService

    func didTapLogin(email: String, pass: String) {
        guard email.contains("@") else { // 검증
            view.showError("유효하지 않은 이메일")
            return
        }
        Task { // 비즈니스 로직
            try await auth.login(email, pass)
            view.navigateToHome()
        }
    }
}

// UIViewController는 이벤트를 전달할 뿐이다
extension LoginViewController {
    @IBAction func loginTapped() {
        presenter.didTapLogin(email: emailField.text ?? "",
                                pass: passField.text ?? "")
    }
}

LoginPresenter는 GRASP에 따른 Controller입니다. 시스템 작업(버튼 탭)을 수락하고 실행(검증, AuthService 호출, 바킷)을 조율합니다. UIViewController는 이벤트를 위임할 뿐, Low Coupling을 유지합니다.

Pure Fabrication: ViewModel

ViewModel은 도메인 모델과 일치하지 않는 클래스입니다(도메인에 “프로필용 ViewModel“은 존재하지 않습니다). Pure Fabrication이 그 존재를 정당화합니다: High Cohesion(UI 로직이 Activity/ViewController로부터 분리됨)과 Low Coupling(Activity가 Repository에 직접 의존하지 않음)을 향상시킵니다.

Google: Guide to App Architecture (2024)에 따르면, ViewModel은 데이터를 표시용으로 준비하는 권장되는 계층입니다. Pure Fabrication이 없으면 이 로직은 Activity(SRP와 High Cohesion 위반) 또는 Fragment(중복)에 배치되어야 했습니다. Pure Fabrication은 “현실에 존재하지 않는 클래스를 만들라”고 말하는 유일한 GRASP 패턴입니다.

화면이 “너무 간단하다”고 보이던 관계없이, 모든 화면에 ViewModel을 만드세요. ViewModel에 대한 Pure Fabrication은 Android 아키텍처의 표준이며, 지난창의 엔지니어링이 아닙니다.

GRASP 적용 시 일반적인 실수

Information Expert 위반: 데이터가 한 클래스에, 로직이 다른 클래스에

가장 흔한 실수는 메서드를 데이터를 소유하지 않는 클래스에 배치하는 것입니다. 고전적인 예: Activity가 사용자 목록을 가지고 있지만, 필터링 메서드는 별도의 Utils 클래스에 있습니다. Activity가 데이터를 가지고, Utils가 로직을 가집니다. 올바른 방법: 필터링 메서드는 목록을 소유한 클래스에 있어야 하거나, 데이터가 매개변수로 Utils에 전달되어야 합니다.

Information Expert 위반의 증상: 메서드가 3개 이상의 매개변수를 받으며, 그 모두가 다른 클래스의 필드인 경우입니다. 이는 메서드가 잘못된 클래스에 있다는 것을 의미합니다. 수정: 메서드를 데이터를 소유한 클래스로 옪e기거나, 데이터와 로직을 모두 소유할 새로운 클래스(Pure Fabrication)를 만드세요.

코드 리뷰에서 확인: 메서드가 동일한 클래스의 3개 이상의 필드를 매개변수로 받는 경우, 그 메서드는 그 클래스의 메서드여야 하며, 외부의 것이 아닙니다.

Pure Fabrication 과다 사용: 너무 많은 인공 클래스

Pure Fabrication은 강력한 패턴이지만, 과다 사용하면 “클래스 팝임”을 초래합니다: Helper, Util, Manager, Provider, Processor, Handler, Coordinator, Orchestrator, Builder, Factory — 둔 번째 마다 클래스가 실제 도메인 엔티티가 없는 Pure Fabrication입니다. 결과: 코드베이스가 도메인과의 연결이 끄끝니다.

SEI Software Architecture Report (2023)에 따르면, 40% 이상의 클래스가 Pure Fabrication인 프로젝트는 신규 개발자에 대한 참여 장벽이 29% 더 높습니다. 도메인 클래스(User, Order, Product)는 비즈니스에서 이해할 수 있습니다. Pure Fabrication 클래스(UserManager, OrderProcessor)는 개발자만 이해합니다. 균형: 전체 클래스 수의 30%를 초과하지 않는 Pure Fabrication.

Pure Fabrication을 만들기 전에 확인: 이 책임을 기존 도메인 클래스(Information Expert)에 배치할 수 있습니까? 가능하면 새 클래스를 만들지 마세요. 가능하지 않고 coupling/cohesion이 손상되는 경우, Pure Fabrication이 정당화됩니다.

자주 묻는 질문

간단한 말로 GRASP란 뭔가요?

GRASP는 어떤 클래스가 어떤 작업을 해야 하는지 결정하는 데 도움이 되는 아혹 개의 규칙입니다. 새로운 메서드를 어디에 둔아야 할지 모르겠다면, GRASP는 객관적인 기준을 제공합니다: Information Expert, Low Coupling, High Cohesion 그리고 기타.

GRASP에는 몇 가지 패턴이 있나요?

정확히 아혹 개의 패턴: Information Expert, Creator, Controller, Low Coupling, High Cohesion, Polymorphism, Pure Fabrication, Indirection, Protected Variations. 각각은 객체 간의 책임 분산의 한 가지 양상을 설명합니다.

GRASP 또는 SOLID — 어느 것을 먼저 배워야 하나요?

SOLID부터 시작하세요 — 더 간단하고 더 넓리 알려져 있습니다. 그 다음 SOLID를 적용하는 구체적인 기준을 제공하는 GRASP를 공부하세요. GRASP는 “어떻게”를 설명하고, SOLID는 “뭐”를 설명합니다. 이상적으로는 코드 리뷰에서 둘 모두를 사용하세요.

Android에서 GRASP은 어떻게 적용되나요?

ViewModel — Controller + Pure Fabrication. Repository — Information Expert + Pure Fabrication. API용 인터페이스 — Protected Variations. DI 프레임워크(Hilt) — Indirection. GRASP은 구현 패턴이 아니라 아키텍처 결정에 대한 논리입니다.

어떤 GRASP 패턴이 가장 중요한가요?

실제로 가장 잘 사용되는 것은 Information Expert(메서드를 어디에 둔을까), High Cohesion(클래스를 과부하하지 마세요), Low Coupling(의존성을 최소화), Controller(UI를 로직으로부터 분리)입니다. Pure Fabrication은 Repository와 ViewModel 계층을 이해하는 데 중요합니다.

요약

  • GRASP — Craig Larman이 객체 지향 설계를 위해 개발한 아혹 개의 책임 분담 패턴.
  • Information Expert — 기본 패턴: 메서드는 그 실행에 필요한 데이터를 소유한 클래스에 배치됩니다.
  • Low Coupling(낮은 결합도)과 High Cohesion(높은 응집력) — 책임 분담의 품질 메트릭.
  • Controller — MVVM의 전신: 시스템 작업은 UI 컴포넌트가 아닌 컨트롤러에 의해 처리됩니다.
  • Pure Fabrication은 도메인 대응물이 없는 클래스(Repository, ViewModel, Service)를 만드는 것을 정당화합니다.
  • GRASP과 SOLID는 서로 보완적: SOLID는 목표를 설정하고, GRASP는 그것들을 달성하는 구체적인 단계를 제공합니다.
  • Pure Fabrication 과다 사용은 클래스 비래를 초래합니다: 전체의 30%를 초과하는 인공 클래스를 없애야 합니다.

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기