---
# System prepended metadata

title: 서울숲_D_Day08 리뷰레포트

---

# 서울숲_D_Day08 리뷰레포트

### 참석자
- 김준표, 유현희, 이영훈, 최성찬

## 1. 코드 동작 이해

### 옵저버 패턴 구현 설명

```javascript
//옵저버 클래스
class Observable {
  constructor() {
    this.observers = [];
  }

  addObserver(observer) {
    this.observers.push(observer);
  }

  deleteObserver(observer) {
    const index = this.observers.indexOf(observer);
    this.observers.splice(index, 1);
  }

  notifyToObservers(state) {
    this.observers.forEach(observer => {
      observer.update(state);
    });
  }
}

module.exports = Observable;
```


```javascript
//TodoModel에서 Observable 상속
TodoModel.prototype = Object.create(Observable.prototype);
//prototpye 연결로 인해 변경된 constructor를 자신의 constructor로 연결
TodoModel.prototype.constructor = TodoModel;
```

```javascript
//data fetch가 발생할때마다 Observer 구독자에게 알림을 보내줌
TodoModel.prototype.fetch = function() {
  this.notifyToObservers(this.todoList);
  return this.todoList;
};
```


## 2. 코드 동작 개선
- id를 받을 때 id를 string type으로 받는데 todolist의 id는 숫자로 되어있어서 에러가 발생
```javascript
function isString(param) {
    return typeof param === "string";
}
```
- JSON.stringfy => number object array string boolean으로 구분한뒤 전체를 String으로 반환 [Document](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify)
```javascript
console.log(JSON.stringify({ x: 5, y: 6 }));
// expected output: "{"x":5,"y":6}"

console.log(JSON.stringify([new Number(3), new String('false'), new Boolean(false)]));
// expected output: "[3,"false",false]"

console.log(JSON.stringify({ x: [10, undefined, function(){}, Symbol('')] }));
// expected output: "{"x":[10,null,null,null]}"

console.log(JSON.stringify(new Date(2006, 0, 2, 15, 4, 5)));
// expected output: ""2006-01-02T15:04:05.000Z""
```

## 3. 스스로 확인할 사항
- 주어진 요구사항을 꼼꼼하게 체크하고, OOP와 모듈단위로 나눈방식의 개발방법의 장점이 무엇인지 고민한다.
    - 객체지향 프로그래밍은 프로그램을 변경을 용이하게 해준다. 
    - 모듈단위로 나누어 개발을 할 경우 유닛테스트에 용이하다.
    - 프로그램을 이해하기가 쉬워져 유지보수가 용이하다.
- 더 개선할 부분은 없는지, 더 좋은 방식의 패턴이 없을지 고민해본다.
    - TodoModel이 notify할 때, 현재 데이터만 넘겨준다. (콘솔에 출력되는 내용 X, todolist 데이터 O)
    - MVC패턴을 사용한다.

### MVC 패턴

- **Model**: data를 조작하는 메서드를 갖는 모듈
- **Controller**: Model의 메서드를 이용해 사용자의 요청에 맞는 data를 추출하여 View에 전달
- **View**: Controller에게 받은 data를 이용하여 적절한 UI를 사용자에게 전달

### Singleton 패턴

- 클래스의 인스턴스를 오직 하나만 유지

- JavaScript에서는 Object Literal이 싱글톤에 해당됨(즉, 유일한 객체가 생성됨)

  > 예시) let obj = { }

### Observer 패턴

- 관찰자(여러명 가능)와 발행자 사이의 데이터를 동기화하는 패턴
- 각 모듈의 의존성을 관리하기 위해서 사용되기도 함

- **특징**

> 1. 모든 관찰자는 발행자가 누구인지 알고 있다. 동시에 발행자도 모든 관찰자를 기억한다.
> 2. 발행자는 새로운 데이터를 발행하고, 관찰자에게 변경에 대해 공지한다.
> 3. 공지를 받은 관찰자는 발행자에게 변경된 데이터를 받아온다.          

## 4. 다같이 확인할 사항
#### 1. undo/redo 기능을 제공하고 싶다. 특정 사람의 코드를 골라서, 이 기능을 추가하기 위한 전략을 세워보자.
- 명령어가 수행될 때마다 immutable한 방식으로 데이터를 수정한다.

#### 2. html파일생성이 아닌 markdown포맷을 생성하는 view클래스를 만든다고 가정한다. Obsever패턴을 어떻게 적용할 수 있을까? Observer패턴의 장점은 무엇일까?


- **옵저버 패턴 장점**: Model의 데이터가 변경될때마다, Subscriber(구독자)가 특별한 행동없이 변경된 데이터를 확인할 수 있다.
