2010년 Google에서 개발한 Framework. TypeScript 기반으로 매우 안정적이고 탄탄한 Frontend App 개발이 가능하며 Framework답게 다양한 기능이 내장되어있다. 무겁고 배우기 어렵다는 단점이 있다.
2014년 Evan You라는 개인이 개발한 Framework. 코드가 깔끔하고 배우기 쉽기 때문에 가장 나중에 생겼지만 성장 속도가 정말 빠르다.
“지속적으로 데이터가 변화하는 대규모 애플리케이션 구축하는 것” 을 목표로 2013년 Facebook에서 개발한 Library.
MVC(Model-View-Controller) Architecture (ex. Angular, Vue)와는 다르게 리액트는 오로지 View만 담당한다. 그만큼 내장되어 있는 기능이 부족해 third-party 라이브러리(ex. React-router, Redux)를 함께 사용한다. 페이스북의 지속적인 관리와 함께 생태계가 활성화 되어 있으며 다양한 자료, 그리고 React Native의 사용으로 인해 사용자가 꾸준히 증가한다.
간략 설명: 프로그램 기본 구조(뼈대)
비교 설명: 자동차 프레임
원하는 기능 구현에만 집중하여 빠르게 개발 할 수 있도록 기본적으로 필요한 기능을 갖추고 있는 것으로 위에서 설명한 라이브러리가 포함되어 있습니다.
프레임워크만으로는 실행되지 않으며 기능 추가를 해야 되고 프레임워크에 의존하여 개발해야 되며 프레임워크가 정의한 규칙을 준수해야 합니다.
겉보기에는 비슷하지만 많은 프레임워크가 존재하는 이유는 아래에서 설명하게 될 아키텍처가 다른 것이며 규칙을 준수해야 되는 이유기기도 합니다.
간략 설명: 프로그램 제작 시 필요한 기능
비교 설명: 자동차 바퀴, 자동차 헤드라이트, 자동차 에어백
재사용이 필요한 기능으로 반복적인 코드 작성을 없애기 위해 언제든지 필요한 곳에서 호출하여 사용할 수 있도록 Class나 Function으로 만들어진 것입니다.
사용 여부는 코드 작성자 선택 사항이며 새로운 라이브러리 제작 시에도 엄격한 규칙이 존재하지 않습니다. 제작 의도에 맞게 작성하면 됩니다.
라이브러리를 사용하여 프로그램의 흐름을 제어합니다.
라이브러리는 언제 어디서나 원하는 대로 호출할 수 있습니다. 이에 반해 프레임워크를 사용하는 경우 흐름은 프레임워크에 의해 제어됩니다. 프레임워크는 코드를 어디에 둘 것인지 지시하지만 필요에 따라 코드를 호출합니다.
간단히 말해서 우리 코드는 라이브러리의 코드를 호출하지만 프레임워크에서는 아래 다이어그램과 같이 코드를 호출하는 프레임워크의 코드입니다.
가상 돔(Virtual Dom)
을 통해 UI를 빠르게 업데이트한다. : 리액트 프로젝트를 시작하는데 필요한 개발 환경을 세팅 해주는 도구(toolchain)
• CRA 를 구성하는 모든 패키지 소스 코드가 존재하는 폴더
"dependencies"
node.modules
폴더에 존재.gitignore
파일에 github 에 올리고 싶지 않은 폴더와 파일을 작성할 수 있다.push
를 해도 .gitignore
파일에 작성된 폴더와 파일은 올라가지 않는다.index.html
<div id="root"></div>
index.js
ReactDOM.render( <App /> , document.getElementById('root'))
App.js
<Login />
컴포넌트, <Main />
컴포넌트를 그 자리에 대체하여 작업하면 된다.<Routes />
컴포넌트가 최상위 컴포넌트로 그 자리에 위치하게 된다.index.html
을 요청한다.[https://naver.com](https://naver.com)
로 접근하면 naver.com에 연결되어있는 서버 컴퓨터의 폴더에 접근해서 index.html
을 가져오는 것public
폴더http://localhost:3000
) public
폴더에 들어가는 것과 동일하다.public/images/test.png
파일을 만들어두면, 서버에 접속해서 해당 파일에 접근할 수 있다http//localhost:3000/images/test.png
을 브라우저 주소창에 입력하면 우리가 작성해둔 파일이 오는것을 볼 수 있다.Login.js
, Login.scss
Main.js
, Main.scss
reset.scss
- css 초기화commom.scss
- 공통으로 사용하는 css 속성 정의 (ex. font-family, theme color)컴포넌트의 종류, 즉 컴포넌트를 선언하는 방식에는 두 가지가 있습니다.
import React from 'react'
class Component extends React.Component {
render() {
return (
<div>
<h1>This is Class Component!</h1>
</div>
)
}
}
export default Component
render
함수가 꼭 있어야 하고, 그 안에 보여 주어야 할 JSX를 반환합니다.import React from 'react'
const Component = () => {
return (
<div>
<h1>This is Functional Component!</h1>
</div>
)
};
export default Component
Hook
기능이 추가되면서 함수형 컴포넌트에서도 state를 사용할 수 있게 되었고 그 후부터 클래스형 컴포넌트보다는 함수형 컴포넌트가 더 많이 사용되기 시작했습니다.위에서 class형 컴포넌트를 설명하며 “클래스형 컴포넌트에서는 위와 같이 render 함수가 꼭 있어야 하고, 그 안에 보여 주어야 할 JSX 를 반환해야 합니다.” 라고 했습니다.
{ ... javascript... }
class
vs. className
<div style={{color : "red"}}>Hello React</div>
<div></div>
vs. <div />
<> ... </>
) : JSX의 큰 특징 중 하나는 내부 요소들을 감싸는 최상위 요소가 있어야 한다고 배웠습니다. Fragments는 DOM에 별도의 노드를 추가하지 않고 하나의 컴포넌트 안에 여러 요소(자식)들을 간단하게 그룹화 할 수 있는 기능입니다. 요소들을 감싸는 div
태그의 불필요한 생성을 막을 수 있어 유용하게 사용됩니다.<>
<div className="loginBtn" onClick={() => console.log("click")}>Login</div>
<br />
<div style={{backgroundColor: "grey", height: "10px"}} />
</>
참고 및 출처
위코드 강의
https://blog.gaerae.com/2016/11/what-is-library-and-framework-and-architecture-and-platform.html
https://www.interviewbit.com/blog/framework-vs-library/