이번 시간에는 state를 조금 더 연습해 보겠습니다.

컴포넌트 외부에 있는 무비 리스트를 state 안으로 옮겨보겠습니다.

class App extends Component {
//Render : componentWillMount() -> render() -> componentDidMount()
//Update : componentWillReceiveProps() -> shouldComponentUpdate() -> componentwillUpdate() -> render() -> componentDidUpdate
state = {
greeting: 'Hello React왕초보',
movies : [
{
title : "Matrix",
},
{
title : "Full Metal Jacket",
},
{
title : "Oldboy",
},
{
title : "Star Wars",
}
]
}

위와 같이 수정하자 아래와 같이 movies가 정의되지 않았다는 에러가 발생하였습니다.

Failed to compile.

./src/App.js
  Line 45:  'movies' is not defined  no-undef

Search for the keywords to learn more about each error.

app.js 의 아래 render 부분을 아래와 같이 수정하여주니 에러가 발생하지 않습니다.

render() {
return (
<div className="App">
{this.state.movies.map((movie, index) => {
return (
<Movie title={movie.title} poster={movie.poster} key={index} />
);
})}
</div>
);
}
}


여기에 영화 리스트에서 영화를 한 개 더 추가하고 싶을 때는 어떻게 해야 할까요?

일단 아래와 같이 comoponetDidMount 부분을 추가해봅시다.


componentDidMount(){
setTimeout(function(){
console.log('hello react 왕초보')
}, 1000)
}


1초 후에 console에서 아래와 같이 출력되는 것을 확인하실 수 있습니다.




이렇게 00초 후에 페이지 로드 후 , 어떤 작업을 수행시킬 수 있습니다.

하지만 위에 작성한 것은 예전 자바스크립트 문법입니다. function을 다 작성하지 않아도 됩니다.

아래와 같이 최신 자바스크립트 문법으로 가능합니다.

componentDidMount(){
setTimeout(() => {
console.log('hello react 왕초보')
}, 1000)
}


이제 진짜 영화 리스트를 추가해 보겠습니다.

componentDidMount(){
setTimeout(() => {
this.setState({
movies: [
...this.state.movies,
{
title: "신과함께",
}
]
});
}, 1000)
}

영화 제목  "신과함께" 을 추가해주었습니다. 아래와 같이 잘 출력되었습니다.




위에 코딩한 내용을 자세히 살펴보겠습니다.

컴포넌트가 mount하면 페이지 로드 후 1초 후에 새로운영화가 보여지게 되는 것입니다.

영화리스트에 영화를 추가하는 것입니다. 그런데 아래와 같이 해당코드를 삭제하게 되면

1초 후에 모든 영화가 사라지고 방금 추가한 영화만 남게 됩니다. 


...this.state.movies, 이 부분은 "이전 영화 리스트를 그대로 두고, 

그리고 한 개 영화를 추가"하라는 뜻입니다. 

이와 같이 state를 활용해서 응용을 하면 다양한 효과를 볼 수 있습니다.

예를 들면, 페이지를 로딩할 때 스크롤을 아래로 내릴수록 

더 많은 영화가 로딩되는 효과(infinite scroll)도 구현할 수 있습니다.

끝까지 스크롤하면 영화를 추가로 로딩해주는 것입니다. 페이스북에서도 이런 방식을 사용하고 있습니다. 

인스타그램도 동일합니다.


그럼 이제 아까 작성한 스크립트를 약간 변경해보겠습니다.

this.state.movies 부분 위치를 변경해보겠습니다. 시간도 5초로 변경하였습니다.

어떻게 될까요?

componentDidMount(){
setTimeout(() => {
this.setState({
movies: [
{
title: "신과함께",
},
...this.state.movies
]
});
}, 5000)
}






위에 캡쳐한 그대로 "신과함께"가 제일 위로 변경된 것을 확인하실 수 있습니다. 

오늘은 여기까지 하도록 하겠습니다. 고맙습니다.






이번 강의에서 배울 것은 state 입니다.

state는 리액트 컴포넌트 안에 있는 오브젝트입니다.

컴포넌트 안에 state가 바뀔 때마다, 컴포넌트는 다시 render 할 겁니다.

state를 작성해보겠습니다.

class App extends Component {
//Render : componentWillMount() -> render() -> componentDidMount()
//Update : componentWillReceiveProps() -> shouldComponentUpdate() -> componentwillUpdate() -> render() -> componentDidUpdate
state = {
greeting: 'Hello React왕초보'
}

render() {
return (
<div className="App">
{this.state.greeting}
{movies.map((movie, index) => {
return (
<Movie title={movie.title} poster={movie.poster} key={index} />
);
})}
</div>
);
}
}




컴포넌트가 mount되면 5초를 기다리고, greeting을 업데이트 할 겁니다.

그렇게 하기 위해서 setTimeout를 작성하겠습니다. 

state는 직접적으로 쓰면 안됩니다. 그렇기 때문에 this.setState 를 사용할 겁니다.

아래 코딩의 뜻은 Hello React왕초보를 출력하고 5초뒤에 Hello again으로 변경하라는 뜻입니다.


state = {
greeting: 'Hello React왕초보'
}

componentDidMount(){
setTimeout(() => {
this.setState({
greeting: 'Hello again!'
})
}, 5000)
}


저장하고 처음 출력되는 내용을 확인하시고 , 5초뒤에 잘 변경 되는지 확인해보시기 바랍니다. 







아래에 있는 state는 컴포넌트를 로드하는 방법입니다(디폴트 state와 함께 로드 됩니다.)

state = {
greeting: 'Hello React왕초보'
}


아래에 컴포넌트가 did mount한 후에는 5초 후에 hello again 으로 변경되도록 코딩을 한 것입니다.


componentDidMount(){
setTimeout(() => {
this.setState({
greeting: 'Hello again!'
})
}, 5000)
}


꼭 기억해야 할 것은 state를 바꿀 때는 setState를 설정하고, 

업데이트 할 때마다 새로운 state와 함께 render가 작동된다는 것입니다. 

코딩한 내용은 적었지만 state는 리액트의 중요한 문법 중에 하나입니다.

이후 시간에 state를 실전에서 쓰면서 이해가 더 잘 되실겁니다.

고맙습니다.








 



이번 시간에는 리액트의 컴포넌트 라이프싸이클에 대해서 배워 보겠습니다.

컴포넌트는 여러 기능들을 정해진 순서대로 실행합니다. 그것에 대해서 배워보겠습니다.

render를 할 때(컴포넌트를 띄울 때) 이 순서대로 실행될겁니다.


//Render : componentWillMount() -> render() -> componentDidMount()

첫번째는 componentWillMount
두번째는 render
세번째는 componentDidMount

이 싸이클은 자동으로 발생합니다. 

console.log 를 통해서 위 순서대로 실행되는지 확인해보겠습니다.


class App extends Component {
//Render : componentWillMount() -> render() -> componentDidMount()

//Update : componentWillReceiveProps() -> shouldComponentUpdate() -> componentwillUpdate() -> render() -> componentDidUpdate
componentWillMount() {
console.log('will mount')
}

componentDidMount(){
console.log("did mount");

}

render() {
console.log("did render");

return (
<div className="App">
{movies.map((movie, index) => {
return (
<Movie title={movie.title} poster={movie.poster} key={index} />
);
})}
</div>
);
}
}

export default App;


저장을 하고 크롬창에서 검사를 통해 확인해 보겠습니다. 아래와 같이 순서대로 출력되는 것을 확인하였습니다.




App.js:32 will mount
App.js:41 did render
App.js:36 did mount


예를 들어 , 영화앱과 같은 어플리케이션을 만든다면,  will mount를 진행할때 api에 작업을 요청할 겁니다.

해당 작업 수행이 완료되면, 그 다음에 did mountf 부분에서 데이터 관련된 작업을 하게 될겁니다.

이 싸이클을 알아두는게 유용한 이유는,  컴포넌트를 만드는데 도움이 되기 때문입니다.

will mount를 보면 사이클이 시작되었음을 알게될거고, 

render를 보면 이제 컴포넌트가 리액트에 존재하게 되었음을 알게 될겁니다.

did mount를 보면, 이제 성공적으로 리액트 컴포넌트가 자리잡았음을 알게 되는 것입니다.

update 조금 더 스텝이 많습니다.

첫번째는   componentWillReceiveProps 이건 컴포넌트가 새로운 props를 받았다는 뜻입니다.
두번째는   shouldComponentUpdate 리액트는 old props, 새로운 props를 살펴본 다음에, 
               이전과 새로운 prop가 다르면,  shouldComponentUpdate() = true 라고 생각할 겁니다. 
세번째는    componentwillUpdate
네번째는    render
다섯번째는 componentDidUpdate

이 순서를 잘 이해하면 나중에 컴포넌트를 빌드할 때 도움이 될 것입니다.

예를 들어 , component will update 수행할 때 
                 어플리케이션에 뱅글뱅글 돌아가는 spinner를 붙일 수 있을 겁니다.

업데이트 이 후에는, 돌고 있던 '로딩 중 ' 메세지나 아이콘을 숨기면 될 겁니다.

이론의 세부적인 것은 다루지 않을 것이고 앞으로 실전으로 바로 해보면서 배우게 될 예정입니다.


더 자세한 라이프사이클 관련 링크는 아래를 참고하세요. 고맙습니다.

저번시간에 만든 웹 페이지는 정상적으로 출력은 되지만 한 가지 에러가 있었습니다.





array에 있는 각 차일드는 반드시 고유한 key prop을 가져야 한다는 에러 내용입니다.

전 시간에 만들었던 App 컴포넌트에서 map 기능을 실행해서 

1개의 argument "movie"를 얻었습니다.

이번 시간에는 그 외에 index라는 것을 추가해 보도록 하겠습니다.

index는 우리가 현재 제공하는 리스트의 숫자를 의미합니다.

return을 하는 부분 마지막에 key prop으로 index를 작성하도록 하겠습니다.


class App extends Component {
render() {
return (
<div className="App">
{movies.map((movie, index) => {
return <Movie title={movie.title} poster={movie .poster} key={index}/>
})}
</div>
);
}
}


저장하고 새로 고침을 하게 되면 아래 화면과 같이 에러가 사라진 것을 확인하실 수 있습니다.






추가적으로 코딩을 하기 위해서는 prop-types 를 설치해야 합니다.

npm만 설치되어 있는 경우 npm으로 시작하는 명령어를 실행하시고, 

yarn을 사용하실 경우 아래 명령어를 참고하세요.

저는 yarn 명령어를 통해서 설치하였습니다.


Install Prop-Types with npm:

 npm install --save prop-types 

Install Prop-Types with Yarn:

 yarn add prop-types 





설치가 완료되었으면 Movie.js에 가서 PropTypes를 불러오시면 됩니다.

import 명령어로 불러올 수 있는데 아래 코드를 참고하시면 됩니다.

그리고 Movie 컴포넌트에  static propTypes를 추가해보도록 하겠습니다.



import React, { Component } from 'react';
import PropTypes from 'prop-types';
import './Movie.css';

class Movie extends Component {

static propTypes = {
title: PropTypes.string,
poster: PropTypes.string
}

render(){
return (
<div>
<MoviePoster poster={this.props.poster}/>
<h1>{this.props.title}</h1>
</div>
)
}
}


위와 같이 잘 입력하시고 저장하시면 전과 동일한 인터넷 창을 확인하실 수 있으실 겁니다.

굳이 동일한 화면이 출력되는데 왜 추가로 코딩을 했을까요?

그것은 prop-types를 통해서 prop의 type(형태)를 지정해 줄 수 있기 때문입니다.

만약 제가 title 이 숫자여야 한다고 지정하면 어떻게 될까요?

테스트를 해보기 위해서 아래와 같이 string 을 number 로 바꾸고 저장해보겠습니다.

static propTypes = {
title: PropTypes.number,
poster: PropTypes.string
}





위와 같이 에러가 발생하였습니다.

우리가 얻게 되는 정보가 '숫자'가 아니라는 것을 체크할 수 있습니다.

만약 부모 컴포넌트가 string 을 보내면, 

PropTypes 로 string 이라는 것을 체크할 수 있는 것입니다.

그게 '참'이 아니라면  위와 같이 에러 메세지를 받게 되는 것입니다.

덕분에 우리가 부모 컴포넌트에게서 받는 정보의 종류가 무엇인지 체크할 수 있습니다.

또한 이게 필수 required 인지 아닌지 알 수 있습니다.

'isRequired'라고 작성하면 Movie 컴포넌트는 title이라는 

prop을 제공하는 것이 필수로 설정되는 것입니다.



class Movie extends Component {
static propTypes = {
title: PropTypes.string.isRequired,
poster: PropTypes.string
};



이 상태에서는 에러가 발생하지 않을 것입니다. 

하지만 이 상태에서 타이틀을 지워버리면 어떻게 될까요?

아래와 같이 지워보고 결과를 확인해보겠습니다.

App.js 파일에서 아래와 같이 title 부분을 지워보세요.


class App extends Component {
render() {
return (
<div className="App">
{movies.map((movie, index) => {
return <Movie poster={movie .poster} key={index}/>
})}
</div>
);
}
}







위와 같이 에러가 발생한 것을 확인하실 수 있으실겁니다.

required 필수 조건인 prop이 없다고 에러 내용을 보여줍니다.

그래서  proptypes을 알아두면 편리합니다.

부모 컴포넌트에서 얻는 정보의 종류가 무엇인지, 있는지 없는지 알 수 있게 되는 것입니다.

추가적으로 코딩을 해보겠습니다. poster에도 isrequired 를 추가해줍니다.

컴포넌트 Movie poster 하단에도 PropTypes를 추가 작성하겠습니다.

poster 도 포스터 이미지를 반드시 보여줘야 하니 . poster에도 isrequired 를 추가해줍니다.



import React, { Component } from 'react';
import PropTypes from 'prop-types';
import './Movie.css';

class Movie extends Component {
static propTypes = {
title: PropTypes.string.isRequired,
poster: PropTypes.string.isRequired
};

render() {
return (
<div>
<MoviePoster poster={this.props.poster} />
<h1>{this.props.title}</h1>
</div>
);
}
}

class MoviePoster extends Component {
static propTypes = {
poster: PropTypes.string.isRequired
};

render() {
return <img src={this.props.poster} />;
}
}

export default Movie



향후에  API를 통해 정보를 불러온다면, 유저이름은 string이고 필수요건일 것입니다.

이상으로 이번 시간은 마치도록 하겠습니다. 고맙습니다.


이번 시간에는 우리가 갖고 있는 영화 정보를 토대로 리스트를 만들어 보겠습니다.


지난 시간에 만든 리스트는 효율적 이지는 않기 때문입니다. 

몇개의 영화를 갖고 있는지 모르는데 계속 복사 붙여넣기를 하면서 코딩을 할 수 없기 때문입니다. 

향후에 API에서 긁어온 엄청난 양의 영화정보를 불러오고 싶을 때 , 어떻게 해야 할까요?

이 것을 해결하기 위해서 array (정렬된 항목)를 만들겁니다.

 아래에서 코딩하는 작업 내용은 api에서 찾은 정보를 배열할 수 있는 array를 만드는 것입니다.

array를 만들기 전에 그 전 코딩 내용과 비교하기 위해서 전에 작성했었던 캡쳐파일을 확인해 보겠습니다.






위에 있던 movietitles 와 movieimages 그리고 App 컴포넌트 내용이 바뀌게 될 것입니다.



class App extends Component {
render() {
return (
<div className="App">

</div>
);
}
}

const movies 라는 array를  추가하였으며, App 컴포넌트에 불필요한 내용도 삭제해주었습니다.

이제 array를 살펴보면서 최종 목록(list) 를 만들겁니다.

div 다음에 movies를 작성합니다. array들은 'map'기능 이라는게 있습니다.

구글 검색 에서 array map 을 검색해 보세요. 아래 링크를 참조하시기 바랍니다.


링크로 들어가보시면 Array.map() 에 대한 데모 와 실제 수행되는 결과창을 확인하실 수 있습니다.




 Syntax도 확인할 수 있습니다.



 간단한 예제들도 확인할 수 있습니다.





이제는 다시 코딩하는 창으로 돌아와보겠습니다.

div 아래에 movies는 array입니다. 그 다음 map 기능을 통해 새로운 array를 만드는 것입니다.

class App extends Component {
render() {
return (
<div className="App">
{movies.map(movie => {
return <Movie title={movie.title} poster={movie .poster} />
})}
</div>
);
}
}

복잡해 보이지만 map은 간단한 기능입니다.

우리가 지금 하는 작업은 movies array를 가져다가 맵핑을 해서(map) 새로운 array를 만드는 것입니다.

해당 moives array 안의 엘러먼트를 활용해서 movie => 부분의 current , 현재 우리가 작업하고 있는 

movies array를 활용한다는 것이 포인트 입니다.

아까 syntax 부분을 보시면 current 부분이 우리가 작성한 movie 라는 것을 알 수 있습니다. 




이번 시간에 코딩한 부분은 적었지만 중요한 기능에 대해서 배웠습니다.

그 전 시간에 코딩했던 내용보다 훨씬 줄어들면서 

동일한 결과값을 map 기능을 통해서 얻을 수 있었습니다.

다음 시간에도 이어서 코딩을 해보도록 하겠습니다. 고맙습니다. 


리액트에는 2개의 주요 컨셉이 있습니다.  하나는 state, 나머지 하나는 props 입니다. 

이번 시간에는 props에 대한 실습을 해 보겠습니다.




App.js 파일에서는 빨간색으로 표시된 부분을 수정하였습니다.

영화리스트를 만들어 줍니다.  

matrix, full metal jacket, oldboy, star wars 를 추가하였습니다. 
(오타로 start wars라고 입력하였군요;;)

이 영화들의 제목을  자식 컴포넌트인 movie 컴포넌트에 보내고 싶으시면

 빨간색 네모 부분을 작성해주시면 됩니다. 





movie.js 파일에서도 빨간 부분을 작성해주시고 저장해주세요.

그 이후에 인터넷창에 가서 잘 전달되었는지 확인해 보겠습니다.





인터넷 창에서 오른쪽 마우스 누르시고 검사를 클릭하신 후에 console 을 클릭해주세요.

위 화면과 같이 App.js에서 입력한 영화 제목들이 잘 전달된 것을 확인하였습니다.

그럼 이번에는 실제로 영화포스터 이미지 밑에 영화 제목들이 들어가게 수정해보겠습니다.





위에 빨간 화면처럼 한줄만 추가해 주시면 

아래와 같이 영화포스터 이미지 밑에 영화제목들이 들어간 것을 확인하실 수 있습니다.






이번에는 영화 포스터 이미지를 만들어 보겠습니다.

기존에 있던 movies 부분을 movieTitles 로 변경하겠습니다. 

그리고 영화포스터 이미지 리스트를 아래와 같이 만들어 줍니다.

영화 이미지 주소는 구글에서 이미지 검색 후에 이미지 보기를 클릭 하시면 됩니다. 

그 이후에 주소창에 있는 주소를 그대로 붙여넣어주시면 됩니다.















이미지주소까지 잘 입력하셨으면, 

Movie.js 파일에서 Movie 컴포넌트와 MoviePoster 컴포넌트에도 

빨간 네모 부분을 수정해주시면 됩니다.






수정을 다 완료 하셨으면 아래와 같이 인터넷 창에서 

영화 제목, 영화 포스터 이미지가 잘 보실 수 있으실 겁니다.

props 구문은 리액트에서 많이 활용되는 부분이므로,

 앞으로도 자주 보시면서 익숙해지실 것이라고 생각됩니다. 고맙습니다.






 
리액트는 컴포넌트에 기반하고 있습니다.

영화 웹 서비스를 만들기 위해서 가장 먼저 컴포넌트를 정하는 일을 하겠습니다.

첫번째 컴포넌트는 '무비 리스트' 입니다.

빨간색의 큰 네모칸 입니다. 이 컴포넌트는 크고 기본에 해당하니깐  App 컴포넌트로 정하겠습니다.

두번째 컴포넌트는 'Movie'  컴포넌트 입니다.

왼쪽 위 쪽에 보라색 네모칸 입니다. 

세번째 컴포넌트는 'MoviePoster' 컴포넌트입니다.

보라색 안에 왼쪽에 있는 초록색 네모칸입니다. 




가장 기본이 되는 App 컴포넌트는 App.js 입니다. 

이미 생성되어 있기 때문에 편집을 하기만 하면 됩니다.

아래화면이 App 컴포넌트 입니다. 

빨간색 네모 부분을 보시면 자바스크립트 안에 html이 자리 잡고 있습니다.

이것을 JSX 라고 부릅니다. JSX는 리액트 컴포넌트를 만들  때 사용하는 언어입니다. 




이제 코딩을 시작해보겠습니다. 

App.js 를 선택하고 불필요한 내용들은 아래 화면과 같이 지워주겠습니다. 

App.css 파일도 아래화면과 같이 지워줍니다.







지우신 후에 인터넷창에 localhost:3000 주소로 가보시면 

화면에 아무것도 없는 것을 확인하실 수 있으실 겁니다.

이론적인 것을 잠깐 말씀드리면 모든 컴포넌트는 render function을 가지고 있습니다.

render 기능은 무엇인가를 보여주는, 출력하는 기능을 합니다.

create react app에서 제공하는 웹서버를 npm start 명령어로 실행하게 되면,

JS의 모든 코드를 가져와서 html 파일에 담습니다. 

그 파일은 public 폴더 안에 있는 index.html 파일입니다. 

빨간줄 부분을 Movie App 으로 수정하였습니다.




index.html 파일에서  불필요한 주석 내용들은 지워줍니다.

그리고 App.js 파일에 가서 아래와 같이 입력하고 저장하면 

인터넷 창에 정상적으로 출력되는 것을 확인하실 수 있습니다.




저희는 지금 index.html 파일과 App.js 파일만 수정해서 위와 같은 결과를 출력할 수 있었습니다.

하지만 저희가 코딩하고 있는 파일은 사실 index.js 파일입니다. 

아래 화면이 index.js 파일입니다.




index.js는 react  ,reactDOM, css, App 컴포넌트를 불러옵니다. 

가장 위에 import 구문을 참고하세요.

그리고 위 화면에서 아래 명령어 부분을 보면 

ReactDOM이 App 컴포넌트를 출력 하라고 되어 있습니다. 

출력하는 화면은 root 라고 지정된 곳에 하라고 되어 있습니다. 

root는 index.html 에서 확인할 수 있습니다. 아래 화면을 참고하세요. 





이제 Movie 컴포넌트를 만들어 보도록 하겠습니다. 

아래와 같이 새 파일을 클릭해서 Movie.js 파일과 Movie.css 파일을 만들어 줍니다.

Movie.css는 이번시간에 편집은 안하지만 일단 같이 만들어주세요.





 
Movie.js 파일을 아래와 같이 내용을 채워 보세요.

App.js 처럼 React를 import 해주세요.   Movie.css 도 import 해주세요. 

클랙스 를 만들어 주고 아래와 같이 코딩 해 보세요.

그 이후에는 App.js 파일에 Movie 를 render 해 줍니다.





다 코딩 하셨으면 저장하고 인터넷창을 확인해보세요. 아래와 같이 잘 출력 되셨나요?




아래와 같이 Movie 컴포넌트를 출력하는 부분을 

여러번 붙여 넣으면 화면에도 여러번 동일하게 출력됩니다.




이제 MoviePoster 컴포넌트를 만들어 보겠습니다.

Movies.js 파일에 Movie class 밑에 코딩해보겠습니다.

MoviePoster class 내용에는 이미지를 넣어야 합니다. 

그리고 Movie class 에서 MoviePoster 컴포넌트를 호출해주시면 됩니다.




위와 같이 이미지 주소 넣는 방법도 알아보겠습니다.

 저는 요즘 흥행 했던 범죄도시를 검색하였습니다. 

원하는 이미지를 찾으셨으면 사진 오른쪽에 이미지 보기를 클릭해주세요. 



이미지를 클릭하면 윗부분 주소창을 복사해서 넣어주시면 됩니다.



이미지 주소까지 다 넣어주셨으면 편집했던 파일들을 저장하신 후에 인터넷 창을 확인해보세요. 

아래와 같이 잘 출력되셨나요?  



동일한 내용이지만 여러개의 화면을 출력해보았습니다. 

이번에는 캡쳐화면도 많아서 시간이 조금 걸렸는데 잘 따라해보셨나요?

다음 연재시간에도 포기하지 않고 공부해보도록 하겠습니다. 긴 글 읽어주셔서 고맙습니다. 



안녕하세요? React 왕초보 입니다.

그동안은 실전보다는 이론에 가까운 내용만 연재를 하였습니다.

그리고 이제부터는 웹 서비스를 만들 것입니다. 

정말 간단하게 여러 개를 만들어 보려고 기획 하였지만 취소하였습니다.

간단하지만 그럴듯한 웹 서비스를 하나라도 제대로 도전해보겠습니다. 

아래에 완성된 모습의 영화 웹 서비스를 도전할 것이며, 참조하는 강의 동영상은 아래와 같습니다. 

일단 웹을 만들기 위해서 개발환경을 위해서 몇가지를 설치해야 합니다.

지금까지와 마찬가지로 캡쳐화면은 클릭하면 원본크기로 확인이 가능합니다.

1. node.js 를 가장 먼저 설치하시기 바랍니다. ( 리액트 환경을 쉽게 구성하려면 npm이 필요한데 npm은 node.js를 설치하면 자동으로 설치됩니다.)



2. create react app ( 손쉽게 리액트 앱을 만들어 주는 툴) 
   - 구글에 검색 후 첫번째 링크로 들어가서 아래로 내리면 간단한 명령어 몇개로 설치가 가능합니다.





mac 같은 경우 터미널을 실행시켜서 위에 명령어를 실행시키면  개발서버를 손쉽게 실행 할 수 있습니다. 

하지만 저같은 경우 위에 명령어를 그대로 실행시켰더니 에러가 발생하였습니다.





권한 문제가 생기면서 에러가 발생하였습니다. 인터넷으로 검색한 결과 아래 명령어로 실행시키시면 에러 없이 설치 할 수 있었습니다.

password부분은 본인pc의 비밀번호를 입력하시면 됩니다.




저는 기존에 설치했었던 화면이라서 처음 설치하시는 분들과는 약간 다를 수도 있습니다. 에러만 발생하지 않으면 정상적으로 설치된 것입니다.

설치가 완료 되었으면 movie_app 이라는 웹을 만들기 위해서 다시 아래 명령어를 실행시켜줍니다.





위와 같이 중간 정도 왼쪽에 Success! 가 뜨면 정상적으로 완료된 것입니다. 

그 이후에 해당 폴더로 진입해서 npm start 명령어를 실행시키시면 됩니다.

실행시키면 아래와 같이 자동으로 웹화면이 뜨는 것을 보실 수 있으실 겁니다.




3. 스크립트 에디터 설치 ( 아톰, 브라켓, visual studio code 등 여러가지가 있습니다. 저같은 경우는 vsc( visual studio code) 를 설치하였습니다.)

vsc 를 실행한 후 폴더 열기를 클릭 후  아까 movie_app 폴더를 선택합니다. 그러면 아래와 같이 여러개의 파일이 자동으로 생성되어 있는 것을  확인하실 수 있습니다.





위와 같이 여러개의 파일 중에 App.js 파일을 클릭 후 빨간 네모 안에 내용을 수정하고 저장하게 되면 자동으로 웹사이트 내용이 바뀌는 것을 확인하실 수 있습니다.

오늘은 간단한 영화 웹 서비스 만들기 첫번째 시간이었습니다. 

완성본을 다 만들때까지 포기하지 않고 최선을 다해보겠습니다.

데이터 배열을 리액트에서 랜더링 할때는 자바스크립트 내장함수인 map을 사용합니다.

map() 메소드는 파라미터로 전달 된 함수를 통하여 배열 내의 각 요소를 처리해서 그 결과로 새로운 배열을 생성합니다.


arr.map(callback, [thisArg])

callback 새로운 배열의 요소를 생성하는 함수로서, 다음 세가지 인수를 가집니다.

<font color="#009e25">currentValue</font> 현재 처리되고 있는 요소

index 현재 처리되고 있는 요소의 index 값

array 메소드가 불려진 배열
<br />
thisArg (선택항목) callback 함수 내부에서 사용 할 this 값을 설정




예제를 통해서 더 알아보도록 하겠습니다.

아래 예제는 특정 숫자의 제곱값을 출력하는 예제입니다.




var numbers = [1,2,3,4,5];

var processed = numbers.map(function(num) {
return num*num;
});

결과 : [1, 4, 9, 16, 25]





간단하게 크롬의 개발자 도구를 사용해서 실습해 보겠습니다.


단축키는 f12 입니다.  저 같은 경우 맥을 사용하는데  alt +command+ i 가 단축키 입니다.


이번연재에도 동일하게 캡쳐화면은 클릭하면 원본크기로 확인이 가능합니다.








ES6 문법으로 사용되면 다음과 같습니다.  


arrow function이 포함된 문법입니다. 보통 callback 함수를 작성할 때 많이 사용됩니다.




/* ES6 Syntax */


let numbers = [1, 2, 3, 4, 5];

 

let result = numbers.map((num) => {

    return num*num;

});





arrow function 관련 주소

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions




아래 링크의 웹서비스는 es6 문법을 es5 로 변환해주는 곳입니다.

es6console 주소



위에 주소로 들어가시면 아래와 같은 화면 구성이 아닐 수도 있습니다.


그럴경우 오른쪽에 ES5부분을 클릭해주세요. 







es6 문법을 처음 보시면 생소하게 느끼실 수도 있습니다.


하지만 react에서 사용 하시다보면 꽤 쓸만 하다고 합니다.





컴포넌트 매핑

리액트에서 똑같은 원리로 배열을 컴포넌트로 매핑할 수 있습니다.




실습을 해보겠습니다. 동일하게 codpen.io 로 접속하시면 됩니다.


아래에 html에 들어가는 스크립트는 앞으로는 생략하고 캡쳐하도록 하겠습니다.


제가 캡쳐한 부분에 html 영역이 보이지 않아도 항상 입력해주셔야 제대로 된 결과값이 출력됩니다.



HTML 영역 : <div id="root"></div>




실습을 하기 위해 기본적으로 아래 스크립트를 작성해주세요.




위와 같이 결과물이 잘 출력된다면 , 

간단한 주소록 (contact) 화면을 출력해보는 실습을 해보겠습니다.

가장 먼저 Contact 라는 컴포넌트를 만들어 주세요.

아래 캡쳐와 같이 하드코딩을 해주겠습니다. 

즉 반복되는 내용을 직접 작성 하겠다는 의미입니다.




위와 같이 이름과 전화번호가 있는 화면이 잘 출력되셨나요?


이름과 전화번호가 있는 부분이 반복되므로 또 다른 컴포넌트로 만들어보겠습니다.


컴포넌트 이름은 ContactInfo 로 하겠습니다.








문법이 생소하고 어려워졌다고 느껴질 수도 있으실 것 같습니다.

 저도 어려웠습니다. 앞으로 연재를 진행하면서 반복적으로 하다보면 익숙해지실 것이라고 생각됩니다. 

저도 그렇게 되길 바라면서 연재를 계속 진행해보겠습니다.



이번 시간에는 리액트의 중요한 부분 중에 하나인 state에 대해서 알아보겠습니다.


     state    

- 유동적인 데이터

- JSX 내부에 {this.state.stateName}

- 초기값 설정이 필수 ,생성자(constructor)에서 this.state = { } 으로 설정

- 값을 수정할 때에는 this.setState({...})

  랜더링 된 다음엔 this.state = 절대 사용하지 말 것 
  (이유는 랜더링 된 다음에 이 구문 사용을 사용하면
   바뀐 부분만 업데이트 하겠다는 것을 무시하는 것이고, 성능에도 안 좋습니다.)

 

바로 실습을 하면서, Counter 라는 기능을 만들어 보겠습니다.

처음에는 지금까지 한 것을 복습한다는 생각으로 "React 왕초보의 count"만 출력해 보겠습니다. 

지금까지와 마찬가지로 캡쳐화면은 모두 클릭하시면 원본 크기로 확인이 가능합니다.


 모두 잘 출력되셨죠? 이번에는 counter의 주요 기능인 숫자와 버튼을 만들어 보도록 하겠습니다.



 분명히 맞게 코드를 입력한 것 같은데 흰색 화면에 아무 것도 출력이 되지 않습니다.

그 이유는 화면을 위로 올려서 처음에 배웠던 내용을 보시면 답이 있습니다.

초기값 설정을 해주지 않은 이유 때문입니다. 

그럼 초기값을 설정을 해보도록 하겠습니다.




빨간 네모 박스 안에 초기값을 설정해주니 위와 같이 숫자0 과 버튼이 생겼습니다.

constructor의 메소드는 props 입니다.

super(props)를 먼저 실행해줘야 이 메소드 안에서 this.state라던지 props라던지 접근 할 수 있습니다.



이제 버튼이 클릭 될 때 실행될 메소드를 만들어 보겠습니다.

아래 빨간 네모창과 빨간 줄 부분을 추가해 보겠습니다.



코드를 잘 작성한 후에 아래 버튼을 클릭해봤는데 아무 반응이 없습니다. 

그래서 개발자 도구를 통해서 이유가 뭔지 살펴보겠습니다.

개발자 도구 단축키를 클릭해봤는데 안되서 저는 수동으로 직접 선택하였습니다.

아래 화면을 참고하세요. 




개발자 도구가 열여서 아래 press me 버튼을 클릭할 때마다 에러가 늘어나는 것을 확인할 수 있었습니다.

아까 만든 this.setState 부분에서 this 가 어떤 부분인지 알 수 없어서 발생하는 에러입니다.



 


아래 빨간 네모 화면을 추가해 주고 버튼을 다시 클릭해보면 

아래 화면과 같이 숫자가 올라가는 것을 확인할 수 있습니다.

드디어 간단하지만 Counter 기능이 구현되는 웹을 만드는데 성공하였습니다.








아까 확인했던 개발자 도구를 열어서 추가로 에러가 발생하는지 확인해보도록 하겠습니다.

그 전에 발생한 에러만 출력되고 버튼을 계속 눌러도 에러가 발생하지 않는 것을 확인하였습니다.





약간은 지루했던 문법까지 배우면서 4번째 시간만에 첫번째 웹을 만들어 봤습니다.

간단하지만 에러 없이 구현해봤다는 것에 의미를 부여하고, 

앞으로는 조금 더 그럴듯한 웹을 만들기 위해서 더 공부해도록 하겠습니다.

고맙습니다.

'React > 왕초보 도전' 카테고리의 다른 글

6. 간단한 영화 웹 서비스 만들기 1  (0) 2017.12.19
5. component mapping , 간단한 주소록 구현  (0) 2017.12.19
3. props 소개  (0) 2017.12.19
2. ES6 클래스, JSX 소개  (0) 2017.12.19
1. React 소개  (0) 2017.12.19

+ Recent posts