RESTful API 설계: 이벤트(Event)라는 자원(Resource)을 중심으로, HTTP 메서드(GET, POST, PUT, DELETE)를 사용하여 직관적인 API 엔드포인트를 설계했습니다.
GET /api/events: 전체 이벤트 목록 조회GET /api/events/{id}: 단일 이벤트 상세 조회POST /api/events: 새 이벤트 생성PUT /api/events/{id}: 이벤트 수정DELETE /api/events/{id}: 이벤트 삭제DTO (Data Transfer Object): 데이터베이스와 직접 연결된 엔티티(Entity)를 클라이언트에 그대로 노출하는 대신, API의 각 목적에 맞는 DTO를 만들어 사용했습니다. 이를 통해 API 스펙을 안정적으로 유지하고, 민감한 정보를 숨기며, 필요한 데이터만 선택적으로 전달할 수 있습니다.
전역 CORS 설정: 브라우저의 보안 정책상 다른 출처(Origin)의 리소스를 요청하는 것은 기본적으로 차단됩니다. React 개발 서버(localhost:3000)가 Spring API 서버(localhost:9000)에 데이터를 요청할 수 있도록, Spring Boot에 전역 CORS(Cross-Origin Resource Sharing) 설정을 추가하여 특정 출처의 요청을 허용했습니다.
라우터 기본 설정: createBrowserRouter를 사용하여 애플리케이션의 전체 라우팅 구조를 객체 형태로 정의했습니다. 이를 통해 URL 경로와 렌더링할 컴포넌트를 중앙에서 관리합니다.
레이아웃과 중첩 라우팅:
목록, 상세, 생성)에서 공통으로 사용되는 네비게이션 바 등은 이벤트 레이아웃(Events Layout)으로 분리했습니다.<Outlet /> 컴포넌트를 사용하여, 부모 레이아웃의 특정 위치에 자식 라우트 컴포넌트가 렌더링되도록 하는 중첩 라우팅 구조를 구현했습니다. 이는 코드의 중복을 획기적으로 줄여줍니다.커스텀 에러 페이지: errorElement 설정을 통해 존재하지 않는 경로로 접근하거나 데이터 로딩 중 에러가 발생했을 때, 사용자에게 친화적인 에러 페이지를 보여주도록 처리하여 애플리케이션의 안정성을 높였습니다.
loader를 통한 성능 최적화초기 방식 (useEffect): 컴포넌트가 렌더링된 후, useEffect Hook 안에서 fetch를 사용하여 API를 호출하고, 받아온 데이터로 상태(state)를 업데이트하여 화면을 다시 렌더링하는 방식을 사용했습니다.
개선된 방식 (React Router loader):
loader는 React Router v6.4부터 도입된 강력한 기능으로, 컴포넌트가 렌더링되기 전에 데이터를 미리 가져오는 함수입니다.loader 함수를 정의해두면, 해당 경로로 이동할 때 React Router가 이 함수를 먼저 실행합니다. loader가 데이터를 모두 가져오면, 그 데이터를 컴포넌트에 prop처럼 전달하여 렌더링을 시작합니다.useLoaderData Hook을 사용하여 컴포넌트 내에서 loader가 반환한 데이터에 쉽게 접근할 수 있습니다.위의 개념들을 종합하여 사용자가 이벤트를 생성, 조회, 수정, 삭제할 수 있는 완전한 기능 사이클을 구현했습니다.
흐름:
POST /api/events API를 호출하여 데이터를 서버에 전송합니다.loader가 GET API를 호출하여 데이터를 미리 가져옵니다.useEffect에서 React Router의 loader로 발전시켜, 렌더링 전에 데이터를 가져오는 최적화된 패턴을 적용했습니다.