1. 백엔드란?
- 시스템의 뒷단을 의미하며 클라이언트(앱, 브라우저등) 프런트엔드 영역의 요청을 서버(컴퓨터)가 수행하도록 하는 역할
1-1 클라이언트와 서버는 어떻게 통신?
서로 정해놓은 약속인 프로토콜을 사용한다. 프로토콜은 네트워크의 일부로 가장 많이 사용되는 프로토콜은 HTTP 프로토콜이 있다.
2. DNS?
- IP는 인터넷에서 주소 역할을 하지만 사람이 외우기에 어렵다. 이것을 사람이 사용하기 편한 언어로 변경해서 사용하는 것이 DNS이다.
3. HTTP Method에 대해 설명
4가지가 있으며 get, post, put, delete 등이 있습니다.
Get은 서버에 리소스를 요청하기 위해 사용됩니다. 읽기만 하는 method로 서버에 영향이 없어 안전하고, 몇 번을 시도하든 상태가 동일 함으로 멱등성을 가지고 있다.
* 멱등성 : 여러 번 반복할 때와 한번 할 때 같은 효과를 지니고, 서버의 상태도 동일하게 남을 때.
Post는 리소스를 생성하기 위해 서버에 데이터를 보내는 데 사용되는 method이다. 서버에 데이터를 만드는 것으로 멱등성이 없다.
Put은 데이터를 전체적으로 업데이트를 하는 것이어서 Post와 다르게 멱등성을 가지고 있다. 동일한 url에 동일한 내용으로 계속 변경
fetch는 url에 대한 data를 부분적으로 업데이트하는 방식으로 구현에 따라 달라지지만 멱등성은 없다.
Delete는 한번 삭제하면 계속 삭제가 돼있어서 멱등성이 있다.
4.HTTP 상태 코드 - 중요한 정보를 간편하게 전달가능, HTTP에서 공통으로 약속, 100 단위로 내용의 큰 틀이 다름
2xx : 요청이 성공
- 200: OK, 201: 생성,
3xx : 요청이 다른 곳으로 가야 할 때 redirect - 추가 처리가 필요
4xx : 잘못된 요청
- 400: 잘못된 요청, 401: 권한 없는 사람이 요청, 403: 특정한 일에 대한 권한, 404: 존재하지 않을 때, 409: 충돌
5xx : 예상치 못한 서버 에러
- 500: 서버에러, 502: 서버가 어떻게 처리 모를 때, 503: 서버가 준비가 안됬을 때
5. 프로세스와 스레드의 차이
프로세스는 자원을 할당받는 작업의 단위이며, 스레드는 프로세스가 할당받은 자원을 이용하는 실행의 단위. 스레드는 자원을 공유(data, code, heap)한다는 점이 차이점이 있습니다.
6.RDB와 NoSQL의 차이
RDB는 스키마(SCHEMA)를 이용해서 데이터 정리, 타입 정의 가능, 관계 맺을 수 있음 관계를 읽고 쓸 때 SQL을 사용함
NoSQL은 schema-less, Non-relation로 용도에 따라 저장 형태가 다름, 관계와 스키마가 없어서 데이터를 중복해서 저장하게 된다. -> 코드에서 해결해야 한다. -> 개별적으로 데이터 저장
7.DB 인덱스 사용 시 장점, 단점
인덱스는 DB 테이블에 대한 검색 성능의 속도를 높여주는 자료구조이다. 특정 칼럼에 인덱스를 생성하면, 해당 칼럼의 데이터들을 정렬하여 별도의 메모리 공간에 데이터의 물리적 주소와 함께 저장된다.
장점으로는 검색속도 향상, 시스템의 부하를 줄여 성능향상에 기여한다.
단점 : 인덱스를 위한 추가 공간 필요, 생성에 시간이 소요됨, 생성, 수정, 삭제에 대한 성능이 하락할 수 있다.
8. DB 정규화
DB의 중복을 없애는 작업으로 무결성 유지와 DB 저장용량 절감을 목표로 정규화를 합니다. 테이블의 칼럼이 하나의 값을 갖도록 테이블을 분리하는 것이 1 정규화이고 1 정규화를 진행한 테이블에
9. ORM
Object Relational Mapping으로 어떻게 오브젝트를 테이블로 바꾸고 사용할지를 대신해 주는 소프트웨어 - 코드로 스키마를 정의하고 테이블로 만들어주고 사용해 준다. 데이터베이스를 추상화해 주는 프로그램
장 : DB쿼리를 신경 안 쓰고 비즈니스 로직에 시간 투자가능, 반복되는 쿼리를 줄여줌, 데이터베이스를 추상화해 줌 (DB 종류에 신경 안 씀)
단 : 복잡하고 상세한 쿼리는 쿼리문을 사용해야 효율이 나온다. 최적화에는 아쉬울 수 있음(DB가 무겁고 성능이 중요하면 sql을 쓰자)
9-1N+1
ORM에서 관계가 설정이 되어있을 때 관계가 설정된 엔티티를 조회할 경우에 조회된 데이터 개수(n)만큼 관계의 조회 쿼리가 추가로 발생하여 데이터를 읽어오는 문제를 말한다. 1번의 쿼리를 사용해 n건의 데이터를 가져오는데, 관련 칼럼을 얻기 위해 추가적으로 n번의 쿼리가 실행되는 문제. eager loading은 로딩 시 참조해야 하는 정보를 미리 가져오는 - 불필요한 데이터 많이 로드, 긴 초기 로딩 시간, 연결이 많아지면 그만큼 느려 짐 lazy loading 은 필요한 순간에만 데이터를 가져오는 - TypeORM에서는 실험적 방법, promise를 이용해야 함 user와 post(1:n) -> user를 조회(1개) -> post를 n회 조회 -> n+1 relation으로 해결, qureybuilder나 10. node가 싱글 스레드인데 여러 가지 병렬 작업이 되는 이유?
10.Node는 2개의 스레드로 구성
1. 이벤트 루프(메인스레드) - 자바스크립트를 동작하는 메인 스레드로 메인으로 돌아가는 스레드가 하나이어서 싱글 스레드라고 부른다. 비즈니스로직을 수행하며 수행도중 블로킹 I/O 작업을 만나면 커널 비동기 또는 스레드 풀에게 넘겨주는 역할을 한다.
2. Thread Pool이란 이벤트 루프가 싱글 스레드이지만 이벤트 루프인 libuv를 통해 블로킹 작업을 따로 모아 처리하는 스레드들의 집합이다.
-> 메인 스레드(싱글- V8)가 비동기, 블로킹으로 처리되는 일은 callback으로 Node API(Libuv) 포함 모듈에 보내주면 병렬적으로 처리한 뒤 TeskQueue에 넣음
10-1 Node에서 비동기 돌아가는 원리
노드는 싱글스레드여서 call stack이 하나이지만 이벤트루프(libuv)로 Node API(멀티스레드 - 스레드풀)가 블로킹이 되는 작업들을 처리 후 TeskQueue에 넣어주고 Call Stack이 비어었으면 TeskQueue에 있는 내용을 call stack에 넣어준다.
11. 세션과 쿠키의 차이
세션(세션아이디, 사용자 아이디, 유효기간)을 만들고 정보를 세션 DB 혹은 메모리에 저장하고 클라이언트에 세션아이디를 보내준다.
-> 서버의 자원을 사용함, stateful
쿠키(이름, 값, 만료일)를 저장하여 클라이언트에 저장 서버 자원 사용하지 않음 브라우저를 종료해도 남아있다
12. HTTP와 HTTPS의 차이
둘 다 서버와 클라이언트의 데이터를 주고받기 위한 프로토콜이지만 HTTPS는 데이터가 SSL인증서를 통해 데이터가 암호화되어 추가적인 보호를 하는 방식이다.
12-1 SSL
클라이언트와 서버 간의 통신을 제삼자가 보증해주는 전자문서 : 인증서를 검증 후 데이터 통신을 한다.
13.OOP에서 지향하는 바
많은 객체들이 모여서 상호 협력하며 데이터를 처리하는 방식의 프로그래밍 설계 방법이다.
-> 프로그램을 묶음 단위로 잘게 쪼개서, 추후에 가져다 쓰기 편하게 -> 라이브러리처럼 다른 개발자가 이용할 수 있게 구조를 만든 것
13-1 추상화
클래스를 정의할 때 불필요한 부분들을 생략, 속성 중 중요한 것에만 중점을 두어 개략화하는 것
13-2 상속
상위 클래스의 특징을 하위클래스에서 상속받아 중복 코드제거, 코드 재사용성을 증대
14.hoisting
함수 안에 있는 선언들을 모두 끌어올려서 해당 함수 유효 범위({안에있는것})의 최상단에 선언하는 것
let, const를 포함한 모든 선언을 호이스팅
14-1 변수 생성단계
- 선언 단계(Declaration Phase): 변수를 변수 객체(Variable Object)에 등록합니다. 이 변수 객체는 스코프가 참조하는 대상이 됩니다.
- 초기화 단계(Initialization Phase): 변수 객체(Variable Object)에 등록된 변수를 위한 공간을 메모리에 확보합니다. 이 단계에서 변수는 undefined로 초기화됩니다.
- 할당 단계(Assignment Phase): undefined로 초기화된 변수에 실제 값을 할당합니다.
- 출처 : https://velog.io/@holim0/Front-End-%EB% A9% B4% EC% A0%91-%EC% A7%88% EB% AC% B8-%EB% 8C%80% EB% B9%84-Part1-hoisting-closure-this
Front-End 면접 질문 대비 Part1 (hoisting, closure, this)
이번에 면접 대비를 위해 프론트 엔드 분야에서 알아야 될 내용들을 정리하고자 합니다. ➡️ 함수 안에 있는 선언들을 모두 끌어올려서 해당 함수 유효 범위의 최상단에 선언하는 것. 끌어올린
velog.io
15. 클로저
두 개의 함수로 만들어진 환경으로 특별한 객체의 한 종류
-> 외부 함수 호출이 종료되더라도 외부 함수의 지역 변수 및 변수 스코프 객체의 체인 관계를 유지할 수 있는 구조
클로저는 반환된 내부함수가 자신이 선언됐을 때의 환경(Lexical environment)인 스코프를 기억하여 자신이 선언됐을 때의 환경(스코프) 밖에서 호출되어도 그 환경(스코프)에 접근할 수 있는 함수
var color = 'red';
function foo() {
var color = 'blue'; // 2
function bar() {
console.log(color); // 1
}
return bar;
}
var baz = foo(); // 3
baz(); // 4
-> 여기서 baz가 클로져입니다.
outer 함수의 context에 속해있는 변수를 참조합니다.
outer 함수의 지역변수로 존재하는 color를 자유변수라고 합니다.
16. 실행콘텍스트
실행할 코드에 제공할 환경 정보들을 모아 놓은 객체이다.
16-1 렉시컬 스코프
함수를 어디서 선언하였는지에 따라 상위 스코프를 결정한다는 뜻 -> 함수의 선언에 따라 결정된다.
17. 콜백함수
18 TS는 어떻게 실행되는 것일까?
TS는 정적언어 JS는 동정언어 정적언어를 동적언어로 바꾸는 과정이 추가된 것(JS파일로 바뀐다.)
19. NestJS?
스프링과 비슷한 추상화 계층이 존재
- 프레임워크에서 IoC를 지원
- 프로바이더로 DI를 지원
- 싱글톤 패턴으로 모듈에 컨트롤러, 서비스를 캡슐화하여 최상단 모듈에 연결
- 데코레이터를 활용 AOP(관점 지향 프로그래밍)을 지원
- MVC패턴을 지원
재사용성이 좋은 모듈식 아키텍처 채용
TS를 기본언어로 사용 안전성을 늘림
20 Nest 아키텍처
제공 데코레이터를 사용할 경우 자체적으로 인스턴스 생성
- 해당하는 것을 모듈의 프로바이더에 넣는 것으로 싱글톤이 적용
Ioc을 프로바이더에 넣는 것으로 사용할 수 있다.
생성자를 활용하여 의존성을 부여하는 것(DI)으로 느슨한 결합을 사용
- 사용하고 싶은 클래스에 생성자로 호출하기만 하면 바로 사용
비슷한 로직이 모여있는 것을 모듈에 담아 캡슐화를 시킬 수 있다.
데코레이터 패턴
데코레이터 : 기존 객체의 동작을 동적으로 증대시킬 수 있는 디자인 패턴 -> 동작이 명시적으로 데코레이팅된 인스턴스에만 적용
싱글톤 패턴 - OOP에 무조건 보이는 디자인 패턴
클래스의 인스턴스는 1개만 존재한다.
Nest의 Ioc 구현 방법
공급자를 정의 - 데코레이터이용 선언하여 클래스를 생성할 경우 Nest IoC 컨테이너에서 관리
DI 하는 방법
생성자를 만들어서 현재 프로바이더에 등록되어 있는 것을 넣으면 적용이 됨
21 HTTP, HTTPS
SSL이나 TLS를 사용하여 HTTP 통신내용을 암호화한 것이 HTTPS -> 내용을 암호화
SSL에서는 공개키 암호화 방식
22 Docker
데이터 또는 프로그램을 격리 시키는 기능을 제공하는 소프트웨어로 각각 독립된 환경에 격리하는 기능을 제공하는 소프트웨어
격리된 공간을 컨테이너라고 부른다.
22-1 compose
단일 서버에서 여러개의 컨테이너를 하나의 서비스로 정의해 컨테이너의 묶음으로 관리할 수 있는 작업 환경을 제공하는 관리 도구
23 로드벨런싱, 로드밸런서는 부하를 분산해주는 장치, 기술
서버가 처리해야 할 업무 혹은 요청을 여러대의 서보로 나누어 처리하는 것
L4 트랜스포트 계층 ip주소와 포트 번호 부하 분산 - TCP, UDP
L7 애플리케이션 계층 URL, HTTP헤더에서 부하 분산이 가능 - HTTP, HTTPS
로드밸런서 주요 기능
- NAT : private IP를 public IP로 바꿈
- Tunneling : 데이터를 캡슐화하여 연결된 노드만 캡슐을 해제할 수 있게 만듦
- DSR : 요청에 대한 응답을 할 때 로드밸런서가 아닌 클라이언트의 IP로 응답
24 팀 아키텍처 알기
루트 53 - 도메인 이름 시스템(DNS)
github/action
github에서 제공하는 CI/CD 툴로 개발의 work flow를 자동화하는 툴
CI-> 테스트, 빌드, Dockerizing, 저장소에 전달하는 것까지 프로덕션 환경으로 서비스를 배포할 수 있도록 준비하는 프로세스
CD -> 저장소로 전달된 프로덕션 서비스를 실제 사용자들에게 배포하는 프로세스
메인에 푸시 됐을 때 github action을 통해 빌드하고 상용 서버에 배포(deploy)할 수도 있다.
application load balancer - 7 계층에서 작동하는 로드 밸런서
EC2 인스턴스, 컨테이너, IP 주소등 여러 대상에 걸쳐 수신되는 트래픽을 자동으로 분산합니다.
lambda
서버리스로 하드웨어나 os가 신경 쓸 필요 없이 관리해 주는 서비스 -> 코드만 작성해서 코드가 실행될 때만 작동
서버에서 해당 이벤트가 발생하면 람다에서 응답으로 코드를 실행하는
ec2/ecs차이
ecs : aws 고도로 안전하고, 안정적이며, 확장 가능한 컨테이너 실행 클러스터에서 컨테이너를 쉽게 실행, 중지 및 관리할 수 있게 해주는 컨테이너 관리 서비스 컨테이너 오케스트레이션 서비스
클러스터 : 도커 컨테이너를 실행할 수 있는 논리적인 공간
태스크 정의 : 애플리케이션을 구성하는 하나 이상의 컨테이너를 설명하는 텍스트 파일(JSON)
테스트 : 태스크 정의를 인스턴스화하는 것, 컨테이너를 실행하는 최소 단위
ec2 : 가상머신 독립적 환경이 있고 운영체제를 갖고 있는 컴퓨팅 리소스
25 트랜잭션?
DB의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 모두 수행되어야 할 일련의 연산들을 의미한다.
-> 논리적 단위
원자성: 트랜잭션의 연산은 모두 반영/ 안반영
일관성: 트랜잭션이 성공하면 일관성 있는 DB상태로 변환한다
독립성: 둘 이상의 트랜잭션이 동시에 병행 실행되는 경우 서로의 연산에 끼어들면 안 된다.
영속성: 성공적으로 완료된 결과는 영구적으로 반영
트랜잭션 연산 및 상태
Commit - 한 개의 단위가 성공적으로 끝나고 DB가 다시 일관된 상태에 있을 때 관리자에게 알려주는 연산
Rollback 실패해서 재시작 or 폐기
상태
활동 : 실행 중
실패: 오류가 발생 중단
철회: 비정상적으로 종료되어 Rollback 수행
부분 완료 : 마지막까지 연산했지만 Commint이 실행되기 직전
완료 : 성공 Commit연산을 실행 후 상태
26 컨테이너?
소프트웨어를 OS로부터 분리시켜 동작할 때 최소한의 실행환경을 제공하는 것
컨테이너 = 패키징
27 CI/CD
코딩 -> 빌딩 -> 테스팅으로 구분이 됨
CD: 목표 소프트웨어를 언제든지 신뢰할 수 있는 수준으로 릴리즈가 가능하도록 하는 것
28 Fargte
EC2와 비교할 것은 Fargate이다 이 둘 위에 ECS가 동작
EC2는 가상머신이지만 Fargate는 추상화된 컴퓨팅 환경이다. : EC2의 서버리스 버전
EC2를 안 쓰고 이걸 사용한 이유 - Ec2의 인스턴스 관리를 할 이유(아는 건 없고 해야 할 것은 많기 때문에)가 없고 금액이 더 저렴하다는 이유가 있어서 선택을 했다.
29 프로젝트에서 진행된 아키텍처
개발 단계에서 각자 docker compose up으로 mysql, redis의 환경을 통일한 뒤 개발을 시작한다.
개발이 끝나서 각자의 브랜치를 dev에 pull/req 하면서 코드 리뷰를 한다.
dev에서 문제가 없으면 main으로 push를 하는데 이때 github action이 main의 코드를 빌드하여 ECR에 push 한다.
ECR은 푸시받은 컨테이너를 ECS Fargate를 통해 서버를 실행한다.
'취업전 끄적 > 내가 다시 보기 위한 공부내용' 카테고리의 다른 글
서버 (0) | 2023.04.28 |
---|---|
4/25일 면접 후기 (0) | 2023.04.26 |
Ioc, DI (0) | 2023.04.24 |
인터프리터 , 컴파일러 언어 - 더 공부 필요 (0) | 2023.04.13 |
디자인 패턴 (0) | 2023.04.12 |