디자인 패턴
소프트웨어 개발에서 특정한 문제를 해결하기 위한 구조화된 방법론 또는 설계 템플릿
즉, 프로그램이나 어떤 특정한 것을 개발하는 중에 발생했던 문제점들을 정리해서 상황에 따라 간편하게 적용해서 쓸 수 있는 것을 정리하여
특정한 "규약"을 통해 쉽게 쓸 수 있는 형태로 만든 것
-> 반복적으로 발생하는 소프트웨어의 디자인 문제를 해결하기 위한 검증된 솔루션을 제공하고
개발자들 간에 공통된 언어와 접근 방식을 통해 협업을 쉽게 할 수 있음
디자인 패턴을 사용하는 이유
디자인 패턴은 다양한 이점을 제공하는데,
1. 재사용성 : 이미 검증된 솔루션을 제공하므로 개발자들은 이를 재사용하여 빠르게 프로그래밍이 가능
2. 유지보수성 : 코드가 이미 구조화 되어 있기 때문에 패턴에 따라 코드를 작성하게 되므로 추후 코드의 수정/변경이 용이
3. 코드 가독성 : 일관성 있는 코드로 이해하기 쉽게 구성
4. 좋은 프랙티스 : 소프트웨어 엔지니어링에서의 좋은 프랙티스를 제공하며, 기존의 경험과 지식을 바탕으로 개선된 아키텍처를 구축하는데 도움
MVC
소프트웨어를 모델(Model), 뷰(View), 컨트롤러(Controller)로 나누는 아키텍처 패턴
- 모델(Model) : 데이터와 비즈니스 로직을 관리
- 뷰(View) : 사용자 인터페이스 표시
- 컨트롤러(Controller) : 모델-뷰의 상호작용을 조정
✅ 복잡한 애플리케이션에서는 컨트롤러가 비대해질 수 있고 이로 인하여 유지보수가 어려워 질 수 있음
✅ 순환 종속성(Circular Dependency) 문제가 발생할 수 있음
※ 순환 종속성(Circular Dependency)이란?소프트웨어 컴포넌트나 모듈 간에 서로 의존성이 발생하여 서로를 직접 또는 간접적으로 참조하는 상황
코드 간 의존성이 높아질수록 많은 문제가 발생
1. 컴파일 오류 : 모듈 간 순환 종속성이 있으면 컴파일 오류가 발생할 수 있음
2. 디버깅 어려움 : 프로그램의 실행 흐름을 이해하는데 어렵기 때문에 디버깅이 어려워짐
3. 모듈 독립성 손실 : 모듈이 서로 독립적으로 재사용 될 수 없기때문에 시스템의 모듈성과 확장성이 모두 손실 될 가능성이 있음
//Model
//Spring 사용 시
@Getter
@Setter
public class Model {
private String data;
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
}
// View
public class View {
public void showData(String data) {
System.out.println("Data: " + data);
}
}
// Controller
//Spring 사용 시
@Controller
public class Controller {
private Model model;
private View view;
public Controller(Model model, View view) {
this.model = model;
this.view = view;
}
public void updateData(String newData) {
model.setData(newData);
view.showData(model.getData());
}
}
MVP
MVP 패턴은 MVC와 유사하지만, 뷰(View)와 모델(Model)은 직접 상호 작용하지 않고 프레젠터(Presenter)를 통해 통신하는 아키텍처 패턴
- 모델(Model) : 데이터와 비즈니스 로직을 관리
- 뷰(View) : 사용자 인터페이스 표시 및 이벤트 처리
- 프레젠터(Presenter) : 뷰와 모델 사이의 중재자 역할을 하며, 뷰와 모델의 완전한 분리를 도움
✅ 테스트 용이성이 높아짐
✅ MVC에 비하여 코드가 더 모듈화 되어있어 유지보수가 용이
✅ 순환 종속성 문제를 해결할 수 있지만 디자인 패턴 자체가 MVC보다 약간 더 복잡함
// Model
public class Model {
private String data;
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
}
// View
public interface View {
void showData(String data);
}
// Presenter
public class Presenter {
private Model model;
private View view;
public Presenter(Model model, View view) {
this.model = model;
this.view = view;
}
public void updateData(String newData) {
model.setData(newData);
view.showData(model.getData());
}
}
MVVM
MVVM 패턴은 뷰(View)와 모델(Model) 사이에 뷰 모델(ViewModel)을 사용하여 데이터와 비즈니스 로직을 분리하는 패턴으로
주로 웹 및 모바일 앱 개발에서 사용
- 뷰 모델(ViewModel) : 사용자 인터페이스와 상태 관리를 담당하며, 데이터 바인디을 통해 모델의 변경사항을 자동으로 반영
✅ 테스트 용이성이 뛰어남
✅ 복잡한 데이터 바인딩 로직을 구현하기 위한 학습 곡선이 있을 수 있고 일부 작업에서는 오버헤드가 발생 할 가능성이 높음
✅ 기존 애플리케이션에 MVVM을 도입하는데 시간과 비용이 듬
// Model
public class Model {
private String data;
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
}
// View
public interface View {
void showData(String data);
}
// Presenter
public class Presenter {
private Model model;
private View view;
public Presenter(Model model, View view) {
this.model = model;
this.view = view;
}
public void updateData(String newData) {
model.setData(newData);
view.showData(model.getData());
}
}
'📚 CS [ComputerScience]' 카테고리의 다른 글
Computer Science - 프로그래밍 패러다임 (0) | 2023.11.09 |
---|---|
Computer Science - MVC 패턴과 MVVM 패턴의 비교 (0) | 2023.11.08 |
Computer Science - 페이징과 세그멘테이션 (0) | 2023.11.07 |
Computer Science - 메모리 (0) | 2023.11.07 |
Computer Science - 멀티 프로세스와 멀티 스레드 (1) | 2023.11.06 |