02. ES6+ 필수 문법 - 구조 분해, 스프레드, 템플릿 리터럴
이 편에서 다루는 세 가지 문법(구조 분해, 스프레드, 템플릿 리터럴)은 Redux 리듀서 코드 어디에나 등장합니다. “원본은 그대로 두고 새 값을 만든다"는 08편의 불변성 원칙을 실제 코드로 표현하는 도구가 바로 이것입니다.
학습 목표
- 구조 분해 할당으로 객체·배열에서 필요한 값만 꺼낼 수 있다.
- 스프레드 연산자로 원본을 바꾸지 않고 새 객체·배열을 만들 수 있다.
- 템플릿 리터럴로 가독성 좋은 문자열을 조합할 수 있다.
구조 분해 할당: 필요한 값만 꺼낸다
**구조 분해 할당(Destructuring Assignment)**은 객체나 배열에서 필요한 값만 변수로 꺼내는 문법입니다.
| |
role = "guest"처럼 기본값을 지정하면, 해당 속성이 없을 때만 기본값이 사용됩니다. 배열에서도 순서 기반으로 구조 분해할 수 있습니다.
| |
React 컴포넌트에서 useSelector, useDispatch의 반환값이나 props를 다룰 때 구조 분해를 거의 항상 사용하게 됩니다(12편에서 다룹니다).
스프레드 연산자: 원본을 바꾸지 않고 복사·병합한다
**스프레드 연산자(...)**는 객체나 배열의 내용을 펼쳐서 새로운 객체·배열에 담습니다.
| |
이 패턴 { ...state, someField: newValue }가 Redux 리듀서의 가장 흔한 형태입니다. 배열에도 동일하게 적용됩니다.
| |
주의: 스프레드는 **얕은 복사(shallow copy)**입니다. 중첩된 객체까지 복사하지 않습니다.
| |
중첩된 값을 안전하게 바꾸려면 중첩 단계마다 스프레드를 적용해야 합니다.
| |
이 “얕은 복사의 함정"은 08편(불변성)에서 다시 자세히 다룹니다.
나머지 매개변수: 가변 인자를 배열로 받는다
**나머지 매개변수(Rest Parameter)**는 함수가 임의 개수의 인자를 배열로 받게 해줍니다. 구조 분해의 ...rest와 문법은 같지만 위치가 다릅니다.
| |
템플릿 리터럴: 문자열을 조합한다
템플릿 리터럴은 백틱(`)으로 감싸고 ${} 안에 표현식을 넣어 문자열을 조합합니다.
| |
Redux 액션 타입을 "cart/itemAdded"처럼 도메인/이벤트 형식으로 짓는 관례가 많은데, 템플릿 리터럴을 쓰면 오타 없이 일관되게 조합할 수 있습니다.
흔한 실수
- 스프레드가 깊은 복사라고 착각하는 실수: 중첩 객체는 참조가 공유되므로, 중첩된 부분을 바꾸려면 중첩 단계마다 스프레드해야 합니다.
- 배열 스프레드 순서를 잘못 배치해 값이 덮어써지는 실수:
{ ...defaults, ...overrides }처럼 나중에 오는 값이 우선한다는 규칙을 기억해야 합니다. - 구조 분해에서 기본값을
null에는 적용하지 못한다는 것을 모르는 실수: 기본값은 값이undefined일 때만 적용되고,null일 때는 적용되지 않습니다.
실무 체크리스트
- 객체를 업데이트할 때
{ ...state, field: value }패턴을 일관되게 쓰고 있는가? - 중첩된 객체를 업데이트할 때 중첩 단계마다 스프레드를 적용했는가?
- 스프레드로 여러 출처를 병합할 때 우선순위(나중에 오는 값이 이긴다)를 의도한 대로 배치했는가?
연습 과제
기초(★☆☆)
{ id: 1, name: "Kim", email: "kim@test.com" }에서 구조 분해로name만 꺼내고, 나머지 속성은rest라는 이름으로 한 번에 묶어보세요.
중급(★★☆)
{ user: { profile: { age: 20 } } }형태의 중첩 객체에서,age만 21로 바꾼 새 객체를 스프레드로 만들어보세요(원본은 그대로 유지).
고급(★★★)
- 여러 부분 상태 객체(
{ ...defaults },{ ...userPrefs },{ ...sessionOverrides })를 순서대로 병합해 최종 설정 객체를 만들고, 어떤 값이 최종적으로 우선하는지 규칙을 코드 주석으로 설명해보세요.
요약
- 구조 분해로 객체·배열에서 필요한 값만 명확하게 꺼낸다.
- 스프레드는 원본을 바꾸지 않고 새 객체·배열을 만들지만, 얕은 복사이므로 중첩 구조는 단계마다 펼쳐야 한다.
- 템플릿 리터럴로 문자열을 안전하고 읽기 쉽게 조합한다.
참고 문헌 및 출처(추천)
- MDN Web Docs, “Spread syntax (…)” — 스프레드 연산자의 정확한 동작 범위
- MDN Web Docs, “Destructuring assignment” — 구조 분해의 전체 문법
- ECMAScript 2015 (ES6) Language Specification — 스프레드·구조 분해 표준 정의
![Featured image of post [Redux] 02. ES6+ 필수 문법 - 구조 분해, 스프레드, 템플릿 리터럴](/post/redux/es6-essential-syntax/wordcloud_hu_3fce2aae3ac9a85a.webp)
![[Redux] 00. 커리큘럼 - 학습 로드맵](/post/redux/getting-started-redux/wordcloud_hu_2ed9b2e29c50fe99.webp)
![[Redux] 01. JavaScript 핵심 개념 - 변수, 함수, 객체](/post/redux/javascript-fundamentals/wordcloud_hu_6f9ecedd71e970c4.webp)
![[Redux] 02. ES6+ 필수 문법 - 구조 분해, 스프레드, 템플릿 리터럴](/post/redux/es6-essential-syntax/wordcloud_hu_18823cbc025345cb.webp)
![[Redux] 03. 배열과 객체 다루기 - map, filter, reduce](/post/redux/array-object-manipulation/wordcloud_hu_27392b9afcb1090c.webp)
![[Redux] 04. 비동기 JavaScript - Promise와 async/await](/post/redux/asynchronous-javascript/wordcloud_hu_ed18ead24b277c5.webp)
![[Technology] CRDT(Conflict-Free Replicated Data Types) 개요와 활용](/post/2024-08-29-crdt/wordcloud_hu_a8e3bf4599b75c3c.webp)
![[Hardware] LattePanda Alpha에 Ubuntu 16.04 LTS 설치 가이드](/post/2018-12-06-install-ubuntu-16.04-on-lattepanda/wordcloud_hu_fc536f8de2cbd4bf.webp)
![[CSS] 모던 CSS 완전 정복: 2015년처럼 CSS 쓰는 시대는 끝났다](/post/2026-02-23-modern-css-stop-writing-like-2015/wordcloud_hu_dd551dfa54409f84.webp)