* 프로그래머스, 타입스크립트로 함께하는 웹 풀 사이클 개발(React, Node.js) 5기 강의 수강 내용을 정리하는 포스팅.
* 원활한 내용 이해를 위해 수업에서 제시된 자료 이외에, 개인적으로 조사한 자료 등을 덧붙이고 있음.
자세한 내용은 이전 포스팅 참조.
클라이언트와 서버 사이에 이루어지는 요청(Request)과 응답(Response)을 어떤 형식으로 실행해야하는지 정해둔 '규약'.
사실 가장 많이 사용하는 것은 CRUD 용도의 GET / POST / PUT / DELETE 정도. 극단적으로는 GET / POST 정도만 써도 어지간한 기능은 다 구현이 가능하다.
PUT과 PATCH를 구분해서 사용할 것. PUT은 겹치는 부분이 있어도 그냥 덮어쓴다 / PATCH는 겹치지 않는 부분만 수정한다.
DELETE 사용시에는 물리적 삭제에 의한 위험성을 충분히 숙지하고 사용할 것.
브라우저 내부에서만 사용할 수 있는 Javascript를 브라우저 외부에서도 사용할 수 있도록, 개발 환경을 제공해주는 플랫폼.
Javascript를 사용하는 개발 환경이라면 어디든 필요하다. 프론트엔드 / 백엔드 모두 동일.
Node.js의 기본 개념 및 특징은 이전 포스팅 참조.
싱글 스레드의 문제를 해결하기 위해 논 블로킹-비동기 방식을 적용해서, 단일 스레드에서 많은 요청을 효율적으로 처리할 수 있게 되었다.
- Node.js 특징 간단요약
Node.js의 특징은 기본적으로 JavaScript의 특징을 그대로 따라간다. Node.js가 결국 JavaScript로 개발된 것이기 때문.
JavaScript가 최초 개발되었을 때는, 지금처럼 다양한 작업과 화려한 기능을 수행할 것을 전제하지 않았다. 웹 브라우저의 UI와 사용자 상호작용 정도만 처리할 용도.
당시 웹 브라우저에서는 여러 스레드를 사용할 경우 버그가 발생하거나 시스템끼리 충돌을 일으키는 경우가 왕왕 있어서 싱글 스레드만 사용해서 한 번에 하나의 작업만 수행하도록 하는 것이 적합했다.
어쨌든, JavaScript는 하나의 스레드만을 사용하도록 설계되었다.
간단하게 이야기하자면, 기본적으로 한 번에 하나의 작업만 처리할 수 있다는 것.
메모리 사용량은 적은데.. 복잡한 계산을 반복해서 처리하는 등의 작업을 처리하는게 부담스럽다.
다수의 작업 요청이 들어올 때, 요청이 완료될 때까지 기다리지 않고 다음 코드를 바로 실행할 수 있는 방식.
싱글 스레드로 동작한다는 건 많은 작업량을 빠르게 처리할 수 없다는 뜻이다. 이 문제를 해결하기 위해서 하나의 작업이 완료되는걸 기다리지 않고 다음 작업을 실행해버리는 것.
논 블로킹 방식에 의해 다수의 작업이 동시에 실행될 때, 어느 작업이 완료되었다면 콜백 함수를 호출하거나 Promise를 반환하여 결과를 처리하게 된다.
비동기와 논 블로킹 방식은 주로 I/O 작업에 사용된다. 파일을 읽거나, 데이터베이스에 접근하는 등 I/O 지연이 발생할 수 있는 작업을 대기하지 않고 넘겨 처리함으로써 성능을 유지할 수 있기 때문.
싱글 스레드 환경에서도 다수의 작업을 효율적으로 처리할 수 있는 핵심 매커니즘.
들어온 작업을 큐에 넣고, 작업이 완료되면 큐에서 꺼내와 콜백을 실행하는 역할을 수행한다.
비동기 작업의 순서를 제어하면서도 빠른 처리가 가능하도록 하는 것.
전세계적으로는 Javascript 기반의 Node.js / Express.js가 압도적이다.
다만 우리나라의 경우 국가/공공기관에서 채택한 전자정부프레임워크에서 JAVA 기반의 Spring 프레임워크를 사용하고 있기 때문에, 국내 백엔드 개발자라면 Spring를 사용하는 비중이 더 높다.
- 국가/공공기관의 IT 인프라 제작-유지보수는 통상적으로 외부 업체에 하청을 주게되는데 이쪽 일감의 숫자가 무시하기 힘들기 때문. 이쪽 회사들에게 Javascript는 그저 프론트엔드 개발에나 사용하는 언어이다.
네카라쿠배당토로 대표되는 IT 대기업들도 사정은 비슷하다. Node.js / Express.js / Django 등등.. 최신 기술을 많이 사용하지만, JAVA Spring의 비중도 높은 편.
- 우리나라의 Spring 개발 인력층이 풍부하기도 하고, 여기도 정부쪽과 거래를 하는 일도 있기 때문.
따라서 우리나라에서 백엔드 개발자가 되고싶다면, 1순위 JAVA Spring / 2순위 Python Django / 3순위 Javascript Node.js 정도로 후보를 좁히면 된다.
개발자에게 도움을 주는 코드 모음.
외부에서 미리 만들어진 라이브러리를 가져다 사용하는 것도 모듈을 가져다가 사용하는 것. 그리고 자바스크립트에서 미리 제공하는 메소드를 사용하는 것도 모듈을 사용하는 행위에 속한다.
외부에서 미리 만들어진 라이브러리를 가져다 사용하는 것. 이건 어떻게 해야할까?
Node Package Manager, npm/yarn에 대한 기본 개념은 이전 포스팅 참조.
Node Package Manager사전에 규정된 방법을 통해 외부에서 미리 제작된 라이브러리를 가져다가 사용할 수 있다.
텍스트를 아스키 아트(ASCII Art)로 변환하는 프로그램이자 라이브러리.
"Frank, Ian and Glenn's LETters"의 줄임말로, 1990년대에 이 이름을 딴 개발자들에 의해 만들어졌다.
텍스트를 큰 아스키 아트로 변환하여 터미널, 웹 페이지 또는 애플리케이션에서 시각적 강조를 줄 때 유용하게 사용된다.
figlet 아스키아트텍스트로변환해출력하고싶은텍스트
figlet Hello, World!
const figlet = require('figlet');
figlet('Hello, World!', function(err, data) {
if (err) {
console.log('Something went wrong...');
console.dir(err);
return;
}
console.log(data);
});
Figlet 라이브러리의 figlet 함수는 두 개의 인자를 받아 동작한다.
첫 번째 인자는 변환하고 싶은 텍스트. 두 번째 인자는 콜백 함수, 작업이 끝난 후 실행되는 함수이다.
figlet 함수는 첫 번째 인자를 받아 텍스트를 변환한다.
작업이 완료되면, 콜백 함수가 실행된다.
콜백 함수에서는 이전 작업에서 에러가 발생되었다면, figlet 함수에서 에러 내용을 받아 콘솔에 출력하고 코드를 종료한다.
에러가 발생되지 않았다면, figlet 함수에서 변환된 텍스트 값을 data라는 인자로 받아 콘솔에 출력하고 코드를 종료한다.
라이브러리(Library) : 특정 기능을 쉽게 구현할 수 있도록 제공되는 함수와 클래스의 모음.
프레임워크(Framework) : 애플리케이션의 구조와 아키텍처를 정의하는 큰 틀.
프레임워크는 어떤 애플리케이션을 개발할 때, 개발 구조와 방향성까지 모두 제시되어 개발자가 이를 따라서 개발해야하는 큰 개념.
라이브러리는 어떤 기능을 구현할 때, 이를 위해 미리 마련된 함수 등을 가져다가 사용하는 작은 개념. 개발자가 원하는 기능을 추가하기 위해 선택적으로 사용하는 것.
수많은 라이브러리들이 모음이 곧 프레임워크가 된다고 이해하면 된다. 다만 하나의 App을 온전히 개발할 수 있느냐가 프레임워크의 기준.
프레임워크 예시 : Vue.js / Angular / Svelte / Express.js 등등..
라이브러리 예시 : jQuery / Three.js / Lodash / Chart.js / Axios 등등..
사용자 인터페이스를 만들기 위한 JavaScript 라이브러리
생각보다 혼동하는 경우가 많은데, React.js는 UI 구현을 위해 선택적으로 사용하는 라이브러리이다.
Javascript 기반의 React.js - Vue.js - Angular.js가 프론트엔드 개발의 3대장으로 묶여 다루어지기에 더 혼란이 발생하는데..
Vue.js - Angular.js는 프레임워크. React.js는 라이브러리에 속한다.
React.js에서 흔히 사용하는 라이브러리들 목록.
거대한 React.js 생태계의 극히 일부, 실제로 존재하는 라이브러리들은 포스팅 하나에 목록화 하는것 자체가 불가능할 정도로 거대하다.
React Router: React 애플리케이션에 라우팅 기능을 추가하는 라이브러리로, 페이지 이동과 URL 매핑을 쉽게 관리할 수 있습니다. 클라이언트 사이드 라우팅을 통해 싱글 페이지 애플리케이션(SPA) 구조를 지원합니다.
Redux: 전역 상태 관리를 위한 라이브러리로, 단방향 데이터 흐름과 불변성을 통해 애플리케이션의 상태를 일관성 있게 관리할 수 있습니다. 대규모 애플리케이션에서 상태 관리의 복잡성을 줄여줍니다.
Recoil: Facebook에서 개발한 상태 관리 라이브러리로, React의 기본 상태 관리 기능을 확장하여 더 정교한 상태 관리를 할 수 있게 합니다.
MobX: 상태 관리를 간편하게 해주는 라이브러리로, 옵저버 패턴을 통해 상태의 변화에 따라 UI를 자동으로 업데이트합니다.
Axios: HTTP 요청을 처리하는 라이브러리로, RESTful API와의 통신을 위한 Promise 기반 비동기 처리를 쉽게 구현할 수 있습니다. React 애플리케이션에서 API와 데이터를 통신하는 데 널리 사용됩니다.
React Query: 서버 상태 관리 라이브러리로, 데이터를 캐싱, 동기화, 갱신하는 기능을 제공하여 API 요청을 더 효과적으로 관리할 수 있습니다.
Formik: React에서 폼을 쉽게 관리하고 검증할 수 있는 라이브러리로, 폼 상태 및 유효성 검사를 간편하게 설정할 수 있습니다.
React Hook Form: 성능 최적화된 폼 관리 라이브러리로, 폼 상태를 효율적으로 관리하고 유효성 검사를 간단하게 구현할 수 있습니다.
Styled-Components: CSS-in-JS 방식의 스타일링을 제공하는 라이브러리로, 컴포넌트 기반으로 스타일을 적용할 수 있습니다. 스타일이 JavaScript 안에 포함되므로 모듈화가 쉬워집니다.
Emotion: CSS-in-JS 스타일링을 지원하는 라이브러리로, 성능이 뛰어나고 유연한 스타일링이 가능합니다.
Jest: React 애플리케이션에서 단위 테스트와 통합 테스트를 쉽게 작성할 수 있게 해주는 테스트 라이브러리로, Facebook에서 개발했습니다.
React Testing Library: React 컴포넌트의 UI 테스트를 위한 도구로, 사용자 관점에서 컴포넌트를 테스트할 수 있도록 설계되었습니다.
Next.js: React에 서버 사이드 렌더링과 정적 사이트 생성을 추가하여, React를 프레임워크처럼 사용할 수 있게 도와줍니다. SEO가 중요한 애플리케이션에 특히 적합하며, API 라우팅, 이미지 최적화, 폴더 구조 관리 등을 지원합니다.
Framer Motion: React 애플리케이션에 애니메이션을 추가하는 라이브러리로, CSS만으로는 구현하기 어려운 애니메이션 효과를 쉽게 만들 수 있습니다.
React Spring: 자연스러운 애니메이션을 구현하기 위한 라이브러리로, 물리 기반 애니메이션을 지원합니다.
라우팅: Vue는 공식 라우팅 라이브러리인 Vue Router를 통해 클라이언트 사이드 라우팅을 지원합니다.
상태 관리: Vuex라는 공식 상태 관리 라이브러리를 통해 전역 상태 관리를 쉽게 할 수 있습니다.
폼 관리 및 유효성 검사: Vue는 자체적으로 양방향 데이터 바인딩을 지원하기 때문에 폼의 상태를 간단하게 관리할 수 있으며, 유효성 검사도 쉽게 구현할 수 있습니다.
애니메이션: Vue는 트랜지션과 애니메이션을 기본으로 제공하여 DOM 요소에 애니메이션 효과를 쉽게 추가할 수 있습니다.
라우팅: Angular에는 내장된 라우팅 기능이 있으며, Angular Router를 통해 페이지 전환과 URL 매핑을 쉽게 관리할 수 있습니다.
상태 관리: Angular는 RxJS와 서비스를 활용해 상태를 관리할 수 있으며, 전역 상태 관리가 필요한 경우에도 내장된 서비스와 의존성 주입을 통해 구현할 수 있습니다.
폼 관리 및 유효성 검사: Angular에는 템플릿 기반 폼과 반응형 폼(Reactive Forms)이라는 두 가지 방식의 폼 관리 시스템이 내장되어 있어, 복잡한 폼 검증과 상태 관리가 용이합니다.
HTTP 요청 및 데이터 처리: Angular는 HttpClient 모듈을 통해 REST API와의 통신을 기본적으로 지원합니다.
애니메이션: Angular의 애니메이션 기능은 Angular Animation 모듈을 통해 기본 제공되며, 복잡한 애니메이션 효과도 쉽게 구현할 수 있습니다.
테스트 도구: Angular CLI와 함께 제공되는 Jasmine과 Karma를 통해 기본적인 유닛 테스트와 통합 테스트를 쉽게 작성할 수 있습니다.