
키워드 검색어로 '고기'를 검색하면 내 주변 5km 반경 이내에 위치한 고기 관련 식당을이 나온다. 그리고 그 위치들을 지도에 마커로 띄우고 있다.
키워드 검색을 하면 지도에 검색 결과가 마커로 띄워지는데 컴포넌트를 접었다가 펼치면 검색한 키워드와 결과들이 모두 초기화가 되는 문제가 생겼다.

코드를 보면 isSearchFolder는 접은 상태인지 펼쳐진 상태인지 확인하는 변수이다. isSearchFolder가 true라는 것은 펼쳐진 상태라는 것이므로 true이면 SearchPlace 컴포넌트를 불러와서 새로 렌더링이 된다. 이 과정에서 SearchPlace 컴포넌트 내부에 있는 데이터들이 모두 초기화가 된 상태로 불러와진다. 하지만 나는 컴포넌트를 접었다가 펼쳐도 검색된 키워드와 결과들이 그대로 남아 있는 것을 원했다. 그리고 해당 결과에 따른 지도 위에 마커들도 그대로 남아 있기를 원했다.
그래서 생각한 해결 방법은 두가지 방법이 있었다.
SearchPlace 컴포넌트 내부에 있는 데이터들을 전역 상태 관리 라이브러리를 사용해서 저장해 놓는 방식이다. 나는 Recoil을 사용해서 내부 데이터들을 저장했었다.


이렇게 하면 데이터들이 전역으로 저장되어 있기 때문에 컴포넌트를 접었다가 펼쳐도 데이터들이 초기화 되지 않고 그대로 남아있다.
그런데 접기 전에 검색했던 데이터들은 펼치고 난 후에도 그대로 남아있어서 해결한 줄 알았는데 다른 키워드를 검색하면 이전 검색 데이터가 사라지지 않고 계속 남아있는 문제가 있었다. 그리고 이 방법은 데이터를 전역으로 관리하고 컴포넌트 자체를 매번 새로 렌더링을 하는 거라 성능 측면에서 좋지 않을 것 같아서 두 번째 방법으로 문제를 해결했다.
CSS를 이용해 화면에서 숨기거나 보여주는 방법이다. 이 방법은 SearchPlace 컴포넌트를 새로 렌더링하지 않고 렌더링이 되어 있는 상태에서 컴포넌트를 펼치면 화면에 보여주고 컴포넌트를 접으면 hidden으로 숨기는 방식이다.

이렇게 isSearchFolder가 true이면 보여주고 false이면 hidden을 하는 것이다. 그러면 검색어 입력 후 지도에 마커가 띄워진 상태에서 컴포넌트를 접어도 마커가 그대로 지도에 띄워져 있다. 그리고 다시 펼쳐도 검색한 키워드와 결과들도 그대로 남아있다.
새로 렌더링 되는 것이 데이터를 매번 초기화를 하기 때문에 메모리 사용을 최적화 할 수 있다는 장점이 있지만 그만큼 성능이 저하 되고 사용자 경험이 저하되는 단점이 있다.
반면, CSS를 이용해 화면에서 숨기거나 보여주는 경우는 계속 렌더링이 되어 있는 상태이므로 메모리 사용량이 증가할 수 있다는 단점이 있지만 컴포넌트 상태는 계속 유지가 되므로 성능 측면에서는 효율적일 수 있는 장점이 있다.
그래서 나는 컴포넌트를 새로 렌더링하는 방법으로 오류가 생겨서 성능 측면에서 더 효율적인 CSS를 이용해 화면에서 숨기거나 보여주는 경우로 수정해서 오류를 해결했다.