공유된 state
자식 컴포넌트들이 가장 가까운 공통된 부모 컴포넌트의 state를 공유해서 사용하는 것이죠. shared state는
어떤 컴포넌트의 state에 있는 데이터를 여러 개의 하위 컴포넌트에서 공통적으로 사용하는 경우
를 말합니다.


위 그림도 마찬가지로 총 세 개의 컴포넌트가 있습니다.
지금까지 살펴 본 것처럼 하위 컴포넌트가 공통된 부모 컴포넌트의 state를 공유하여 사용하는 것을 shared state라고 합니다.
지금부터 사용자로부터 온도를 입력받아서 각각 섭씨온도와 화씨온도로 표현해주고 해당 온도에서 물이 끓는지 안 끓는지를 출력해 주는 컴포넌트를 만들어 보면서 state를 공유하는 방법에 대해 자세히 살펴보도록 하겠습니다.
먼저 섭씨온도 값을 props로 받아서 물이 끓는지 안 끓는지를 문자열로 출력해 주는 컴포넌트를 만들어 보도록 하겠습니다.

위 코드는 BoilingVerdict라는 이름을 가진 굉장히 간단한 컴포넌트입니다. 섭씨온도 값을 props로 받아서 100도씨 이상이면 물이 끓는다는 문자열을 출력하고 그 외에는 물이 끓지 않는다는 문자열을 출력합니다. 이제 이 컴포넌트를 실제로 사용하는 부모 컴포넌트를 만들어 보겠습니다. 
<input> 태그를 사용하여 앞에서 배운 제어 컴포넌트 형태로 구현되어 있습니다. handleChange() 함수가 호출되고,setTemperature() 함수를 통해 온도 값을 갖고 있는 temperature라는 이름의 state를 업데이트합니다.다음은 Calculator 컴포넌트 안에 온도를 입력하는 부분을 별도의 컴포넌트로 추출해 보겠습니다. 이렇게 하는 이유는 섭씨온도와 화씨온도를 각각 따로 입력받을 수 있도록 하여 재사용이 가능한 형태로 컴포넌트를 만들어 사용하는 것이 효율적이기 때문입니다.
이렇게 추출한 컴포넌트를 사용하도록 Calculator 컴포넌트를 변경하면 아래 코드와 같이 됩니다. 
그런데 여기에서 한 가지 문제가 발생합니다.
사용자가 입력하는 온도값이 TemperatureInput의 state에 저장되기 때문에 섭씨온도와 화씨온도 값을 따로 입력받으면 두 개의 값이 다를 수 있습니다. 이를 해결하기 위해 값을 동기화시켜줘야 합니다.
먼저 섭씨온도와 화씨온도 값을 동기화시키기 위해서 각각 변환하는 함수를 작성해야 합니다. 아래 함수는 화씨온도를 섭씨온도로 변환하는 함수와 섭씨온도를 화씨온도로 변환하는 함수입니다.
이렇게 만든 함수를 호출하는 함수를 작성해 보겠습니다.

다음은 하위 컴포넌트의 state를 공통된 부모 컴포넌트로 올려서 shared state를 적용해야 합니다.
State 끌어올리기
state를 상위 컴포넌트로 올린다는 것을 'State 끌어올리기'라고 표현
영단어 'Lifting'은 '들어 올리다'라는 뜻을 갖고 있는데 말 그대로 state를 위로 끌어올린다는 의미입니다. 이를 위해 먼저 TemperatureInput 컴포넌트에서 온도 값을 가져오는 부분을 아래와 같이 수정해야 합니다.
이렇게 하면 온도 값을 state에서 가져오는 것이 아닌 props를 통해서 가져오게 됩니다. 또한 컴포넌트의 state를 사용하지 않게 되기 때문에 입력값이 변경되었을 때 상위 컴포넌트로 변경된 값을 전달해 주어야 합니다. 이를 위해서 handleChange() 함수를 다음과 같이 변경합니다.
이제 사용자가 온도 값을 변경할 때마다 props에 있는 onTemperatureChange() 함수를 통해 변경된 온도 값이 상위 컴포넌트로 전달됩니다. 최종적으로 완성된 TemperatureInput 컴포넌트의 모습은 아래와 같습니다. state는 제거되었고 오로지 상위 컴포넌트에서 전달받은 값만을 사용하고 있습니다. 
마지막으로 변경된 TemperatureInput 컴포넌트에 맞춰서 Calculator 컴포넌트를 변경해 주어야 합니다. 다음 코드는 변경된 Calculator 컴포넌트의 모습입니다.

이렇게 최종적으로 완성된 구조를 그림으로 나타내면 아래와 같습니다.
이처럼 각 컴포넌트가 state에 값을 갖고 있는 것이 아니라 공통된 상위 컴포넌트로 올려서 공유하는 방법을 사용하면 리액트에서 더욱 간결하고 효율적인 개발을 할 수 있습니다.
- Shared state : 하위 컴포넌트가 공통된 부모 컴포넌트의 state를 공유하여 사용하는 것
- state 끌어올리기 : 하위 컴포넌트의 state를 공통된 부모 컴포넌트로 끌어올려서 공유하는 방식