1 of 52

프레임워크 종속을 피하기위한 클라이언트 설계

이종훈

2 of 52

퀴즈

C# GUI 프레임워크 종류

3 of 52

Agenda

프레임워크 마이그레이션 실패

역할을 분리하여 설계하기

의존성 주입

프레임워크 의존성 범위 지정하기

데이터 모델에서 고려할 사항

마지막으로 한가지만 더하면?

4 of 52

시험 관리 프로그램

채점관이 응시자의 제출 답안을 보고 직접 채점하는 기능 페이지

5 of 52

00

마이그레이션 시도 실패 과정

6 of 52

  • 위지위그 방식의 디자이너 제공
  • 컨트롤에 더블클릭 하는 것만으로 이벤트 추가하고 로직을 추가하는 방식으로 개발 가능

Winform

처음 진입하기 정말 편한 GUI Framework

7 of 52

  • 디자인 된 컨트롤 만들기가 어려움
  • 현대적인 디자인을 적용하기가 어려움.
  • SVG와 같은 벡터이미지를 지원하지 않음
  • Scroll View와 같이 화면을 벗어나는 프로그램을 작성하기 곤란함.

Winform

처음 진입하기 정말 편한 GUI Framework

8 of 52

  • SVG 사용 가능
  • xaml 코드로 수월한 ui컨트롤 디자인을 수월하게 변경 가능

WPF

xaml에 대한 학습이 필요하지만 UI/UX 품질에서 더 수월한 개발 가능

9 of 52

프레임워크를 바꾸고 더 UI적으로 좀더 수려한 애플리케이션을 개발하고 싶다.

10 of 52

어려운 원인

라이브러리 의존성

복사 & 붙여넣기로 하는 코드 재사용의 한계점

11 of 52

12 of 52

01

역할을 분리하여 설계

13 of 52

비즈니스 로직 분리

14 of 52

비즈니스 로직 분리

뷰 비하인드에서

채점 로직 처리도 하고,

통신도 하고,

UI 반영도 하고

데이터 모델 클래스

15 of 52

소프트웨어 개발에서 도메인 문제를 해결하거나, 특정 비즈니스 규칙과 프로세스를 구현하는 프로그램의 핵심 로직을 의미합니다.

16 of 52

비즈니스 로직 분리

17 of 52

비즈니스 로직 분리

18 of 52

비즈니스 로직 분리

19 of 52

시험 정보를 가져오는 책임

Http통신 수행이라는 책임

채점을 처리하는 비즈니스 로직

단일 책임 원칙

20 of 52

역할에 따른 분리

(서비스/리포지토리)

채점 대상을 가져오는 역할

어떻게 불러오는 지는 서비스에서 관여하지 않는다.

Http 통신을 통해서 채점 대상을 불러오는 역할

21 of 52

뷰 비하인드에서

채점 로직 처리도 하고,

통신도 하고,

UI 반영도 하고

뷰 비하인드에서 이벤트 받아서 채점 서비스에 전달

채점 서비스

채점 리포지토리

비즈니스 역할 분리

데이터 모델 클래스

데이터 모델 클래스

22 of 52

뷰 비하인드는 그럼 단순해졌을까?

데이터 그리드에서 인덱스 처리하는 로직과, 서비스 호출, 서비스 처리 이후 로직이 뒤섞여 있음.

23 of 52

뷰와 모델사이의 중재

View(사용자 이벤트 전달, 사용자에게 정보 제공)

Presenter(뷰와 모델의 중재)

Model(비즈니스 로직)

View(사용자 이벤트 전달, 사용자에게 정보 제공)

ViewModel

(바인딩 엔진을 통해 뷰와 모델의 중재)

Model(비즈니스 로직)

24 of 52

뷰, 프레젠터로 분리

View

Presenter

25 of 52

뷰 비하인드에서

채점 로직 처리도 하고,

통신도 하고,

UI 반영도 하고

수동 채점뷰

채점 프레젠터

채점 서비스

채점 저장/불러오기

역할 분리

데이터 모델 클래스

데이터 모델 클래스

26 of 52

Repository Layer

Presentation Layer

수동 채점뷰

채점 프레젠터

Business Layer

채점 서비스

채점 저장

Data Model Layer

데이터 모델

27 of 52

02

의존성 주입

28 of 52

객체가 스스로 필요한 의존성을 생성하지 않고, 외부에서 제공받아 사용하는 방식

29 of 52

의존성 주입

30 of 52

의존성 주입

31 of 52

의존성 주입

32 of 52

의존성 주입

33 of 52

의존성 주입

34 of 52

의존성 주입

생성자 주입으로 사용

35 of 52

의존성 주입

인터페이스 호출시 전달해주는 구현체를 지정할 수 있음.

36 of 52

03

프레임워크 의존성 범위 지정

37 of 52

  • 편하게 쓸때는 좋지만,...
  • 마이그레이션 단계에서는 장애물이 됩니다.

프레임워크 의존성 범위 지정

GUI 프레임워크에서 편하게 쓰라고 준 기능들

38 of 52

  • BeginInvoke, Dispatcher.Invoke 대신 async /await으로 작성

Invoke 크로스 스레드 처리 대신 await으로

39 of 52

프레임워크 객체는 Presentation 레이어 안에서

Repository Layer

Presentation Layer

수동 채점뷰

채점 프레젠터

Business Layer

채점 서비스

채점 저장

프레임워크 의존성을 필요로 하는 코드가 여기에 있다면?��

40 of 52

프레임워크 객체는 Presentation 레이어 안에서

Repository Layer

Presentation Layer

수동 채점뷰

채점 프레젠터

Business Layer

채점 서비스

채점 저장

프레임워크 의존성은 여기까지만 사용합시다.

(마이그레이션 해도 재사용 안할 예정)

41 of 52

WinformMessageBox :�IMessageBox

다형성을 이용하기

IMessageBox

Show(string msg);�MessageBox.Show

혹은 인터페이스 계약관계를 통해서 구현체를 다르게 만드는 방법

Show(string msg);

WPFMessageBox :�IMessageBox

Show(string msg);�wpf용 alert 구현

42 of 52

04

데이터 모델에서 유의사항

43 of 52

Winform PictureBox의 Image

Data Model Layer

데이터 모델

44 of 52

WPF Image의 Source

45 of 52

채점 프레젠터

Winform Presentation Layer

Data Model Layer

데이터 모델

WPF Presentation Layer

46 of 52

Observable Object

47 of 52

05

마지막으로 한가지만 더하면?

48 of 52

Repository Layer

Presentation Layer

수동 채점뷰

채점 프레젠터

Business Layer

채점 서비스

채점 저장

Data Model Layer

데이터 모델

49 of 52

Presentation

Domain

Application

(비즈니스 구현)

Infrastructure�(리포지토리)

Entity Data Model

IRepository

BootStrap�(실행 / 의존성주입)

UseCase

50 of 52

51 of 52

마무리

52 of 52

행사 홍보

Flutter In Production

Extended Incheon

인천 유유기지 동구청년21

1월 18일 토요일