CSS의 Cascading은 스타일 적용 시 우선순위에 따라 스타일이 결정되며, 중요도, 명시도, 소스 순서가 영향을 미칩니다.
시맨틱 태그는 코드의 가독성을 높이고, SEO와 웹 접근성을 향상시킵니다.
rem 또는 em 단위를 사용해 브라우저 폰트 크기에 따라 요소 크기를 유동적으로 조정할 수 있습니다.
rem 은 항상 루트 폰트 사이즈를 참조합니다. 일반적인 브라우저 기본 폰트 크기가 16px이고 이를 이용하면 사용자가 브라우저 폰트 크기 설정을 변경하지 않는 일반적인 경우, 1rem 은 16px 크기라 보고 스타일링 하면 됩니다.
master는 프로덕션 릴리즈 브랜치, develop은 개발 브랜치로, feature, release, hotfix 브랜치로 기능 개발과 버그 수정을 관리하는 전략입니다.
- 안정적인 배포를 위한 구조가 갖춰져 있습니다.
- 긴 개발 주기에 적합하며, 복잡한 기능 개발과 버그 수정에 유용합니다.
- 배포 전 마무리 작업과 테스트를 위한 release 브랜치를 사용할 수 있습니다.
- 브랜치가 많아지고 관리해야 할 작업이 증가할 수 있습니다. 이를 보완하기 위한 git flow 도구가 있을 정도죠.
- 작은 규모의 프로젝트에서는 비효율적일 수 있습니다.
==는 타입 변환을 허용한 비교, ===는 타입과 값 모두를 엄격하게 비교합니다.
== 는 암묵적 형변환이이 일어나는데, 암묵적 형변환이 일어날 것을 모두 기억하거나 예측하는 것이 어렵기 때문에, 의도하지 않은 결과를 얻게 될 가능성이 크고 이로 인해 오류 가능성이 커집니다. 따라서 동등함을 비교하기 위해서 === 를 사용하는 것이 좋습니다.
얕은 복사는 객체의 참조만 복사해 원본과 복사본이 같은 객체를 가리키는 방식입니다. 반면, 깊은 복사는 객체의 모든 속성을 새로 복사해 독립적인 객체를 생성하는 방식입니다.
브라우저는 URL을 입력하면 해당 서버에 HTTP 요청을 보내고, 서버로부터 HTML, CSS, JavaScript 파일을 받아 해석하여 DOM 트리와 렌더 트리를 생성하고 화면에 렌더링합니다.
- DOM(Document Object Model), CSSOM(CSS Object Model) 생성
- Render Tree 생성
- Layout
- Paint
this는 함수가 호출될 때의 실행 문맥에 따라 값이 결정됩니다. 일반 함수에서는 전역 객체를 가리키고, 메서드에서는 해당 객체를 가리키며, 화살표 함수에서는 상위 스코프의 this를 가리킵니다.
렉시컬 스코프는 함수가 정의될 때의 스코프 체인을 기준으로 변수의 유효 범위가 결정되는 것을 의미합니다. 즉, 함수 호출 위치가 아닌 정의 위치에 따라 변수를 참조합니다.
- PATCH: 기존 리소스의 부분적인 수정을 위한 메소드
- HEAD: 특정 리소스를 GET 메소드로 요청했을 때 돌아올 헤더를 받기 위한 메소드
- OPTIONS: 주어진 URL 또는 서버에 대해 허용된 통신 옵션을 받기 위한 메소드
- CONNECT: 요청한 리소스에 대해 양방향 연결을 시작하는 메소드
// 1번
let num = 1;
// 2번
setTimeout(() => {
num = 2;
}, 0);
// 3번
num = 3;
// 4번
console.log(num);
자바스크립트는 싱글 스레드 기반의 언어입니다. 여기서 스레드란 작은 단위의 실행 흐름을 말합니다. 자바스크립트 엔진을 간단히 살펴보면 위와 같이 Memory Heap과 Call Stack(자료구조에서 배우게 될 stack처럼 구현된 저장소)으로 구성되어 있는데요. 하나의 스레드에서 하나의 Call Stack으로 현재 어떤 함수가 동작하고 있는지, 그 함수 내에서 어떤 함수가 동작하고, 다음에 어떤 함수가 호출되어야 하는지 등을 제어합니다.
num
에 1이 할당됩니다.setTimeout
을 Web API(NodeJS의 경우 Timers 모듈)가 처리하도록 넘깁니다. 이때 중요한 건, 즉시 setTimeout
에 있는 callback을 실행할지 판단하지 않습니다. 따라서 num
은 여전히 1인 상태입니다.setTimeout
작업이 완료되면 setTimeout
callback 함수를 Callback Queue에 등록합니다.num
에 3이 재할당됩니다.num
은 2가 재할당됩니다.프로토타입 체인은 객체가 다른 객체의 속성이나 메서드를 상속받을 수 있도록 연결된 구조입니다. 자바스크립트는 프로토타입을 통해 객체 간 상속을 구현하며, 객체가 다른 객체의 프로토타입을 참조할 수 있습니다.
AJAX는 비동기적으로 서버와 통신해 전체 페이지를 새로고침하지 않고도 데이터 일부를 업데이트할 수 있는 기술입니다. 주로 XML, JSON 형식의 데이터를 서버에서 받아와 웹페이지에 적용합니다.
실행 컨텍스트는 자바스크립트 코드가 실행되는 환경을 정의하며, 변수, 함수 선언, this 등의 정보를 포함합니다. 실행 컨텍스트는 콜 스택에 쌓여서 실행됩니다.
해시 테이블은 데이터를 키-값 쌍으로 저장하는 자료구조로, 해시 함수를 사용해 키를 해시값으로 변환하여 저장 위치를 결정합니다. 이를 통해 빠른 데이터 검색이 가능합니다.
정적 배열: 크기가 고정되어 있으며, 선언 시 메모리가 미리 할당됩니다.
동적 배열: 크기가 가변적이며, 필요에 따라 메모리가 동적으로 할당됩니다.
Virtual DOM은 실제 DOM을 가상으로 표현한 객체로, 변경 사항을 최소화하여 효율적인 업데이트를 위해 사용합니다. 가상 DOM 생성 후 이전 가상 DOM과 비교 후 바뀐 부분만 DOM에 업데이트한다.
리액트는 Virtual DOM을 활용해 UI의 이상적인 “가상”적인 표현을 메모리에 저장하고 ReactDOM과 같은 라이브러리에 의해 “실제” DOM과 동기화 합니다. 이 과정을 재조정(Reconciliation)이라고 합니다.
이렇게 연산이 끝난 뒤 최종적인 변화를 실제 DOM에 반영해서 여러 번 reflow, repaint가 발생할 수 있는 작업을 한번으로 줄여줍니다. 또한, Virtual DOM은 변화에 대한 관리를 자동화하고 추상화해서 작업의 편의성을 제공합니다.
key는 배열의 요소를 고유하게 식별해, 리액트가 변화를 효율적으로 감지하고 렌더링 성능을 최적화할 수 있게 합니다.
리액트는
key
속성을 지원합니다. 자식들이key
를 가지고 있다면, 리액트는key
를 통해 기존 트리와 이후 트리의 자식들이 일치하는지 확인합니다.
key
는 리액트가 어떤 항목을 변경, 추가 또는 삭제할지 식별하는 것을 돕습니다.key
는 엘리먼트에 안정적인 고유성을 부여하기 위해 배열 내부의 엘리먼트에 지정해야 합니다.
key
는 리스트의 다른 항목들 사이에서 해당 항목을 고유하게 식별할 수 있는 문자열을 사용하는 것이 가장 좋습니다. 대부분의 경우 데이터의 id를key
로 사용합니다.key
는 배열의 항목들 사이(형제 사이)에서 고유하면 되고, 전역에서 고유할 필요는 없습니다.
리액트 생명주기는 컴포넌트가 생성, 업데이트, 제거되는 과정을 나타내며, 주요 단계로는 Mounting, Updating, Unmounting이 있습니다.
Presentational 컴포넌트는 UI에만 집중하고, Container 컴포넌트는 상태 관리와 로직을 처리하는 패턴으로, 관심사의 분리를 통해 유지보수성과 재사용성을 높입니다.
TypeScript는 정적 타입을 지원해 코드의 안정성과 가독성을 높이고, 개발 중 오류를 사전에 방지할 수 있습니다.
이런 TypeScript의 특징을 통해 컴파일 단계에서 오류를 포착할 수 있고, 코드를 통해 어떤 타입의 값이 필요한지 쉽게 파악할 수 있어 코드의 흐름을 이해하기 쉽고 협업에 도움이 됩니다.
이 밖에도 vscode와 같은 IDE를 통해 인텔리센스 활용이 가능해지고, 인터페이스, 제네릭 등을 지원해 객체지향 프로그래밍에 도움을 줍니다.
TypeScript는 정적 타입 검사 기능을 제공하는 JavaScript의 상위 집합 언어입니다. 코드를 컴파일할 때 타입 오류를 감지하고, 이 과정에서 JavaScript로 변환되어 브라우저에서 실행됩니다. 런타임에 타입이 제거되므로 브라우저에서는 일반적인 JavaScript로 동작합니다.
React는 클라이언트 사이드 렌더링(CSR)을 주로 처리하지만, Next.js는 서버 사이드 렌더링(SSR), 정적 사이트 생성(SSG), 라우팅 기능을 내장하여 SEO와 초기 로딩 성능을 개선할 수 있습니다. 이 외에도 API 라우팅, 이미지 최적화 같은 추가 기능을 제공합니다.
기본적으로 순수 리액트는 SPA(Single Page Application)이고, CSR(Client Side Rendering)을 합니다. 웹 사이트를 요청할 때 현재 사용하지 않지만 앱에 필요한 모든 컴포넌트를 다운로드하고, 빈 html을 가져와 script를 로딩합니다. 이로 인해 앱의 첫 로딩 시간이 오래 걸려 유저 경험을 헤치고, SEO(Search Engine Optimization)에 취약 하다는 단점이 있습니다.
getStaticProps
를 활용해 빌드 단계에서 데이터를 받아 정적 생성 또는 SSR(Server Side Rendering)할 수 있습니다. 이를 통해 이미 렌더링된 html 문서를 가져올 수 있어서 첫 로딩이 빨라져 유저 경험에 좋고, SEO에도 강점이 있습니다.Image
컴포넌트를 통해 필요한 크기에 맞는 이미지를 제공하고, lazy-loading을 통해 필요한 순간 이미지를 가져와 최적화 합니다.Link
컴포넌트를 통해 페이지 이동할 때 페이 전체를 불러오는 것이 아니라 필요한 데이터만 가져오기 때문에 이동 속도도 빨라지고, 넘어가는 동작도 부드럽습니다.import()
문법, lazy
, Suspense
사용없이도 빌드 과정에서 페이지 단위로 자동으로 코드 스플리팅을 지원합니다.SSR에서는 서버가 요청을 받으면 React 컴포넌트를 서버에서 렌더링해 HTML을 클라이언트로 전송합니다. 클라이언트는 이 HTML을 초기 화면으로 사용하고, 그 이후에 React가 클라이언트에서 해당 HTML을 재사용하며 인터랙티브 기능을 활성화하는 과정을 hydration이라고 합니다.
CORS(Cross-Origin Resource Sharing) 에러는 클라이언트가 다른 도메인으로 요청할 때 서버가 해당 도메인에서 오는 요청을 허용하지 않아 발생합니다. 이를 해결하려면 서버에서 응답 헤더에 Access-Control-Allow-Origin을 설정해 허용할 도메인을 명시해야 합니다.
- 먼저 백엔드 서버 개발자에게 에러가 발생하는 출처를 허용하도록 Access-Control-Allow-Origin 설정을 요청하는 방법이 있습니다.
- CORS 허용을 위한 설정 요청을 할 수 없는 경우, 동일 출처 정책을 강제하지 않는 proxy 서버를 활용해 우회하는 방법이 있습니다. Next.js의 경우
rewrites
를 활용할 수 있습니다
SEO(Search Engine Optimization)는 검색 엔진에서 웹사이트의 가시성을 높이기 위한 작업입니다. SEO 개선을 위해 메타 태그 작성, 시맨틱한 HTML 사용, 페이지 로딩 속도 최적화, 서버 사이드 렌더링(SSR) 등을 활용할 수 있습니다.
클로저는 함수가 생성될 때 자신의 스코프 외부에 있는 변수를 기억하고, 그 변수를 함수가 종료된 후에도 접근할 수 있는 개념입니다. 예를 들어, 함수 내부에서 변수를 캡처하여 반환하는 패턴으로, 비공개 데이터를 저장하거나 함수 상태를 유지할 때 유용합니다.
function makeCounter() {
let count = 0;
return function () {
return ++count;
};
}
const counter = makeCounter();
console.log(counter()); // 1
console.log(counter()); // 2
React Query는 서버 상태 관리의 복잡성을 줄이기 위해 만들어졌습니다. 서버 데이터의 캐싱, 동기화, 업데이트를 자동으로 처리하며, 비동기 요청의 로딩, 에러 처리, 데이터 패칭을 쉽게 관리할 수 있습니다. 이를 통해 코드의 복잡성이 줄고 성능이 향상됩니다.
Storybook을 사용하면 컴포넌트를 독립적으로 개발하고 테스트할 수 있으며, 팀원과 컴포넌트 라이브러리를 공유하기 쉽습니다. 또한, 각 컴포넌트의 다양한 상태를 미리보기로 확인할 수 있어 개발 효율성과 협업이 개선됩니다.