230515 TIL #85 디자인패턴 / 싱글톤 / 팩토리 / 전략 / 옵저버 / 프록시

김춘복·2023년 5월 15일
0

TIL : Today I Learned

목록 보기
85/571

230515 Today I Learned

지원 주차 셋째날. 이력서 1차작성을 마무리하고 CS공부를 했다.


라이브러리

  • 공통으로 사용될 수 있는 특정한 기능들을 모듈화 한 것.
  • 폴더명, 파일명에 대한 규칙이 없고 프레임워크에 비해 자유롭다.
  • 컨트롤의 주체는 프로그래머.

프레임워크

  • 공통으로 사용될 수 있는 특정한 기능들을 모듈화 한 것.
  • 폴더명, 파일명에 대한 규칙이 있고 라이브러리에 비해 엄격하다.
  • 컨트롤의 주체는 프레임워크에 있다.

디자인패턴

  • 프로그램을 설계할 때 발생했던 문제점들을 해결하기 위해 개발자들이 만든 일종의 재사용 가능한 솔루션, 하나의 규약 형태로 만들어 놓은 것.
  • 디자인 패턴은 설계 문제에 대한 일반적인 해결책을 제공하며, 소프트웨어 시스템의 유연성, 재사용성, 확장성을 향상시키는 데 도움이 된다.
  • 디자인 패턴은 특정한 맥락에서 발생하는 문제와 그에 대한 해결 방법을 기술화한 것.

싱글톤 패턴(Singleton Pattern)

하나의 클래스가 오직 단 하나의 인스턴스만 가지는 패턴.
인스턴스가 필요할 때 새로 만들지 않고 기존의 인스턴스 하나를 계속 재활용하는 패턴.

  • 인스턴스 생성 비용이 줄어드는 장점이 있지만 의존성이 높아진다는 단점이 있다.

  • 객체를 생성할 때마다 메모리 영역을 할당받아야 하는데 싱글톤에서는 메모리 낭비를 방지할 수 있다. 그리고 싱글톤으로 구현한 인스턴스는 전역이므로 다른 클래스의 인스턴스들이 데이터를 공유할 수 있다.

  • 주로 DB 커넥션풀, 쓰레드풀, 캐시, 로그기록객체 등에서 쓴다.

  • TDD(테스트 주도 개발)시 단위테스트에서 테스트가 서로 독립적이어야 하는데, 싱글톤 패턴은 미리 생성된 하나의 인스턴스를 기반으로하는 패턴이므로 각 테스트마다 독립적인 인스턴스를 만들기 어렵다.

  • 싱글톤 인스턴스가 혼자 너무 많은 일을 하거나 많은 데이터가 공유되면 다른 클래스들간의 결합도가 높아져 개방-폐쇄 원칙이 위배된다. 유지보수와 테스트가 힘들어진다.

  • 멀티스레드 환경에서 동기화처리를 하지 않았을 때 인스턴스가 2개 생성되는 문제도 발생할 수 있다.


팩토리 패턴(Factory Pattern)

객체를 사용하는 코드에서 객체 생성 부분을 떼어내 추상화한 패턴.
추상 팩토리는 객체 생성을 추상화한 인터페이스나 추상 클래스를 제공하며,
이를 상속받은 구체적인 팩토리 클래스에서 실제로 객체를 생성한다.

  • 클라이언트는 추상 팩토리를 통해 객체를 생성하고 사용하며, 구체적인 팩토리는 객체 생성 로직을 구현하는 역할을 수행한다.

  • 상위 클래스와 하위클래스가 분리되어 느슨한 결합을 가진다. 상위 클래스에서는 인스턴스 생성 방식에 대해 전혀 알 필요가 없어 더 많은 유연성을 가진다.


전략 패턴(Strategy Pattern = 정책패턴)

어떤 동작을 하는 로직을 정의하고, 이를 하나로 캡슐화해 관리하는 패턴
새로운 로직을 추가 혹은 변경할 때 한번에 효율적으로 할 수 있다.

  • 동일한 문제를 해결하기 위한 다양한 알고리즘을 정의하고, 이 알고리즘들을 캡슐화하여 상호 교환 가능하도록 만드는 패턴으로, 이를 통해 알고리즘을 사용하는 클라이언트와는 독립적으로 알고리즘을 변경하거나 확장할 수 있다.

옵저버 패턴(Observer Pattern)

주체가 어떤 객체의 상태변화를 관찰하다가 변화가 있을 때마다
옵저버들에게 변화를 알려주는 디자인 패턴

  • 주체 : 객체의 상태 변화를 보는 관찰자.
    옵저버 : 객체의 상태 변화에 따라 추가 변화 사항이 생기는 객체

  • 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들에게 연락이 간다.

  • 트위터 팔로우를 하면 유저가 쓴 글을 주체가 옵저버들에게 알려주는 방식.


프록시 패턴(Proxy Pattern)

대상 객체에 접근하기 전 흐름을 가로채 대상 객체 앞단의 인터페이스 역할을 하는 패턴.

  • 객체의 속성, 변환 등을 보완하며, 보안, 데이터 검증, 캐싱, 로깅 등에 사용한다.

프록시 서버

  • 서버와 클라이언트 사이에서 클라이언트가 자신을 통해 다른 네트워크 서비스에 간접적으로 접속할 수 있도록 해주는 시스템

  • NGINX가 node.js 서버 앞단의 프록시 서버로 활용된다. 익명 사용자가 직접 서버에 접근하는 것을 차단하고, 간접적으로 한단계 더 거치게 만든다.

  • 실제 포트를 숨겨 보안을 강화하거나 정적 자원을 gzip으로 압축하거나 메인 서버 앞단에서 로깅을 할 수 있다.

  • CloudFlare는 웹서버 앞단에 프록시 서버로 두어 DDOS 방어나 의심스러운 트래픽을 차단할 수 있고, HTTPS 구축을 간단하게 할 수 있다.

  • 프론트엔드에서 CORS 에러를 피하기 위해 프록시서버를 만들기도 한다.

profile
Backend Dev / Data Engineer

0개의 댓글