๋ถ๋ณ์ฑ, ์ฑ๋ฅ, ํฅ์๋ ํ์ ์์ ์ฑ์ ์ํด ์ค๊ณ๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ์๋ก์ด ๋ฐ์ดํฐ ๊ตฌ์กฐ์ธ Record์ Tuple์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ๊ณผ ์ด์ ์ ์์๋ณด์ธ์.
์๋ฐ์คํฌ๋ฆฝํธ Record & Tuple: ๋ถ๋ณ ๋ฐ์ดํฐ ๊ตฌ์กฐ ์ฌ์ธต ๋ถ์
์๋ฐ์คํฌ๋ฆฝํธ๋ ๋์์์ด ๋ฐ์ ํ๊ณ ์์ผ๋ฉฐ, ๊ฐ์ฅ ํฅ๋ฏธ๋ก์ด ์ ์ ์ค ํ๋๋ ์ธ์ด์ ํต์ฌ์ ๋ถ๋ณ์ฑ์ ๋์ ํ๊ธฐ ์ํด ์ค๊ณ๋ ๋ ๊ฐ์ง ์๋ก์ด ๋ฐ์ดํฐ ๊ตฌ์กฐ์ธ Record์ Tuple์ ๋์ ์ ๋๋ค. ์ด ํฌ์คํธ์์๋ Record์ Tuple์ด ๋ฌด์์ธ์ง, ์ ์ค์ํ์ง, ์ด๋ป๊ฒ ์๋ํ๋์ง, ๊ทธ๋ฆฌ๊ณ ์ ์ธ๊ณ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ์์๊ฒ ์ด๋ค ์ด์ ์ ์ ๊ณตํ๋์ง์ ๋ํด ์์ธํ ์์๋ด ๋๋ค.
Record์ Tuple์ด๋ ๋ฌด์์ธ๊ฐ?
Record์ Tuple์ ์๋ฐ์คํฌ๋ฆฝํธ์ ์์์ ์ด๊ณ ๊น์ ๋ถ๋ณ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๋๋ค. ๊ฐ๊ฐ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด์ ๋ฐฐ์ด์ ๋ถ๋ณ ๋ฒ์ ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค.
- Record: ๋ถ๋ณ ๊ฐ์ฒด. ์ผ๋จ ์์ฑ๋๋ฉด ์์ฑ์ ์์ ํ ์ ์์ต๋๋ค.
- Tuple: ๋ถ๋ณ ๋ฐฐ์ด. ์ผ๋จ ์์ฑ๋๋ฉด ์์๋ฅผ ์์ ํ ์ ์์ต๋๋ค.
์ด ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ค์ ๊น์ ๋ถ๋ณ์ฑ์ ๊ฐ์ง๋ฏ๋ก, Record๋ Tuple ์์ฒด๋ฟ๋ง ์๋๋ผ ๊ทธ ์์ ์ค์ฒฉ๋ ๊ฐ์ฒด๋ ๋ฐฐ์ด๋ ๋ชจ๋ ๋ถ๋ณ์ ๋๋ค.
๋ถ๋ณ์ฑ์ด ์ ์ค์ํ๊ฐ
๋ถ๋ณ์ฑ์ ์ํํธ์จ์ด ๊ฐ๋ฐ์ ๋ช ๊ฐ์ง ์ฃผ์ ์ด์ ์ ๊ฐ์ ธ๋ค์ค๋๋ค:
- ์ฑ๋ฅ ํฅ์: ๋ถ๋ณ์ฑ์ ์์ ๋น๊ต(๋ ๋ณ์๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ๋์ผํ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋์ง ํ์ธ)์ ๊ฐ์ ์ต์ ํ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ์ฌ ๊น์ ๋น๊ต(๋ ๊ฐ์ฒด์ ๋ด์ฉ์ ๋น๊ต)๋ฅผ ๋์ฒดํ ์ ์์ต๋๋ค. ์ด๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์์ฃผ ๋น๊ตํ๋ ์๋๋ฆฌ์ค์์ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค.
- ํ์ ์์ ์ฑ ๊ฐํ: ๋ถ๋ณ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ๋ฐ์ดํฐ์ ๋ฌด๊ฒฐ์ฑ์ ๋ํด ๋ ๊ฐ๋ ฅํ ๋ณด์ฅ์ ์ ๊ณตํ์ฌ ์ฝ๋๋ฅผ ์ถ๋ก ํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค๊ณ ์๊ธฐ์น ์์ ๋ถ์์ฉ์ ๋ฐฉ์งํฉ๋๋ค. ํ์ ์คํฌ๋ฆฝํธ์ ๊ฐ์ ํ์ ์์คํ ์ ๋ถ๋ณ์ฑ ์ ์ฝ์ ๋ ์ ์ถ์ ํ๊ณ ๊ฐ์ ํ ์ ์์ต๋๋ค.
- ๋จ์ํ๋ ๋๋ฒ๊น : ๋ถ๋ณ ๋ฐ์ดํฐ๋ ๊ฐ์ด ์๊ธฐ์น ์๊ฒ ๋ณ๊ฒฝ๋์ง ์์ ๊ฒ์ด๋ผ๋ ํ์ ์ ์ฃผ๋ฏ๋ก ๋ฐ์ดํฐ์ ํ๋ฆ์ ์ถ์ ํ๊ณ ๋ฒ๊ทธ์ ์์ธ์ ์๋ณํ๊ธฐ๊ฐ ๋ ์ฌ์์ง๋๋ค.
- ๋์์ฑ ์์ ์ฑ: ๋ถ๋ณ์ฑ์ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ๋์ผํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์์ ํ๋ ๊ฒ์ ๋ํด ๊ฑฑ์ ํ ํ์๊ฐ ์์ผ๋ฏ๋ก ๋์์ฑ ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ํจ์ฌ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
- ์์ธก ๊ฐ๋ฅํ ์ํ ๊ด๋ฆฌ: React, Redux, Vue์ ๊ฐ์ ํ๋ ์์ํฌ์์ ๋ถ๋ณ์ฑ์ ์ํ ๊ด๋ฆฌ๋ฅผ ๋จ์ํํ๊ณ ์๊ฐ ์ฌํ ๋๋ฒ๊น ๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
Record์ Tuple์ ์๋ ๋ฐฉ์
Record์ Tuple์ `new Record()`๋ `new Tuple()`๊ณผ ๊ฐ์ ์์ฑ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ๋์ง ์์ต๋๋ค. ๋์ , ํน๋ณํ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ์์ฑ๋ฉ๋๋ค:
- Record: `#{ key1: value1, key2: value2 }`
- Tuple: `#[ item1, item2, item3 ]`
๋ช ๊ฐ์ง ์์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค:
Record ์์
Record ์์ฑํ๊ธฐ:
const myRecord = #{ name: "Alice", age: 30, city: "London" };
console.log(myRecord.name); // ์ถ๋ ฅ: Alice
Record๋ฅผ ์์ ํ๋ ค๊ณ ์๋ํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค:
try {
myRecord.age = 31; // ์ค๋ฅ ๋ฐ์
} catch (error) {
console.error(error);
}
๊น์ ๋ถ๋ณ์ฑ ์์:
const address = #{ street: "Baker Street", number: 221, city: "London" };
const person = #{ name: "Sherlock", address: address };
// ์ค์ฒฉ๋ ๊ฐ์ฒด๋ฅผ ์์ ํ๋ ค๊ณ ํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
try {
person.address.number = 221;
} catch (error) {
console.error("์กํ ์ค๋ฅ: " + error);
}
Tuple ์์
Tuple ์์ฑํ๊ธฐ:
const myTuple = #[1, 2, 3, "hello"];
console.log(myTuple[0]); // ์ถ๋ ฅ: 1
Tuple์ ์์ ํ๋ ค๊ณ ์๋ํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค:
try {
myTuple[0] = 4; // ์ค๋ฅ ๋ฐ์
} catch (error) {
console.error(error);
}
๊น์ ๋ถ๋ณ์ฑ ์์:
const innerTuple = #[4, 5, 6];
const outerTuple = #[1, 2, 3, innerTuple];
// ์ค์ฒฉ๋ ํํ์ ์์ ํ๋ ค๊ณ ํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค
try {
outerTuple[3][0] = 7;
} catch (error) {
console.error("์กํ ์ค๋ฅ: " + error);
}
Record์ Tuple ์ฌ์ฉ์ ์ด์
- ์ฑ๋ฅ ์ต์ ํ: ์์ ์ธ๊ธํ๋ฏ์ด, Record์ Tuple์ ๋ถ๋ณ์ฑ์ ์์ ๋น๊ต์ ๊ฐ์ ์ต์ ํ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ์์ ๋น๊ต๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๋ด์ฉ์ ๊น๊ฒ ๋น๊ตํ๋ ๋์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๋น๊ตํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ์ด๋ ํนํ ํฐ ๊ฐ์ฒด๋ ๋ฐฐ์ด์ ๊ฒฝ์ฐ ํจ์ฌ ๋น ๋ฆ ๋๋ค.
- ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ: ์ด ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ค์ ๋ถ๋ณ ํน์ฑ์ ๋ฐ์ดํฐ๊ฐ ์ฐ๋ฐ์ ์ผ๋ก ์์ ๋์ง ์๋๋ก ๋ณด์ฅํ์ฌ ๋ฒ๊ทธ์ ์ํ์ ์ค์ด๊ณ ์ฝ๋๋ฅผ ๋ ์ฝ๊ฒ ์ถ๋ก ํ ์ ์๊ฒ ๋ง๋ญ๋๋ค.
- ํฅ์๋ ๋๋ฒ๊น : ๋ฐ์ดํฐ๊ฐ ๋ถ๋ณ์ด๋ผ๋ ๊ฒ์ ์๋ฉด ์๊ธฐ์น ์์ ๋ณ๊ฒฝ์ ๋ํด ๊ฑฑ์ ํ์ง ์๊ณ ๋ฐ์ดํฐ์ ํ๋ฆ์ ์ถ์ ํ ์ ์์ผ๋ฏ๋ก ๋๋ฒ๊น ์ด ๋จ์ํ๋ฉ๋๋ค.
- ๋์์ฑ ์นํ์ : ๋ถ๋ณ์ฑ์ Record์ Tuple์ ๋ณธ์ง์ ์ผ๋ก ์ค๋ ๋ ์์ ํ๊ฒ ๋ง๋ค์ด ๋์์ฑ ํ๋ก๊ทธ๋๋ฐ์ ๋จ์ํํฉ๋๋ค.
- ํจ์ํ ํ๋ก๊ทธ๋๋ฐ๊ณผ์ ๋ ๋์ ํตํฉ: Record์ Tuple์ ๋ถ๋ณ์ฑ์ด ํต์ฌ ์์น์ธ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์์ ์์ฐ์ค๋ฝ๊ฒ ๋ค์ด๋ง์ต๋๋ค. ์ด๋ ๋์ผํ ์ ๋ ฅ์ ๋ํด ํญ์ ๋์ผํ ์ถ๋ ฅ์ ๋ฐํํ๊ณ ๋ถ์์ฉ์ด ์๋ ์์ ํจ์๋ฅผ ์์ฑํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
Record์ Tuple์ ์ฌ์ฉ ์ฌ๋ก
Record์ Tuple์ ๋ค์๊ณผ ๊ฐ์ ๋ค์ํ ์๋๋ฆฌ์ค์์ ์ฌ์ฉ๋ ์ ์์ต๋๋ค:
- ๊ตฌ์ฑ ๊ฐ์ฒด: Record๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ์ฑ ์ค์ ์ ์ ์ฅํ๊ณ , ์ฐ๋ฐ์ ์ผ๋ก ์์ ๋์ง ์๋๋ก ๋ณด์ฅํฉ๋๋ค. ์๋ฅผ ๋ค์ด API ํค, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๋ฌธ์์ด ๋๋ ๊ธฐ๋ฅ ํ๋๊ทธ๋ฅผ ์ ์ฅํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ ์ ์ก ๊ฐ์ฒด(DTO): Record์ Tuple์ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค๋ฅธ ๋ถ๋ถ ๊ฐ ๋๋ ๋ค๋ฅธ ์๋น์ค ๊ฐ์ ์ ์ก๋๋ ๋ฐ์ดํฐ๋ฅผ ๋ํ๋ ๋๋ค. ์ด๋ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๊ณ ์ ์ก ์ค ์ฐ๋ฐ์ ์ธ ์์ ์ ๋ฐฉ์งํฉ๋๋ค.
- ์ํ ๊ด๋ฆฌ: Redux๋ Vuex์ ๊ฐ์ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ Record์ Tuple์ ํตํฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ํ๊ฐ ๋ถ๋ณ์์ ๋ณด์ฅํ๊ณ , ์ํ ๋ณ๊ฒฝ์ ๋ ์ฝ๊ฒ ์ถ๋ก ํ๊ณ ๋๋ฒ๊น ํ ์ ์๋๋ก ํฉ๋๋ค.
- ์บ์ฑ: Record์ Tuple์ ์บ์์ ํค๋ก ์ฌ์ฉํ์ฌ ํจ์จ์ ์ธ ์บ์ ์กฐํ๋ฅผ ์ํด ์์ ๋น๊ต์ ์ด์ ์ ํ์ฉํฉ๋๋ค.
- ์ํ์ ๋ฒกํฐ ๋ฐ ํ๋ ฌ: Tuple์ ์ฌ์ฉํ์ฌ ์ํ์ ๋ฒกํฐ ๋ฐ ํ๋ ฌ์ ๋ํ๋ด๊ณ , ์์น ๊ณ์ฐ์ ์ํด ๋ถ๋ณ์ฑ์ ์ด์ ์ ํ์ฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๊ณผํ ์๋ฎฌ๋ ์ด์ ์ด๋ ๊ทธ๋ํฝ ๋ ๋๋ง์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ ์ฝ๋: ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ ์ฝ๋๋ฅผ Record๋ Tuple๋ก ๋งคํํ์ฌ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ๊ณผ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ขฐ์ฑ์ ํฅ์์ํต๋๋ค.
์ฝ๋ ์์ : ์ค์ ์ ์ฉ ์ฌ๋ก
์์ 1: Record๋ฅผ ์ฌ์ฉํ ๊ตฌ์ฑ ๊ฐ์ฒด
const config = #{
apiUrl: "https://api.example.com",
timeout: 5000,
maxRetries: 3
};
function fetchData(url) {
// ์ค์ ๊ฐ ์ฌ์ฉ
console.log(`Fetching data from ${config.apiUrl + url} with timeout ${config.timeout}`);
// ... ๋๋จธ์ง ๊ตฌํ
}
fetchData("/users");
์์ 2: Tuple์ ์ฌ์ฉํ ์ง๋ฆฌ์ ์ขํ
const latLong = #[34.0522, -118.2437]; // ๋ก์ค์ค์ ค๋ ์ค
function calculateDistance(coord1, coord2) {
// ์ขํ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฑฐ๋ฆฌ ๊ณ์ฐ ๊ตฌํ
const [lat1, lon1] = coord1;
const [lat2, lon2] = coord2;
const R = 6371; // ์ง๊ตฌ์ ๋ฐ์ง๋ฆ(km)
const dLat = deg2rad(lat2 - lat1);
const dLon = deg2rad(lon2 - lon1);
const a = Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) *
Math.sin(dLon/2) * Math.sin(dLon/2);
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
const distance = R * c;
return distance; // ๊ฑฐ๋ฆฌ(ํฌ๋ก๋ฏธํฐ)
}
function deg2rad(deg) {
return deg * (Math.PI/180)
}
const londonCoords = #[51.5074, 0.1278];
const distanceToLondon = calculateDistance(latLong, londonCoords);
console.log(`๋ฐ๋๊น์ง์ ๊ฑฐ๋ฆฌ: ${distanceToLondon} km`);
์์ 3: Record๋ฅผ ์ฌ์ฉํ Redux ์ํ
๊ฐ์ํ๋ Redux ์ค์ ์ ๊ฐ์ ํฉ๋๋ค:
const initialState = #{
user: null,
isLoading: false,
error: null
};
function reducer(state = initialState, action) {
switch (action.type) {
case 'FETCH_USER_REQUEST':
return #{ ...state, isLoading: true };
case 'FETCH_USER_SUCCESS':
return #{ ...state, user: action.payload, isLoading: false };
case 'FETCH_USER_FAILURE':
return #{ ...state, error: action.payload, isLoading: false };
default:
return state;
}
}
์ฑ๋ฅ ๊ณ ๋ ค์ฌํญ
Record์ Tuple์ ์์ ๋น๊ต๋ฅผ ํตํด ์ฑ๋ฅ์์ ์ด์ ์ ์ ๊ณตํ์ง๋ง, ํนํ ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ๋ด์์ ์ด๋ฌํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์์ฑํ๊ณ ์กฐ์ํ ๋ ์ ์ฌ์ ์ธ ์ฑ๋ฅ ์ํฅ์ ์ธ์งํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์๋ก์ด Record๋ Tuple์ ์์ฑํ๋ ค๋ฉด ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํด์ผ ํ๋ฏ๋ก, ๊ฒฝ์ฐ์ ๋ฐ๋ผ ๊ธฐ์กด ๊ฐ์ฒด๋ ๋ฐฐ์ด์ ๋ณ๊ฒฝํ๋ ๊ฒ๋ณด๋ค ๋น์ฉ์ด ๋ ๋ง์ด ๋ค ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ถ๋ณ์ฑ์ด ์ฃผ๋ ์ด์ ๋๋ฌธ์ ์ด๋ฌํ ํธ๋ ์ด๋์คํ๋ ์ข ์ข ๊ฐ์น๊ฐ ์์ต๋๋ค.
์ฑ๋ฅ์ ์ต์ ํํ๊ธฐ ์ํด ๋ค์ ์ ๋ต์ ๊ณ ๋ คํ์ญ์์ค:
- ๋ฉ๋ชจ์ด์ ์ด์ (Memoization): ๋ฉ๋ชจ์ด์ ์ด์ ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ Record ๋ฐ Tuple ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ๋น์ฉ์ด ๋ง์ด ๋๋ ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ์บ์ํฉ๋๋ค.
- ๊ตฌ์กฐ์ ๊ณต์ (Structural Sharing): ์๋ก์ด ๋ถ๋ณ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค ๋ ๊ธฐ์กด ๊ตฌ์กฐ์ ์ผ๋ถ๋ฅผ ์ฌ์ฌ์ฉํ๋ ๊ตฌ์กฐ์ ๊ณต์ ๋ฅผ ํ์ฉํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ณต์ฌํด์ผ ํ๋ ๋ฐ์ดํฐ์ ์์ ์ค์ผ ์ ์์ต๋๋ค. ๋ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋ณธ ๋ฐ์ดํฐ์ ๋๋ถ๋ถ์ ๊ณต์ ํ๋ฉด์ ์ค์ฒฉ๋ ๊ตฌ์กฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ ๋ฐ์ดํธํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
- ์ง์ฐ ํ๊ฐ(Lazy Evaluation): ํนํ ๋์ฉ๋ ๋ฐ์ดํฐ์ ์ ๋ค๋ฃฐ ๋, ๊ณ์ฐ์ด ์ค์ ๋ก ํ์ํ ๋๊น์ง ์ฐ๊ธฐํฉ๋๋ค.
๋ธ๋ผ์ฐ์ ๋ฐ ๋ฐํ์ ์ง์
ํ์ฌ ๋ ์ง(2023๋ 10์ 26์ผ)๋ฅผ ๊ธฐ์ค์ผ๋ก, Record์ Tuple์ ์ฌ์ ํ ECMAScript ํ์คํ ๊ณผ์ ์ ์๋ ์ ์ ๋จ๊ณ์ ๋๋ค. ์ด๋ ๋๋ถ๋ถ์ ๋ธ๋ผ์ฐ์ ๋ Node.js ํ๊ฒฝ์์ ์์ง ๋ค์ดํฐ๋ธ๋ก ์ง์๋์ง ์์์ ์๋ฏธํฉ๋๋ค. ์ค๋๋ ์ฝ๋์์ Record์ Tuple์ ์ฌ์ฉํ๋ ค๋ฉด Babel๊ณผ ๊ฐ์ ํธ๋์คํ์ผ๋ฌ์ ์ ์ ํ ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
Babel์ ์ค์ ํ์ฌ Record์ Tuple์ ์ง์ํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- Babel ์ค์น:
npm install --save-dev @babel/core @babel/cli @babel/preset-env
- Record ๋ฐ Tuple Babel ํ๋ฌ๊ทธ์ธ ์ค์น:
npm install --save-dev @babel/plugin-proposal-record-and-tuple
- Babel ๊ตฌ์ฑ (`.babelrc` ๋๋ `babel.config.js` ํ์ผ ์์ฑ):
์์ `.babelrc`:
{ "presets": ["@babel/preset-env"], "plugins": ["@babel/plugin-proposal-record-and-tuple"] }
- ์ฝ๋ ํธ๋์คํ์ผ๋ง:
babel your-code.js -o output.js
`@babel/plugin-proposal-record-and-tuple` ํ๋ฌ๊ทธ์ธ์ ๊ณต์ ๋ฌธ์๋ฅผ ํ์ธํ์ฌ ์ต์ ์ค์น ๋ฐ ๊ตฌ์ฑ ์ง์นจ์ ํ์ธํ์ธ์. ์ฝ๋๊ฐ ์ฝ๊ฒ ์ด์ ๋๊ณ ๋ค๋ฅธ ์ปจํ ์คํธ์์ ํจ๊ณผ์ ์ผ๋ก ์๋ํ๋๋ก ๊ฐ๋ฐ ํ๊ฒฝ์ ECMAScript ํ์ค์ ๋ง์ถ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
๋ค๋ฅธ ๋ถ๋ณ ๋ฐ์ดํฐ ๊ตฌ์กฐ์์ ๋น๊ต
์๋ฐ์คํฌ๋ฆฝํธ์๋ ์ด๋ฏธ Immutable.js๋ Mori์ ๊ฐ์ด ๋ถ๋ณ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํ๋ ๊ธฐ์กด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ต๋๋ค. ๊ฐ๋จํ ๋น๊ต๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- Immutable.js: List, Map, Set์ ํฌํจํ ๊ด๋ฒ์ํ ๋ถ๋ณ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํ๋ ์ธ๊ธฐ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ์ฑ์ํ๊ณ ์ ํ ์คํธ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด์ง๋ง, ์์ฒด API๋ฅผ ๋์ ํ์ฌ ์ง์ ์ฅ๋ฒฝ์ด ๋ ์ ์์ต๋๋ค. Record์ Tuple์ ์ธ์ด ์์ค์์ ๋ถ๋ณ์ฑ์ ์ ๊ณตํ์ฌ ๋ ์์ฐ์ค๋ฝ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค.
- Mori: Clojure์ ์์์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ๋ถ๋ณ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. Immutable.js์ ๋ง์ฐฌ๊ฐ์ง๋ก ์์ฒด API๋ฅผ ๋์ ํฉ๋๋ค.
Record์ Tuple์ ์ฃผ์ ์ด์ ์ ์ธ์ด์ ๋ด์ฅ๋์ด ์์ด ๊ฒฐ๊ตญ ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์์ ๋ค์ดํฐ๋ธ๋ก ์ง์๋ ๊ฒ์ด๋ผ๋ ์ ์ ๋๋ค. ์ด๋ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ์์ฑ์ ์์ ๊ณ ๋ถ๋ณ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์๋ฐ์คํฌ๋ฆฝํธ์ ์ผ๊ธ ์๋ฏผ์ผ๋ก ๋ง๋ญ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๋ฏธ๋
Record์ Tuple์ ๋์ ์ ์๋ฐ์คํฌ๋ฆฝํธ์ ์ค์ํ ์ง์ ์ ๋ํ๋ด๋ฉฐ, ๋ถ๋ณ์ฑ์ ์ด์ ์ ์ธ์ด์ ํต์ฌ์ผ๋ก ๊ฐ์ ธ์ต๋๋ค. ์ด๋ฌํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ๋ ๋๋ฆฌ ์ฑํ๋จ์ ๋ฐ๋ผ, ์ฐ๋ฆฌ๋ ๋ ํจ์ํ์ด๊ณ ์์ธก ๊ฐ๋ฅํ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ก์ ์ ํ์ ๊ธฐ๋ํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
Record์ Tuple์ ์ฑ๋ฅ, ํ์ ์์ ์ฑ ๋ฐ ์ฝ๋ ์ ์ง ๊ด๋ฆฌ ์ธก๋ฉด์์ ์๋นํ ์ด์ ์ ์ ๊ณตํ๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ๊ฐ๋ ฅํ ์๋ก์ด ์ถ๊ฐ ๊ธฐ๋ฅ์ ๋๋ค. ์์ง ์ ์ ๋จ๊ณ์ด์ง๋ง, ์ด๋ค์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๋ฏธ๋ ๋ฐฉํฅ์ ๋ํํ๋ฉฐ ํ์ํ ๊ฐ์น๊ฐ ์ถฉ๋ถํฉ๋๋ค.
Record์ Tuple๋ก ๋ถ๋ณ์ฑ์ ์์ฉํจ์ผ๋ก์จ ๋ ๊ฒฌ๊ณ ํ๊ณ ํจ์จ์ ์ด๋ฉฐ ์ ์ง ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๊ธฐ๋ฅ์ ๋ํ ์ง์์ด ์ฆ๊ฐํจ์ ๋ฐ๋ผ ์ ์ธ๊ณ ๊ฐ๋ฐ์๋ค์ ์ด๋ค์ด ์๋ฐ์คํฌ๋ฆฝํธ ์ํ๊ณ์ ๊ฐ์ ธ์ค๋ ์ ๋ขฐ์ฑ๊ณผ ์์ธก ๊ฐ๋ฅ์ฑ์ ์ฆ๊ฐ๋ก ํํ์ ๋ณผ ๊ฒ์ ๋๋ค.
Record์ Tuple ์ ์์ ๋ํ ์ ๋ฐ์ดํธ๋ฅผ ๊ณ์ ์ง์ผ๋ณด๊ณ ์ค๋ ๋ฐ๋ก ์ฌ๋ฌ๋ถ์ ํ๋ก์ ํธ์์ ์คํ์ ์์ํด ๋ณด์ธ์! ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ฏธ๋๋ ๊ทธ ์ด๋ ๋๋ณด๋ค ๋ ๋ถ๋ณํด ๋ณด์ ๋๋ค.