📖
Aaron's TECH BOOK
  • Intro
    • About me
  • Lecture
    • Kubernetes
      • Begin Kubernetes
    • Kafka
      • Begin Kafka
    • Kotlin
      • TDD, Clean Code Preview
      • woowa Kotlin
    • Java
      • Multithread Concurrency
      • The Java
    • Toby
      • Toby Spring 6
      • Toby Spring Boot
    • MSA
      • 01.Micro Service
      • 02.DDD 설계
      • 03.DDD 구현
      • 04.EDA 구현
    • Spring Boot
    • Spring Batch
    • Spring Core Advanced
    • Spring DB Part II
    • Spring DB Part I
    • JPA API and Performance Optimization
    • JPA Web Application
    • JPA Programming Basic
    • Spring MVC Part 2
      • 01.Thymeleaf
      • 02.ETC
      • 03.Validation
      • 04.Login
      • 05.Exception
    • Spring MVC Part 1
      • 01.Servlet
      • 02.MVC
    • Http
      • 01.Basic
      • 02.Method
      • 03.Header
    • Spring Core
    • Study
      • Concurrency issues
      • First Come First Served
      • Performance Test
      • TDD
      • IntelliJ
  • Book
    • Kafka Streams in Action
      • 01.카프카 스트림즈
      • 02.카프카 스트림즈 개발
      • 03.카프카 스트림즈 관리
    • Effective Kotlin
      • 01.좋은 코드
      • 02.코드 설계
      • 03.효율성
    • 이벤트 소싱과 MSA
      • 01.도메인 주도 설계
      • 02.객체지향 설계 원칙
      • 03-04.이벤트 소싱
      • 05.마이크로서비스 협업
      • 06.결과적 일관성
      • 07.CQRS
      • 08.UI
      • 09.클라우드 환경
    • 몽고DB 완벽 가이드
      • I. 몽고DB 시작
      • II. 몽고DB 개발
    • Kotlin Cookbook
      • 코틀린 기초
      • 코틀린 기능
      • ETC
    • Kotlin in Action
      • 함수/클래스/객체/인터페이스
      • 람다와 타입
      • 오버로딩과 고차 함수
      • 제네릭스, 애노테이션, 리플렉션
    • Kent Beck Tidy First?
    • 대규모 시스템 설계 기초
      • 01.사용자 수에 따른 규모 확장성
      • 02.개략적인 규모 추정
      • 03.시스템 설계 공략법
      • 04.처리율 제한 장치 설계
      • 05.안정 해시 설계
      • 06.키-값 저장소 설계
      • 07.유일 ID 생성기 설계
      • 08.URL 단축기 설계
      • 09.웹 크롤러 설계
      • 10.알림 시스템 설계
      • 11.뉴스 피드 시스템 설계
      • 12.채팅 시스템 설계
      • 13.검색어 자동완성 시스템
      • 14.유튜브 설계
      • 15.구글 드라이브 설계
      • 16.배움은 계속된다
    • 실용주의 프로그래머📖
    • GoF Design Patterns
    • 도메인 주도 개발 시작하기
      • 01.도메인 모델 시작하기
      • 02.아키텍처 개요
      • 03.애그리거트
      • 04.리포지터리와 모델 구현
      • 05.Spring Data JPA를 이용한 조회 기능
      • 06.응용 서비스와 표현 영역
      • 07.도메인 서비스
      • 08.애그리거트 트랜잭션 관리
      • 09.도메인 모델과 바운디드 컨텍스트
      • 10.이벤트
      • 11.CQRS
    • Effective Java 3/E
      • 객체, 공통 메서드
      • 클래스, 인터페이스, 제네릭
    • 소프트웨어 장인
    • 함께 자라기
    • Modern Java In Action
      • 01.기초
      • 02.함수형 데이터 처리
      • 03.스트림과 람다를 이용한 효과적 프로그래밍
      • 04.매일 자바와 함께
    • Refactoring
      • 01.리펙터링 첫 번째 예시
      • 02.리펙터링 원칙
      • 03.코드에서 나는 악취
      • 06.기본적인 리펙터링
      • 07.캡슐화
      • 08.기능 이동
      • 09.데이터 조직화
      • 10.조건부 로직 간소화
      • 11.API 리팩터링
      • 12.상속 다루기
    • 객체지향의 사실과 오해
      • 01.협력하는 객체들의 공동체
      • 02.이상한 나라의 객체
      • 03.타입과 추상화
      • 04.역할, 책임, 협력
      • 05.책임과 메시지
      • 06.객체 지도
      • 07.함께 모으기
      • 부록.추상화 기법
    • Clean Code
    • 자바 ORM 표준 JPA 프로그래밍
Powered by GitBook
On this page
  • 기능 설계 대 구조 설계
  • 두 가지 재료: 기능과 구조
  • 안정적인 재료: 구조
  • 불안정한 재료: 기능
  • 재료 합치기: 기능과 구조의 통합
  1. Book
  2. 객체지향의 사실과 오해

06.객체 지도

기능 설계 대 구조 설계

  • 기능 분해 방법의 경우 시스템 기능은 더 작은 기능으로 분해되고 각 기능은 서로 밀접하게 관련된 하나의 덩어리를 이루기 때문에 기능이 변경될 경우 기능의 축을 따라 설계된 소프트웨어가 전체적으로 요동치게 된다.

  • 객체지향 접근방법은 자주 변경되지 않는 안정적인 객체 구조를 바탕으로 시스템 기능을 객체 간의 책임으로 분배한다.객체의 구조에 집중하고 기능이 객체의 구조를 따르게 만든다. 시스템 기능은 더 작은 책임으로 분할되고 적절한 객체에게 분배되기 때문에 기능이 변경되더라도 객체 간의 구조는 그대로 유지된다.

두 가지 재료: 기능과 구조

  • 객체지향 세계를 구축하기 위해서는 사용자에게 제공할 기능과 기능을 담은 안정적인 구조라는 재료가 준비되어 있어야 한다.

    • 기능 : 사용자가 자신의 목표를 달성하기 위해 사용할 수 있는 시스템의 서비스

    • 구조 : 시스템의 기능을 구현하기 위한 기반, 기능 변경을 수용할 수 있도록 안정적이어야 함

  • 기능과 구조를 표현하기 위해 일관되게 적용할 수 있는 기법

    • 기능은 사용자의 목표를 만족시키기 위해 책임을 수행하는 시스템의 행위로 표현

    • 구조는 사용자나 이해관계자들이 도메인에 관해 생각하는 개념과 개념들 간의 관계로 표현

  • 기능을 수집하고 표현하기 위한 기법을 유스케이스 모델링

  • 구조를 수집하고 표현하기 위한 기법을 도메인 모델링

안정적인 재료: 구조

도메인 모델

  • 사용자가 프로그램을 사용하는 대상 분야를 도메인

  • 도메인 모델은 이해관계자들이 바라보는 멘탈 모델(Mental Model)이다.

    • 멘탈 모델이란 자기 자신, 다른 사람, 환경, 자신이 상호작용하는 사물들에 대해 갖는 모형

  • 도메인 모델은 도메인에 대한

    • 사용자 모델(사용자가 제품에 대해 가지고 있는 개념들의 모습)

    • 디자인 모델(설계자가 마음 속에 갖고 있는 시스템에 대한 개념화)

    • 시스템 이미지(최종 제품)

    • 를 포괄하도록 추상화한 소프트웨어 모델이다.

  • 도메인 모델은 소프트웨어에 대한 멘탈 모델이다.

도메인의 모습을 담을 수 있는 객체지향

  • 도메인 모델이란 사용자들이 도메인을 바라보는 관점이며, 설계자가 시스템의 구조를 바라보는 관점인 동시에 소프트웨어 안에 구현된 코드의 모습 그 자체

  • 객체지향 패러다임은 사용자의 관점, 설계자의 관점, 코드의 모습을 모두 유사한 형태로 유지할 수 있게 하는 유용한 사고 도구와 프로그래밍 기법을 제공

  • 위 특징을 연결완전성 또는 표현적 차이라고 한다.

표현적 차이

  • 소프트웨어 객체가 현실 객체를 왜곡한다고 하더라도 소프트웨어 객체는 현실 객체의 특성을 토대로 구축된다.

  • 소프트웨어 객체와 현실 객체 사이의 의미적 거리를 가리켜 표현적 차이 또는 의미적 차이 라고 한다.

  • 소프트웨어 객체는 도메인 모델을 통해 표현되는 도메인 객체들을 은유해야 한다.

불안정한 기능을 담는 안정적인 도메인 모델

  • 도메인 모델이 제공하는 구조가 상대적으로 안정적이다.

  • 사용자 모델에 포함된 개념과 규칙은 비교적 변경될 확률이 적기 때문에 사용자 모델을 기반으로 설계와 코드를 만들면 변경에 쉽게 대처할 수 있을 가능성이 커진다.

  • 안정적인 구조를 제공하는 도메인 모델을 기반으로 소프트웨어의 구조를 설계하면 변경에 유연하게 대응할 수 있는 탄력적인 소프트웨어를 만들 수 있다.!

불안정한 재료: 기능

유스케이스

  • 기능적 요구사항이란 시스템이 사용자에게 제공해야 하는 기능의 목록을 정리한 것.

  • 사용자의 목표를 달성하기 위해 사용자와 시스템 간에 이뤄지는 상호작용의 흐름을 텍스트로 정리한 것을 유스케이스

  • "사용자 목표가 유스케이스의 핵심이다. 유스케이스는 공통의 사용자 목표를 통해 강하게 연관된 시나리오의 집합이다"

유스케이스의 특성

  1. "유스케이스는 사용자와 시스템 간의 상호작용을 보여주는 '텍스트'다"

    • 유스케이스의 핵심은 사용자와 시스템 간의 상호작용을 일련의 이야기 흐름으로 표현하는 것

  2. "유스케이스는 하나의 시나리오가 아니라 여러 시나리오들의 집합이다."

    • 시나리오는 유스케이스를 통해 시스템을 사용하는 하나의 특정한 이야기 또는 경로다.

    • 시나리오를 유스케이스 인스턴스라고도 한다.

  3. 유스케이스는 단순히 피처(feature) 목록과 다르다.

    • 피처는 시스템이 수행해야 하는 기능의 목록을 단순하게 나열한 것

  4. 유스케이스는 사용자 인터페이스와 관련된 세부 정보를 포함하지말아야 한다.

    • 본질적인 유스케이스라고도 한다.

  5. 유스케이스는 내부 설계와 관련된 정보를 포함하지 않는다.

    • 유스케이스에서 객체 설계로의 전환은 경험과 상식과 의사소통을 기반으로 한 창조 작업이다.

유스케이스는 설계 기법도, 객체지향 기법도 아니다

  • 유스케이스에는 단지 사용자가 시스템을 통해 무엇을 얻을 수 있고 어떻게 상호작용할 수 있느냐에 관한 정보만 기술

  • 단지 기능적 요구사항을 사용자의 목표라는 문맥을 중심으로 묶기 위한 정리 기법일 뿐

재료 합치기: 기능과 구조의 통합

도메인 모델, 유스케이스, 그리고 책임-주도 설계

  • 변경에 유연한 소프트웨어를 만들기 위해서는 유스케이스에 정리된 시스템의 기능을 도메인 모델을 기반으로 한 객체들의 책임으로 분배해야 한다.

  • 사용자에게 시스템이 수행하기로 약속한 기능은 결국 시스템의 책임으로 볼 수 있다.

  • 시스템에 할당된 커다란 책임은 이제 시스템 안의 작은 규모의 객체들이 수행하야 하는 더 작은 규모의 책임으로 세분화된다.

  • 이제 우리는 도메인 모델에 포함된 개념을 은유하는 소프트웨어 객체를 선택해야 한다.

    • 협력을 완성하는 데 필요한 메시지를 식별하면서 객체들에게 책임을 할당해 나간다.

  • 협력에 참여하는 객체를 구현하기 위해 클래스를 추가하고 속성과 함께 메서드를 구현하면 시스템의 기능이 완성!

  • 객체 설계는 가끔(?) 아래와 같이 표현

요구사항들을 식별하고 도메인 모델을 생성한 후,
소프트웨어 클래스에 메서드들을 추가하고,
요구사항을 충족시키기 위해 객체들 간의 메시지 전송을 정의하라.
  • 유스케이스는 사용자에게 제공할 기능을 시스템의 책임으로 보게 함으로써 객체 간의 안정적인 구조에 책임을 분배할 수 있는 출발점을 제공

  • 도메인 모델은 기능을 수용하기 위해 은유할 수 있는 안정적인 구조를 제공

  • 책임-주도 설계는 유스케이스로부터 첫 번째 메시지와 사용자가 달성하려는 목표를, 도메인 모델로부터 기능을 수용할 수 있는 안정적인 구조를 제공받아 실제로 동작하는 객체들의 협력 공동체를 창조

기능 변경을 흡수하는 안정적인 구조

  • 도메인 모델을 기반으로 객체 구조를 설계하는 이유는 도메인 모델이 안정적이기 때문

  • 비즈니스 정책이나 규칙이 크게 변경되지 않는 한 시스템의 기능이 변경되더라도 객체 간의 관계는 일정하게 유지

    • 기능적인 요구사항이 변경될 경우 책임과 객체 간의 대응 관계만 수정될 뿐.

Last updated 1 year ago