23
DDD Start! 6 장 . 장장 장장장장 장장 장장 장장장 장장장 - 장장장

Ddd start! 6장. 응용 서비스와 표현 영역

Embed Size (px)

Citation preview

Page 1: Ddd start!   6장. 응용 서비스와 표현 영역

DDD Start!6장 . 응용서비스와표현영역

아꿈사스터디 - 정현수

Page 2: Ddd start!   6장. 응용 서비스와 표현 영역

Layered Architecture

응용영역과표현영역은 사용자와도메인을연결해주는 매개체역할 을수행한다 .

Page 3: Ddd start!   6장. 응용 서비스와 표현 영역

표현영역과응용영역❖ 표현영역

➢ 사용자에게정보를보여주고 , 사용자의요청을해석한다 .

➢ 요청 (request) 시응용서비스가요구하는형식으로사용자요청을변환한다 .

❖ 응용영역

➢ 실제사용자가원하는기능을제공

➢ 기능실행에필요한입력값 ( 메서드파라미터 ) 을받아실행결과를리턴한다 .

➢ 실행결과리턴시사용자에게알맞은형식으로응답 (response)한다 .

Page 4: Ddd start!   6장. 응용 서비스와 표현 영역

응용서비스❖ 주요역할

➢ ( 도메인객체를사용한 ) 사용자요청처리 : 도메인객체간의흐름제어

➢ 트랜잭션처리

➢ 접근제어

➢ 이벤트처리

Page 5: Ddd start!   6장. 응용 서비스와 표현 영역

응용서비스

❖ 응용서비스에서도메인로직을구현하지않는다 .

( 도메인로직은도메인영역에서 !)

❖ 문제점

➢ 코드의응집성감소

➢ 중복된로직구현이많아질수있음

➢ 코드변경이어려워짐

Page 6: Ddd start!   6장. 응용 서비스와 표현 영역

응용서비스

Page 7: Ddd start!   6장. 응용 서비스와 표현 영역

응용서비스 : 크기에따른구현방식

❖ 응용서비스구현방식

➢ 방법 1 : 한응용서비스클래스에회원도메인의모든기능구현하기 - All in one

➢ 방법 2 : 구분되는기능별로응용서비스클래스를 (2~3개로 ) 따로구현하기 - Split

❖ 장 , 단점 방법 1 방법 2

장점- 한도메인관련기능이한곳에위치- 각기능내동일로직에대한코드중복감소

- 코드품질저하방지- 각클래스에는필요한의존객체만포함하여 다른코드간영향을덜받는다 .

단점- 클래스의크기가커지게된다 .- 서로관련없는코드가한데모일수있음- 추후코드이해에어려움발생

- 클래스의개수가많아진다 .

Page 8: Ddd start!   6장. 응용 서비스와 표현 영역

응용서비스 : 인터페이스사용

❖ ‘ ’ 응용서비스구현시 인터페이스는반드시필요한가 ?

➢ 인터페이스가명확히필요하기전에응용서비스에인터페이스작성은좋지않다 .

➢ 테스트주도개발 (TDD) 시표현영역테스트를위해인터페이스사용은지양

→ Mock 을사용하여가짜객체생성

❖ 문제점

➢ 소스파일증가 ( 인터페이스 + 클래스 )

➢ 구현클래스에대한간접참조증가 -> 복잡한구조

Page 9: Ddd start!   6장. 응용 서비스와 표현 영역

응용서비스 : 파라미터전달

❖ ‘ ’ 응용서비스의 메서드파라미터 전달은어떻게할것인가 ?

➢ 요청파라미터가두개이상존재할경우전달을위한별도클래스생성

❖ 파라미터전달방식

Page 10: Ddd start!   6장. 응용 서비스와 표현 영역

응용서비스 : 값리턴

❖ 표현영역은필요시응용서비스로부터어떻게값리턴을받을것인가 ?

➢ 가능한표현영역에서필요한데이터만리턴해야좋다 .

❖ 값리턴방식비교

Page 11: Ddd start!   6장. 응용 서비스와 표현 영역

응용서비스 : 값리턴

Page 12: Ddd start!   6장. 응용 서비스와 표현 영역

응용서비스 : 파라미터타입

❖ 파라미터타입결정은어떻게할것인가 ?

➢ 응용서비스의파라미터타입은표현영역과관련된타입을사용하면안된다 .

➢ 메서드의파라미터와리턴타입으로표현영역의구현기술을사용하지않는다 .

❖ 문제점

➢ 응용서비스단독으로테스트하기어려움

➢ 표현영역의구현이변경되면응용서비스의

구현도함께변경해야한다 .

➢ 응용서비스가표현영역의역할을대신해

버릴수도있다 .

Page 13: Ddd start!   6장. 응용 서비스와 표현 영역

응용서비스 : 트랜잭션관리

❖ 트랜잭션관리는어떻게할것인가 ?

➢ 프레임워크에서제공하는트랜잭션관리기능사용

➢ 간단한설정으로쉽게트랜잭션시작 / 롤백가능

❖ 프레임웨크별트랜잭션관리

➢ Spring (Java) : @Transactional 어노테이션사용

➢ Django (Python) : @transaction.atomic 데코레이터사용

Page 14: Ddd start!   6장. 응용 서비스와 표현 영역

응용서비스 : 이벤트처리

❖ 도메인영역에서발생한이벤트는어떻게처리할것인가 ?

➢ 응용서비스에서발생한이벤트를받아서처리한다 .

➢ 이벤트발생 : Event.raise()

➢ 이벤트처리 : Event.handle()

❖ 이벤트사용의장점

➢ 도메인간의의존성이나외부시스템에대한의존을낮춰준다 .

➢ 시스템확장에유리하다 .

❖ 이벤트사용의단점

➢ 코드가다소복잡하다 .

Page 15: Ddd start!   6장. 응용 서비스와 표현 영역

응용서비스 : 이벤트처리

Page 16: Ddd start!   6장. 응용 서비스와 표현 영역

표현영역

❖ 표현영역의책임

➢ 사용자가시스템을사용할수있는 (

화면 ) 흐름을제공하고제어한다 .

■ 리다이렉트링크

■ 입력폼

➢ 사용자의요청을알맞은응용서비스에

전달하고 , 결과를사용자에게

제공한다 .

➢ 사용자의세션을관리한다 .

Page 17: Ddd start!   6장. 응용 서비스와 표현 영역

값검증❖ 값검증은어느영역에서수행할것인가 ?

➢ 표현영역

➢ 응용서비스

➢ 둘다

❖ 응용서비스에서값검증시문제점

➢ Exception 을사용해검증할경우 , 동시에여러값검증을할수없게된다 .

➢ 즉 , 에러발생시뒤에남은값에대한검증이이뤄지지않는다 . 사용자는 Exception 이발생한에러만볼수있고 , 나머지값은한번에검증할수없다 .

➢ ‘ ’ 응용서비스수행전에 표현영역에서값검증을하여해소가능(Spring F/W 에선 Validator 인터페이스사용 )

Page 18: Ddd start!   6장. 응용 서비스와 표현 영역

값검증

Page 19: Ddd start!   6장. 응용 서비스와 표현 영역

값검증

❖ 결론

➢ 표현영역 : 필수값 , 값의형식 , 범위등을검증

➢ 응용서비스 : ‘ ’ 데이터의존재유무와같은 논리적오류 검증

➢ 엄격한값검시가필요하다면두영역모두값검증수행

Page 20: Ddd start!   6장. 응용 서비스와 표현 영역

권한검사

❖ 권한검사구현방법

➢ 보안프레임워크사용 : Spring Security, Apache Shiro 등

➢ 직접권한검사기능구현

❖ 권한검사를수행하는영역

➢ 표현영역 : 특정 URL 접근시인증여부 / 권한검사

➢ 응용서비스 : 표현영역만으로제어가어려울경우 , 메서드단위로검사

➢ 도메인

Page 21: Ddd start!   6장. 응용 서비스와 표현 영역

권한검사

Page 22: Ddd start!   6장. 응용 서비스와 표현 영역

응용서비스의조회전용기능

❖ ‘ ’ 조회전용기능을반드시 응용서비스에서만구현할필요는없다 .

컨트롤러

조회전용기능(DAO/

리포지터리 )

조회응용서비스

컨트롤러

조회전용기능(DAO/

리포지터리 )

Page 23: Ddd start!   6장. 응용 서비스와 표현 영역

응용서비스의조회전용기능