비밀번호 암호화: Spring Security의 PasswordEncoder를 사용하여 사용자의 비밀번호를 단방향 해시(Hash)하여 DB에 저장함으로써, 원본 비밀번호 유출을 원천적으로 방지했습니다.
JWT 발급 및 검증:
인증 기반 데이터 필터링:
findAllByUserId(...))를 실행하여, 인가된 데이터만 필터링하여 반환합니다.action을 이용한 데이터 조작loader가 데이터 읽기(Read)를 담당했다면, action 함수는 데이터 생성/수정/삭제(CUD) 작업을 처리하는 React Router의 기능입니다.동작 원리:
action 함수를 연결하고, React Router의 <Form> 컴포넌트를 사용해 폼을 제출합니다.<Form>은 페이지를 새로고침하는 대신, 연결된 라우트의 action 함수로 요청을 보냅니다.action 함수 내에서 폼 데이터를 추출하여 백엔드 API를 호출하고, 작업이 성공하면 redirect() 함수를 반환하여 사용자를 다른 페이지로 이동시킵니다.장점: 데이터 조작 로직을 컴포넌트로부터 완전히 분리하여, 컴포넌트는 UI 렌더링에만 집중할 수 있게 됩니다. 이는 코드의 관심사 분리(SoC) 원칙을 잘 따르는 구조입니다.
loader를 활용한 라우트 가드 (Route Guard):
loader 함수에서 브라우저에 저장된 토큰의 유효성을 먼저 확인합니다.redirect()를 반환하여 사용자를 로그인 페이지로 강제 이동시킵니다.전역 인증 상태 공유:
loader: 최상위 라우트의 loader에서 사용자의 로그인 상태를 확인하고 그 결과를 반환합니다.useRouteLoaderData Hook: 모든 자식 컴포넌트에서 이 Hook을 사용하여 루트 loader의 데이터를 쉽게 조회하고, 로그인 상태에 따라 UI(e.g., 로그인/로그아웃 버튼)를 조건부로 렌더링합니다.API 호출 리팩토링:
fetch 코드를 인증 토큰을 자동으로 헤더에 주입하는 중앙화된 API 유틸리티 함수로 리팩토링했습니다.action 함수를 사용하여 컴포넌트와 로직을 분리했습니다.loader를 라우트 가드로 활용하여 페이지 접근을 제어하고, useRouteLoaderData로 전역 인증 상태를 공유하며, 중앙화된 API 유틸리티로 코드 품질을 높이는 등 고도화된 아키텍처를 완성했습니다.