기본 콘텐츠로 건너뛰기

MobX(1) - observable, reactions



 최근 SPA(Single Page Application)로 구현하는 웹 서비스가 많아졌다. SPA로 구현한 서비스는 한 화면 내의 여러 컴포넌트들에서 동일한 데이터로 동기화해야 하는 이슈가 생겼다. SPA로 서비스를 구현하면서 생긴 데이터의 상태 이슈를 관리하기 위한 도구가 State Management 도구다.

MobX ?

MobX는 공식 홈페이지에 들어가면 아주 심플하게 설명이 나와있다.


Simple, scalable state management


쉽게 말해서 State Management 도구다. MobX의 큰 특징은 Observable을 이용해 변수의 변화를 추적할 수 있도록 만든다. 그리고 이 변수에 변화가 생기면 미리 정의한 액션을 트리거한다.

Observable, Reactions

observable은 위에도 설명했지만 변수를 state로 승격한다고 생각하면 된다. Mobx는 state 변수의 값의 변화를 Reactions에서 감지해서 처리할 수 있다.

Reactions

  • autorun
  • reaction
  • when

각 reactions의 특징을 예제와 함께 살펴보자.

Autorun


autorun은 하나의 함수를 파라미터로 받는다. 함수 내부에서 참조하는 observable 변수에 변화가 생기면 파라미터로 넘긴 함수를 실행한다.



User 클래스의 name 앞에 observable 데코레이터를 붙였다. 이렇게 하면 name에 변화가 있을 때 이를 추적할 수 있게 된다.

10번 줄을 보면 autorun 내부에서 user.name을 통해 observable 변수인 name에 접근하고 있다. 그리고 13번 줄에서 name에 "Caeml"이라는 값을 할당한다. name에 변화가 생기면서 autorun으로 넘긴 함수가 실행된다. console에는 결과가 Hello, Camel이라고 찍히게 된다. 그런데 실제 결과에 약간의 문제가 있다.


name을 초기화할 때 빈 문자열을 넣었던 것도 autorun에서 감지돼서 console에 결과가 나타났다. 즉 autorun은 모든 name 변화에 반응하게 돼있다.


Reaction


autorun이 초기화를 포함한 모든 단계에 반응한다면, reaction은 초기화 이후 변화부터 반응한다.



reaction은 파라미터 두 개를 받는다. 첫 번째 파라미터는 반응해야 할 observable 변수를 반환하는 함수다. 우리는 user.name에 반응해야 하기 때문에 user.name을 반환하는 함수를 넘겨줬다. 두 번째 파라미터는 첫 번째 파라미터 함수에서 반환한 observable 변수를 파라미터로 받아서 값을 처리할 함수다.
autorun에 넘겨주는 함수와 차이점은 파라미터로 받는 observable 값이 있느냐 없느냐 하는 부분이다.


초기화 단계의 빈 문자열은 무시하고 초기화 이후 변화부터 감지해서 console에 출력해준다. 이렇게 reaction을 이용해서 불필요한 초기 변화를 제외하고 의미있는 변화에 대해서 처리하도록 할 수 있다.


When

when은 파라미터로 함수 두 개를 받는다. 첫 번째 함수는 Boolean 값을 반환 한다. 첫 번째 함수의 반환 값이 true가 되는 순간, 두 번째 함수가 단 한번만 실행되고 이후 변화에는 반응하지 않는다.




10번 줄에서 user.name의 값이 빈문자열이 아닐때 true를 반환한다. 이 때 console에 이름을 출력하게 된다. 16번 줄에서 'Camel'을 할당하고 출력하므로 17번 줄에서 할당한 'Caramel'에는 반응하지 않게 된다.








댓글

이 블로그의 인기 게시물

Nodemailer를 이용해서 mail 전송

Nodemailer Nodemailer는 이름에서 알 수 있듯이 node 기반의 메일을 쉽게 보낼 수 있는 라이브러리다. 설치 yarn을 이용하는 경우 yarn add nodemailer npm을 이용하는 경우 npm install --save nodemailer 메일을 보내보자 /* mail.js */ var nodemailer = require('nodemailer'); var smtpConfig = { host: ${SMTP Server 주소}, port: ${SMTP SErver 포트}, secure: true, // use SSL auth: { user: ${SMTP ID}, pass: ${SMTP 비밀번호} } }; var mailOptions = { from: ${받는사람 메일 주소}, to: ${보내는사람 메일 주소}, subject: ${제목}, text: ${본문 내용} }; var smtpTransport = nodemailer.createTransport(smtpConfig); smtpTransport.sendMail(mailOptions, function (error/*, response*/) { if (error) { console.log(error); } else { console.log('Complete'); } smtpTransport.close(); }); 실행 node mail.js 위 코드에 ${} 형태로 된 부분만 각자 입맛에 맛게 채워주면 끝이다. 파일을 첨부해보자 메일을 보낼 때 파일을 첨부하고 싶은 경우 mailOptions에 attachments 값을 넣어 주면 끝이다. node에서 파일을 읽기 위해서는 fs를 사용한다. /* mail.js */...

폰트 preload시 두 번 다운로드 하는 문제

스태틱 리소스에 대해서 preload 를 사용하면 초기 로딩 속도를 최적화시킬 수 있다. css와 font 파일들은 렌더링 블럭을 발생시키기 때문에 이 파일들을 모두 다운받기 전까지는 렌더링을 하지 않게 된다. <link rel="preload" href="some-font.woff2" as="font" type="font/woff2> 기본적으로 위와 같은 형식으로 쓰면 페이지 진입과 동시에 font를 로딩하게 된다. 그런데 네트워크 탭을 살펴보면 같은 폰트를 두 번 다운로드 받게 되는것을 볼 수 있다. <link rel="preload" href="some-font.woff2" as="font" type="font/woff2 crossorigin> 이를 해결하기 위해 아래와 같이 crossorigin attribute를 추가해 준다.

CSS autoprefixer 사용시 스타일 제거 될 경우

Autoprefixer 는 CSS 사용 시 최신 프로퍼티에  vendor prefix를 붙여주는 역할을 한다. ::-webkit-input-placeholder { color : gray ; } ::-moz-placeholder { color : gray ; } :-ms-input-placeholder { color : gray ; } ::-ms-input-placeholder { color : gray ; } ::placeholder { color : gray ; } 그런데 사용중인 Autoprefixer 버전에서 지원하지 않는 프로퍼티를 제거해버리는 경우가 있다. 실제로 Autoprefixer 6.7.7 버전에서는 backdrop-filter 라는 프로퍼티를 사용하게 될 경우 그대로 감쪽같이 지워지는 현상이 있다. 이런 현상을 방지하기 위해 autoprefixer 기능을 잠시 꺼두면 된다. .some-selector { /* autoprefixer: off */ backdrop-filter: blur(2px); /* autoprefixer: on */ } 물론 Autoprefixer 최신 버전을 사용하면 왠만한 경우 해결이 된다. 혹시나 버전을 올리기 힘든 상황인 경우 위 방식을 사용하고, 그렇지 않다면 최신 버전을 사용하는 것을 추천한다.