애플리케이션 아키텍처와 객체지향
업데이트:
유튜브 [KSUG Seminar] Growing Application - 2nd. 애플리케이션 아키텍처와 객체지향
조영호님 세미나 정리
https://www.youtube.com/watch?v=26S4VFUWlJM
아키텍처
- 프로젝트에 참여하는 개발자들이 설계에 대해 공유하는 이해를 반영하는 주관적인 개념
- 개발자들이 알아야 하는 중요한것
- 일찍, 올바르게 결정하고 싶은 것
관심사의 분리
- 서로 다르고 관련이 없는 책임 들을 분리
레이어 아키텍처
유사한 애들을 한 레이어오 모아두고, 변경이 이뤄질때 하나의 레이어만 수정하면 재사용성이 높아진다.
Presentation 레이어
- 화면 동작 또는 사용자의 입력을 처리하기 위한 관심사
Domain 레이어
- 비지니스와 관련된 도메인 로직을 처리하는 레이어
Data Source 레이어
- 도메인에서 필요로 하는 모든 데이터를 조작하기 위한 레이어
도메인 레이어
절차 지향
- 전통적인 방법으로 프로세스를 작동하는 서비스를 두고 해당 서비스에서 가져와서 실행한다.
- Transaction Script 패턴
객체 지향
- 서비스의 중요한 개념(도메인)들이 각자의 책임을 가지고 수행하는 방법이다.
- Domain Model 패턴
- 도메인 레이어가 전체 아키텍처 구성을 주도
영화 예매 도메인
온라인 영화 예매 시스템
도메인 개념
영화를 예매하기 위해 필요한 몇가지 도메인들이 존재함
Movie
- 영화를 예매하기 때문에 영화라는 개념이 있을 수 있다.
- 메타 데이터 관점으로 볼 수 있다.
Showing
- 예매를 하는건 영화가 아닌 몇년 몇월 몇시에 상영하는, 상영정보 자체인 상영이라는 개념이 있다.
Discount
- 이사람의 금액을 어떻게 얼마만큼 빼줄건지를 결정
- 모든 상품에 들어가는건 할인이 들어간다.
- AmountDiscount : 특정한 금액을 빼줌
- PercentDiscount : 비율을 빼줌
Rule
- 할인 규칙, 언제 어떤 조건을 만족할때 할인을 결정해주는것
- SequenceRule : 몇회 상영일때의 할인
- TimeRule : 특정 시간에 할인
Move(1)—-(0..1)Discount(1)—–(1..*)Rule
할인정책 + 할인 규칙
- 이끼(5000원) —- AmountDC(500원) —- 조조상영, 10회 상영, 월요일 10~12시 상영, 목요일 18~21 상영
- 상영정보를 통해 조건을 만족하는지 확인함
- 조건을 만족하기에 할인이 들어감
Reservation
- 위에 조건을 확인후 적용된 예약이 들어감
도메인 개념 또는 후보 객체
Reservation(0..*)—–(1)Showing(0..*)—–(1)Movie(1)—–(0..1)Discount(1)—–(1..*)Rule
트랜잭션 스크립트 모델(절차지향) 구현
- 데이터와 프로세스가 따로 고민하고 구현된다.
- 데이터 모델 생성
- 데이터 모델에 대한 클래스를 생성 : Anemic Domain Model
- 테이블에 필드를 클래스의 속성으로 지정한다.
- 속성은 private로 Getter, Setter를 갖는다.
- 테이블을 읽어야 하는 DAO를 배치한다.
- 데이터를 조장해야 하는 알고리즘, ReservationService를 만들고 DAO를 DI 해서 로직을 짠다.
- 서비스 안에서 모든게 처리되고 분기마다 if else를 통해 구현된다.
- 중앙 집중식 제어 스타일로 서비스안에 모든 작업들이 몰린다.
도메인 모델(객체지향) 구현
- 프로세스와 데이터를 하나의 덩어리로 두고 설계를 해야 한다.
- 객체지향 설계는 협력하는 객체들의 공동체 이다.
- 주어진 책임을 수행하는 객체들의 협력
- 시스템에는 여러 객체가 있는데 객체들은 속성과 메서드(데이터와 프로세스)를 같이 가지고 있다.
- 객체들은 메시지를 통해 서로 상호작용하며 책임을 수행한다.
- 예매 생성 책임 할당
- 예매 생성에 필요한 정보의 전문가에게 할당
- Showing : 예매 생성에 필요한 정보(데이터)가 가장 많은 객체이다.
- 예매 생성을 하기 위해 가격을 계산해야 하는데 Movie의 책임으로 협력을 해야 한다.
- Movie는 정가만 가지고 있어 할인을 위해 Discount에게 할인에 대한 책임이 있어 같이 협력해야 한다.
- Discount는 할인을 해야 할지 말지도 확인을 해야 되기 때문에 Rule과도 협력해야 한다.
- 객체들의 구조는 도메인과 유사하게 클래스 구조로 가져간다.
- 도메인 모델을 사용할때는 서비스 레이어가 있어야 도메인의 독립성을 보장 할 수 있다.
도메인 모델이 적합할때
- 복잡성을 알고리즘에서 분리하고 객체 간의 관계로 만들 수 있다. 유효성 ㄱ머사, 계산 파생 등이 퐇마된 복잡하고 끊임없이 변하는 비즈니스 규칙을 구현해야 한다면 객체 모들을 사용해 비즈니스 규칙을 처리하는 것이 현명하다.
CRC Card
- 책임과 협력을 표현하기 위한 객체지향 설계 도구
- Candidate(Role Or Object) : 역할또는 객체, 위쪽
- Responsibility : 객체가 뭘해야 하는지에 대한 책임, 왼쪽
- Collaborator : 책임에 대해 필요한 협력자, 오른쪽
서비스 레이어
- 애플리케이션 로직에 포함된다.
- 도메인 모델은 도메인 모델의 책임만을 수행하기 위해 DB 작업 등은 서비스 레이어를 통해서 결합도를 줄인다.
- 애플리케이션 경계, 애플리케이션 로직, 도메인 로직의 재사용성 촉진
- 서비스 레이어에 트랜잭션 바운더리를 잡아 트랜잭션을 시작하고 끝날때 커밋이나 롤백을 수행한다.
- 도메인 로직을 처리하기 위한 준비 작업, 도메인 로직이 잘 처리됐거나 후처리를 사용한다.
애플리케이션 로직
- 도메인을 포함한 전체 플로우 과정에서의 로직
- 디펜던시가 생기면서 결합도가 높아지고 응집도가 떨어저 도메인 객체안에 넣어두지 않는다.
도메인 로직을 처리하기 위해 필요한 DB 데이터 등의 데이터가 필요하다.
Data Source
- 일반적으로 RDB를 사용함
- 도메인 모델과는 객체 모델과 DB스키마 사이의 불일치가 발생한다.
- 객체 패러다임 과 관계 패러다임 간의 불일치
- 데이터 매퍼를 둬서 양쪽의 불일치를 해결함(객체와 DB간의 겹합도를 끊어줌)
ORM
- JPA(Java-Persistence API) 표준을 사용
- DB는 DB데로 객체는 객체대로 사용할 수 있도록 사용함
댓글남기기