본문 바로가기
카테고리 없음

취준 - 퍼옴

by 흰색남자 2022. 7. 19.

 

https://velog.io/@zxcasd3004/%EA%B8%B0%EC%88%A0-%EB%A9%B4%EC%A0%91-%EC%A4%80%EB%B9%84#1-%EA%B8%B0%EC%B4%88

 

기술 면접 준비

좋은 코드란?읽기 쉬운 코드(가독성, 주석과 네이밍), 중복이 없는 코드(유지보수)객체 지향 프로그래밍이란?현실 세계를 프로그래밍으로 옮겨와 프로그래밍 하는것사물을 객체롤 보고 그 객체

velog.io

 

https://velog.io/@ljinsk3/%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%EC%84%A4%EA%B3%84-%EC%9B%90%EC%B9%99-SOLID

1. 기초

  • 좋은 코드란?
    • 읽기 쉬운 코드(가독성, 주석과 네이밍), 중복이 없는 코드(유지보수)
  • 객체 지향 프로그래밍이란?
    • 현실 세계를 프로그래밍으로 옮겨와 프로그래밍 하는것
    • 사물을 객체로 보고 그 객체로부터 개발하고자 하는 특징을 뽑아와 프로그래밍 하는 것
    • 추상화
      • 복잡한 자료, 모듈 등으로부터 핵심적인 개념, 기능을 간추려 내는 것
    • 객체 간 정보 교환인 메시지 교환으로 일어남, 오버헤드 발생, 하드웨어 발전으로 극복
    • 객체가 상태를 가짐, 변수가 존재하고 객체가 예측할 수 없는 상태를 갖게 되어 버그 발생
    • 함수형 패러다임으로 극복
      • 순수 함수를 조합
      • 자료처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 패러다임
    • SOILD
      • SRP(Single Responsibility Principle) : 단일 책임 원칙
        • 클래스는 단 하나의 책임을 가짐
        • 클래스가 여러 책임을 갖게 된다면 그 클래스는 각 책임마다 변경되는 이유가 발생하기 때문에 클래스가 한 개의 이유로만 변경되려면 클래스는 한 개의 책임만을 가져야 한다.
      • OCP(Open-Closed Principle) : 개방-패쇄 원칙
        • 확장에는 열려있고 변경에는 닫혀 있어야 함
        • 다시 말하면, 기능을 변경하거나 확장할 수 있으면서 그 기능을 사용하는 코드는 수정하지 않는다. 로 풀어볼 수 있다.
      • LSP(Liskov Subsitution Principle) : 리스코프 치환 원칙
        • 상취 객체를 하위 객체로 치환해도 상위 프로그램은 정상적으로 동작
        • 다시 말하면 하위타입은 무조건 상위타입을 대체할 수 있어야 한다는 것이다.
        • 이는 컴파일 관점을 넘어서 의미(행위)적으로 대체하는 것을 의미한다.
      • ISP(Interface Segregation Principle) : 인터페이스 분리 원칙
        • 인터페이스는 클라이언트 기준으로 분리
        • 의존의 양면성 에서 A가 B에 의존할 경우 B의 변화로 인해 A가 변경되지만, 반대로 A의 요구로 인해 B가 변경됨을 알 수 있었다.
        • 인터페이스를 분리하는 기준이 클라이언트가 된다는 것을 뜻한다.
      • DIP(Dependency Inversion Principle) : 의존 역전 원칙
        • 고수준 모듈은 저수준 모듈의 구현에 의존해서는 안 된다. 고수준 모듈에서 정의한 추상 타입에 의존해야 한다.
        • 예를 들어, 상품의 가격을 결정하는 정책을 생각해보자.
        • "쿠폰을 적용해서 가격할인을 받을 수 있다. 쿠폰은 동시에 한개만 적용 가능하다."
        • 이는 고수준 모듈의 정책이다. 여기서 쿠폰을 이용한 가격 계산이 개별적인 쿠폰 구현에 의존하게 되면 어떤일이 벌어질까?
        • 이런 상황은 변경을 어렵게 만든다. 새로운 쿠폰이 추가될 때마다 가격 모듈을 계속 변경해야 할 것이다.
  • RESTful API란?
    • REpresentational State Transfer
    • 자원 중점 아키텍처
    • API 설계의 중심에 자원이 있고 HTTP Method를 통해 자원을 처리하도록 설계
    • REST 6가지 원칙
      • Uniform interface, Stateless, Caching, Client-Server, Hierarchical system, Code on damand
    • 자원은 URI의 명사로 표현
    • 행위는 HTTP Method로 표현(GET, POST, PUT, DELETE)
    • Message는 Header와 Body로 명확하게 분리하여 사용
    • 장점
      • Open API를 제공하기 쉬움
      • 원하는 타입으로 데이터를 주고 받을 수 있음
      • 기존 웹 인프라(HTTP)를 그대로 사용할 수 있음
    • 단점
      • 비표준
      • HTTP 통신 모델에서만 지원
  • WAS와 WS차이는?
    • WAS
      • 비즈니스 로직을 넣을 수 있음
      • Tomcat, PHP, .NET
    • WS
      • 비즈니스 로직을 넣을 수 없음
      • Nginx, Apache
  • SOAP API란?
    • 다른 언어로 다른 플랫폼에서 빌드된 애플리케이션이 통신할 수 있도록 설계된 프로토콜
    • 웹 서비스 보안
    • WS-ReliableMessaging
    • 웹 서비스 주소지정
    • 웹 서비스 기술 언어
  • TDD의 정의와 장/단점은?
    • Test-Driven Development
    • 매우 짧은 개발 사이클의 반복에 의존하는 소프트웨어 개발 프로세스
    • 새로운 기능에 대해 자동화된 테스트케이스를 작성하고 해당 테스트를 통과하는 코드 작성
    • 테스트 주도 개발 방식
    • 장점
      • 요구사항에 집중할 수 있음
      • 새로운 기능을 추가하면 잘 동작하는 기능이 제대로 동작하지 않는 경우 발생, 새로운 기능이 제대로 동작함과 동시에 기존의 기능들이 잘 동작하는지 확인 가능
    • 단점
      • 시간이 많이 소요되어 코드 생산성에 문제가 있음
      • 테스트 코드를 잘 작성하기 어려움
      • 모든 상황에 대해서 테스트 코드를 작성할 수 없음, 모든 것을 다루는 것은 아님
  • 함수형 프로그래밍이란?
    • immutable data, first class citizen
    • 순수 함수
      • 동일한 입력에는 항상 같은 값을 반환
      • 함수의 실행이 프로그램의 실행에 영향을 미치지 않아야 함
      • 함수 내부에서 값을 변경하거나 프로그램 상태를 변경하는 side effect가 없어야 함
    • 비상태, 불변성
      • 데이터는 불변성 유지
      • 데이터 변경이 필요한 경우, 원본 데이터를 변경하지 않고 복사본을 만들어 변경하고 작업 진행
    • 선언형 함수
      • 무엇을 할 것인가에 집중
      • if, switch, for 등 명령문을 사용하지 않고, 함수형 코드 사용
    • 1급 객체
      • 함수가 1급 객체
      • 변수나 데이터 구조 안에 담을 수 있음
      • 파라미터로 전달 할 수 있음
      • 반환값으로 사용할 수 있음
      • 이름과 관계없이 고유한 구별 가능
      • 함수를 인자로써 전달할 수 있음
      • 함수의 반환값으로 다른 함수를 사용할 수 있음
    • 장점
      • 높은 수준의 추상화 제공
      • 재사용 수월
      • 불변성을 지향해서 프로그램 동작이 예측하기 쉬워짐
    • 단점
      • 순수 함수로 구현되어 코드의 가독성이 좋지 않음
      • 조합하는 것이 쉽지 않음
  • MVC 패턴이란?
    • Controller
      • 클라이언트의 요청을 받았을 때, 요청에 대해 처리를 수행하는 모델 호출
      • 클라이언트가 보낸 데이터가 있으면 데이터 가공
      • 모델이 처리를 마치면 그 결과를 뷰에게 전달
    • Model
      • 요청에 맞는 역할 수행
      • 비즈니스 로직을 구현하는 영역으로 데이터를 처리하는 부분
    • View
      • 컨트롤러로부터 받은 모델의 결과값을 가지고 사용자에게 출력할 화면을 만드는 일을 함
    • 클라이언트가 서버로 요청 >> 서버는 컨트롤러 매칭 >> 컨트롤러가 모델을 호출 >> 모델에서 데이터 처리 후 반환 >> 반환한 데이터를 뷰로 전달 >> 클라이언트로 전달
    • 장점
      • 단순함
      • 유지보수의 편리성
      • 시스템의 낮은 결합도
    • 단점
      • 뷰와 모델 사이의 의존성 높음
      • 대규모 프로그램에서 다수의 뷰와 모델이 연결되기 때문에 컨트롤러가 커지는 현상 발생(Massive-View-Controller)
  • Git와 Github의 정의는?
    • Git
      • 버전 관리 프로그램
      • Version Control System
      • 로컬에서 버전 관리
      • 로컬에서 프로젝트의 기록을 스스로 관리
      • 브랜치를 생성 및 관리 가능
      • 다른 개발자와 실시간으로 작업을 공유할 수 없음
    • Github
      • Git Repository를 위한 웹 기반 호스팅 서비스
      • 클라우드 서버를 사용해 로컬에서 관리한 소스 코드를 업로드 및 공유 가능
      • 버전 관리, 소스 코드 공유 가능항 원격 저장소
  • 브라우저의 작동 원리는?
    • 사용자가 선택한 자원을 서버에 요청하고 표시
    • 자원은 보통 HTML, PDF, 이미지 등 자원의 주소 URI에 의해 정해짐
      • URI(Uniform Resource Identifier) : 자원 식별자
      • URL(Uniform Resource Locator) : 자원의 위치
    • CSS에 따라 HTML 파일을 해석해서 표시
  • 쿠키, 세션, 로컬 스토리지 차이는?
    • 쿠키
      • 서버와 클라이언트 양쪽에서 쿠키 데이터를 사용하는 API존재
      • Key : Value 형태
      • 4KB
      • HTTP 통신 시, 쿠키 정보 함께 자동으로 서버에 전송
    • 세션
      • 메모리에 저장
      • 브라우저를 닫으면 소멸
    • 로컬 스토리지
      • HTML5부터 지원
      • 로컬에 저장되어 브라우저를 닫아도 상관없음
  • CORS란?
    • 교차 출저 리소스 공유
    • SOP(Same-Origin Policy), 같은 출처에서만 리소스를 공유할 수 있음
    • 출처는 스킴, 호스트, 포트 번호까지 모두 합친 것
    • 브라우저는 각종 정보를 제재없이 열람이 가능하여 공격에 취약함
    • header에 Access-Control-Allow-Origin에 허용 출처를 추가
  • 클라이언트 사이드와 서버 사이드의 정의와 차이는?
    • 클라이언트 사이드
      • 클라이언트 측에서 처리
      • 브라우저에서 처리
    • 서버 사이드
      • 서버 측에서 처리
      • 민감한 데이터 처리 가능
      • 서버의 처리 부담 증가
  • HTTP란?
    • HTML 문서를 교환하기 위해 만들어진 프로토콜
    • TCP/IP 기반
    • 요청과 응답 구조
    • 요청 구조
      • start line
      • headers
      • body
    • 응답 구조
      • status line
      • headers
      • body
  • 분산처리란?
    • 동질형 분산 시스템
      • 하나의 OS에서 분산 시스템 기능 운영
    • 이질형 분산 시스템
      • 미들웨어에서 분산 시스템 구현
  • Hadoop, Elasticsearch, Redis, Kafka, Kubernetes
    • Hadoop
      • 하나의 컴퓨터를 이용하는 대신, 컴퓨터 여러 대를 클러스트화
      • 큰 크기의 데이터를 병렬로 동시에 처리하여 속도를 높임
      • 분산처리를 위한 오픈소스 프레임워크
      • 장점
        • 확장 용이
        • 빠른 데이터 처리
      • 단점
        • 저장된 데이터 변경 불가
        • 실시간 데이터 분석에 부적합
    • Elasticsearch
      • 많은 양의 데이터를 실시간으로 저장, 검색, 분석할 수 있는 검색 엔진
      • 클러스터 : 가장 큰 시스템 단위, 노드의 집합
      • 노드 : 하나의 단위 프로세스
      • 인덱스 : RDBMS에서 데이터베이스와 같은 개념
      • 샤드 : 데이터를 분산하여 저장하는 방법, 인덱스를 여러 샤드로 쪼갠 것
    • Redis
      • 모든 데이터를 메모리에 저장하고 조회
      • key-value 구조, 비관계형 데이터베이스 관리 시스템
      • 다양한 자료구조를 지원하면서 편의성 증가(string, set, sorted set, hash, list)
      • 데이터를 디스크에 저장해 지속성 보장
      • 16,384개 hash slot
    • Kafka
      • 메시징 서버
      • Pub/Sub
        • 프로듀서가 데이터를 토픽에 저장하면 컨슈머가 원하는 데이터를 토픽에서 가져감
        • 확장성 용이, 데이터 유실 없음
        • 신뢰성 확보 어려움, 속도 느림
      • 신뢰성을 프로듀서와 컨슈머 측으로 넘겨 메시징 전달 성능을 집중시켜 고성능
    • Kubernetes
      • 큐브라는 리눅스 컨테이너 작업을 자동화하는 오픈소스 플랫폼
      • 모든 서버를 하나의 클러스터로 구성해서 하나의 컴퓨터에서 작업하는 것처럼 개발 배포 관리
  • 애자일이란?
    • 신속한 반복 작업으로 실제 작동 가능한 소프트웨어를 개발하는 방식
  • Load balancing이란?
    • 한 대의 서버로 부하가 집중되지 않도록 트래픽을 관리
    • scale-out 방식에 필요
    • 알고리즘
      • 라운드로빈
      • IP 해시
    • L4
      • 포트 정보를 바탕으로 로드 분산
      • 전송 계층의 정보를 바탕으로 로드 분산
    • L7
      • 응용 계층에서 로드 분산
      • 요청을 세분화해 서버에 전달 할 수 있음

2. 자료구조

  • Array와 Linked List의 정의와 차이는?
    • Array
      • 논리적 저장 순서와 물리적 저장 순서가 일치
      • 인덱스로 해당 원소에 접근 가능
      • 검색, O(1)
      • 추가와 삭제는 원소들을 옮겨야하는 비용 발생, O(n)
    • Linked List
      • 데이터와 포인터로 구성
      • 추가와 삭제, O(1)
      • 검색 시 첫번째 원소부터 확인해야 함, O(n)
      • Tree 구조에서 사용
  • Stack과 Queue의 정의와 차이는?
    • Stack
      • Last in First Out
    • Queue
      • First in First Out
  • Tree란? (Binary, Perfect, Complete, BST, RB-Tree, B-Tree)
    • 비선형 자료구조
    • 계층적 관계
    • 노드, 간선, 루트, 단말 노드, 비단말 노드
    • Binary Tree
      • 루트 중심으로 두 개의 서브 트리
      • 모든 레벨이 꽉 찬 이진트리 = Full
      • 왼쪽에서 오른쪽으로 순서대로 채워진 이진트리 = Complete
    • Binary Search Tree
      • 부모의 키는 왼쪽보다 크고, 오른쪽보다 작음
      • 편향 트리
      • rebalancing(RB-Tree, B-Tree)
    • RB-Tree
      • 각 노드 색깔은 red, black
      • 루트노드와 단말노드는 black
      • 부모노드가 red면, 자식노드는 black
      • black-height는 같음
      • 삽입 또는 삭제 시, 규칙을 만족시키기 위해 재귀적으로 확인하고 필요하면 rotation
    • B-Tree
      • 자식노드의 최대 수(차수)가 2보다 큰 트리구조
      • 삽입 수행하면서 분할
      • 삭제 수행하면서 병합
  • Heap이란? (binary)
    • Complete Binary Tree
    • 최대힙, 최소힙
    • 최대값 또는 최소값 검색 시 해당 루트노드, O(1)
    • 루트노드를 제거하면 heapify 진행, O(log n)
  • Hash란? (hash function, collision)
    • 내부적으로 배열을 사용하여 데이터를 저장
    • 빠른 검색 속도
    • hash function으로 고유한 숫자를 만들어 낸 뒤 인덱스로 사용
    • Collision
      • Open Address
        • linear, 2차 함수 등 사용
        • 데이터를 저장할 장소 찾음, 느림
        • 군집화 등 문제 발생
        • 밀도가 높아질수록 충돌 발생 빈도 높아짐
      • Separate Chaining
        • 각 버킷을 연결리스트로 구현
        • 충돌 발생 시, 리스트에 추가
        • 메모리 할당하는 오버헤드
  • Graph란? (Kruskal, Prim)
    • 정점과 간선의 집합
    • 뱡향 그래프
    • 가중치 그래프
    • 깊이 우선 탐색
      • 연결되지 않은 정점까지 탐색하고, 정점이 없으면 그 전 단계의 정점으로 돌아감
    • 너비 우선 탐색
      • 연결되어 있는 모든 정점을 탐색
      • 최단 경로
    • Minimun Spanning Tree
      • 가중치의 합이 최소인 spanning Tree
      • 그래프의 모든 정점이 사이클이 없이 연결된 형태
      • Kruskal algorithm
        • 초기에 간선없이 정점으로만 그래프 구성
        • 가중치가 가장 작은 간선부터 검토, 정렬 필요
        • 사이클이 생기지 않은 경우, 간선 추가
        • 사이클 확인은 union-find, set-id를 사용하여 처음에는 각 값으로 초기화 한 뒤 하나로 통일하는 과정
      • Prim algorithm
        • 하나의 간선으로 이루어진 그래프 구성
        • 가중치가 작은 정점 연결

3. 네트워크

  • GET, POST 차이는?
    • HTTP 프로토콜을 이용하여 서버에 요청할 때 사용하는 방식
    • GET
      • HTTP Request Message의 Header 부분에 URL이 함께 전송
      • '?' 뒤에 데이터가 붙어서 요청
      • 데이터 크기가 제한적
      • 데이터가 URL에 그대로 노출되어 보안에 부적절
      • 브라우저에서 caching
    • POST
      • HTTP Request Message의 Body 부분에 데이터가 담겨서 전송
      • 데이터의 크기가 크고, GET보다 보안면에서 나음
      • 서버의 값이나 상태를 변경하거나 추가하기 위해서 사용
  • TCP 3-way-handshake란?
    • 연결
      • syn(a) >> ack(a+1) + syn(b) >> ack(b+1)
    • 해제
      • Client-fin >> Server-ack >> Server-fin >> Client-ack
    • SYN = synchronize sequence number
    • ACK = acknowledgement
    • TCP Header에 6bit으로 구성되어 있는 Code bit(Flag bit)부분 존재
    • 클라이언트가 자신의 목소리가 들리는지 물어본다(syn-a) >> 서버는 클라이언트의 목소리가 들린다고 말한다(ack-a+1) + 그리고 자신의 목소리가 들리는지 물어본다(syn-b) >> 클라이언트는 서버의 목소리가 들린다고 말한다(ack-b+1)
    • syn 패킷을 보낼 때, sequence number는 난수로 담겨짐, 초기 seqeunce number(ISN)는 0부터 시작하지 않고 난수로 시작하는 이유는 연결을 맺을 때 사용하는 포트가 유한 범위 내에서 사용하고 재사용 될 수 있음, 서버가 이전의 연결에서 오는 패킷으로 인식할 수 있음
  • TCP와 UDP의 차이는?
    • TCP
      • Transmission Control Protocol
      • 신뢰성과 순차적 전달
      • 종단간에 신뢰성 있는 바이트 스트림 전송
      • 전이중 방식으로 양방향으로 동시에 전송이 일어날 수 있음
      • 점대점 방식으로 정확히 2개의 종단점을 가지고 있음
      • 멀티캐스팅이나 브로드캐스팅을 지원하지 않음
    • UDP
      • User Datagram Protocol
      • 비연결성 프로토콜
      • 흐름제어, 오류제어 또는 손상된 세그먼트 수신에 대한 재전송 하지 않음
      • 클라이언트는 짧은 요청을 보내고 짧은 응답 기대
      • 요청 또는 응답이 손실된다면 클라이언트는 time out되고 다시 시도
      • TCP보다 적은 메시지 요구
  • HTTP와 HTTPS의 차이는?
    • HTTP
      • 정의
        • 서버와 클라이언트 사이에 이루어지는 요청/응답 프로토콜
      • 문제점
        • 평문 통신이기 때문에 패킷 수집으로 도청 가능
        • 통신 상대를 확인하지 않기 때문에 누구든지 요청을 보낼 수 있어 위장 가능
        • 완전성을 증명할 수 없기 때문에 변조 가능
    • HTTPS
      • SSL의 껍질을 덮어쓴 HTTP
      • HTTP 통신하는 소켓 부분을 SSL or TLS이라는 프로토콜로 대체
      • HTTP는 TCP와 직접 통신했지만, HTTPS는 SSL과 통신하고 SSL이 TCP와 통신
      • 암호화 통신은 CPU나 메모리 등 리소스를 더 요구하지만, 최근 하드웨어의 발달로 HTTPS를 사용하더라도 속도 저하가 거의 없음
  • DNS round robin의 동작 방식은?
    • DNS
      • 도메인을 네트워크 주소로 바꾸거나 그 반대를 수행
    • DNS round robin
      • 여러 대의 서버 IP 리스트 중 라운드 로빈 형태로 랜덤하게 사용자에게 알려줌
    • 문제점
      • 부하 분산을 위해 서버의 대수를 늘리기 위해서 그만큼 공인 IP 주소가 필요
      • 서버가 다운되어도 확인 불가
  • 웹 통신의 큰 흐름은?
    • 브라우저
      • URL 값을 HTTP Request 메시지로 만듦
      • 메시지를 웹 서버로 전송
      • 전송할 때 OS에 의뢰하여 메시지 전달
      • OS에 송신을 의뢰할 때는 도메인명이 아니라 IP주소로 메시지를 받을 상대를 지정
      • DNS 서버 조회
    • LAN
      • 메시지에 수신처 주소 등 제어정보 추가
      • 패킷을 LAN 케이블에 송출
    • 허브, 스위치, 라우터
      • LAN 어댑터가 송신한 프레임은 허브를 경유하여 인터넷 라우터에 도착
      • 라우터는 패킷을 전달
    • 방화벽
      • 패킷은 서버 측 LAN에 도착
      • 방화벽이 패킷을 검사
    • 웹 서버
      • 메시지를 웹 서버 애플리케이션어 전달
      • 메시지를 받은 웹 서버 애플리케이션은 요청에 따른 응답 메시지를 넣어 클라이언트로 회송
    • 참고 : https://mungto.tistory.com/300
  • OSI 7계층이란?
    • 물리
    • 데이터링크
    • 네트워크
    • 전송
    • 세션
    • 표현
    • 응용
  • 로드 밸런싱이란?
    • 서버에 가해지는 부하를 분산
    • 여러 대의 서버를 두고 서비스를 제공하는 분산 처리 시스템에서 필요
    • L4(전송계층)
    • L7(응용계층)

4. 운영체제

  • 프로세스와 스레드의 차이는?
    • 프로세스
      • 실행 중인 프로그램
      • 디스크로부터 메모리에 적재되어 CPU의 할당을 받을 수 있는 것
      • OS로부터 주소공간, 파일, 메모리 등 할당받음
      • 프로세스 제어 블록(식별자, 상태, 프로그램 카운터, CPU 레지스터 등)
    • 스레드
      • 프로세스의 실행 단위
      • 한 프로세스 내에서 동작되는 여러 실행 흐름
      • 프로세스 내의 주소공간이나 자원 공유 가능
      • 스레드 제어 블록(식별자, 프로그램 카운터, 레지스터 집합, 스택 등)
      • 하나의 프로세스에서 자원의 생성과 관리의 중복성 최소화
      • 스레드는 각 스택과 레지스터 값을 가지고 있음
      • 스택은 함수 호출 시 전달되는 인자, 되돌아갈 주소값 및 함수 내 변수 등을 저장하기 위해 사용되는 메모리 공간
      • 스레드의 명령어가 어디까지 수행하였는지 나타내기 위해 PC 값은 스레드마다 독립적
    • 멀티 스레드
      • 프로세스를 이용하여 동시에 처리하던 일을 스레드로 구현할 경우, 메모리의 공간과 자원 소모 줄어듬
      • 스레드 간 통신이 필요한 경우, 별도의 자원을 이용하는 것이 아니라 전역 변수의 공간 또는 동적으로 할당된 공간인 heap 영역을 이용하여 데이터 주고받음
      • 스레드의 context switch는 프로세스의 context switch보다 빠름
      • 동일한 공유 자원에 동시에 접근해서 예상과 다른 값을 읽어옴
      • 동기화 작업 필요
      • 작업 처리 순서 컨트롤
      • 병목 현상 발생
    • 멀티 프로세스
      • 하나의 프로세스가 죽더라도 다른 프로세스의 영향을 끼치지 않고 정상적으로 수행 가능
      • 메모리와 CPU를 많이 차지함
  • 스케줄러의 종류는? (장기, 중기, 단기)
    • 장기
      • 메모리와 디스크 사이 스케줄링 담당
      • 프로세스에 메모리 할당
      • 생성 >> 준비 상태
    • 중기
      • 여유 공간 마련을 위해 프로세스를 통째로 메모리에서 디스크로 쫒아냄(swapping)
      • 프로세스에서 메모리 해제
      • 현 시스템에서 메모리에 너무 많은 프로그램이 동시에 올라가는 것을 조절
      • 준비 >> 중지
    • 단기
      • CPU와 메모리 사이의 스케줄링 담당
      • 프로세스에게 CPU 할당
      • 준비 >> 실행 >> 대기 >> 준비
    • 중지 상태
      • 외부적인 이유??로 프로세스의 수행이 정지된 상태로 메모리에서 내려간 상태
      • block 상태는 I/O 작업을 기다리는 상태이기 때문에 스스로 준비 상태로 돌아갈 수 있음
      • 중지 상태는 외부적인 이유로 중지 되었기 때문에 스스로 돌아갈 수 없음
  • CPU 스케줄러는? (FCFS, SJF, SRF, Priority, RR)
    • 대상은 준비 상태의 프로세스들
    • FCFS
      • 비선점형
      • 먼저 온 프로세스를 먼저 처리
      • convoy effect, 소요시간이 긴 프로세스가 먼저 도착하면 효율성을 낮춤
    • SJF
      • 비선점형
      • CPU burst time이 짧은 프로세스 먼저 처리
      • starvation, 기아현상
    • SRTF
      • 선점형
      • 남은 burst time 중 가장 짧은 프로세스 먼저 처리
      • starvation, 기아현상
    • Priority
      • 선점형, 비선점형
      • 우선순위가 가장 높은 프로세스 먼저 처리
      • starvation, 기아현상
      • aging, 오래 기다리면 우선순위 높혀주는 방식
    • Round Robin
      • 각 프로세스는 동일한 크기의 할당 시간 가짐
      • Response time이 빨라짐
      • time quantum이 너무 커지면 FCFS, 너무 작아지면 잦은 context switch로 overhead 발생
  • 동기와 비동기의 차이는? (block/non-block)
    • 동기??
      • 실행과 동시에 반환 값을 기대하는 작업
      • 실행되었을 때 값이 반환되기 전까지 blocking 되어 있음
    • 비동기??
      • 언제 값이 반환되는지 기대할 수 없는 작업
      • blocking되지 않고 이벤트 큐에 넣거나 백그라운드 스레드에게 해당 task를 위임하고 다음 코드 실행하기 때문에 기대되는 값이 바로 반환되지 않음
    • 참고 : https://mungto.tistory.com/456
  • 프로세스 동기화란? (critical section)
    • 임계영역
      • 멀티 스레딩의 문제점
      • 동일한 자원을 동시에 접근하는 작업을 실행하는 코드 영역
    • 조건??
      • 상호 배제
      • 진행
      • 한정된 대기
    • 해결책
      • Mutex Lock
        • 임계영역에 진입하는 프로세스는 Lock을 획득하고, 나올 때는 Lock 방출함으로써 동시 접근 방지
        • 시간적인 효율성 측면에서 적용할 수 없음
      • 세마포
        • 소프트웨어에서 임계영역 문제를 해결하기 위한 동기화 도구
        • 카운팅 세마포
          • 가용한 개수를 가진 자원
        • 이진 세마포
          • MUTEX, 0과 1 사이의 값만 가능
        • 바쁜 대기, CPU 낭비, Block후 wake로 해결
        • 교착상태, 진입 대기 중인 프로세스가 실행되어야만 빠져나올 수 있는 상황??
  • 메모리 관리란? (Paging, Segmentaion)
    • Swapping
      • 메모리 관리 기법
      • CPU 할당 시간이 끝난 프로세스의 메모리를 보조 기억장치로 내보내고 다른 프로세스를 메모리로 불러옴
      • 메모리 공간이 부족할 때 실행
    • 단편화
      • 프로세스가 메모리에 적재되고 제거되는 일의 반복으로 메모리 틈 사이에 작은 공간
      • 외부 단편화
        • 남은 공간들을 모두 합치면 충분한 공간이 되는 부분들이 분산되어 있음
      • 내부 단편화
        • 프로세스가 사용하고 남은 부분
      • 압축은 프로세스를 한쪽으로 몰아 자유공간을 확보하지만, 작업효율이 좋지 않음??
    • Paging
      • 하나의 프로세스의 메모리 공간이 연속적이어야 한다는 제약을 없애는 메모리 관리 방법
      • 물리 메모리는 frame, 논리 메모리는 page로 고정 크기로 관리
      • 순서에 상관없이 물리 메모리에 있는 프레임에 mapping
      • page 크기가 고정이라서 내부 단편화 발생
    • Segmentaion
      • 논리 메모리와 물리 메모리를 서로 다른 크기의 논리적 단위인 세그먼트로 분할하여 저장
      • 서로 다른 크기의 세그먼트 때문에 외부 단편화 발생
  • 가상 메모리란? (페이지 교체 알고리즘)
    • 프로세스 전체가 메모리 내에 올라오지 않아도 실행이 가능하게 하는 방법
    • 메모리 용량보다 큰 프로그램을 실행할 수 있음
    • 가상 주소 공간 제공
    • 프로세스 간 페이지 공유??
    • 요구 페이징
      • 초기에 필요한 페이지만 적재
      • 한 번도 접근되지 않은 페이지는 물리 메모리에 적재되지 않음
    • 페이지 교체
      • FIFO
      • LRU
      • LFU
  • 캐시의 지역성이란?
    • 캐시 메모리는 속도가 빠른 장치와 느린 장치간의 속도차에 따른 병목 현상을 줄이기 위한 메모리
    • 적중률을 높이기 위해 지역성 사용
    • 시작 지역성
      • 최근에 참조된 주소를 다시 참조하는 특성
    • 공간 지역성
      • 참조된 주소와 인접한 주소의 내용이 다시 참조
  • 시스템 콜이란?
    • 프로그램이 커널을 통해 자원을 제어하기 위한 인터페이스
    • 운영체제의 커널이 제공하는 서비스에 대해, 응용 프로그램의 요청에 따라 커널에 접근하기 위한 인터페이스
    • 커널
      • 운영체제이 핵심이 되는 컴퓨터 프로그램
      • 시스템의 모든 것 통제
  • 데드락이란?
    • 프로세스가 자원을 얻지 못해서 다음 처리를 하지 못하는 상황
    • 발생 조건
      • 상호 배제
      • 점유 대기
      • 비선점
      • 순환 대기
    • 해결
      • 예방
      • 회피
      • 회복

5. 데이터베이스

  • 데이터 베이스란? (사용 이유, 성능)
    • 데이터를 파일 단위로 저장하면 종속성, 중복성, 무결성 문제 발생
    • 특징
      • 독립성
      • 무결성
      • 보안성
      • 일관성
      • 중복 최소화
    • 성능
      • 순차 I/O가 랜덤 I/O보다 빠름
      • 쿼리 튜닝은 랜덤 I/O 자체를 줄여주는 목적
  • Index란? (자료구조, 성능)
    • 테이블의 모든 데이터를 검색하는 것보다 칼럼의 값과 해당 레코드가 저장된 주소를 키와 값의 쌍으로 인덱스를 만듦
    • 인덱스는 항상 정렬된 상태 유지해서 검색은 빠르나 추가, 삭제는 쿼리문 속도가 느림
    • 모든 칼럼을 인덱스로 생성하면 데이터 저장 성능이 떨어지고 인덱스의 크기가 커짐
    • 자료구조
      • B-Tree
      • 해시 테이블은 부등호 연산의 경우 문제 발생
    • 모든 컬럼에 인덱스를 설정하면 성능에 손실 발생
  • 정규화란?
    • 데이터베이스에서 중복을 최소화하기 위해 데이터를 구조화하는 작업
    • 데이터가 중복으로 저장되면 공간을 낭비하고 갱신 이상 발생
    • 갱신 이상
      • 삽입 이상
      • 삭제 이상
      • 수정 이상
    • 조회하는 SQL에서 조인이 많이 발생해 성능 저하나 나타나는 경우 반정규화 필요??
  • Transaction이란?
    • 작업의 완정성 보장
    • 특성
      • 원자성
        • 트랜잭션 중간에 문제가 발생하면 어떠한 작업도 수행되어서는 안됨
      • 일관성
        • 트랜잭션이 완료된 다음에도 일어나기 전과 상황이 동일해야 함
      • 고립성
        • 각 트랜잭션은 서로 독립적으로 수행
      • 지속성
        • 트랜잭션이 정상적으로 종료된 다음에 영구적으로 결과가 저장되어야 함
    • 특정 자원을 잠금으로 교착상태가 발생할 수 있음
  • Statement와 Prepared Statement의 차이는?
    • Statement
      • 변수를 설정하고 바인딩하는 static sql을 사용
    • Prepare Statement
      • 프리 컴파일된 쿼리를 수행해서 속도가 빠름
      • 쿼리 자체에 조건이 들어가는 dynamic sql 사용
      • 파싱 타임을 줄여주는 것은 분명하지만 dynamic sql을 사용하는데 성능 저하가 있음
    • 성능을 고려할 때, 가장 큰 비중을 차지하는 것은 테이블에서 레코드를 가져오는 과정이고 SQL 문을 파싱하는 것은 1/10에 불과
    • SQL Injection 문제를 보완해주는 Prepared Statement을 사용하는 것이 좋음
  • NoSQL이란?
    • 관계형 데이터 모델을 지양하며 대량의 분산된 데이터를 저장하고 조회하는데 특화
    • 스키마 없이 사용 가능
    • CAP
      • 일관성
      • 가용성
      • 분할 허용
    • 저장 방식에 따른 분류
      • Key-Value Model
        • 키 하나로 데이터 하나를 저장하고 조회할 수 있는 단일 키-값 구조
        • 고속 읽기와 쓰기에 최적화
        • 복잡한 조회 연산 지원 안함
        • Redis
      • Document Model
        • 키 하나에 구조화된 문서 하나를 저장하고 조회
        • 키는 문서에 대한 ID
        • O(1) 시간 안에 문서 조회 가능
        • MongoDB
  • INNER JOIN과 OUTER JOIN이란?
    • INNER JOIN
      • 양쪽 테이블 모두 레코드가 존재하는 경우에만 레코드가 반환
    • OUTER JOIN
      • 아우터 테이블에 존재하면 레코드가 반환

6. 알고리즘

  • 정렬 알고리즘
    • 안정 정렬
      • 중복된 값을 입력 순서와 동일하게 정렬
      • Bubble, Insertion, Merge
    • Bubble
      • 인접한 두 개의 데이터를 비교하면서 정렬
    • Selection
      • 비교하는 값은 index를 저장한 후 한번씩 바꿈
    • Insertion
      • i번째 원소가 비교 값 보다 클 경우 0번째 원소부터 비교하면서 정렬
    • Merge
      • 더이상 나누어지지 않을 때까지 반씩 분할하다가 결합할 때 비교하면서 정렬
    • Heap
      • heapify 원리로 정렬
    • Quick
      • divide and conquer 사용
      • pivot을 사용해서 pivot을 기준으로 정렬
    • Counting
      • 개수를 세어 정렬
  • 다이나믹 프로그래밍
    • 복잡한 문제를 하위 문제로 나누어 푸는 방법
    • 하위 문제로 나온 값을 다시 사용
  • 그리디
    • 모든 선택지에서 항상 가장 좋은 방법을 찾음
  • 분할 정복
    • 큰 문제를 작은 문제로 쪼개어 답을 찾아가는 방식

7. Python

  • Generator란?
    • iterator의 일종
      • iterator는 순서대로 다음 값을 리턴할 수 있는 객체
      • __next__ 메소드 존재
      • list와 tuple과는 다름
        • 컬렉션 타입 : 여러 개의 요소를 갖는 타입, list, tuple, set, dictionary 등
        • 시퀀스 타입 : 순서가 존재하는 타입, list, tuple, range, str
        • iterable : 하나씩 리턴할 수 있는 객체, for문을 통해 순회할 수 있는 객체, 컬렉션, 시퀀스, __next__ 메소드 없음
    • yield문을 사용해 데이터를 원하는 시점에 반환
    • next() 메소드로 처리
    • iterable 객체는 모든 값을 담고 있어야 하기 때문에 큰 값을 다룰 때는 좋지 않음
    • generator는 yield로 필요한 값만 받아 쓰기 때문에 메모리가 적게 필요
  • 클래스를 상속할 때, 메소드 실행 방식은?
    • 메소드 순서는 __mro__에 따름
      • Method Resolution Order는 메소드를 확인하는 순서
    • 자식 클래스의 우선순위가 높음
  • GIL의 정의와 성능은?
    • Global Interpreter Lock
      • 여러 스레드가 동시에 실행하는걸 방지
      • 멀티 스레드로 만들어도 본질적으로 싱글 스레드로 동작
      • 멀티 스레드 구현이 쉽고 레퍼런스 카운팅 방식에서 오버헤드가 적어 성능이 좋음
    • 압축, 정렬, 인코딩 등 수행시간에 CPU의 영향이 큰 작업을 멀티 스레드로 수행할 경우 성능 문제 발생
    • GIL 때문에 멀티 스레드로 작업을 수행해도 싱글 스레드일 때와 차이가 거의 없음
    • 멀티 스레드는 파일, 네트워크 등 I/O 작업에 사용
    • 멀티 프로세스 사용
  • Reference count란?
    • 참조 횟수가 0인 객체는 메모리에서 해제??
  • Garbage collection의 정의와 동작 방식은?
    • 파이썬은 garbage collection과 reference counting을 통해 할당된 메모리 관리
    • 참조 횟수가 0이 아니지만 도달할 수 없는 상태인 reference cycles가 발생할 경우, 가비지 컬렉션으로 행결
    • 순환 참조
      • 컨테이너 객체(tuple, list, set, dict, class)에서만 발생
      • 자기 자신을 참조하는 객체
      • 서로 참조하는 객체
    • gc 모듈은 오로지 순환 참조를 탐지하고 해결하기 위해 존재
    • 세대와 임계값으로 가비지 컬렉션 주기와 객체 관리
      • 0, 1, 2세대로 구분되고, 0세대가 최근, 2세대가 오래된 객체
      • 0세대일수록 자주 가비지 컬렉션 동작
      • 각 세대에 객체를 할당한 횟수가 각 임계값을 초과하면 가비지 컬렉터 실행
      • 새로운 객체를 만들어질 때, 파이썬은 객체를 메모리와 0세대에 할당
      • 0세대의 객체 수가 임계값 0보다 크면 collect_generations() 실행
      • collect_generations() 실행되면 2세대부터 역으로 확인하며, 각 세대에 대해 임계값보다 객체가 많으면 collect() 실행
      • collect()는 순환 참조 탐지 알고리즘 수행
        • 도달할 수 있는 객체와 도달할 수 없는 객체 구분
        • 현재 세대와 어린 세대를 합쳐 순환 참조를 검사
  • Celery이란?
    • 메시지 패싱 방식의 분산 비동기 작업 큐
    • 작업은 브로커를 통해 메시지로 워커에 전달되어 처리
    • 작업은 멀티프로세싱, eventlet, gevent를 사용해 하나 또는 그 이상의 워커를 동시에 실행
  • PyPy와 CPython의 차이는?
    • CPython은 일반적인 인터프리터
    • PyPy
      • 실행 추적 JIT(Just In Time) 컴파일을 제공하는 인터프리터
      • 파이썬으로 만들어진 파이썬 인터프리터
      • CPython보다 빠름
      • 메소드 단위로 최적화하는 전통적인 JIT과 다르게 런타임에서 자주 실행되는 루프를 최적화
  • 메모리 누수가 발생하는 경우는?
    • 사용자의 부주의
    • timeout이 없는 캐시데이터
    • 클래스 내 __del__ 메소드를 재정의하면 순환 참조 중인 클래스가 가비지 컬렉터로 해제되지 않음
  • Duck Typing이란?
    • 객체의 실제 타입보다 객체의 변수와 메소드가 그 객체의 적합성을 결정하는 것
    • 동적 타입 언어인 파이썬은 메소드 호출이나 변수 접근시 타입 검사를 하지 않음
  • TimSort란?
    • 파이썬 내부 정렬은 timsort 알고리즘
    • merge sort와 insert sort 병합된 안정정렬
  • asyncio이란?
    • 비동기 방식을 위한 라이브러리
    • 코루틴
      • 비동기 함수
      • 응답이 지연되는 부분에서 이벤트 루프에 통제권을 줄 수 있으며, 응답이 완료되었을 때 멈췄던 부분부터 남은 작업을 완료할 수 있는 함수
      • 동기 함수 내에서 호출할려면 이벤트 루프 사용
        • 이벤트 루프 : 프로그램 중앙 제어 흐름
        • 이벤트는 I/O, 대부분 I/O는 blocking 작업
      • 비동기 함수 내에서 호출할려면 await
  • mulitprocessing이란?
    • 시간이 걸리는 작업을 별도의 프로세스를 생성 후 병렬처리
    • Pool
      • 작업이 코어 수 만큼 분할
    • Process
      • 각 작업마다 새로운 프로세스 할당
  • 매직 메소드란?
    • 양쪽에 더블 언더바가 붙은 메소드
    • __init()__
  • 이벤트 루프란?
    • 작업들을 반복문 돌면서 하나씩 실행
    • 실행한 작업이 데이터를 요청하고 응답을 기다린다면 다른 작업에게 이벤트 루프에 대한 권한을 넘김
  • 코루틴이란?
    • 동시성 프로그래밍을 가능하도록 만든 개념
    • 별도의 스레드 없이 메인 스레드 상에서 번갈아가며 병렬처리와 유사한 동작
    • 스레드는 한꺼번에 동시에 실행되지만 코루틴은 한번에 하나의 코드만 실행
    • 싱글코어에선 코루틴은 이동 시점이 더 잘 조절되고 문맥교환도 적어 성능이 좋음
    • 멀티코어 프로세서를 활용할 수 없음
  • 오버로드와 오버라이딩이란?
    • 오버로드
      • 파이썬에선 정식으로 지원하지 않음
      • 동일한 이름의 함수를 매개변수에 따라 다른 기능으로 동작
    • 오버라이딩
      • 부모 클래스에서 정의한 메소드를 자식 클래스에서 변경
  • Name mangling이란?
    • 변수나 함수 앞에 언더바를 두 개 붙여서 적용
    • 클래스의 속성값을 외부에서 접근하기 힘들게 하기 위해 사용, _클래스__속성으로 접근
    • 하위 클래스가 상위 클래스의 속성을 오버라이딩 하는 것을 막을 때 사용
    • 어느 정도의 private

8. Java

  • Java의 특징은?
    • 객체지향 프로그래밍 언어
    • 기본 자료형을 제외한 모든 요소들이 객체로 표현
    • JVM 위에서 동작하기 때문에 운영체제로부터 독립적
    • Garbage Collector를 통한 자동 메모리 관리
    • JVM 위에서 동작하기 때문에 속도가 느림
  • JVM이란?
    • 스택 기반으로 동작
    • Java Byte Code를 OS에 맞게 해석해주는 역할
    • Garbage Collector를 통해 자동적인 메모리 관리
  • Java 컴파일 과정은?
    • java 파일 생성 >> 컴파일 >> class 파일(바이트코드) 생성 >> JVM 로드 >> 기계어 해석
  • 오버라이딩과 오버로딩의 차이는?
    • 오버라이딩
      • 상위 클래스에 있는 메소드를 하위 클래스에서 재정의
    • 오버로딩
      • 매개변수의 개수나 타입을 다르게 하여 같은 이름의 메소드를 여러 개 정의하는 것
  • 추상 클래스와 인터페이스의 차이는?
    • new 연산자로 인스턴스 생성 불가
    • 사용하기 위해서는 하위 클래스에서 확장/구현 필요
    • 추상 클래스
      • 클래스 내 추상 메소드가 하나 이상 포홤된거나 abstract로 정의된 클래스
      • 상속받는 클래스들의 공통적인 로직을 추상화
      • 다중상속 불가
    • 인터페이스
      • 모든 메소드가 추상 메소드로만 이루어진 것
      • 인터페이스를 구현하는 모든 클래스에 대해 특정 메소드가 반드시 존재해야 하는 강제성 있음
      • 다중상속 가능
  • Garbage Collection이란?
    • JVM의 메모리 관리 기법
    • 시스템에서 동적으로 할당되었던 힙 메모리 영역 중에서 필요 없어진 메모리 영역을 회수하여 메모리를 관리하는 기법
    • 과정
      • GC 실행 스레드 제외한 모든 스레드 중지(Stop the world)
      • Reachable 객체 스캔 후 사용하지 않는 메모리 제거(Mark and Sweep)
    • Young Generation
      • Minor GC
      • Eden : 새로 생성된 객체 할당 영역
      • Survivor : 최소 1번 이상의 GC 이후 남은 객체 존재 영역
      • 일정 횟수 이상 살아남은 객체를 Old Generation 영역으로 이동
    • Old Generation
      • Major GC
      • Young Generation 영역에서 넘어온 인스턴스들에 의해 Old Generation 영역의 메모리가 부족하면 GC 발생
      • 10배 이상 시간 소모
  • 메모리 영역이란?
    • 메소드 영역 : 전역변수와 static 변수 저장, 프로그램의 시작부터 종료까지 메모리에 남아있음
    • 스택 영역 : 지역변수와 매개변수 저장 공간
    • 힙 영역 : new 키워드롤 생성되는 객체, 배열 등 저장, Garbage Collection에 의해 메모리 관리
  • Synchronized란?
    • 여러 개의 스레드가 한 개의 자원을 사용하고자 할 때, 현재 데이터를 사용하고 있는 스레드를 제외하고 나머지 스레들은 데이터를 접근할 수 없게 막는 개념
    • 스레드 간 동기화
  • new String("")과 리터럴("")의 차이는?
    • new String("")
      • new 키워드로 새로운 객체를 생성
      • heap 메모리 영역에 저장
    • ""
      • heap 안에 있는 String Constant Pool 영역에 저장
      • 재사용 가능
  • 접근 제한자란?
    • 변수 또는 메소드의 접근 범위를 설정해주기 위해서 사용하는 Java 예약어
    • public
      • 접근 제한 없음
    • protected
      • 해당 패키지 내, 다른 패키지에서 상속받아 자손 클래스에서 접근 가능
    • (default)
      • 해당 패키지 내에서만 접근 가능
    • private
      • 해당 클래스만 접근 가능
  • 컬렉션 프레임워크란?
    • 자료구조들이 있는 라이브러리
    • 인터페이스를 사용하여 구현
    • List, Set, Map, Stack, Queue
  • List, Set, Map, Stack, Queue의 특징은?
    • List
      • 순서가 있는 집합
      • 데이터 중복 허용
      • ArrayList
      • Vector 개선
    • Set
      • 순서가 없는 집합
      • 데이터 중복 허용 안함
      • Hash Set
    • Map
      • Key : Value
      • Key 중복 허용 안함
      • 순서가 없음
    • Stack
      • new 키워드 사용
    • Queue
      • LinkedList에 new 키워드 사용
  • Vector와 List의 차이는?
    • Vector
      • 데이터 삽입 시, 원소를 밀어서 시간복잡도 높음
      • 랜덤부분접근 가능, 시간복잡도 낮음
    • List
      • 데이터 삽입 시, 노드만 연결해서 시간복잡도 낮음
      • 랜덤 접근 불가, 시간복잡도 높음
  • Array와 ArrayList의 차이는?
    • Array
      • 인덱스 식별자 사용
      • 논리적 저장 순서와 물리적 저장 순서 일치
      • 연속된 메모리의 공간으로 이루어짐
      • 길이 변경 붉다
      • 검색 용이
      • 메모리 낭비
    • ArrayList
      • 데이터 중복 입력 가능
      • 크기를 동적으로 늘릴 수 있음
      • object element만 담음
  • 제네릭이란?
    • 데이터 타입을 하나로 지정하지 않고 사용할 때마다 범용적이고 포괄적으로 지정한다는 의미
  • 직렬화란?
    • 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 시스템에도 사용할 수 있도록 바이트 형태로 데이터 변환하는 기술
    • 역직렬화
    • JVM의 메모리에 상주되어 있는 객체 데이터를 바이트 형태로 변환
  • Spring Framework란?
    • 자바 개발을 편리하게 해주는 오픈소스 프레임워크
    • 경량 컨테이너로 자바 객체 관리
      • 객체 생성, 소멸과 같은 라이프 사이클을 관리
    • 제어의 역전(IoC)를 통해 애플리케이션의 느슨한 결합
      • 컨트롤의 제어권이 사용자가 아닌 프레임워크에 있음
      • 필요에 따라 스프링이 사용자 코드 호출
    • 의존성 주입(DI) 지원
      • 각 계층이나 서비스 간에 의존성이 존재할 경우, 프레임워크가 연결
    • 관점 지향 프로그래밍(AOP) 지원
      • 트랜잭션이나 로깅, 보안과 같은 여러 모듈에서 공통적으로 사용하는 기능의 경우, 해당 기능 분리하여 관리 가능
  • Spring Boot와 Spring Framework의 차이는?
    • Spring Boot
      • Auto Configuration
      • dependency만 추가하면, 내장된 톰캣을 제공해 서버를 바로 실행
    • Spring Framework
      • 프로젝트 초기에 다양한 환경설정 필요
  • Spring MVC란?
    • Model
      • 데이터 관리 및 비즈니스 로직 처리
    • View
      • 비즈니스 로직 처리 결과를 통해 유저 인터페이스가 표현되는 구간
    • Controller
      • 사용자의 요청을 처리하고 Model과 View를 중개하는 역할
  • 제어의 역전(IoC)이란?
    • 모든 객체에 대한 제어권을 개발자가 아닌 IoC 컨테이너에게 넘긴 것
    • Spring에서는 IoC 컨테이너에 객체들을 생성하면 객체끼리 의존성을 주입하는 역할
    • 컨테이너에 등록한 객체 = 빈(Bean)
  • Spring에서 빈(Bean) 등록 방법은?
    • @Component 어노테이션
    • @Configuration 어노테이션
  • 의존성 주입(DI)이란?
    • 필요한 객체를 직접 생성하는 것이 아닌 외부로부터 객체를 받아서 사용하는 것
    • 이를 통해 객체 간의 결합도를 줄이고 코드의 재사용성을 높일 수 있음
    • 생성자 주입
    • 필드 주입
    • Setter 주입
  • 관점 지향 프로그래밍(AOP)이란?
    • 핵심 비즈니스 로직에 있는 공통 관심사항을 분리하여 각각을 모듈화하는 것
    • 공통 모듈인 인증, 로깅, 트랜잭션 처리에 용이
    • 핵심 비즈니스 로직에 부가기능을 하는 모듈이 중복되어 분포되어 있을 경우 사용
    • 중복 코드 제거, 재활용의 극대화, 변화 수용의 용이성
  • 롬복(Lombok)이란?
    • 메소드를 컴파일 하는 과정에 개입하여 추가적인 코드를 만듦
    • 어노테이션 프로세싱
    • 자바 컴파일러가 컴파일 단계에서 어노테이션을 분석하고 처리하는 기법
  • 서블릿(Servlet)이란?
    • 클라이언트의 요청을 처리하고, 그 결과를 반환하는 Servlet 클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술
    • Spring MVC에서 Controller로 이용
    • 사용자의 요청을 받아 처리한 후 결과 반환
    • 자바를 사용해 웹을 만글기 위해 필요한 기술
  • JSP란?
    • Java Server Pages
    • Java를 이용한 서버 사이드 스크립트 언어
    • HTML 안에 자바 코드 작성
  • ORM이란?
    • Object-Relational-Mapping
    • 애플리케이션의 테이블 매핑
    • 애플리케이션의 객체를 RDB 테이블에 자동으로 영속화
    • SQL문이 아니라 Method를 통해 DB 조작
    • 코드 가독성 높임
    • 객체 지향적 코드 작성 가능
    • 프로젝트의 규모가 크고 복잡하여 설계가 잘못된 경우, 속도 저하
  • JPA란?
    • Java Persistence API
    • 자바에서 ORM 기술 표준으로 사용하는 인터페이스 모음
    • 자바 애플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스
    • SQL이 아닌 객체 중심 개발

https://velog.io/@zxcasd3004/%EA%B8%B0%EC%88%A0-%EB%A9%B4%EC%A0%91-%EC%A4%80%EB%B9%84#1-%EA%B8%B0%EC%B4%88