Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- 데베
- 백준 4949번
- 자바
- SQL
- 정리
- 깃허브 로그인
- 모두를위한딥러닝
- 리액트 네이티브
- 딥러닝
- 팀플회고
- 깃허브 토큰 인증
- HTTP
- 네트워크
- 백준 4358 자바
- 문자열
- 백준
- 백준 4358번
- 모두의네트워크
- React Native
- 데이터베이스
- 모두의 네트워크
- 리액트 네이티브 프로젝트 생성
- 스터디
- 지네릭스
- 모두를 위한 딥러닝
- 리액트 네이티브 시작하기
- 머신러닝
- 깃 연동
- 깃 터미널 연동
- 백준 5525번
Archives
- Today
- Total
솜이의 데브로그
Chapter 1 ) 계층형 아키텍처의 문제는 무엇일까? 본문
Reference : 만들면서 배우는 클린 아키텍처
계층형 아키텍처는 데이터베이스 주도 설계를 유도한다
- 위와 같은 계층형 아키텍처에서 웹 계층 → 도메인계층 → 영속성 계층 에 의존하기 때문에 결국 데이터베이스에 의존하게 된다.
- 따라 모든 것이 영속성 계층을 토대로 만들어진다.
- 전통적인 계층형 아키텍처에서는 의존성의 방향에 따라 자연스럽게 데이터베이스의 구조를 먼저 생각하고, 이를 토대로 도메인 로직을 구현한다.
- 하지만 비즈니스 관점에서는 무엇보다도 도메인 로직을 먼저 만들어야 한다.
⇒ 도메인 로직이 맞다는 것을 확인한 후, 이를 기반으로 영속성 계층과 웹 계층을 만들어야 한다.
- ORM 사용 시, ORM에 의해 관리되는 엔티티들은 일반적으로 영속성 계층에 둔다.
- 도메인 계층에서는 이러한 엔티티에 접근, 사용 가능
→ 이렇게 되면 영속성 계층과 도메인 계층 사이에 강한 결합이 생긴다.
따라서 서비스가 영속성 모델을 비즈니스 모델처럼 사용하게 되고, 이로 인해 도메인 로직 뿐만 아니라 즉시로딩/지연로딩, 데이터베이스 트랜잭션, 캐시 플러시(flush) 등 영속성 계층과 관련된 작업들을 해야만 한다.
- 영속성 코드가 사실상 도메인 코드에 녹아들어가서 둘 중 하나만 바꾸는 것이 어려워진다.
지름길을 택하기 쉬워진다
- 계층형 아키텍처에서 적용되는 유일한 규칙은, 특정한 계층에서는 같은 계층에 있는 컴포넌트나 아래에 있는 계층에만 접근 가능하다는 것이다.
- 따라서 만약 상위 계층에 위치한 컴포넌트에 접근해야한다면 간단히 컴포넌트를 계층 아래로 내리면 된다.
- 이것을 계속 수행하다보면 위의 그림과 같아진다.
- 영속성 계층은 컴포넌트를 아래 계층으로 내릴수록 비대해진다.
테스트하기 어려워진다
- 계층형 아키텍처를 사용할 때 일반적으로 나타나는 변화의 형태는 계층을 건너뛰는 것이다.
- 위의 그림과 같이 도메인 계층을 건너뛰는 것은 도메인 로직을 코드 여기저기에 흩어지게 만든다.
이렇게 되면 발생하는 문제점들
- 단 하나의 필드를 조작하는 것에 불과하더라도 도메인 로직을 웹 계층에 구현하게 된다.
- 더 많은 로직을 웹 계층에 추가하면서 핵심 도메인 로직들이 퍼져나갈 확률이 높다.
- 웹 계층 테스트에서 도메인 계층 뿐만 아니라 영속성 계층도 모킹(mocking) 해야 한다.
- 이렇게 되면 단위테스트의 복잡도가 올라가고, 테스트를 전혀 작성하지 않게 될 확률이 높아진다.
- 시간이 흘러 웹 컴포넌트의 규모가 커지면 다양한 영속성 컴포넌트에 의존성이 많이 쌓이면서 테스트의 복잡도를 높인다.
유스케이스를 숨긴다
실제 개발자들은 새로운 코드를 짜는데 시간에 쓰기보다는 기존 코드를 바꾸는 데 더 많은 시간을 쓴다.
따라서 기능을 추가하거나 변경할 적절한 위치를 찾는 일이 빈번하기 때문에, 아키텍처는 코드를 빠르게 탐색하는데 도움이 돼야 한다.
- 계층형 아키텍처에서는 도메인 로직이 여러 계층에 흩어지기 쉽다.
- 계층형 아키텍처는 도메인 서비스의 ‘너비’에 관한 규칙을 강제하지 않는다.
- 따라서 시간이 흐르면 위 그림과 같이 여러 개의 유스케이스를 담당하는 넓은 서비스가 만들어지기도 한다.
- 이러한 넓은 서비스는 영속성 계층에 많은 의존성을 갖게 되고, 다시 웹 레이어의 많은 컴포넌트가 이 서비스에 의존하게 된다.
- 이런 경우 서비스를 테스트하기 어려워지고, 작업해야 할 유스케이스를 책임지는 서비스를 찾기도 어려워진다.
⇒ 좁은 도메인 서비스가 유스케이스 하나씩만 담당하도록 하자!
ex) UserService에서 사용자 등록 유스케이스를 찾는 대신 RegisterUserService를 바로 열어서 작업하도록!
동시 작업이 어려워진다
실제 프로젝트에서는 여러 작업을 동시에 해야하고, 아키텍처가 동시 작업을 지원해야한다.
- 계층형 아키텍처에서는 모든 것이 영속성 계층 위에 만들어지기 때문에 영속성 계층 → 도메인 계층 → 웹 계층 순으로 개발해야한다. 따라서 특정 기능은 동시에 한 명의 개발자맞 작업할 수 있다.
- 코드에 넓은 서비스가 있다면 서로 다른 기능을 동시에 작업하기가 더욱 어렵다.
- 서로 다른 유스케이스에 대한 작업을 하게 되면 같은 서비스를 동시에 편집하는 상황이 발생하고, 이는 병합 충돌과 이전 코드로 되돌려야하는 문제를 야기하기 때문이다.
유지보수를 가능한 소프트웨어를 만드는 데 어떻게 도움이 될까?
- 올바르게 구축하고 몇 가지 추가적인 규칙들을 적용하면 계층형 아키텍처는 유지보수하기 매우 쉬워지며 코드를 쉽게 변경하거나 추가할 수 있게 된다.
- 지름길을 택하지 않고 유지보수하기에 더 쉬운 솔루션을 만들자!
느낀점
정확히 내가 프로젝트 진행하면서 느낀 문제점들이라 좀 찔렸다ㅋㅋ
무엇보다 다른 사람들과 동시에 작업할 때 같은 부분을 건드리면 충돌나는 문제때문에 많이 고생했었는데, 앞으론 처음에 아키텍처 만들때부터 신경을 써야겠다!
'책을 읽자 > 만들면서 배우는 클린 아키텍처' 카테고리의 다른 글
Chapter 3 ) 코드 구성하기 (0) | 2022.11.04 |
---|---|
Chapter 2 ) 의존성 역전하기 (0) | 2022.10.26 |