브라우저에서 HTML 형식을 알려주는 태그
(HTML 문서의 최상단에 위치)모든 HTML 요소를 감싸는 루트 태그
문서의 메타데이터(title, meta, link, base)를 정의하는 태그
문서의 본문을 정의하는 태그
고정된 크기 단위
이고, em과 rem은 상대적인 크기 단위
로 em은 부모 요소
, rem은 루트 요소
를 기준으로 한다.HTML의 속성
이고 Property는 DOM에서 HTML의 속성을 다룰 때 사용하는 표현
이다. HTML 문서의 구조와 정보를 나타내는 트리 형태의 인터페이스
이다. / DOM API
를 통해 DOM을 조작
하여 HTML 요소를 수정
할 수 있다.HTML 문서
를 나타내는 최상위 노드HTML 요소
를 나타내는 노드속성
을 나타내는 노드텍스트
를 나타내는 노드주석
을 나타내는 노드현재 디바이스의 뷰포트를 기준으로 한 상대적 너비와 높이 값
이다.자주 사용되는 브레이크 포인트
375px, 480px, 640px, 768px, 1024px, 1200px, 1280px
스타일 적용에 충돌이 발생했을 때 어떻게 우선 순위가 정해지는지에 대한 원칙
이다.적용 범위가 적을수록
명시도가 크고 높은 우선 순위를 갖는다.뒤 선언
으로 덮어쓴다. (명시도에 차이가 있다면 코드 위치는 상관X)HTML 문서에 구조적 의미를 부여하는 마크업 방식
이다. 시멘틱 마크업을 잘 지키면 검색 엔진에 더욱 의미있는 정보를 제공할 수 있고, 개발자가 문서를 이해하기 편하게 해준다.요소를 화면에 어떻게 표현할 지를 결정하는 속성
으로, 요소를 인라인 요소, 블록 요소, 인라인 블록 요소, 플렉스 컨테이너, 그리드 컨테이너
로 만들 수 있다.
display:none과 visibility:hidden의 차이점
둘 다
요소를 화면에서 보이지 않도록 하는 속성
이다. 하지만 display:none은렌더트리에 포함되지 않아 레이아웃에서 공간을 차지하지 않
는 반면, visibility:hidden은렌더트리에 포함되어 레이아웃에서 공간을 차지
한다.
크기가 자유로운 요소들을 단일 축 방향으로 정렬하는 레이아웃 모델
이다. flex-direction, justify-content, align-items 등의 속성
을 통해 레이아웃을 그린다.크기가 정해진 요소들을 2차원으로 정렬하는 레이아웃 모델
이다. grid-template-rows, grid-template-columns 등의 속성
을 통해 2차원 레이아웃을 그린다.요소의 위치를 지정하기 위한 속성
으로, static, relative, absolute, fixed, sticky 등
을 사용할 수 있다. 문서의 일반적인 흐름에 따라 요소를 배치
하는 기본값이다. '문서의 일반적인 흐름에 따른 위치'를 기준으로 요소를 이동
시킬 수 있다. '상위 요소 중 position 값이 static이 아닌 요소'를 기준으로 요소를 이동
시킬 수 있고, 레이아웃 상에 배치되지 않는 공중에 떠 있는 위치
를 가진다. '뷰포트'를 기준으로 요소를 이동
시킬 수 있고, 스크롤에 영향을 받지 않는 고정된 위치
를 갖는다. 문서의 일반적인 흐름에 따른 위치
를 가지다가, 스크롤에 의해 특정 위치에 위치하게 되면 fixed처럼 동작
한다. (이 위치는 문서의 일반적인 흐름을 기준으로 지정)width: ?
를 설정하고 margin: ? auto
display: flex
, justify-content: center
, align-items: center
position: relative
를 설정한 후, 자식 요소에 position: absolute, top: 50%, left: 50%, transform: translate(-50%, -50%)
요소를 하나의 박스로 보는 CSS 모델
로, 박스는 content, padding, border, margin
으로 구성된다.margin과 padding
margin은
border 바깥쪽 빈 공간
이고, padding은border 안쪽 빈 공간
이다.
content의 크기
를 기준으로 width와 height 값이 결정된다. 그러나 border-box로 설정할 경우, content, padding, border을 합친 크기
를 기준으로 width와 height 값이 결정된다.특정 조건에 해당하는 요소를 선택할 때 사용하는 선택자
이다. 한 개의 콜론을 사용하여 표현하며, hover, active, focus, nth-child 등이 존재한다.문서에 실제로 존재하지 않는 요소를 선택할 때 사용하는 선택자
이다. 두 개의 콜론을 사용하며, before, after를 통해 생성한다.인접 요소 혹은 부모 자식 요소
등에서 두 개의 마진이 겹쳤을 때 큰 마진 값으로 병합
되는 현상이다. 패딩 요소를 사용
하거나 부모 요소에 flex, grid 속성을 부여
하여 해결할 수 있다.CSS의 확장 언어이자 전처리기
로, 변수, 중첩, 상속(@extend), 믹스인(@mixin, @include), 수학 연산자, 함수 등
의 기능을 사용할 수 있다.Sassy CSS의 약자
로, Sass의 기능을 지원
하면서 CSS와 거의 같은 문법
을 가진다.자바스크립트 안에서 CSS를 작성하는 스타일링 방식
이다. 코로케이션과 컴포넌트 단위 스타일링
이 가능해져 유지 보수가 용이해지고 가독성이 개선
된다. 다만 자바스크립트 런타임에 스타일이 적용되어 초기 렌더링 속도가 느려질 수 있다
는 단점이 있다. styled-components, emotion
는 CSS In JS 라이브러리
이다. 일부 Sass 문법을 사용
할 수 있어서 변수, 수학 연산자, 함수 등
의 기능을 사용할 수 있다.자바스크립트의 정적 타이핑을 지원하기 위한 언어
이다.디버깅과 유지 보수
가 어려워진다. 타입스크립트를 사용하면 정적 타이핑이 가능해져 코드의 안정성
을 높힐 수 있다.타입을 정의하기 위한 키워드
이다. type은 &(앰퍼샌드)를 통해 확장
이 가능하고, interface는 extends를 통해 확장
이 가능하다. 동일한 이름으로 타입을 정의할 경우, type은 에러가 발생
하고 interface는 자동으로 확장
된다.둘 이상의 타입을 지정할 때 사용되는 타입
으로, |
로 표현한다.두 타입이 공통적으로 갖는 타입을 지정할 때 사용되는 타입
으로, &
로 표현한다.기존 타입을 변환하여 새로운 타입을 만들어주는 타입
Partial<Type>
Optional
로 만드는 타입Readonly<Type>
Read-Only
로 만드는 타입Pick<Type,Keys>
키
를 통해 특정 속성을 고르는
타입Omit<Type,Keys>
키
를 통해 특정 속성을 제외
하는 타입Extract<Type,Union>
유니온 타입
을 통해 특정 속성을 고르는
타입Exclude<Type,Union>
유니온 타입
을 통해 특정 속성을 제외
하는 타입Record<Keys,Type>
키
를 통해 특정 속성들에 동일한 타입을 지정
하는 타입한번의 선언으로 다양한 타입을 지정할 수 있도록
하는 타입을 파라미터화한 타입
으로, 타입에 유연성을 제공하고 재사용성을 높일 수 있
다.
타입 파라미터(<T>)로 선언
하고, 함수 호출 시 명시적으로 타입을 지정
한다. 지정하지 않아도 타입 추론을 통해 자동으로 지정
된다.
(유니온 타입이나 함수 오버로드를 대체
할 수 있다.)
function identity<T>(arg: T): T {
return arg;
}
// 숫자를 전달할 때
let outputNumberOne = identity(5); // 타입 추론을 통해 outputNumberOne 타입은 number
let outputNumberTwo = identity<number>(5); // 명시적으로 작성해도 된다.
// 문자열을 전달할 때
let outputStringOne = identity("Hello"); // 타입 추론을 통해 outputString 타입은 string
let outputStringTwo Two= identity<string>("Hello"); // 명시적으로 작성해도 된다.
(인수를 배열로 받을 경우 따로 제네릭 처리를 T[]
나 Array<T>
로 해주어야 한다.)
function identity<T>(arg: T[]): T[] {
console.log(arg.length);
return arg;
}
함수 오버로딩
함수를 중복 선언하여 하나의 함수에 대해 다양한 타입을 지정하는 방식
이다.
정의부를 가지지 않는 함수를 여러 개 선언하여 여러 개의 타입을 지정하고, 정의부를 가지는 함수는 타입을 any로 지정하여 사용한다.function add(a: string, b: string): string; // 오버로드 함수 선언 function add(a: number, b: number): number; // 오버로드 함수 선언 function add(a: any, b: any): any { // 오버로드 함수 실행부 (any를 써준다) return a + b; } add('hello ', 'world~'); add(1, 2);
any를 쓰면 되는 것 아닌가?
any 타입을 사용하면
타입을 아예 체크하지 않기 때문에 정적 타이핑이라고 볼 수 없어
코드 안정성을 보장할 수 없다.
리액트에 SSR, SSG 등의 기능을 제공하는 웹 프레임워크
이다전체 페이지에 대한 DOM을 그리는 작업이 없
기 때문에 초기 로딩 속도가 빠르다. (Next.js에서는 사전 렌더링까지 지원하므로 더더욱.) 또한 검색 엔진에 완전한 HTML이 수집
되기 때문에 검색 엔진 최적화에 유리하다.요청이 들어왔을 때 페이지를 생성하고 반환
하는 반면 SSG은 페이지를 미리 생성해놓고 요청이 들어왔을 때 반환
한다. SSR은 각 요청마다 다른 정보를 보여주는 페이지나 실시간으로 업데이트되는 페이지
에 적합하고 SSG는 각 요청에 항상 동일한 정보를 보여주는 페이지
에 적합하다.월드 와이드 웹(WWW)에서 클라이언트와 서버 간에 데이터를 주고받기 위한 통신 프로토콜
이다. GET, POST, PUT, PATCH, DELETE
가 있다. 성공 상태
, 400번대 응답 코드는 클라이언트 측 오류 상태
, 500번대 응답 코드는 서버 측 오류 상태
를 나타낸다.HTTP에 데이터 암호화가 추가된 보안 버전
이다. 암호화/복호화 과정이 필요하기 때문에 HTTP보다 속도가 약간 느리다.URL의 도메인 네임 부분을 DNS 서버에 검색
하고, DNS 서버에서 해당 도메인 네임에 해당하는 IP 주소를 찾아서 (사용자가 입력한 URL 정보와 함께) 브라우저에 전달
한다.브라우저는 IP 주소를 전달받으면 HTTP 요청 메시지를 생성하고 TCP 프로토콜을 사용하여 IP 주소로 전달
한다. IP 주소의 서버가 요청 메시지를 받으면 응답 메시지를 생성하여 다시 브라우저에게 전달
한다.응답 메시지의 body에 있는 HTML과 CSS를 파싱
하여 DOM 트리와 CSSOM 트리를 생성
한다.DOM 트리와 CSSOM 트리를 결합
하여 렌더트리를 생성
한다.렌더트리를 계산
하고 브라우저에 그려낸다
.렌더트리를 재생성하여 다시 계산
하고 다시 브라우저에 그려낸다
.IP와 DNS
IP는 네트워크에서 장치를 식별하는 번호이고, DNS는 도메인 주소와 IP를 매칭해주는 서버이다.
HTML 파싱 과정
에서 script 태그를 만날 경우 파싱 작업을 멈추고 스크립트를 처리
한다. 이를 방지하기 위해 body 태그에 가장 아래에 script 태그를 위치
시킬 수 있지만,HTML 파일이 큰 경우 속도 저하가 심각
할 수 있다. 이를 해결하기 위해 defer 혹은 async 속성
을 사용하여 병렬적으로 스크립트를 다운로드
할 수 있다. / defer 속성을 사용할 경우, HTML 파싱이 종료될 때까지 기다렸다가 다운로드된 스크립트를 순서대로 실행
시키고, async 속성을 사용할 경우 다운로드가 완료될 때마다 파싱을 잠시 멈춘 후 스크립트를 실행
시키므로 스크립트 태그 처리의 효율성을 높힐 수 있다.
파싱 중 script 태그를 만나면 렌더링이 멈추는 이유
자바스크립트 코드를 파싱하기 위해
렌더링 엔진에서 자바스크립트 엔진으로 제어권이 넘어가
기 때문이다.
컴퓨터 간 통신을 위한 가장 보편적인 '프로토콜 스위트'(프로토콜의 집합체)
로, IP(인터넷 프로토콜)와 TCP(전송 조절 프로토콜)를 핵심 개념으로 하는 규칙
이다.데이터의 전달 여부를 확인할 수 없고 순서를 보장하지 않
는다. TCP는 IP 위에서 동작하는 프로토콜로, 데이터의 전달 여부를 확인할 수 있고 순서(보낸 순서대로 받도록)를 보장
받는다. 즉, TCP/IP를 사용하겠다는 것은 IP Routing을 통해 목적지에 도달
하며 TCP의 특성을 활용해 송신자와 수신자를 연결하여 데이터의 신뢰성을 유지
하겠다는 것을 의미한다.DOM 요소 혹은 CSS 스타일
에 변경점이 있을 때HTTP URI를 통해 이름을 명시하여 리소스를 구분
하고 HTTP 메서드를 통해 상태를 주고받는
원칙이다. / REST API는 이러한 REST 원칙을 기반으로 하는
API를 의미하고 RESTful API란 이 원칙을 잘 지켜 이해하기 쉬운
API를 의미한다.API(Application Programming Interface)
서로 다른 소프트웨어가 상호 작용할 수 있도록 도와주는 인터페이스(=규칙)
URL을 통한 HTTP 요청을 위한 개념
으로, 리소스를 식별
하고 싶으면 Path Variable을 사용하고, 정렬이나 필터링 등의 추가적인 정보를 요청
한다면 Query Parameter(=Query String)를 사용한다.하드웨어와 응용 프로그램이 상호 작용할 수 있도록 돕는 시스템 소프트웨어
이다. 프로세스, 메모리, 파일 시스템
등을 관리한다.운영체제에서 실행 중인 프로그램
이고, 스레드는 프로세스에서 실행되는 작업의 단위
이다.서버에 트래픽이 과중되게 하여 웹 사이트 또는 리소스를 사용할 수 없게 만드는 공격
이고 DDOS는 여러대의 컴퓨터를 이용한 DOS 공격
이다. 서버가 받는 트래픽을 로드 밸런서를 통해 분산
하는 설계 패턴이다.순서대로
여러 서버에 번갈아가며 분산시킨다.랜덤으로
분산시킨다.가장 여유로운 서버
에 트래픽을 할당한다.성능이 좋은 서버
에 많은 트래픽을 할당한다.문제 상황 인식하고 해결 방법 도출
하여 프로그래밍 언어를 통해 컴퓨터에게 명령을 내리는 일
이다.사람이 이해할 수 있는 프로그래밍 언어
를 컴퓨터가 이해할 수 있는 기계어
로 변환하는 일종의 번역기이다. / 컴파일러는 전체 코드를 한번에 변환
하여 초기 로딩 속도가 느리지만 실행 속도가 빠르다
. (컴파일 단계와 실행 단계가 나뉘며 실행 파일을 생성한다. C, C++, C#, Java 등이 대표적인 컴파일러 언어이다.) / 인터프리터는 코드를 한 줄씩 변환
하여 초기 로딩 속도는 빠르나 실행 속도가 느리다
. (인터프리트 단계와 실행 단계가 나뉘지 않기 때문에 실행 파일도 없다. JavaScript, Python 등이 대표적인 인터프리터 언어이다.) 실행 속도를 보완
하기 위해 JIT(Just-In-Time) 컴파일러
를 함께 사용한다.HTML/CSS/JS와 같은 웹 언어와 Private API 혹은 Public API를 사용하여 사용자 인터페이스를 구축하는 직무
이다.웹에서 사용하는 기술들을 표준화된 방식으로 작성하는 것
을 의미한다. 웹 표준을 지키면 다양한 브라우저에서의 호환성
과 검색 엔진 최적화
등의 측면에서 장점이 있다.신체적, 환경적 조건에 관계없이 웹에 접근할 수 있도록 하는 것
을 의미한다. 웹 접근성을 지키면 다양한 사용자를 대상
으로 동등한 기회를 부여
할 수 있다.웹 애플리케이션이 여러 브라우저 및 여러 버전에서 일관되게 동작하도록 하는 작업
이다. 여러 브라우저들은 각각의 렌더링 엔진이 다르기 때문에
크로스 브라우징 작업을 통해 브라우저마다 동일한 화면이 보이도록 할 필요가 있다. 'Can I Use'와 같은 사이트를 통해 각 브라우저의 호환성을 검토
할 수 있다여러 개의 파일을 하나로 합쳐 웹 페이지에서 사용할 수 있는 형태로 가공
하는 '모듈 번들러'이고, babel은 최신 자바스크립트 문법(ES6)을 이전 버전(ES5)으로 변환해주어 다양한 브라우저에서 동작 가능한 코드로 변환
해주는 '컴파일러'이다.CRA
를 사용하면 webpack, babel의 초기 설정
이 쉽게 가능하다. (이 경우, eject 혹은 customize-cra 와 react-app-rewired와 같은 라이브러리
를 사용하여 webpack 설정을 수정
할 수 있다.)esbuild를 사용하여 빠르게 개발 환경을 세팅해주는 빌드 도구
로, Webpack을 대체
할 수 있다. 개발 환경에서 아주 높은 속도
를 보여준다.양방향 데이터 흐름
을 의미하고, Flux 패턴은 단방향 데이터 흐름
을 의미한다. React는 Flux 패턴
을 따르고, Vue와 Angular는 MVVM 패턴
을 따른다.신속한 반복 작업을 통한 고객과의 협력 및 개인과의 상호 작용을 강조
하는 개발 방법론이다.코드를 작성하기 테스트 케이스를 작성
해보는 개발 방법론이다. 테스트 케이스를 작성할 때 주로 작은 단위로 만들기 때문에 코드가 방대해지지 않으면서 코드의 모듈화가 자연스럽게 이루어진다
. TDD 도구로는 Jest, Mocha
등이 있다.웹 보안 공격
으로, XSS는 악의적인 스크립트를 삽입하는 공격
이고, CSRF는 사용자의 의도와 무관하게 사용자 권한을 이용하여 악의적인 요청을 보내는 공격
이다.HTML 문자를 HTML Entity로 변경해주는 Sanitize 조치
를 취할 수 있다.사용자의 세션과 연결된 CSRF Token을 생성
하여 모든 요청에 해당 토큰을 포함시켜 검증
하도록 해야 한다.애플리케이션 동작과 연관된 라이브러리를 관리하는 속성
이고, devDependencies는 개발 환경에서만 필요한 라이브러리를 관리하는 속성
이다. dependencies는 포함
되고 devDependencies는 포함되지 않
는다.동일한 프로토콜, 호스트명, 포트를 가져야만 리소스를 공유할 수 있다는 정책
을 두고 있다. CORS란 이를 해결하기 위한 '교차 출처 리소스 공유 정책'으로, 서버에서 특정 조건에서 데이터 접근 권한을 허용하여, 출처가 다른 도메인에서의 요청을 가능하도록 하는 정책
이다.SOP는 브라우저의 정책
이기 때문에, 서버 간의 통신은 SOP가 적용되지 않
는다. 그러므로 프록시 서버를 사용하면 SOP를 우회할 수 있다. 클라이언트의 요청을 프록시 서버에 위임하고, 프록시 서버에서 데이터 요청을 전송하고, 서버가 응답 결과를 클라이언트에게 전달
한다. 이 방식을 사용하면 클라이언트 측에서 SOP 관련 이슈 없이 서로 다른 출처에서 리소스를 공유할 수 있다.HTTP의 비연결성 지향, 무상태 성격
으로 인해, 클라이언트(브라우저)는 새로고침이나 페이지 이동 시 서버로부터 받은 데이터(주로 사용자 인증 데이터)를 잃게 된다
. 이러한 문제는 클라이언트가 데이터를 쿠키, 세션, 웹 스토리지에 저장
함으로써 해결할 수 있다. / 쿠키와 웹 스토리지는 클라이언트에 저장
되고 세션은 서버에 저장
된다. 따라서 쿠키와 웹 스토리지는 세션에 비해 보안이 취약
한데, 특히 쿠키는 자동 전송 위험이 있어 CSRF 위험
이 있고 모든 요청에 쿠키가 포함되어 서버 부담이 증가
한다. / 데이터의 유효 기간
에도 차이가 있는데, 쿠키는 만료 기간에 따라 종료
되고, 로컬 스토리지는 영구적으로 저장
되며 세션 스토리지와 세션은 브라우저를 닫으면 종료
된다. 따라서 쿠키는 팝업창
, 로컬 스토리지는 자동 로그인
, 세션 스토리지는 브라우저를 닫을 때 로그아웃되는 로그인
, 세션은 쿠키와 함께 사용해서 일정 시간동안 유지되는 로그인
을 구현하기 유리하다.
세션과 쿠키를 사용한 로그인
- 서버는 사용자를 식별하기 위한
고유한 세션 ID를 만들어 서버에 저장
하고. 클라이언트에쿠키로 전달
- 클라이언트에서 서버로 요청을 보낼 경우,
쿠키에 저장된 세션 ID를 같이 전달
. 서버는저장된 세션 ID와 비교
하여 사용자 인증
- 서버는 각 사용자마다 고유한 세션 ID를 저장해야 하기 때문에
서버의 부담이 높고 확장성이 좋지 않다
.
브라우저 저장소와 상태 관리 라이브러리의 차이
브라우저 저장소 :
- 디스크에 저장된다 → 새로고침해도 값이 유지된다.
- 사이드 이펙트가 발생하지 않는다.
상태 관리 라이브러리 :
- 메모리에 저장된다 → 새로고침하면 값이 사라진다. (recoil-persist를 통해 브라우저 저장소와 연결 가능)
- 상태가 바뀌었을 때의 리렌더링이 일어난다.
클라이언트와 서버 간의 유효성 검사를 위해 토큰을 사용하는 인증 방식
이다. JWT, Oauth2.0 등의 방식이 대표적이다.
JWT(JSON Web Token)
JSON 형태의 Token을 사용하는 토큰 기반 인증 방식
으로,Header, Payload, Signature
로 이루어진다.
페이로드에 사용자 정보를 포함
하고 있기 때문에,사용자 정보를 서버에 따로 저장할 필요가 없
다. 즉서버 부하를 줄일 수 있고 확장성이 뛰어나다
.
로그인 성공 시서버는 토큰을 발급하여 클라이언트에게 전달
하고,클라이언트는 이를 쿠키나 웹 스토리지에 저장하여 서버에 인증이 필요한 요청을 보낼 때 사용
한다.
소스 코드를 관리하는 형상 관리 도구
이고, GitHub는 Git의 웹 호스팅 서비스
이다.코드 컨벤션을 위한 도구
로, ESLint는 함수 선언, 반복문 등의 '코딩 방식'을 통일하고
, Prettier는 공백, 줄바꿈, 들여쓰기 등의 '코드의 스타일'을 통일
한다.자주 사용하는 데이터를 임시로 저장하는 저장 공간
으로, 캐시를 사용하면 반복적인 요청에 대한 응답 시간 및 네트워크 사용을 최소화
할 수 있다.사용자 인증
을 위해 주로 사용되고, 캐시는 이미지, 동영상 등을 임시 저장
하기 위해 주로 사용된다.REST API는 웹 표준을 따라 고유한 엔드포인트 사용하기 때문에 'HTTP 캐싱 전략'을 그대로 사용
할 수 있다.
HTTP 캐싱 전략
각각의 엔드포인트에서 헤더를 사용하여 캐싱을 구현하는 것
클라이언트와 서버 간 데이터 통신을 위한 쿼리 언어
로, 한번의 요청으로 가져오고 싶은 모든 데이터를 가져올 수 있
다.
GraphQL은 하나의 엔드포인트를 갖기 때문에 HTTP의 캐싱 전략을 사용할 수 없
다. 따라서 캐싱을 구현하려면 영속 쿼리나 아폴로 클라이언트
를 사용하여 GraphQL의 결과를 따로 관리해야 한다.
Query
데이터베이스나 API 등에서 정보를 요청하거나 조회할 때 사용하는 언어
클라이언트와 서버 간 데이터를 교환하는 실시간 양방향 통신 프로토콜
로, 채팅
구현에 사용할 수 있다.서버에서 클라이언트로 데이터를 보내는 실시간 단방향 통신 프로토콜
로, 알림
구현에 사용할 수 있다.