1. DataContext  사전 학습

더보기

1) DataBinding, 2) SOLID 를 학습했다는 가정하에 진행합니다.

 

2. DataContext 실습 예제

더보기

이전 DataBinding 예제를 사용합니다.

DataContext 준비.zip
0.07MB

 

 

3. OOP 구조

더보기

1. 목적

 

가장 먼저, OOP(객체 지향 프로그래밍 언어)의 객체간 구조에 대해 이해하고 진행합니다.

 

 

 

 

2. 모든 프로그램의 시작점

 

C# WPF Main( ) 함수는 어디에 있을까요?

모든 프로그램의 시작은, Main( ) 함수입니다.

 

 

 

 

 

3. OOP란?

 

>> 프로그램을 단순히 데이터와 처리 방법으로 나누는 것이 아니라, 프로그램을 수많은 '객체(object)'라는 기본 단위로 나누고 이들의 상호 작용으로 서술하는 방식이다.

 

*객체(object)는 Class 라는 자료형의 구현체일 뿐이다. 결국 Data이고 Logic이다.

 

4. XAML & UI Control C#

더보기

1. 위 예제 파일을, C# 소스코드로 UI Control을 구현한 파일입니다.

DataBinding_CSUI - CB.zip
0.07MB

 

2. 비교

 

 

 

 

3. MVVM 으로 분할한다면?

 

TextBox 컨트롤이 구현된 MainWindow(View)
Person 객체가 정의된 ViewModel 클래스(ViewModel)
서로 다른 C# 파일에 각각 분리되어 있다고 가정합시다.

 

이때 MainWindow에서 ViewModel의 속성에 Data Binding이 되어 있다면,
View(MainWindow) 는 **ViewModel을 어떻게 인식하고 접근할 수 있을까요?

 

또한, SOLID 원칙, 특히 DIP(Dependency Inversion Principle) 을 적용하여
View와 ViewModel 간의 결합을 줄이기 위한 구조는 어떻게 설계해야 할까요?

 

 

 

 

4. 참고 예시

 

처음 SOLID의 DIP 원칙을 배울 때 Zoo 클래스가 직접 Cat, Dog 클래스에 의존하지 않고,
공통 인터페이스인 IAnimal에 의존하도록 설계했었습니다.

public interface IAnimal
{
void MakeSound();
}
public class Cat : IAnimal
{
public void MakeSound() => Console.WriteLine("Meow");
}
public class Dog : IAnimal
{
public void MakeSound() => Console.WriteLine("Woof");
}
public class Zoo
{
private readonly IAnimal _animal;
public Zoo(IAnimal animal)
{
_animal = animal;
}
public void Run() => _animal.MakeSound();
}

이를 위 예제에 어떻게 적용해야 할지 고민하고 구현해봅시다.

 

 

 

 

5. DataContext 속성의 상속 구조

 

 

 

 

6. ViewModel & DataContext

// ViewModel 설정
this.DataContext = new PersonViewModel();

 

ViewModel 객체를 생성해 DataContext 객체에 할당합니다.

 

 

 

 

6. ViewModel 구현 소스코드

 

DataBinding_CSUI - VM.zip
0.07MB

 

5. DataContext 사용 목적

더보기

1. DataContext 사용 목적

 

객체간 종속성을 제거  MVVM 패턴에서 UI(View)와 로직(ViewModel) 객체 분리  느슨한 결합(loose coupling) 구현 

 

 

 

 

2. 느슨한 결합(loose coupling) 이란?

 

>> 소프트웨어 설계에서 객체 또는 모듈 간의 연결(의존성)을 최소화하여 유연하고 유지보수하기 쉬운 구조를 만드는 원칙을 말합니다.

 

❌ 강한 결합 (Tight Coupling)

// OrderService는 PaymentService에 강하게 의존
// PaymentService 객체의 payment.Pay()가 변경되면 OrderService도 영향을 받음
public class OrderService
{
private PaymentService payment = new PaymentService();
public void ProcessOrder()
{
payment.Pay(); // 직접 호출
}
}

 

✅ 느슨한 결합 (Loose Coupling)

// OrderService는 IPaymentService라는 추상화된 계약(interface) 만 알고 있음
// 다양한 구현체를 쉽게 교체하거나 주입 가능 (예: 카드결제, 가상계좌 등)
public interface IPaymentService
{
void Pay();
}
public class OrderService
{
private readonly IPaymentService _payment;
public OrderService(IPaymentService payment)
{
_payment = payment;
}
public void ProcessOrder()
{
_payment.Pay(); // 인터페이스만 알고 있음
}
}

 

 

 

 

3. OOP, SLOID, MVVM


>> 느슨한 결합은, "의존성 제거"가 구현된 형태다.

>> 1. 의존성 이해 >> 2. SOLID 원칙 준수 기법 학습 >> 3.  느슨한 결합

 

 

 

 

4. DataContext 역할

 

UI(View)와 로직(ViewModel) 객체가 분리된 별도의 파일에서 
UI(View)객체의 요소가 DataBinding의 기준이 되는 로직(ViewModel) 객체를 찾을 수 있도록 지정합니다.

 

 

 

 

5. MVVM 구조

 

ViewModel을 View에 직접 참조하지 않음 → ViewModel은 View(UI)를 몰라도 됨 → 느슨한 결합

Model은 ViewModel에 직접 참조하지 않음 → Model은 ViewModel를 몰라도 됨 → 느슨한 결합

 

6. 소스코드

더보기

1. CodeBehind에 모두 구현했던 4번과 비교해야 합니다.

 

DataBinding_CSUI - MVVM.zip
0.07MB

 

4번 예제를 MVVM에 맞춰 Model.cs 파일, View.cs 파일, ViewModel.cs 파일로 분할하여,

MVVM 구조로 변환된 프로젝트의 소스코드 입니다.

 

 

 

 

2. MVVM 프로젝트 구조

 

DataBinding_CSUI/

├── Models/
│   └── Person.cs


├── View/
│   └── MainWindow.xaml

│          └── MainWindow.xaml.cs

├── ViewModels/
│   └── PersonViewModel.cs

└── App.xaml