[면접을 위한 CS 전공지식 노트] 디자인 패턴
싱글톤 패턴 (singleton pattern)
하나의 클래스에 오직 하나의 인스턴스만 가지는 패턴
데이터베이스 연결 모듈에 많이 사용한다.
인스턴스를 만들고 해당 인스턴스를 다른 모듈들이 공유하면서 사용하기 때문에 인스턴스 생성 비용이 줄어드는 장점이 있다.
하지만 의존성이 높아진다는 단점이 있다.
자바스크립트의 싱글톤 패턴 예시
obj와 obj2는 다른 인스턴스를 가지기 때문에 결과는 false로 나옵니다.
const obj = {
a : 27
}
const obj2 = {
a : 27
}
console.log(obj === obj2)
싱글톤 패턴의 단점
싱글톤 패턴은 TDD를 할 때 걸림돌이 된다. TDD를 할 때 단위 테스트를 주로 하는데, 단위 테스트는 테스트가 서로 독립적이어야 하고 테스트를 어떤 순서로든 실행 할 수 있어야 한다. 하지만 싱글톤 패턴은 미리 생성된 하나의 인스턴스를 기반으로 구현하는 패턴이므로 각 테스트마다 '독립적인' 인스턴스를 만들기 어렵다.
싱글톤 패턴은 사용하기 쉽고 굉장히 실용적이지만 모듈 간의 결합을 강하게 만들 수 있다는 단점이 있다. 이때 의존성 주입을 통해 모듈 간의 결합을 조금 더 느슨하게 만들어 해결 할 수 있다.
의존성이란 ?
종속성이라고 말할 수 있으며 A가 B에 의존성이 있다는 것은 B의 변경 사항에 대해 A 또한 변해야 된 다는 것을 의미한다.
팩토리 패턴(factory pattern)
객체를 사용하는 코드에서 객체 생성 부분을 떼어내 추상화한 패턴이자 상속 관계에 있는 두 클래스에서 상위 클래스가 중요한 뼈대를 결정하고, 하위 클래스에서 객체 생성에 관한 구체적인 내용을 결정하는 패턴이다.
상위 클래스와 하위 클래스가 분리되기 때문에 느슨한 결합을 가지며 상위 클래스에서는 인스턴스 생성 방식에 대해 전혀 알 필요가 없기 때문에 더 많은 유연성을 가지게 된다. 그리고 객체 생성 로직이 따로 떼어져 있기 때문에 코드를 리팩터링 하더라도 한 곳만 고칠 수 있게 되니 유지 보수성이 증가된다.
자바스크립트의 팩토리 패턴 예시
자바스크립트에서 팩토리 패턴을 구현하려면 간단하게 new Object()로 구현할 수 있다.
const num = new Object(42)
const str = new Object('abc')
num.constructor.name; // Number
str.constructor.name; // String
숫자를 전달하거나 문자열을 전달함에 따라 다른 타입의 객체를 생성하는 것을 볼 수 있다. 즉, 전달받은 값에 따라 다른 객체를 생성하며 인스턴스의 타입 등을 정한다.
전략 패턴(strategy pattern), 정책 패턴(policy pattern)
전략 패턴은 정책 패턴이라고도 하며, 객체의 행위를 바꾸고 싶은 경우 직접 수정하지 않고 전략이라고 부르는 캡슐화한 알고리즘 컨텍스트 안에서 바꿔주면서 상호 교체가 가능하게 만드는 패턴이다.
옵저버 패턴(observer pattern)
주체가 어떤 객체의 상태 변화를 관찰하다가 상태 변화가 있을 때마다 메서드 등을 통해 옵저버 목록에 있는 옵저버들에게 변화를 알려주는 디자인 패턴이다.
주체란 ? 객체의 상태 변화를 보고 있는 관찰자이며, 옵저버들은 이 객체의 상태 변화에 따라 전달되는 메서드 등을 기반으로 추가 변화 사항이 생기는 객체들을 의미한다.
내가 어떤 사람인 주체를 팔로우 했다면 주체가 포스팅을 올리게 되면 알림이 팔로워에게 가는 것과 같은 의미
프록시 패턴(proxy pattern)
대상 객체에 접근하기 전 그 접근에 대한 흐름을 가로채 대상 객체 앞단의 인터페이스 역할을 하는 디자인 패턴이다. 이를 통해 객체의 속성, 변환 등을 보완하며 보안, 데이터 검증, 캐싱, 로깅에 사용합니다. 이는 앞서 설명한 프록시 객체로 쓰이기도 하지만 프록시 서버로도 활용된다.
프록시 서버
서버와 클라이언트 사이에서 클라이언트가 자신을 통해 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해주는 컴퓨터 시스템이나 응용 프로그램을 가르킨다.