지연 → 은지 → 동우 → 규란 순 서기 느낌 okay?
화~금: 16시~18시 타스 책 읽기 + 면접 준비
토, 일: 오후 시간대
리액트
- React에 대해 설명해주세요.
- React의 원리, 특징, 장단점이 무엇인가요?
- Virtual DOM 이 무엇인지 설명해주세요.
- Virtual DOM 작동 원리에 대해 설명해주세요.
- JSX에 대해 설명해주세요.
- 답
- React에 대해 설명해주세요.
- 자바스크립트 기반, (SPA)싱글 페이지 어플리케이션의 UI를 생성하는데 집중한 라이브러리이다.
- 상태값이 변경될 때마다 UI를 자동으로 업데이트해주는 JS 라이브러리
- 꼬리질문
- SPA 는 무엇인가?
- SPA을 위한 라이브러리라 부족한 부분과 해결책? 페이지 전환 기능, react-router
- React의 원리, 특징, 장단점이 무엇인가요?
- 선언형 이라 대화형 UI를 작성하기 용이하다.
- 컴포넌트를 사용해서 UI를 재사용이 가능하고 서로 독립적인 조각 여러개로 나누어 관리가 가능하다.
- 가상돔을 통해 변경된 부분만 업데이트하는 효율적인 원리를 통해 UI를 업데이트 한다.
- 장점: 재사용 가능한 컴포넌트를 사용해서 사이트가 커지거나 프로젝트가 커져도 프로젝트 유지보수가 편리하고, 가상돔을 통해 UI에서 변경 된 부분만 업데이트 해줄 수 있다.
- 단점: 데이터 모델링, 라우팅, Ajax 지원 안됨, View 이외의 기능은 직접 구현해야 함, 로딩시간이 길다.
- Virtual DOM 이 무엇인지 설명해주세요.
- 실제 DOM에 접근하여 조작하는 대신, 해당 DOM을 추상화 하여 자바스크립트 객체로 구성한 것
- 동적으로 데이터가 변화했을 떄, 직접적으로 DOM을 조작하는 것이 아니라 DOM의 복사본인 새로운 Virtual DOM을 생성하여 그것을 비교해 UI를 업데이트 해준다.
- Virtual DOM 작동 원리에 대해 설명해주세요.
- 기존의 Virtual DOM와 새로운 Virtual DOM을 비교해 변경된 부분의 DOM만을 변경합니다.
- 이 과정을 조화 과정이라고 하는데, 해당 과정에서 비교 알고리즘이 사용됩니다.
- 두 개의 트리를 비교할 떄, React는 두 엘리먼트의 루트 엘리먼트부터 비교하고, 해당 루트 엘리먼트의 타입에 따라 동작이 달라집니다.
- 그리고, 자식에 대한 재귀적 처리를 할 때, 앞에서 부터 데이터를 넣을 경우 모든 자식을 변경해야하하는 비효율 문제가 있는데 key속성으로 해당 문제를 해결한다.
- JSX에 대해 설명해주세요.
- 리액트에서 사용하는 문법으로, JS와 HTML를 동시에 사용한다. 또한 HTML에 JS 변수들이나 선언형 프로그래밍 방식들을 바로 사용할 수 있는 일종의 템플릿 언어이다. (보기 쉽고 익숙하다. )
- 차이점: js와 jsx 확장자는 기능적으로 큰 차이를 가지고 있지는 않고, convention적인 측면에서 논쟁들이 존재하는 것 같습니다.
- 브라우저가 실행하기 전에 코드 번들링 하기 전에 js로 변환해서 사용하는데 그 과정에서 바벨 사용
- View만을 관리하는데 Model 과 다른 부분은 리액트에서 어떻게 사용하나요?
- 바뀐 부분만 업데이트 하는것보다 전체를 한번에 렌더링 하는 것이 좋지 않나요?
- 디버깅에 용이하고, 상대적으로 안정적이다.
- Virtual DOM을 쓰면 항상 성능이 좋은가?
- 지연님의 대답을 들어보면 DOM을 직접 조작하는 것처럼 들렸다. 직접적으로 DOM을 조작하는 게 맞는가?
- 지금 => 삼위일체
- 다음 => 하루에 한명씩
- React에 대해 설명해주세요.
- 리액트는 자바스크립트 라이브러리이며 재사용 가능한 컴포넌트 기반의 아키텍쳐입니다. 또한 Vue와 같이 다른 프레임워크와 다르게 오직 View만 관리하는 라이브러리입니다.
- React의 원리, 특징, 장단점이 무엇인가요?
- React는 SPA 방식으로 사용자의 인터렉션마다 단일 페이지의 특정 부분만을 변경하며 페이지를 구성합니다. 이 변경 사항을 웹 페이지에 적용하기 위해서, Virtual DOM을 이용합니다. 변경 사항이 발생한 UI만을 재렌더링하며, 브라우저 내 발생하는 연산이 줄어 성능이 개선된다는 특징이 있습니다.
- React의 특징
- SPA 기반이기 때문에 MPA와 다르게 페이지를 서버에서 받아올 때 다시 새로고침하지 않아 더 좋은 사용자 경험을 제공할 수 있다는 특징을 가집니다.
- 단방향 데이터 바인딩 방식으로 동작하며 데이터 흐름이 상위에서 하위 컴포넌트로 흐르기 때문에 데이터 추적과 디버깅이 쉽다는 특징을 가집니다.
- React의 장단점
- 장점 : 컴포넌트 기반으로 동작하므로 코드 재사용성과 유지 보수에 용이하다는 점과 그로 인한 최적화된 렌더링이 가능해진다.
- 단점 : React가 SPA 방식으로 동작하기 때문에 만약, 앱의 규모가 커지면 로딩 시간이 느려진다는 단점이 있습니다. 또한 MVC중 View만을 관리하는 라이브러리이기 때문에 View 이외의 기능은 다른 라이브러리를 사용하거나 직접 구현해야 하는 단점이 존재한다.(router, redux)
- Virtual DOM이 무엇인지 설명해주세요.
- DOM의 추상화 버전이며 html 객체에 기반한 자바스크립트 객체로 표현된다.
- Virtual DOM을 이용하면 실제 DOM에 접근해 DOM 요소를 조작하는 비효율적인 연산을 줄이기 때문에 브라우저의 성능을 개선시킬 수 있으며 Virtual DOM은 실제로 렌더링되지 않아 연산 비용이 적다는 특징을 가집니다.
- UI의 가상적인 표현을 메모리에 저장하고 ReactDOM 라이브러리에 의해 실제 DOM과 동기화하는 개념을 말한다.
- Virtual DOM 작동 원리에 대해 설명해주세요.
- 먼저 데이터를 업데이트하면 전체 UI를 DOM이 아닌 Virtual DOM에 리렌더링합니다. 그 후 이전 Virtual DOM과 현재 Virtual DOM과 비교해 변경된 부분만 실제 DOM에 적용하게 됩니다.
- DOM에 변화가 일어나면 웹 브라우저가 CSS를 다시 연산하고, 레이아웃을 구성하고 페이지를 리페인트하는데 이렇게 DOM을 조작할 때마다 웹 페이지를 새로 그리는 작업을 최대한 줄이기 위해 리액트는 Virtual DOM 방식으로 동작합니다.
- Virtual DOM을 조작하는 것도, 많은 컴포넌트를 조작하는 경우, 오버헤드가 발생할 습니다. 다만, Virtual DOM 제어가 DOM 제어에 비해 상대적으로 비용이 적게 들기 때문에 사용자와의 인터렉션이 많은 웹 사이트의 경우 DOM이 아닌 Virutal DOM을 사용하는 것입니다.
- 만약 정보 제공만 하는 웹 페이지라면 인터렉션이 발생하지 않기 때문에 Virtual DOM이 아닌 일반 DOM 성능이 더 좋을 수도 있습니다.
- JSX에 대해 설명해주세요.
- jsx는 자바스크립트 문법의 확장 문법이며, XML과 매우 비슷하게 생겼다.
- jsx를 이용해 컴포넌트가 반환하는 엘리먼트를 작성한다.
- jsx는 번들링 과정에서 Babel을 이용해 자바스크립트 형태로 변환된다.
- React에 대해 설명해주세요.
- 리액트는 사용자 인터페이스를 만들기 위한 자바스크립트 라이브러리입니다. 싱글 페이지 어플리케이션이나 모바일 애플리케이션 개발에 사용됩니다. 보통 MVC나 MVW 등과 같은 아키텍쳐의 경우에는 모델과 뷰가 함께 있기 때문에 그 규모가 커지고, 양방향 데이터 플로우일수록 더욱 복잡해져 디버깅과 코드를 이해하기 어려워집니다. 리액트는 오직 view에만 집중한 라이브러리로, 단방향 데이터 흐름을 활용합니다. 복잡하고 동적인 웹 어플리케이션에서 UI를 동적으로 나타내기 위해서 많은 상태 관리가 요구되는데, 리액트는 이때 DOM 요소 하나 하나를 직접관리 하지 않고, virtual DOM을 이용해 불필요한 연산을 줄이고 효율성을 높여 개발할 수 있습니다.
- 꼬리 질문 1 : 그냥 데이터가 바뀔 때마다 새롭게 렌더링하는 방식이 더 편하지 않나요?
- 꼬리 질문 2 : UI를 동적으로 나타낸다는 것이 무엇인가요?
- React의 원리, 특징, 장단점이 무엇인가요?
- 초기 렌더링 과정에서 render 함수를 이용해 컴포넌트를 렌더링하고, 이후에 HTML 마크업을 생성해 DOM 요소 안에 주입합니다. 이후, 조화 과정에서 데이터가 업데이트 되면 해당 컴포넌트는 render 함수를 또 다시 호출하며 virtural DOM을 활용해 이전 DOM 노드와 비교해 둘의 차이를 알아내 최소한의 연산으로 DOM 트리를 업데이트 합니다.
- 특징 & 장점 : 컴포넌트 별로 나누어 개발이 가능합니다. 이는 개발을 쉽게 하고, 유지보수에 용이하며, 생성한 컴포넌트는 재사용 또한 가능합니다. 그리고, 단방향 데이터 플로우를 가지기 때문에 단순한 데이터의 흐름으로 이해가 쉽고 편리한 구현이 가능합니다.
- 정말 뷰만 신경 쓰기 때문에 데이터 모델링, 라우팅, Ajax 등 기능 지원이 안된다. 기타 기능의 경우에는 직접 구현하거나 다른 라이브러리를 사용해야 한다는 단점이 존재합니다.
- 꼬리 질문 1 : 단방향 데이터 바인딩이 어떻게 이루어지며, 그에 대한 장점은 무엇인가요?
- Virtual DOM 이 무엇인지 설명해주세요.
- 웹브라우저 단에서 DOM에 변화가 일어나면 엔진이 웹 페이지를 새로 그리기 때문에, 업데이트가 너무 잦게 되면 성능이 저하될 수 있습니다. Virtual DOM은 실제 DOM에 접근하여 조작하는 대신, 추상화한 DOM을 메모리에 저장하고, 실제 DOM과 동기화하는 프로그래밍 개념으로, DOM 처리 횟수를 최소화해 효율적으로 업데이트를 진행하도록 합니다.
- 꼬리 질문 1 : Virtual DOM을 사용할 때와 사용하지 않을 때의 속도 차이가 많이 난다고 생각하시나요?
- Virtual DOM 작동 원리에 대해 설명해주세요.
- 데이터가 업데이트 되면, 전체 UI를 Virtual DOM에 리렌더링 하고, 이전 VirtualDOM에 있던 내용과 현재 내용을 비교합니다. 이때, 바뀐 부분이 있는 경우에만 실제 DOM에 적용하기 때문에 효율적인 업데이트를 진행할 수 있습니다.
- 꼬리 질문 1 : 일반적으로 어떤 서비스에서 virtual DOM, 즉 리액트를 통해 개발을 진행할 것이라고 생각하시나요?
- JSX에 대해 설명해주세요.
- 자바스크립트의 확장 문법으로, XML과 매우 유사합니다. 마크업과 로직을 하나의 파일에 넣어 관리할 수 있기 때문에, 가독성과 활용도가 높습니다. JSX로 작성된 코드는 브라우저에서 실행되기 전에 코드가 번들링하는 과정에서 바벨을 사용해 일반 자바스크립트 형태의 코드로 변환됩니다.
- 꼬리 질문 1 : JSX로 작성된 코드는 어떻게 활용되나요?
동우
리액트
은지
SPA의 장점과 단점은 무엇인가요?
SPA의 장점으로는 전체 페이지를 로드하지 않고 페이지의 일부만 바꾸기 때문에 웹 사용성 측면에서 좋습니다. 하지만 하나의 페이지만을 사용하므로 한 번에 해당 페이지에 관련된 모든 컴포넌트와 리소스를 불러와야하기 때문에 초기 로딩 시간이 길다는 단점이 존재합니다.
단방향 데이터 바인딩 방식과 양방향 데이터 바인딩 방식의 차이를 설명해주세요.
단방향 데이터 바인딩은 데이터 변경을 감지하는 하나의 Watcher가 자바스크립트의 데이터 갱신을 감지해 자동으로 사용자의 UI 데이터를 갱신하지만, 양방향 데이터 바인딩은 사용자의 UI의 데이터 변경을 감시하는 watcher와 자바스크립트 데이터의 변경을 감시하는 watcher가 UI와 자바스크립트 데이터를 자동으로 동기화하는 방식을 말한다.
꼬리 질문 : Virtual DOM의 성능이 항상 좋은가요?
JSX의 장점은 무엇인가요?
JSX는 HTML 코드와 비슷하기 때문에 일반 자바스크립만 사용한 코드보다 더 익숙하며 가독성이 좋다.
지연
⇒ 웹 브라우저에서 계속 새롭게 렌더링한다면, CPU 점유율이 증가하며 메모리도 많이 사용하게 됩니다. 또한, 사용자에게 끊김 현상을 제공할 수 있기 때문에, 성능 또한 저하될 수 있습니다.
⇒ 동적으로 웹 페이지를 변경하다 보면 element를 생성하거나 수정하고 제거하는 등 DOM을 변화시키는 수많은 연산이 생겨납니다. 이 연산 과정과 더불어 웹 페이지의 UI 의 동적인 변화가 이루어 지는 것을 말합니다.
⇒ 리액트 내에서의 데이터 흐름은 부모에서 자식으로 이루어 집니다. 그렇기 때문에 디버깅에 용이하며, 다른 라이브러리에 비해 안정성이 높습니다.
⇒ Virtual DOM을 사용하는 것이 무조건 빠르지는 않습니다. 리액트를 사용하지 않고도 코드 최적화를 최대한으로 이끌어 내면 DOM 작업이 느려지는 것을 개선할 수 있으며, 정적인 페이지의 경우에는 리액트를 사용하지 않는 편이 더 나은 성능을 보이기도 합니다.
⇒ 트위터나 페이스북과 같이 무한스크롤로 이루어진 웹 어플리케이션의 경우에 직접적으로 DOM에 접근해 변화를 주다보면 성능적으로 문제가 발생하게 되는 데, 이러한 대규모 어플리케이션의 개발에 리액트를 사용하면 성능 이슈를 해결할 수 있습니다.
⇒ 코드가 번들링되는 과정에서 바벨을 사용해 일반 자바스크립트 형태의 코드로 변환됩니다.
- 엘리먼트와 컴포넌트의 차이에 대해 설명해주세요.
- 리액트에서 컴포넌트를 어떻게 생성하나요?
- 클래스형 컴포넌트를 사용해보셨나요?
- 클래스형 컴포넌트와 함수형 컴포넌트의 차이에 대해 설명해주세요.
- 함수형 컴포넌트의 장점에 대해 설명해주세요.
- 답
- 엘리먼트는 React의 가장 작은 단위이고, 컴포넌트의 구성 요소이다.
- 엘리먼트는 인스턴스가 아니다. 엘리먼트는 immutable한 plain object이다.(엘리먼트가 생성되면, 절대로 변화되지 않는다.)
- 엘리먼트는 컴포넌트 인스턴스나 DOM 노드에 관한 정보를 묘사하고 있다.
- Element는 바로 사용되지는 않으며, Component에서 리턴받아서 사용되곤 합니다.
- 엘리먼트는 타입(type)과 속성(props) 2가지 필드로 구성된다.
- type을 보고 DOM 노드인지, 컴포넌트 인스턴스인지 알려준다.
- 그리고 props로 해당 객체가 갖고 있는 속성들, 클래스네임이나 자식 엘리먼트 등을 나타낸다.
- 위 엘리먼트는 아래처럼 단순한 HTML을 나타낸다. 컴포넌트
- 함수 컴포넌트는 데이터를 가진 props 객체인자를 받아 element를 반환한다.
- UI를 재사용 가능한 개별적인 여러 조각으로 나눈 것이다.
- 컴포넌트는 엘리먼트 트리를 캡슐화한다.
- 컴포넌트의 속성을 수정할 때 사용하는 요소다.
- 컴포넌트에 상태가 존재하고 그 상태에 따라 컴포넌트가 주기적으로 업데이트 되어야 한다면 클래스 컴포넌트를 사용하자. React.Component
- 컴포넌트에 상태가 없고 항상 정적으로 데이터가 표기가 된다면 함수 컴포넌트를 이용하자. JSX
- JSX를 사용하면, createElement 사용없이, 일반적으로 html을 작성하는 방식으로 코드를 작성할 수 있다. 하지만 브라우저는 jsx를 읽을 수 없으므로 babel을 사용해서, jsx문법들을 js처럼 바꿔서 사용한다. 굳이 확장자에 jsx를 안써도 괜찮다. js 파일에 jsx를 작성하고 babel 설정에서 js도 읽어 들여 변환하면 된다.
- 클래스는 멤버변수가 딱 한번 생성되는 반면에 function 컴포넌트는 매번 실행되기 때문에 계속 반복해서 생성된다. 가장 일반적으로 state와 render함수를 이용하는 클래스로 만드는 컴포넌트이다. 상태가 존재하고 상태에 변화가 생기면 render함수가 실행된다.
- 특별히 사용은 안해봤다. 하지만, 공부할 때 클래스형 컴포넌트로 써있는 예시가 많아 접해보았고, 라이프 사이클 공부를 할 때 보았다.
- 라이프 사이클
- Will 접두사가 붙은 메서드: 특정 작업을 작동하기 전에 실행되는 메서드
- Did 접두사가 붙은 메서드: 특정 작업을 작동한 후 실행되는 메서드 라이프 사이클은 총 세가지(마운트, 업데이트, 언마운트) 카테고리로 나뉜다.
- 상태가 존재한다.
- 라이프사이클 메서드가 존재한다.
- 상태의 변화에 따라 렌더함수가 실행된다.
- 상태가 없다.
- 라이프사이클 메서드가 없다.
- 단, 리엑트 훅을 사용하면 클래스 컴포넌트처럼 사용이가능하다. (함수 컴포넌트안에서도 상태를 가질 수 있다.)
- useState 훅으로 state를 관리할 수 있다.
- 상속대신 합성으로 컴포넌트를 만들어야 한다.
- 함수형 컴포넌트는
render()
함수가 필요 없다. 그래서 컴포넌트 마운트 속도가 더 빠르고, 가독성이 좋은 장점이 있다. - 함수형 컴포넌트에서 this를 사용하지 않아 this로 야기될 수 있는 문제를 해결할 수 있다.
- this.props인데, this는 변할 수있는데 props는 불변성을 지켜야 한다.
- 엘리먼트와 컴포넌트의 차이에 대해 설명해주세요.
- 리액트에서 컴포넌트를 어떻게 생성하나요?
- 클래스형 컴포넌트를 사용해보셨나요?
- 클래스형 컴포넌트와 함수형 컴포넌트의 차이에 대해 설명해주세요.
- 함수형 컴포넌트의 장점에 대해 설명해주세요.
- 엘리먼트와 컴포넌트의 차이에 대해 설명해주세요.
- 엘리먼트 : 리액트에서 가장 작은 단위로 화면에 표시할 내용을 말하며, 컴포넌트의 구성 요소이다. 브라우저의 DOM 엘리먼트와 달리, 리액트 엘리먼트는 일반 객체이며, 쉽게 생성할 수 있습니다.
- 컴포넌트 : UI를 재사용 가능한 개별적인 여러 조각으로 나눈 것, 자바스크립트의 함수와 유사한데, props라는 임의의 입력을 받은 후 화면에 어떻게 표시되는 지 기술하는 리액트 엘리먼트를 반환한다.
- 꼬리 질문 1 : props 가 무엇인가요?
- 컴포넌트의 속성을 설정할 때 사용하는 요소, 해당 컴포넌트의 부모 컴포넌트에서 설정
- 리액트에서 컴포넌트를 어떻게 생성하나요?
- 함수 컴포넌트 : props 객체 인자를 받아, 리액트 엘리먼트를 반환하는 함수를 통해 생성
- 클래스 컴포넌트 : 자바스크립트의 클래스 문법을 이용하고, 생성자 함수를 이용해 초기 상태를 지정한다. reder 함수가 반드시 필요하며, JSX를 반환하도록 생성
- 꼬리 질문 1 : 함수 컴포넌트와 클래스 컴포넌트의 차이점은?
- 함수 컴포넌트는 state와 라이프 사이클 api의 사용이 불가능하다.
- 리액트 버전 16.8 업데이트 이후 hooks 기능을 통해 비슷한 작업 가능.
- 함수 컴포넌트는 render 함수가 필요 없어, 컴포넌트 마운트 속도가 빠르고 가독성이 좋다.
- 꼬리 질문 2 : 함수 컴포넌트의 장점은 무엇인가?
- 선언하기에 편리
- 클래스형 컴포넌트보다 메모리 자원을 덜 사용
- 꼬리 질문 3 : 함수 컴포넌트의 단점은 무엇인가?
- state, 라이프 사이클 api의 사용이 불가능
- 꼬리 질문 4 : 라이프 사이클 api 가 무엇인가?
- 컴포넌트가 DOM 위에 생성되기 전, 후 또는 데이터가 변경되어 상태를 업데이트 하기 전, 후로 실행되는 메소드들
- 꼬리 질문 5 : 함수 컴포넌트와 클래스 컴포넌트의 성능 차이가 많이 나는가?
- 성능과 파일 크기 면에서는 사실상 별 차이가 없다.
- 클래스형 컴포넌트를 사용해보셨나요?
- 처음 리액트를 공부할 때 사용해봤다. 클래스형 컴포넌트의 경우에는 함수혐 컴포넌트보다 가독성이 떨어진다. 또한, props는 불변의 값이지만, this는 변경이 가능하기 때문에 요청 이후 클래스 컴포넌트가 다시 렌더링 될 때 this 또한 바뀌게 되기 때문에 이 부분의 핸들링을 위한 코드를 추가적으로 작성해야 한다.
- 꼬리 질문 1 : 클래스 컴포넌트를 사용하면서 느꼈던 단점은?
- 단점 : 가독성이 떨어지며, this의 가변성을 처리하기 위한 추가적인 코드가 필요해 코드가 길어진다.
- 클래스형 컴포넌트와 함수형 컴포넌트의 차이에 대해 설명해주세요.
- 함수 컴포넌트는 state와 라이프 사이클 api의 사용이 불가능하다.
- 리액트 버전 16.8 업데이트 이후 hooks 기능을 통해 비슷한 작업 가능.
- 함수형컴포넌트는 클래스형 컴포넌트보다 메모리 자원을 덜 사용
- 꼬리 질문 1 : 라이프 사이클 api 가 무엇인가?
- 컴포넌트가 DOM 위에 생성되기 전, 후 또는 데이터가 변경되어 상태를 업데이트 하기 전, 후로 실행되는 메소드들
- 꼬리 질문 5 : 함수 컴포넌트와 클래스 컴포넌트의 성능 차이가 많이 나는가?
- 성능과 파일 크기 면에서는 사실상 별 차이가 없다.
- 함수형 컴포넌트의 장점에 대해 설명해주세요.
- 선언하기에 편리
- 클래스형 컴포넌트보다 메모리 자원을 덜 사용
동우
엘리먼트와 컴포넌트의 차이에 대해 설명해주세요.
//
리액트에서 컴포넌트를 어떻게 생성하나요?
클래스로 만드는 컴포넌트
클래스형 컴포넌트를 사용해보셨나요?
클래스형 컴포넌트와 함수형 컴포넌트의 차이에 대해 설명해주세요.
클래스형 컴포넌트
함수형 컴포넌트
함수형 컴포넌트의 장점에 대해 설명해주세요.
은지
Element는 DOM 노드에 대해 정보를 가진 객체이며, 한 번 생성되면 다시 변형되지 않는다는 특징을 가집니다.
Component는 Element를 반환하는
함수
나 클래스
를 의미합니다. 컴포넌트는 props를 input으로 받아 재사용이 가능한 UI를 만드는데 사용됩니다.컴포넌트의 동작
컴포넌트는 props를 input으로 받아 재사용이 가능한 UI를 만든다.
두 가지로 나누어 설명할 수 있습니다.
클래스형 컴포넌트에서는 내부의 render 메서드를 통해 반환하는 jsx로 컴포넌트를 생성하며, 함수 컴포넌트에서는 내부의 return문으로 반환한 jsx로 컴포넌트를 생성합니다. 이 때 컴포넌트가 반환한 jsx 엘리먼트는 React의 createElement를 호출해 컴포넌트 객체를 생성합니다.
이를 메모리에 저장해 ReactDOM.render 함수를 통해 Web API(document.createElement)를 이용해 실제 웹 브라우저에 보여지게 됩니다.
createElement를 설명해주세요.
React.createElement( type, // 태그 이름 문자열 | 리엑트 컴포넌트 | React.Fragment [props], // 리엑트 컴포넌트에 넣어주는 데이터 객체 [...children] // 자식으로 넣어주는 요소들 );
프로젝트에 사용해보지는 못했지만 생명 주기를 배울 때 접해본 개념입니다.
클래스 컴포넌트는 Component를 상속받아야 하며, 생성자 함수 내부에서 상태를 생성하고, render 메서드로 jsx를 랜더링하는 특징이 있습니다.
클래스형 컴포넌트의 생명 주기를 설명해주세요.
생명 주기는 크게 처음 컴포넌트가 생성되어 랜더링된 경우, 컴포넌트가 업데이트된 경우, 컴포넌트가 제거되는 경우, 이 3가지로 나누어 이야기할 수 있습니다. 컴포넌트가 생성되었을 때는 componentDidMount이 호출되며, 업데이트된 경우는 componentDidUpdate, 컴포넌트가 DOM상에서 제거될 때는 componentWillUnmount 메서드가 호출됩니다.
클래스 컴포넌트는 생성자 내부에서 state를 초기화해 상태를 관리하며, 또한 컴포넌트 내부에서 lifeCycle 메서드를 사용할 수 있습니다. 하지만 함수형 컴포넌트는 state와 lifeCycle 메서드를 hook의 도움을 받아 처리합니다. 또한 prop의 사용에도 차이를 보입니다.
클래스형 컴포넌트 대신 함수 컴포넌트 사용할까요?
함수 컴포넌트 내부에 상태나 lifeCycle 관련 로직 코드를 작성하지 않아도 되므로 클래스 컴포넌트보다 간결하게 코드를 작성할 수 있기 때문입니다.
또한 React는 합성 모델을 가지고 있어서 상속 대신 합성을 이용해 컴포넌트를 재사용하는 것이 좋습니다. 하지만 클래스 컴포넌트는 상속으로 구현해야 하며 상속은 컴포넌트의 재사용성에 효율적이지 못하기 때문에 보통 컴포넌트의 유연함을 제공하기 위해 함수형 컴포넌트를 사용합니다.
함수 컴포넌트는 클래스형 컴포넌트에 필수로 작성해야 하는 Component 상속, 생성자 함수, render 메서드를 작성하지 않기 때문에 선언이 간편합니다.
또한 클래스 컴포넌트의 여러 lifecycle 메서드를 useEffect hook 하나로 처리할 수 있다는 장점이 있습니다.
지연
- ⭐ 라이프사이클 메소드에 대해 설명해주세요.
- ⭐ 라이프사이클에 대해 설명해주세요.
- ⭐ React Hooks에 대해 설명해주세요.
- ⭐ 함수형 컴포넌트에서 클래스형 컴포넌트의 라이프 사이클 메소드를 비슷하게 사용하는 방법에 대해 설명해주세요. (useEffect => ComponentDidMount, ComponentDidUpdate, ComponentWillUnmount)
- useEffect와 useLayoutEffect의 차이점에 대해 설명해주세요.
- 답
- 컴포넌트가 브라우저상에 나타나고 (mount), 업데이트(update)되고, 사라지게 (Unmount)될 때 호출되는 메소드들을 말한다. 클래스형 컴포넌트서만 사용된다.
- 접두사 did와 will로 특정 시점을 나타내서 해당시점에 어떤 동작을 하고 싶을 때
- mount 메서드에는 constructor, getDerivedStateFromProps(props를 staet에 넣어줄 때,), render, componentDidMount가 있다.
- componentDidMount는 첫 렌더링 이후에 호출되는 메서드로 해당 시점에 어떤 동작을 하고싶을 때, 해당 메서드를 사용해서
- componentDidUpdate 는 리렌더링 되었을 때 어떤 동작을 하고싶으면 해당 메서드 안에 그 동작을 명시하면 된다.
- componentWillUnmount는 컴포넌트가 사라지기 직전에 어떤 동작을 하고싶으면 해당 메서드에 동작을 명시하고 실행시킵니다.
- 타이머, 네트워크
- 리액트 컴포넌트에는 생명주기라는 게 있는데, 이것을 라이프 사이클이라고 합니다. 라이프사이클은 컴포넌트가 실행되거나, 업데이트되거나, 제거될 때 특정한 이벤트들이 발생하는데요. 해당 이벤트로 특정 시점에 컴포넌트에서 원하는 동작을 하게 할 수 있다.
- 써보셨나요? 좋은점은?
- Class형 컴포넌트에서 this와 같은 수많은 단점들을 극복하기 위해, 함수형 컴포넌트로 Class없이 React 의 기능들을 사용할 수 있게 하는 방법을 제시했다.
- 다른 단점들 Class 컴포넌트 를 사용해 상태를 사용하게 되면 상태 추적이어렵다.
- useEffect 는 리액트 컴포넌트가 렌더링 될 때마다 특정 작업을 수행하도록 설정 할 수 있는 Hook 입니다. 클래스형 컴포넌트의 componentDidMount 와 componentDidUpdate 를 합친 형태로 보아도 무방합니다
- ComponentDidMount를 사용하려면, useEffect의 두번째 파라미터로 비어있는 배열을 넣으면 같은 동작을 합니다.
- ComponentDidUpdate를 사용하려면, useEffect의 두번째 파라미터에 관찰하고 싶은 요소를 넣고, 코드를 작성하면 같은 동작을 할 수 있다.
- ComponentWillUnmount를 사용하려면, useEffect에 return문을 넣어서
- 라이프사이클 메소드에 대해 설명해주세요.
- componentDidMount() : 컴포넌트가 마운트 직후에 호출된다. 즉, 컴포넌트가 평가되고 DOM에 랜더링 될 때 호출된다. DOM 노드가 있어야 하는 초기화 작업은 이 메서드에서 이루어지면 됩니다.
- componentDidUpdate() : 컴포넌트가 갱신된 직후에 호출되며 최초 렌더링에는 호출되지 않습니다. 즉, 상태가 변경되어 컴포넌트가 재평가, 재랜더링되면 호출된다. 이전과 현재의 props을 비교해 네트워크 요청을 보내는 작업은 이 메서드에 작성한다.
- componentWillUnmount() : 컴포넌트가 마운트 해제되어 제거되기 직전에 호출됩니다. 즉, 컴포넌트가 DOM에서 삭제되기 직전에 호출된다. 이 메서드 내에 타이머 제거, 네트워크 요청 취소, componentDidUpdate에서 설정한 구독 해제 작업을 작성한다.
- 라이프사이클에 대해 설명해주세요.
- React Hooks에 대해 설명해주세요.
- 함수형 컴포넌트에서 클래스형 컴포넌트의 라이프 사이클 메소드를 비슷하게 사용하는 방법에 대해 설명해주세요. (useEffect => ComponentDidMount, ComponentDidUpdate, ComponentWillUnmount)
- 빈 의존성 배열을 작성 ⇒ componentDidMount()
- 의존성 배열에 라이프 사이클에 의존할 데이터를 작성, 이는 컴포넌트가 첫 렌더링될 때 한 번 실행된다. ⇒ componentDidMount(), componentDidUpdate()
- 리턴으로 cleanUp 함수를 작성 ⇒ componentWillUnmount()
- 이는 useEffect의 cleanUp 함수와 같다.
- cleanUp 함수는 effect 함수(useEffect 함수의 첫 번째 매개변수)가 다시 실행되기 직전에 호출된다.
- 항상 DOM으로부터 삭제되기 전에 다시 호출된다.
- useEffect와 useLayoutEffect의 차이점에 대해 설명해주세요.
- useEffect: 컴포넌트들이 render와 paint된 후에 실행되며 비동기적으로 실행됩니다. paint 이후에 실행되므로 DOM을 조작하는 로직이 포함되었더라면 유저는 화면의 깜빡임을 경험하게 됩니다.
- useLayoutEffect: 컴포넌트들이 render된 후에 실행되며 그 이후에 paint가 실행된다. 이는 동기적으로 실행됩니다. 즉, paint 이전에 실행되기 때문에 DOM을 조작하는 로직이 포함되었더라도 유저는 화면의 깜빡임을 경험하지 않습니다. 만약 함수 로직이 복잡한 경우, 로딩 시간이 너무 느려져서 사용자에게 좋지 않은 웹 경험을 제공할 수 있습니다.
- ⭐ 라이프사이클 메소드에 대해 설명해주세요.
- 컴포넌트 상태에 변화가 있을 때마다 실행하는 메소드
- 컴포넌트를 처음 렌더링할 때나 컴포넌트를 업데이트 하기 전 후, 불필요한 업데이트를 방지해야 할 때 사용하는 메서드
- 서드파티 라이브러리를 사용하거나 DOM을 직접 건드려야 하는 상황에서 유용
- 꼬리 질문 1 : 서드 파티 라이브러리는 무엇인가요?
- 꼬리 질문 2 : 라이프 사이클 메소드의 종류에 대해 간단히 설명해주세요.
- ⭐ 라이프사이클에 대해 설명해주세요.
- 모든 리액트 컴포넌트에 존재하는 수명 주기
- 컴포넌트가 페이지에 렌더링되기 전인 준비 과정에서 시작해서 페이지에서 사라질 때 끝남
- 크게 마운트, 업데이트, 언마운트 카테고리로 나뉨
- 마운트 : DOM이 생성되고 웹 브라우저 상에 나타나는 것
- 업데이트 : 컴포넌트의 업데이트 (props, state, 부모 컴포넌트 리렌더링, 강제 렌더링 트리거)
- 언마운트 : 컴포넌트를 DOM에서 제거하는 것
- ⭐ React Hooks에 대해 설명해주세요.
- 리액트 버전 16.8 이후에 새로 도입된 기능
- 함수 컴포넌트에서 react state와 생명 주기 기능을 연동할 수 있게 해주는 함수
- class 안에서는 동작하지 않지만, 대신 class 없이 react를 사용할 수 있게 해줌
- 꼬리 질문 1 : useState, useEffect에 대해 설명해주세요.
- ⭐ 함수형 컴포넌트에서 클래스형 컴포넌트의 라이프 사이클 메소드를 비슷하게 사용하는 방법에 대해 설명해주세요. (useEffect => ComponentDidMount, ComponentDidUpdate, ComponentWillUnmount)
- 라이프 사이클 메소드는 컴포넌트가 생성되고, 제거될 때까지의 라이프 사이클 과정을 세세하게 나누어 컨트롤 할 수 있다.
- useEffect : componentDidMount, componentDidUpdate, componentWillUnmount 세 가지의 역할을 수행할 수 있는데, 첫 번째 파라미터에 실행할 함수, 두 번째 파라미터의 값에 따라 변화한다. 빈 배열로 존재하는 경우(컴포넌트 초기 렌더링 시에만 실행), 값을 채우는 경우(업데이트), 리턴 값을 작성하는 경우(언마운트) 로 사용할 수 있다.
- useEffect와 useLayoutEffect의 차이점에 대해 설명해주세요.
- useEffect : 리액트 컴포넌트가 렌더링될 때마다 특정 작업을 수행하도록 설정할 수 있는 훅
- useLayoutEffect : 브라우저가 화면에 DOM을 그리기 전에 이펙트를 수행
- 꼬리 질문 1 : useLayoutEffect의 단점은 무엇인가요?
- 꼬리 질문 2 : 언제 useLayoutEffect를 사용해야 하나요?
동우
⭐ 라이프사이클 메소드에 대해 설명해주세요.
⭐ 라이프사이클에 대해 설명해주세요.
⭐ React Hooks에 대해 설명해주세요.
⭐ 함수형 컴포넌트에서 클래스형 컴포넌트의 라이프 사이클 메소드를 비슷하게 사용하는 방법에 대해 설명해주세요. (useEffect => ComponentDidMount, ### ComponentDidUpdate, ComponentWillUnmount)
useEffect와 useLayoutEffect의 차이점에 대해 설명해주세요.
두 코드의 가장 큰 차이점은 실행 시점입니다.
- useEffect는 컴포넌트들이 render와 paint 된 후 비동기적(asynchronous) 으로 실행됩니다. paint 된 후 실행되기 때문에, useEffect 내부에 dom에 영향을 주는 코드가 있을 경우 사용자 입장에서는 화면의 깜빡임을 보게됩니다.
- useLayoutEffect는 컴포넌트들이 render 된 후 실행되며, 그 이후에 paint 가 됩니다. 이 작업은 동기적(synchronous)으로 실행됩니다. paint 가 되기 전에 실행되기 때문에 dom을 조작하는 코드가 존재하더라도 사용자는 깜빡임을 경험하지 않습니다.
은지
만약 타이머(setTimeout, setInterval)를 설정하거나 네트워크 요청을 보내는 코드를 작성해야 한다면 어떤 메서드에 작성하는 것이 좋을까요?
componentDidMount()
메서드는 컴포넌트 출력물이 DOM에 렌더링 된 후에 실행됩니다. 이 장소가 타이머를 설정하기에 좋은 장소입니다. 또한 반드시 componentWillUnmount()
에서 구독 해제 작업을 수행해야 한다.
https://ko.reactjs.org/docs/state-and-lifecycle.html#adding-lifecycle-methods-to-a-class각 컴포넌트들은 생명 주기를 가집니다. 라이프사이클은 컴포넌트가 DOM에 추가되거나 업데이트 되거나 제거되는 과정을 말합니다. 라이프 사이클 메서드를 통해 각 과정에서 컴포넌트에게 일을 정의할 수 있습니다. 클래스형 컴포넌트에서는 라이프 사이클 메서드를 통해 컴포넌트를 조작할 수 있으며 함수형 컴포넌트에서는 따로 라이프 사이클 메서드가 없기 때문에 useEffect 훅을 이용해 구현할 수 있습니다.
hook은 이전의 클래스형 컴포넌트의 문제를 해결하기 위해 등장했으며 react 버전 16.8부터 React에 새롭게 추가된 기능입니다. 함수형 컴포넌트에서 useState 훅을 이용해 상태를 구현하고 useEffect 훅을 이용해 라이프사이클을 구현할 수 있게 되었고 이전의 클래스형 컴포넌트보다 가독성이 향상되는 이점이 있습니다.
React가 Hook을 도입한 이유에 대해 설명해주세요.
1. 기존에 클래스 컴포넌트를 이용해 상태 로직을 재사용하기 어려웠습니다. 그래서 render props나 고차 컴포넌트 패턴을 통해 상태 로직을 재사용해왔지만 이는 코드의 추적이 힘들다는 단점이 있었습니다. 이를 해결하고자 hook을 도입하게 되었고 hook을 통해 컴포넌트 간의 상태 관련 로직을 재사용할 수 있게 되었습니다.
2. 클래스 컴포넌트를 사용하기 위해서는 this를 사용해야 하는데, 하지만 this는 변할 수 있고, 런타임 시점에 결정되기 때문에 코드의 재사용성에 좋지 못했습니다. 이러한 문제를 해결하기 위해 hook은 class 없이 react를 사용할 수 있도록 합니다.
클래스 컴포넌트는 라이프사이클이 컴포넌트에 중심이 맞춰져 있었습니다. 반면에 함수 컴포넌트에서는 특정 데이터에 대해서 라이프사이클이 진행됩니다. 만약 데이터는 여러 개인 경우, 클래스 컴포넌트에서는 각 라이프사이클 메서드를 컴포넌트 당 한 번씩만 사용해야 했다면 useEffect는 데이터의 개수에 따라 여러 번 사용할 수 있습니다.
useEffect(..., []);
useEffect(..., [someValue]);
useEffect(() => { return () => {...} }, [])
가장 큰 차이점은 실행 시점이다.
지연
⇒ 편하고 효율적인 개발을 위해 사용하는 플러그인, 라이브러리, 프레임워크 등을 말한다.
⇒ 총 9가지 존재, will 접두사가 붙은 작업 작동 전 실행되는 메소드와 did 접두사가 붙은 어떤 작업을 작동한 후 실행되는 메소드로 나뉨
render, constructor, getDerivedStateFromProps, componentDidMount, shouldComponentUpdate, getSnapshotBeforeUpdate, componentDidUpdate, componentWillUnmount, componentDidCatch
⇒ useState: 가장 기본적인 훅으로, 함수 컴포넌트에서도 가변적인 상태를 지닐 수 있게 해줌
useEffect: 리액트 컴포넌트가 렌더링될 때마다 특정 작업을 수행하도록 설정할 수 있음
레이아웃 배치와 그리기를 완료한 후 이펙트 함수를 호출해, 상태값이 이펙트에 의존할 경우 약간 불편한 사용자 경험으로 이어질 수 있음
특히, 화면이 복잡해지면 체감할 수 있을 정도로 렌더링 시간이 증가
따라서, 렌더링할 상태가 이펙트 내에서 초기화되어야 할 경우, 사용자 경험을 위해 useLayoutEffect를 사용해야 한다.
⇒ 이펙트 내부 로직이 복잡한 경우에는 사용자가 레이아웃을 보는 데까지 시간이 오래 걸릴 수 있다는 단점이 존재한다.
⇒ 일반적인 경우에는 useEffect를 사용하되, state가 조건에 따라 첫 페인팅 시 다르게 렌더링되어야 할 때 useLayoutEffect를 사용해야 한다.
- Pure Component에 대해 설명해주세요.
- shouldComponentUpdate에 대해 설명해주세요.
- State에 대해 설명해주세요.
- React에서 State를 어떻게 관리하나요?
- Props에 대해 설명해주세요.
- ⭐ Props Drilling에 대해 설명해주세요.
- ⭐ Props Drilling을 어떻게 해결할 수 있나요?
동우
Pure Component에 대해 설명해주세요.
- 리액트는 같은 상태, 같은 props, 같은결과라면 순수성을 고려하는데, 그때 클래스형 컴포넌트에서 사용하는 것이 React.PureComponent 입니다.
(꼬리 질문 1)리액트의 순수성은 어떤 것이 있나요?
- 반환 값은 입력 값에 의해서만 결정됩니다.
- 반환 값은 동일한 입력 값에 대해 항상 동일합니다.
(꼬리질문 2) 함수형 컴포넌트에서는 어떻게 이 동작을 대체하나요?
- React.memo를 활용하여 props를 얕은 비교를하여 불필요한 업데이트는 렌더링을 하지 않도록 한다.
shouldComponentUpdate에 대해 설명해주세요.
- React에서 사용되는 라이프 사이클 메서드로,
- props가 변경 되었을때
- state가 변경 되었을때
- 부모 컴포넌트가 렌더링 되었을때
- 이렇게 컴포넌트가 업데이트 되어야 할 때, 사용하는 라이프 사이클 메서드 이다.
- *shouldComponentUpdate()**안에 얕은 비교가 적용된 버전이다.
State에 대해 설명해주세요.
- 컴포넌트에 대한 데이터 또는 정보를 포함하는 데 쓰이는 리액트 내장 객체이다.
- state는 시간이 지남에 따라 변경될 수 있다. 변경될 때마다 컴포넌트가 다시 렌더링된다.
- state 변경은 사용자 작업 또는 시스템 생성 이벤트에 대한 응답으로 발생할 수 있으며 이 변경은 컴포넌트의 동작, 렌더링 방법을 결정한다.
- props로 setState를 함수를 넘기는 경우 ? => 찾기 ㅇ.ㅇ
React에서 State를 어떻게 관리하나요?
- 클래스형 컴포넌트에서는 this.state,
- 함수형 컴포넌트에서는 useState로 관리한다.
- 직접 값을 변경하게 되면 Component를 다시 렌더링 할 타이밍을 알아차리지 못한다.
- 그래서 useState를 통해 값을 변경해야 한다.
Props에 대해 설명해주세요
- 상위 컴포넌트에서 하위 컴포넌트로 데이터를 전달해주는 객체이다.
- 읽기 전용 값이라 사용자가 값을 변경할 수 없다.
- 리액트는 사용자 정의 컴포넌트로 작성한 엘리먼트의 JSX 속성과 자식을 해당 컴포넌트에 단일 객체로 전달합니다.
- 상위 컴포넌트에서 어떤 데이터를 보낼 것인지를 정하면 이 데이터를 props를 통해 객체 형태로 하위 컴포넌트로 보냅니다.
⭐ Props Drilling에 대해 설명해주세요.
- Props Drilling은 props를 오로지 하위 컴포넌트로 전달하는 용도로만 쓰이는 컴포넌트를 거치면서 React Comoinnt트리의 한 부분에서 다른 부분으로 데이터를 전달하는 과정이다.
⭐ Props Drilling을 어떻게 해결할 수 있나요?
- 렌더링 될 컴포넌트를 **불필요하게 여러 컴포넌트로** 나누지 않는다. - **defaultProps**를 필수 컴포넌트에 사용하지 않는다. - 가능한 **관련성이 높은 곳에 state**를 위치 시킨다. - **상태관리 도구**를 사용한다.
은지
- Pure Component에 대해 설명해주세요.
- component에서 shouldComponentUpdate()의 내용을 직접 작성할 바에 PureComponent를 사용하는 것이 좋다. 왜냐하면 pureComponent를 사용하면 shouldComponentUpdate를 신경쓰지 않아도 되기 때문이다.
- shouldComponentUpdate는 불필요한 render를 줄일 수 있기 때문에 react 어플리케이션성능을 향상시키는데 좋다.
React.Component는 shouldComponentUpdate를 따로 설정해주지 않은 경우,
setState
가 실행되면 state, props의 변경 여부를 신경쓰지 않고 무조건적으로 컴포넌트를 업데이트시킵니다.반면에 React.PureComponent는 shouldComponentUpdate가 구현되어 있어 state와 props가 변경되면 업데이트 됩니다.
- shouldComponentUpdate에 대해 설명해주세요.
shouldComponentUpdate는 최적화를 위한 라이프사이클 메서드입니다.
setState가 호출될 때마다 리렌더링이 일어나는 문제를 해결할 수 있습니다.
shouldComponentUpdate()
는 이전 props, state값과 현재 props, state값을 비교해 새로운 값으로 갱신된 경우, 렌더링이 발생하기 직전에 호출됩니다. 하지만
shouldComponentUpdate()
의 내용을 직접 작성하는 대신에 shouldComponentUpdate
가 구현되어 있는 PureComponent
를 사용하는 것이 좋습니다. 이 메서드는 초기 렌더링 시점 또는
forceUpdate()
가 사용될 때에는 호출되지 않습니다.컴포넌트 리랜더링 시점?
1. props가 변경되었을 때
2. state가 변경되었을 때
3. 부모 컴포넌트가 리랜더링되었을 때
랜더링 최적화
React.memo, React.callback
- State에 대해 설명해주세요.
state는 컴포넌트 내부에서 갖고 있는 컴포넌트의 상태값이며
props
처럼 컴포넌트의 렌더링에 영향을 주는 데이터 객체입니다.state
와 props
의 차이점은 무엇인가요?
state와 props 모두 랜더링에 영향을 주는 객체입니다.
props
는 (함수 매개변수처럼) 컴포넌트간 전달되는 반면 state
는 (함수 내에 선언된 변수처럼) 컴포넌트 안에서 관리됩니다.- React에서 State를 어떻게 관리하나요?
클래스 컴포넌트에서는 생성자 함수 내부에 this.state로 상태를 정의하고 this.setState로 데이터를 변경할 수 있었습니다.
반면에 함수 컴포넌트에서는 useState 훅을 이용해 state를 사용하고, useState가 반환하는 setState로 상태를 업데이트할 수 있습니다.
- Props에 대해 설명해주세요.
- ⭐ Props Drilling에 대해 설명해주세요.
- Props Drilling은 상위 컴포넌트의 state를 props를 통해 전달하고자 하는 컴포넌트로 전달하기 위해 해당 state와 상관없는 컴포넌트까지 prop를 전달하는 현상을 말합니다.
- props drilling의 문제점은 코드의 가독성이 나빠지고 유지보수가 힘들다는 점이 있습니다. props를 통해 데이터를 전달하는 과정에서 중간 컴포넌트는 그 데이터가 필요하지 않음에도 자식 컴포넌트에 전달하기 위해 props를 전달해서 Props 전달 과정에서 불필요하게 관여된 컴포넌트들이 state가 변경될 때마다 리렌더링이 발생한다는 점이 있습니다.
- ⭐ Props Drilling을 어떻게 해결할 수 있나요?
React는 단반향 데이터 바인딩으로 설계되어 있어서 데이터가 한 방향으로만 흐릅니다.이때 props를 이용해 상위 컴포넌트에서 하위 컴포넌트로 데이터를 전달합니다. 또한 props를 다룰 때 props는 읽기 전용 값이기 때문에 임의로 변경하지 않아야 한다는 특징이 있습니다.
먼저 state는 가능한 관련있는 컴포넌트와 가까이 위치시키는 방법이 있습니다. 데이터가 특정 위치에서만 필요한 경우, 최상위 컴포넌트보다 해당 데이터를 필요로 하는 컴포넌트에서 관리하는 것이 좋습니다.
그리고 상태관리 라이브러리를 사용해서 전역으로 데이터를 관리하는 방법으로도 해결할 수 있습니다.
지연
- Pure Component에 대해 설명해주세요.
- 리액트 컴포넌트와 매우 유사하지만, 생명 주기 메소드 중 shouldComponentUpdate를 다루는 방식이 다르다.
- 현재 state, props와 바뀔 state, props를 얕은 비교를 통해 비교한 뒤 변경된 것이 있을 때만 리렌더링한다.
- 리액트는 일반적으로 부모가 다시 렌더링될 때마다 구성 요소를 재렌더링하는데, 최적화로서 새 state, props가 이전과 동일하다면 구성 요소를 재렌더링하지 않도록 만든다.
- 꼬리 질문 1 : 기존의 리액트 컴포넌트는 어떻게 동작하나요?
⇒ 일반적으로 리액트 컴포넌트는 해당 컴포넌트의 업데이트(state, props, 부모 컴포넌트의 리렌더링, 강제 렌더링 트리거 등)가 일어날 때 리렌더링이 진행된다.
- shouldComponentUpdate에 대해 설명해주세요.
- props 또는 state가 새로운 값으로 갱신되어서 렌더링이 발생하기 직전에 호출된다. 이 메서드를 이용해서 전 후 props, state, context 값을 비교해 불필요한 렌더링을 막을 수 있다.
- 꼬리 질문 1 : pure component에서 shouldComponentUpdate는 어떻게 동작하나요?
⇒ pure component에는 shouldComponentUpdate가 구현이 되어 있는데, 기본적으로 리턴 값은 true이다. 이전 props, state, context 값을 얕은 비교를 통해 비교한 뒤 변경이 있을 때만 렌더링할 수 있도록 한다.
- State에 대해 설명해주세요.
- 컴포넌트 내부에서 변경 가능한 데이터를 관리할 때 사용
- 값을 저장하거나 변경할 수 있는 객체로 보통 이벤트와 함께 사용한다.
- 꼬리 질문 1 : props와 state의 차이에 대해 설명해주세요.
- 꼬리 질문 2 : prop와 state를 따로 사용하는 이유는?
⇒ 둘 다 컴포넌트의 렌더링 결과물에 영향을 주는 데이터를 가지는 객체다. props의 경우에는 함수의 매개변수처럼 해당 컴포넌트에 전달이 되며 컴포넌트 내부에서 값을 변경할 수 없다. 반면에 state는 함수 내에 선언된 변수처럼 해당 컴포넌트 안에서 관리되며, 값을 저장하거나 변경할 수 있어 동적인 데이터를 다룰 때 사용된다.
⇒ 사용하는 쪽과 구현하는 쪽을 철저하게 분리해서 양쪽의 편의성을 각자 도모하기 위해서 입니다.
- React에서 State를 어떻게 관리하나요?
- 리액트는 MVC 아키텍쳐와 같은 양뱡향 데이터 흐름에 의한 복잡도를 해결하기 위해 단방향 데이터 흐름을 가지며, 상위 컴포넌트에서 state를 선언하고 하위 컴포넌트로 props를 내려주며 관리한다.
- 꼬리 질문 1 : 리액트와 기존의 상태관리의 차이는?
- 꼬리 질문 2 : 좋은 리액트 상태 관리는 무엇일까요?
⇒ 기존의 UI 상태 관리는 MVC 아키텍쳐를 사용해, 양뱡향 데이터 흐름을 가지고 있기 때문에 모델 상태가 바뀌면 뷰가 바뀌고, 뷰가 바뀌면 다시 모델의 상태가 바뀌며 컨트롤러가 이를 조작했다. 현재 UI 인터렉션 양이 증가하면서 MVC 아키텍쳐의 경우 복잡도가 증가해 관리가 어려워졌다.
⇒ state는 관련 컴포넌트들과 최대한 가까이 배치해, 관련 없는 컴포넌트의 리렌더링을 막아야 한다. 또한, 관심사에 따라 잘 분리 해서 결합도를 낮추고, 코드의 재사용성을 높여야 한다.
- Props에 대해 설명해주세요.
- 상위 컴포넌트가 하위 컴포넌트에 값을 전달할 때 사용하며, 이때 props는 하위 컴포넌트에서 수정이 불가능하다는 특징을 가지고 있다.
- ⭐ Props Drilling에 대해 설명해주세요.
- props를 오직 하위 컴포넌트로 전달하는 용도로만 쓰이는 컴포넌트를 거치며 컴포넌트에서 다른 컴포넌트로 데이터를 전달하는 과정
- 어플리케이션의 규모가 커질 수록 상위 컴포넌트에서 타겟 컴포넌트까지의 전달 과정이 많아진다면 추적 및 관리가 힘들어진다.
- ⭐ Props Drilling을 어떻게 해결할 수 있나요?
- 불필요하게 여러 컴포넌트로 나누지 않는다.
- redux, recoil, Mobx와 같은 전역 상태관리 라이브러리를 사용해, 해당 값이 필요한 컴포넌트에서 직접 불러서 사용한다.
- 데이터를 자식에서 부모로도 전달할 수 있나요?
- Props와 State의 차이에 대해 설명해주세요.
- 왜 state를 직접 바꾸지 않고 setState (useState)를 사용해야 하나요?
- React 에서 상태 변화가 생겼을 때, 변화를 어떻게 알아채는지에 대해 설명해주세요.
- React에서 State의 불변성은 어떻게 유지할 수 있나요?
동우
데이터를 자식에서 부모로도 전달할 수 있나요?
=> props로 useState의 setter를 전달하는 방법
- 그러나 이 방법에서 useEffect를 잘못 사용하면 무한루프에 빠져 불필요한 렌더링이 될 수 있다.
- 그리고, setter를 바로 넘기기 보다는 함수로 한번 감싸서 넘기자
- 그걸 직접 넘겨 버리면 어디서 어떻게 사용될지 추적하기가 어렵기 때문이다.
- setState를 사용한 함수에서 setState를 다루는 함수를 만들어 놓고, 해당 함수를 보내면 그 함수가 어디서 쓰이는지 알면 추적이 되고, 어떻게 동작하는지는 해당 함수를 보면 되서 위험성이 줄어든다!
Props와 State의 차이에 대해 설명해주세요.
- 일단 props 한 컴포넌트에서 다른 컴포넌트로 데이터를 인수형태로 보내는것, state는 컴포넌트 내에서 데이터나 상태를 관리하는데 쓰이는 업데이트 가능한 요소들을 말한다. props는 readonly라서 불변이고, state는 변경 가능한 값이며 비동기적으로 쓰일수도 있습니다,
왜 state를 직접 바꾸지 않고 setState (useState)를 사용해야 하나요?
- state는 불변성을 유지해야한다. 그러므로, state를 바뀌면 re-redering을 해야 하는데, 함수형 컴포넌트에서는 state를 직접 바꾸기만 하면 내부적으로 render함수를 실행시켜주지 않는다. setState를 사용하면, 상태를 바꾸고, 내부적으로 리액트 엔진이 render함수를 실행시켜주어 re-rendering이 발생한다.
- 꼬리질문: 그럼 함수형 컴포넌트에서 render는 어떻게 명시적으로 표현되고 있을까요? return() 함수를 통해 미리 구현한 컴포넌트를 표시해준다.
React 에서 상태 변화가 생겼을 때, 변화를 어떻게 알아채는지에 대해 설명해주세요.
- 리액트에서는 상태의 불변성을 지켜야 하므로, 해당 상태의 값이 아닌, 참조 주소값이 변경이 되면 값이 변경되었다는 뜻이므로 해당 변화를 감지하여 동작한다.
React에서 State의 불변성은 어떻게 유지할 수 있나요?
- 리액트는 상태값을 업데이트할 때, 얕은 비교를 수행합니다. 원시값의 경우 새로운 메모리에 값을 저장해배열이나, 객체의 속성을 하나하나 비교하는 게 아닌 이전 참조값과 새로운 참조값을 비교하는 것이다. 그러므로 새로운 메모리에 참조 값을 저장하여 값의 불변성을 유지시켜 준다.
- 꼬리 질문: 리액트에서 원시 타입이 아닌 객체나 배열같은 경우에는 어떻게 불변성을 유지시키나요 ? => 배열이나 객체를 업데이트할 때, 스프레드 문법을 활용해 얕은 복사를 진행하여 새로운 참조값을 갖는 객체나 배열을 만들어 유지시킨다.
은지
- 데이터를 자식에서 부모로도 전달할 수 있나요?
부모 컴포넌트에서 자식 컴포넌트로 함수를 props로 전달하고, 자식 컴포넌트에서 prop로 전달받은 함수의 매개변수로 자식 컴포넌트의 데이터를 넣어주면, 부모에서 자식 데이터를 사용할 수 있다.
- Props와 State의 차이에 대해 설명해주세요.
state와 props 모두 랜더링에 영향을 주는 객체입니다.
props
는 (함수 매개변수처럼) 컴포넌트간 전달되는 반면 state
는 (함수 내에 선언된 변수처럼) 컴포넌트 안에서 관리됩니다.- 왜 state를 직접 바꾸지 않고 setState(useState)를 사용해야 하나요?
state는 immutable(불변성)을 유지해야하기 때문에 직접 수정하지 않아야 합니다.
컴포넌트는 현재의 this.state와 setState를 비교해서 업데이트가 필요한 경우에만 render 함수를 호출하는데, state를 직접 수정하게 되면 리액트가 render 함수를 호출하지 않아 상태 변경이 일어나도 렌더링이 일어나지 않을 수 있습니다. 상태 변경을 추적하고 변경에 따라 구성요소를 다시 렌더링하려면 setState를 사용해야 합니다.
setState를 이용해 상태를 변경해도 해당 상태를 출력하면 바뀐 값이 아니라 기존의 상태값이 출력되는데 그 이유는?
setState는 비동기적으로 동작하기 때문이다. 또한 setState는 값을 바로 바꿔주는 것이 아니라 상태를 업데이트하도록 계획하는 것이기 때문이다.
- React 에서 상태 변화가 생겼을 때, 변화를 어떻게 알아채는지에 대해 설명해주세요.
이전 state와 현재 state의 얕은 복사를 통해 참조 주소 값을 비교해 변화를 알아챕니다.
- React에서 State의 불변성은 어떻게 유지할 수 있나요?
State의 불변성은 직접 상태를 변경하지 않고 useState 훅을 사용해 상태를 변경하도록 해야 합니다. 또한 setState로 상태를 업데이트할 때 원본 상태 데이터를 변경하는 메서드(splice, sort)를 사용하지 않아야 합니다.
지연
- 데이터를 자식에서 부모로도 전달할 수 있나요?
- 단방향 데이터 흐름을 가지는 리액트의 특성 상, 하위 컴포넌트에서 상위 컴포넌트로 데이터를 전달하는 것은 조금 까다롭다.
- 상위 컴포넌트에서 전달 받은 props의 setter를 통해 전달할 데이터를 저장하면 하위 컴포넌트에서 상위 컴포넌트로 데이터를 전달할 수 있다.
- Props와 State의 차이에 대해 설명해주세요.
- 둘 다 컴포넌트의 렌더링 결과물에 영향을 주는 데이터를 가지는 객체다.
- props: 상위 컴포넌트의 값을 하위 컴포넌트로 전달할 때 사용하며, 값의 변경이 불가능하다.
- state: 컴포넌트 내부에서 가변적인 데이터를 관리할 때 사용한다.
- 왜 state를 직접 바꾸지 않고 setState (useState)를 사용해야 하나요?
- state가 불변성을 유지하기 위해서다.
- state는 객체이며, 리액트 컴포넌트는 값의 변경 여부를 확인할 때 객체의 메모리 주소를 확인하게 되는데, 직접 state를 변경하는 경우, 주소의 변화를 확인할 수 없다.
- 따라서, setState를 통해 새로운 객체를 만들고, 해당 객체의 메모리 주소 변경 여부를 확인해 state의 변화를 확인한다.
- 컴포넌트는 this.state와 setState를 비교해 업데이트가 필요한 경우에만 render 함수를 호출하는데, state를 직접 변경하면 리액트가 변화를 감지하지 못해 상태 변경이 이루어져도 렌더링이 일어나지 않는다.
- React 에서 상태 변화가 생겼을 때, 변화를 어떻게 알아 채는 지에 대해 설명해주세요.
- 리액트에서 상태 변화는 값 자체의 변경으로 알 수 없으며, this.state와 현재 state의 메모리 주소의 변경 여부에 따라 확인할 수 있다.
- React에서 State의 불변성은 어떻게 유지할 수 있나요?
- state의 불변성이란 메모리 영역에서 값이 변하지 않는다는 것
- 불변성을 가지는 원시타입과 달리, 배열, 객체 같은 참조 타입의 경우에는 의도적으로 불변성을 지킬 수 있도록 새로운 주소 값을 가진 객체를 생성해 상태를 업데이트한다.
- 꼬리 질문 1 : state의 불변성을 지킴으로써 얻는 효과는?
⇒ 1. 리액트에서 state를 업데이트할 때는 얕은 비교를 수행하며 값 자체를 비교하는 것이 아닌 객체의 메모리 주소 값의 변경을 확인해 효율적으로 상태를 업데이트할 수 있다. 또한, 불변성을 지켜줌으로써 사이드 이펙트를 방지한다. 객체나 배열의 경우 값을 변경할 때 원본 데이터가 변경될 수 있기 때문에 이 원본 데이터를 참조하고 있는 다른 객체에서 예상치 못한 오류가 발생할 수 있다.
- setState는 동기적으로 동작하나요? 아니면 비동기적으로 동작하나요?
- 왜 비동기적으로 동작하나요?
- HTML과 React의 이벤트 처리 차이점에 대해 설명해주세요. ⇒ 좋지 않은 질문
- ⭐ Key Props를 사용하는 이유에 대해 설명해주세요.
- Ref의 용도에 대해 설명해주세요.
- 제어 컴포넌트와 비제어 컴포넌트의 차이에 대해 설명해주세요.
동우
setState는 동기적으로 동작하나요? 아니면 비동기적으로 동작하나요?
- 비동기적으로 작동합니다.
왜 비동기적으로 동작하나요?
- 리액트에서는 state는 값이 변경되면 리렌더링이 발생하는데요.
- 변경이 하나라면 리렌더링이 한번만 발생하지만 수십 개, 수백 개의 값이 계속 변경된다면 리액트는 매번 렌더링만 하다가 생을 마감하고 말 것입니다. 속도는 말할 것도 없구요.
HTML과 React의 이벤트 처리 차이점에 대해 설명해주세요.
- 합성 이벤트를 염두에 두고한 게 아닐까 리액트의 이벤트는 순수 html 이벤트가 아니에요 SyntheticEvent이라는 걸로 브라우저 이벤트가 래핑되어 있거든요 그래서 리액트 이벤트에 nativeEvent 속성에 따로 html 이벤트가 들어간다.
⭐ Key Props를 사용하는 이유에 대해 설명해주세요.
- 리액트에서 요소의 변경 여부를 확인할 때, 비교 알고리즘을 쓰는데, 리스트의 경우 key Prop을 사용하지 않으면 어떤 아이템이 바뀌었는지 정확히 확인할 수 없기 때문에, 전체 리스트를 전부 리렌더링 할 수도 있다. 그러므로 고유한 문자열인 key prop을 넣어주어 해당 list의 요소들을 비교할 때 바뀐 부분만 리렌더링 할 수 있다.
Ref의 용도에 대해 설명해주세요.
- 일반적으로 자식을 수정하려면 새로운 props를 전달하여, 자식 컴포넌트를 리렌더링 시키지만, 예외적으로 벗어나 직접적으로 자식을 수정해야 하는 경우에 사용한다.
- 수정할 자식은 React 컴포넌트의 인스턴스 일수도 있고, DOM의 엘리먼트일수도 있는데,React는 두가지를 위한 해결책을 모두 제공한다.
- ref는 일반 객체 인데,createRef로 생성한 ref 객체를 React Element에 props로 전달하면, 함수가 반환한 current 객체의 current 프로퍼티로 해당 React Element 의 DOM 요소에 직접적으로 접근이 가능하다.
- 사용되는 곳의 예제
- 포커스, 텍스트 선택영역, 혹은 미디어의 재생을 관리할 때.
- 애니메이션을 직접적으로 실행시킬 때.
- 서드 파티 DOM 라이브러리를 React와 같이 사용할 때. => 비제어 컴포넌트를 제어할 때 (리액트의 재조정과 같은 것들을 활용하지 않는 요소들 )
- 추가질문
- current 를 사용하는 이유는? 우리가 ref의 접근할 수 있는 시점은 React node가 DOM에 다 그려지고 난 이후인데, 그 이전엔 null 이 담긴다. React에서 ref.current 프로퍼티에 값을 할당하는 시점은 mount 된 이후입니다. 이렇게 값이 유동적이기 때문에, React에서 관리해주는 ref.current 프로퍼티를 사용하여 DOM요소를 받아야 합니다.
- 그냥 DOM API를 사용하면 안되나? => ref로 특정 DOM요소를 받는게 더 신뢰할만하다. DOM API도 쓸 수 있지만, 대개 라이프 사이클의 흐름을 예측하지 못하여 DOM 요소를 가져오지 못할 수도 있다. 그러므로 ref를 쓰자.
- 함수형 컴포넌트에서 ref는 어떻게 전달 받아서 사용할 수 있는지 ? useRef로 받아서 사용한다.
- createRef를 사용하지 않는 이유는 ? 함수형 컴포넌트는 state가 바뀌면 re-rendering을 진행하는데, createRef는 상태가 바뀔 때마다 계속해서 호출되기에 ref가 가리키는 DOM 요소가 re-render 되는 것과 상관없이 새로운 ref 객체가 계속 만들어지게 됩니다.
- createRef를 사용하면 컴포넌트의 변경점이 없을 때, 새로운 ref 객체가 만들어질 필요가 없는데, 계속 만들어지게 되니 useRef를 사용해서, 함수와 관계없이 state를 유지시킨다.
- 상위 컴포넌트에서 ref값을 받아서 하위 컴포넌트로 전달해주려면 어떻게 해야 할까요 ?
=> 상위 컴포넌트에서 forwarRef ref값을 넘겨서 하위에서 받아 쓴다.
=>
return React.forwardRef(() => ..)
제어 컴포넌트와 비제어 컴포넌트의 차이에 대해 설명해주세요
- 제어 컴포넌트: 사용자의 입력을 기반으로 자신의 state를 관리하고 업데이트 한다. React에서는 변경할 수 있는 state가 일반적으로 컴포넌트의 state 속성에 유지되며 setState()에 의해 업데이트된다.
- 비제어 컴포넌트: 직접 요소 내부의 값을 가져와서 사용하고 업데이트 한다. 사용자가 직접 트리거 하기 전까지는 리렌더링을 발생시키지도 않고 값을 동기화 시키지도 않는다.
- 추가 질문
- 왜 리렌더링을 발생시키지 않는가?
- useRef() 는 heap영역에 저장되는 일반적인 자바스크립트 객체이다.
- 매번 렌더링할 때 동일한 객체를 제공한다. heap에 저장되어 있기 때문에 어플리케이션이 종료되거나 가비지 컬렉팅될 때 까지, 참조할때마다 같은 메모리 값을 가진다고 할 수 있다.
- 값이 변경되어도 리렌더링이 되지 않는다. 같은 메모리 주소를 갖고있기 때문에 자바스크립트의 === 연산이 항상 true 를 반환한다. 즉 변경사항을 감지할 수 없어서 리렌더링을 하지 않는다는 뜻이다.
은지
- setState는 동기적으로 동작하나요? 아니면 비동기적으로 동작하나요?
- 왜 비동기적으로 동작하나요?
props
와state
사이의 일관성을 해칠 수 있으며 이것은 디버깅하기 매우 힘든 이슈를 일으킬 수 있기 때문입니다.- 현재 작업 중인 새로운 기능들을 구현하기 힘들게 만들 수 있기 때문입니다.
setState
는 이벤트 핸들러 내에서 비동기적입니다.이로 인해
부모
와 자식
이 모두 click 이벤트에서 setState
를 호출한다면 자식
은 두 번 렌더링되지 않습니다. 대신 React는 브라우저 이벤트가 끝날 시점에 state를 일괄적으로 업데이트합니다. 불필요한 렌더링을 줄이고 더 큰 규모의 앱에서 뚜렷한 성능 향상을 만들어냅니다.왜 React 즉시 state를 업데이트하지 않을까요?
https://github.com/facebook/react/issues/11527#issuecomment-360199710
- HTML과 React의 이벤트 처리 차이점에 대해 설명해주세요.
- html 이벤트 이름은 소문자, 반면에 react 이벤트 이름은 camelCase를 사용한다.
- html은 이벤트가 false를 반환할 수 있지만 React는 명시적으로 preventDefault를 사용한다.
- ⭐ Key Props를 사용하는 이유에 대해 설명해주세요.
- “key”는 엘리먼트 리스트를 만들 때 포함해야 하는 특수한 문자열 어트리뷰트입니다. Key는 React가 어떤 항목을 변경, 추가 또는 삭제할지 식별하는 것을 돕습니다. key는 엘리먼트에 안정적인 고유성을 부여하기 위해 배열 내부의 엘리먼트에 지정해야 합니다.
- React는 key를 통해 기존 트리와 이후 트리의 자식들이 일치하는지 확인합니다. 예를 들어, 위 비효율적인 예시에
key
를 추가하여 트리의 변환 작업이 효율적으로 수행되도록 수정할 수 있습니다.
인덱스를 key로 이용할 수 있나요?
리스트가 재배열되지 않는다면 가정하에 사용은 할 수 있습니다. 하지만 재배열되는 경우 비효율적으로 동작합니다. 그 이유는 컴포넌트 인스턴스는 key를 기반으로 갱신되고 재사용됩니다. 만약 인덱스를 key로 사용하면, 항목의 순서가 바뀌었을 때 key 또한 바뀌기 때문에 컴포넌트의 state가 의도하지 않은 방식으로 바뀔 수도 있기 때문입니다.
https://ko.reactjs.org/docs/reconciliation.html#recursing-on-children
적절한 key의 값은 무엇이 있을까요?
리스트의 각 항목을 고유하게 식별할 수 있는 문자열을 사용하는 것이 좋습니다. 대부분의 경우 데이터의 ID를 key로 사용합니다.
- Ref의 용도에 대해 설명해주세요.
- https://tecoble.techcourse.co.kr/post/2021-05-15-react-ref/
- React에서 state로만 해결할 수 없을 때, Ref 객체를 이용하면 DOM에 직접적으로 접근이 가능합니다.
- ref를 이용해 비제어 컴포넌트를 제어할 수 있습니다.
- 예를 들어 DOM 요소에 focus 기능을 넣거나, 텍스트 선택 영역이나 미디어 재생을 관리할 때 쓰입니다.
ref를 어떻게 생성하나요?
useRef 훅을 사용해 생성 가능
forwardRef를 설명해주세요.
forwardRef는 부모 컴포넌트에서 자식 컴포넌트의 ref를 다루고 싶을 때 사용합니다. props로 ref 값을 전달할 수 없기 때문에 forwardRef를 사용해 자식의 ref 값을 부모로 올릴 수 있습니다.
- 제어 컴포넌트와 비제어 컴포넌트의 차이에 대해 설명해주세요.
- 제어 컴포넌트는 React 시스템 안에서 제어가 가능한 컴포넌트를 말하며,
- 비제어 컴포넌트는 React 시스템 안에서 제어하지 않고, 순수 JS를 이용해 제어하는 컴포넌트를 말합니다. React 시스템을 이용하지 않는다는 이야기는 React가 제공하는 재조정과 같은 feature들을 이용하지 않음을 의미합니다. 비제어 컴포넌트를 순수 JS로 제어하기 위해서, 브라우저상의 DOM 노드를 담는 역할을 ref가 하는 것입니다.
지연
- setState는 동기적으로 동작하나요? 아니면 비동기적으로 동작하나요?
- 비동기적으로 동작한다.
- 왜 비동기적으로 동작하나요?
- 일정 시간 동안 변화하는 상태를 모아 한 번에 렌더링하기 위해서다.
- 즉, 웹 페이지의 불필요한 렌더링 횟수를 줄여 좀 더 빠르게 동작하도록 하기 위해 16ms 단위로 일괄 업데이트를 진행한다.
- HTML과 React의 이벤트 처리 차이점에 대해 설명해주세요. (좋은 질문은 아님)
- html은 소문자로 이벤트 이름을 작성하며, 이벤트에 실행 문 즉, 문자열을 전달하지만, react는 카멜 케이스로 이벤트 이름을 작성하며, 함수 자체를 전달한다.
- html 에서 이벤트를 처리할 때는 false를 리턴함으로써 기본 동작을 방지할 수 있지만, react 에서는 false 리턴으로 기본 동작을 방지할 수 없으며, preventDefault를 명시적으로 호출해야 한다.
- ⭐ Key Props를 사용하는 이유에 대해 설명해주세요.
- key는 리액트가 어떤 항목을 변경, 추가 또는 삭제할 지 식별할 수 있도록 도움을 준다.
- 엘리먼트에 안정적인 고유성을 부여하기 위해 배열 내부의 엘리먼트에 지정한다.
- 꼬리 질문 1 : key를 지정할 때, 가장 좋은 방법이 무엇인가요?
- 꼬리 질문 2 : 인덱스를 key로 사용하는 것을 권장하지 않는 이유는?
⇒ 리스트의 다른 항목들 사이에서 해당 항목을 고유하게 식별할 수 있는 문자열을 사용하는 것
⇒ 배열의 요소가 추가, 삭제, 변경 될 때 순서가 바뀔 가능성이 있다면, 인덱스 값 또한 변경되기 때문에 의도와 다른 결과를 제공할 가능성이 존재한다. 또한, 성능이 저하되거나 컴포넌트의 state 관련 문제가 발생할 수 있다.
- Ref의 용도에 대해 설명해주세요.
- render 메서드에서 생성된 DOM 노드나 React 엘리먼트에 접근하는 방법을 제공한다.
- state만으로 해결할 수 없고, DOM을 반드시 건드려야 할 때 사용한다.
- 꼬리 질문 1 : Ref 의 사용 방법에 대해 설명해주세요.
- 꼬리 질문 2 : ref를 사용한 예시에 대해 설명해주세요.
⇒ createRef 메서드를 통해 생성하고, ref 어트리뷰트를 통해 리액트 엘리먼트에 부착한다. 일반적으로 컴포넌트의 인스턴스가 생성될 때 ref를 프로퍼티로 추가하면, 컴포넌트의 인스턴스 어느 곳에서도 ref에 접근할 수 있다.
⇒ 특정 input에 focus 주기, 스크롤 박스 조작하기, canvas 요소에 그림 그리기..
- 제어 컴포넌트와 비제어 컴포넌트의 차이에 대해 설명해주세요.
- 제어 컴포넌트 : html에서 input, textarea, select와 같은 폼 엘리먼트는 일반적으로 사용자의 입력을 기반으로 state를 관리하고 업데이트 하는데, 이런 폼을 렌더링하는 리액트 컴포넌트는 폼에 발생하는 사용자 입력값을 제어한다. 즉, 리액트 컴포넌트에 의해 값이 제어되는 입력 폼 엘리먼트를 말한다.
- 비제어 컴포넌트 : DOM 자체에서 폼 데이터를 다루는 것을 말한다. 필요할 때마다 데이터를 필드에서 가져와야 한다.
- 꼬리 질문 1 : 제어 컴포넌트와 비제어 컴포넌트 중 어느 것을 사용하는 것이 좋은가요?
⇒ 제어 컴포넌트의 사용이 권장된다. 하지만, useRef를 이용해 비제어 컴포넌트를 사용하는 것이 반드시 나쁜 것은 아니며, 가볍고 간단한 폼 엘리먼트를 만드는 데에는 오히려 비제어 컴포넌트를 사용하는 것이 더 유용할 수 있다.
- HOC (Higher-Order Components)에 대해 설명해주세요.
- Context API에 대해 설명해주세요.
- React.Fragment에 대해 설명해주세요.
- Portal에 대해 설명해주세요.
- 에러 바운더리에 대해 설명해주세요.
동우
HOC (Higher-Order Components)에 대해 설명해주세요.
- 컴포넌트를 개발하는 패턴 중 하나로, 컴포넌트를 인자로 받아 새로운 컴포넌트를 반환하는 함수를 말한다. - 하나의 로직을 다양한 컴포넌트에 적용시켜야 할 때 유용하게 사용할 수 있다. - 대표적인 예로 redux에서의 connect가 있다. - 대개 클래스형 컴포넌트에서 생명주기 메서드를 고려해 재사용 가능한 로직을 만들 때 사용했는데, 함수형 컴포넌트에서는 hooks로 거의 다 대체가 되어서 잘 사용하지 않는다고 한다.
Context API에 대해 설명해주세요.
- Props가 아닌 방법으로 컴포넌트 간 데이터를 주고 받을 수 있는 방법 중 하나이다. - 컴포넌트의 depth가 깊어졌을 때, props drilling 이 진행되는 데에서 props를 추적하기 힘들어지거나, 관련된 모든 컴포넌트가 리렌더링될 수 있는 단점을 해결하기 위해 주로 사용된다.
React.Fragment에 대해 설명해주세요.
- React는 하나의 컴포넌트만을 리턴할 수 있기 떄문에, JSX의 문법에서 return 문 안에는 반드시 최상위 태그가 있어야 한다. - 이렇게 되면 쓸데 없는 div 태그가 추가되어야 할 수 있는데, 이러한 경우를 피하기 위해 Fragment가 사용된다. - Fragments는 DOM에 별도의 노드를 추가하지 않고 여러 자식을 그룹화할 때에 사용된다.
Portal에 대해 설명해주세요.
- 부모 컴포넌트의 DOM 계층 구조 바깥에 있는 DOM 노드로 자식을 렌더링하는 최고의 방법을 제공한다. - 즉, 최상위 root 노드가 아닌 다른 돔 노드에 자식을 렌더링 한다는 것이다. - 외부에 존재하는 DOM 노드가 React App DOM 계층 안에 존재하는 것처럼 연결을 해주는 포탈 기능을 제공 - DOM 트리에서의 위치에 상관없이 portal은 여전히 React 트리에 존재하기 때문에, 이벤트 버블링은 잘 됨
- 꼬리질문
- 포탈이 해결하려는 주된 문제는 무엇인가? - 메인 프로그램의 DOM tree 에 영향을 주지 않기 위함이 아닌, CSS 상속의 영향을 받지 않기 위함이라고 생각하면 편할 것 같다. CSS 구조로 인해 원하지 않던 부작용이 일어날 때, Portal을 이용해서 해결하자. React Portal
에러 바운더리에 대해 설명해주세요.
- 하위 컴포넌트 트리의 어디에서든 자바스크립트 에러를 기록하며 깨진 컴포넌트 트리 대신 폴백 UI를 보여주는 것.
은지
- HOC (Higher-Order Components)에 대해 설명해주세요.
- HOC는 고차 컴포넌트를 말하며 컴포넌트 로직을 재사용하기 위해 사용됩니다.
- 컴포넌트를 인자로 받아 새 컴포넌트를 반환하는 함수입니다.
- HOC의 원리는, 파라미터로 컴포넌트를 받아오고, 함수 내부에서 새 컴포넌트를 만든 다음에 해당 컴포넌트 안에서 파라미터로 받아온 컴포넌트를 렌더링하는 것입니다.
- 보통 with로 시작하는 이름으로 짓는다.
- Context API에 대해 설명해주세요.
- 단방향 데이터 흐름을 갖는 react는 항상 부모와 자식 간의 데이터 이동은 가능하나 병렬로 구성된 컴포넌트끼리는 prop로만으로 데이터를 보낼 수 없는 문제가 있었다.
- context api는 리액트에 내장된 기능으로 전역 상태를 관리할 수 있어 props를 사용하지 않아도 특정 데이터를 쉽게 공유할 수 있다.
context 객체를 생성하고 사용하는 방법에 대해서 설명해주세요.
1. react의 createContext로 context 객체를 만든다.
2. context 값을 사용할 컴포넌트에 context 객체의 Provider 컴포넌트로 감싼다.
3. Provider 컴포넌트는 props로 value를 필수로 작성해야 한다.
4. context 값을 사용할 컴포넌트에서 useContext 훅을 이용해 context 값을 사용할 수 있다.
context API의 단점에 대해 설명해주세요.
context로 자주 바뀌는 상태값을 관리하는 것은 적합하지 않다. 그 이유는 context 상태 값을 변경하면 provider로 감싼 하위 컴포넌트 모두가 리렌더링되는 문제가 발생하기 때문이다.
- React.Fragment에 대해 설명해주세요.
- Fragment는 DOM에 노드를 추가하지 않고 Fragment로 감싼 자식 컴포넌트를 그룹핑할 때 쓰인다.
- React.Fragment 대신 빈 태그를 이용할 수 있습니다.
- React의 컴포넌트의 경우 최상의 태그는 하나만 가져야하므로
Fragment 사용 이점
Fragment는 불필요한 DOM node의 생성을 막기 때문에 메모리를 적게 사용한다.
<>와 Fragment의 차이점
<>는 props를 사용할 수 없지만, React.Fragments는 key라는 props를 사용할 수 있습니다.
- Portal에 대해 설명해주세요.
- 주로 overlay 요소(다이얼로그, 호버카드, 툴팁)를 위해 portal을 이용한다.
- 먼저 마운트할 위치를 생성한 후, ReactDOM의 createPortal로 portal를 생성한다.
- CSS 상속에 의해 발생되는 문제를 해결하기 위해 부모과 자식의 관계를 유지하면서 독립적인 위치에서 렌더링을 하기 위해 사용된다.
- 에러 바운더리에 대해 설명해주세요.
- 하위 컴포넌트 트리의 어디에서든 자바스크립트 에러를 기록하며 깨진 컴포넌트 트리 대신 폴백 UI를 보여주는 React 컴포넌트입니다.
- 이벤트 핸들러
- 비동기적 코드 (예: setTimeout 혹은 requestAnimationFrame 콜백)
- 서버 사이드 렌더링
- 자식에서가 아닌 에러 경계 자체에서 발생하는 에러
에러 바운더리가 포착하지 못하는 에러들
지연
- HOC (Higher-Order Components)에 대해 설명해주세요.
- 컴포넌트 로직을 재사용하기 위해 사용되며 컴포넌트를 가져와 새로운 컴포넌트를 반환하는 함수
- 컴포넌트를 인자로 받거나 반환하는 함수
- 꼬리 질문 1 : HOC 는 어떻게 사용하나요?
⇒ 파라미터로 컴포넌트를 받아오고, 함수 내부에서 새 컴포넌트를 만든 다음에 해당 컴포넌트 안에서 파라미터로 받아온 컴포넌트를 렌더링한다. 그리고, 자신이 받아온 props 들은 그대로 파라미터로 받아온 컴포넌트에게 다시 주입해주고, 필요에 따라 추가 props도 넣어준다.
- Context API에 대해 설명해주세요.
- 컴포넌트 간에 전역적으로 데이터를 공유하도록 나온 개념
- 트리 단계마다 명시적으로 props를 넘겨주지 않아도 컴포넌트 트리 전체에 데이터를 제공할 수 있다.
- 꼬리 질문 1 : context의 단점은 무엇인가요?
- 꼬리 질문 2 : 여러 레벨에 거쳐 props를 전달할 때, context를 사용하지 않고 props를 넘겨주는 방법은 무엇인가요?
⇒ context를 사용하면 해당 컴포넌트는 context 없이 재사용하기 어려워진다.
⇒ 합성 모델을 사용해 컴포넌트 자체를 넘겨줄 수 있으며, 특수한 children prop을 사용해 자식 엘리먼트를 출력에 그대로 전달하는 것이 좋다.
- React.Fragment에 대해 설명해주세요.
- 리액트의 리턴문 안에서는 반드시 하나의 최상위 태그가 있어야 하는데, 의미없는 태그의 추가를 피하기 위해 fragment를 사용한다.
- DOM에 별도의 노드를 추가하지 않고 여러 자식을 그룹화할 수 있다.
- 꼬리 질문 1 : 언제 fragment를 사용하나요?
⇒ 테이블 생성할 때, 컴포넌트를 생성할 때, 의미없는 div 태그의 생성을 막기 위해 사용한다.
- Portal에 대해 설명해주세요.
- 부모 컴포넌트의 DOM 계층 구조 바깥에 있는 DOM 노드로 자식을 렌더링하는 방법
- 팝업이나 툴팁처럼 현재 UI 문맥과 다를 경우 포탈을 사용
- 에러 바운더리에 대해 설명해주세요.
- 예상치 못한 예외를 핸들링해 폴백 UI를 제공함으로써 사용자 경험을 개선할 수 있다,
- 하위 컴포넌트 트리의 어디서든 자바스크립트 에러를 기록하며 깨진 컴포넌트 트리 대신 폴백 UI를 보여주는 react 컴포넌트
- 폴백 UI를 렌더링하기 위한 getDerivedStateFromError(), 에러 정보를 기록하는 componentDidCatch() 중 하나를 정의하면 클래스 컴포넌트 자체가 에러 경계가 됨
- 꼬리 질문 1 : 에러 바운더리가 잡을 수 있는 에러의 범위는?
- 꼬리 질문 2 : 에러 바운더리가 처리되지 않는 상황에 대해 설명해주세요.
⇒ 트리 내에서 에러 바운더리 컴포넌트 하위에 존재하는 컴포넌트의 에러만을 포착할 수 있으며, 자기 자신을 포함하는 에러는 잡지 못한다.
⇒ 이벤트 핸들러, 비동기적 코드, 서버사이드 렌더링, 자식이 아닌 에러 바운더리 자체에서 발생한 예외
- 메모이제이션에 대해 설명해주세요.
- ⭐ 리액트에서 메모이제이션을 어떤 방식으로 활용할 수 있나요?
- ⭐ useMemo와 useCallback에 대해 설명해주세요.
- React.memo와 useMemo의 차이에 대해 설명해주세요.
- 리액트 관련 패키지 중에 제일 좋다고 생각한 것은 무엇인가요?
- 리액트의 렌더링 성능 향상을 위해 어떻게 해야 하나요?
- CSS in JS를 사용해 본 적이 있나요? 있다면 소감을 말해주세요.
동우
메모이제이션에 대해 설명해주세요.
- 컴퓨터 프로그램이 동일한 계산을 반복해야 할 때, 이전에 계산한 값을 메모리에 저장함으로써 계산 결과 값이 같다면, 해당 값을 재사용하며 반복 수행을 제거하여, 프로그램 실행 속도를 빠르게 하는 기술이다.
- 리액트의 메모이제이션의 특징
- The useMemo Hook lets you cache calculations between multiple renders by "remembering" the previous computation:
- 바로 직전에 계산된 값만 메모이제이션 한다.
- 주의할 점
- 리렌더링이 자주 발생하지 않는다면 사용하지 않아도 된다. (메모리에 남아있을 필요가 없기 때문)
- 메모이제이션을 사용하는 이유?
- 비싼 연산을 반복하는 것을 피하여 성능을 빠르게 하기 위해
- 안정된 값을 제공 받아 쓰기 위해
⭐ 리액트에서 메모이제이션을 어떤 방식으로 활용할 수 있나요?
- 리액트에서는 어떤 값을 메모이제이션 할 것인가에 따라 React.memo, useMemo, useCallback 를 사용할 수 있다.
- 객체를 넘길때에는 useMemo로 한번 더 감싸서 해당 값을 넘기면 새로운 객체가 아니기 때문에, 비교가 제대로 안된다.
- ⭐ useMemo와 useCallback에 대해 설명해주세요.
- useMemo는 함수의 반환값을 메모이제이션 하는 것 , useCallback은 콜백 함수 자체를 메모이제이션을 하는 것
- React.memo와 useMemo의 차이에 대해 설명해주세요.
- React.memo 컴포넌트의 Props를 메모이제이션 하는 것,
- 꼬리 질문 1) 일반적으로 일부 상태 업데이트가 느릴 때 우리는 어떻게 성능을 최적화 할 수 있을 까요?
- production build 중인지를 확인한다. (develop 서버는 극단적인 경우에는 의도적으로 수십배까지 느리게 작동하기 때문)
- state를 tree에서 불필요하게 높은곳에 두지 않았는가를 확인한다.
- React DevTools Profiler를 실행하여 리렌더링되는 부분을 확인하고 가장 비싼 하위 트리를
memo()
로 감쌉니다.
- 꼬리 질문 2) 또다른 방법으로는 무엇이 있을까요? (memo 전에 실행해볼 방법)
- 상태가 관련있는 것들만(변경되는 것들을) 컴포넌트로 나누는 방법 ()
- 관련있는 상태를 부모 컴포넌트가 사용하고 있는 경우
- before you memo
- useMemo & useCallback
리액트 관련 패키지 중에 제일 좋다고 생각한 것은 무엇인가요?
- react-router
리액트의 렌더링 성능 향상을 위해 어떻게 해야 하나요?
- 렌더링 성능을 향상 하려면, 불필요한 렌더링을 줄여야 합니다.
- 리렌더링이 되는 경우는 부모에게서 받는 Props가 바뀌거나, 부모 컴포넌트가 리렌더링 되거나, 자기 자신의 state가 바뀌는 경우가 있다. 그러므로 이런 케이스들을 최적화 해주어야 렌더링 성능이 향상된다.
- React.memo, useMemo, useCallback 메모이제이션 방식으로 최적화 할 수도 있고,
- key값으로 인덱스를 사용하지 않거나 하는 방식이 있다.
CSS in JS를 사용해 본 적이 있나요? 있다면 소감을 말해주세요.
- 써보았다. 상당히 편했습니다. 컴포넌트마다 스타일을 적용시켜서 제가 느끼기엔 좀 더 직관적으로 보이고 고칠 수 있어서 좋았다. 하지만 재사용성인 측면에서는 좀 더 신경써야되어서 불편한 점도 있었다.
- 꼬리질문 1. 대표적으로 styled-component가 있는데, 요즘은 emotions가 많이 쓰인다. 그 이유는 무엇일까?
- styled-componets - 번들 용량이 가장 크다 ⇒ 컨텐츠 제공에 큰 영향을 끼쳐 중요한 문제다!
- EmotionJS
- 번들 용량이 다른 라이브러리에 비해 압도적으로 작다.
- styled-components의 기능을 거의 동일하게 사용, 라이브리러 설치를 통한 손쉬운 기능 확장
- EmotionJS 승! (왜 이거 쓰는지 알겠다 ㅇ.ㅇ)
은지
- 메모이제이션에 대해 설명해주세요.
동일한 계산을 반복할 때 이전 값을 메모리에 저장해 불필요한 중복 연산을 막아 최적화하는 기법을 말합니다.
- ⭐ 리액트에서 메모이제이션을 어떤 방식으로 활용할 수 있나요?
- ⭐ useMemo와 useCallback에 대해 설명해주세요.
- React.memo와 useMemo의 차이에 대해 설명해주세요.
React는 메모이제이션을 위해 memo, useMemo, useCallback api를 제공합니다.
useMemo의 경우 컴포넌트 내부의 함수가 반환하는 값을 메모이징하는 훅이며, useCallbak은 컴포넌트 내부의 함수 자체를 메모이징하여 렌더링될 때마다 함수의 재생성을 막을 수 있습니다.
useMemo와 useCallback을 사용하지 말아야 할 경우에 대해 설명해주세요.
1. leaf 컴포넌트(html 태그만 렌더링하는 컴포넌트)에는 사용하지 않아야 한다.
2. 의존성 배열에 매번 새롭게 생성되는 객체를 작성한 경우
https://yceffort.kr/2022/04/best-practice-useCallback-useMemo
React.memo는 고차 컴포넌트로(higher-order component), React.memo로 특정 컴포넌트를 감싸 렌더링의 비용을 최적화할 수 있습니다.
React.memo로 래핑된 컴포넌트는 렌더링의 결과를 메모이징하고 이전 props와 현재 props를 비교해 props가 변경되지 않았다면 React는 메모이징된 렌더링 값을 사용하게 됩니다. 반면에 이전 props와 현재 props를 비교해 변경되었을 경우에는 컴포넌트를 재실행하고 재평가하도록 한다. 따라서 자식 컴포넌트의 props는 변경되지 않았지만 부모 컴포넌트가 리렌더링되어 자식 컴포넌트까지 리렌더링되는 문제를 막을 수 있다.
useMemo는 hook의 일종이며, 컴포넌트 내부의 함수를 감싸 사용할 수 있습니다. useMemo의 의존성 배열에 작성한 값이 변경될 때마다 함수가 반환하는 값을 재계산하도록 한다. 주로 컴포넌트가 렌더링될 때마다 계산하지 않아도 되는 함수에 적용해 최적화를 이룰 수 있다.
클래스형 컴포넌트에서 메모이제이션을 어떻게 구현할 수 있을까요?
기술적으로는 React.memo를 이용해 클래스 기반의 컴포넌트를 래핑할 수는 있지만 이는 적절하지 않은 방법입니다. 따라서 클래스 컴포넌트에서 메모이제이션이 필요하다면 PureComponent를 확장해 사용하거나 shouldComponentUpdate() 메서드를 구현하는 것이 좋습니다.
React.memo를 사용하는 것이 무조건 좋을까요?
아닙니다. 이전의 props과 현재 props를 비교하기 위해 이전 props 값을 저장할 공간과 비교하는 연산이 필요하므로 성능 비용의 이슈가 있기 때문입니다. 작성된 props의 수, 컴포넌트의 복잡성, 컴포넌트의 자식 컴포넌트의 수의 따라 최적화를 했어도 props의 비교 연산에 의해 효율적이지 않을 수도 있습니다. 따라서 부모 컴포넌트를 재평가할 때마다 자식 컴포넌트의 props가 변하는 경우라면 해당 자식 컴포넌트에 React.memo를 사용하지 않는 것이 좋습니다.
React.memo를 적용해도 동작하지 않는 경우가 있을까요?
1. React.memo가 동작하지 않는 경우도 있습니다. React.memo는 이전 props와 현재 props값을 비교할 때 얕은 비교를 하기 때문에 props로 객체를 넘긴 경우에 최적화가 일어나지 않을 수 있습니다.
이 때, React.memo의 두 번째 매개변수로 비교 함수를 제공하면 props의 비교를 커스터마이징할 수 있습니다.
2. 상태 라이브러리, 예를 들어 redux와 같은 상태 라이브러리는 contextAPI로 구현되어있고 컴포넌트 내부에서 useSelector를 사용할 경우 React.memo로 래핑했더라도 리렌더링이 발생할 수 있다.
- 리액트 관련 패키지 중에 제일 좋다고 생각한 것은 무엇인가요?
- 리액트의 렌더링 성능 향상을 위해 어떻게 해야 하나요? https://pks2974.medium.com/react-의-성능을-조금-이라도-올려보자-performance-optimize-f1a51b8c406c 1. 리액트는 얕은 비교를 사용하기 때문에 props와 state를 불변객체로 만들어 관리하는 것이 좋다. 그렇지 않으면 불필요한 렌더링이 발생할 수 있습니다. 2. inline function : props로 전달하는 함수를 포함한 객체는 모두 참조 값을 전달하기 때문에 이 참조 값이 변경되면 리렌더링이 발생하므로 inline function 사용을 지양해야 한다. 3. 메모이제이션
- 부모에서 전달받은
props
가 변경될때 - 부모 컴포넌트가 리렌더링 될 때
- 자신의
state
가 변경 될 때
렌더링 조건
- CSS in JS를 사용해 본 적이 있나요? 있다면 소감을 말해주세요.
styled-components와 emotion 라이브러리를 이용해 본 경험이 있습니다. css의 특성상 global한 namespace를 가져서 selector가 중복될 위험성이 존재할 수 있는데 css in js 라이브러리는 고유한 이름을 생성하므로 편리했던 경험이 있습니다.
css-module
CSS in JS의 장단점
장점 : css 모델을 문서 레벨이 아닌 컴포넌트 레벨로 추상화
단점 : 별도의 라이브러리 설치로 인한 번들 크기 이슈에 의해 느린 속도
지연
- 메모이제이션에 대해 설명해주세요.
- 컴퓨터 프로그램이 동일한 계산을 반복해야 할 때, 이전에 계산한 값을 메모리에 저장함으로써 동일한 계산의 반복 수행을 제거하여 프로그램의 실행 속도를 빠르게 하는 기술
- 결과를 캐싱하고, 다음 작업에서 캐싱한 것을 재사용하는 기술
- 꼬리질문 1 : 메모이제이션은 언제 사용해야 하나요?
⇒ 반복되는 계산이 많을 수록 효과가 높아지는 데, 재귀 함수를 진행할 때 사용
- ⭐ 리액트에서 메모이제이션을 어떤 방식으로 활용할 수 있나요?
- React.memo, React.useCallback, React.useMemo 훅을 사용해 렌더링 최적화
- 꼬리 질문 1 : memoization을 사용하면 항상 성능이 좋은가?
⇒ 그렇지 않다. memoization을 사용하면 그만큼 라인에 추가되는 코드로 인한 비용이 들기 때문에 남용하면 안된다.
- ⭐ useMemo와 useCallback에 대해 설명해주세요.
- useMemo : 메모이제이션된 값을 반환한다. 컴포넌트의 렌더링 결과를 저장해, props가 바뀌지 않았으면 리렌더링하지 않고 기존의 것을 보여준다.
- useCallback : 메모이제이션된 콜백을 반환한다. 함수를 prop으로 넘겨줄 때, 해당 함수를 다시 생성하기 때문에 리렌더링이 발생하는데, 이때 useCallback을 사용함으로써 함수가 계속 새로 만들어지는 것을 방지할 수 있다.
- 꼬리 질문 1 : useMemo, useCallback의 차이에 대해 설명해주세요.
⇒ useMemo는 작성된 dependency에 의존해, 해당 값이 변경될 때마다 함수를 실행하고 결과 값을 반환한다.
useCallback은 작성된 dependency의 변화에 따라 새로운 함수를 반환한다.
- React.memo와 useMemo의 차이에 대해 설명해주세요.
- React.memo는 HOC 이기 때문에 클래스형 컴포넌트, 함수형 컴포넌트에서 모두 사용할 수 있지만, useMemo는 hook이기 때문에 오직 함수형 컴포넌트에서 사용할 수 있다.
- 꼬리 질문 1 : React.memo와 usememo의 공통점에 대해 설명해주세요.
⇒ 둘 다 props가 변경되지 않으면 , 인자로 넘긴 함수는 실행되지 않으며 메모이즈된 결과를 반환한다.
- 리액트 관련 패키지 중에 제일 좋다고 생각한 것은 무엇인가요?
- 최근에 프로젝트를 진행하면서, 회원가입 기능을 구현
- 이 때, Formik이라는 패키지를 사용해보았는데, state의 관리나 유효성 검사, 폼의 제출 처리 등 간단하게 처리할 수 있었다.
- 리액트의 렌더링 성능 향상을 위해 어떻게 해야 하나요?
- props나 state의 변화, 부모 컴포넌트의 렌더링, forceUpdate 메서드 실행에 따라 리렌더링이 발생하는 데, 이 때 최적화가 필요하다.
- state의 선언 위치를 적절하게 조정하고, 메모이제이션을 위한 HOC나 훅을 적절하게 사용한다.
- 불필요하게 컴포넌트를 분리하는 부분도 조절해야 한다.
- CSS in JS를 사용해 본 적이 있나요? 있다면 소감을 말해주세요.
- 개발할 때 주로 emotion을 이용함.
- 컴포넌트 레벨로 작성하기 때문에 컴팩트하게 작성하고 관리할 수 있다는 점이 가장 마음에 들었지만, 테스트를 하거나 개발자 도구를 이용해 확인할 때 새로운 이름이 입혀진 객체로 확인되어 구분이 조금 힘들었던 것 같다.
- 꼬리 질문 1 : emotion과 styled component의 차이에 대해 설명해주세요.
⇒ emotion의 경우, 번들 사이즈가 확실히 적고, 서버 사이드 렌더링에 따로 서버쪽 설정을 하지 않아도 된다는 장점이 있다. 사실 두 라이브러리 모두 큰 차이점은 없기 때문에 개발 환경에 따라 유연하게 선택하면 될 것 같다.
- React 18 버전 업데이트 내용에 대해 말씀해주세요.
- Client Side Routing에 대해 설명해주세요.
- Next.js 에 대해 설명해주세요.
- React에서 Form 이벤트는 어떻게 제어하셨나요?
- React Hook Form 를 사용해보셨나요?
- 기억나는 Hook에 대해 전부 설명해주세요.
- React에서 컴포넌트 A가 사용하는 CSS파일과 컴포넌트 B가 사용하는 CSS파일의 선택자가 겹치는 이유가 뭘까요?
- ⭐ Redux에 대해 설명해주세요.
- ⭐ Redux를 사용하는 이유에 대해 설명해주세요.
- ⭐ Redux의 장단점에 대해 설명해주세요.
- Flux 패턴에 대해 설명해주세요.
- Context API와 Redux를 비교해주세요.
- Redux의 3대 원칙에 대해 설명해주세요.
- React-Query를 사용해보셨나요?
- React-Query에 대해 설명해주세요.
- React-Query의 등장 배경과 장점에 대해 설명해주세요.
- Recoil을 사용해보셨나요?
- Recoil에 대해 설명해주세요.
- Recoil에서 Loadable의 개념에 대해 설명해주세요.
- Recoil에서 비동기로 데이터를 받아올 때 State를 어떻게 관리하셨나요?
- Recoil에서 로딩, 성공, 에러와 관련된 처리를 어떻게 하셨나요?
- ⭐ Redux와 Recoil에 대해 비교 설명해주세요. (개념, 장단점)
자바스크립트
- 생성자에 대해 설명해주세요.
- ⭐ this에 대해 설명해주세요.
- call, apply, bind에 대해 설명해주세요.
- ⭐ 콜백 함수에 대해 설명해주세요.
- ⭐ 콜백 지옥을 해결하는 방법을 설명해주세요.
- ⭐ Promise에 대해 설명해주세요.
- Promise.all() 에 대해 설명해주세요.
- ⭐ Promise와 Callback를 비교 설명해주세요.
- ⭐ Async, Await이 뭔지 그리고 사용 방법을 설명해주세요.
- ⭐ Promise와 Async, Await의 차이를 설명해주세요.
- AJAX에 대해 설명해주세요.
- ⭐ var, let, const 차이를 설명해주세요.
- TDZ에 대해 설명해주세요.
- 함수 선언형과 함수 표현식의 차이에 대해 설명해주세요.
- ⭐ 이벤트 버블링과 캡처링에 대해 설명해주세요.
- ⭐ 이벤트 위임에 대해서 설명해주세요.
- 이벤트 위임의 동작 방식에 대해서 설명해주세요.
- ⭐ 호이스팅과 발생하는 이유에 대해 설명해주세요.
- ⭐스코프 (Scope)에 대해 설명해주세요.
- 스코프 체인에 대해 설명해주세요.
- ⭐ 클로져(Closure)에 대해 설명해주세요.
- ⭐ 실행 컨텍스트에 대해 설명해주세요.
- 렉시컬 환경(Lexical Environment)에 대해 설명해주세요.
- 자바스크립트에서 일어나는 데이터 형변환에 대해 설명해주세요.
- 자바스크립트가 동적 언어인 이유는 무엇인가요?
- 프로토타입에 대해 설명해주세요.
- 깊은 복사와 얕은 복사에 대해 설명해주세요.
- 불변성을 유지하려면 어떻게 해야하나요?
- ES6에서 새로 생긴 기능을 아는대로 말씀해주세요.
- Blocking과 Non-Blocking에 대해 설명해주세요.
- ⭐ 동기와 비동기에 대해 설명해주세요.
- undefined, null, undeclared를 비교해주세요.
- 콜 스택 (Call Stack)과 힙 (Heap)에 대해 설명해주세요.
- ⭐ 자바스크립트를 멀티 쓰레드처럼 사용하는 방법이 뭔가요? / 자바스크립트에서 비동기 로직이 어떻게 동작하는지 설명해주세요. (이벤트 루프)
- 태스크 큐와 마이크로 태스트 큐에는 어떤 함수가 들어가나요?
- requestAnimationFrame에 대해 설명해주세요.
- 비동기적으로 실행되는 것을 동기적으로 코딩하는 방법이 있나요?
- map과 forEach, reduce에 대해 설명해주세요.
- 자바스크립트의 메모리 관리에 대해 아는 대로 설명해주세요
- 클래스에 대해 설명해주세요.
- 즉시 실행 함수 (IIFE)에 대해 설명해주세요.
- 엄격 모드에 대해 설명해주세요.
- Rest 연산자와 Spread 연산자에 대해 설명해주세요.
- 제너레이터에 대해 설명해주세요.
- 이터러블과 이터레이터 프로토콜에 대해 설명해주세요.