브라우저에서 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: ? autodisplay: flex, justify-content: center, align-items: centerposition: 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 문법을 사용할 수 있어서 변수, 수학 연산자, 함수 등의 기능을 사용할 수 있다.월드 와이드 웹(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 등에서 정보를 요청하거나 조회할 때 사용하는 언어
클라이언트와 서버 간 데이터를 교환하는 실시간 양방향 통신 프로토콜로, 채팅 구현에 사용할 수 있다.서버에서 클라이언트로 데이터를 보내는 실시간 단방향 통신 프로토콜로, 알림 구현에 사용할 수 있다.