Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BackEnd] 정재빈 #4

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 44 additions & 1 deletion back-end/DB.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,66 @@

- 답 :

B Tree와 RBT, AVL Tree 모두 데이터의 조회, 삽입, 삭제에 걸리는 시간 복잡도가 모두 O(logN) 으로 동일하다. 하지만, B Tree는 데이터를 Block 단위로 저장하고, RBT, AVL Tree는 이진트리 형식으로 노드별로 각각 데이터를 저장한다.

RDB 는 기본적으로 데이터를 Secondary Storage(SSD or HDD) 에 저장한다. 때문에, 데이터에 접근하는데 들어가는 비용이 굉장이 크다. 그래서 한 번에 최대한 많은 관련 데이터를 가져오는 것이 유리하고, Block 단위로 데이터를 저장하는 B Tree를 인덱스로 사용하는 것이 유리하다.

reference : https://www.youtube.com/watch?v=liPSnc6Wzfk

<br>

---
2. **레코드 수가 아주 많을 것으로 예상되는 대용량 테이블을 어떻게 설계할 것인지 설명해주세요. 또, 해당 테이블에서 어떻게 쿼리 최적화를 할 것인지 설명해주세요.**

- 답 :

1. 데이터의 성격에 맞춰 정규화와 반정규화를 한다
2. 데이터의 접근 빈도에 따라 테이블을 수평 분할처리한다
3. 데이터의 접근 빈도에 따라 테이블을 수직 분할처리한다
4. 자주 사용되는 검색 조건에 맞게 인덱스를 설정한다
5. 연관있는 데이터는 인접한 Block에 저장하여 클러스터링한다
6. 쿼리 성능을 모니터링하여, 쿼리별 실행 시간과 빈도를 체크하고, 인덱스와 JOIN 조건을 적절히 수정한다



<br>

---
3. **트랜잭션의 개념을 설명하고, ACID에 대해 최대한 자세히 설명해주세요.**

- 답 :
- 답 :

트랜잭션은 하나의 논리적 기능을 수행하는 작업의 최소 단위이다.
데이터베이스에서 트랜잭션은 ACID 원칙에 따라 정의 할 수 있다.

**ACID 원칙:**

**원자성 (Atomicity):**

트랜잭션은 분리될 수 없는 작업의 최소 단위이기에 트랜잭션 내부 동작은 전부 성공하거나 전부 실패해야 한다.
때문에, 모든 작업이 완료되어 데이터베이스에 영구적으로 적용되거나, 어떠한 작업도 적용되지 않아야 한다.

**일관성 (Consistency):**

트랜잭션이 완료된 후에 데이터베이스는 일관된 상태를 유지해야 한다.
데이터베이스에 저장된 데이터는 모든 제약 조건을 준수하며, 무결성 규칙에 위배되지 않아야 한다.

**고립성 (Isolation):**

모든 트랜잭션은 다른 트랜잭션으로부터 독립되어야 한다.

**지속성 (Durability):**

지속성은 하나의 트랜잭션이 성공적으로 수행되었다면, 해당 트랜잭션에 대한 로그가 남아야한다.
어떤 오류가 발생해도, 해당 기록은 영구적이어야 한다.

<br>

3-1. **DB에서 직접 동시성을 제어하는 방법과 어플리케이션 레벨에서 동시성을 제어하는 방법이 무엇이 있는지 각각 설명하고, 두 방법을 비교해주세요.**

- 답 :
DB 에서는 트렌젝션을 사용하여 ACID 원칙에 따라 여러 작업을 동시에 수행할 수 있도록 하고, Lock을 이용하여 특정 자원에 동시 접근하는 것을 막는다.
어플리케이션 레벨에서는 멀티스레딩을 통해 여러 작업을 동시에 수행할 수 있도록 하고, 특정 함수나 변수에 대한 Lock을 설정해 동시 수행되는 것을 막는다.
DB의 동시성 제어는 시스템 내부에서 처리되어 유연성이 적지만, 어플리케이션의 경우 개발자가 직접 제어하기 때문에 유연성이 높지만, 오류 가능성이 있다. 또한, DB는 전역적인 범위에서 동작하지만 어플리케이션의 경우 해당 어플리케이션 내부에서만 동작한다는 차이점이 존재한다.


58 changes: 56 additions & 2 deletions back-end/Java.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,55 @@

- 답 :

**자바 프로그램의 실행 3단계 : 컴파일, 로드, 실행**

**1. 컴파일 단계**

자바 컴파일러(javac)가 소스 코드를 바이트 코드로 컴파일한다. 이 바이트 코드는 플랫폼에 독립적이다.

**2. 로드 단계**

JVM은 클래스 로더를 통해 컴파일된 바이트 코드를 읽는다. 클래스 로더는 필요한 클래스들을 로드하고 메모리에 올린다.

**3. 실행 단계**

Execution Engine은 로드된 바이트 코드를 해석하고 실행합니다. 이 과정에서 프로그램 수행 속도를 위하여, Interpreter을 이용하여 프로그램을 한 줄씩 실행함과 동시에 JIT 컴파일러를 사용하여 바이트 코드를 기계어로 컴파일하여, 실행이 지나치게 느려지지 않도록 한다.

<br>

---
2. **해시의 개념과 해시를 사용할 때 발생할 수 있는 문제를 설명하고, 자바가 이를 해결하는 방법이 무엇인지 최대한 자세하게 설명해주세 .**
2. **해시의 개념과 해시를 사용할 때 발생할 수 있는 문제를 설명하고, 자바가 이를 해결하는 방법이 무엇인지 최대한 자세하게 설명해주세요.**

- 답 :

해시는 입력받은 데이터를 고정된 길이의 값으로 변환하는 것을 말한다.
무한한 종류의 대이터의 유한한 공간으로 mapping 하는 것이기 때문에, 충돌은 불가피하고, 자바는 이를 Seperate Chaining 과 Open addressing 기법으로 해결한다.

**개방 주소법(open addressing)** : 해시 테이블 크기는 고정하면서 저장할 위치를 찾는다.
**분리 연결법 (separate chaining)** : 해시 테이블의 크기를 유연하게 만든다.


<br>

2-1. **Hashtable, HashMap, ConcurrentHashMap에 대해 설명하고, ConcurrentHashMap이 어떻게 성능을 개선하였는지 설명해주세요.**

- 답 :
- 답 :

**HashMap**
- Null 허용
- 동기화 미보장
- 동기화를 처리하지 않기 때문에 데이터를 탐색하는 속도가 빠르다.

**HashTable**
- Null 비허용
- 모든 데이터 조작 메서드에 synchronized 키워드가 적용되어 동기화 락을 걸어 스레드 안정성을 보장한다.
- 모든 메서드에 락을 걸어 처리하기 때문에 성능이 떨어질 수 있다.

**ConcurrentHashMap**
- Null 비허용
- 스레드 안전성을 보장한다.
- Entry 아이템별로 락을 걸어 HashMap의 동기화 문제를 개선하고, HashTable의 성능 문제을 개선했다.


<br>

Expand All @@ -22,9 +59,26 @@

- 답 :

가비지 컬렉션은 Heap 영역에서 동적으로 할당된 메모리 중 필요없게 된 메모리 객체(garbage)를 주기적으로 제거하는 프로세스이다.

Java 에서는 JVM 이 이를 담당하며, Python, JavaScript, Go 등 많은 언어에서 이 기능을 지원하며, C/C++ 에서 free(), delete() 함수를 주기적으로 수행하는 프로세스 라고 볼 수 있다.

자동으로 메모리 관리를 해주기 때문에 안정성과 편의성이 높지만, 별도의 메모리와 자원 소모가 필요해 성능 저하가 된다는 단점이 있다.

<br>

---
4. **Java IO와 NIO의 차이와, NIO가 IO를 개선한 방법에 대해 설명해주세요.**

- 답 :

IO 와 NIO 는 다음과 같은 차이점이 있다

1. 스트림 vs 채널
- IO는 스트림 기반이고, 입력 스트림과 출력 스트림이 분리되어 있다.
때문에, 데이터를 읽기 위해 입력과 출력 스트림 2가지를 만들어야 한다.
- NIO는 채널 기반이다. 채널은 스트림과 달리 입력과 출력이 모두 하나의 채널로 가능하다.

2. Non-Buffer vs Buffer
- IO에서는 출력 스트림이 1바이트를 쓰면 입력 스트림이 1바이트를 읽는다. 때문에 속도가 느리다. 또한 IO는 스트림에서 읽은 데이터를 즉시 처리하므로 스트림으로부터 입력된 전체 데이터를 별도로 저장하지 않으면, 입력된 데이터의 위치를 이동해 가면서 자유롭게 이용할 수 없다.
- NIO는 기본적으로 버퍼를 사용하여 입출력을 한다. 채널은 버퍼에 저장된 데이터를 출력하고, 입력된 데이터를 버퍼에 저장한다. 때문에 IO에 비해 빠르고, 읽은 데이터를 무조건 버퍼에 저장하기 때문에 버퍼 내에서 데이터의 위치를 이동해 가면서 필요한 부분만 읽고 쓸 수 있다.