diff --git a/_config.yml b/_config.yml index c7f9c58d..cd1d9e58 100644 --- a/_config.yml +++ b/_config.yml @@ -29,6 +29,7 @@ markdown: redcarpet redcarpet: extensions: - fenced_code_blocks + - footnotes sass: style: :compressed sass_dir: _css diff --git a/docs/01-why-react.ko-KR.md b/docs/01-why-react.ko-KR.md new file mode 100644 index 00000000..40757c6b --- /dev/null +++ b/docs/01-why-react.ko-KR.md @@ -0,0 +1,30 @@ +--- +id: why-react-ko-KR +title: 왜 React인가? +permalink: why-react-ko-KR.html +next: displaying-data-ko-KR.html +--- + +React는 페이스북과 인스타그램에서 사용자 인터페이스를 구성하기 위해 만들어진 라이브러리입니다. 많은 사람들은 React를 **[MVC](http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller)** 에서의 **V** 로 생각하는 경향이 있습니다. + +우리는 단 하나의 문제를 해결하기 위해 React를 만들었습니다: **지속해서 데이터가 변화하는 대규모 애플리케이션을 구축하기.** 이 문제를 해결하기 위해, React는 두가지 컨셉을 도입했습니다. + +### 단순함 + +당신의 애플리케이션이 특정 시점에 어떻게 보여야 할지를 단순히 표현하는 것만으로, 데이터가 변할 때 React는 자동으로 모든 UI 업데이트를 관리해줍니다. + +### 선언적 문법 + +데이터가 변할 때 React는 "새로 고침" 버튼을 누르듯이 작동하며, 데이터의 바뀐 부분만을 업데이트할 수 있습니다. + +## 구성적인 컴포넌트를 만드세요 + +React는 재사용 가능한 컴포넌트들을 만드는 데에 도움이 됩니다. 사실, React를 사용하면 *단지* 컴포넌트를 만드는 일만 하게 됩니다. 컴포넌트들은 잘 캡슐화되어 되어 있기 때문에, 컴포넌트들은 코드의 재사용성을 높이고, 테스트를 쉽게 해 주며, 관심 분리의 원칙(separation of concerns)을 지키게 해 줍니다. + +## 5분만 투자하세요 + +React는 많은 관습적인 사고에 도전하며, 첫눈에 볼 때는 이상한 아이디어들의 모음이라고 생각할 수도 있습니다. 이 가이드를 읽기 위해 [5분만 투자하세요](http://37signals.com/svn/posts/3124-give-it-five-minutes); 그 이상한 아이디어들은 페이스북과 인스타그램 안팎의 수천 개의 컴포넌트들을 만드는 데에 사용되었기 때문입니다. + +## 더 알아보기 + +[이 블로그 포스트](http://facebook.github.io/react/blog/2013/06/05/why-react.html)에서 React를 만든 우리의 동기에 대해 알아볼 수 있습니다. diff --git a/docs/02-displaying-data.ko-KR.md b/docs/02-displaying-data.ko-KR.md new file mode 100644 index 00000000..0c02ccbc --- /dev/null +++ b/docs/02-displaying-data.ko-KR.md @@ -0,0 +1,126 @@ +--- +id: displaying-data-ko-KR +title: 데이터를 표시하기 +permalink: displaying-data-ko-KR.html +prev: why-react-ko-KR.html +next: jsx-in-depth-ko-KR.html +--- + +UI를 가지고 할 수 있는 가장 기초적인 것은 데이터를 표시하는 것입니다. React는 데이터를 표시하고 데이터가 변할 때마다 인터페이스를 최신의 상태로 자동으로 유지하기 쉽게 해 줍니다. + +## 시작하기 + +정말 간단한 예제를 보도록 하죠. 다음과 같은 코드의 `hello-react.html` 파일을 만듭시다. + +```html + + + + Hello React + + + + +
+ + + +``` + +문서의 나머지에서, 코드가 위와 같은 HTML 템플릿에 들어갔다고 가정하고 JavaScript 코드에만 집중할 것입니다. 위의 주석 부분을 다음과 같은 JavaScript 코드로 바꿔 보세요: + +```javascript +var HelloWorld = React.createClass({ + render: function() { + return ( +

+ 안녕, ! + 지금 시간은 {this.props.date.toTimeString()} 입니다. +

+ ); + } +}); + +setInterval(function() { + React.render( + , + document.getElementById('example') + ); +}, 500); +``` + + +## 반응 적(Reactive) 업데이트 + +`hello-react.html` 파일을 웹 브라우저에서 열어 당신의 이름을 텍스트 필드에 써 보세요. React는 단지 시간을 표시하는 부분만을 바꿉니다 — 텍스트 필드 안에 입력한 것은 그대로 남아 있구요, 당신이 이 동작을 관리하는 그 어떤 코드도 쓰지 않았음에도 불구하고 말이죠. React는 그걸 올바른 방법으로 알아서 해줍니다. + +우리가 이걸 할 수 있었던 건, React는 필요한 경우에만 DOM을 조작하기 때문입니다. **React는 빠른 React 내부의 DOM 모형을 이용하여 변경된 부분을 측정하고, 가장 효율적인 DOM 조작 방법을 계산해 줍니다.** + +이 컴포넌트에 대한 입력은 `props` 라고 불립니다 — "properties" 를 줄인 것이죠. 그들은 JSX 문법에서는 어트리뷰트로서 전달됩니다. 당신은 `props` 를 컴포넌트 안에서 불변의(immutable) 엘리먼트로서 생각해야 하고, `this.props` 를 덮어씌우려고 해서는 안됩니다. + + +## 컴포넌트들은 함수와 같습니다 + +React 컴포넌트들은 매우 단순합니다. 당신은 그것들을 `props` 와 `state` (이것들은 나중에 언급할 것입니다) 를 받고 HTML을 렌더링하는 단순한 함수들로 생각해도 됩니다. 그것들은 너무 단순하기 때문에, 그것들의 작동을 이해하는 것 또한 쉽게 만듭니다. + +> 주의: +> +> **한가지 제약이 있습니다**: React 컴포넌트들은 단 하나의 루트 노드(root node)만을 렌더할 수 있습니다. 만약 여러개의 노드들을 리턴하고 싶다면, 그것들은 단 하나의 루트 노드로 싸여져 있어야만 합니다. + + +## JSX 문법 + +우리는 컴포넌트를 사용하는 것이 "템플릿"과 "디스플레이 로직(display logic)"을 이용하는 것보다 관심을 분리(separate concerns)하는 데에 올바른 방법이라고 강하게 믿고 있습니다. 우리는 마크업과 그것을 만들어내는 코드는 친밀하게 함께 결합되어있다고 생각합니다. 또한, 디스플레이 로직은 종종 매우 복잡하고, 그것을 템플릿 언어를 이용해 표현하는 것은 점점 사용하기 어렵게 됩니다. + +우리는 이 문제를 해결하는 최고의 해결책은, UI를 만드는 진짜 프로그래밍 언어의 표현력을 모두 사용할 수 있는 JavaScript 코드로부터 HTML과 컴포넌트 트리들을 생성하는 것임을 발견했습니다. + +이것을 더 쉽게 하기 위해서, 우리는 매우 간단하고, **선택적인** HTML과 비슷한 문법을 추가하여 이 React 트리 노드들을 만들 수 있게 했습니다. + +**JSX는 당신으로 하여금 HTML 문법을 이용해 JavaScript 객체를 만들게 해줍니다.** React를 이용해 순수한 JavaScript 문법으로 링크를 만드려고 한다면, 코드는 다음과 같습니다: + +`React.createElement('a', {href: 'http://facebook.github.io/react/'}, '안녕하세요!')` + +JSX를 이용하면: + +`안녕하세요!` + +우리는 이것이 React 앱들을 만들기 쉽게 하고, 디자이너들이 이 문법을 더 선호하는 것을 발견했습니다, 하지만 모든 사람은 그들만의 선호하는 워크플로우가 있기 마련이므로, **JSX는 React를 사용하기 위해 필수적이지는 않습니다.** + +JSX는 매우 작은 언어입니다. 그것을 배우고 싶다면, [JSX 깊게 살펴보기](/react/docs/jsx-in-depth-ko-KR.html). 를 살펴 보시기 바랍니다. 또는, [우리의 온라인 JSX 컴파일러](/react/jsx-compiler.html)를 통해 문법이 변환되는 것을 살펴 보시기 바랍니다. + +JSX는 HTML과 비슷하지만, 완전히 똑같지는 않습니다. [JSX의 실수하기 쉬운 부분들](/react/docs/jsx-gotchas-ko-KR.html)에 중요한 차이점들에 대해 설명되어 있습니다. + +JSX를 사용하기 시작하기 위한 가장 쉬운 방법은 브라우저에서 작동하는 `JSXTransformer`를 사용하는 것입니다. 우리는 이것을 프로덕션에서는 사용하지 않기를 강하게 권장하는 바입니다. 당신은 우리의 커맨드 라인 [react-tools](http://npmjs.org/package/react-tools) 패키지를 이용하여 미리 컴파일(precompile)해 사용할 수 있습니다. + + +## JSX 없이 React 사용하기 + +JSX는 완전히 선택적입니다. 당신은 React와 JSX를 함께 사용하지 않아도 상관없습니다. 그냥 JavaScript에서 React 엘리먼트를 `React.createElement`로 만들 수 있습니다. 여기에 태그 이름이나 컴포넌트, 속성 객체, 자식 엘리먼트들을 전달하면 됩니다. + +```javascript +var child1 = React.createElement('li', null, 'First Text Content'); +var child2 = React.createElement('li', null, 'Second Text Content'); +var root = React.createElement('ul', { className: 'my-list' }, child1, child2); +React.render(root, document.body); +``` + +편의를 위하여, 당신은 팩토리 함수 헬퍼들을 이용해 커스텀 컴포넌트로부터 엘리먼트들을 만들 수 있습니다. + +```javascript +var Factory = React.createFactory(ComponentClass); +... +var root = Factory({ custom: 'prop' }); +React.render(root, document.body); +``` + +React는 이미 일반적인 HTML 태그에 대한 빌트인 팩토리를 가지고 있습니다. + +```javascript +var root = React.DOM.ul({ className: 'my-list' }, + React.DOM.li(null, '텍스트') + ); +``` diff --git a/docs/02.1-jsx-in-depth.ko-KR.md b/docs/02.1-jsx-in-depth.ko-KR.md new file mode 100644 index 00000000..cbd982a8 --- /dev/null +++ b/docs/02.1-jsx-in-depth.ko-KR.md @@ -0,0 +1,210 @@ +--- +id: jsx-in-depth-ko-KR +title: JSX 깊이보기 +permalink: jsx-in-depth-ko-KR.html +prev: displaying-data-ko-KR.html +next: jsx-spread-ko-KR.html +--- + +[JSX](http://facebook.github.io/jsx/)는 XML과 비슷한 JavaScript문법 확장입니다. React에서 변환되는 간단한 JSX 구문을 사용하실 수 있습니다. + +## 왜 JSX인가? + +React를 위해 꼭 JSX를 사용할 필요는 없고, 그냥 일반 JS를 사용할 수도 있습니만 JSX를 사용하기를 추천합니다. 왜냐하면, 어트리뷰트를 가진 트리 구조로 정의할 수 있는 간결하고 익숙한 문법이기 때문입니다. + +이것은 디자이너 같은 케쥬얼 개발자에게 더 익숙합니다. + +XML에는 여닫는 태그의 장점이 있습니다. 태그는 큰 트리일 때 함수 호출이나 객체 리터럴보다 읽기 쉬워 집니다. + +JSX는 JavaScript의 시맨틱을 변경하지 않습니다. + +## HTML 태그 vs. React 컴포넌트 + +React는 렌더 HTML 태그(문자열)이나 React 컴포넌트(클래스)일 수 있습니다. + +HTML 태그를 렌더하려면, 그냥 JSX에 소문자 태그를 사용하세요. + +```javascript +var myDivElement =
; +React.render(myDivElement, document.body); +``` + +React 컴포넌트를 렌더하려면, 대문자로 시작하는 로컬 변수를 만드세요. + +```javascript +var MyComponent = React.createClass({/*...*/}); +var myElement = ; +React.render(myElement, document.body); +``` + +React JSX는 대소문자를 로컬 컴포넌트 클래스와 HTML 태그를 구별하는 컨벤션으로 사용합니다. + +> 주의: +> +> JSX가 JavaScript기 때문에, `class`, `for`같은 식별자는 XML 어트리뷰트 이름으로 +> 권장하지 않습니다. 대신, React DOM 컴포넌트는 각각 `className`, `htmlFor`같은 +> DOM 프로퍼티 이름을 기대합니다. + + +## 변환 + +React JSX는 XML같은 문법에서 네이티브 JavaScript로 변환됩니다. XML 엘리먼트, 어트리뷰트, 자식은 `React.createElement`에 넘겨지는 인자로 변환됩니다. + +```javascript +var Nav; +// 입력 (JSX): +var app =