책 내용을 정리하는 것이 아니라, 해당 범위에서 특별히 정리하고 싶은 내용이나 책을 읽으면서 들었던 궁금한 부분을 작성한다.
읽다가 갑자기 정리하고 싶은 내용을적기도 한다. 꼬꼬무,,,(꼬리에 꼬리를 무는 공부)
궁금한 부분에 대한 답변은 의문이 해소된 후에 작성한다 (영원히 작성되지 않을수도..)
정리
팩토리 패턴이란?
객체를 사용하는 코드에서 객체 생성 부분을 따로 떼어내 추상화한 패턴
상속관계에 있는 두 클래스에서 상위 클래스가 중요한 뼈대를 결정하고, 하위 클래스에서 객체 생성에 관한 구체적인 내용을 결정하는 패턴
class CoffeeFactory {
static createCoffee(type) {
const factory = factoryList[type]
return factory.createCoffee()
}
}
class Latte {
constructor() {
this.name = "latte"
}
}
class Espresso {
constructor() {
this.name = "Espresso"
}
}
class LatteFactory extends CoffeeFactory{
static createCoffee() {
return new Latte()
}
}
class EspressoFactory extends CoffeeFactory{
static createCoffee() {
return new Espresso()
}
}
const factoryList = { LatteFactory, EspressoFactory }
const main = () => {
// 라떼 커피를 주문한다.
const coffee = CoffeeFactory.createCoffee("LatteFactory")
// 커피 이름을 부른다.
console.log(coffee.name) // latte
}
main()
팩토리 패턴의 장점
느슨한 결합을 가진다
상위 클래스와 하위 클래스가
분리
되기 때문
유연성이 좋다
인스턴스 생성 방식에 대해 전혀 알 필요가 없기 때문
유지보수성이 증가한다
객체 생성 로직이 따로 떼어져 있어
코드를 리팩터링하더라도 한 곳만 고칠 수 있기 때문
고민하고 기억하기
p. 24
Q. 팩토리 패턴이 등장하게 된 이유가 뭘까?
객체 생성 로직의 복잡성과 유연성을 관리하고, 코드의 유지보수성을 높이기 위해
(팩토리 패턴이 등장하게 된 이유는, 어떤 상황에서 사용하는 것이 좋을까 와 같다고 생각함)
자바스크립트 + 리액트 디자인 패턴
Q. 팩토리 패턴은 어떤 상황에서 사용하는 것이 좋을까?
객체나 컴포넌트의 생성 과정이 높은 복잡성을 가지고 있을 때
상황에 맞춰 다양한 객체 인스턴스를 편리하게 생성할 수 있는 방법이 필요할 때
같은 속성을 공유하는 여러 개의 작은 객체 또는 컴포넌트를 다뤄야 할 때
덕 타이핑 같은 API 규칙만 충족하면 되는 다른 객체의 인스턴스와 함께 객체를 구성할 때
디커플링 상황
Q. 덕타이핑과 구조적 타이핑, 동적 타이핑
동적 타이핑은, 값이 담길 때 타입이 정해지기 때문에,
동적으로 변한다
덕 타이핑은, 객체의 변수, 메소드의 집합이 객체의 타입을 결정한다
구조적 타이핑은, 구조 안에 같은 속성의 타입이 있는지를 체크하는 것이다.
때문에, 의도하지 않았지만 동일한 타입을 가지는 경우
동일한 유형으로 간주될 수 있다
둘 다 객체의 변수, 메소드 같은 필드를 기반으로 타입을 체크(혹은 안할수도)하지만,
덕 타이핑은 '런타임'에 체크하기 때문에 동적 타이핑에서, 구조적 타이핑은 '타입 체커'에서 체크하기 때문에 정적 타이핑에서 쓰인다.
Q. JS는 왜 동적 타입 언어로 설계된 것일까?
주로 유연성과 간편성을 제공하기 위해서이다
동적 타입 언어
란, 변수에 타입을 지정하지 않고 코드가 실행되는 런타임에 변수 값이 할당될 때 해당 값의 타입에 따라 변수 타입이 결정되는 언어이다자바스크립트는 원래 웹 브라우저 내에서 동적으로 실행되는 스크립트 언어로 설계되었는데, 웹 페이지는 빠른 속도로 변화하는 동적 콘텐츠를 처리해야 했다
동적 타이핑으로 설계된 자바스크립트는
유연성
덕분에 복잡한 설정 없이 다양한 데이터 타입을 처리할 수 있으며, 다양한 웹 브라우저 환경에서 원활하게 작동할 수 있다
Q. TS는 왜 등장한걸까?
JS는 동적 타입 언어로,
런타임에 실제 코드의 값이 평가될 시점에서야
변수에 들어올 값과 타입을 알 수 있다때문에, 개발자의 의도와 다르게 동작할 수 있다. (ex: 숫자 a,b의 합을 구하는 함수에서 문자열의 합을 구할 수 있음)
TS는 정적 타입 언어로,
컴파일 타임에 변수의 타입을 결정
한다이로써 TS는 타입 에러를 사전에 방지해 안정성을 보장한다
Q. JS는 왜 싱글스레드를 사용할까?
JS는 원래 웹 브라우저에서 동적 동작을 위해 설계되었기 때문이다
주로 DOM을 조작하는 데 주로 사용되는데, 여러 스레드가 동시에 DOM을 수정한다면 충돌이 발생할 수 있다
싱글 스레드에서는 한 번에 하나의 작업만 수행하므로, DOM 업데이트가 안전하게 순차적으로 이루어진다 (비동기)
그러나 이벤트 루프를 통한 비동기 처리로 동시성을 지원한다.
이벤트 루프는
콜 스택
과태스크 큐
를 사용해, 비동기 작업이 완료되면 해당 콜백 함수를 콜 스택으로 보내 실행한다
Q. 이벤트 루프의 동작 과정은 어떻게 진행되나?
콜 스택에 현재 실행 중인 컨텍스트가 있는지, 테스크 큐에 대기 중인 함수가 있는지 반복하며 확인
만약 콜 스택이 비어있고, 테스크 큐에 대기중인 함수가 있다면 순차적으로 콜스택으로 이동 후 실행
태스크 큐와 마이크로 태스크 큐에 대기 중인 함수가 있다면, 마이크로 테스크 큐를 우선적으로 처리 후 테스크 큐 처리
Q. 팩토리 패턴을 사용하면 안되는 상황은 뭘까?
객체 생성 인터페이스 제공이 작업 중인 라이브러리나 프레임워크의 설계 목표가 아닐 때
잘못된 상황에 팩토리 패턴을 적용하면
애플리케이션의 복잡도
가 크게 증가할 수 있다객체 생성 과정이 복잡할 경우
단위 테스트의 복잡성
또한 증가시킬 수 있다팩토리 패턴은 객체 생성 과정을 인터페이스 뒤에 추상화하기 때문