리액트 컨셉


불변성

복잡한 특징들을 구현하기 쉽게 만든다. 직접적인 데이터 변이는 이전 이력을 유지 및 재사용할 수 없다.

변화감지

직접적인 변이는 변경을 감지하는 것이 어렵다. 참조하고 있는 불변 객체가 이전 객체와 다르면 객체는 변한것이라 판단한다.

재(再)렌더링

불변성과 변화감지를 이용하여 순수 컴포넌트를 만들고 이를 이용하여 데이터가 변화할 때 즉각적으로 재렌더링을 실행한다.

render 함수

render() { /\* pass /\* };

render 함수는 컴포넌트(레이아웃, 기능 등)를 정의한다. 해당 함수는 html 형식의 문자열이 아닌 뷰의 shape과 behave를 정의한 객체를 반환한다. 최상위 컴포넌트의 렌더링이 끝나면 해당 객체들을 이용하여 DOM 안에 mount한다. (1. 문자열 형태의 HTML 코드를 생성 2. DOM에 해당 내용을 주입)

reconciliation (조화 과정)

리액트의 뷰는 '변형' 되는것이 아니라 새로운 요소로 '교체'된다. 해당 작업 역시 render 함수가 담당한다. 컴포넌트가 데이터를 업데이트했을 때 해당 과정에서 생성된 새로운 데이터를 활용하여 render 함수가 또 다시 호출되며 그러한 과정에서 새로운 view가 생성된다.

Virtual DOM

Virtual DOM을 사용하면 실제 DOM에 접근하여 조작하는 대신, 이를 추상화한 자바스크립트 객체를 구성하여 사용한다. Virtual DOM은 DOM(이미 추상화 된)의 추상적 개념이다. 데이터가 변경되면 1. View 영역을 Virtual DOM에 리렌더링 2. 이전 Virtual DOM과 현재의 것을 비교 3. 바뀌 부분만 실제 DOM에 적용

클래스 컴포넌트


import React, { Component } from  'react';

class App extends Component {
    render() {
        ...
        return ...
    }
}

export default App;

특징 및 차이점

함수 컴포넌트는 컴포넌트의 default가 함수의 형태이며 반환할 값에 template을 클래스형 컴포넌트에는 render 메서드에 사용할 데이터와 return문을 함께 명시하여 준다. 클래스형 컴포넌트의 경우 state 기능 및 라이프사이클 기능을 사용할 수 있으며 임의 메서드를 정의하여 사용할 수 있다.

state vs props

리액트의 state는 컴포넌트 내부에서 바뀔 수 있는 값을 의미한다. (vue.js에서는 store의 프로퍼티, 즉 상태 값을 의미) props는 컴포넌트가 사용되는 과정에서 부모 컴포넌트가 설정하는 값이며 컴포넌트에서는 읽기 전용으로만 사용한다. (vue.js에서는 props는 전달되는 데이터 값이며 읽기전용이 아닌 초기화 값으로 사용)

state vs useState

두가지의 state 값이 존재하며 클래스형 컴포넌트에서는 state를, 함수 컴포넌트에서는 useState를 사용한다.

Property Initializer Syntax

클래서형 컴포넌트의 메서드 바인딩은 생성자 안에서 처리하는 것이 Best Practice이지만 불편하고 코드량이 많아지며 구현부가 파편화되고 관리 이슈가 생길 수 있다. transform-class-properties를 사용하면 이를 회피할 수 있다.

ref

ref(=reference)는 id를 대체하는 리액트의 선택자이다. 특정 엘리먼트를 직접 핸들링할 경우에는 id 대신에 ref를 사용하여 처리한다. ref를 설정하는 가장 기본적인 방법은 1.콜백 함수를 활용하는 방법이며 2. createRef 함수를 사용하는 방법이 있다.

SyntheticEvent (합성 이벤트)

합성 이벤트는 네이티브 이벤트와 다르게 이벤트가 끝나고 나면 이벤트가 초기화되므로 정보를 참조할 수 없다. 비동기적으로 이벤트 객체를 참조하려면 e.persist() 함수를 호출한다.

'Notes' 카테고리의 다른 글

[React / 라이프 사이클] 생명주기  (0) 2020.07.15
사무실 밖으로 보이는 나무들이 너무 추워보입니다. 녹색으로 푸르게 꽉차서 가지 조차도 보이지 않던 유리창이 이제는 휑해져 도로위의 자동차 불빛이 보일 정도로 겨울은 빠르게 다가왔고 벌써 겨울임을 알리고 있습니다.

매년 1월이면 희망에 가득 차서 신년에 할일과 목표를 설정하지만 정작 한해의 마무리는 술, 모임으로만 가득 차있어서 그런지 취기 어린 기억들만 남는 것 같습니다.

올 한해를 살짝 뒤돌아보면 2018년 보다 더 바쁜 한해였습니다. 개인적으로는 이사와 외부활동, 그 외의 일들을 조금 더 늘린 한해였습니다. 오늘은 한해를 마무리하며 개인적인 삶, 회사에서의 삶, 그리고 앞으로 다가올 한해를 또 어떻게 보낼지 계획해 보는 시간을 가지려 합니다.

 

고양이를 키우는 독거노인의 삶

폭등하는 집값에 원하는 구조의 집을 찾기 위해서는 몇 가지를 포기할 수 밖에 없었습니다. 고양이를 모시고 사는 입장이라 고양이가 조금 활발히 움직이고 또 분리된 공간을 보장하기 위해서 복층으로 이사를 준비했습니다. 이렇게나 많은 집을 단기간에 본적은 없었는데 그래도 출 / 퇴근 시간을 '완전히' 포기하니 고양이와 제가 알콩달콩 지낼 수 있는 거처를 마련할 수 있었습니다.

 

출 / 퇴근 시간을 포기한다는 것은 그만큼 멀리 떠났다는 의미이고 멀리 떠난다는 것은 앞으로 더 고독하게 지내야 한다는 말로 바꿀 수 있었습니다. 처음에는 사놓고 읽지 못했던 책 읽으면 되겠지라고 생각했지만 이런저런 핑계로 책을 넘기는 시간은 줄어들고 혼자서 TV 앞에 앉아 라면에 소주, 먹태에 맥주를 먹는 시간이 늘어나게 되었습니다.

 

취미가 없어서 그런건가 하는 생각에 10월 즈음에 평소 배우고 싶었던 일렉 기타를 장만하여 열심히, 술을 마시고 있습니다. -_-a 물론, 술친구가 없으니 조금만 마시게 되더군요. (혼술을 더 자주 즐기게 되었다 / 희한하게도 총량은 줄었다)

 

다른 회사는 어떻게 일하는지 / 또 다른 이들은 어떤 생각을 하는지

19년도 초 즈음에 이사님께서 다른 회사는 어떻게 일하는지도 좀 알아보고 그것을 흡수해 보는것도 좋을 것 같다는 말씀을 해주셔서 올 한해에는 정말 많은 컨퍼런스, 밋업, 모임 등에 참석하였습니다. 혹자는 저를 보고 이직 중이면 이력서를 달라고 연락을 주신 분도 계셨고, 컨퍼런스만 참석한다고 일을 잘하는 것도 배우는 것도 아니라며 핀잔을 주신 분들도 계셨습니다. 일일이 계획을 설명드리기 애매해서 그냥 웃어 넘겼지만 저에게는 꽤나 도움이 되는 부분이 많았습니다.

 

카카오페이 / 페이톡
NHN FORWARD / 가장 인상적
LINE / Extremely Pratical!!!

 

지금 우리 조직이 가진 문제점, 혹은 우리 조직의 구성원들이 극복해야할 고민거리를 해결하고 극복한 사례나 그것을 방지하기 위해서 행하는 것들을 직접 듣고 그자리에서 질문하며 그들의 좋은 선례를 참고하고 도입하기 위해서 많은 노력을 할 수 있었습니다.

 

견고한 코드를 만드는 방법과 자신이 작성한 코드에 자신감과 확신을 갖는 방법을 배웠고 공통 모듈을 어떻게 다른 팀 / 파트와 함께 관리하고 개발해 나아갈지 방법을 논의하는 자리를 마련할 수 있었습니다. 대부분의 조직에서 버스팩터를 높게 유지하기 위해서 어떠한 일들을 하는지에 대해서도 고민하고 그것을 위한 첫 단계를 실천에 옮길 수도 있었습니다.

 

조직을 구성하는 구성원들의 다양한 생각도 알고 싶었고 단순한 QnA 게시판 보다는 개발 문화나 다양한 분야의 개발자들이 현재 하고있는 일과 그들의 고민, 취업 (이직) 등의 정보도 공유할 목적으로 페이스북에 Developer Square라는 그룹도 만들고 운영하게 되었습니다. 물론 활발히 교류하시는 분들은 아직까지는 많이 없지만 그래도 좋은 정보들이 생기면 그에 대해 한번이라도 읽어보고 적합한 정보들은 전파를 위해 공유를 하고 있으며, 제가 예상했던 분들보다 더 많은 분들이 가입을 하고 계셔서 너무 감사할 뿐입니다.

 

자연스레 다른 조직에 계시는 분들과도 소통할 기회가 생기게 되어 개인적으로는 좋은 개발자 분들을 조금이나마 많이 알게 된 계기가 되었습니다.

 

프로젝트 / 프로젝트 / 프로젝트

제가 담당했던 프로젝트를 모두 열거하기는 힘듭니다만 지금 그 프로젝트들을 되돌아보면 1. 허둥지둥 했고, 2. 시간이 없었고, 3. 여전히 시간이 부족했습니다. 명백한 면피용 발언이겠지만 조직에서 원하는 완료 시점, 품질, 요구사항을 모두 만족시킬 시간이 많이 부족했습니다. 물론 지금은 다른 이유로 시간이 없지만 세가지의 커다란 프로젝트를 하면서 느꼈던 가장 아쉬운 점은 생산성을 위한 개발은 다시 시간을 갉아먹는 결과물을 가져올 수 밖에 없다는 점이었습니다. 첫번째는 코드의 품질을 전혀 생각하지 않고 개발을 진행했고, 두번째 프로젝트는 기획을 무시하고 할수있는 것에 치중한채 업무를 진행했습니다. 마지막 프로젝트는 타 부서와의 연계와 소통의 부재로 원하던 목표에 누락된 기능들을 포함한 채 릴리즈 되었습니다.

 

반면에, TDD나 코드리뷰, 적극적인 소통을 통한 경계를 허문 업무 진행은 3가지의 프로젝트를 거치며, 그것들을 점진적으로 도입하면서, (위의 활동과 함께 개인적인 스터디 혹은 도움으로) 많은 부분을 개선할 수 있었습니다. 비록 프론트엔드를 담당하는 사람이 저 뿐이지만, 파트의 구성원 모두 자바스크립트 기반의 개발을 하고 있기에 적극적인 코드리뷰를 진행하며 서로가 놓쳤던 부분을, 혹은 잘이해하지 못했던 부분을 메울 수 있었고 전반적인 컨벤션 혹은 구조, 동작을 어떠한 관점에서 바라보고 제어하는지를 공유할 수 있었습니다. 시간이 부족하였지만 자바스크립트 동작의 원리를 조금 더 서로가 잘 알수 있도록 한가지의 책을 일주일간 업무 외 시간에 스터디하고 그것을 리뷰하는 시간을 마련했습니다. 기본기를 학습하기 원했던 이유는 아직도 많은 개발자들이 for loop 안의 setTimeout의 var와 let이 왜 다른 결과를 반환하는지를 모르기 때문과도 같습니다. (꼭 블록과 함수 스코핑 때문만이 아닙니다. 더 중요한 부분도 들어있습니다.)

 

올 한해를 보내면서 수행했던 큰 프로젝트들을 뒤돌아보면서 향후의 목표와 자세를 정하자면, 앞으로도 1. 'Collective Ownership을 위한 다양한 활동을 해야겠다'와 2. '우리가 안다고 넘어간 것은 결코 전부가 아니다'를 실천하자 입니다. AST와 ASI를 들어만 보고 이게 무엇인지, 비슷한건지, 헷갈려 하지말고 코드수를 줄이는 것 보다 그것이 실행되는 연산의 횟수를 줄이는 것에 목표를 둔다면, 더 나아가서 그러한 반복된 훈련과 연습을 계속하게 되면, 결국에는, 생산성 역시도 높여줄 것이라는 기대를 하게 되었습니다.

 

무언가 새로운 것을 시도하기 보다는 벌여놓은 일을 잘하자

나이가 들고 개발자로 살아가는 시간이 점차 늘어나면서 제가 해왔던 일들을 한해를 넘어서 뒤돌아 보면 많은 것을 했지만 제대로 마친 것은 별로 없구나를 느끼게 되었습니다. 물론 괄목할만한 성장과 결과도 있었지만 그만큼 다양한 시도나 속된말로 뻘짓 역시도 적지 않았습니다. (예를 들어 번역공모...) 뭐 시도한 것에 후회는 단 한번도 해본적 없지만, 이제는, 새로운 것에 대해서 갈증을 갖기 보다 내가 하고있는 일에 더 집중하고 더 잘하는 시간을 마련하기 위한 한 해를 계획하고 있습니다. 그동안 미루웠던 웹개발의 전반을 이해해 보는 것과 UI / UX에 대해서 (둘은 다른 것이지만 함께 언급하기에 저도 관습적으로 사용합니다) 조금 더 깊이있게 다가서는 것입니다.

 

정말 개인적이지만 아직도 프론트엔드 개발자를 백엔드 개발자 보다 아래로 보는 시선들이 있어서 올 한해의 계획 안에는 그러한 잘못된 시각을 바로잡는 역할을 하려고도 합니다. 

 

참 많은 일들과 아직도 끝나지 않은 '도전'이 남아있지만 올 한해는 50% 이상의 목표는 충족한, 이제껏 경험해 보지 못한, 2019년도 였습니다.

 

자... 여러분들의 한해는 어떠셨나요?

리액트를 배워 보자!!!

 

프론트엔드 개발자로서의 삶을 살아가면서 아직도 접해보지 않았던 이름이 있었습니다. 10에 4명 이상은 리액트로 프로젝트를 진행하는 요즘에도 조직과 개인적 이유로 리액트 스터디를 미뤄오다 우연치 않은 기회에 [리액트를 다루는 기술]을 획득(?!)하여 간단한 후기를 남기게 되었습니다.

 

* 현재까지의 스터디 분량으로 리뷰를 진행하며 책의 전체 리뷰는 완독 후 해당 포스트에 업데이트 할 예정입니다.

 

저는 마크업과 UI를 개발하다 AngularJS를 접하며 프론트엔드 개발자로 성장 하였습니다. 처음 접하게 된 프레임워크와 프론트엔드 개발이 이유가 된건지 AngularJS (지금은 사용하지 않습니다... 다 까먹었어요...) / Angular에 대한 애착이 있었고 토이 프로젝트 혹은 프로토타이핑은 Angular를 주로 이용했지만 지금의 회사에서는 프레임워크를 통일하여 사용하고 있기에 Vue.js로만 모든 개발업무를 진행하고 있습니다.

 

리액트에 대한 개발자로서의 호기심과 좋은 평판을 들으며 리액트를 스터디 하려고 계획만 세워놓고 스터디 모임, 컨퍼런스, 밋업, 취미생활, 게임, 음주... 등 계속해서 업무와 개인적인 일련의 일들을 진행하다 보니 자연스레 계획했던 공부는 늘 '내일하자'로 마음 속 한 구석에 처박아 놓고 잊어버리고 있었습니다.

 

개발자 리뷰어를 모신다는 '길벗' 출판사의 광고를 보고나서, 구매해 보고 싶었던 책을 얻게되면 그걸 (반강제적이지만 지극히 자발적인) 동기부여의 기회로 삼아 공부를 할 수 있겠다는 생각이 들어 신청을 했는데, 왠걸!!! 됐습니다!!! 선정되었습니다!!! 그리하여 오늘은 [리액트를 다루는 기술] 그것도 무려 300페이지 쯤 더 두꺼워진 개정판의 스터디(still ...ing) 후기를 남겨보려 합니다.

(자세한 책의 정보는 아래의 링크에서 얻으실 수 있습니다.)

 

* 길벗, 리액트를 다루는 기술

 

리액트를 다루는 기술(개정판)

입문부터 대규모 애플리케이션까지 한 권으로!

www.gilbut.co.kr

 

이 책은 친절하지만은 않다.

리액트에 관심이 있는 프론트엔드 개발자라면 김민준(이라 적고 벨로퍼트라고 읽음) 저자를 한번쯤은 들어보셨을 겁니다. 여러 커뮤니티에서 저자의 게시물과 작업들로 도움을 받으신 분들이 많이 계실겁니다. 여러 경로를 통해 개발자들에게 많은 도움을 주셨던 분이지만 이 책이 한없이 친절한 것은 아닙니다.

 

* 김민준 저자 블로그

 

책의 초반은 리액트의 간단한 개념으로 배경지식을 조금씩 설명하고 JSX가 무엇이며 장점은 무엇인지, 어떻게 코드를 작성하는지 린트를 소개하고 적용하는 방법 등을 소개하며 리액트의 구성요소를 하나씩 차근차근 설명해줍니다.

 

하지만 자바스크립트를 어느 한 라이브러리만 사용해서 개발을 진행했던, 예를 들어(아니, 콕 짚어) jQuery에 의존하여 개발을 진행했거나 JS의 객체지향 패턴 비구조화 할당, 화살표 함수, this의 바인딩과 스코프 (함수 / 블록 스코핑) 등의 전반적인 지식이 부족하거나 문법이 낯설다면 저자의 친절한 설명 글들이 그리 친절하게만 보이지 않을 수도 있습니다.

 

만약 마크업 개발만을 담당하다 프론트엔드 개발자로서 발돋움하기 위해서 책을 펼친다면 이 책은 종국에는 굉장히 큰 도움이 될 거라 확신하지만 다른 얇은 기본서와 ES6에 대한 서적을 빠르게 읽어보시는게 좋을 것 같습니다. (물론, 제 입장에서 바라보는 이야기입니다.)

 

그럼에도 불구하고 이 책은 정말 친절하다.

하지만 이 책은 굉장히 친절하게도 몇가지의 프로젝트를 진행하며 실무에서 고민하고 맞닥뜨려야 하는 여러가지 문제를 자연스럽게 익힐 수 있도록 도와줍니다. 비록 챕터가 지날수록 조금씩 난이도가 높아지는 느낌은 있지만 (현재 기준으로는) 친절하게 설명을 이어가고 독자가 잘 이해할 수 있는 가능한 많은 방법 (노트, 패턴별 코드 비교 및 분석, 개념 설명)을 동원하여 독자가 이해할 수 있는 길로 가도록 잘 이끌어 줍니다.

 

한쪽만 다루지는 않는다.

많은 기술 서적은 본연의 책임과 역할을 잘 수행하기 위하여 한가지만을 중점적으로 설명합니다. 이 이야기는 반대로 한가지만 설명하고 그것을 지탱하고 수행하는 부분의 어쩌면 핵심이 될 수도 있는 부분은 버린다는 이야기가 될것입니다. 하지만 해당 서적은 SPA만 집중적으로 설명하는 것을 넘어서 SSR(서버사이드 렌더링), Node.js, Koa, 거기다 JWT를 통한 인증 시스템 구축까지 실무에서 당연히 마주할 부분을 커버합니다. 그렇다고 많은 부분을 보여주기 위해 소흘한 부분이 있는 것은 아닌 것 같습니다. (아직 완독하기 전이라 섣불리 뭐가 부족하다는 말은 삼가하겠습니다.) 상태관리나 새롭게 추가된 핵심 기능, 함께 사용할 법한 라이브러리 등의 소개 역시도 꼼꼼히 소개해줍니다.

 

대상독자라면 충분히 기본을 넘어설 수 있다.

포스팅을 하면서 앞서 언급한 것과 같이 이 책은 새롭게 프론트엔드 개발을 배우기 위한 입문서적은 될 수 없습니다. 역시나 자바스크립트에 대한 아주 기초적인 지식만으로는 병행해야 하는 별도의 '공부'가 필요할 수 있습니다. 하지만 이 책과 저자가 염두해 둔 [대상독자]라면 이 책은 아주 훌륭한 입문서이자 레퍼런스가 될 수 있을 것 같습니다.

 

* 책에대한 리뷰는 읽어 나가는대로 이 곳에 업데이트할 예정입니다.

** 이 책의 대상독자가 아닌 분들을 위해 입문서로 활용할 아주 얇은서적이 있다면 다른 분들을 위해 댓글로 정보공유 부탁드립니다.

*** 해당 리뷰는 서적 자체를 제외한 별도의 금전적 지원은 받지 않았으며 어떠한 가이드나 지침으로 작성된 글이 아님을 밝힙니다.

 

 

+ Recent posts