개발자 지망생의 고군분투’ 시리즈

신입 개발자 기술면접 준비하기

  • 0
  • 0
0
0

문제는 이곳에서 발췌한 것과 제가 임의로 추가한 내용입니다. 아래에는 제가 아는 정도만 작성하였으며 지속적으로 추가할 예정입니다. 잘못된 지식에 대한 비판은 언제나 환영이며 적극적으로 수용하도록 하겠습니다.


전산 기초


개발상식


객체 지향 프로그래밍이란 무엇인가?

절차지향 프로그래밍은 오로지 컴퓨터 관점에서의 프로그래밍 패러다임이라면 객체지향은 인간이 구분할 수 있는 요소를 객체로 표현한 인간 중심적 프로그래밍 패러다임이다. 객체는 기억장소와 이 기억장소의 값을 변경할 수 있는 연산의 집합 클래스가 정의되면 객체를 선언할 수 있다. 많은 객체 지향 언어에서 객체는 클래스로 그룹화 된다. 생성된 클래스로 객체의 특정 예를 생성하는데 이를 인스턴스라고 부른다. 객체 간의 정보 교환이 모두 메시지 교환을 통해 일어난다.

함수형 프로그래밍이란?

객체 지향 언어의 유일한 단점은 객체가 상태를 가지고 있다는 것이다. 함수형 프로그래밍은 모든 오퍼레이션이 새로운 오퍼레이션을 가진다. 인풋을 변경시키지 않고 변경한 아웃풋만 제공한다. 함수형 프로그래밍이 언제나 높은 효율을 보이는 것은 아니다. 상황에 따라 다르며 특히 맵리듀스를 해야하는 상황이라면 효율적이다.

RESTful API란 무엇인가?

REST는 자원(Resource), 행위(Verb), 표현(Representations)으로 구성된 API 아키택쳐이다. 웹의 장점과 HTTP의 우수성을 적극 활용할 수 있는 아키텍처로 URI를 통해서 자원을 명시하고 POST, GET, PUT, DELETE등의 Method를 통해서 해당 자원의 CURD 연산을 적용하는 것을 의미한다. 코드의 재사용성을 높일 수 있으며 프론트엔드와 백엔드의 완전한 분업이 가능해진다.

TDD란 무엇이며 어떠한 장점이 있는가?

테스트 주도 개발(Test Driven Development), 테스트를 먼저 만들고 테스트를 통과하기 위한 코드를 작성하는 것을 의미하며 모듈화가 자연스럽게 잘 이루어지면서 개발이 진행된다. 테스트 커버리지가 높아져 리팩토링과 유지보수가 쉬워진다.

MVC 패턴이란 무엇인가?

모델(Model), 뷰(View), 컨트롤러(Controller)가 분리된 형태의 아키텍처이다. 세가지가 결합된 형태에서는 어플리케이션의 확장이 어렵다. 모델은 데이터 처리, 뷰는 사용자 인터페이스 처리, 컨트롤러는 비즈니스 로직을 처리하는 등 각각의 요소가 하나의 역할만 담당한다.

Git과 GitHub에 대해서

버전 관리를 위한 도구

Docker와 VM의 차이점

Dcoker는 하드웨어를 가상화하는 계층(Hyper-V)이 없으며, 호스트의 자원을 직접 이용하기 때문에 메모리 접근, 파일시스템, 네트워크 속도가 가상머신에 비해 월등히 빠르다.


자료구조


순차 자료구조 vs 연결 자료구조

순차 자료구조는 메모리 상에서 일렬로 나열된 데이터형이며 연결 자료구조는 메모리 상에서는 분산되어 있지만 하나의 노드가 다음 노드로 이어지는 포인터를 가지고 있어 연속적으로 접근이 가능한 데이터형이다. 삽입과 읽기를 비교해보면 아래와 같다.

데이터 삽입

  • 순차 자료구조 : 마지막 인덱스에 데이터를 삽입하는 경우엔 항상 빠르다. 처음 혹은 중간에 삽입하는 경우 자리교환으로 인한 오버헤드가 발생하므로 느리다.
  • 연결 자료구조 : 데이터를 어디에 삽입하던 해당 노드까지 엑세스하는 시간이 소요된다. 자료 추가시 연결된 노드의 링크만 교체하면 되므로 빠르다.

데이터 읽기

  • 순차 자료구조 : 탐색하려는 위치를 알고 있다면 즉시 엑세스 할 수 있으므로 빠르다. 위치를 모른다고 하더라도 메모리 상에서 근접한 데이터의 접근이 더 빠르므로 연결 자료구조보다 빠르다.
  • 연결 자료구조 : 위치를 알던 모르던 관계없이 헤더 혹은 테일부터 찾으려는 위치까지 탐색이 필요하며 메모리에서 노드가 분산되어 있으므로 순차 자료구조에 비해 느리다.
스택과 큐
  • 스택은 가장 먼저들어 온 개체가 가장 마지막에 나가는(Last in first out, LIFO) 방식을 사용하는 자료구조이며 대부분은 펜케이크에 비유뙨다. 아래에서 위로 데이터를 쌓고 위에서 아래로 데이터를 지운다.
  • 큐는 가장 먼저 들어온 개체가 가장 먼저 나가는(First in first out, FIFO) 방식을 사용하는 자료구조이며 대부분은 택시정거장에 비유된다. 뒤에서 데이터가 들어오고 앞으로 데이터가 지워진다.
트리

트리는 계층구조를 표현하기 위해서 사용하는 자료구조이다. 트리의 크기를 제한하면 트리의 연산이 단순해지고 명확해지는데 차수를 2개 이하로 정의한 것이 이진 트리이다. 이진 트리의 종류로는 스레드 이진 트리, 이진 탐색 트리, AVL 트리 등이 있다.

힙(Heap)

힙는 이진트리의 한 종류로 나열한 두 가지 조건이 성립하는 이진 트리를 의미한다.

  1. 완전 이진 트리여야 한다.
  2. 부모 노드와 자식 노드간에 크기 관계가 성립해야 한다.

루트 노드가 가장 크고 자식 노드가 부모 노드보다 작으면 최대 힙이라 부르고, 반대의 경우는 최소 힙이라 부른다. 힙은 최댓값과 최솟값에 접근하기 위해 사용하며 성능이 매우 빠르다.

그래프

정점과 에지로 이루어진 형태의 자료구조다. 에지의 방향성의 존재 유무에 따라서 유향 그래프와 무향 그래프로 분리되며, 에지가 가중치를 가지고 있다면 가중치 그래프라고 부른다. 그래프는 행렬과 연결리스트를 활용하여 구현할 수 있는데 행렬의 경우 정점의 존재 여부와 상관없이 항상 n^2의 공간 복잡도를 가진다.

트리와 그래프의 차이점

구현이나 동작의 형태로는 트리와 그래프는 동일하다고 생각된다. 트리와 그래프의 유일한 차이점은 그래프에는 루트 노드가 존재하지 않는 다는 것. 트리에서는 루트 노드로 되돌아오는 에지가 존재하지 않다는 점이다.

해쉬

해쉬는 임의의 크기를 가진 데이터를 고정된 크기의 값으로 변환시키는 것을 말한다. 해쉬를 이용하여 임의의 데이터를 숫자로 변경하는 해쉬 함수를 정의하면 배열의 인덱스를 원하는 데이터 값으로 저장하거나 찾을 수 있다. 기존에는 탐색을 위한 시간이 소모됨에 반해 해쉬를 이용하면 즉시 데이터에 엑세스 할 수 있다.


네트워크


GET, POST 방식의 차이점
  • GET : 클라이언트는 GET 요청시 URIHeader 에만 데이터를 담아서 전송할 수 있으므로 데이터 크기가 제한적이며 URI에 포함된 데이터는 사용자에게 그대로 노출된다. GET 요청은 캐싱이 가능하므로 단순 조회이거나 데이터가 사용자에게 노출되어도 상관없다면 적극 활용하는게 좋다.
  • POST : 데이터를 URIHeader 그리고 Body에 담아서 전송할 수 있으므로 GET 방식보다 전송할 수 있는 데이터가 현저히 크다. Body 데이터는 일반 사용자에게 노출되지 않으므로 안정적으로 데이터를 전송할 수 있다.
TCP 3-way-handshake
  • Client는 Server에 접속 요청 메세지(SYN)을 전송하고 SYN_SEND 상태가 된다.
  • Server는 SYN 요청을 받고 Client에 요청을 수락(SYN+ACK)하고 SYN_RECEIVED 상태가 된다.
  • Client는 Server에게 수락 확인(ACK)를 보내고 Server는 ESTABLISHED 상태가 된다.
TCP와 UDP의 차이점
  • TCP : 신뢰성과 순차적인 전달이 필요한 경우 사용한다. TCP 서비스는 송신자와 수신자 모두가 소켓이라고 부르는 종단점을 생성함으로써 이루어진다. TCP는 멀티캐스팅이나 브로드캐스팅을 지원하지 않는다.
  • UDP : 비연결형 프로토콜이며 손상된 세그먼트의 수신에 대한 재전송을 하지 않는다. UDP를 사용하는 것에는 DNS가 있다. 사전에 설정이 필요하지 않으며 그 후에 해제가 필요하지 않다.
HTTP와 HTTPS의 차이점

HTTP의 문제점은 평문 통신이기에 도청이 가능하다는 것, 통신 상대를 확인하지 않기 때문에 위장이 가능하다는 것, 완정성을 증명할 수 없기 때문에 변조가 가능하다는 것이다. TCP/IP 구조의 통신은 패킷을 수집하는 것만으로도 도청할 수 있다. 이를 해결하는 방법으로 통신 자체에 SSL을 적용하거나 콘텐츠 자체를 암호화하고 복호화하는 처리를 진행할 수 있다. 통신 자체에 SSL이 적용된 통신을 HTTPS라 칭한다.

DNS round robin 방식

DNS를 이용해서 하나의 서비스에 여러 대의 서버를 분산 시키는 방법이다. 동일한 이름으로 여러 레코드를 등록 시키면 질의 할 때마다 다른 결과를 반환하며, 이 동작을 이용함으로써 여러 대의 서버에 처리를 분산 시킬 수 가 있다. 단점은 아래와 같다.

  • 서버의 수 만큼 공인 IP 주소가 필요하다.
  • DNS 질의 결과 캐싱으로 인해 균등하게 분산되지 않는다.
  • 서버가 다운되어도 확인이 어렵다,
웹 통신의 흐름

추후 추가 예정


운영체제


프로세스와 스레드의 차이

추후 추가 예정

스케줄러의 종류

추후 추가 예정

CPU 스케줄러

추후 추가 예정

동기와 비동기의 차이

추후 추가 예정

멀티스레드

추후 추가 예정

프로세스 동기화

추후 추가 예정

메모리 관리 전략

추후 추가 예정

가상 메모리

추후 추가 예정

캐시의 지역성

추후 추가 예정


데이터베이스


사용하는 이유

추후 추가 예정

인덱스

추후 추가 예정

정규화

추후 추가 예정

트렌잭션

추후 추가 예정

Statement vs PrepareStatement

추후 추가 예정

NoSQL

추후 추가 예정


프로그래밍 언어


Java

자바를 잘 몰라서 일반적인 질문에만 답변을 해봤습니다.


JVM, GC의 원리

추후 추가 예정

콜렉션

추후 추가 예정

어노테이션

추후 추가 예정

제내릭

제네릭은 다양한 타입의 객체들을 다루는 메서드나 컬렉션에 컴파일 시 타입 체크를 해주는 기능이다. 클래스 내부에서 사용할 데이터 타입을 나중에 인스턴스를 생성할 때 확정하는 것을 제네릭이라 한다. 객체의 타입을 컴파일 시에 체크하기 때문에 객체의 타입 안정성을 높이고 형변환의 번거로움이 줄어든다.

파이널

원시 변수에 final 선언 시 immutable하여 상수로 사용 가능하다. 객체 변수에 final 선언시 레퍼런스 변경이 불가능하다. 하지만 객체 자체는 mutable하다. 메서드에 final 선언 시 override가 불가능 하다. 클래스에 final 선언 시 상속이 불가능하다.

오버라이딩 오버로딩
  • 오버로딩 : 같은 이름의 메소드를 여러 개 가지는 것이다. 이때 매개변수가 서로 달라야 한다.
  • 오버라이딩 : 상속 시 부모 클래스의 메소드를 상속 받은 자식 클래스에서 재정의 하는 것이다.
Access Modifier

추후 추가 예정

Wrapper class

추후 추가 예정

Multi-Thread 환경에서의 개발

추후 추가 예정


Javascript


자바스크립트 이벤트 루프

이벤트 루프는 Task QueueCall Stack을 감시하여 Call Stack에 처리할 함수가 비어있고, Task Queue에 처리할 함수가 존재하면, Task Queue에 있는 함수를 Call Stack으로 전달하는 역할을 담당한다.

예를들어 setTimeout 같은 경우에는 WebAPI에 등록되어 타이머를 측정한다. 이후 타이머가 끝나면 Task Queue에 프로그래머가 지정한 Callback 함수가 등록되며 Event LoopCall Stack에 내용이 없다는 것을 확인하면 Task Queue에 있는 콜백 함수를 Call Stack에 등록한다.

Prototype

자바스크립트의 모든 객체는 부모 역할을 담당하는 객체와 연결되어 있다. 이때 연결된 부모 객체를 prototype이라 한다. 프로토타입 프로퍼티는 함수 객체만 가지고 있다. 함수 객체가 생성자로 사용될 때 이 함수를 통해 생성된 인스턴스의 부모 역할을 하는 객체를 가리킨다.

특정 프로퍼티나 메소드에 접근할 때 해당 객체에 프로퍼티 또는 메서드가 없다면 프로토타입 인터널 슬롯(__proto__)이 가리키는 링크를 따라 부모 역할을 담당하는 객체의 프로퍼티 또는 메서드를 차례대로 검색한다. 이것을 프로토타입 체인이라고 한다.

Hoisting

변수는 3단계에 걸쳐 생성되는데

  1. 선언 단계 : 변수 객체에 변수를 등록한다.
  2. 초기화 단계 : 변수 객체에 등록된 변수를 메모리에 할당한다. 변수는 undefined로 초기화 된다.
  3. 할당 단계 : 초기화된 변수에 실제값을 할당한다.

var 변수는 1, 2 단계가 동시에 실행된다. 변수 객체에 변수가 등록되고 변수는 메모리에 공간을 확보한 후 undefined로 초기화 된다. 따라서 변수 선언문 이전에 변수에 접근하여도 변수 객체에 존재하기 때문에 에러가 발생하지 않는다. 이러한 현상을 호이스팅이라고 한다.

Closure

함수를 일급 객체로 취급하는 함수형 프로그래밍 언어의 중요한 개념으로 자신이 생성될 때의 환경을 기억하는 함수이다. 예를들어 어떤 함수(외부 함수)가 있고 그 내부에 지역변수와 이 지역변수를 참조하는 내부 함수가 존재할 때 외부 함수가 내부 함수를 반환하면 외부 함수의 생명주기는 끝나지만 그 안에 선언되었던 지역변수는 내부 함수에 의해 참조되어 유지되는데 이러한 내부 함수를 클로저라고 한다.

내부 함수가 실행될 때 내부함수는 다음의 변수 객체를 가진다.

  1. 전역 객체
  2. 외부 함수의 스코프를 가리키는 활성 객체
  3. 내부 함수의 스코프를 가리키는 활성 객체

외부 함수의 스코프를 가리키는 활성 객체는 내부 함수에 의해 참조되는 한 유효하다. 만약 어떤 변수를 검색할 때 우선 3번에서 검색이 이뤄지며 존재하지 않으면 2번, 1번으로 순차적으로 검색한다. 클로저가 필요한 경우는 다음과 같다.

  • 상태 유지
  • 정보 은닉
  • 전역 변수 억제
this에 대해서

많은 프로그래밍 언어에서 this는 객체의 인스턴스를 가리키는 값이다. 자바스크립트에서는 호출하는 방법이나 엄격 모드의 유무 등 상황에 따라서 의미하는 값이 달라진다.

함수에서 this는 호출 방법에 따라서 달라진다. 느슨한 모드에서 단순 호출인 경우 thiswindow 또는 global로 설정된다. 엄격한 모드에서는 undefined이다. callapply를 이용한 호출인 경우 첫번째 인자의 객체가 this가 된다. bind 메서드를 사용하면 넘겨준 객체가 '영구적'으로 this가 되는 함수가 반환된다. bind로 생성된 함수는 callapply에서 전달된 객체를 무시한다. 화살표 함수는 자신을 감싼 영역의 this와 동일한 값을 '영구적'으로 가진다. bind, call, apply에서 전달된 객체를 무시한다.

생성자 함수, 메서드 또는 프로토타입에서 this는 객체의 인스턴스를 의미한다.

이벤트 핸들러(addEventListner)에서 this는 이벤트가 발생한 요소를 의미하며 e.currentTarget과 같다.

Promise

ES6에서 추가된 비동기 처리를 위한 패턴이다. 기존 콜백 패턴이 가졌던 콜백 지옥과 같은 가독성 문제나 예외 처리가 어려웠던 문제를 보완하며 비동기 처리 시점을 명확히 표현할 수 있는 이점이 있다.


Python


Generator

Generatoriterator를 생성해 주는 function이다. iteratornext()메소드를 이용해 데이터에 순차적으로 접근이 가능하다. generator 함수가 실행 중 yield 를 만날 경우 함수는 그 상태로 정지 되며 반환 값을 next()를 호출한 쪽으로 전달한다. 이후 다시 generator 함수가 실행되면 종료된 시점에서 다음 yield까지 실행된다.

클래스를 상속했을 때 메서드 실행 방식

인스턴스의 메서드를 실행한다고 가정할 때 __getattribute__()로 bound 된 method 를 가져온 후 메서드를 실행한다. 상속할때 왼쪽에 가까운 순서대로 우선순위가 높아진다.

GIL과 그로인한 성능 문제

GIL(Global Interpreter Lock)은 여러 스레드가 동시에 실행되는 걸 막는다. 덕분에 구현이 간단하고 레퍼런스 카운팅 오버헤드가 적다. GIL로 인해 성능 문제가 대두되는 경우는 압축, 정렬, 인코딩 등 수행시간에 CPU의 영향이 큰 작업을 멀티 스레드로 수행하도록 한 경우인데 GIL로 인하여 멀티 스레드로 작업을 수행해도 싱글 스레드일 때와 별반 차이가 나지 않는다. 이를 해결하기 위해서 CPU의 영향이 큰 작업(CPU Bound)을 하는 경우 멀티 프로세스를 활용해야 하며 멀티 스레드는 파일 입출력, 네트워크 같은 입출력이 많은 작업(IO Bound)에 사용해야 한다.

GC 작동 방식

파이썬은 객체를 reference count를 통해 관리한다. 객체를 참조하는 횟수가 늘어날수록 해당 객체의 reference count는 증가하고 참조 횟수가 줄어들수록 reference count는 감소한다. reference count가 0이 되면 객체는 메모리에서 해제된다. 단, reference count가 0이 아닌 경우에도 자가 참조 혹은 삭제된 객체가 서로를 참조(순환 참조)하여 도달할 수 없는 경우에도 메모리에서 해제된다.

가비지 컬렉터는 세대와 임계값을 통해 가비지 컬렉션의 주기를 관리한다. 0세대의 경우 메모리에 객체가 할당된 횟수에서 해제된 횟수를 뺀 값이 threshold 0을 초과하면 실행된다. 다만 그 이후 세대부터는 조금 다른데 0세대 가비지 컬렉션이 일어난 후 0세대 객체를 1세대로 이동시킨 후 카운터를 1 증가시킨다. 이 1세대 카운터가 threshold 1을 초과하면 그때 1세대 가비지 컬렉션이 일어난다. 2세대도 1세대와 같은 방식으로 동작한다. 즉 1세대의 가비지 컬렉션은 threshold 0 * threshold 1 주기로, 2세대 가비지 컬렉션은 threshold 0 * threshold 1 * threshold 2 주기로 발생한다.

새로운 객체가 만들어 질 때 파이썬은 _PyObject_GC_Alloc()을 호출한다. 이 메서드는 객체를 메모리에 할당하고, 가비지 컬렉터의 0세대의 객체 할당 횟수를 증가시킨다. 그 다음 이 횟수가 threshold 0보다 큰지, gc.enabledtrue인지, threshold 0이 0이 아닌지, 가비지 컬렉션이 진행중이 아닌지 확인하고, 모든 조건을 만족하면 collect_generations()를 실행한다. 이때 가장 오래된 2세대 부터 역으로 검사하여 가비지 컬렉션을 진행한다.

PyPy가 CPython 보다 빠른 이유

CPython은 일반적인 인터프리터임에 반해 PyPy는 JIT(Just In Time)를 겸비한 인터프리터이기 때문이다. JIT는 인터프리터의 단점을 보완하기 위해 기계어 코드를 생성하면서 그 코드를 캐싱하여, 같은 함수가 여러 번 불릴 때 매번 기계어 코드를 생성하는 것을 방지한다.

메모리 누수가 발생할 수 있는 경우
  • 메서드 기본 인자 값으로 mutable 객체를 사용하고 있는 경우
  • 클래스 내 __del__ 메서드를 재정의 하는 경우
Duck Typing

Duck typing이란 특히 동적 타입을 가지는 프로그래밍 언어에서 많이 사용되는 개념으로, 객체의 실제 타입보다는 객체의 변수와 메소드가 그 객체의 적합성을 결정하는 것을 의미한다. 하나의 외부 메서드를 통해서 서로 다른 객체의 인자의 같은 이름의 메서드를 호출할 수 있다.


분야별


프론트엔드


브라우저의 작동 원리

브라우저의 핵심적인 기능은 사용자가 참조하고자 하는 주소를 웹서버에 요청하고 응답을 표현하는 일이다. 브라우저는 서버로부터 HTML, CSS, JavaScript, 미디어 파일을 응답받는데, HTML, CSS는 브라우저 렌더링 엔진의 HTML 파서와 CSS 파서로 의해 각각 DOMCSSOM으로 파싱되어 렌더 트리로 결합된다. 브라우저는 결합된 렌더 트리를 화면에 출력한다.

JavsScriptHTML 파서가 script 태그를 만나면 HTML 파싱을 중단하고 자바스크립트 엔진에 제어 권한을 넘겨준다. 자바스크립트 엔진은 인라인 스크립트 혹은 src 애트리뷰트에 명시된 스크립트 파일을 로드하여 코드를 파싱한 뒤 실행한다. 실행이 완료되면 자바스크립트 엔진은 HTML 파서로 제어 권한을 다시 넘겨주어 HTML 파싱이 재게된다.

따라서 스크립트 태그의 위치에 따라서 렌더링 속도에 큰 영향을 미칠 수 있다. 이를 방지하기 위해 스크립트 태그를 바디 태그가 끝나기 직전에 선언하거나 스크립트 태그에 defer 속성을 부여할 수 있다. defer 속성이 붙은 스크립트 태그는 </html>을 만난 시점에 스크립트가 실행되도록 한다.

스크립트의 defer 속성과 async 속성의 공통점은 HTML 파서가 파싱을 진행하는 동안 스크립트 파일의 fetch가 병렬적으로 이뤄진다. 차이점은 defer 속성이 붙은 스크립트는 HTML 파싱이 끝난 시점에 실행되고 async는 스크립트의 fetch가 끝난 시점에 실행된다는 것이다.

Document Object Model

텍스트 파일로 만들어진 웹문서의 요소를 각각의 객체로 만들고 트리 구조로 구성한 것이 DOM이다. 브라우저의 렌더링 엔진이 웹 문서를 로드한 후 파싱하여 브라우저가 이해할 수 있는 위와같은 구조로 메모리에 적재한다. DOM은 자바스크립트를 통해 동적으로 변경할 수 있으며 변경된 DOM은 렌더링에 반영된다.

CORS

추후 추가 예정

크로스 브라우징

대부분의 기기, 대부분의 브라우저에서 동등한 사용자 경험을 제공하는 것이다. 개발자의 경험은 사용자 경험에 포함되지 않는다. 개발자의 경험은 사용자 경험을 대표할 수 없다는 것을 염두에 두어야 하며, 고려해야 하는 크로스 브라우징 이슈는 다음과 같다.

  1. 자바스크립트의 파편화 (브라우저가 표준을 준수하지 않음)
  2. 브라우저에서 기능을 구현하는 방법이 다르거나 버그가 있을 때
  3. 지원하는 기술의 버전이 다른 경우 (구형 브라우저의 경우) : 이것을 해결하는 방법은 최신 문법으로 작성된 스크립트를 바벨등을 이용하여 하위 버전의 문법으로 컴파일하는 방법이 있다.
  4. 사이트가 느리거나 제대로 표시되지 않음 : 애니메이션이 다수 포함되어 저사양 기기에서 느린 현상과 PC를 기준으로 레이아웃이 구성되어 모바일에서는 정상적으로 사이트를 사용할 수 없는 현상을 의미한다.
  5. 스크린 리더와 같은 보조기술을 사용하거나 키보드로만 인터넷을 이용하는 사용자
웹 성능 문제점

추후 추가 예정

서버 사이드 렌더링 vs 클라이언트 사이드 렌더링

읽을 수 있는 문서가 서버에서 완성되면 서버 사이드 렌더링, 클라이언트에서 완성되면 클라이언트 사이드 렌더링이라 한다. SPA로 만들어진 대부분의 웹사이트에서 클라이언트 사이드 렌더링을 사용하나 서버 사이드 렌더링을 적용시킬 수 있다. 서버 사이드 렌더링의 주 목적은 초기의 빠른 로딩과 SEO가 대표적이다.

CSS Methodology
  • OOCSS (Object-Oriented CSS)
    • 소규모 모듈 형태의 CSS 클래스를 다수 생성하여 활용
    • 자손 선택자의 사용을 지향
    • 동일한 속성의 중복을 줄이는 것이 목표
  • BEM (Block, Element, Modifier)
    • 스타일링 대상를 블럭과 요소, 수정자로 구분
    • Block__Element--Modifier 네이밍 규칙을 가짐
    • HTML 문서 상에서 역할을 정확하게 파악할 수 있음
    • 개발자의 역량에 따라 가독성이 좌우되는 문제가 있음
  • CMACSS (Scalabel and Modular Architecture for CSS)
  • SUIT CSS
normalize.css vs reset.css
  • reset.css : 모든 브라우저의 기본 스타일링을 제거
  • normalize.css : 모든 브라우저의 통일된 기본 스타일을 생성

'개발자 지망생의 고군분투' 시리즈

개발자로 취업하려면 도대체 뭘 준비해야할까? 저도 그걸 몰랐습니다. 그래서 무작정 제가 하고 싶은대로 준비하였고 이 시리즈는 그 과정을 담아냈던 공간입니다. 다른 누군가가 취업을 준비할 때 참고가 된다면 좋을 것 같습니다. 도움이 될 수 있다면 더 좋겠네요! 😃
baealex
0분전
작성된 댓글이 없습니다. 첫 댓글을 달아보세요!
    댓글을 작성하려면 로그인이 필요합니다.