디자인 패턴에 대해 알아보자
ps)
라이브러리란와 프레임워크 -> 공통으로 사용될 수 있는 특정한 기능을 모듈화한 것
두 가지를 분리하는 가장 큰 특징은 주체가 누구인가이다.
프레임 워크는 폴더명 파일명에 대한 규칙이 있고 프레임워크가 주체가되어 나를 통제한다.이에반해 라이브러리는 내가 주체가 되어 라이브러리를 사용하는 차이가 있다.
디자인패턴
디자인 패턴이란 프로그램 설계시 발생한 문제점들을 객체 간 상호 관계 등을 이용해 해결 할 수 있게 규약형태로 만든 것
1. 싱글톤 패턴
- 하나의 클래스에 오직 하나의 인스턴스만 가지는 패턴 (spring boot에서 EntityManagerFactory) 주로 데이터베이스 연결 모듈에 많이 사용
싱글톤 패턴의 장단점
- 해당 인스턴스를 다른 모듈과 공유해 인스턴스 생성시 비용이 줄어듬
- 의존성이 높아짐 -> 의존성 주입을 통해 해결 가능
- 메인 모듈이 직접 의존성을 주기보다 중간 의존성 주입자가 의존성을 간접적으로 주입
- 단위 테스트가 어려움 why? 독립적인 인스턴스를 만들기 어려워서
ps)
- 의존성 주입 단점 : 모듈이 더욱 분리돼 클래스 수가 늘어나 복잡성 증가되고 런타임 패널티가 발생 할 수 있다.
- 의존성 주입원칙 : 상위 모듈은 하위모듈에서 어떠한 것도 가져오면 안됨
2. 팩토리 패턴
- 객체를 사용하는 코드에서 객체 생성 부분을 떼어내 추상화한 패턴. 상속 관계에 있는 두 클래스에서 상위클래스가 중요한 뼈대를 결정하고 하위클래스에서 객체 생성에 관한 구체적 내용을 결정
팩토리 패턴의 장단점
- 상위 클래스와 하위 클래스 분리로 느슨한 결합을 갖고 상위 클래스는 인스턴스 생성 방식을 알 필요가 없어 많은 유연성을 가짐
- 객체 생성 로직이 따로 있어 코드를 리팩터링해도 한곳만 고칠 수 있어 유지보수성 증가
ex) 바리스타 공장에서 라뗴, 아메리카노, 우유레시피를 통해 각각의 제품을 생산하는 공정을 생각해라
3. 전략패턴
- 객체의 행위를 바꾸고 싶을 때 직접 수정하지 않고 전략이라고 부르는 캡슐화한 알고리즘을 컨텍스트 안에서 바꿔 상호 교체가 가능하게 하는 패턴
ex) 네이버페이, 카카오페이로 결제하는 것처럼 결제 방식의 전략만을 바꾸는 것과 비슷, spring boot Oauth처럼 구글로그인,카카오로그인, 네이버로그인과 비슷
4. 옵저버 패턴
- 주체가 어떤 객체의 상태 변화를 관찰하다가 상태 변화가 있을 때마다 메서드를 통해 옵저버들에게 변화를 알려주는 패턴
ex) 트위터 : 주체가 새로운 트윗을 팔로워들에게 알려주는 것
- mvc패턴에도 사용된다.
5. 프록시 패턴과 프록시 서버
- 대상 객체에 접근하기 전 그 접근에 대한 흐름을 가로채 대상 객체 앞단의 인터페이스 역할을 하는 디자인 패턴
- 객체의 속성, 변환 등을 보완하고 보안, 데이터 검증, 캐싱, 로깅에 사용
프록시 서버:
-
서버 앞단에 둬 캐싱, 로깅 데이터 분석을 서보보다 먼저하는 서버
-
ps) 프록시 서버에서의 캐싱 : 캐시안에 정보를 담아두고 캐시안에 있는 정보를 요구하는 요청에 대해 다시 멀리 있는 원격 서버에 요청하지 않고 캐시 안에 있는 데이터를 활용하는 것, 트래픽을 줄일 수 있다.
ex) Nginx를 프록시 서버로 둬 실제 포트를 숨기고 정적 자원을 gzip압축하거나, 메인서버 앞단에서 로깅가능
웹서버 앞단에 두어 프록시 서버로 쓰는 cloudFlare
- cloudFlare는 분산 서버가 있고 시스템의 콘텐츠 전달을 빠르게 할 수 있는 CDN 서비스
CDN이란? : 인터넷에 접속하는 곳과 가까운 곳에서 콘텐츠를 캐싱 또는 배포하는 서버 네트워크
- 디도스 공격 방어, https 구축 가능
CORS와 프론트엔드 프록시 서버
6. 이터레이터 패턴
- 이터레이터를 사용해 컬렉션의 요소에 접근하는 디자인 패턴 : 여러가지 자료형의 구조와 상관없이 이터레이터라는 하나의 인터페이스로 순회가능
7. 노출모듈 패턴
- 즉시 실행 함수를 통해 private, public 같은 접근 제어자를 만드는 패턴
8. MVC 패턴
- model, view, controller로 이루어진 디자인 패턴
- 애플리케이션 구성 요소를 3가지 역할로 구분해 개발 프로세스에서 각각의 구성 요소에만 집중해 개발 가능
- 재사용성과 확장성에 용이
- 애플리케이션이 복잡해질수록 모델과 뷰의 관계가 복잡해짐
모델
- 애플리케이션의 데이터인 DB, 상수, 변수를 뜻함
- 뷰에서 데이터를 생성하거나 수정하면 컨트롤러를 통해 모델을 생성하거나 갱신
뷰
- inputbox, checkbox, textarea 등 사용자 인터페이스 요소
- 모델을 기반으로 사용자가 볼 수 있는 화면
- 모델이 가지고 있는 정보를 따로 저장하지 않고 단순히 화면에 표시하는 정보만 가지고 있어야함
컨트롤러
- 하나이상의 모델과 하나 이상의 뷰를 잇는 다리 역할
- 이벤트 메인 로직 담당
- 모델과 뷰의 생명주기 관리
- 모델이나 뷰의 변경 시 이를 해석해 각각의 구성요소에 정보 전달
EX) MVC 패턴 이용한 라이브러리 - React
9. MVP 패턴
- MVC패턴에서 파생 되었고 모델, 뷰, 프레젠터로 교체된 패턴
- 뷰와 프레젠터는 일대일 관계이기 때문에 MVC패턴보다 더 강한 결합을 지님
10. MVVM 패턴
- 모델, 뷰, 뷰모델로 이루어진 패턴
- 뷰모델은 뷰를 더 추상화한 계층
- 커멘드와 데이터 바인딩을 뷰와 뷰모델끼리 가짐
- 뷰와 뷰모델 사이의 양방향 데이터 바인딩을 지원하고 UI를 별도의 코드 수정없이 재사용가능하고 단위 테스팅이 쉽다.
PS) 데이터 바인딩 : 화면에 보이는 데이터와 웹 브라우저의 메모리 데이터를 일치시키는 기법
EX) Vue
자주 묻는 질문:
- 옵저버 패턴 구현방법은? 프록시 객체 이용. 프록시 객체를 통해 객체의 속성이나 메서드 변화를 감지하고 미리 설정해 놓은 옵저버에게 전달
출처 : 면접을 위한 CS 전공지식 노트