데브코스/도서 판매 쇼핑몰

[FE] 라우트 작성, api 통신 및 회원가입 구현

hxx_1 2024. 11. 14. 17:58

라우트 작성

1. 메인 페이지(/) 라우트

{
  path: "/",
  element: (
    <Layout>
      <Home />
    </Layout>
  ),
  errorElement: <Error />,
}
  • 루트 경로("/")에 접속하면 Layout 컴포넌트 내부에 Home 컴포넌트가 렌더링
  • 에러 발생 시 Error 컴포넌트가 표시됨

2. 도서 목록 (/books) 라우트

{
  path: "/books",
  element: (
    <Layout>
      <div>도서 목록</div>
    </Layout>
  ),
}
  • "/books" 경로에 접속하면 Layout 안에 도서 목록 텍스트가 표시됨

3. 회원가입 (/signup) 라우트

{
  path: "/signup",
  element: (
    <Layout>
      <SignUp />
    </Layout>
  ),
}
  • "/signup" 경로에서는 Layout 내부에 SignUp 컴포넌트가 렌더링됨

 

API 통신

 

1. http.ts

const BASE_URL = "http://localhost:9999";  // API 서버 기본 주소
const DEFAULT_TIMEOUT = 30000;             // 30초 타임아웃

기본 설정

const axiosInstance = axios.create({
  baseURL: BASE_URL,          // 기본 URL 설정
  timeout: DEFAULT_TIMEOUT,    // 요청 제한 시간
  headers: {
    "content-type": "application/json"  // JSON 형식으로 통신
  },
  withCredentials: true,      // 쿠키 포함 설정
  ...config                   // 추가 설정 확장
});

 Axios 인스턴스 생성

axiosInstance.interceptors.response.use(
  // 성공적인 응답 처리
  (response) => {
    return response;
  },
  // 에러 응답 처리
  (error) => {
    return Promise.reject(error);
  }
);

인터셉터 설정

 

2. category.api.ts

: 카테고리 데이터를 서버로부터 가져오는 API 호출 함수 

import { Category } from "../models/category.model";  // 카테고리 타입 정의
import { httpClient } from "./http";                 // axios 인스턴스
  • Category: 카테고리 데이터의 타입 정의
  • httpClient: 이전에 설정한 axios 인스턴스
export const fetchCategory = async () => {
  const response = await httpClient.get<Category[]>("/category");
  return response.data;
}
  • async/await를 사용한 비동기 함수
  • get<Category[]>: 응답 데이터가 Category 배열임을 명시
  • "/category": API 엔드포인트 경로

3. auth.api.ts

: 회원가입 API 를 호출하는 함수

import { SignupProps } from "../pages/Signup";    // 회원가입 데이터 타입
import { httpClient } from "./http";              // axios 인스턴스
  • SignupProps: 회원가입 시 필요한 사용자 데이터 타입
  • httpClient: 설정된 axios 인스턴스
export const signup = async (userData: SignupProps) => {
  const response = await httpClient.post("/users/join", userData);
  return response.data;
}
  • async/await 비동기 함수
  • POST 요청을 "/users/join" 엔드포인트로 전송
  • userData를 요청 본문에 포함

🌟 배운 점

리액트가 너무 어렵다고 느꼈다.  api 를 사용해서 이제 백엔드와 프론트엔드를 연결하는 부분을 하는 것 같은데, 따라하면서 내가 뭘 하고 있는지 잘 모르겠다는 생각이 들었다. 그리고 오늘 계속 네트워크 오류가 났는데 이 부분도 아직 해결을 하지 못했다. 강의를 다시 들어보면서 고쳐보고, 해결 하면 블로그에 내용을 추가해야겠다. 리액트도 어려운데, 너무 많은 기능을 한꺼번에 배우다보니 과부하가 오는 것 같다🥹