본문으로 건너뛰기
Business Project

ATOP.DMS

기업 맞춤형 데이터 관리 시스템 SaaS

담당 역할
프론트엔드 개발
팀 구성
프론트엔드 3명 · 백엔드 2명
소속 · 의뢰
주식회사 비멕스
진행 기간
2024.05 ~ 2024.12
WebFrontend
atop-dms/main 작업 이미지 1
atop-dms/excel 작업 이미지 2
atop-dms/risk-matrix 작업 이미지 3
atop-dms/chart 작업 이미지 4
atop-dms/formula 작업 이미지 5

· 1 / 5

맡은 작업

  • 프로젝트에 중간 합류해 기능 개발과 기존 구현 개선을 맡아, 데모용 MVP의 출시 기한을 맞추는 데 기여
  • 기존 엑셀 표 데이터를 MUI DataGrid에 맞게 전환하고, 가상 스크롤 적용 및 엑셀 파일의 여러 시트 읽기·선택 전환
  • 데이터 정제와 Apache ECharts를 활용한 차트 시각화 기능 개발
  • 사용자 정의 Formula의 수식 입력 UI, 변수 추가와 입력 오류 처리 기능 개발
  • useState 기반의 폼 모달을 React Hook Form으로 리팩터링하여 폼 상태와 입력 처리를 정리

사용 기술

언어·프레임워크

Next.jsTypeScript

상태·데이터

RecoilReact QueryReact Hook Form

화면·인터랙션

Material UIApache EChartsMUI DataGridReact Spreadsheetreact-mentions

수식 입력과 표 구현

변수 박스와 텍스트 커서의 위치 맞추기

문제

수식 입력창에는 일반 텍스트와 함께 변수명·유형·설정 버튼을 가진 박스가 들어가야 했습니다. 텍스트를 편집하는 위치와 박스를 그리는 위치가 달라지면 커서가 화면에서 보이는 변수와 어긋날 수 있었습니다.

입력 문자열과 변수 박스를 겹치는 구조

변수를 클릭하거나 선택한 뒤 삭제하면 변수 전체가 지워져요.

구현

실제 입력은 textarea가 맡고, 변수 박스와 수식 색상은 별도 표시 레이어에서 그렸습니다. 입력 텍스트는 투명하게 두고 커서는 유지했으며, 두 레이어의 글자 크기·행간·패딩을 맞춰 같은 위치에 겹치도록 했습니다.

{_…_} 표시 문자열은 변수 박스가 차지할 공간을 확보하고 커서가 이동할 변수의 시작·끝 경계를 구분하는 데 사용했습니다. 표시 레이어에는 변수 박스를 겹쳐 그리고, 커서는 변수 내부에 머물지 않도록 경계로 이동시켰습니다.

변수 박스가 줄 경계에서 입력 텍스트와 어긋나지 않도록, _가 포함된 표시 문자열과 word-break: keep-all을 함께 사용해 줄바꿈을 조정했습니다.

표시 문자열의 시작·끝 위치와 textarea의 selectionStart·selectionEnd를 비교해 방향키 이동을 처리했습니다. 커서가 변수 내부에 있을 때는 setSelectionRange로 시작 또는 끝 경계로 옮기고, 변수 내부를 클릭했을 때도 끝 경계로 정렬했습니다.

Backspace로는 변수 하나가 함께 삭제되도록 입력 동작을 맞췄습니다. 변수 추가와 수식 오류 처리도 함께 구현했습니다.

표 데이터 변환과 셀 범위의 양방향 연동

문제

React Spreadsheet와 MUI DataGrid에 전달하는 데이터 형식이 달랐습니다. 엑셀에서 읽은 값을 각 표가 사용할 수 있도록 정제하고, 셀 범위 선택도 화면과 입력창에 연결해야 했습니다.

셀 주소 입력과 표 선택의 양방향 연동

A1–F8에서 드래그하거나 시작·끝 셀을 차례로 선택해 보세요.

ABCDEF
1
2
3
4
5
6
7
8

선택한 범위: A2 : D5

구현

셀 주소를 입력하는 방식과 표에서 직접 선택하는 방식을 함께 지원했습니다. A4·D22 같은 주소와 표의 선택 범위 데이터를 서로 변환해 어느 쪽에서 수정해도 같은 범위를 가리키도록 했습니다.

React Spreadsheet와 MUI DataGrid가 요구하는 데이터 형식이 달라 엑셀에서 읽은 값을 DataGrid에 맞게 변환했습니다. 표 렌더링 지연을 줄이기 위해 가상 스크롤을 지원하는 DataGrid로 교체했습니다. 한 시트만 읽던 업로드 처리를 여러 시트를 읽도록 바꾸고, 선택한 시트의 데이터로 표를 전환할 수 있게 했습니다. 데이터를 정제하고 Apache ECharts로 차트를 시각화했습니다.