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) : 의존 역전 원칙
- 고수준 모듈은 저수준 모듈의 구현에 의존해서는 안 된다. 고수준 모듈에서 정의한 추상 타입에 의존해야 한다.
- 예를 들어, 상품의 가격을 결정하는 정책을 생각해보자.
- "쿠폰을 적용해서 가격할인을 받을 수 있다. 쿠폰은 동시에 한개만 적용 가능하다."
- 이는 고수준 모듈의 정책이다. 여기서 쿠폰을 이용한 가격 계산이 개별적인 쿠폰 구현에 의존하게 되면 어떤일이 벌어질까?
- 이런 상황은 변경을 어렵게 만든다. 새로운 쿠폰이 추가될 때마다 가격 모듈을 계속 변경해야 할 것이다.
- SRP(Single Responsibility 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
- WAS
- 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)
- Controller
- Git와 Github의 정의는?
- Git
- 버전 관리 프로그램
- Version Control System
- 로컬에서 버전 관리
- 로컬에서 프로젝트의 기록을 스스로 관리
- 브랜치를 생성 및 관리 가능
- 다른 개발자와 실시간으로 작업을 공유할 수 없음
- Github
- Git Repository를 위한 웹 기반 호스팅 서비스
- 클라우드 서버를 사용해 로컬에서 관리한 소스 코드를 업로드 및 공유 가능
- 버전 관리, 소스 코드 공유 가능항 원격 저장소
- Git
- 브라우저의 작동 원리는?
- 사용자가 선택한 자원을 서버에 요청하고 표시
- 자원은 보통 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
- 큐브라는 리눅스 컨테이너 작업을 자동화하는 오픈소스 플랫폼
- 모든 서버를 하나의 클러스터로 구성해서 하나의 컴퓨터에서 작업하는 것처럼 개발 배포 관리
- Hadoop
- 애자일이란?
- 신속한 반복 작업으로 실제 작동 가능한 소프트웨어를 개발하는 방식
- Load balancing이란?
- 한 대의 서버로 부하가 집중되지 않도록 트래픽을 관리
- scale-out 방식에 필요
- 알고리즘
- 라운드로빈
- IP 해시
- L4
- 포트 정보를 바탕으로 로드 분산
- 전송 계층의 정보를 바탕으로 로드 분산
- L7
- 응용 계층에서 로드 분산
- 요청을 세분화해 서버에 전달 할 수 있음
2. 자료구조
- Array와 Linked List의 정의와 차이는?
- Array
- 논리적 저장 순서와 물리적 저장 순서가 일치
- 인덱스로 해당 원소에 접근 가능
- 검색, O(1)
- 추가와 삭제는 원소들을 옮겨야하는 비용 발생, O(n)
- Linked List
- 데이터와 포인터로 구성
- 추가와 삭제, O(1)
- 검색 시 첫번째 원소부터 확인해야 함, O(n)
- Tree 구조에서 사용
- Array
- Stack과 Queue의 정의와 차이는?
- Stack
- Last in First Out
- Queue
- First in First Out
- Stack
- 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
- 각 버킷을 연결리스트로 구현
- 충돌 발생 시, 리스트에 추가
- 메모리 할당하는 오버헤드
- Open Address
- 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보다 적은 메시지 요구
- TCP
- HTTP와 HTTPS의 차이는?
- HTTP
- 정의
- 서버와 클라이언트 사이에 이루어지는 요청/응답 프로토콜
- 문제점
- 평문 통신이기 때문에 패킷 수집으로 도청 가능
- 통신 상대를 확인하지 않기 때문에 누구든지 요청을 보낼 수 있어 위장 가능
- 완전성을 증명할 수 없기 때문에 변조 가능
- 정의
- HTTPS
- SSL의 껍질을 덮어쓴 HTTP
- HTTP 통신하는 소켓 부분을 SSL or TLS이라는 프로토콜로 대체
- HTTP는 TCP와 직접 통신했지만, HTTPS는 SSL과 통신하고 SSL이 TCP와 통신
- 암호화 통신은 CPU나 메모리 등 리소스를 더 요구하지만, 최근 하드웨어의 발달로 HTTPS를 사용하더라도 속도 저하가 거의 없음
- HTTP
- DNS round robin의 동작 방식은?
- DNS
- 도메인을 네트워크 주소로 바꾸거나 그 반대를 수행
- DNS round robin
- 여러 대의 서버 IP 리스트 중 라운드 로빈 형태로 랜덤하게 사용자에게 알려줌
- 문제점
- 부하 분산을 위해 서버의 대수를 늘리기 위해서 그만큼 공인 IP 주소가 필요
- 서버가 다운되어도 확인 불가
- DNS
- 웹 통신의 큰 흐름은?
- 브라우저
- 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로 해결
- 교착상태, 진입 대기 중인 프로세스가 실행되어야만 빠져나올 수 있는 상황??
- Mutex Lock
- 임계영역
- 메모리 관리란? (Paging, Segmentaion)
- Swapping
- 메모리 관리 기법
- CPU 할당 시간이 끝난 프로세스의 메모리를 보조 기억장치로 내보내고 다른 프로세스를 메모리로 불러옴
- 메모리 공간이 부족할 때 실행
- 단편화
- 프로세스가 메모리에 적재되고 제거되는 일의 반복으로 메모리 틈 사이에 작은 공간
- 외부 단편화
- 남은 공간들을 모두 합치면 충분한 공간이 되는 부분들이 분산되어 있음
- 내부 단편화
- 프로세스가 사용하고 남은 부분
- 압축은 프로세스를 한쪽으로 몰아 자유공간을 확보하지만, 작업효율이 좋지 않음??
- Paging
- 하나의 프로세스의 메모리 공간이 연속적이어야 한다는 제약을 없애는 메모리 관리 방법
- 물리 메모리는 frame, 논리 메모리는 page로 고정 크기로 관리
- 순서에 상관없이 물리 메모리에 있는 프레임에 mapping
- page 크기가 고정이라서 내부 단편화 발생
- Segmentaion
- 논리 메모리와 물리 메모리를 서로 다른 크기의 논리적 단위인 세그먼트로 분할하여 저장
- 서로 다른 크기의 세그먼트 때문에 외부 단편화 발생
- Swapping
- 가상 메모리란? (페이지 교체 알고리즘)
- 프로세스 전체가 메모리 내에 올라오지 않아도 실행이 가능하게 하는 방법
- 메모리 용량보다 큰 프로그램을 실행할 수 있음
- 가상 주소 공간 제공
- 프로세스 간 페이지 공유??
- 요구 페이징
- 초기에 필요한 페이지만 적재
- 한 번도 접근되지 않은 페이지는 물리 메모리에 적재되지 않음
- 페이지 교체
- 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을 사용하는 것이 좋음
- Statement
- NoSQL이란?
- 관계형 데이터 모델을 지양하며 대량의 분산된 데이터를 저장하고 조회하는데 특화
- 스키마 없이 사용 가능
- CAP
- 일관성
- 가용성
- 분할 허용
- 저장 방식에 따른 분류
- Key-Value Model
- 키 하나로 데이터 하나를 저장하고 조회할 수 있는 단일 키-값 구조
- 고속 읽기와 쓰기에 최적화
- 복잡한 조회 연산 지원 안함
- Redis
- Document Model
- 키 하나에 구조화된 문서 하나를 저장하고 조회
- 키는 문서에 대한 ID
- O(1) 시간 안에 문서 조회 가능
- MongoDB
- Key-Value Model
- INNER JOIN과 OUTER JOIN이란?
- INNER JOIN
- 양쪽 테이블 모두 레코드가 존재하는 경우에만 레코드가 반환
- OUTER JOIN
- 아우터 테이블에 존재하면 레코드가 반환
- INNER 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로 필요한 값만 받아 쓰기 때문에 메모리가 적게 필요
- iterator의 일종
- 클래스를 상속할 때, 메소드 실행 방식은?
- 메소드 순서는 __mro__에 따름
- Method Resolution Order는 메소드를 확인하는 순서
- 자식 클래스의 우선순위가 높음
- 메소드 순서는 __mro__에 따름
- GIL의 정의와 성능은?
- Global Interpreter Lock
- 여러 스레드가 동시에 실행하는걸 방지
- 멀티 스레드로 만들어도 본질적으로 싱글 스레드로 동작
- 멀티 스레드 구현이 쉽고 레퍼런스 카운팅 방식에서 오버헤드가 적어 성능이 좋음
- 압축, 정렬, 인코딩 등 수행시간에 CPU의 영향이 큰 작업을 멀티 스레드로 수행할 경우 성능 문제 발생
- GIL 때문에 멀티 스레드로 작업을 수행해도 싱글 스레드일 때와 차이가 거의 없음
- 멀티 스레드는 파일, 네트워크 등 I/O 작업에 사용
- 멀티 프로세스 사용
- Global Interpreter Lock
- 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 영역에 저장
- 재사용 가능
- new String("")
- 접근 제한자란?
- 변수 또는 메소드의 접근 범위를 설정해주기 위해서 사용하는 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 키워드 사용
- List
- Vector와 List의 차이는?
- Vector
- 데이터 삽입 시, 원소를 밀어서 시간복잡도 높음
- 랜덤부분접근 가능, 시간복잡도 낮음
- List
- 데이터 삽입 시, 노드만 연결해서 시간복잡도 낮음
- 랜덤 접근 불가, 시간복잡도 높음
- Vector
- Array와 ArrayList의 차이는?
- Array
- 인덱스 식별자 사용
- 논리적 저장 순서와 물리적 저장 순서 일치
- 연속된 메모리의 공간으로 이루어짐
- 길이 변경 붉다
- 검색 용이
- 메모리 낭비
- ArrayList
- 데이터 중복 입력 가능
- 크기를 동적으로 늘릴 수 있음
- object element만 담음
- Array
- 제네릭이란?
- 데이터 타입을 하나로 지정하지 않고 사용할 때마다 범용적이고 포괄적으로 지정한다는 의미
- 직렬화란?
- 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 시스템에도 사용할 수 있도록 바이트 형태로 데이터 변환하는 기술
- 역직렬화
- JVM의 메모리에 상주되어 있는 객체 데이터를 바이트 형태로 변환
- Spring Framework란?
- 자바 개발을 편리하게 해주는 오픈소스 프레임워크
- 경량 컨테이너로 자바 객체 관리
- 객체 생성, 소멸과 같은 라이프 사이클을 관리
- 제어의 역전(IoC)를 통해 애플리케이션의 느슨한 결합
- 컨트롤의 제어권이 사용자가 아닌 프레임워크에 있음
- 필요에 따라 스프링이 사용자 코드 호출
- 의존성 주입(DI) 지원
- 각 계층이나 서비스 간에 의존성이 존재할 경우, 프레임워크가 연결
- 관점 지향 프로그래밍(AOP) 지원
- 트랜잭션이나 로깅, 보안과 같은 여러 모듈에서 공통적으로 사용하는 기능의 경우, 해당 기능 분리하여 관리 가능
- Spring Boot와 Spring Framework의 차이는?
- Spring Boot
- Auto Configuration
- dependency만 추가하면, 내장된 톰캣을 제공해 서버를 바로 실행
- Spring Framework
- 프로젝트 초기에 다양한 환경설정 필요
- Spring Boot
- Spring MVC란?
- Model
- 데이터 관리 및 비즈니스 로직 처리
- View
- 비즈니스 로직 처리 결과를 통해 유저 인터페이스가 표현되는 구간
- Controller
- 사용자의 요청을 처리하고 Model과 View를 중개하는 역할
- Model
- 제어의 역전(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이 아닌 객체 중심 개발