caffeine-library / Domain-Driven-Design

🌱 에릭 에반스의 '도메인 주도 설계'를 읽는 스터디
4 stars 0 forks source link

[keyword] 14장 모델의 무결성 유지 (1) #58

Closed emiling closed 1 year ago

emiling commented 1 year ago

주제

'14장 - 모델의 무결성 유지(1)' 을 읽고 내용을 요약하거나,
중요✨ 하다고 생각하는 키워드 및 관련 설명을 코멘트로 달아주세요

연관 챕터

https://github.com/caffeine-library/Domain-Driven-Design/issues/57

emiling commented 1 year ago

Model Unification

Bounded Context

MODULE != BOUNDED CONTEXT

모델의 구성 단위로 구분해야할듯... 각각의 bounded context는 서로 다르게 구성되는 각각의 모델을 가지고 있는 게 맞지만, 하나의 모델 내의 여러 구성요소가 각기 다른 모듈로 구성될 수도 있기 때문에 개별 context에 의도를 전하는 것은 아님

경계 사이의 표현 방식이 다른 (dialect) 모델을 변역(translation)하는 역할은 모델에 의해 주도되는 것이 아님

두 팀이 같은 CONTEXT 안에 있지 않다면 어느 정도의 변화가 생기기 전까지는 코드를 공유하려해서는 안된다.

만약 모델의 단일화가 깨져서 개념적 균열이 발생한다면?

CONTINUOUS INTEGRATION

Context Map

Bounded Context 간에 코드를 재사용하는 것은 위험하므로 피하고 대신 기능과 데이터는 번역 과정을 거쳐 통합한다

MAP을 어떤 형식으로 작성하건 프로젝트에 속한 모든 사람은 MAP을 이해하고 공유해야한다. MAP은 BOUNDED CONTEXT의 명확한 이름을 제공해야하며, 경계 지점과 경계 지점의 특성을 명확하게 표현해야 한다.

Solutions

leejaeseung commented 1 year ago

중복된 개념(366p)

실제로 같은 개념을 나타내는 두 개의 모델 요소(그리고 그것에 따르는 구현)가 존재하는 것이다.

이전에 중복 코드를 어디까지 공통화해야 하냐에 대한 얘기를 한 적이 있는데, 여기서 말하는 중복된 개념은 중복 코드와는 다른 개념이라고 생각됩니다.

중복 코드 : 변경 가능성이 있지만 현 시점에는 같은 정책을 적용해야 하는 코드들. 각기 다른 정책으로 변경될 수 있으므로 섣부를 공통화는 좋지 않음. 중복 개념 : 확실히 정의된 개념(혹은 정책)에 대해 같은 모델을 여러 번 구현한 것. 정책이 갱신될 때마다 여러 군데에 모두 적용해야 하므로 안정성이 떨어질 수 있어 공통화가 필수적임. (개념에 대한 일관성)

코드만 보면 둘다 중복된 코드이기 때문에 이를 잘 구분하는게 중요하다고 생각되어서 정리해 보았습니다.

leejaeseung commented 1 year ago

지속적인 통합의 안좋았던 예시

일전에 리팩토링을 하다가 기존 로직이 제대로 동작하지 않아 큰일날 뻔한 기억이 떠오르네요. 베타 테스트는 모두 성공했는데, 타 팀의 베타 테스트를 지원하다가 오류가 났던 케이스.. (테스트 지원이 없었으면 운영에서 에러가 날 뻔함..)

현재 정책에 맞게 하나의 클래스를 두 개의 클래스로 쪼개는 리팩토링이었는데, 그 과정에서 옛날 레거시 객체에 대한 주석을 무시했던게 화근이었습니다. (그때까진 주석을 남겨놓으면 안전하다고 생각했지만, 직접 경험해보니 주석조차도 무시될 수 있겠다는 교훈을 얻었죠..) 클래스를 새로 만들어 새로 작성하다보니 기존 주석을 볼 겨를이 없더라구요.. (복붙하면서 사라짐) 설상가상으로 테스트코드도 존재하지 않았습니다.

책에서도 지속적인 통합을 위해 자동화된 테스트 스위트를 강조하는데, 확실히 정책적으로 치명적인 부분에 대해선 테스트코드를 꼼꼼히 작성해야겠더라구요.

교훈 주석을 달아놨다고 안심하지 말자. (주석 대신 테스트코드를 믿자) 테스트코드를 잘 짜자.