디자인 패턴

효준·2024년 12월 4일
0

싱글톤 패턴

하나의 클래스에 오직 하나의 인스턴스만 가지는 패턴이며 단 하나의 인스턴스를 만들어 로직을 만드는데 쓰이며 데이터베이스 연결 모듈에 많이 사용됩니다.
하나의 인스턴스를 만들고 다른 모듈들이 공유하며 사용하여 인스턴스 생성시 드는 비용이 줄어드는 장점이 있지만 의존성이 높아지는 단점이 있다.

단점

TDD를 할 시 단위 테스트를 주로 시행하는데 단위 테스트는 테스트가 각각 독립적이어야 하지만 싱글톤은 하나의 인스턴스를 기반으로 하기에 독립적인 인스턴스 생성이 힘들다.

의존성 주입(DI)

싱글톤 패턴은 실용적이지만 모듈 간 결합을 강하게 하는 단점이 있는데 DI를 통해 모듈 간 결합을 낮출 수 있습니다.

위 그림처럼 메인 모듈이 직접적으로 다른 하위 모듈에 대한 의존성을 주는 방식 보다 의존성 주입자를 통해 메인모듈이 간접적으로 의존성을 주입하는 방식이고 이를 통해 메인 모듈은 하위 모듈에 대한 의존성이 감소하고 이를 디커플링 이라고 한다.

장점

모듈들을 쉽게 교체할 수 있는 구조가 되어 테스팅이 쉽고 마이그레이션 하기도 수월해진다.
구현시 추상화 레이어를 넣어 의존성 방향이 일관되며 애플리케이션을 쉽게 추론할 수 있고 모듈간 관계가 더 명확해집니다.

단점

모듈의 분리로 클래스 수 증가로 복잡성이 증가하며 런타임 패널티가 생길 수 있다.

원칙

상위 모듈은 하위 모듈에서 어떠한 것도 가져오지 않아야하며 둘 다 추상화에 의존해야 한고 추상화는 세부 사항에 의존하지 않는다.

팩토리 패턴

코드에서 객체 생성 부분을 떼어 추상화한 패턴, 상속 관계에서 상위 클래스가 뼈대를 결정하고 하위가 객체 생성시 구체적인 내용을 결정하는 패턴입니다.
상하위 분리로 결합이 느슨해지며 상위는 인스턴스 생성 방식을 알 필요가 없어 유연성을 갖게된다. 또한 객체 생성 로직이 분리되어 유지보수성이 증가합니다.

전략 패턴

객체 행위를 바꿀때 전략이라 불리는 '캡슐화한 알고리즘'을 컨텍스트 안에서 바꿔주면서 상호 교체하는 패턴이다.

컨텍스트

상황, 맥락, 문맥을 의미하면 개발자가 어떠한 작업을 완료하는 데 필요한 모든 관련 정보

옵저버 패턴

주체가 어떤 객체의 상태 변화시 메서드 등을 통해 옵저버 목록에 있는 옵저버들에게 변화를 알리는 패턴이다.
주체는 상태 변화를 보는 관찰자, 옵저버는 객체 상태 변화에 따라 추가 변화 사항이 생기는 객체를 말한다.

옵저버 패턴은 주로 이벤트 기반 시스템에 사용하여 MVC 패턴에도 사용된다.

프록시 패턴과 프록시 서버


프록시 패턴은 객체에 접근 전 흐름을 가로채 접근을 필터링하고 수정하는 디자인 패턴입니다.

이를 통해 객체의 속성, 변환 등을 보안, 데이터 검증, 캐싱, 로깅에 사용합니다. 이는 프록시 서버로도 활용된다.

프록시 서버 캐싱

캐시 안에 있는 정보를 요구하는 요청에 대해 원격 서버에 요청하지 않고 캐시의 데이터를 활용한다. 외부와 연결을 하지 않아 트래픽을 줄일 수 있다.

프록시 서버

서버와 클라이언트 사이 클라이언트가 자신을 통해 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해주는 시스템이나 프로그램을 가리킨다.

프록시 서버 nginx

nginx는 비동기 이벤트 기반의 구조와 다수의 연결을 처리 가능한 웹 서버이다. (Node.js 서버 앞단에 사용)
Node.js의 버퍼 오버플로우 취약점을 예방하기 위해 nginx를 프록시 서버 앞단, Node.js를 뒤쪽에 놓는 방식을 사용한다.
이를 통해 사용자가 서버에 접근하는 것을 차단, 간접적으로 한 단계를 더 거치도록 보안을 강화할 수 있다. 또한, 정적 자원을 gzip 압축하거나 메인 서버 앞단에서 로깅할 수 있다.

  • 버퍼 오버플로우

    버퍼는 데이터가 저장되는 공간으로 이를 벗어나는 경우를 말한다. 이때 사용되지 않아야 할 영역에 데이터가 덮어씌워져 주소, 값을 바꾸는 공격이 발생하기도 한다.

  • gzip 압축

    LZ77과 Huffman 코딩의 조합인 DEFLATE 알고리즘을 기반으로 한 압축 기술이다. gzip 압축을 하면 데이터 전송량을 줄이지만 압축 해제시 서버에서 CPU 오버헤드도 생각해 gzip 압축 사용 유무를 결정해야 한다.

프록시 서버 CloudFlare

전 세계적으로 서버가 있고 콘텐츠 전달을 빠르게 할 수 있는 CDN 서비스이다.

CDN(Content Delivery Network)

각 사용자가 인터넷에 접속하는 곳과 가까운 곳에서 콘텐츠를 캐싱 또는 배포하는 서버 네트워크이다. 사용자가 웹 서버로부터 콘텐츠 다운로드 시간을 줄일 수있다.

DDOS 공격 방어

의심스러운 트래픽, 사용자가 접속하는 것이 아닌 시스템을 통해 오는 트래픽을 자동으로 차단하고 공격에 대한 방화벽 대시보드도 제공한다.

CORS

CORS(Cross-Origin Resource Sharing)는 서버가 웹 브라우저에서 리소스 로드시 다른 오리진을 통해 로드하지 못하게 하는 HTTP 헤더 기반 메커니즘입니다.

프런트엔드 개발 시 프런트엔드 서버를 만들어 백엔드와 통신 시 주로 CORS 에러가 발생하는데 이를 해결하기 위해 프런트엔드에서 프록시 서버를 만든다.

  • 오리진

    프로토콜과 호스트 이름, 포트의 조합을 말한다.

이터레이터 패턴

이터레이터를 사용해 컬렉션의 요소들에 접근하는 패턴이며 순회할 수 있는 여러 자료형의 구조와 상관 없이 이터레이터라는 인터페이스로 순회가 가능하다.

노출모듈 패턴

즉시 실행 함수를 통해 접근 제어자를 만드는 패턴이다.

MVC 패턴

  • Model
    • 애플리케이션의 데이터인 데이터베이스, 상수, 변수 등을 말한다.
  • View
    • 사용자의 인터페이스 요소를 말한다. 모델을 기반으로 사용자가 볼 수 있는 화면을 말한다.
      정보를 따로 저장하지 않고 정보의 변경일 일어나면 컨트롤러에 전달한다.
  • Controller
    • 모델과 뷰를 잇는 다리이며 이벤트 등 메인 로직을 담당하고 모델과 뷰의 생명주기도 관리한다.

MVP 패턴

MVC 패턴으로부터 파생되었고 컨트롤러가 프레젠터로 변경되고 뷰와 프레젠터가 1:1 관계로 결합이 강해진 패턴이다.

MVVM 패턴

컨트롤러가 뷰모델로 변경되고 뷰모델은 뷰를 더 추상화한 계층이며 커맨드와 데이터 바인딩을 가지고 뷰와 뷰모델 사이의 양방향 데이터 바인딩을 지원하며 단위 테스팅 하기 쉽다.


익숙한 패턴들도 있는 반면 여전히 사용해 본적이 없는 생소하다고 느끼는 패턴들도 많은 것 같다. 추후에 각 패턴의 장단점을 알고 적용해보려는 시도를 해보는 것도 좋은 경험이 될 것이라고 생각된다.

profile
사진은 캣타워가 생겨 포효하는 고양이입니다.

0개의 댓글

관련 채용 정보