[AI 감성 일기장] Home 페이지 날짜 관리 및 정렬 기능 구현

Dev Log

Home 페이지에서 월별 일기 데이터를 관리하고 정렬하는 기능을 구현했다. 사용자가 월을 전환하며 해당 기간의 일기만 볼 수 있고, 최신순 또는 오래된순으로 정렬할 수 있다.

날짜 및 기간 관리

현재 날짜 표시 및 월 변경

pivotDate상태로 현재 표시 중인 월을 관리하고, 좌우 버튼으로 이전/다음 달로 이동할 수 있도록 구현했다.

const [pivotDate, setPivotDate] = useState(new Date());

const onIncreaseMonth = () => {
  setPivotDate(new Date(pivotDate.getFullYear(), pivotDate.getMonth() + 1));
};

const onDecreaseMonth = () => {
  setPivotDate(new Date(pivotDate.getFullYear(), pivotDate.getMonth() - 1));
};
<Header
  title={`${pivotDate.getFullYear()}년 ${pivotDate.getMonth() + 1}월`}
  leftChild={<Button onClick={onDecreaseMonth} text={"<"} />}
  rightChild={<Button onClick={onIncreaseMonth} text={">"} />}
/>

 

날짜 범위 계산 및 데이터 필터링

선택된 월의 시작 시간과 종료 시간을 계산하여 해당 기간의 일기 데이터만 필터링했다.

const getMonthlyData = (pivotDate: Date, data: DiaryType[]) => {
  // 해당 월의 시작 시간
  const beginTime = new Date(
    pivotDate.getFullYear(),
    pivotDate.getMonth(),
    1,
    0,
    0,
    0
  ).getTime();

  // 해당 월의 종료 시간
  const endTime = new Date(
    pivotDate.getFullYear(),
    pivotDate.getMonth() + 1,
    0,
    23,
    59,
    59
  ).getTime();

  // 해당 월에 속하는 데이터만 필터링
  return data.filter(
    (item) => beginTime <= item.createdDate && item.createdDate <= endTime
  );
};
const data = useContext(DiaryStateContext);
const monthlyData = getMonthlyData(pivotDate, data);

// ...
<DiaryList data={monthlyData} />

DiaryStateContext에서 받아온 전체 데이터 중 현재 pivotDate에 해당하는 월의 데이터만 렌더링한다.

 

정렬 기능

정렬 상태 관리

최신순과 오래된순 두 가지 정렬 방식을 sortType상태로 관리했다.

const [sortType, setSortType] = useState<"latest" | "oldest">("latest");

const onChangeSortType = (e: React.ChangeEvent<HTMLSelectElement>) => {
  setSortType(e.target.value as "latest" | "oldest");
};

 

데이터 정렬

toSorted 메서드를 사용하여 원본 데이터를 변경하지 않고 정렬된 새 배열을 생성했다.

const getSortedData = () => {
  return data.toSorted((a, b) => {
    if (sortType === "oldest") {
      return Number(a.createdDate) - Number(b.createdDate);
    } else {
      return Number(b.createdDate) - Number(a.createdDate);
    }
  });
};

const sortedData = getSortedData();
<select onChange={onChangeSortType}>
  {/* ... */}
</select>

{sortedData.map((item) => (
  <DiaryItem key={item.id} {...item} />
))}

선택된 sortType에 따라 createdDate 기준으로 일기 데이터를 오름차순 또는 내림차순으로 정렬한다.

'Dev Log' 카테고리의 다른 글

[AI 감성 일기장] Diary 페이지 일기 상세보기 기능 구현  (0) 2025.11.07
[AI 감성 일기장] New 페이지 일기 작성 기능 구현  (0) 2025.11.07
[AI 감성 일기장] TypeScript에서 toSorted 메서드 인식 오류 해결  (0) 2025.11.07
[AI 감성 일기장] TypeScript로 재사용 가능한 공용 컴포넌트 구현  (0) 2025.11.06
[AI 감성 일기장] Vite와 TypeScript에서 절대 경로 인식 오류 해결  (0) 2025.11.06
'Dev Log' 카테고리의 다른 글
  • [AI 감성 일기장] Diary 페이지 일기 상세보기 기능 구현
  • [AI 감성 일기장] New 페이지 일기 작성 기능 구현
  • [AI 감성 일기장] TypeScript에서 toSorted 메서드 인식 오류 해결
  • [AI 감성 일기장] TypeScript로 재사용 가능한 공용 컴포넌트 구현
고견
고견
개발 자국 남기기
  • 고견
    개발자국
    고견
  • 전체
    오늘
    어제
    • 분류 전체보기 (157) N
      • Frontend (29)
        • Next.js (16)
        • JavaScript (7)
      • CS (19) N
        • 자료구조 (9)
        • 알고리즘 (5)
        • 운영체제 (4) N
        • 네트워크 (1) N
      • TIL (93)
      • Dev Log (16)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    generic
    함수 타입
    Spa
    algorithm
    C
    자료구조
    페이지 라우터
    알고리즘
    Next.js
    클래스
    typescript
    react
    javascript
    앱 라우터
    타입 좁히기
    emotion diary
    Pages Router
    cs50
    Trouble Shooting
    ai 감성 일기장
    CS
    memory
    문자열
    배열
    트러블 슈팅
    제네릭
    App Router
    바닐라 자바스크립트
    인터페이스
    useState
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
고견
[AI 감성 일기장] Home 페이지 날짜 관리 및 정렬 기능 구현
상단으로

티스토리툴바