방금 질문했던 것에서...
GPT가 객체 구조 분해 할당을 알려줬는데, 거기서 의문점이 하나 생겼다.
내가 만든 아무 변수명이 어떤 요소인줄 알고 data 객체에서 요소와 매칭시킬 수 있는거지?> 생각해보니 id라는 키 값으로 매칭했나 보다.
그래서 하나 더 물어봤다.
제가 임의로 만든 변수명 id가 아닌, props.shoes 객체 안에 있는 id라는 키 값을 전달해야만 하는 건가요?
좋은 질문이에요! 객체 구조 분해 할당은 자바스크립트에서 객체를 다룰 때 매우 유용한 개념입니다. 이걸 하나하나 알기 쉽게 풀어서 설명드릴게요.
객체 구조 분해 할당(Object Destructuring)은 객체에서 필요한 키의 값을 쉽게 변수로 추출하는 방법입니다.
예를 들어, 이런 객체가 있다고 가정해 봅시다:
const person = {
name: "Alice",
age: 25,
city: "New York"
};
이 객체에서 name과 age를 변수로 꺼내려면 원래는 이렇게 해야 했습니다:
const name = person.name;
const age = person.age;
console.log(name); // Alice
console.log(age); // 25
하지만 객체 구조 분해 할당을 사용하면, 훨씬 간단하게 쓸 수 있습니다:
const { name, age } = person;
console.log(name); // Alice
console.log(age); // 25
위 코드는 다음과 같은 일을 합니다:
person 객체에서 name과 age라는 키를 찾아서 해당 값을 각각 name, age라는 변수에 저장합니다.구조 분해 할당을 사용할 때, 객체의 키 이름(key)과 변수 이름이 정확히 일치해야 합니다.
예를 들어:
const { city } = person;
console.log(city); // New York
위 코드에서 city라는 변수는 person 객체의 city 키와 연결됩니다. 키 이름이 일치하지 않으면 값이 저장되지 않습니다.
const { country } = person;
console.log(country); // undefined (person 객체에는 "country"라는 키가 없음)
useParams()와 구조 분해 할당useParams()는 React Router에서 URL 파라미터를 가져오는 데 사용됩니다. 예를 들어, URL이 다음과 같을 때:
/detail/2
useParams()는 URL에서 파라미터를 추출해 객체로 반환합니다. 이 경우 반환값은 다음과 같습니다:
{ id: "2" }
이 반환값에서 id라는 값을 가져오고 싶다면, 구조 분해 할당을 사용할 수 있습니다:
const { id } = useParams();
위 코드는 다음과 같은 일을 합니다:
1. useParams()가 반환한 객체(예: { id: "2" })에서 id라는 키를 찾아 그 값을 id라는 변수에 저장합니다.
2. 이제 id 변수에 "2"라는 값이 들어갑니다.
useParams()가 반환하는 객체는 { id: "2" } 형태이기 때문에, 키 이름이 id로 정해져 있습니다. 만약 키 이름이 id가 아니라 productId라면, 구조 분해 할당에서도 productId를 사용해야 합니다:
const { productId } = useParams(); // 이 경우, 반환 객체가 { productId: "2" } 여야 함
하지만 반환 객체에 없는 키 이름(예: foo)을 사용하면 undefined가 됩니다:
const { foo } = useParams();
console.log(foo); // undefined
만약 반환 객체의 키 이름과 변수 이름을 다르게 쓰고 싶다면, 별칭(alias)을 사용할 수 있습니다.
const { id: productId } = useParams();
이 코드는 다음과 같이 동작합니다:
1. useParams()가 반환한 객체(예: { id: "2" })에서 id라는 키를 찾습니다.
2. 그 값을 productId라는 변수에 저장합니다.
3. 이제 productId에는 "2"가 들어가게 됩니다.
예제:
const { id: productId } = useParams();
console.log(productId); // "2"
이렇게 하면 반환 객체의 키 이름과 상관없이 변수 이름을 원하는 대로 바꿀 수 있습니다.
제가 임의로 만든 변수명
id가 아닌,props.shoes객체 안에 있는id라는 키 값을 전달해야만 하는 건가요?
네, 반드시 객체의 키 이름과 일치해야 합니다. useParams()가 반환하는 객체의 키 이름이 id라면, 구조 분해 할당에서 변수 이름도 id로 써야 값이 제대로 할당됩니다.
만약 키 이름과 변수 이름을 다르게 쓰고 싶다면 별칭(alias)을 사용해야 합니다.
useParams()와 함께 사용할 때도 반환 객체의 키 이름과 일치하는 변수명을 써야 값이 제대로 할당됩니다.import { useParams } from "react-router-dom";
function Detail(props) {
// useParams()의 반환값이 { id: "2" }라면
const { id } = useParams(); // id는 문자열 "2"가 됩니다.
// 찾기
const foundProduct = props.shoes.find((product) => {
return product.id === parseInt(id); // id는 문자열이므로 숫자로 변환
});
return foundProduct ? (
<div>상품 정보: {foundProduct.title}</div>
) : (
<div>상품을 찾을 수 없습니다.</div>
);
}