본문 바로가기
Web/React

axios개념

by zkzk7290 2024. 11. 4.
반응형
Axios: JS에서  HTTP(Hypertext transfer Protocol) 요청을 실행하기 위한 라이브러리  -통신 
-Promise 기반의 HTTP 클라이언트, 브라우저와 node.js 모두 사용가능 

 Axios의 장점
 - 간결한 API를 사용 (HTTP 요청과 응답 처리가 간결하고 직관적임)
- 브라우저의 호환성이 높음 
- 자동으로 JSON 데이터 변환을 지원

HTTP 통신  => 웹에서 데이터를 교환하는 주요 프로토콜 

 - 클라이언트 (브라우저)와 서버간의 통신을 위해 사용, 요청(request), 응답(response)의 형태로 데이터가 교환 

 

방법

# 1) GET
 : 데이터를 조회할 때 사용
 - URL에 쿼리 파라미터를 포함하여 요청을 보냄
- 데이터를 조회하고 검색하는 데 사용
 EX) 사용자 정보 조회, 상품 목록 불러오기 등

# 2) POST
 : 새로운 데이터를 생성할 때 사용
- 데이터를 요청 본문(body)에 포함시켜 전송
 - 새 리소스를 생성하거나 데이터를 서버로 제출할 때 사용
 EX) 회원 가입, 게시글 작성 등

# 3) PUT
 : 기존 데이터를 수정할 때 사용
 - 지정된 리소스를 새로운 데이터로 "완전히" 대체
 - 리소스의 전체적인 수정에 사용
 EX) 사용자 프로필 업데이트, 설정 변경 등
# +) PATCH
 - "일부의 데이터"를 대체

 

# 4) DELETE
 : 데이터를 삭제할 때 사용
 - 지정된 리소스를 서버에서 삭제
 - 리소스를 영구적으로 제거할 때 사용
 EX) 계정 삭제, 게시글 제거 등

 

 

/ 1) 설치 (외부 라이브러리 설치)
// npm i axios
aixos 사용 방법 : axios.통신 메서드(GET, POST, PUT, DELETE)('URL주소', 데이터 or  null)
null을 넣으면  URL 주소만 반환 ~!~!~

 

 

예제)

interface User {
  id: number;
  name: string;
  email: string;
}

export default function Axios01() {
  // jsonplaceholder에서 가져오는 데이터를 상태 관리
//use state으로 상태 관리 
const [users, setUsers] = useState<User[] | null>(null);

  // 새로운 사용자에 대한 입력 데이터를 상태 관리
  const [newUser, setNewUser] = useState<User>({
    id: 0,
    name: "",
    email: "",
  });

  // 수정될 데이터의 id를 담는 상태 관리
  const [editingUserId, setEditingUserId] = useState<number | null>(null);

  //# axios를 사용한 get 요청 (가져오다)
  async-await 비동기 처리 
  const fetchUsers = async () => {
    try {
      // axios의 메서드 사용 방법
      // - axios.get('url')
      // - axios.post('url', 저장할데이터)
      // - axios.put('url', 수정할데이터)
      // - axios.delete('url')

      const response = await axios.get(
        "https://jsonplaceholder.typicode.com/users"
      );

      const data = response.data;

      // axios 응답 내부의 데이터: data 속성 내에 저장
      // setUsers(response.data);
      setUsers(data);
    } catch (e) {
      console.error("Error fetching data: ", e);
    }
  };

  // async function fetchUsers() {}

  useEffect(() => {
    fetchUsers();
  }, []);

  const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {
    const { name, value } = e.target;

    setNewUser({
      ...newUser,
      [name]: value,
    });
  };

  //# axios를 사용하는 post 요청 (전송하다)
  const createUser = async (newUser: User) => {
    try {
      // axios를 사용한 데이터 전송(post 메서드)
      // axios.post('url', 전송할 데이터)
      // >> 데이터를 전송하고 난 뒤 해당 데이터를 반환(응답)
      const response = await axios.post(
        "https://jsonplaceholder.typicode.com/users",
        newUser
      );

      if (users) {
        setUsers([...users, response.data]);
        console.log(response.data);
      }
    } catch (e) {
      console.error("Error creating user: ", e);
    }
  };

  //# 데이터의 전송을 담당
  // : 데이터베이스에 새로운 데이터가 전달될 경우 (post, put)
  const handleSubmit = (e: React.FormEvent) => {
    e.preventDefault();

    // 데이터를 axios를 통해 전송
    // createUser(newUser);

    if (editingUserId !== null) {
      updateUser(editingUserId, newUser);
    } else {
      createUser(newUser);
    }

    // input창 초기화
    setNewUser({
      id: 0,
      name: "",
      email: "",
    });

    setEditingUserId(null);
  };

  //# axios를 사용하는 put 요청 (수정하다)
  const updateUser = async (id: number, updateUser: User) => {
    try {
      const response = await axios.put(
        `https://jsonplaceholder.typicode.com/users/${id}`,
        updateUser
      );

      if (users) {
        setUsers(users.map((user) => (user.id === id ? response.data : user)));
      }
    } catch (e) {
      console.error("Error updating user: ", e);
    }
  };

  //# axios를 사용하는 delete 요청 (삭제하다)
  const deleteUser = async (id: number) => {
    try {
      await axios.delete(`https://jsonplaceholder.typicode.com/users/${id}`);

      if (users) {
        setUsers(users.filter((user) => user.id !== id));
      }
    } catch (e) {
      console.error("Error deleting user: ", e);
    }
  };

  const handleEdit = (user: User) => {
    setNewUser(user);

    // handleEdit 함수가 호출된 경우에만
    // : 해당 상태 관리에 id값이 전달
    setEditingUserId(user.id);
  };

  return (
    <div>
      HTTP: Axios GET / POST
      <h3
        style={{
          backgroundColor: "black",
          color: "white",
        }}
      >
        Axios Get
      </h3>
      {/*  
        uses 데이터가 존재할 경우 UI 출력
          , 그렇지 않을 경우 p태그(데이터를 가져오는 중입니다)
      */}
      {users ? (
        users.map((user) => (
          <div key={user.id}>
            <h4>{user.name}</h4>
            <p>{user.email}</p>
            <button onClick={() => handleEdit(user)}>수정</button>
            <button onClick={() => deleteUser(user.id)}>삭제</button>
          </div>
        ))
      ) : (
        <p>데이터를 가져오는 중입니다</p>
      )}
      {/* 
      {users.map(user => (
        <div>
          <h4>{user.name}</h4>
          <p>{user.email}</p>
        </div>
      ))} 
       */}
      <h3
        style={{
          backgroundColor: "black",
          color: "white",
        }}
      >
        Axios Post
      </h3>
      <form onSubmit={handleSubmit}>
        <input
          type="text"
          placeholder="name"
          onChange={handleInputChange}
          name="name"
          value={newUser.name}
        />
        <input
          type="text"
          placeholder="email"
          onChange={handleInputChange}
          name="email"
          value={newUser.email}
        />
        <button type="submit">
          {editingUserId ? "사용자 수정" : "사용자 추가"}
        </button>
      </form>
    </div>
  );
}
반응형

'Web > React' 카테고리의 다른 글

Props 속성 값  (1) 2024.12.29
zustand  (1) 2024.11.03
use-cookie+ Cookie  (0) 2024.11.01
UseEffect  (0) 2024.10.31
Hook-1  (0) 2024.08.31