> For the complete documentation index, see [llms.txt](https://simian114.gitbook.io/blog/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://simian114.gitbook.io/blog/undefined-1/diary/2021/january/20210120.md).

# 20210120(수)

## 2021-01-20

### 1. 학습 날짜

* 2020-01-20

### 2. 학습 시간

* 13:00 \~ 24:00

### 3. 학습 범위 및 주제

* 닌자 프로젝트
* 사이드바 구현

### 4. 학습 목표

* 사이드바를 구현하면서 여러가지 문제를 해결해보자.

### 5. 학습 정리

* x

### 6. 상세 학습 내용

**닌자 프로젝트**

1. 프라미스 사용시 this 활용 문제(여러 경우에 사용될 수 있다.)

   ```javascript
    export let SideBarView = Backbone.View.extend({
    el: '#side-bar-view',

    // view
    initialize: function() {
        if (isLoggedIn()) {
            this.user_list = new Users();

            let obj = this; //side_bar_views 객체를 objs에 저장.
            let result = fetchContainer('/users/logined_user_list')
            .then(function(result) {
                for (let user of result.list) {
                    let user_model = new User(user);
                    obj.user_list.add(user_model);
                }
                })
            .then(function() {
                for (let user of obj.user_list) {
                    let user_status_view = new UserStatusView({model: user})
                    obj.$el.children().append(user_status_view.render().$el);
                }
            });
            console.log(result);
        } else {
        }
    },
    })
   ```

   * 위의 코드에서 `let obj = this` 라는 문구가 있다. 이 문구를 사용한 이유는 `fetchContainer`에서의 `this`의 컨텍스트가 변하기 때문에 현재 컨텍스트에 존재하는 `user_list` 라는 변수를 사용할 수 있게 하기 위함이다. 현재의 컨텍스트를 `obj` 라는 변수에 넣으면 이후의 함수 안에서는 그 함수내에 `obj` 라는 객체가 선언되어 있지 않기 때문에 상위 렉시컬 스코프에서 이 변수를 찾게 되므로 우리가 원하는 변수를 적절하게 찾고 이후의 작업을 수행한다.
2. 모델과 컬렉션의 활용
   * 모델과 컬렉션을 이용해서 뷰를 만들고 한다.... 흠. 적을게 없군
3. 액션케이블. 어떻게 하면 클라이언트가 접속하는 순간 바로 구독하지 않을 수 있는가?
   * 이 문제는 rails6의 웹패커와 관련이 있다. 솔직히 잘 모른다. 일단은 그냥 적어본다.
   * 채널을 생성하면 `~channel.js`파일에  `~subscription.create` 함수가 만들어진다. 함수의 이름에서 알겠지만 이 함수로 인해서 현재 클라이언트는 채널을 구독하게 된다.
   * 그리고 이 파일은 `application.js` 에서 `import`가 된다. 문제는 여기서 발생한다.
   * 웹패커는 import 하는 순간 바로 변수를 생성 하기 때문이다 => 솔직히 잘 모른다ㅋㅋ
   * 따라서 `rails g channel xx` 로 채널을 만드는 순간, 파일과 subscription 함수가 자동으로 만들어지고 만들어진 파일과 함수를 `application`에서 바로 `import` 하기 때문에 우리가 원하지 않아도 바로 클라이언트가 채널을 구독하게 되는 것이다.
   * 자 그럼 이제 문제가 해결됐다. `import` 를 하지 않으면 된다!
   * 그리고 만들어진 `consumer.subscriptions.create(xx)` 함수를 다른 함수로 감싸서 `export` 하면 이제 우리가 원할 때 이 함수를 `import` 해서 사용하는게 가능해진다.
4. 마이그레이션 관리
   * 이전으로 돌아가고 그런거는 나중에 해보고.. 오늘은 추가하는 부분에 대해 학습했다.
   * 절대 명심할건, 스키마 파일을 인위적으로 수정하지 말자. 스키마 파일은 마이그레이션의 최종 결과로 사용자가 보기 편하게 만들어진 파일이다.
     * 즉 스키마는 마이그레이션의 최종 결과물인 파일이다. 만약 수정하고 싶다면 마이그레이션을 만들어서 변경해주자
   * User 모델의 속성을 추가하거나 또는 이미 존재하는 열의 default 값 또는 nullable 속성 변경을 하기 위해서는 먼저 마이그레이션 파일을 만들어주자.
   * `rails g migration addStatusToUsers` 라는 명령어를 입력하면, 이름에서 바로 알수있듯이 `user` 라는 모델에 `status` 라는 속성을 추가해주는 마이그레이션 파일을 만드는 것. 파일안에 들어가서 `add_column` 으로 추가해주자.
   * 만약 이미 존재하는 속성의 디폴트 값을 변경해주고 싶다면,
   * `rails g migration changeDefaultOfStatusAsLogoutToUsers`로 마이그레이션 파일을 만들고 생성된 파일로 들어가서 `change ~` 뭐시기 명령어로 수정해주자.
   * 마이그레이션 메서드는 <https://edgeapi.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-change_column_null> 여기를 참고하자.

### 7. 오늘 학습 내용에 대한 개인적인 총평

* 너무 어렵다. 그래도 재밌다 화이팅하자...

### 8. 다음 학습 계획

* 액션 케이블
