매 주차 강의자료 시작에 PDF파일을 올려두었어요!
[수업 목표]
[목차]
모든 토글을 열고 닫는 단축키
Windows : Ctrl + alt + t
Mac : ⌘ + ⌥ + t
내 터미널 확인하기
터미널을 켜고 내 터미널이 bash인지 zsh인 지 확인해주세요!(상단에 서 확인할 수 있어요.)

homebrew를 설치하고(설치링크)
homebrew를 통해 nvm을 설치합시다.
brew install nvm
sudo curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.1/install.sh | bash설치 확인하기
아래 명령어를 입력해서 버전이 나오는 지 확인합니다. nvm: not found ~~가 나오면 4번으로 가서 환경변수를 설정하시고, 나오지 않는다면 설치 끝!
nvm --version
환경변수 설정하기
설정 파일 열기
vi 에디터로 설정 파일을 열어줍니다.
터미널이 bash일 경우,
vi ~/.bash_profile
터미널이 zsh일 경우,
vi ~/.zshrc
환경 변수를 추가하자 (잘못 만지면 안되는 중요한 파일이에요!! 조심조심하기! 기존에 있는 내용 지우면 절대절대절대 안됩니다!)
vi 에디터로 파일을 열면 방향키만 움직일 수 있을거예요!
i 키를 눌러서 입력 모드로 전환합니다.
방향키를 아래로 쭉쭉 내리고 맨 밑에서 엔터 두번!
아래 내용을 복사하고 붙여넣어줍니다.
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
저장하고 나가기
추가한 내용을 적용하자!
터미널이 bash일 경우,
source ~/.bash_profile
터미널이 zsh일 경우,
source ~/.zshrc
설치를 확인합니다.
nvm --version
프론트엔드의 꽃, 리액트!
리액트를 본격적으로 배우기 전에 꼭(X100) 알아야하는 기초 지식을 배워볼거예요.
빨리 리액트하러 가고 싶은 맘 저도 알고 있어요. 그래도 기초 지식은 소중하니까 꼭 듣고 가기! 😉
서버와 클라이언트, 복습하자!
이미 웹개발 종합반에서 서버와 클라이언트에 대해 배우신 분들은 아주 익숙하실 거예요. 아직 잘 모르셔도 괜찮습니다! 저랑 가볍게 한 번 훑어볼게요! 😉
웹의 동작 개념 자료
웹의 동작 개념 (HTML을 받는 경우)
네! 우리가 보는 웹페이지는 모두 서버에서 미리 준비해두었던 것을 "받아서",
"그려주는" 것입니다. 즉, 브라우저가 하는 일은 1) 요청을 보내고, 2) 받은 HTML 파일을 그려주는 일 뿐이죠.
근데, 1)은 어디에 요청을 보내냐구요? 좋은 질문입니다. 서버가 만들어 놓은 "API"라는 창구에 미리 정해진 약속대로 요청을 보내는 것이랍니다.
예) https://naver.com/
→ 이것은 "naver.com"이라는 이름의 서버에 있는, "/" 창구에 요청을 보낸 것!

웹의 동작 개념 (데이터만 받는 경우)
앗, 그럼 항상 이렇게 HTML만 내려주냐구요?
아뇨! 데이터만 내려 줄 때가 더~ 많아요.
사실 HTML도 줄글로 쓰면 이게 다 '데이터'아닌가요?
자, 공연 티켓을 예매하고 있는 상황을 상상해봅시다!
좌석이 차고 꺼질때마다 보던 페이지가 리프레시 되면 난감하겠죠ㅠ?
이럴 때! 데이터만 받아서 받아 끼우게 된답니다.

데이터만 내려올 경우는, 이렇게 생겼어요!
(소곤소곤) 이런 생김새를 JSON 형식이라고 한답니다.

그래서 서버랑 클라이언트가 뭐라고?
클라이언트는 우리가 웹사이트를 보는 도구(휴대폰, PC, 아x패드 ...)가 모두 클라이언트입니다.
서버는 우리가 보는 웹사이트에 뿌려줄 것(html이나 데이터)을 만들어서 클라이언트에 전달해주는 친구겠죠!
화면을 그리고

말그대로 화면을 그립니다. 눈에 보이는 부분을 만들어요.
어디에는 글이 들어가고, 어디에는 아이콘을 넣어주고 ..., 더 나아가서는 마우스를 올릴 때만 글자색을 바꿔주는 등의 작업(인터렉션을 준다고 해요!)도 해줍니다.
데이터를 끼얹는다!

서버에서 데이터를 가지고 와서 만든 화면에 착착 넣어주는 거예요.
생각만해도 벌써 두근두근하죠!
흔히 하는 오해 한 가지!
Q. 서버리스? 서버가 없어요? DB도 백엔드 개발도 안해도 되는건가?
A. 으악... 아니요! 서버는 필요하죠! 단지 서버를 내가 만들 필요 없다!가 맞아요.
서버... 있어? 그럼 서버리스가 뭘까?
우리가 서버를 구성할 때 EC2를 사고, 서버 설정을 해줬던 걸 기억하실 거예요! 그 설정을 미리 해둔 어떤 서버를 빌려다 쓰는 겁니다!
즉, 서버의 사양, 네트워크 설정 같은 게 미리 되어 있는 서버를 빌려 쓰니, 인프라 작업을 내가 안해도 된다는 겁니다.
+)
자세한 개념은 4주차에 예제와 함께 배울 거예요.
오늘은 서버리스는 백엔드리스가 아니라는 것만 알고 있으면 굳!!👍
HTML(Hypertext Markup Language)
HTML(Hypertext Markup Language)은 마크업 언어예요.
마크업이 뭐냐구요? 마크업은 이름 그대로 표시하는 거예요.
우리가 보는 웹페이지는 그림도 있고, 글도 있고 표도 있고, 여러가지 요소가 잔뜩 들어있죠!
"여기는 글자 영역이고 여기는 이미지 영역이야!"라고 표시해서 브라우저가 웹페이지를 잘 그릴 수 있도록 하는 게 HTML이랍니다. 🙂
모습 보기

힌트 : 사이트 제목을 바꿀 땐 에서 뭘 바꿔주면 될까요?
기억이 잘 나지 않는다면 호다닥 구글에게 물어보기!
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>오늘의 투두</title>
</head>
<body>
<h1>오늘 할 일</h1>
<div>
<h3>고양이 밥주기</h3>
<p>고양이 물, 사료 챙겨주기</p>
<button>완료</button>
</div>
<div>
<h3>장보기</h3>
<p>토마토, 계란, 초코렛 사기</p>
<button>완료</button>
</div>
<div>
<h3>코딩하기</h3>
<p>리액트 강의 1주차 듣기</p>
<button>완료</button>
</div>
</body>
</html>하세요
, 확인 ... 등등! Q. 이 친구들, 뭐라고 부르는 지 알고 있나요? → A. Tag? 비슷해요! 하지만, 땡! 틀렸습니다. 이 친구들은 요소(elements)라고 불러요. Q. 엇, 그럼 tag는 뭔가요? → A. tag는 요소를 만들 때 사용하는 <> 이 친구를 말해요. - (1) DOM **DOM(문서객체모델)을 아시나요?** DOM은 html 단위 하나하나를 객체로 생각하는 모델입니다. 예를 들면, 'div'라는 객체는 텍스트 노드, 자식 노드 등등, 하위의 어떤 값을 가지고 있겠죠? 이런 구조를 트리 구조라고 합니다. 네, 맞습니다! DOM이 트리구조란 소리입니다. - (2) dom 트리 확인하기 브라우저의 개발자 도구에서 하나씩 확인해봅시다. ([Cmd +Opt + i ](맥), [Ctrl + Shift + i / F12](윈도우)를 눌러 개발자 도구를 열 수 있어요.) ```jsx // 현재 dom 트리를 볼 수 있어요. document // dom 트리 중, body의 내용을 확인합니다. document.body // dom 트리 중, head의 내용을 확인합니다. document.head ``` - document와 body, head는 부모 - 자식 관계예요. body랑 head는 무슨 사이냐고요? 형제 관계입니다. (sibling이라고도 하죠!) - (3) 자식 요소에 접근하기 body 안에 들어 있는 요소에는 어떻게 접근하는 지 배워봅시다! - chilldNodes ```jsx document.body.childNodes ``` - children ```jsx document.body.children ``` - getElementsByTagName("태그 이름") ```jsx document.getElementsByTagName("div") ``` - 이 외에도 firstChild, lastChild 등등 자식 노드에 접근할 수 있는 방법은 많아요. MDN 문서([링크](https://developer.mozilla.org/ko/docs/Web/API/Document))에서 이런저런 접근 방법을 찾아보세요! - **[코드스니펫] MDN 문서 링크** ``` https://developer.mozilla.org/ko/docs/Web/API/Document ``` **[개발 이야기) HTML은 프로그래밍 언어인가?]** → 유명한 논쟁거리예요. 우리는 이미 답을 알고 있죠! 프로그래밍 언어는 어떤 연산을 수행하거나, 소프트웨어, 시스템을 동작하게 하는 언어고요. 즉, HTML은 프로그래밍 언어가 아니라 마크업 언어입니다.← CSS가 싫은 여러분,,
CSS는 꾸미기만 하면 장땡아닌가요? 맞아요! 하지만 덜 힘들게 잘 꾸며보려면 많이 아는 게 좋아요.
알아두면 좋은 몇 가지 개념만 빠르게 확인해봐요!
[코드스니펫] MDN 문서 링크
```
https://developer.mozilla.org/ko/docs/Web/API/Document
```
/* id selector */
**#**id { ... }
/* class selector */
**.**class { ... }
/* tag selector */
**tagName** { ... }
/* 여러 요소 선택하기 */
#id, .class { ... }
/* 수도 클래스 선택자 */
/* 어떤 요소가 특정 상태(마우스 올림, 포커스 됨 등등)일 때만 선택하게 해주는 선택자예요. */
**button**:hover { ... }
(1) ✍ 오늘의 TODO 꾸며보기
선택자를 마구마구 사용하셔서 예쁘게 꾸며봐요!
튜터와 달라도 OK!
- Q. 퀴즈설명
- 모습 보기

힌트: css 파일을 만들어도 좋고, todo.html에 넣어서 하셔도 좋아요. 저는 todo.html에 넣어서 해볼게요.
- A. 함께하기(완성본)
생각보다 재미있죠!
- **[코드스니펫] 오늘의 TODO HTML**
```html
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8" />
<title>오늘의 투두</title>
</head>
<body>
<style>
#title {
color: blue;
text-decoration: underline;
}
.todo-card {
border: 1px solid gray;
border-radius: 5px;
padding: 2em;
margin: 1em;
}
button:hover {
background-color: orange;
}
</style>
<h1 id="title">오늘 할 일</h1>
<div class="todo-card">
<h3>고양이 밥주기</h3>
<p>고양이 물, 사료 챙겨주기</p>
<button>완료</button>
</div>
<div class="todo-card">
<h3>장보기</h3>
<p>토마토, 계란, 초코렛 사기</p>
<button>완료</button>
</div>
<div class="todo-card">
<h3>코딩하기</h3>
<p>리액트 강의 1주차 듣기</p>
<button>완료</button>
</div>
</body>
</html>
```
#id, .class를 선택자라고 부르는데, { ... }은 뭐라고 부를까요?
선언부라고 부릅니다! 속성 : 값;으로 이루어져 있어요.

margin box:
가장 바깥 영역입니다. margin 속성을 주면 이 영역이 바뀌어요.
주로 다른 요소들과 간격을 줄 때 사용해요!
border box:
테두리 영역입니다. border 속성으로 테두리를 주면 이 영역이 바뀌어요.
padding box:
테두리와 콘텐츠 사이 영역입니다. padding 속성을 주면 이 영역이 바뀌어요.
박스 내부의 간격을 줄 때 사용해요!
contents box:
실제 콘텐츠 영역입니다. width, height 등으로 사이즈를 줄 수 있고, 따로 지정하지 않을 경우는 콘텐츠 내용(글이나 이미지 등)에 따라 임의로 사이즈가 잡혀요.
.todo-card {
border: 1px solid gray;
border-radius: 5px;
padding: 2em;
margin: 1em;
}
flex로 그리드 잡기
todo-card를 두 줄로 만들어봅시다!
```html
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8" />
<title>오늘의 투두</title>
</head>
<body>
<style>
#title {
color: blue;
text-decoration: underline;
}
.wrap {
display: flex;
}
.todo-card {
border: 1px solid gray;
border-radius: 5px;
padding: 2em;
margin: 1em;
flex: 1 1 0;
}
button:hover {
background-color: orange;
}
</style>
<h1 id="title">오늘 할 일</h1>
<div class="wrap">
<div class="todo-card">
<h3>고양이 밥주기</h3>
<p>고양이 물, 사료 챙겨주기</p>
<button>완료</button>
</div>
<div class="todo-card">
<h3>장보기</h3>
<p>토마토, 계란, 초코렛 사기</p>
<button>완료</button>
</div>
</div>
<div class="wrap">
<div class="todo-card">
<h3>코딩하기</h3>
<p>리액트 강의 1주차 듣기</p>
<button>완료</button>
</div>
<div class="todo-card">
<h3>코딩하기</h3>
<p>리액트 강의 1주차 듣기</p>
<button>완료</button>
</div>
</div>
</body>
</html>
```
flex 하나만 알아보았지만, 레이아웃을 잡을 때는 사실 table, block, grid 등 아주 다양한 방법을 사용해요. 다른 방법도 꼭 검색해보기!
(1) calc()
버튼 크기를 화면의 20%보다 20px 작게 바꿔봅시다!
```html
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8" />
<title>오늘의 투두</title>
</head>
<body>
<style>
#title {
color: blue;
text-decoration: underline;
}
.wrap {
display: flex;
}
.todo-card {
border: 1px solid gray;
border-radius: 5px;
padding: 2em;
margin: 1em;
flex: 1 1 0;
}
button {
width: calc(20% - 20px);
}
button:hover {
background-color: orange;
}
</style>
<h1 id="title">오늘 할 일</h1>
<div class="wrap">
<div class="todo-card">
<h3>고양이 밥주기</h3>
<p>고양이 물, 사료 챙겨주기</p>
<button>완료</button>
</div>
<div class="todo-card">
<h3>장보기</h3>
<p>토마토, 계란, 초코렛 사기</p>
<button>완료</button>
</div>
</div>
<div class="wrap">
<div class="todo-card">
<h3>코딩하기</h3>
<p>리액트 강의 1주차 듣기</p>
<button>완료</button>
</div>
<div class="todo-card">
<h3>코딩하기</h3>
<p>리액트 강의 1주차 듣기</p>
<button>완료</button>
</div>
</div>
</body>
</html>
```
사칙 연산하면 제일 중요한 게 있죠! 네, 바로 연산 순서입니다.
calc()는 아래 순서로 연산을 해요.
왼쪽에서 오른쪽으로,
곱셈, 나눗셈을 먼저, 덧셈, 뺄셈은 그 다음에!
괄호가 있으면 괄호 안쪽을 먼저 계산
CSS는 이 밖에도 아주 많은 내용이 있어요.
오늘은 정말 꼭 알아야 하는 내용만 함께 알아봤지만, 틈이 나는대로 MDN에서 CSS 문서(링크)를 살펴보세요. 많은 속성을 미리 알아둘수록 다양한 활용이 가능해요! 😉
이제 드디어 자바스크립트 시간입니다. 😍
자바스크립트로 DOM을 조작하는 방법, 궁금하시죠!
바닐라 자바스크립트로 해봅시다!
저는 오늘의 TODO에서 태그 안에 코드를 작성할거예요.
여러분은 별도의 .js 파일을 만들어서 하셔도 괜찮아요. 🙂
const wraps = document.getElementsByClassName("wrap");
console.log(wraps);const title = document.getElementById("title");
// 자바스크립트에서는 어떤 객체의 속성에 접근할 때 .을 이용해 접근할 수 있어요.
// title이라는 요소의 style 속성에 접근하려면 아래와 같이 title.style로 접근할 수 있습니다!
// style 안에 있는 속성에 접근할 때도 마찬가지예요. style.backgroundColor로 배경색 속성에 접근할 수 있어요.
title.style.backgroundColor = "yellow";function sayHello (event) {
console.log("hello");
}
const buttons = document.getElementsByTagName("button");
// 이 구문은 X! html collection은 유사 배열이기 때문에 array의 내장함수를 쓸 수 없어요!
//buttons.map(b => {
//console.log(b);
//});
for (let i=0; i< buttons.length; i++){
// .addEventListener()로 클릭 이벤트를 연결해줍니다.
buttons[i].addEventListener("click", sayHello);
} 어때요? 버튼을 누르면 콘솔 창에 hello라고 잘 나오고 있나요? 🙂모습 보기

힌트 : 클릭 이벤트는 앞서 배운 것처럼 addEventListener를 사용해도 되지만, 아래와 같이 작성하셔도 됩니다!
...
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8" />
<title>오늘의 투두</title>
</head>
<body>
<style>
#title {
color: blue;
text-decoration: underline;
}
.wrap {
display: flex;
}
.todo-card {
border: 1px solid gray;
border-radius: 5px;
padding: 2em;
margin: 1em;
flex: 1 1 0;
}
button {
width: calc(20% - 20px);
}
button:hover {
background-color: orange;
}
</style>
<h1 id="title">오늘 할 일</h1>
<div class="wrap">
<div class="todo-card">
<h3>고양이 밥주기</h3>
<p>고양이 물, 사료 챙겨주기</p>
<button onClick="changeBackgroundColor(0)">완료</button>
</div>
<div class="todo-card">
<h3>장보기</h3>
<p>토마토, 계란, 초코렛 사기</p>
<button>완료</button>
</div>
</div>
<div class="wrap">
<div class="todo-card">
<h3>코딩하기</h3>
<p>리액트 강의 1주차 듣기</p>
<button>완료</button>
</div>
<div class="todo-card">
<h3>코딩하기</h3>
<p>리액트 강의 1주차 듣기</p>
<button>완료</button>
</div>
</div>
<script>
const title = document.getElementById("title");
// 자바스크립트에서는 어떤 객체의 속성에 접근할 때 .을 이용해 접근할 수 있어요.
// title이라는 요소의 style 속성에 접근하려면 아래와 같이 title.style로 접근할 수 있습니다!
// style 안에 있는 속성에 접근할 때도 마찬가지예요. style.backgroundColor로 배경색 속성에 접근할 수 있어요.
title.style.backgroundColor = "yellow";
const wraps = document.getElementsByClassName("wrap");
console.log(wraps);
function sayHello (event) {
console.log("hello");
}
const buttons = document.getElementsByTagName("button");
// 이 구문은 X! html collection은 유사 배열이기 때문에 array의 내장함수를 쓸 수 없어요!
//buttons.map(b => {
//console.log(b);
//});
for (let i=0; i< buttons.length; i++){
// .addEventListener()로 클릭 이벤트를 연결해줍니다.
buttons[i].addEventListener("click", sayHello);
}
function changeBackgroundColor (index) {
// 가장 먼저 클래스 명으로 card들을 가지고 와봅시다! 아래 콘솔로 확인해보세요!
console.log(document.getElementsByClassName("todo-card"));
// 몇 번째 카드의 배경색을 바꿀 지 정해주었어요.
let card = document.getElementsByClassName("todo-card")[index];
// 그럼 바꿔봅시다! 저장 -> 브라우저로 돌아가 새로고침하면 확인할 수 있어요. :)
card.style.backgroundColor = "gray";
}
</script>
</body>
</html>// 새 요소를 만들어요.
const new_div = document.createElement("div");
// 한 눈에 확인해볼 수 있도록 스타일을 조금 추가해줄게요. 그냥 div는 눈에 안보일테니까요!
new_div.style.backgroundColor = "green";
new_div.style.width = "100px";
new_div.style.height = "100px";
// 요소를 body에 추가해줍시다.
document.body.appendChild(new_div);우리가 배울 React는 javascript 라이브러리입니다.
리액트를 다루기 위해 수업에 필요한 만큼만 ES6를 조금 알아볼까요! 🙌
ES6가 뭐냐구요?
자바스크립트 표준 문법 중 하나로 가장 보편화된 친구라고 생각해주세요!
var: 함수 단위
let: block 단위(변수: let으로 선언한 변수는 값이 변할 수 있습니다.)
const: block 단위(상수: 한번 선언한 값은 바꿀 수 없습니다.)
function scope(){
const a = 0;
let b = 0;
var c = 0;
// {} 증괄호 안에 든 내용을 블럭이라고 표현해요.
if(a === 0){
const a = 1;
let b = 1;
var c = 1;
console.log(a, b, c);
}
// 앗! c는 값이 변했죠?
// 그렇습니다. var는 함수 단위라서 if문 밖에서 선언한 값이 변했어요.
// let과 const로 선언한 겂은 어떤가요? if문 안쪽 내용이 바깥 내용에 영향을 끼치지 않죠?
console.log(a, b, c);
}
function do_something() { ... } 처럼 생긴 친구들을 말합니다.do_something()처럼 ()를 붙여주면 미리 만들어둔 코드 묶음이 실행되는 거예요.function do_something() { ... }// 함수 이름은 생략해도 괜찮아요!
let do_something = function [함수 이름]() { ... }// 화살표 함수는 함수 표현식의 단축형입니다.
// function까지 생력이 되었죠!
let do_something = () => { ... }class Cat {
// 생성자 함수
constructor(name) {
// 여기서 this는 이 클래스입니다.
this.name = name;
}
// 함수
showName(){
console.log(this.name);
}
}
// 여기서 new는 키워드예요. 새로운 무언가를 만들기 위해서 생성자 함수와 함께 씁니다.
// 네, new와 생성자 함수는 세트예요 :) (소근
let cat = new Cat('perl');
cat.showName();
console.log(cat);class Cat {
// 생성자 함수
constructor(name) {
// 여기서 this는 이 클래스입니다.
this.name = name;
}
// 함수
showName(){
console.log(this.name);
return this.name;
}
}
// extends는 Cat 클래스를 상속 받아 온단 뜻입니다.
class MyCat extends Cat {
// 생성자 함수
constructor(name, age) {
// super를 메서드로 사용하기
super(name);
this.age = age;
}
// 부모 클래스가 가진 것과 같은 이름의 함수를 만들 수 있습니다.
// 오버라이딩한다고 해요.
showName(){
console.log(this.name);
// super를 키워드로 사용하기
return '내 고양이 이름은 '+super.showName()+'입니다.';
}
showAge(){
console.log('내 고양이는 '+this.age+'살 입니다!');
}
}
let my_cat = new MyCat('perl', 4);
my_cat.showName();
my_cat.showAge();let array = [1,2,3,4,5];
// ... <- 이 점 3개를 스프레드 문법이라고 불러요.
// 배열 안에 있는 항목들(요소들)을 전부 꺼내준다는 뜻입니다.
// 즉 [...array]은 array에 있는 항목을 전부 꺼내
// 새로운 배열([] => 이 껍데기가 새로운 배열을 뜻하죠!)에 넣어주겠단 말입니다!
let new_array = [...array];
console.log(new_array);let info = {name: "mean0", id: 0};
let is_me = info.name === "mean0"? true : false;
console.log(is_me);
우리가 앞으로 정말정말(x100) 자주 쓸 Array의 내장 함수 4개를 함께 써봅시다! 😎
[그 전에 잠깐! 함수가 뭐더라?]
함수는 function do_something() { ... } 처럼 생긴 친구들을 말합니다.
어떤 코드의 묶음이고, do_something()처럼 ()를 붙여주면 미리 만들어둔 코드 묶음이 실행되는 거예요.
내장 함수는 우리가 만들지 않아도 자바스크립트가 쓰기 편하라고 미리 만들어둔 코드 묶음들이에요!
(1) map
map은 배열에 속한 항목을 변환할 때 많이 사용합니다.
어떤 배열에 속한 항목을 원하는 대로 변환하고, 변환한 값을 새로운 배열로 만들어줍니다.
즉, 원본 배열은 값이 변하지 않아요!
const array_num = [0, 1, 2, 3, 4, 5];
const new_array = array_num.map((array_item) =>{
return array_item + 1;
});
// 새 배열의 값은 원본 배열 원소에 +1 한 값입니다.
console.log(new_array);
// 원본 배열은 그대로 있죠!
console.log(array_num);
(2) filter
filter는 어떤 조건을 만족하는 항목들만 골라서 새 배열로 만들어주는 함수입니다.
원본 배열은 변하지 않고, 원하는 배열을 하나 더 만들 수 있다니 (최고)죠!
const array_num = [0, 1, 2, 3, 4, 5];
// forEach(콜백함수)
const new_array = array_num.filter((array_item) => {
// 특정 조건을 만족할 때만 return 하면 됩니다!
// return에는 true 혹은 false가 들어가야 해요.
return array_item > 3;
});
console.log(new_array);
(3) concat
concat은 배열과 배열을 합치거나 배열에 특정 값을 추가해주는 함수입니다!
원본 배열은 변하지 않아요!
const array_num01 = [0, 1, 2, 3];
const array_num02 = [3, 4, 5];
const merge = array_num01.concat(array_num02);
// 중복 항목(숫자 3)이 제거되었나요? 아니면 그대로 있나요? :)
console.log(merge);
concat은 중복 항목을 제거해주지 않아요!
다른 내장함수와 함께 사용해서 제거해야 합니다!
자바스크립트를 조금 다룰 줄 아는 분들을 위한 팁으로 제가 자주 사용하는 방법을 살짝 남겨둘게요. 😇
아직 자바스크립트에 익숙하지 않으신 분들은 그냥 이런게 있구나 하고 넘어가도 됩니다!
const array_num01 = [0, 1, 2, 3];
const array_num02 = [3, 4, 5];
// Set은 자바스크립트의 자료형 중 하나로,
// 중복되지 않는 값을 가지는 리스트입니다. :)!
// ... <- 이 점 3개는 스프레드 문법이라고 불러요.
// 배열 안에 있는 항목들(요소들)을 전부 꺼내준다는 뜻입니다.
// 즉 [...array_num01]은 array_num01에 있는 항목을 전부 꺼내
// 새로운 배열([] 이 껍데기가 새로운 배열을 뜻하죠!)에 넣어주겠단 말입니다!
const merge = [...new Set([...array_num01, ...array_num02])];
// 중복 항목(숫자 3)이 제거되었나요? 아니면 그대로 있나요? :)
console.log(merge);
(4) from
from은 쓰임새가 다양한 친구입니다. 🙂
-1) 배열로 만들고자 하는 것이나 **유사배열**을 복사해서 새로운 배열로 만들 때
-2) 새로운 배열을 만들 때 (초기화한다고도 표현해요.)
주로 사용합니다!
**유사배열이 뭘까?**
[ 어떤 값들... ] 이 모양으로 생겼지만 배열의 내장 함수를 사용하지 못하는 친구들입니다. DOM nodelist같은 게 유사배열이에요.
```jsx
// 배열화 하자!
const my_name = "mean0";
const my_name_array = Array.from(my_name);
console.log(my_name_array);
// 길이가 문자열과 같고, 0부터 4까지 숫자를 요소로 갖는 배열을 만들어볼거예요.
const text_array = Array.from('hello', (item, idx) => {return idx});
console.log(text_array);
// 새 배열을 만들어 보자!(=> 빈 배열을 초기화한다고도 해요.)
// 길이가 4고, 0부터 3까지 숫자를 요소로 갖는 배열을 만들어볼거예요.
const new_array = Array.from({length: 4}, (item, idx)=>{ return idx;});
console.log(new_array);
```
우리가 다뤄본 6가지 내장 함수 외에도 엄청 엄청 많은 내장함수가 있어요!
javascript 배열 내장함수로 검색해서 한 번 뭐가 있는 지 둘러보시면 정말 좋겠죠? 😎
+)
특히 저희는 이번 강의에서 다루지 않지만, reduce()라는 내장함수는 정말 유용한 친구예요.
꼭꼭 찾아보기!
(1) 배열에서 고양이가 몇 마리인지 세기 - map으로 해보자!
아래 for문을 map으로 바꿔봅시다.
[코드스니펫] animals 배열 1
```jsx
const animals = ["강아지", "고양이", "햄스터", "강아지", "고양이", "고양이", "토끼"];
```
const animals = ["강아지", "고양이", "햄스터", "강아지", "고양이", "고양이", "토끼"];
let count = 0;
for (let i = 0; i < animals.length; i++) {
let animal = animals[i];
if (animal === "고양이") {
count += 1;
}
}
console.log(count);
정답 확인하기
const animals = ["강아지", "고양이", "햄스터", "강아지", "고양이", "고양이", "토끼"];
let count = 0;
animals.map((animal) => {
if (animal === "고양이") {
count += 1;
}
});
console.log(count);
(2) 배열에서 filter로 해보자!
고양이들만 새 배열에 넣어볼까요?
아래 for문을 보고 filter로 바꿔봐요!
[코드스니펫] animals 배열 2
```jsx
const animals = ["복슬 강아지", "검정 고양이", "노란 햄스터", "강아지", "노랑 고양이", "고양이", "흰 토끼"];
```
const animals = ["복슬 강아지", "검정 고양이", "노란 햄스터", "강아지", "노랑 고양이", "고양이", "흰 토끼"];
let cats = [];
for (let i = 0; i < animals.length; i++) {
let animal = animals[i];
// indexOf는 파라미터로 넘겨준 텍스트가 몇 번째 위치에 있는 지 알려주는 친구입니다.
// 파라미터로 넘겨준 텍스트가 없으면 -1을 반환해요!
// 즉 아래 구문은 고양이라는 단어를 포함하고 있니? 라고 묻는 구문이죠!
if (animal.indexOf("고양이") !== -1) {
cats.push(animal);
}
}
console.log(cats);
정답 확인하기
const animals = ["복슬 강아지", "검정 고양이", "노란 햄스터", "강아지", "노랑 고양이", "고양이", "흰 토끼"];
let cats = animals.filter((animal) => {
return animal.indexOf("고양이") !== -1;
});
console.log(cats);
(3) 두 배열을 합쳐보자! - concat으로 해보자!
아래 두 배열을 하나로 합쳐보세요!
- **[코드스니펫] concat 퀴즈**
```jsx
const dogs = ["검은 강아지", "노란 강아지", "흰 강아지"];
const cats = ["검은 고양이", "복슬 고양이", "노란 고양이"];
```
```jsx
const dogs = ["검은 강아지", "노란 강아지", "흰 강아지"];
const cats = ["검은 고양이", "복슬 고양이", "노란 고양이"];
```
- **정답 확인하기**
```jsx
const dogs = ["검은 강아지", "노란 강아지", "흰 강아지"];
const cats = ["검은 고양이", "복슬 고양이", "노란 고양이"];
const animals = dogs.concat(cats);
console.log(animals);
```
어떠셨나요? 배열의 내장 함수 사용하기 어렵지 않죠? 😎
NVM과 VSCode를 설치하셨나요? 안하셨다면 지금 바로 설치해주세요!
nvm --version 
14.17.5가 최신 LTS네요! 아래 명령어를 입력해서 node.js를 설치해볼까요? 14.17.5 버전을 다 설치해봅시다.nvm install [설치할 버전] 설치가 끝났다면 터미널에 아래 명령어를 입력해서 잘 설치 되었는 지 확인해봅시다!nvm ls # nvm으로 설치한 노드 버전 리스트 확인 명령어
node -v # 노드 버전 확인 명렁어
갓 설치한 14.17.5 버전에 화살표가 붙어 있는 게 보이시나요?nvm use [사용할 노드 버전]# npm으로 패키지를 설치할 때는 아래 명령어를 사용해요!
# 옵션은 필요한 경우에만 적어줍니다.
# npm install [옵션] [설치할 패키지 이름]
npm install -g yarn
# 이 명령어는 "npm으로 yarn을 컴퓨터 전체에 설치한다"는 뜻입니다.
# -g 옵션은 컴퓨터 전체에서 쓸 수 있게 한다는 뜻입니다. 잘 설치되었다면 아래처럼 yarn -v 명령어로 yarn의 버전을 확인하실 수 있을거예요!
yarn으로 패키지를 설치할 때는?yarn add [옵션] [설치할 패키지 이름]# 옵션 global은 전역에 이 패키지를 깔겠다는 뜻입니다.
yarn add global create-react-app# yarn create react-app [우리의 첫 리액트 프로젝트 이름]
# 우리가 설치한 create-react-app 패키지를 써서 프로젝트를 만들어요.
# 주의! 꼭 sparta_react 폴더 경로에서 입력해주세요!
yarn create react-app week-1 React에서는 프로젝트를 앱이라고 불러요. 리액트 프로젝트와 리액트 앱은 같은 말이니, 편하신 쪽으로 말씀하시면 됩니다. 프로젝트가 생성이 되면, sparta_react 폴더 아래에 week-1이라는 폴더가 생길 거예요.
지금은 모양이 이렇게 생겼다만 알아두시면 됩니다! 하나씩 천천히 배워가요! 설치가 끝났다면, 아래 명령어를 입력해서 우리의 첫 리액트 앱을 실행시켜봅시다!cd week-1 # week-1 폴더로 이동합니다.
yarn start 브라우저가 열리고 우리의 첫 리액트 앱이 실행되었습니다. 🙂 
// 엇? 파이썬에서 뷰티풀스프를 불러올 때 본 것 같기도 하죠?
// *react*에서도 다른 패키지를 불러다 쓸 수 있습니다!
// import [패키지명] from [경로] 이 형식으로 불러와요.
import React from 'react';
// js 파일 뿐 아니라 이미지도 가능가능!
import logo from './logo.svg';
// css? 가능!
import './App.css';
function App() {
return (
<div className="App">
<header className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<p>
Edit <code>src/App.js</code> and save to reload.
</p>
<a
className="App-link"
href="https://reactjs.org"
target="_blank"
rel="noopener noreferrer"
>
Learn React
</a>
</header>
</div>
);
}
export default App;HTML을 품은 JS === JSX!
아래 같은 HTML 태그는 .js 파일 안에서 쓸 수 없어요.
```html
<div>
<h1>안녕하세요!</h1>
<p>시작이 반이다!</p>
</div>
```
그래서 나온 게 JSX입니다.
자바스크립트 안에서 **html 태그같은 마크업**을 넣어 뷰(UI) 작업을 편하게 할 수 있죠!
```jsx
const start_half = <div>
<h1>안녕하세요!</h1>
<p>시작이 반이다!</p>
</div>;
```
**그럼 JSX에서 쓰는 <div>~~</div>는 DOM 요소인가요?**
정확히는 React 요소예요! 차이가 뭐냐구요?
이건 다음주차에서 **가상돔**을 배우면서 조금 더 자세히 이야기해볼테니, 지금은 리액트 돔을 구성하는 건 **리액트 요소! 돔을 구성하는 건 돔 요소!** 라고만 알아둡시다.
어때요? 아직 아리송한가요?
괜찮아요! 써보면 느낌이 올거니까!
태그는 꼭 닫아주기
App.js 파일에서 실습합니다! (오류를 내면서 해보는 거예요!)
하이라이트 된 부분은 지워주세요.

// input 태그를 닫지 않고 넣어볼거예요!
function App() {
return (
<div className="App">
<input type='text'>
</div>
);
}

JSX 문법에 맞지 않는다고 에러가 납니다! 아래처럼 /를 추가하고 브라우저를 새로고침 해봅시다.
<input type='text'/>
무조건 1개의 엘리먼트를 반환하기
이번엔 return 아래에 p태그를 하나 추가해볼까요?
return (
<p>안녕하세요! 리액트 반입니다 :)</p>
<div className="App">
<input type='text'/>
</div>
);

앗! 또 에러가 나네요! 컴포넌트에서 반환할 수 있는 엘리먼트는 1개입니다. 아래와 같이 바꾸고 다시 새로고침 해보세요.
return (
<div className="App">
<p>안녕하세요! 리액트 반입니다 :)</p>
<input type='text'/>
</div>
);
JSX에서 javascript 값을 가져오려면?
중괄호를 쓴다!
const cat_name = 'perl';
// return 부분만 복사해서 붙여넣고 크롬 브라우저로 돌아가 새로고침 해봅시다.
return (
<div>
hello {cat_name}!
</div>
);
값을 가져올 때 뿐만 아니라, map, 삼항연산자 등 자바스크립트 문법을 JSX 안에 쓸 때도 {}를 이용할 수 있어요. 해볼까요?😎
import React from 'react';
import logo from './logo.svg';
import './App.css';
function App() {
const number = 1;
return (
<div className="App">
<p>안녕하세요! 리액트 반입니다 :)</p>
{/* JSX 내에서 코드 주석은 이렇게 씁니다 :) */}
{/* 삼항 연산자를 사용했어요 */}
<p>{number > 10 ? number+'은 10보다 크다': number+'은 10보다 작다'}</p>
</div>
);
}
export default App;
class 대신 className!
처음부터 약간 거슬리던 친구가 있지 않나요?
<div className="App">
JSX로 작성하는 태그 내에서 클래스 명을 정해줄 땐 속성 값을 className으로 사용합니다. class대신에요!
+)
그럼 id도 설마..? 하셨나요? id는 그냥 id로 씁니다.
인라인으로 style 주기
html 태그에 스타일을 직접 넣던 거 기억하시나요? 거기에서 아주 조금 달라요!
css 문법 대신 json 형식으로 넣어주면 끝!
HTML
<p style="color: orange; font-size: 20px;">orange</p>
JSX
// 중괄호를 두 번 쓰는 이유? 딕셔너리도 자바스크립트니까요!
// 이렇게 쓰거나,
<p style={{color: 'orange', fontSize: '20px'}}>orange</p>
//혹은 스타일 딕셔너리를 변수로 만들고 쓸 수 있어요!
function App() {
const styles = {
color: 'orange',
fontSize: '20px'
};
return (
<div className="App">
<p style={styles}>orange</p>
</div>
);
}

import React from 'react';
import logo from './logo.svg';
import './App.css';
function App() {
const styles = {
border: '1px solid #eee',
padding: '20px',
display: 'flex',
width: '100vw',
maxWidth: '400px',
margin: '30px auto',
flexDirection: 'column'
};
return (
<div className="App">
<div style={styles}>
<h1 style={{ color: 'green' }}>안녕하세요!</h1>
<hr style={{width: '100%'}}/>
<p style={{ textAlign: 'left' }}>이름을 입력해주세요.</p>
<input type="text"/>
</div>
</div>
);
}
export default App;오늘 숙제는 2개예요. 🙂
1. 아래 기획서를 보고, 새로운 오늘의 TODO 페이지를 만들어보세요!
(HTML과 바닐라 JS, CSS만 사용해서 해봅시다.



우리가 배운 내용으로 위 페이지를 만들어봅시다.
이미지도 넣어보고, 내 친구가 이름을 넣을 텍스트 입력 인풋과 시작하기 버튼을 만들어요.
[나는 {} 에 대해서...]부분에 {}는 state에 넣고 prop로 넘겨서 해보세요!
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8" />
<title>오늘의 투두</title>
</head>
<body>
<style>
#title {
color: blue;
text-decoration: underline;
}
.wrap {
display: flex;
align-items: center;
}
.todo-card {
border: 1px solid gray;
border-radius: 5px;
padding: 2em;
margin: 1em;
flex: 1 1 0;
}
button {
width: 100px;
}
button:hover {
background-color: orange;
}
</style>
<h1 id="title">오늘 할 일</h1>
<div class="wrap">
<div class="card-list">
</div>
<div class="add">
<input id="add-input" />
<button onClick="addCard()">추가하기</button>
</div>
</div>
<script>
// 완료하기 함수
// button에 추가해줄 거예요!
function completeTodo(e) {
// 어떤 버튼을 눌렀는 지 타겟을 가져와요.
console.log(e.target);
// 부모(투두 카드겠죠!)를 찾아봅니다.
console.log(e.target.parentElement);
// 배경색을 바꿔줍시다.
e.target.parentElement.style.backgroundColor = "green";
}
// 투두 카드를 추가하는 함수
function addCard() {
// 투두를 감싸는 div 만들고 클래스 이름을 줍니다.
const new_todo = document.createElement("div");
new_todo.className = "todo-card";
// 투두 안에 들어갈 타이틀과 버튼을 만들어요.
const title = document.createElement("h3");
title.textContent = document.getElementById("add-input").value;
const button = document.createElement("button");
button.textContent = "완료";
// 만든 버튼에 완료하기 함수를 연결해줘요.
button.addEventListener("click", completeTodo);
// 타이틀과 버튼을 투두에 추가해주고,
new_todo.appendChild(title);
new_todo.appendChild(button);
// 목록에 투두를 추가해줘요.
document.getElementsByClassName("card-list")[0].appendChild(new_todo);
}
</script>
</body>
</html>Copyright ⓒ TeamSparta All rights reserved.