개발자

React 검색 결과 새 탭 열기로 기능 추가할 수 있을까요?

2023년 10월 16일조회 295

안녕하세요. 사내 프로젝트를 진행 중인데 고객 요청 사항 중 한 가지의 구현 방법에 관해 질문드립니다. react-router v6를 사용 중이며, 검색 기능이 많은 앱입니다. 앱 특성상 검색 필터를 통해 입력할 값이 많고, 검색 결과가 나오는데 오래 걸리는 편인데요. 고객이 요청한 사항은 1. 다른 페이지를 다녀와도 기존의 결과가 유지되도록(계속 볼 수 있도록) 2. 탭 UI로 변경해달라 위의 사항을 충족하려면 기존의 UI를 갈아엎거나 기획을 해서 새로 만드는 게 나은 수준이라고 판단했습니다. 임시 방편으로 검색 결과를 브라우저의 새 탭 열기를 통해 보여주려고 하는데, 가능할까요? 로그인 정보(username, token)는 브라우저에 cookie로 저장하고 있고, 검색에 필요한 query string은 URL과 header를 통해 서버에 요청하고 있습니다. 따라서 새 탭에 params들을 모두 전달해줘야 할 것 같은데요. 적절한 방법이 도저히 떠오르지 않네요. 구글링할 수 있는 키워드라도 알려주시면 감사하겠습니다.

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.

답변 2

Samuel님의 프로필 사진

검색 결과를 상태 관리 도구로 저장했다가 표현하는 건 어려운 구조일까요?

홍지상님의 프로필 사진

홍지상

작성자

소울시스템즈 프론트엔드 개발자2023년 10월 18일

Recoil을 사용 중입니다. 앱이 좌측에 메뉴, 우측에 페이지로 구성되어 있고, 페이지마다 상단에 검색바, 하단에 차트/테이블 등으로 되어있거든요. 검색 버튼을 누르면 각각의 차트/테이블 컴포넌트에서 API를 통해 요청하는 구조인데, 구현 사항은 '새 탭으로 검색하기'를 새로 추가해서 클릭하면 브라우저 새 탭을 열어서 검색에 필요한 요청 파라미터 값과 함께 해당 페이지를 별도로 띄워야 한다는 것인데요. 작성하면서 생각해보니, 현재는 PageComponent에 전달하는 파라미터가 없어요. <PageComponent /> 이걸 <PageComponent params={params} /> 형태로 수정하고 페이지 컴포넌트를 띄우면 될까 하는 생각이 문득 들긴 한데, 아직도 잘 모르겠네요. 페이지마다 상단에 있는 SearchWidget 컴포넌트를 상위로 옮겨야 할 것 같기도 하고, 어렵네요 😢

Samuel님의 프로필 사진

Samuel

한국대학생선교회 풀스택 개발자2023년 10월 18일

검색 결과가 없을 때는 빈 컴포넌트를 그려주고 검색할 때 recoil 변수에 저장했다가 해당 변수로 계속 그려주다가 새 데이터로 검색하면 변수에 새 값을 넣어주는 식으로 작업하면 어떨까했습니다. 데이터 요청시 recoil만 set하고 그 외에는 계속 사용만 하면 데이터 흐름도 꼬일 걱정이 없을 것 같구요

홍지상님의 프로필 사진

홍지상

작성자

소울시스템즈 프론트엔드 개발자2023년 10월 19일

말씀하신 패턴처럼 하부 컴포넌트마다 새 탭의 세션 스토리지에서 값을 불러오는 로직을 추가하는 방향으로 가닥을 잡았습니다. 답변 감사합니다 👍

삭제된 사용자님의 프로필 사진

삭제된 사용자

2023년 10월 18일

안녕하세요. 질문해주신 내용과 Samuel 님의 답변에 다신 댓글을 보니 새 탭 열기로 변경하는 것도 꽤나 큰 작업으로 보이는데요. 차라리 고객 요청사항처럼 탭 UI를 적용하시는 편이 어떨지요? 임시방편이라고 하셨으니 결국 나중에는 탭 UI를 적용하실 계획으로 이해가 되는데 그렇다면 처음부터 그렇게 작업하시는 편이 나을 것 같습니다. 저도 프론트엔드에 대한 이해가 깊지는 않아 너무 쉽게 말씀드리는게 아닐까 걱정이 되기는 하지만, 결과를 보여주는 component만 https://ant.design/components/tabs 같은 것으로 감싸는 식으로 처리하시면 좀 덜 불편하시지 않을까 해서 코멘트 남겨봅니다.

홍지상님의 프로필 사진

홍지상

작성자

소울시스템즈 프론트엔드 개발자2023년 10월 18일

말씀하신대로 탭 UI로 가는 게 최선이긴 하지만, 당장 적용하기엔 너무 대공사가 될 것 같습니다 ㅎㅎ 어제 삽질을 열심히 한 결과 해법을 찾긴 했습니다! <SearchWidget /> 내부에는 수많은 서브 컴포넌트들이 함께 동작하고 있어요. <SearchWidget> <Dropdown /> <Input /> <Chips /> ... <Button label="검색" /> </SearchWidget> 대략 이런 구조인데, <Button label="새 탭으로 검색" /> 을 추가해서, onClick에다가 const newTab = window.open(window.location.href, '_blank'); if (!newTab) return; const storedSearchParams = newTab.sessionStorage.getItem(STORED_SEARCH_PARAMS_KEY); 이런 식으로 새 창의 세션 스토리지를 이용하기로 했어요. 그리고 각각의 서브 컴포넌트(Dropdown, Input 등)에서 세션 스토리지의 값을 확인하고, 존재하면 그 값을 사용하는 식으로 로직을 짜봤습니다. 맨 앞에 있는 Dropdown에만 우선 로직을 추가해봤는데 잘 동작하는 것을 확인했습니다. 이제 나머지 서브 컴포넌트들도 비슷한 로직들을 추가해줘야 하는 게 일이네요. 😭

profile picture

익명

작성자

2023년 10월 19일

그렇군요. 그래도 방법을 찾으셨다니 다행입니다!! 화이팅하세요 :D

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

목록으로
키워드로 질문 모아보기

실무, 커리어 고민이 있다면

새로운 질문 올리기

지금 가입하면 모든 질문의 답변을 볼 수 있어요!