애플리케이션 아키텍처와 객체지향

업데이트:

유튜브 [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데로 객체는 객체대로 사용할 수 있도록 사용함

댓글남기기