이번 글에서는 React를 사용하여 게시판 테이블에 정렬 기능을 구현하는 방법을 남겨보도록 하겠습니다. 특히, 이번 글에서는 클라이언트 측 정렬에 초점을 맞추어 작업을 진행합니다.
📌 목표
- React에서 테이블 데이터를 특정 열 기준으로 오름차순/내림차순 정렬
- 빈 값(
null
,undefined
, 빈 문자열)을 안전하게 처리 - 모든 컬럼(열)에 동적으로 정렬 기능 추가
📂 프로젝트 구조
이번 예제에서는 아래와 같은 간단한 구조로 작업합니다:
- React 컴포넌트: 게시판 데이터를 렌더링하고 정렬 로직을 처리
- 데이터: 간단한 JSON 배열로 가상의 게시판 데이터를 사용
🛠️ 구현 단계
1️⃣ 초기 데이터 준비하기
먼저, 가상의 게시판 데이터를 준비합니다. 이 데이터는 JSON 형식으로 만들어졌으며, 각 항목은 번호(rowNum)
, 이메일(usersEmail)
, 접속기기(usersLoginDevice)
, 접속경로(usersLoginCours)
, 접속날짜(regDt)
를 포함합니다.
저는 작업이 서버(was)단에서 연결되어 데이터를 가지고 오고있어서 클라이언트 화면만 정렬을 넣었더니.. 다시 서버단도 해야하는 그런 불상사가 있었습니다.
// 예제 데이터
const initialData = [
{ rowNum: 1, usersEmail: "user1@example.com", usersLoginDevice: "PC", usersLoginCours: "Home", regDt: "2024-11-20" },
{ rowNum: 2, usersEmail: "user2@example.com", usersLoginDevice: "Mobile", usersLoginCours: null, regDt: "2024-11-21" },
{ rowNum: 3, usersEmail: "user3@example.com", usersLoginDevice: "", usersLoginCours: "Dashboard", regDt: "2024-11-19" },
];
[Tip]: 실제 프로젝트에서는 이 데이터를 서버에서 받아오지만, 이번 예제에서는 간단히 JSON 배열로처리 했습니다.
2️⃣ 상태 관리하기 (useState)
React의 useState
를 사용하여 데이터를 관리합니다. 초기 데이터는 위에서 만든 JSON 배열을 사용하며, 정렬 상태를 관리하기 위해 별도의 상태(sortConfig
)를 추가합니다.
import React, { useState } from 'react';
const UsersAccessHistory = () => {
// 데이터 상태
const [usersAccessHsitoryList, setUsersAccessHistoryList] = useState(initialData);
// 정렬 상태
const [sortConfig, setSortConfig] = useState({ key: '', direction: 'asc' });
};
usersAccessHsitoryList
: 현재 화면에 표시될 테이블 데이터를 관리합니다.sortConfig
: 현재 정렬 중인 열(key
)과 방향(direction
)을 저장합니다.- "asc": 오름차순 / "desc": 내림차순.
---
3️⃣ 정렬 함수 작성하기
`sortData` 함수: 사용자가 특정 열의 헤더를 클릭했을 때 호출되어 데이터를 정렬합니다.
const sortData = (key) => {
let direction = 'asc';
// 동일한 열을 다시 클릭하면 방향 변경
if (sortConfig.key === key && sortConfig.direction === 'asc') {
direction = 'desc';
}
// 정렬 상태 업데이트
setSortConfig({ key, direction });
// 데이터 복사 후 정렬
const sortedData = [...usersAccessHsitoryList].sort((a, b) => {
const valA = a[key] ?? ''; // null 또는 undefined 처리
const valB = b[key] ?? '';
// null 또는 undefined는 항상 뒤로 보냄
if (valA === null || valA === undefined) return 1;
if (valB === null || valB === undefined) return -1;
// 빈 문자열은 유효한 값 뒤로 보냄
if (valA === '' && valB !== '') return 1;
if (valB === '' && valA !== '') return -1;
// 숫자 비교
if (typeof valA === 'number' && typeof valB === 'number') {
return direction === 'asc' ? valA - valB : valB - valA;
}
// 문자열 비교
if (typeof valA === 'string' && typeof valB === 'string') {
return direction === 'asc'
? valA.localeCompare(valB)
: valB.localeCompare(valA);
}
return 0; // 기본 반환값
});
setUsersAccessHistoryList(sortedData); // 정렬된 데이터 업데이트
};
- `key`: 클릭한 열의 이름(예: `rowNum`, `usersEmail` 등).
- `direction`: 오름차순(`asc`) 또는 내림차순(`desc`). 동일한 열 클릭 시 반대로 변경됩니다.
- `null`, `undefined`, 빈 문자열 처리:
- `null`과 `undefined`는 항상 뒤로 이동.
- `""`(빈 문자열)은 유효한 값 뒤로 이동.
- `localeCompare`: 문자열 비교에 사용됩니다.
---
4️⃣ 테이블 헤더에 클릭 이벤트 추가하기
이제 테이블 헤더에 클릭 이벤트를 추가하여 사용자가 특정 열을 기준으로 데이터를 정렬할 수 있도록 합니다.
{/* 각 열에 클릭 이벤트 추가 */} sortData('rowNum')}>
번호 {sortConfig.key === 'rowNum' && (sortConfig.direction === 'asc' ? '▲' : '▼')}
sortData('usersEmail')}>
이메일 {sortConfig.key === 'usersEmail' && (sortConfig.direction === 'asc' ? '▲' : '▼')}
sortData('usersLoginDevice')}>
접속기기 {sortConfig.key === 'usersLoginDevice' && (sortConfig.direction === 'asc' ? '▲' : '▼')}
sortData('usersLoginCours')}>
접속경로 {sortConfig.key === 'usersLoginCours' && (sortConfig.direction === 'asc' ? '▲' : '▼')}
sortData('regDt')}>
접속날짜 {sortConfig.key === 'regDt' && (sortConfig.direction === 'asc' ? '▲' : '▼')}
- `onClick`: 클릭 이벤트로 특정 열의 헤더를 클릭하면 해당 열 기준으로 데이터를 정렬합니다.
- `▲`/`▼`: 현재 정렬 상태(오름차순/내림차순)를 시각적으로 표시하려고 추가 했습니다.
📌 마무리 및 다음 단계 예고
이번 글에서는 React에서 클라이언트 측에서만 동작하는 테이블 정렬 기능을 구현했습니다. 구현하는데 쳇과장 에 도움을 받아서 화면단에 적용을 했지만.. 전체 데이터의 정렬은 적용하지 못하여 다시 구글링하고 췟과장 에게 도움을 받아 또 진행 하고 있네요.
다음 글에서는 서버(WAS)와 연동하여 전체 데이터를 대상으로 sql 쿼리를 수정해서 데이터의 정렬 기능은 다시 한번더 수정해볼까 합니다.
'Developer' 카테고리의 다른 글
React 테이블 정렬 기능 구현하기 : 클라이언트 정렬부터 was서버까지 -2 (1) | 2024.11.27 |
---|---|
[React]react-device-detect: 기기 감지 라이브러리 (0) | 2024.08.20 |
초보 개발자인 내가 사용하는 무료 소프트웨어 (0) | 2024.08.12 |
JSP 개념 이해하기 : 기초부터 차근차근 (0) | 2024.07.31 |
[React] App Router, Page Router 비교해보자 (0) | 2024.07.26 |