1. 재귀 함수와 반복문의 차이
- 재귀 함수(recursion)
- 함수 자체를 호출
- 종료 조건만 지정
- 무한 재귀는 스택 오버플로우 발생
- 스택 메모리를 사용
- 코드 길이와 변수가 적어 가독성 상승
- 반복문(iteration)
- 명령을 반복하여 실행
- 초기화, 조건, 제어 변수 변경 포함
- 무한 반복은 cpu 사이클만 반복 사용
- 스택 메모리는 사용하지 않고 힙 메모리 사용
- 코드가 길고 변수가 많아 가독성 떨어짐
- 재귀를 사용하는 이유는 mutable state 즉 변경 가능한 상태의 변수를 최대한 제거하여 프로그램 오류 발생을 예방
2. Stack과 queue의 차이점
- stack
- LIFO 자료구조의 형태
- 마지막으로 넣은 데이터를 가장 첫 번째로 가져오는 구조(후입 선출)
- 가장 마지막으로 넣은 값을 top이라고 함
- 삽입은 push, 삭제는 pop
- queue
- FIFO 자료구조 형태
- 가장 처음 넣었던 데이터를 첫 번째로 가져오는 구조(선입선출)
- 가장 처음 넣은 값을 front, 마지막을 rear라고 함
- 삽입은 일반적으로 enQueue, 삭제는 deQueue
- priority queue
- 넣은 순서에 상관없이 우선하는 값을 먼저 가져오는 것
- 일반적으로 max heap이나 min heap이라는 완전 이진트리 형태로 구현
- deque(double ended queue)
- 양쪽 방향에 데이터를 넣고 가져올 수 있는 보다 자유로운 구조
3. 인접 행렬과 인접 리스트의 차이점
- 그래프를 표현하는 방식
- adjacency matrix
- 그래프 연결관계를 이차원 배열로 표현
- 하나의 node 다른 node로 가는 edge가 존재한다면 해당 값을 1로 설정
- 구현이 쉽지만 node 수에 비해 edge가 적은 경우 비효율적이다
- adjacency list
- 그래프의 연결 관계를 vector의 배열로 표현
- 특정 node에 연결된 node들을 vector에 저장하는 형태
- 연결된 edge만 기록하기 때문에 메모리 효율
- 그러나 해당 node에서 다른 node로 가는지 확인하기 위해 해당 node 연결 구조를 모두 읽어야 한다.
4. greedy 알고리즘 사용하기 위한 조건
- greedy 알고리즘
- 선택의 순간 최적해를 찾아가는 방식
- 조건
- 탐욕적 선택 속성 : 앞의 선택이 이후의 선택에 영향을 주지 않는 경우
- 최적 부분 구조 : 최종 해결 방법이 부분 문제에 대한 최적 문제 해결로 구성되는 경우
- 계산 속도가 빠르고 실용적이어서 근사 알고리즘으로 사용 가능
- greedy 알고리즘이 최적해를 항상 찾아낼 수 있는 구조를 매트로이드 문제라고 한다
5. BST(Binary Search Tree) 알고리즘 탐색 과정
- 데이터가 정렬이 되어있는 상태에서 특정 값을 찾아내는 알고리즘
- 배열의 중간에 있는 값보다 작으면 좌측의 데이터를, 중간 값보다 크면 우측 데이터를 기준으로 반복하여 탐색
- 시간 복잡도는 O(logN)
6. 웹 브라우저에서 CORS issue가 발생하는 원인과 서버에서 해결 방법
- CORS(Cross Origin Resource Sharing)
- Origin = Protocol + host
- 서로 다른 origin(웹 애플리케이션)이 리소스에 접근할 때 발생하는 오류
- 예시로 daum.com에서 google.com에 있는 리소스 접근
- 원리
- 다른 출처의 리소스를 요청할 때 HTTP 프로토콜을 사용하여 요청
- Origin 필드에 요청을 보내는 출처 담아서 요청
- 서버가 요청에 대한 응답을 할 때 헤더에 Access-Control-Allow-Origin에 접근하는 것이 허용되는 출처를 담아서 응답
- 브라우저는 요청할 때 보낸 origin과 서버가 보낸 Access-Control-Allow-Origin을 비교하여 결정
- 방식
- Simple Request
- 예비 요청 없이 바로 요청
- Preflight Request
- 브라우저가 요청을 한 번에 보내지 않고 예비 요청과 본 요청 나누어 전송
- Preflight 요청(예비 요청)에 OPTIONS 메서드가 사용되고 브라우저 스스로 이 요청이 안전한지 확인
- Credential Request
- 인증된 요청을 사용하는 방법(리소스 요청에 인증 정보를 포함하여 요청)
- Same-origin : 같은 출처 간 요청에만 인증 정보 담기
- include : 모든 요청에 인증 정보 담기
- omit : 모든 요청에 인증 정보 담지 않기
- Simple Request
- 해결 방법
- 서버 해결(response)
- HTTP 응답 헤더 중 Access-Control-Allow-Origin : * 혹은 해당 origin을 설정하기
- 클라이언트 해결(request)
- 서버 헤더를 설정할 수 없다면 리소스 요청하는 서버 사이 프락시 서버를 하나 거쳐서 응답 주고받기
- 프락시 서버 : 브라우저와 서버를 통신하는 과정 중간에 정보교환을 도와주는 매개 서버
- Access-Control-Allow-Origin : * 헤더를 담아 응답
- 서버 해결(response)
7. URL과 URI의 차이
- URI - Unifom Resource Identifier
- 특정 리소스를 식별하는 통합 자원 식별자를 의미
- 웹 기술에서 사용하는 논리, 물리적 리소스 식별하는 고유 문자열
- 식별하는 역할
- 구조
- scheme:[//[user[:password]@]host[:prot]][/path][?query][#fragment]
- URL - Uniform Resource Locator
- 웹 주소라고도 하며, 컴퓨터 네트워크 상에 리소스가 어디 있는지 알려주는 규약
- 위치를 가리키는 역할
8. DNS 정의와 사용 목적
- DNS
- host의 IP 주소를 domain이라는 이름으로 변환하는 시스템
- 목적
- 4byte IP주소를 숫자로 기억하기 힘들기 때문에 언어체계로 변환
9. REST API
- 인터넷을 통해 정보를 안전하게 교환하기 위한 인터페이스
- API
- 다른 소프트웨어 시스템과 통신하기 위해 따르는 규칙
- REST
- representational State Transfer
- API 작동 방식에 대한 조건을 부과하는 소프트웨어 아키텍처
- API system 파악 및 구현 수정 가능
10. Client Side Rendering VS Server Side Rendering
- SSR
- 서버 쪽에서 렌더링 준비를 마친 상태로 클라이언트에게 전달하는 방식
- SEO(search engine optimization)가 필요할 때
- 최초 로딩이 빨라야 하는 사이트
- 웹 사이트가 상호작용이 별로 없을 때
- 자원 이용이 서버에 집중되어 유지 비용이 높음
- Newyork times, naver 같은 곳
- CSR
- 서버가 클라이언트에게 HTML, JS를 보내서 클라이언트가 렌더링을 시작
- 사용자가 보여줘야 하는 데이터 양이 많을 때
- 상호작용을 많이 해야 하는 경우
- 느린 렌더링 속도, 렌더링 부하가 클라이언트에게 집중
- 아고다 같은 예약 사이트
11. 트랜잭션
- 데이터베이스 서버에서 더 이상 쪼갤 수 없는 하나의 작업 단위를 의미
- ACID라는 4가지 원칙이 조재
- Atomicity 원자성
- 하나의 트랜잭션 안에 모든 작업이 성공하면 성공하고 하나라도 실패하면 트랜잭션 자체가 실패하도록 작동한다는 의미
- Consistency 일관성
- 트랜잭션 작업이 종료된 후에도 데이터 베이스의 상태는 일관되게 유지
- Isolation 고립성
- 하나의 트랜잭션이 다른 트랜잭션에 영향을 주지 않는 원칙
- Durability 지속성
- 트랜잭션을 완료하고 그 결과를 영구적으로 기록
12. Foreign key, Primary key
- Primary key
- data를 구분하게 하는 고유 값을 의미
- 중복 값을 가질 수 없음
- Foreign key
- 다른 table의 primary key를 참조하는 속성을 의미
13. IoC
- Inversion of Control 제어의 역전
- Spring을 구성하는 원칙 중 하나
- 애플리케이션 흐름의 주도권을 spring이 갖는 것
- 구현하기 위한 방법 DI
- dependency injection
- 생성자 파라미터에 외부 객체를 전달받는 의존성 주입
- Spring이 의존 객체들을 주입하기 때문에 IoC 실현 가능
14. Spring에서 AOP 필요성
- AOP aspect oriented programming
- 공통 관심 사항을 따로 분리하여 필요한 순간에 적용하는 방식
- 공통된 코드를 따로 분리하였기 때문에 코드가 간결하고 재사용 가능
- 객체 지향 설계에 보다 적합하다
- 트랜잭션, 보안, 로깅 등에 사용
15. Spring Container
- 객체를 bean의 형태로 만들어서 생성, 제거, 관리하는 역할을 하는 컴포넌트
- 서로 다른 빈을 연결해서 의존성 관계를 Spring이 처리할 수 있도록 한다
- new 키워드를 사용하게 되면 참조가 많아져 의존성이 심해지는데 spring container를 사용하면 의존성을 낮출 수 있기 때문에 사용
16. DI(Dependency Injection)
- 의존성 주입으로 외부에서 객체를 주입하는 과정
- 주로 생성자를 통하여 의존 관계를 주입한다
- 장점
- new 키워드를 사용하여 객체를 생성하고 참조하였을 때 변경 사항이 존재하게 되면 해당 코드를 모두 변경하여야 한다
- 그러나 생성자를 통해 의존 관계를 주입하면 해당 의존 관계만 수정하면 되기 때문에 효율적이다
'Backend boot camp > Session2' 카테고리의 다른 글
KPT 회고 (1) | 2022.10.19 |
---|---|
Spring Framework Cores(DI/AOP) (1) | 2022.10.18 |
Spring Framework Basics (1) | 2022.10.18 |
Relational DataBase (0) | 2022.10.03 |
REST API (0) | 2022.10.03 |