props는 부모 컴포넌트가 자식 컴포넌트에게 데이터를 전달하는 방법입니다.
구조 분해 할당(Destructuring Assignment)은 JavaScript의 핵심 문법 중 하나예요.
복잡한 객체나 배열에서 값을 쉽고 깔끔하게 꺼내는 문법이에요.React에서도
props
,state
,useState
,useEffect
등에서 아주 자주 쓰여요!
기존에는 배열이나 객체에서 값을 하나씩 찝어서 변수에 할당했다면
구조분해할당은 변수를 여러개 묶어놓고, 그 변수값들에 객체의 값이나 배열의 값이 순차적으로 들어가게 하는것이다.
onChange 이용한 useState
✅ 동작 흐름
1. 초기값 ""
으로 userEmail
상태 생성
2. 사용자가 이메일을 입력
3. onChange
이벤트 발생 → setUserEmail(...)
실행
4. 상태가 변경될때마다 컴포넌트가 다시 렌더링
5. 입력창과 아래 텍스트에 새로운 이메일 반영됨
React Router는 단일 페이지 애플리케이션(SPA)에서 URL에 따라 다른 화면을 보여주는 역할을 하죠.
SPA (Single Page Application)
- 페이지를 새로고침하지 않고, URL에 따라 컴포넌트만 바꾸는
React Router
- 리액트에서 SPA 방식 라우팅을 구현하기 위한 대표적인 라이브러리
설치방법
npm install react-router-dom
✅ 기본 구성
import { BrowserRouter, Routes, Route } from "react-router-dom";
function App() {
return (
<BrowserRouter>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
</Routes>
</BrowserRouter>
);
}
useNavigate
는 버튼 클릭, 폼 제출 등 이벤트가 발생했을 때 특정 경로로 이동할 수 있게 해주는 함수입니다.
사용법
import { useNavigate } from "react-router-dom";
function MyComponent() {
const navigate = useNavigate(); // 내비게이션 함수 가져오기
const handleClick = () => {
navigate("/home"); // "/home" 경로로 이동
};
return <button onClick={handleClick}>홈으로 이동</button>;
}
"미래에 어떤 값이 도착할 것이다!" 라는 약속(= Promise)으로
미래의 데이터 처리가 완료된 시점에 결과를 제공하겠다는 ‘약속(프로미스)’를 반환한다.
즉, Promise는 비동기 작업의 결과를 담는 객체이다.
하지만 이 Promise는 "미래에 데이터를 줄게"라고 말할 뿐,
그 결과를 내가 .then()이나 await으로 꺼내서 써야 한다.
Promise 기본 구조
const promise = new Promise((resolve, reject) => {
// 시간이 오래 걸리는 작업
if (성공) {
resolve("성공 결과");
} else {
reject("실패 이유");
}
});
사용하는 예
promise
.then(result => console.log("성공:", result))
.catch(error => console.error("실패:", error));
Promise 작업의 결과는 resolve와 reject로 받을 수 있는데, Promise 작업이 성공했을 때는 resolve로 어떤 이유로 실패했을 때는 reject로 받는다.
fetch 방식
fetch("https://api.example.com/data")
.then(res => res.json())
.then(data => console.log(data));
👉 이게 기존 방식(Promise
+ then
)
👉 fetch()
는 Promise 객체를 반환합니다!
👉 그러나 async/await
이 더 가독성 좋고 try/catch
로 에러 처리도 쉽습니다.
자바스크립트 문법상,
await
은 반드시async 함수
안에서만 사용 가능하다.await은 Promise가 끝날 때까지 "기다리겠다"는 명령어인데,
이걸 쓰는 함수는 자동으로 비동기 함수(Promise)로 변해야 하기 때문이에요.
✅ async/await로 처리
async function getData() {
const res = await fetch("https://api.com/data");
const data = await res.json();
console.log(data); // 원하는 데이터 출력됨!
}
if (response.ok) {
alert(data.message); // 회원가입 성공 메시지
navigate("/");
} else {
setError(data.message); // 실패 메시지 설정
}
✅ response.ok란?
true
: 상태 코드가 200~299 사이일 때false
: 나머지 (예: 400, 401, 403, 404, 500 등)TypeScript = JavaScript + 타입 시스템입니다.
- 자바스크립트 개발을 더 안전하고, 예측 가능하게 해주는 도구
- 런타임 전에 에러를 잡을 수 있어 디버깅 시간 절약
- JS를 알고 있다면 바로 적응 가능
- 리액트, 노드 등 현대 웹 개발에서도 매우 많이 사용됨
🧩 주요 기능들
- 타입 명시
let age: number = 25; let isAdmin: boolean = true; let username: string = "Alice";
- 인터페이스와 타입
interface User { name: string; age: number; } const user: User = { name: "Bob", age: 30, };
- 함수 타입 지정
function add(a: number, b: number): number { return a + b; }
- 제네릭 (Generic)
function identity<T>(arg: T): T { return arg; } identity<string>("hello"); // 타입 추론도 가능
코드 뜯어보기
import React from "react";
interface ButtonProps {
children: React.ReactNode;
onClick?: () => void;
disabled?: boolean;
className?: string;
}
export const Button: React.FC<ButtonProps> = ({ children, onClick, disabled, className }) => {
return (
<button
onClick={onClick}
disabled={disabled}
className={`px-4 py-2 rounded bg-blue-500 text-white disabled:bg-gray-300 ${className}`}
>
{children}
</button>
);
};
children의 타입을 React.ReactNode로 지정해두면, 어떤 JSX 요소든 다 받을 수 있어서 유연하게 사용가능하다.
컴포넌트를 재사용해서 태그내의 내용만 변경하게 할 수 있도록 사용하는것