외부에서 모듈을 생성하여 집어넣는 구조가 되기 때문에 모듈들을 쉽게 교체할 수 있는 구조가 된다.
단위 테스팅과 마이그레이션이 쉬워진다.
마이그레이션 : 다른 운영환경으로 이동하는 것(DB이동, 데이터 이동 등)
애플리케이션 의존성 방향이 좀 더 일관되어 코드를 추론하기가 쉬워진다.
의존성 주입의 단점
결국에는 모듈이 더 생기게 되므로 복잡도가 증가한다.
종속성 주입 자체가 컴파일을 할 때가 아닌 런타임 때 일어나기 때문에 컴파일을 할 때 종속성 주입에 관한 에러를 잡기가 어려워질 수 있다.
전략 패턴
전략 패턴(strategy pattern)은 정책 패턴(policy pattern)이라고도 한다.
객체의 행위를 바꾸고 싶은 경우 직접 수정하지 않고 전략이라고 부르는 ‘캡슐화한 알고리즘’을 컨텍스트 안에서 바꿔주면서 상호 교체가 가능하게 만드는 패턴
ex) 네이버페이, 카카오페이 등 다양 한 방법으로 결제
컨텍스트
컨텍스트의 두 가지 의미
어떤 종류의 상태, 환경을 캡슐화한 것
작업이 중단되고 나중에 같은 지점에서 계속 될 수 있도록 저장하는 최소 데이터 집합 (컨텍스트 스위칭)
전략 패턴과 DI의 차이
공통점 : 둘 다 모두 무언가를 쉽게 교체하기 위한 디자인 패턴
차이점
전략패턴 : 어떤 동일한 행동 계약을 기반으로 다양한 구현이 명시되어있는 인터페이스를 만드는 것을 포함한다. → 행위를 기반으로 수행
의존성 주입 : 단지 일부 동작을 구현하고 의존성을 주입하기만 하는 패턴
옵저버 패턴
어떤 객체(subject)의 상태 변화를 관찰
상태 변화가 있을 때마다 메서드 등을 통해 옵저버 목록에 있는 옵저버들에게 변화를 알려주는 디자인 패턴
트위터의 메인로직, MVC 패턴에도 적용되어 있다.
프록시 패턴
객체가 어떤 대상 객체에 접근하기 전, 그 접근에 대한 흐름을 가로채서 해당 접근을 필터링하거나 수정하는 등의 역할을 하는 계층이 있는 디자인 패턴
ex) 서버 앞단에 두어 캐싱, 로깅 등에 활용하는 프록시서버
MVC 패턴
모델(Model), 뷰(View), 컨트롤러(Controller)로 이루어진 디자인 패턴
이를 반영한 대표적인 프레임워크로 Spring WEB MVC가 있다.
Model
애플리케이션의 데이터인 데이터베이스, 상수, 변수 등을 뜻한다.
뷰에서 데이터를 생성하거나 수정할 때 컨트롤러를 통해 모델이 생성 또는 업데이트 된다.
ex) 사용자가 박스에 글자를 적는다 → 모델 = 박스의 크기정보, 글자 내용, 글자 위치, 글자 포맷 정보 등
View
inputbox, checkbox, textarea 등 사용자 인터페이스(UI) 요소를 나타내며 모델을 기반으로 사용자가 볼 수 있는 화면을 뜻한다.
모델이 가지고 있는 정보를 따로 저장하지 않아야 하며 변경이 일어나면 컨트롤러에 이를 전달해야 한다.
Controller
하나 이상의 Model과 하나 이상의 View를 잇는 다리 역할을 한다.
이벤트 등 메인 로직을 담당한다.
Model과 View의 생명주기를 관리하며 Model이나 View의 변경 통지를 받으면 이를 해석하여 각각의 구성요소에 해당 내용에 대해 알려준다.
장단점
장점
애플리케이션의 구성 요소를 세 가지 역할로 구분하여 개발 프로세스에서 각각의 구성 요소에만 집중해서 개발할 수 있다.
재사용성과 확장성이 용이하다.
단점
애플리케이션이 복잡해질 수록 Model과 View의 관계가 복잡해진다.
MVP 패턴
Controller가 Presenter로 교체된 패턴
V와 P는 1:1 관계이므로 MVC보다 더 강한 결합을 지닌 디자인 패턴이다.
MVVM 패턴
Controller가 View Model(VM)로 바뀐 패턴
VM은 View를 추상화한 계층이며 VM : V = 1 : N 이라는 관계를 갖는다.
이를 반영한 대표적인 프레임워크로 Vue.js가 있다.
VM은 커멘드와 데이터 바인딩을 가진다.
커맨드 : 여러 요소에 대한 처리를 하나의 액션으로 처리할 수 있는 기법
데이터 바인딩 : 화면에 보이는 데이터와 브라우저 상의 메모리 데이터를 일치시키는 방법
차이점
Spring의 MVC 패턴 적용 사례
Dispatcher Survlet의 요청처리 과정
클라이언트 요청 시 가장 먼저 Dispatcher Servlet이 이를 받는다. (프론트 컨트롤러의 역할) 이 때 url이나 form data 등 여러 개의 데이터 등을 기반으로 어떤 컨트롤러에게 이를 처리하게 할지 결정하는 역할을 한다. 보통 클래스 이름, url, xml의 설정 등을 참고 할 수 있지만 보통 @RequestMapping 을 참고해서 한다.
하나 이상의 handler mapping을 참고해서 적절한 컨트롤러를 설정한다. 이후 컨트롤러로 요청을 보낸다.
컨트롤러는 데이터베이스에 접근하여 데이터를 가져오는 등 비즈니스 로직을 수행한다.
그렇게 해서 사용자에게 전달해야할 정보인 모델을 생성한다.
그 다음 뷰를 구현하기 위한 view resolver를 참고한다.
해당 정보를 기반으로 뷰를 렌더링한다.
응답 데이터를 보낸다.
flux 패턴
페이스북이 만든 패턴
기존의 MVC패턴은 어플리케이션이 복잡해질수록 모델과 뷰의 관계도 복잡해지는 문제가 있었다.
MVC는 양방향 → 데이터가 일관성있게 공유하기 어려웠다.
mark seen(읽은 표시) 기능에 장애 발생
이를 해결하기 위에 등장한 flux 패턴은 단방향으로 데이터 흐름을 관리하는 디자인패턴
장점
단방향이기에 데이터 일관성이 증가 → 테스팅이 쉬워짐 → 버그를 찾기 쉬워진다.
Action
사용자의 이벤트를 담당한다. 마우스 클릭이나, 글을 쓴다던가 등을 의미하며 해당 이벤트에 관한 객체를 만들어내 dispatcher에게 전달한다.
Dispatcher
Dispatcher는 들어오는 Action 객체 정보를 기반 어떠한 “행위”를 할 것인가를 결정한다. 보통 action객체의 type를 기반으로 미리 만들어 놓은 로직을 수행하고 이를 Store에 전달한다.