├── .gitignore
├── Algorithm
├── .keep
├── 배열,리스트,스택,큐.md
└── 정렬 알고리즘.md
├── DataStructure
└── 해시테이블.md
├── Database
├── B-Tree와 B+Tree.md
├── Join.md
├── SQL_VS_NOSQL.md
├── 데이터베이스 클러스터링 VS 레플리카 6768dd1874c74763a3033dac6002f6ec.md
├── 데이터베이스인덱스.md
├── 정규화
│ ├── BCNF1.png
│ ├── BCNF2.png
│ ├── 이상현상과 결정자1.png
│ ├── 이상현상과 결정자2.png
│ ├── 이상현상과 결정자3.png
│ ├── 정규화.md
│ ├── 제1정규형.png
│ ├── 제2정규형1.png
│ ├── 제2정규형2.png
│ ├── 제3정규형1.png
│ └── 제3정규형2.png
└── 트랜잭션.md
├── DesignPattern
└── MVC,MVVM,MVP
│ ├── MVC, MVVM, MVP.md
│ ├── mvc1.png
│ ├── mvp1.png
│ └── mvvm1.png
├── Development
├── CORS
│ ├── CORS 0e3c01bc007c4adf83e4842c6db23bf6.md
│ └── CORS 0e3c01bc007c4adf83e4842c6db23bf6
│ │ ├── Untitled 1.png
│ │ └── Untitled.png
├── IoC, DI, AOP.md
├── Web Server & WAS.md
├── block&nonblock-sync&async
│ ├── Blocking & Non-Blocking - Synchronous & Asynchrono 9f3213ff70fc47edaf8749c28974a713.md
│ └── Blocking & Non-Blocking - Synchronous & Asynchrono 9f3213ff70fc47edaf8749c28974a713
│ │ ├── Untitled 1.png
│ │ ├── Untitled 2.png
│ │ ├── Untitled 3.png
│ │ ├── Untitled 4.png
│ │ ├── Untitled 5.png
│ │ ├── Untitled 6.png
│ │ ├── Untitled 7.png
│ │ ├── Untitled 8.png
│ │ ├── Untitled 9.png
│ │ └── Untitled.png
├── observer&pub-sub
│ ├── Observer & Pub-Sub Pattern 823bd016417c4e228cf53e98c52be269.md
│ └── Observer & Pub-Sub Pattern 823bd016417c4e228cf53e98c52be269
│ │ ├── Untitled 1.png
│ │ ├── Untitled 2.png
│ │ ├── Untitled 3.png
│ │ └── Untitled.png
├── 객체지향 프로그래밍.md
├── 웹_보안.md
└── 함수형 프로그래밍.md
├── Network
├── CDN.md
├── DNS.md
├── HTTP,HTTPS.md
├── OSI 7 계층.md
├── TCP_UDP
│ ├── TCP UDP 5780e78099a8404393d51e88a365562a.md
│ └── TCP UDP 5780e78099a8404393d51e88a365562a
│ │ ├── Untitled 1.png
│ │ ├── Untitled 10.png
│ │ ├── Untitled 11.png
│ │ ├── Untitled 12.png
│ │ ├── Untitled 13.png
│ │ ├── Untitled 14.png
│ │ ├── Untitled 15.png
│ │ ├── Untitled 16.png
│ │ ├── Untitled 2.png
│ │ ├── Untitled 3.png
│ │ ├── Untitled 4.png
│ │ ├── Untitled 5.png
│ │ ├── Untitled 6.png
│ │ ├── Untitled 7.png
│ │ ├── Untitled 8.png
│ │ ├── Untitled 9.png
│ │ └── Untitled.png
└── 로드밸런싱.md
├── OperatingSystem
├── CPU 스케줄러.md
├── IPC.md
├── 가상 메모리.md
├── 병행성.md
├── 인터럽트와 시스템콜.md
└── 프로세스와 스레드.md
└── README.md
/.gitignore:
--------------------------------------------------------------------------------
1 |
2 | # Created by https://www.toptal.com/developers/gitignore/api/macos,windows
3 | # Edit at https://www.toptal.com/developers/gitignore?templates=macos,windows
4 |
5 | ### macOS ###
6 | # General
7 | .DS_Store
8 | .AppleDouble
9 | .LSOverride
10 | .idea
11 |
12 | # Icon must end with two \r
13 | Icon
14 |
15 |
16 | # Thumbnails
17 | ._*
18 |
19 | # Files that might appear in the root of a volume
20 | .DocumentRevisions-V100
21 | .fseventsd
22 | .Spotlight-V100
23 | .TemporaryItems
24 | .Trashes
25 | .VolumeIcon.icns
26 | .com.apple.timemachine.donotpresent
27 |
28 | # Directories potentially created on remote AFP share
29 | .AppleDB
30 | .AppleDesktop
31 | Network Trash Folder
32 | Temporary Items
33 | .apdisk
34 |
35 | ### Windows ###
36 | # Windows thumbnail cache files
37 | Thumbs.db
38 | Thumbs.db:encryptable
39 | ehthumbs.db
40 | ehthumbs_vista.db
41 |
42 | # Dump file
43 | *.stackdump
44 |
45 | # Folder config file
46 | [Dd]esktop.ini
47 |
48 | # Recycle Bin used on file shares
49 | $RECYCLE.BIN/
50 |
51 | # Windows Installer files
52 | *.cab
53 | *.msi
54 | *.msix
55 | *.msm
56 | *.msp
57 |
58 | # Windows shortcuts
59 | *.lnk
60 |
61 | # End of https://www.toptal.com/developers/gitignore/api/macos,windows
--------------------------------------------------------------------------------
/Algorithm/.keep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BoostUpStudy/Backend_Interview_Study/aa78027fc7f2081ab6f5eef37b0b2af1ccdfe21c/Algorithm/.keep
--------------------------------------------------------------------------------
/Algorithm/배열,리스트,스택,큐.md:
--------------------------------------------------------------------------------
1 | # 배열,리스트,스택,큐
2 |
3 | ### 선형 자료 구조
4 |
5 | 
6 |
7 | 선형 자료 구조란 데이터 구조를 구성하는 요소들이 서로 인접하여 순차적인 방식으로 정렬 (이어져 있다는 뜻)되어 있음을 뜻한다. 가장 일반적인 선형 자료구조인 배열, 리스트에 대해 알아보자
8 |
9 | ### 배열
10 |
11 | 
12 |
13 | 이미지 출처: [TCP SCHOOL](http://www.tcpschool.com/)
14 |
15 | 연관된 데이터들을 그룹으로 관리하기 위한 자료구조로 자료형들이 메모리 공간상에서 연속적으로 저장되어 있는 구조이다. 때문에 물리적 저장공간과 논리적 저장공간이 같고, 각각의 `요소` 들에 `인덱스` 가 붙어있다.
16 |
17 | - 인덱스를 통해서 데이터에 바로 접근 가능하다. (랜덤 엑세스)
18 |
19 | > **Random access(임의 접근):** 메모리 주소만 있어도 즉시 데이터를 읽을 수 있는 호출 방식
20 | **Sequential access (순차 접근):** 데이터의 위치까지 맨앞부터 차례로 탐색하는 방식
21 | >
22 | - 데이터를 추가하거나 삭제 할 때 배열 내 다른 데이터의 순서를 다시 매겨야 한다.
23 | - 크기가 고정되어있다.
24 | - 1차원 배열부터 다차원 배열까지 구성이 가능하다.
25 | - **`Cache hit`** 가능성이 커져 성능에 큰 도움이 된다
26 |
27 | > CPU가 참조하고자 하는 메모리가 캐시에 존재하고 있을 경우 Cache Hit라고 한다.
28 | >
29 | - 각 기능별 복잡도
30 |
31 | 
32 |
33 |
34 |
35 | ### 리스트
36 |
37 | 배열이 가지고 있는 인덱스라는 장점을 버리고 빈틈없는 적재라는 장점을 취한 자료구조이다. 노드(node)라고 불리는 리스트의 요소들은 데이터 요소와 포인터의 쌍으로 구성된다. 각 노드들은 흩어진 상태로 저장이 되고, 각 노드에 접근시 이전 요소의 포인터를 사용하여 접근한다.
38 |
39 | 
40 |
41 | 
42 |
43 | 이미지 출처: [TCP SCHOOL](http://www.tcpschool.com/java/java_collectionFramework_list)
44 | - 해당 리스트에 진입하는 첫 노드 지점을 헤드라고 한다
45 | - 노드 하나가 다음노드의 포인터 하나만 갖는 유형이 `단반향 연결 리스트`
46 | - 마지막 노드는 보통 `null` 값을 가지게 된다.
47 | - 노드 하나가 이전노드, 다음노드의 포인터 모두 갖는 유형이 `양방향 연결 리스트`
48 | - 단방향에 비해 삭제할 때나 양방향 순회시 더 효율적
49 | - 순차성을 보장하지 못하기 때문에 **Spatical locality** 보장이 되지 않아 **`cache hit`** 가 어렵다.
50 |
51 | > **Spatical locality:** 최근 접근했던 주소 근처의 주소들을 접근하는 경향을 말함
52 | >
53 | - 순환 연결 리스트(circular linked list)
54 | - 모든 노드들이 원형으로 연결됨, 마지막 노드가 첫 번째 노드와 연결됨
55 | - 단방향 또는 양방향 모두 가능
56 | - 각 기능별 복잡도
57 |
58 | 
59 |
60 |
61 | ### 스택
62 | 
63 |
64 | 이미지 출처: [programiz](https://www.programiz.com/dsa/stack)
65 |
66 | 추가된 요소를 메모리의 가장 앞 주소에 배치하는 자료구조 요소를 스택의 최상단에서만 삭제 및 추가할 수 있다. 마지막에 넣은 요소가 제일 먼저 나오기 때문에 LIFO(Last In First Out) 후입선출이라 한다.
67 |
68 | - 스택에 요소를 추가하는 동작을 `push` 라 한다
69 | - 스택에 요소를 삭제할 때 가장 마지막으로 추가된 요소를 삭제는 동작을 `pop` 이라 한다.
70 | - 크기를 늘릴 수 있는지 여부에 따라 정적 스택(배열이용)과 동적 스택(리스트이용)으로 구분
71 | - 함수 호출, 스케줄링 등 다양한 부분에서 사용됨
72 | - 각 기능별 복잡도
73 |
74 | 
75 |
76 |
77 | ### 큐
78 | 
79 |
80 | 이미지 출처: [programiz](https://www.programiz.com/dsa/stack)
81 |
82 | 각 요소에 우선순위를 부여하는 자료 구조, 먼저 추가된 요소가 우선적으로 삭제된다는 점에서 FIFO(First in First out ) 선입선출이라 한다.
83 |
84 | - 큐 맨 뒤쪽에 요소를 추가하는 동작을 `enqueue` 라 한다.
85 | - 큐에서 가장 오랫동안 있던 요소가 먼저 삭제되고, 그 동작을 `dequeue` 라고 한다.
86 | - **우선순위큐**
87 | - 큐에 모든 요소에는 우선순위가 있으며 우선순위가 높은 요소는 우선순위가 낮은 요소보다 먼저 삭제된다.
88 | - 각 기능별 복잡도
89 |
90 | 
91 |
92 |
93 |
94 |
95 | ## 참고자료
96 |
97 | - 생활코딩 배열
98 |
99 | [배열 - Data Structure (자료구조)](https://opentutorials.org/module/1335/8677)
100 |
101 | - 생활코딩 리스트
102 |
103 | [리스트 (List) - Data Structure (자료구조)](https://opentutorials.org/module/1335/8636)
104 |
105 | - 위키 스택
106 |
107 | [스택 - 위키백과, 우리 모두의 백과사전](https://ko.wikipedia.org/wiki/%EC%8A%A4%ED%83%9D)
108 |
109 |
110 | - 자료구조 시간복잡도
111 |
112 | [[알고리즘]자료구조에 따른 시간복잡도 O(n) 정리](https://blog.naver.com/PostView.nhn?blogId=jhc9639&logNo=221339684077&redirect=Dlog&widgetTypeCall=true&directAccess=false)
113 |
114 | - 그외
115 |
116 | [[ 자료구조 ] 배열(Array) vs 리스트(List) - 특징, 차이](https://jy-tblog.tistory.com/38)
117 |
118 | - 서적 참고
119 |
120 | 코드 없는 알고리즘과 데이터 구조 - 암스트롱수베로 / 류태호 역
--------------------------------------------------------------------------------
/Algorithm/정렬 알고리즘.md:
--------------------------------------------------------------------------------
1 | # 정렬 알고리즘
2 |
3 | # 설명
4 |
5 | 정렬이란 원소들을 번호순이나 사전 순서와 같이 일정한 순서태로 열거하는 작업
6 |
7 | # 종류
8 |
9 | ## 버블 정렬
10 |
11 | ### 설명
12 |
13 | 매번 연속된 두 인덱스를 비교하여 오름차순의 경우 더 큰값이 뒤로 오도록 두 수를 교환하는 방법
14 |
15 | 회차마다 정렬된 수는 맨 뒤에 존재하게 되므로 비교는 n-(회차 수) 만큼 하면 된다.
16 |
17 | 
18 |
19 | ```python
20 | def bubbleSort(arr):
21 | n = len(arr)
22 | for i in range(n):
23 | for j in range(1, n-i):
24 | if arr[j] < arr[j-1]:
25 | arr[j], arr[j-1] = arr[j-1], arr[j]
26 | ```
27 |
28 | - 시간복잡도
29 | - 최선 시간복잡도 : O(n^2)
30 | - 최악 시간복잡도 : O(n^2)
31 | - 공간복잡도 : O(n), 예비 O(1)
32 | - 안정 정렬
33 |
34 |
35 |
36 | ## 선택 정렬
37 |
38 |
39 |
40 | ### 설명
41 |
42 | 1. 주어진 리스트 중에 최소값을 찾아 맨 앞의 값과 교환
43 | 2. 정렬된 값을 제외한 나머지 값들에 대해 반복한다.
44 |
45 | 
46 |
47 | ### 코드
48 |
49 | ```python
50 | def selectSort(arr):
51 | n = len(arr)
52 | for i in range(n-1):
53 | minIdx = i
54 | for j in range(i+1, n):
55 | if arr[j] < arr[minIdx]:
56 | minIdx = j
57 | arr[i], arr[minIdx] = arr[minIdx], arr[i]
58 | ```
59 |
60 | - 시간복잡도
61 | - 최선 시간복잡도, 최악 시간복잡도 : O(n^2)
62 | - 공간복잡도 : O(n), 예비 O(1)
63 | - 불안정 정렬
64 |
65 | 
66 |
67 |
68 | ## 삽입 정렬
69 |
70 |
71 |
72 | ### 설명
73 |
74 | 현재 위치에서, 그 앞의 미리 정렬된 부분에서의 자신의 위치를 찾아 삽입하는 방법
75 |
76 | 
77 |
78 | ### 코드
79 |
80 | ```python
81 | def insert_sort(arr):
82 | n = len(arr)
83 | for i in range(1, n):
84 | j = i - 1
85 | key = arr[i]
86 | while arr[j] > key and j >= 0:
87 | arr[j+1] = arr[j]
88 | j -= 1
89 | arr[j+1] = key
90 | ```
91 |
92 | - 시간복잡도
93 | - 최선 시간복잡도 : O(n)
94 | - 최악 시간복잡도 : O(n^2)
95 | - 공간복잡도 : O(n), 예비 O(1)
96 | - 안정 정렬
97 |
98 |
99 |
100 | ## 힙 정렬
101 |
102 |
103 |
104 | ### 설명
105 |
106 | 힙을 사용한 정렬
107 |
108 |
109 |
110 | ### 힙
111 |
112 | - 최솟값이나 최댓값을 빠르게 찾아내기 위한 이진 트리
113 |
114 | - 힙순서 : 모든 부모노드는 자식노드보다 우선순위가 높다.
115 | - 최대힙 : 모든 부모노드가 자식노드보다 값이 크다.
116 |
117 | 
118 |
119 | - 최소힙 : 모든 부모노드가 자식노드보다 값이 작다.
120 |
121 | 
122 |
123 | - 완전이진트리 : 마지막 레벨을 제외한 모든 레벨이 채워져있으며, 마지막 레벨의 모든 노드는 가능한 한 가장 왼쪽에 있다.
124 |
125 | - 높이 : O(log n)
126 |
127 |
128 |
129 | ### 최대힙을 사용한 정렬(상향식)
130 |
131 | - 상향식이란?
132 | - 낮은 레벨의 부트리 2개를 하나로 합치면서 루트노드까지 반복한다.
133 | - 하나로 합치면서 위해 downHeap을 통해 힙의 균형을 맞춘다.
134 | - 말단노드부터 루트노드 위쪽으로 진행되어 상향식이라고 한다.
135 |
136 | 
137 |
138 | - 배열을 최대힙으로 만들기
139 |
140 | 
141 |
142 | - 최대힙에서 하나씩 빼내어 정렬하기
143 |
144 | 
145 |
146 |
147 |
148 |
149 | ### 코드
150 |
151 | ```python
152 | def heapSort(A):
153 | n = len(A)
154 | buildHeap(A, n)
155 | for i in range(n, 1, -1):
156 | A[1], A[i] = A[i], A[1]
157 | downHeap(1, i-1)
158 |
159 | def buildHeap(A, n):
160 | for i in range(n//2, 0, -1):
161 | downHeap(i, n)
162 |
163 | def downHeap(i, last):
164 | left = 2*i
165 | right = 2*i+1
166 |
167 | if left > last:
168 | return
169 |
170 | greater = left
171 |
172 | if right <= last:
173 | if A[right] > A[greater]:
174 | greater = right
175 |
176 | if A[i] >= A[greater]:
177 | return
178 |
179 | A[i], A[greater] = A[greater], A[i]
180 | downHeap(greater, last)
181 | ```
182 |
183 | - 시간복잡도
184 | - 최선 시간복잡도: O(n log n)
185 | - 최악 시간복잡도: O(n log n)
186 | - 공간복잡도: O(n), 예비 O(1)
187 |
188 |
189 |
190 | ## 병합 정렬
191 |
192 |
193 |
194 | ### 설명
195 |
196 | 분할통치(분할정복)법에 기초한 정렬 알고리즘이다.
197 |
198 | 1. 분할(divide) : 정렬되지 않은 리스트를 분리된 부분리스트로 나눈다.
199 | 2. 재귀(recur) : 각 부분리스트를 각각 재귀적으로 정렬한다.
200 | 3. 통치(conquer) : 각 부분리스트를 단일 순서리스트로 합친다.
201 |
202 | 베이스 케이스 : 원소가 1개인 리스트
203 |
204 |
205 |
206 | ### 분할 과정
207 |
208 | 
209 |
210 |
211 |
212 | ### 통치 과정
213 |
214 | 
215 |
216 | 
217 |
218 |
219 |
220 | ### 코드
221 |
222 | ```python
223 | def mergeSort(A, l, r):
224 | if(l <= r):
225 | m = (l+r)//2
226 | mergeSort(A, l, m)
227 | mergeSort(A, m + 1, r)
228 | merge(A, l, m, r)
229 |
230 | def merge(A, l, m, r):
231 | i, j = l, m + 1
232 | B = []
233 | while i <= m and j <= r:
234 | if(A[i] <= A[j]):
235 | B.append(A[i])
236 | i += 1
237 | else:
238 | B.append(A[j])
239 | while i <= m:
240 | B.append(A[i])
241 | while j <= r:
242 | B.append(A[j])
243 | for k in range(l, r+1):
244 | A[k] = B[k]
245 | ```
246 |
247 | - 시간복잡도
248 | - 최선 시간복잡도 : O(n log n)
249 | - 최악 시간복잡도 : O(n log n)
250 |
251 | 
252 |
253 | - 공간복잡도 : O(n), 예비 O(n)
254 |
255 | - 안정 정렬
256 |
257 |
258 |
259 | ## 퀵 정렬
260 |
261 |
262 |
263 | ### 설명
264 |
265 | 분할통치법에 기초한 정렬 알고리즘
266 |
267 | 1. 분할(divide): 기준원소 p(pivot)를 택하여 리스트 L을 다음 세 부분으로 분할
268 | - LT : p보다 작은 원소들
269 | - EQ : p와 같은 원소들
270 | - GT : p보다 큰 원소들
271 | 2. 재귀(recur): LT와 GT를 정렬
272 | 3. 통치(conquer): LT, EQ, GT를 결합
273 |
274 |
275 |
276 | ### 기준 원소 선택
277 |
278 | - 쉬운 방법
279 | - 맨 앞, 맨 뒤, 중간 원소
280 | - 조금 복잡한 방법
281 | - **맨 앞, 중간, 맨 뒤 위치 원소들의 중앙값(가장 많이 사용, 중앙에서 분할될 가능성이 높아 정렬의 성능이 좋아짐)**
282 | - 0/4, 1/4, 2/4, 3/4, 4/4 위치 원소들의 중앙값
283 | - 전체 원소의 중앙값
284 | - 무작위 방법
285 | - 무작위 방식으로 원소 선택 (안정성이 떨어짐)
286 | - 기준 원소 선택의 영향
287 | - 분할 결과
288 | - 수행 성능
289 |
290 |
291 |
292 | ### 퀵 정렬 과정
293 |
294 | - 초기 상태
295 |
296 | 
297 |
298 | - 분할, 재귀
299 |
300 | 
301 |
302 | - 통치
303 |
304 | 
305 |
306 | - 재귀, 분할, 통치
307 |
308 | 
309 |
310 | - 통치
311 |
312 | 
313 |
314 | - 재귀, 통치
315 |
316 | 
317 |
318 |
319 |
320 | ### 코드
321 |
322 | ```python
323 | def quickSort(L):
324 | if len(L) > 1:
325 | k = len(L)//2 # 편의상, 기준 원소 선택 방법
326 | LT, EQ, GT = partition(L, K)
327 | quickSort(LT)
328 | quickSort(GT)
329 | L = LT + EQ + GT
330 |
331 | def partition(L, K):
332 | L = deque(L)
333 | p = L[k]
334 | LT, EQ, GT = [], [], []
335 | while L:
336 | e = L.popleft()
337 | if e < p:
338 | LT.append(e)
339 | elif e == p:
340 | EQ.append(e)
341 | else:
342 | GT.append(e)
343 | return LT, EQ, GT
344 | ```
345 |
346 |
347 |
348 | ### 코드(제자리 정렬)
349 |
350 | ```python
351 | def quickSort(L, l, r):
352 | if l < r:
353 | k = l+(r-l)//2 # 편의상, l 과 r 사이의 수
354 | p = partition(L, l, r, k)
355 | quickSort(L, l, p-1)
356 | quickSort(L, p+1, r)
357 |
358 | def partition(A, l, r, k):
359 | p = A[k]
360 | A[k], A[r] = A[r], A[k]
361 | i, j = l, r-1
362 | while i <= j:
363 | while i <= j and A[i] <= p:
364 | i += 1
365 | while j >= i and A[j] >= p:
366 | j -= 1
367 | if i < j:
368 | A[i], A[j] = A[j], A[i]
369 | A[i], A[r] = A[r], A[i]
370 | return i
371 | ```
372 |
373 | - 시간복잡도
374 | - 최선 시간복잡도, 평균 시간복잡도 : O(n log n)
375 | - 최악 시간복잡도 : O(n^2)
376 |
377 | 
378 |
379 | - n + (n-1) + (n-2) + ... + 2 + 1
380 |
381 | - 공간복잡도 : 일반 O(n), 제자리 O(n)
382 |
383 | - 불안정 정렬
384 |
385 |
386 |
387 | 
388 |
389 |
390 |
391 | ---
392 |
393 | - 참고 자료
394 |
395 | [https://ko.wikipedia.org/wiki/정렬_알고리즘](https://ko.wikipedia.org/wiki/%EC%A0%95%EB%A0%AC_%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98)
396 |
397 | [https://hsp1116.tistory.com/33](https://hsp1116.tistory.com/33)
398 |
399 | 학교 자료
--------------------------------------------------------------------------------
/DataStructure/해시테이블.md:
--------------------------------------------------------------------------------
1 | ## 해시 테이블
2 |
3 | 효율적으로 데이터를 빠르게 저장하고 엑세스하는 자료구조입니다.
4 | 해시함수를 통해 키를 해시값으로 매핑하며 해당 해시값을 index, 주소 삼아 데이터의 값을 저장하는 자료구조입니다. 여기서 데이터가 저장되는 곳을 버킷이라고 부릅니다.
5 |
6 |
7 |
8 | ### 충돌
9 |
10 | 해시 함수가 서로 다른 키를 같은 해시 값로 반환하는 경우 충돌이라고 부릅니다.
11 |
12 | 키 k1, k2 의 경우 h(k1) = h(k2) 인 상황입니다. 이러한 충돌은 해시 함수의 알고리즘이 정교하게 작동해도 피할 수가 없습니다.
13 |
14 | 이러한 충돌이 발생하지 않는다면 O(1) 의 시간 복잡도로 삽입, 수정, 삭제 연산이 이루어지지만 충돌이 발생한다면 최악에 O(Key 의 개수) 의 시간이 발생합니다.
15 |
16 | 이러한 충돌을 최대한 줄이는 것이 해시 테이블의 핵심입니다.
17 |
18 | ### 충돌 해결
19 |
20 | 해시 테이블의 충돌을 완화하는 방법으로 **해시 테이블 구조 개선**, **해시 함수 개선** 이 존재합니다.
21 |
22 | ### 해시 테이블 구조 개선
23 |
24 | - Separate Chaining
25 |
26 | 충돌 발생시 해시 테이블 동일한 버킷에 연결리스트 형태로 저장하는 방식입니다. 즉, 테이블이 차지한 메모리에서 추가적인 메모리 공간을 활용하는 방식입니다.
27 |
28 | 
29 |
30 |
31 | 데이터의 삽입의 경우 연결 리스트 추가시간인 O(1) 시간복잡도가 걸립니다.
32 |
33 | 수정 및 삭제, 탐색의 경우 최악의 경우 O(key 의 갯수) 의 시간복잡도가 걸립니다.
34 |
35 |
40 |
41 | - Open Addressing
42 |
43 | Chaining 과 달리 테이블의 비어있는 주소를 활용하는 방식입니다. 해당 방식의 테이블에서 비어있는 버킷을 탐사하는 시간이 중요합니다. 탐사의 방식은 대표적으로 3가지가 존재합니다.
44 |
45 | - 선형탐사(Linear probing)
46 |
47 | 해시 값에 대한 버킷이 이미 데치터가 존재하는 경우 바로 다음 버킷을 탐사하는 방식입니다.
48 | 가장 간단한 방식으로 단점도 명확합니다. 특정 해시값 주변 버킷들이 이미 다 채워져있는 primary clustering 의 경우 선형의 시간복잡도가 필요합니다.
49 |
50 | - 제곱탐사(Quadratic probing)
51 |
52 | 충돌이 발생시마다 충돌 횟수의 제곱수만큼 버킷을 이동하는 방식입니다.
53 | 예를들어 처음 충돌이 발생하면 1^2 만큼 이동하여 버킷을 확인합니다. 해당 버킷도 또 충돌이 발생한다면 2^2 만큼 이동한 버킷을 확인합니다. 마찬가지로 또 충돌이 발생한다면 3^2 만큼 이동하는 방식을 통해 충돌이 발생하지 않는 버킷을 탐사합니다.
54 |
55 | 이 경우도 단점이 존재합니다. 초기 해시값 즉 다양한 key 에 대해서 해시 함수의 결과값이 동일한 경우가 많은 secondary clustering 의 경우 마찬가지로 선형의 시간복잡도가 필요합니다.
56 |
57 | - 이중해싱(double hashing)
58 |
59 | 2개의 해시 함수를 준비하여 하나는 초기 해시값, 다른 하나는 충돌 발생시 이동폭을 얻기위해 사용합니다. 이런 경우 초기 해시값이 동일한 키라고 하더라도 다른 이동폭을 가지므로 앞선 primary clustering, secondary clustering 에서의 취약점이 해소됩니다.
60 |
61 |
62 | load factor 비율로 bucket size
63 |
64 |
65 | ### 해시 함수?
66 |
67 | 임의의 길이의 데이터 Key 를 고정된 길이의 해시(해시 값, 해시 코드, Hash 체크섬)로 매핑하는 해싱과정을 수행하는 함수입니다.
68 |
69 | 여기서 특정 값으로 치우치지 않고 해시값이 고르게 분포되는 것을 좋은 해시함수의 기준입니다.
70 |
71 | ### 해시 함수 종류
72 |
73 | - Division Method
74 |
75 | Key 값 k를 해시 테이블의 크기 n 으로 나눈 나머지를 해시값으로 사용하는 방식입니다.
76 | n 은 소수를 사용하는 것이 좋습니다
77 | 테이블의 크기가 정해진다는 단점이 있습니다.
78 | h(k) = k mod n
79 |
80 | - Multiplication Method
81 |
82 | Key 값 k, 0 과 1사이의 실수 A 임의의 m(보통 2의 제곱수)가 있을 때 다음의 수식을 통해 해시값을 구하는 방식입니다.
83 | 2진수 연산에 최적화된 컴퓨터 구조를 고려한 해시함수라고 합니다.
84 | h(k) = (kA mod 1) x m
85 |
86 | - Mid Square Method
87 |
88 | Key 값 k 를 제곱한 후 특정 자릿수 r 의 값을 해시값으로 사용하는 방식입니다.
89 |
90 |
91 | ## 참고자료
92 |
93 | [위키](https://namu.wiki/w/%ED%95%B4%EC%8B%9C)
94 |
95 | [wikipedia](https://en.wikipedia.org/wiki/Hash_table)
96 |
97 | [Hash 위키](http://wiki.pchero21.com/wiki/Hash#Hash_function)
98 |
99 | [해시 테이블](https://dbehdrhs.tistory.com/70)
100 |
101 | [해시 테이블 충돌](https://baeharam.github.io/posts/data-structure/hash-table/)
102 |
103 | [충돌 개선](https://en.wikipedia.org/wiki/Hash_table#Separate_chaining)
104 |
105 | [Java 8 Hash Table](https://d2.naver.com/helloworld/831311)
--------------------------------------------------------------------------------
/Database/B-Tree와 B+Tree.md:
--------------------------------------------------------------------------------
1 | # B-Tree와 B+Tree
2 |
3 |
4 |
5 | # B-Tree
6 |
7 | 트리 자료구조의 일종으로, 이진 트리를 확장해 하나의 노드가 가질 수 있는 자식 노드의 수가 2이상인 트리 구조이다.
8 |
9 | **최상위 노드**를 `root`노드라고 하며, **최하위 노드**들을 `leaf`노드라고 한다. **그 사이 계층의 노드**들은 `internal`노드라고 부른다.
10 |
11 | 
12 |
13 | 하나의 노드에 여러 개의 데이터가 있을 수 있다.
14 |
15 | 데이터의 순서는 이진 탐색 트리와 유사하다.
16 |
17 | 노드 내 데이터를 최대 M-1개, 최소 [M/2]-1개를 가지는 B-Tree를 **M차 B-Tree**라고 부른다.
18 |
19 | 자식 노드의 최소 및 최대 수는 특별한 구현에 대해서 결정되어 있다.
20 |
21 | 노드의 단위는 **page**로, **하드디스크의 저장 단위**에 맞추어져 있어 데이터베이스와 파일시스템에서 잘 쓰인다.
22 |
23 |
24 |
25 | ## 규칙
26 |
27 | - root 노드는 **2개 이상**의 자식을 가져야 한다.
28 | - M차 B-Tree는 루트 노드를 제외한 나머지 노드는 **최소 M/2개, 최대 M개의 자식 노드**가 있어야 한다.
29 | - **N개의 데이터**가 있는 하나의 노드는 **N+1개의 자식노드**를 갖고 있다.
30 |
31 | ⇒ **N개의 데이터**가 있다면 **자식 노드의 포인터는 N+1개**이다.
32 |
33 | 
34 |
35 |
36 | ## 탐색
37 |
38 | 1. 노드 안에서: 순차검색
39 |
40 | 2. 트리 안에서: 하향식 트리 검색
41 |
42 |
43 |
44 | ## 삽입
45 |
46 | 1. 삽입될 위치 검색
47 | 2. 삽입
48 | 1. 노드의 공간이 남아있을 때
49 |
50 | 노드 안에서 오름차순으로 삽입
51 |
52 | 2. 노드의 공간이 없을 때
53 | 1. 오름차순으로 삽입
54 | 2. 노드안에서 중앙값으로 분할하여 중앙값의 데이터를 부모 노드로 오름차순으로 삽입
55 | 3. i~ii 과정을 `root`노드까지 반복
56 |
57 | ex) 최대 2개의 데이터를 가지는 2차 B-Tree
58 |
59 | 
60 |
61 | 1. 4 삽입
62 |
63 | 
64 |
65 | 2. 노드 중앙값 분할
66 |
67 | 
68 |
69 | 3. root노드 중앙값 분할
70 |
71 | 
72 |
73 |
74 | ## 삭제
75 |
76 | 1. 삭제할 데이터가 위치한 노드 검색
77 |
78 | 1. 삭제할 데이터가 leaf노드에 있는 경우
79 | 1. 현재 노드의 데이터 개수가 최소 개수보다 클 때
80 |
81 | 삭제
82 |
83 | 2. 현재 노드의 데이터 개수가 최소 개수일 때
84 |
85 | 1) 왼쪽 또는 오른쪽 형제노드의 데이터 개수가 최소 개수 이상일때
86 |
87 | a) 현재노드를 현재노드와 형제노드 사이의 부모노드 데이터로 교체
88 |
89 | b) 형제노드가 왼쪽이라면 최대값을, 오른쪽이라면 최소값을 부모노드 데이터와 교체
90 |
91 | 2) 부모노드의 데이터는 최소 개수보다 많고, 형제노드 모두 데이터 개수가 최소 개수일 때
92 |
93 | a) 현재노드 삭제
94 |
95 | b) 부모노드의 데이터 최대값 또는 최소값을 형제노드와 합친다.
96 |
97 | 3) 부모노드, 형제노드 모두 데이터 개수가 최소 개수일 때
98 |
99 | a) 현재노드 삭제
100 |
101 | b) 부모노드를 인접한 형제노드와 병합 후 조상노드의 자식으로 위치시킨다.
102 |
103 | i) B-Tree의 조건이 맞춰줄 때까지 반복
104 |
105 | 2. 삭제할 데이터가 leaf노드에 없는 경우
106 | 1. 현재노드와 자식노드의 데이터 개수가 최소 개수보다 클 때
107 |
108 | 1) 왼쪽 서브트리의 최댓값과 위치를 변경한다.
109 |
110 | 2) 왼쪽 서브트리의 최댓값과 변경된 데이터를 삭제한다.
111 |
112 | 3) a. 과정을 한다.
113 |
114 | 2. 현재노드와 자식노드 모두 데이터 개수가 최소 개수일 경우
115 |
116 | 1. 데이터를 삭제하고 양쪽 자식노드를 합친다.
117 |
118 | 2. 부모의 데이터를 인접한 형제노드에 붙이고, 1)에서 합쳤던 노드를 자식노드로 위치시킨다.
119 |
120 |
121 |
122 |
123 | ## 특징
124 |
125 | 모든 노드에 key와 data가 들어있다.
126 |
127 | 데이터를 정렬된 상태로 보관
128 |
129 | 상향식 구성
130 |
131 | 삽입과 삭제시 균형을 유지하기 위한 작업
132 |
133 | 동일한 높이의 leaf노드 (Balanced)
134 |
135 | O(logN) 검색시간 보장
136 |
137 |
138 |
139 | # B+Tree
140 |
141 | B-Tree에서 확장된 개념의 트리구조이다.
142 |
143 | leaf노드에만 key와 data를 저장하고, 나머지 노드에는 key만 담겨있다. leaf노드끼리는 linked list로 연결되어 있다.
144 |
145 | 
146 |
147 |
148 |
149 | ## 삽입
150 |
151 | - 삽입할 노드의 데이터 개수가 최대값보다 작을 때
152 |
153 | 데이터 삽입
154 |
155 | - 삽입할 노드의 데이터 개수가 최대값일 때
156 |
157 | 2개로 분할하여 중간값을 부모노드에 추가
158 |
159 | - 부모노드의 데이터 개수가 최대값일 때
160 |
161 | B-Tree 삽입 과정과 동일
162 |
163 |
164 |
165 |
166 | ## 삭제
167 |
168 | - 삭제할 키가 노드의 첫번째 데이터가 아닐 때
169 |
170 | 데이터 삭제
171 |
172 | - 삭제할 키가 노드의 첫번째 데이터일 때
173 | - 노드의 데이터 개수가 최소값이 아닐 때
174 |
175 | 삭제 후 삭제된 key가 있던 노드의 key값을 오른쪽 key로 변경한다.
176 |
177 | - 노드의 데이터 개수가 최소값일 때
178 | - 형제노드의 데이터 개수가 최소값이 아닐 때
179 |
180 | 삭제 후 인접한 형제노드의 key와 자리를 바꾼 후 부모노드의 key를 알맞게 수정한다.
181 |
182 | - 형제노드의 데이터 개수가 최소값일 때
183 | - 부모노드의 데이터 개수가 최소값이 아닐 때
184 |
185 | 삭제 후 삭제된 key가 있던 노드의 key 삭제
186 |
187 | - 부모노드의 데이터 개수가 최소값일 때
188 |
189 | 현재노드와 부모노드 삭제 후 조상노드에 형제노드를 연결하고 조상노드에 대해서는 B-Tree와 동일
190 |
191 |
192 |
193 | ## 장점
194 |
195 | 오직 leaf노드에만 데이터를 담기 때문에 저장공간을 더 확보하고 더 많은 key들을 수용할 수 있다. 하나의 노드에 더 많은 key를 담을 수 있기 때문에 트리의 높이가 더 낮아진다.
196 |
197 | leaf노드끼리 서로 연결되어 있기 때문에 범위 검색에 유리하다.
198 |
199 | 풀 스캔 시, B+Tree는 leaf노드로 한 번의 선형탐색만 하면 되기 때문에 B-Tree보다 빠르다.
200 |
201 | →데이터베이스 시스템 인덱스 구성에 매우 효율적이다.
202 |
203 |
204 |
205 | ## 단점
206 |
207 | B-Tree의 경우 최상의 경우 특정 key의 데이터를 찾기 위해 leaf노드까지 가지 않아도 되지만, B+Tree의 경우 반드시 특정 key에 접근하기 위해서 leaf node까지 가야 한다.
208 |
209 |
210 |
211 | ---
212 |
213 | - 참고자료
214 |
215 | [https://ko.wikipedia.org/wiki/B_트리](https://ko.wikipedia.org/wiki/B_%ED%8A%B8%EB%A6%AC)
216 |
217 | [https://velog.io/@emplam27/자료구조-그림으로-알아보는-B-Tree](https://velog.io/@emplam27/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EA%B7%B8%EB%A6%BC%EC%9C%BC%EB%A1%9C-%EC%95%8C%EC%95%84%EB%B3%B4%EB%8A%94-B-Tree)
218 |
219 | [https://velog.io/@emplam27/자료구조-그림으로-알아보는-B-Plus-Tree](https://velog.io/@emplam27/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EA%B7%B8%EB%A6%BC%EC%9C%BC%EB%A1%9C-%EC%95%8C%EC%95%84%EB%B3%B4%EB%8A%94-B-Plus-Tree)
220 |
221 | [https://slenderankle.tistory.com/159](https://slenderankle.tistory.com/159)
222 |
223 | [https://rebro.kr/167](https://rebro.kr/167)
--------------------------------------------------------------------------------
/Database/Join.md:
--------------------------------------------------------------------------------
1 | # JOIN
2 |
3 | > JOIN은 데이터베이스 내의 여러 테이블에서 가져온 레코드를 조합하여 하나의 테이블이나 결과 집합으로 표현해 줍니다. 이러한 JOIN은 보통 SELECT 문과 함께 자주 사용됩니다. → [TCP School JOIN](http://tcpschool.com/mysql/mysql_multipleTable_join)
4 | >
5 |
6 | 
7 |
8 | SQL을 접하면서 DB를 설계하고 사용할 때 JOIN은 가장 자주 사용하게 되는 개념이라고 할 수 있을 정도로 많이 쓰인다. 항상 성능에 대해서 고민하게 되는 친구지만, 나름 RDBS(관계형데이터베이스)의 꽃이라고 생각되는 JOIN에 대해서 정리해 보려고 한다.
9 |
10 | ## 1. 조인과 관계대수
11 |
12 | 관계대수란 릴레이션(테이블)에서 데이터를 추출하는데 사용되는 언어라고 할 수 있다. 관계형 데이터베이스 이론의 코드 박사(codd)는 이렇게 정의했다.
13 |
14 | - 관계 대수: 원하는 정보를 어떻게(How) 찾는지를 명시하는 절차적 언어
15 | - 관계 해석: 어떤(what) 데이터를 찾는지 만 명시하는 선언적 언어
16 |
17 | SQL 언어는 관계해석을 기반으로 하며 관계 대수 개념이 혼합되어 있고, DBMS 내부에서는 관계 대수에 기반을 둔 연산을 수행한다. 관계 대수를 정리해보면 다음 과 같다.
18 |
19 | 
20 |
21 | 여기서 Join은 유도된 연산자로 Cartesian Product 와 Selection을 함께 실행하여 얻은 결과와 동일하다.
22 |
23 | > 다른건 다 감이 오는데 `카티전 프로덕트`..? 이게 뭘까 싶을 수 있다. `카티전 프로덕트`는 집합에서 곱의 개념으로 A= {a, b, c} , B = {1, 2} 일 때 (a,1), (a, 2), (b,1), (b,2), (c, 1), (c,2) 처럼 나타 낼 수 있다. 엄청나게 많은 결과를 생성하기 때문에 많이 사용되지는 않는다.
24 | >
25 |
26 | ## 2. 다양한 조인들...
27 |
28 | 관계 대수에서 언급된 조인들을 하나씩 살펴 보자
29 |
30 | ### Theta Join(세타 조인), Equal Join(동등 조인), Natural Join(자연 조인)
31 |
32 | 
33 |
34 | 그림처럼 비교 조건 (<, =, >)을 만족하는 Join이 Theta Join이고 그중 비교 조건이 (=)일 때 Equal Join이 된다.
35 |
36 | > 간혹 Inner Join이 곧 Equal Join이라고 생각 하는 경우가 있는데, 엄밀히 따지자면 틀린 이야기다. Outer Join에서도 Equal Join처럼 동등 비교 조건문이 들어갈 수 있기도 하고, Inner Join사용시에 Equal Join도 사용 가능한 것으로 생각하면 된다.
37 | >
38 |
39 | Equal Join에서 중복 속성을 제거하게 되면 Natural Join이 됩니다. Natural Join은 다음과 같이 두 테이블에 같은 이름의 열이 있을 때 생략하여 사용 가능하다.
40 |
41 | ```sql
42 | SELECT * FROM A NATURAL JOIN B;
43 | ```
44 |
45 | ### Inner Join
46 | 그림에서 보이는 것처럼 교집합을 나타낸다.
47 |
48 | 
49 |
50 | 출처: [TCPschool](http://tcpschool.com/mysql/mysql_multipleTable_join)
51 |
52 | 아래 처럼 작성할 수 있다.
53 |
54 | ```sql
55 | SELECT * FROM A JOIN B ON A.id = B.id;
56 | ```
57 |
58 | ### Outer Join
59 |
60 | Inner Join의 결과로 나오지 않는 행도 NULL값으로 포함해서 결과를 나타내는 Join이다.
61 |
62 | 어느 쪽을 기준으로 합치냐에 따라서 Left Join , Right Join으로 나뉜다.
63 |
64 | **Left Join**
65 |
66 | 
67 |
68 | 출처: [TCPschool](http://tcpschool.com/mysql/mysql_multipleTable_join)
69 |
70 | 첫 번째 테이블을 기준으로 두 번째 테이블을 조합하는 Join이다. ON절의 조건을 만족하지 않더라도 첫 번째 테이블을 표시하고, 두 번째 테이블의 필드를 NULL로 표시한다.
71 |
72 | ```sql
73 | SELECT * FROM A LEFT JOIN B ON A.id = B.id;
74 | ```
75 |
76 | **Right Join**
77 |
78 | 
79 |
80 | 출처: [TCPschool](http://tcpschool.com/mysql/mysql_multipleTable_join)
81 |
82 | Left Join과는 반대로 두 번째 테이블을 기준으로 첫 번째 테이블을 조합하는 Join이다. ON절의 조건을 만족하지 않더라도 두 번째 테이블을 표시하고, 첫 번째 테이블의 필드를 NULL로 표시한다.
83 |
84 | ```sql
85 | SELECT * FROM A RIGHT JOIN B ON A.id = B.id;
86 | ```
87 |
88 | ### Cross Join
89 |
90 | `Cross Join` 은 관계 대수에서 잠깐 언급했던 `Cartesian Product` 와 같다. 카티전 조인이라고도 한다.
91 |
92 | ```sql
93 | SELECT * FROM A CROSS JOIN B ON A.id = B.id;
94 | ```
95 |
96 | ### Self Join
97 |
98 | 말그대로 자기 자신을 Join하는 방법이다. A 테이블을 각각 Child, Parent로 지정해서 사용한다.
99 |
100 | ```sql
101 | SELECT * FROM A AS parent JOIN A AS child
102 | ```
103 |
104 | ### Semi Join
105 |
106 | 솔직히 처음 들어보는 조인이었다. 조사해보니 세미 조인은 서브 쿼리와 메인 쿼리와의 연결을 위한 유사 조인 이었다...(~~가짜야가짜~~)
107 |
108 | 1:n 관계에서 1의 컬럼만을 사용할 경우 사용할 수 있는데, 집계함수 없이 group by나 distinct를 사용해서 중복제거를 하고 있다면 성능 향상의 효과를 얻을 수 있다.
109 |
110 | In 과 Exists를 통해 사용할 수 있다고 한다.
111 |
112 | ```sql
113 | SELECT * FROM A WHERE A.name IN (SELECT B.name FROM B );
114 | ```
115 |
116 | ```sql
117 | SELECT * FROM A WHERE EXISTS (SELECT 1 FROM B WHERE A.name = B.name)
118 | ```
119 |
120 | 자세한건 아래 블로그와 참고자료에 첨부한 유튜브 영상을 참고하자
121 |
122 | [블로그](https://songii00.github.io/2019/08/10/2019-08-10-%EC%84%B8%EB%AF%B8%EC%A1%B0%EC%9D%B8/)
123 |
124 | ## 3. 조인 동작 방식
125 |
126 | Mysql 에서는 **NESTED LOOP JOIN(NL Join)**을 사용하고 있으며, 이외에 **SORT-MERGE JOIN, HASH JOIN**이 있다. Hash Join의 경우 Mysql 8.0부터 지원하고 있다고 한다.
127 |
128 | ### **NESTED LOOP JOIN(NL Join)**
129 |
130 | 우리가 프로그래밍에서 사용하는 반복문과 유사한 방식으로 조인을 수행하는데, 반복문 외부에서 먼저 읽어지는 테이블을 `Driving Table` 이라고 하고, 반복문 내부에서 나중에 읽어지는 테이블을 `Driven Table`이라고 한다.
131 |
132 | Inner Join의 경우에는 옵티마이저가 순서를 조절해 최적화 하기 때문에 쿼리에서의 테이블 순서가 보장 되지 않고, Outer Join의 경우에는 Outer 테이블을 먼저 읽기 때문에 옵티마이저가 선택할 수 없다.
133 |
134 | 어찌 되었건 옵티마이저의 실행계획을 통해서 `Driving Table` 과 `Driven Table` 이 정해졌다면 다음 프로세스를 따른다.
135 |
136 | 
137 |
138 | 출처: [https://coding-factory.tistory.com/756](https://coding-factory.tistory.com/756)
139 |
140 | 1. `Driving Table` 에서 주어진 WHERE 조건문을 만족하는 행을 찾는다. (인덱스 OR 풀스캔등)
141 | 2. `Driving Table` 의 조인 KEY 값을 가지고 `Driven Table` 에서 조인을 수행 (랜덤 Access)
142 | 3. 반복
143 |
144 | Driving Table의 조건을 만족하는 결과가 많을 수록 반복문의 n의 크기가 커지고, Driven Table에 더 많이 접근해야 하므로 성능은 나빠지게 된다.
145 |
146 | 그러므로 `힌트` 나 `뷰` 를 통해서 선택된 `Driving Table` 의 크기가 작아지도록 해야 한다.
147 |
148 | ### 마무리
149 |
150 | 관계 대수 부터 각 Join과 Join의 동작 방식까지 간단하게 살펴 보았다. Join 때문에 성능 이슈가 많이 생겨서 반정규화를 하거나 아예 NoSQL을 이용하는 경우도 많지만 근-본인 관계형 DB에서 Join에 대해 조금 더 잘 이해하는 계기가 되었다. 조인 동작 방식에 대해서는 추후에 더 자세히 공부해볼 예정이다.
151 |
152 | ## 참고자료
153 |
154 | - 코드박사 와 데이터베이스 만화
155 |
156 | [내 계좌 비밀번호는 어떻게 저장되어 있을까? RDBMS](https://brunch.co.kr/@hvnpoet/133)
157 |
158 | - 관계 대수
159 |
160 | [](https://jehwanyoo.net/2020/09/25/%EA%B4%80%EA%B3%84%EB%8C%80%EC%88%98-Relational-Algebra-%EC%9A%94%EC%95%BD-%EC%A0%95%EB%A6%AC/)
161 |
162 | [[Database] 관계대수](https://m.blog.naver.com/aservmz/221960633361)
163 |
164 | “Mysql로 배우는 데이터베이스 개론과 실습” 책 참고
165 |
166 | - TCP School
167 |
168 | [코딩교육 티씨피스쿨](http://tcpschool.com/mysql/mysql_multipleTable_join)
169 |
170 | - 세미 조인
171 |
172 | [세미조인](https://songii00.github.io/2019/08/10/2019-08-10-%EC%84%B8%EB%AF%B8%EC%A1%B0%EC%9D%B8/)
173 |
174 | [조인보다 빠른 세미 조인, Semi Join, exists, in](https://www.youtube.com/watch?v=YxauObfs4HQ)
175 |
176 | [2.3.5. 세미(Semi) 조인](http://wiki.gurubee.net/pages/viewpage.action?pageId=1966761)
177 |
178 | - 조인
179 |
180 | [[MySQL] 7장 조인 : JOIN (INNER, LEFT, RIGHT)](https://futurists.tistory.com/17)
181 |
182 | [[MYSQL] JOIN(조인)](https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=islove8587&logNo=221049861998)
183 |
184 | - Equal Join == Inner join ???
185 |
186 | [Is inner join the same as equi-join?](https://stackoverflow.com/questions/5471063/is-inner-join-the-same-as-equi-join)
187 |
188 | - join 동작 방식
189 |
190 | [[DB] 데이터베이스 NESTED LOOPS JOIN (중첩 루프 조인)에 대하여](https://coding-factory.tistory.com/756)
191 |
192 | [* JOIN 원리](https://kshmc.tistory.com/entry/JOIN-%EC%9B%90%EB%A6%AC)
193 |
194 | [SQL 최적화 기본원리 (조인 수행 원리)](https://cornswrold.tistory.com/84)
--------------------------------------------------------------------------------
/Database/SQL_VS_NOSQL.md:
--------------------------------------------------------------------------------
1 | # SQL VS NOSQL
2 |
3 | ## ✨ SQL? NOSQL?
4 |
5 | > SQL이란 SQL(Structured Query Language)로 원래의 의미는 RDB의 Query Language이지만, RDB에서만 쓰이므로 RDB를 SQL이라고 말하기도한다. 여기서도 SQL == RDB로 쓰겠다. 그리고, MySQL(SQL), MongoDB(NoSQL)기준으로 설명한다.
6 | >
7 |
8 | ### SQL
9 |
10 |
14 |
15 | > 여기서 일관성이란 RDB는 데이터의 중복 저장을 피하기 위해서 여러 데이터를 여러 테이블에 분산하여 저장하고 관계를 정해줌으로써 지켜준다.
16 | >
17 | - 모델링의 순서가 [ 테이블 → 쿼리 ]로, 테이블의 형태를 먼저 정하고 그에 맞는 쿼리를 작성하게 된다.
18 |
19 | > 이런 점은 데이터의 일관성을 중요시하는 RDB의 컨셉때문이다.
20 | >
21 |
22 | ### NOSQL
23 |
24 |
28 |
29 | > NoSQL은 데이터를 중복 저장하지만, 내가 원하는 정보를 한개의 document에 모두 담을 수 있다. 따라서, 대용량 데이터에 대해서 빠른 처리가 가능하다.(Join이 없으므로)
30 | >
31 | - 모델링의 순서가 [ 쿼리 → 도큐멘트 ]로, 필요한 쿼리에 따라서 도큐멘트를 만들게 된다.
32 |
33 | ## 📝 용어
34 |
35 | ### 공통
36 |
37 | - Schema: Table(Collection)의 구조를 정의한다.
38 |
39 |
43 |
44 | - Join: RDB에서 관계를 가지는 테이블의 데이터도 함께 가져오고 싶을 때 사용하는 쿼리 기법
45 |
46 |
50 |
51 | - Join 동작방식의 차이
52 |
53 | SQL
54 |
55 | - Join시 외래키를 통해서 추가적인 Table에 접근하고, 외래키는 해당 Record를 직접 참조하므로 매우 빠른 속도로 가져올 수 있다.
56 |
57 | NOSQL
58 |
59 | - Lookup시 추가로 찾는 Collection을 Full Scan해서 맞는 Document를 찾게된다.
60 | - 여기서, 적절한 Indexing을 통해서 Lookup의 성능을 높일 수 있다.
61 | - 또한, NOSQL은 스키마가 유연하고 모든 데이터가 들어갈 수 있으므로, Document의 Field에 Document자체가 들어갈 수 있다. 이러한 기법을 Embedding기법이라고 한다.
62 |
63 |
67 |
68 | - 또한, Link기법으로 특정 Document를 직접 참조할 수도 있다.
69 |
70 | ### SQL
71 |
72 | - Table: 데이터를 저장하는 표(Table)
73 | - Row(Record): Table에서 한개의 데이터를 나타낸다.
74 | - Column(Field): Table에서 데이터가 가질 수 있는 각 속성이다.
75 | - Relationship: Table과 Table의 관계이다.
76 |
77 | ### NoSQL
78 |
79 | - Collection: == RDB의 Table
80 | - Document: == RDB의 Row(Record)
81 | - Field: == RDB의 Column(Field)
82 |
83 | ## ⚡️ Transaction
84 |
85 |
89 |
90 | ### ACID
91 |
92 | > Transaction을 보장하기 위해서는 아래 4가지 조건을 만족해야 한다.
93 | >
94 | - Atomicity(원자성): 모든 연산에 대해서 모두 처리/실패 → all-or-nothing
95 | - Consistency(일관성): 데이터는 미리 정의된 규칙(제약조건, 도메인, ...)에 부합
96 | - Isolation(): 트랜잭션동안 다른 트랜잭션 간섭 불가
97 | - Durability(지속성): 트랜잭션 이후 데이터들의 영구 보존
98 |
99 | ### SQL
100 |
101 |
105 |
106 | ### NOSQL
107 |
108 |
112 |
113 | - MongoDB Manual의 내용
114 |
115 | > In version 4.0, MongoDB supports multi-document transactions on replica sets.
116 | In version 4.2, MongoDB introduces distributed transactions, which adds support for multi-document transactions on sharded clusters and incorporates the existing support for multi-document transactions on replica sets.
117 |
118 | To use transactions on MongoDB 4.2 deployments (replica sets and sharded clusters), clients must use MongoDB drivers updated for MongoDB 4.2.
119 | >
120 |
121 | 4.0부터 Multi-Document의 Transaction을 지원하기 시작했으며, 이 때부터 DB로써 사용할 수 있는 역량을 갖췄다고 평가된다. 그 아래는 4.2부터는 샤딩을 통해 확장된 상태에서 지원한다고 써있다.
122 |
123 | - NOSQL도 ACID를 만족한다고?
124 |
125 | 아래 MongoDB의 Manual을 읽어보면 그러한거 같다. 이제 ACID Transactions 된다고 자랑하는 글
126 |
127 | [ACID Transactions Basics](https://www.mongodb.com/basics/acid-transactions)
128 |
129 |
130 | ## 🌝 특성
131 |
132 | ### ACID of SQL
133 |
134 | ### BASE of NOSQL
135 |
136 |
140 |
141 | > ACID와 대조되는 가용성과 성능을 중시하는 특징
142 | >
143 | - Basically Available(가용성): 데이터는 항상 접근이 가능, 데이터는 중복 저장
144 | - Soft-state(독립성): 노드의 상태는 외부의 정보를 통해 결정
145 | - Eventually Consistent(일관성): 일정 시간 경과시 데이터의 일관성을 유지
146 |
147 | ### BASE VS ACID
148 |
149 | | 항목 | BASE | ACID |
150 | | --- | --- | --- |
151 | | 적용대상 | NoSQL | RDBMS |
152 | | 범위 | 시스템 전체 대상 | 개별 트랜잭션 적용 |
153 | | 일관성 | 약한 일관성 | 강한 일관성 |
154 | | 중점사항 | 성능과 가용성 | 무결성, 일관성 |
155 | | 관리주체 | 주로 개발자 | DBMS 트랜잭션 |
156 | | 데이터처리 | 유사 응답 허용 | 처리 순서 보장 |
157 | | 변경성 | 변경 어려움 | 변경 용이 |
158 | | 디자인 | 쿼리 디자인 중요 | 테이블 디자인 중요 |
159 | | CAP이론 | C+P, A+P 만족 | C+A 만족 |
160 | | 적용사례 | Big Table | Oracle RAC |
161 |
162 | ## 👾 CAP 이론
163 |
164 |
168 |
169 | - Consistency(일관성): 모든 노드들은 같은 시간에 동일한 항목에 대하여 같은 내용의 데이터를 제공한다.
170 | - Availability(가용성): 모든 사용자들이 읽기및 쓰기가 가능하며, 몇몇 노드의 장애시 다른 노드에 영향을 끼치지 않는다.
171 | - Partition-tolerance(분할 내성): 메시지 전달이 실패하거나 일부 시스템이 망가져도 시스템은 정상 동작해야 한다.
172 |
173 | > 현재 DB들은 이중에 2가지를 만족하도록 만들어진다.
174 | >
175 |
176 | > SQL(CA), NoSQL(CA, AP)
177 | >
178 |
179 | ## 👐 확장
180 |
181 | > 확장이란 성능 또는 용량 초과로 인한 DB의 확장이다.
182 | >
183 |
184 | ### 수평 확장 of NOSQL
185 |
186 |
190 |
191 | > NOSQL은 비교적 쉬운 수평 확장을 샤딩을 통해서 지원한다. 샤딩이란 같은 Collection내의 Document를 분산하여 저장하는 방식이다.
192 | >
193 | - 샤딩을 통한 비교적 쉬운 수평 확장
194 | - 유연한 스키마 변경을 통한 확장
195 |
196 | ### 수직 확장 of SQL
197 |
198 |
202 |
203 | > SQL은 Schema변경이 거의 불가능하므로 수직 확장만이 가능하다. 수평 확장도 가능하지만, 매우 매우 어렵다고 볼 수 있다.
204 | >
205 |
206 | > NOSQL은 수직 확장이 안되는가? 수평 확장이 인력과 서버 비용 모두 통틀어서 더 좋은 선택이므로 수직 확장할 필요는 없다.
207 | >
208 |
209 | ## 👀 정규화와 비정규화
210 |
211 | ### 정규화(Normalization)
212 |
213 |
217 |
218 | > 정규화를 통해서 이상(Anomaly)현상을 방지할 수 있다. 이상 현상이란 개발자가 원하지 않는 데이터의 삭제 / 삽입 / 갱신되는것을 말한다.
219 | >
220 |
221 | ### 비정규화(Denormalization)
222 |
223 |
227 |
228 | > 정규화는 1 ~ 5단계가 있으며, 숫자가 높아질수록 데이터의 중복이 없다. 현업에서는 보통 3단계 정도까지를 사용한다.
229 | >
230 |
231 | ### SQL & NOSQL
232 |
233 | - SQL: 정규화를 통해서 데이터의 중복을 없애는것을 지향한다.
234 | - NOSQL: 비정규화를 통해서 빠른 성능과 가용성을 지향한다.
235 |
236 | ## 👍 장점과 단점
237 |
238 |
242 |
243 | - SQL
244 | - 장점: 관계를 통해서 데이터의 일관성을 강제하므로 설계만 잘 해놓으면 사용시 편리하다.
245 | - 단점: 일관성, 트랜잭션을 위해서 잘못된 설계시 많은 성능 저하가 일어날 수 있다, 설계/수정이 어렵다.
246 | - NoSQL
247 | - 장점: 대용량 데이터에 좋은 성능을 기대할 수 있다, 설계 / 수정 / 확장이 쉽다
248 |
249 | > 대용량 데이터일 경우,
250 | 1. 데이터가 많아짐으로써 DB를 확장할 때 샤딩을 통해 쉽게 할 수 있다.
251 | 2. 형태가 다른 데이터를 모두 받아서 사용할 수 있다.
252 | >
253 | - 단점: 데이터의 일관성을 개발자가 신경써주어야 한다.
254 |
255 | ## 😭 예상 질문
256 |
257 | - SQL과 NOSQL의 차이는 무엇인가요?
258 | - 가장 큰 차이점은 데이터의 일관성을 중요시할 것이냐, 가용성과 확장성을 중요시할 것이냐 입니다. SQL은 일관성을 잘 지킬 수 있으며, NOSQL은 쉬운 수정과 수평 확장을 할 수 있습니다.
259 | - SQL의 장점과 단점은 무엇인가요?
260 | - SQL의 장점은 설계된 Table과 Schema를 통해서 데이터의 일관성을 보장받을 수 있습니다. 단점은 잘 못 설계된 Table과 Schema는 성능을 저하시킬 수 있고, Schema의 수정이 힘드며 확장시 수직 확장을 해야함이 있습니다.
261 | - NOSQL의 장점과 단점은 무엇인가요?
262 | - NOSQL의 장점은 가용성과 유연성입니다. 유연한 Schema를 통해서 Agile한 DB 설계를 할 수 있으며 확장시에도 상대적으로 쉬운 샤딩을 통한 수평확장입니다. 단점은 중복 저장으로 데이터의 일관성이 보장되지 않을 수 있고, DB 스토리지를 낭비할 수 있으며 업데이트 쿼리시 Document크기에 따라서 성능이 저하될 수 있습니다.
263 | - 언제 SQL을 사용하고, 언제 NOSQL을 사용해야 할까요?
264 | - 데이터의 형태가 정해져 있고, 일관성이 중요하고 DB 스토리지가 넉넉하지 않다면 SQL을, 유연한 수정과 확장성을 고려한다면 NOSQL 사용을 고려해볼 수 있습니다.
265 | - 대용량 데이터 처리가 NoSQL 이 더 유리한가?
266 | - 유연한 데이터 유형
267 | - 서버의 수평확장에 유리한 구조
268 | - SQL과 NOSQL의 사용 경험에 대해서 말해주세요
269 | - 개발시 어떤 sql를 사용할 것인가?
270 | - 관계에 따라
271 | - 보안이 중요하다면 SQL을 사용하는 것이 유리하다.
272 |
273 | > 트랜잭션의 안정성, 유연한 Schema로 SQL Injection에 취약하다.
274 | >
275 | - 둘 다 적절히 사용
276 |
277 | ## 👨💻 참고
278 |
279 | - 그룹 프로젝트 정리 노션
280 |
281 | [SQL VS NoSQL](https://www.notion.so/SQL-VS-NoSQL-13a24463cac04934adbee88b8bd96fd2)
282 |
283 | - 정규화
284 |
285 | [#02. 이상(Anomaly)현상과 정규화(Normalization)](https://movenpick.tistory.com/29)
286 |
287 | [데이터베이스 정규화 1NF, 2NF, 3NF, BCNF](https://3months.tistory.com/193)
288 |
289 | - 비교
290 |
291 | [SQL과 NOSQL의 차이 | 👨🏻💻 Tech Interview](https://gyoogle.dev/blog/computer-science/data-base/SQL%20&%20NOSQL.html)
292 |
293 | [SQL vs NoSQL](https://velog.io/@thms200/SQL-vs-NoSQL)
294 |
295 | - 모델링
296 |
297 | [NoSQL 데이터 모델링](https://more-learn.tistory.com/5)
298 |
299 | [MongoDB 데이터 관계 모델링](https://devhaks.github.io/2019/11/30/mongodb-model-relationships/)
300 |
301 | - 트랜잭션
302 |
303 | [[DB기초] 트랜잭션이란 무엇인가?](https://coding-factory.tistory.com/226)
304 |
305 | [What is NoSQL? NoSQL Databases Explained](https://www.mongodb.com/nosql-explained)
306 |
307 | - BASE
308 |
309 | [NoSQL 데이터베이스 접속 시 보안 고려사항](http://channy.creation.net/project/dev.kthcorp.com/2012/01/26/security-considerations-in-accessing-nosql-databases/index.html)
310 |
311 | - 보안
312 |
313 | [NoSQL BASE 속성 > 도리의 디지털라이프](http://blog.skby.net/nosql-base-%EC%86%8D%EC%84%B1/)
314 |
--------------------------------------------------------------------------------
/Database/데이터베이스 클러스터링 VS 레플리카 6768dd1874c74763a3033dac6002f6ec.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | # Replication
4 |
5 | ### 기본구성
6 |
7 | - 데이터를 실질적으로 저장하는 소스서버 (Master)
8 | - 소스서버(Master)의 데이터를 복제해서 저장하는 레플리카서버(Slave)
9 |
10 | ### Replication시 장점
11 |
12 | - 스케일 아웃 → 레플리카서버를 늘려서 트래픽을 감당 가능하게 동적으로 규모를 늘릴 수 있음
13 | - 데이터 백업시 소스 서버에서 하면 실제 서버에 부담을 줄 수 있기 때문에 레플리카 서버에서 백업을 진행하여 부담을 줄인다.
14 | - 데이터 분석용 서버를 구성해서 특정용도를 위한 서버를 따로 구축할 수 있다.
15 | - 데이터의 지리적 분산: 특정 지역에 레플리카 서버를 구축해 응답속도를 개선 가능
16 |
17 | ### 바이너리 로그
18 |
19 | MySQL에서 모든 변경 사항을 순서대로 저장하고 있음 다음 명령어로 볼 수 있다.
20 |
21 | ```sql
22 | show binary logs
23 | show mater status;
24 | ```
25 |
26 | 소스 서버의 바이너리 로그가 레플리카 서버로 저장되고 그것을 통해 데이터의 동기화가 진행됨
27 |
28 | ### 바이너리 로그 저장방식
29 |
30 | - Statement 방식: SQL문을 바이너리 로그에 그대로 기록함
31 | - 트랜잭션 격리 수준이 REPEATABLE-READ 이상이어야 데이터가 일치함
32 | - 비 확정적으로 실행되는 쿼리(order by limit delete같은 매번 다르게 평가되는)가 있으면 데이터가 달라질 수 도 있음
33 | - Row 방식: 변경된 데이터 자체를 기록하는 Row 방식
34 | - 가장 일관적인 데이터 저장 방식 → 안전함
35 | - 단시간에 로그파일이 커짐
36 | - Mixed: statement와 row방식을 혼합함
37 | - statement로 기록했을때 안전하지 않을것같으면 row방식으로 기록함
38 |
39 | ### 복제과정
40 | 
41 |
42 | 이러한 복제 과정은 3개의 스레드를 통해 복제되는데
43 |
44 | 1. 소스서버의 Binary Log Dump Thread가 바이너리 로그를 레플리카서버에 전송함
45 | 2. 레플리카서버의 Replication I/O Thread 바이너리 로그 이벤트를 레플리카 서버에 Relay Log파일로 저장
46 |
47 | (연결시 사용정보는connection metadata에 있고, slave_master_info에 저장됨)
48 |
49 | 3. 레플리카서버의 Replication SQL Thread는 Replication I/O Thread에 의해 작성된 Relay Log파일을 읽고 실행함
50 |
51 | (릴레이 로그 이벤트를 서버에 적용하는 컴포넌트를 applier라고 하는데 이벤트가 저장된 릴레이로그 파일명,위치와 소스서버에 연결할 때 사용하는 정보가 저장되어있다. slave_relay_log_info테이블에 저장됨)
52 |
53 |
54 | ### 변경 내용식별
55 |
56 | - 바이너리 로그 파일 위치 기반
57 | - 레플리카 서버에서 소스 서버의 바이너리 로그 파일명과 파일내에서 위치로 바이너리 로그 이벤트를 식별해서 복제함
58 | - server-id={n}으로 서버를 식별함 각 서버마다 넘버링을 해줘야함 → 이벤트가 처음 발생한 위치를 식별하기 위해 서버 아이디를 지정해야함
59 | - 글로벌 트랜잭션 ID 기반(GTID)
60 | - MySQL 버전 5.5까지는 바이너리 로그 파일 위치 기반으로만 가능했음 → 식별과정이 소스서버에서만 유효함 , 레플리카서버에 동일한 위치에 저장된다고 보장할 수 없음
61 |
62 | [MySQL GTID 를 사용한 Replication(복제) 설정](https://hoing.io/archives/18445)
63 |
64 |
65 | ### 복제 동기화 방식
66 |
67 | - 비동기 복제
68 | - 제대로 적용됬는지 확인하지 않음 ,데이터가 100% 일치하지 않음
69 | - 반동기 복제
70 | - 소스 서버는 레플리카 서버가 소스 서버로부터 전달 받은 변경 이벤트를 릴레이 로그에 기록 후 응답을 보내면 그때 트렌잭션을 커밋함
71 | - 비동기 방식보다 트랜젝션 처리가 느려짐, 응답이안오면 무제한으로 기다릴수있으니 일정시간지나면 비동기 복제로 젼환
72 |
73 | ### Replication 종류
74 |
75 | **싱글 레플리카 복제**
76 | 
77 |
78 | - 하나의 소스 서버에 하나의 레플리카서버
79 | - 소스 서버에 문제가 생길 경우 예비서버 역할, 데이터 백업 수행을 위한 용도
80 |
81 | **멀티 레플리카 복제**
82 |
83 | 
84 |
85 | - 하나의 소스 서버에 두 개의 레플리카 서버
86 | - 하나는 백업용, 하나는 읽기 요청 분산
87 |
88 | **체인 복제**
89 |
90 | 
91 | - 하나의 소스 서버에 레플리카가 여러개 달리면 바이너리 로그 복사작업이 부담이 될 수 있음
92 | - 소스 서버가 해야할 로그 배포역할을 다른서버로 넘길수있음
93 |
94 | **듀얼 소스 복제**
95 | 
96 |
97 | - 두개의 서버가 소스이자 레플리카
98 | - 각 서버에서 변경한 데이터는 각 서버에 전달되어서 동일한 데이터를 갖게됨
99 | - Active -Active(항상가동) 형태, Activae - Standby(일부는 대기)형태로 가능
100 | - 그냥 레플리케이션 방식과 달리 한서버에서 문제가 생기면 바로 전환가능
101 |
102 | **멀티 소스 복제**
103 | 
104 | - 하나의 레플리카 서버가 여러개의 소스서버를 가짐
105 | - 여러 서버에 존재하는 다른 데이터를 통합하거나 샤딩 되어있는 테이블을 하나의 테이블로 통합할 때 사용함
106 |
107 | # Clustering
108 |
109 | - 레플리케이션은 저장소 + 서버가 개별로 생성되지만 클러스터링은 db스토리지 하나와 다수의 서버로 구성됨
110 |
111 | ## 연결방식
112 |
113 | ## Active-Active 방식
114 |
115 | - 클러스터를 구성하는 컴포넌트들이 동시에 가동되는 방식, 하나의 저장소를 공유함
116 |
117 | ### 장점
118 |
119 | - 시스템이 다운되어 있는 시간이 짧기 때문에 시스템 전체가 정지하는 것을 방지할 수 있음
120 | - 동시에 가동하기 때문에 전체 cpu,메모리등이 증가해 성능 향상도 기대할 수 있음
121 |
122 | ### 단점
123 |
124 | - 저장소에서 병목이 일어날 수 있어서 높은 성능향상을 기대하기 어려울 수도 있다.
125 | - Active-Active 방식을 지원 하는 데이터 DBMS가 한정적이다.
126 | - ( Oracle = RAC(Real Application Cluster, DB2 = pureScale 라는 이름의 Active-Active 클러스터링이 가능하고, 다른 DBMS에서는 Active-Standby 클러스터링만 대응하고 있다.
127 | - MySQL에서는 지원해주지 않는 걸로 보임 → MySQL Cluster를 사용하는 것 같은데 InnoDB가 아니라고 함 , 아래에 작성한 **Galera cluster**를 솔루션으로 사용한다고함
128 | - 서버를 여러대 한꺼번에 운영하므로 비용이 증가함
129 |
130 | ## Active-Standby 방식
131 |
132 | - 클러스터를 구성하는 컴포넌트중 Active만 사용하다가 장애가 생기면 standby가 작동하는 구성
133 | - Cold-Standby:평소에 DB가 작동하지 않다가 Active DB에 장애 작동하는 구성
134 | - Hot-Standby: 평소에 Standby DB가 작동되는 구성이다.
135 | - Hot-standby는 라이선스료를 많이 지급 한다는점에서 단점이 있음
136 | - Standby DB 서버는 일정 간격으로 Active DB에 이상이 없는지를 조사하기 위한 통신을 하고 있다. 이 통신을 '**Heartbeat**'라고 한다. Active DB에 장애가 발생하면 이 신호가 끊기기 때문에Standby 측은 Active가 '죽었다'는 것을 알 수 있다.
137 |
138 | ### **Galera cluster**
139 |
140 | - 동기방식의 clustering을 지원해주는 오픈소스로 보임
141 |
142 | [Galera Cluster for MySQL](https://galeracluster.com/)
143 |
144 | [[MariaDB] Galera Cluster - 소개](https://myinfrabox.tistory.com/214)
145 |
146 |
147 | ### 참고 자료
148 |
149 | - 레플리케이션 참고
150 |
151 | [[MySQL] Replication (3) - Replication을 사용하는 이유](https://blog.seulgi.kim/2015/05/why-use-mysql-replication.html)
152 |
153 | - 데이터베이스의 다중화
154 |
155 | [[Database] DB 서버의 다중화 클러스터링(Multiplexing Clustering)과 리플리케이션(Replication)](https://kgh940525.tistory.com/entry/Database-DB-%EC%84%9C%EB%B2%84%EC%9D%98-%EB%8B%A4%EC%A4%91%ED%99%94Multiplexing-%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0%EB%A7%81-%EB%A6%AC%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98Replication)
156 |
157 | - 레플리케이션 소개 영상: 작동원리, 장단점, 종류 -> 정말좋은 영상!
158 |
159 | [[10분 테코톡] ✌️ 영이의 Replication](https://www.youtube.com/watch?v=95bnLnIxyWI&t=1s)
160 |
161 | - 레플리케이션 설정
162 |
163 | [MySQL Replication(복제) - 단방향 이중화](https://server-talk.tistory.com/240)
164 |
165 | - DB 아키텍쳐 종류 및 설명 (데이터베이스 첫걸음 책)
166 |
167 | [https://hololo-kumo.tistory.com/220](https://hololo-kumo.tistory.com/220)
168 |
169 | [https://milhouse93.tistory.com/38?category=750797](https://milhouse93.tistory.com/38?category=750797)
--------------------------------------------------------------------------------
/Database/데이터베이스인덱스.md:
--------------------------------------------------------------------------------
1 | # 데이터베이스 인덱스
2 |
3 | ### 인덱스?
4 |
5 | DB 테이블에서 필요한 데이터를 빠르게 찾기 위해서 인덱스를 사용할 수 있다. 인덱스를 생성하면, 특정 컬럼의 데이터들을 정렬하여 별도의 메모리 공간에 주소와 함께 저장된다. 쉽게 비유하자면 책에 있는 목차(색인)이라고 할 수 있다. SQL 튜닝에서 중요한 Index에 대해서 알아보자
6 |
7 | 
8 |
9 | ### 인덱스를 사용하는 이유
10 |
11 | 인덱스의 가장 큰 특징은 데이터들이 정렬되어있다는 점이다. 덕분에 다양한 장점이 있는데, 다음과 같다.
12 |
13 | - Where
14 | - 인덱스가 없다면 Where절 사용시 레코드를 처음부터 끝까지 다 읽는 Full Table Scan이 일어나게된다. 하지만 인덱스 테이블은 데이터들이 정렬되어 저장되어 있기 때문에 해당 조건 (Where)에 맞는 데이터들을 빠르게 찾아낼 수 있다.
15 | - Order by
16 | - 인덱스가 없다면 정렬과 동시에 1차적으로 메모리에서 정렬이 이루어지고 메모리보다 큰 작업이 필요하다면 디스크 I/O도 추가적으로 발생됩니다. 하지만 인덱스 이용시 바로 가져오면 된다.
17 | - Min, Max
18 | - MIN값과 MAX값을 레코드의 시작값과 끝 값 한건씩만 가져오면 되기에 FULL TABE SCAN으로 테이블을 다 뒤져서 작업하는 것보다 훨씬 효율적으로 찾을 수 있습니다.
19 |
20 | ### 인덱스의 자료구조
21 |
22 | **Hash Table**
23 |
24 | 대부분의 Index는 B+Tree 자료구조를 이용하고 있다. 하지만 탐색능력만 따지면 O(1)시간의 Hash Table구조를 사용할 수 있을텐데 이유가 무엇일까? **해쉬테이블을** DB 인덱스로 사용할 수 없는 이유는 다음과 같다.
25 |
26 | 가장 큰 문제로 “***우리는 DB에서 등호(=) 뿐 아니라 부등호(<, >)도 사용할 수 있다”*** 모든 값이 정렬되어 있지 않으므로, 해시 테이블에서는 특정 기준보다 크거나 작은 값을 찾을 수 없다.
27 |
28 | > MySQL InnoDB에서는 메모리 버퍼 풀에서 레코드 검색을 위한 [어댑티브 해시 인덱스](https://tech.kakao.com/2016/04/07/innodb-adaptive-hash-index/)로 사용
29 | >
30 |
31 | **Array**
32 |
33 | 배열의 문제는 간단하다. 탐색이 O(1)이라 해도 삽입 삭제시 O(N)시간이 걸리기 때문이다. 또
34 |
35 | **데이터 수정이 일어날때도 퀵 정렬, 병합 정렬 등 배열 자료구조에서 O(N*logN) 시간으로 재정렬을 이루어야 한다는 점도 있다.**
36 |
37 | > 참고로 B-tree의 삽입, 삭제는 트리의 높이(h)에 따른 O(h)의 시간 복잡도를 가지는데, 이는 logN보다 훨씬 작은 값이다.
38 | >
39 |
40 | **결론적으로 DB 인덱스로 B-Tree가 가장 적합한 이유들을 정리하면 아래와 같다.**
41 |
42 | 1. **항상 정렬된 상태로 특정 값보다 크고 작은 부등호 연산에 문제가 없다.**
43 | 2. **참조 포인터가 적어 방대한 데이터 양에도 빠른 메모리 접근이 가능하다.**
44 | 3. **데이터 탐색뿐 아니라, 저장, 수정, 삭제에도 항상 O(logN)의 시간 복잡도를 가진다.**
45 |
46 | ### 인덱스의 종류
47 |
48 | 인덱스에는 **클러스터드 인덱스 (Clustered Index)** 와 **논-클러스터드 인덱스 (Non-Clustered Index)** 2가지 종류가 존재한다.
49 |
50 | 
51 |
52 | ### 클러스터드 인덱스
53 |
54 | - 인덱스 키의 순서에 따라 데이터가 정렬되어 저장되는 방식
55 | - 실제 데이터가 순서대로 저장되어 있어 인덱스를 검색하지 않아도 원하는 데이터를 빠르게 찾을 수 있다.
56 | - 데이터 삽입, 삭제 발생 시 **순서를 유지**하기 위해 **데이터를 재정렬**해야한다.
57 | - 한 개의 릴레이션에 **하나의 인덱스만 생성 가능**
58 |
59 | ### 넌클러스터드 인덱스
60 |
61 | - 인덱스의 키 값만 정렬되어 있을 뿐 실제 데이터는 정렬되지 않는 방식
62 | - 데이터를 검색하기 위해서는 먼저 인덱스를 검색하여 실제 데이터 위치를 확인해야 하므로 **클러스터드 인덱스에 비해 검색 속도가 떨어진다.**
63 | - 한 개의 릴레이션에 여러 인덱스를 만들 수 있다.
64 |
65 | ### 인덱스의 장점
66 |
67 | - 테이블을 조회하는 속도와 그에 따른 성능을 향상시킬 수 있다.
68 | - 전반적인 시스템의 부하를 줄일 수 있다.
69 |
70 | ### 인덱스의 단점
71 |
72 | - 인덱스를 관리하기 위해 DB의 약 10%에 해당하는 저장공간이 필요하다.
73 | - 인덱스를 관리하기 위해 추가 작업이 필요하다.
74 | - 인덱스를 잘못 사용할 경우 오히려 성능이 저하되는 역효과가 발생할 수 있다.
75 |
76 | ### 인덱스의 관리
77 |
78 | DBMS는 index를 항상 최신의 **정렬된 상태로 유지**해야 원하는 값을 빠르게 탐색할 수 있다.
79 |
80 | 그렇기 때문에 인덱스가 적용된 컬럼에 INSERT, UPDATE, DELETE가 수행된다면 각각 다음과 같은 연산을 추가적으로 해줘야하며, 그에 따른 오버헤드가 발생한다.
81 |
82 | - INSERT : 새로운 데이터에 대한 인덱스를 추가함
83 | - DELETE : 삭제하는 데이터의 인덱스를 사용하지 않는다는 작업을 진행
84 | - UPDATE : 기존의 인덱스를 사용하지 않음 처리하고, 갱신된 데이터에 대해 인덱스를 추가함
85 |
86 | 만약 CREATE, DELETE, UPDATE가 빈번한 속성에 인덱스를 걸게 되면 인덱스의 크기가 비대해져서 성능이 오히려 저하되는 역효과가 발생할 수 있다.
87 |
88 | 만약 어떤 테이블에 UPDATE와 DELETE가 빈번하게 발생된다면 실제 데이터는 10만건이지만 인덱스는 100만 건이 넘어가게 되어, SQL문 처리 시 비대해진 인덱스에 의해 **오히려 성능이 떨어지게** 될 것이다.
89 |
90 | ### 인덱스는 언제 써야 하는가?
91 |
92 | 보통 인덱스는 한 테이블당 3~5개가 적당하다. 큰 결정 조건으로는 아래 4가지 기준이 있다.
93 |
94 | - **카디널리티 (Cardinality)**
95 | - **카디널리티가 높으면(↑) 인덱스 설정에 좋은 컬럼이다. (인덱스를 통해 불필요한 데이터의 대부분을 걸러낼 수 있음.)**카디널리티가 높다 = 한 컬럼이 갖고 있는 값의 중복도가 낮음. (= 값들이 대부분 다른 값을 가짐.)카디널리티가 낮다 = 한 컬럼이 갖고 있는 값의 중복도가 높음. (= 값들이 거의 같은 값을 가짐 )
96 | - **선택도 (Selectivity)**
97 |
98 | **선택도가 낮으면(↓) 인덱스 설정에 좋은 컬럼이다. (일반적으로 5~10%가 적당함.)**선택도가 높다 = 한 컬럼이 갖고 있는 값 하나로 여러 row가 찾아진다.선택도가 낮다 = 한 컬럼이 갖고 있는 값 하나로 적은 row가 찾아진다.
99 |
100 | > 선택도 계산법 (= 컬럼의 특정 값의 row 수 / 테이블의 총 row 수 * 100)
101 | ex) 10개의 데이터에서 고유한 학번(grade) 컬럼,
102 | 2명씩 같은 이름(name) 컬럼,
103 | 5명씩 같은 나이(age) 컬럼인 경우
104 | ① 학번(grade) 컬럼 선택도: 1 / 10 = 10%
105 | ② 이름(name) 컬럼 선택도: 2 / 10 = 20%
106 | ③ 나이(age) 컬럼 선택도: 5 / 10 = 50%
107 | >
108 | - **조회 활용도**
109 | - **조회 활용도가 높으면(↑) 인덱스 설정에 좋은 컬럼이다.**해당 컬럼이 실제 작업에서 얼마나 활용되는지에 대한 값.(`WHERE`의 대상 컬럼으로 많이 활용되는지로 판단하면 된다.)
110 | - **수정 빈도**
111 | - **수정 빈도가 낮으면(↓) 인덱스 설정에 좋은 컬럼이다.**인덱스도 테이블이기 때문에, 인덱스로 지정된 컬럼의 값이 바뀌게 되면 인덱스 테이블도 새롭게 갱신되어야 하기 때문.
112 |
113 |
114 |
115 | ## 참고자료
116 |
117 | - hash table index, b-tree index
118 |
119 | [데이터베이스 인덱스는 왜 'B-Tree'를 선택하였는가](https://helloinyong.tistory.com/296)
120 |
121 | - 인덱스란?
122 |
123 | [](https://mangkyu.tistory.com/96)
124 |
125 | - DB 인덱스
126 |
127 | [[DB] 데이터베이스 인덱스(Index) 란 무엇인가?](https://coding-factory.tistory.com/746)
128 |
129 | [[면접 대비] 데이터베이스 - 인덱스](https://velog.io/@syleemk/%EB%A9%B4%EC%A0%91-%EB%8C%80%EB%B9%84-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%9D%B8%EB%8D%B1%EC%8A%A4)
130 |
131 | - 인덱스 종류, 인덱스 사용이유
132 |
133 | [효과적인 DB index 설정하기](https://velog.io/@jwpark06/%ED%9A%A8%EA%B3%BC%EC%A0%81%EC%9D%B8-DB-index-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0)
134 |
135 | [](https://yurimkoo.github.io/db/2020/03/14/db-index.html)
--------------------------------------------------------------------------------
/Database/정규화/BCNF1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BoostUpStudy/Backend_Interview_Study/aa78027fc7f2081ab6f5eef37b0b2af1ccdfe21c/Database/정규화/BCNF1.png
--------------------------------------------------------------------------------
/Database/정규화/BCNF2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BoostUpStudy/Backend_Interview_Study/aa78027fc7f2081ab6f5eef37b0b2af1ccdfe21c/Database/정규화/BCNF2.png
--------------------------------------------------------------------------------
/Database/정규화/이상현상과 결정자1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BoostUpStudy/Backend_Interview_Study/aa78027fc7f2081ab6f5eef37b0b2af1ccdfe21c/Database/정규화/이상현상과 결정자1.png
--------------------------------------------------------------------------------
/Database/정규화/이상현상과 결정자2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BoostUpStudy/Backend_Interview_Study/aa78027fc7f2081ab6f5eef37b0b2af1ccdfe21c/Database/정규화/이상현상과 결정자2.png
--------------------------------------------------------------------------------
/Database/정규화/이상현상과 결정자3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BoostUpStudy/Backend_Interview_Study/aa78027fc7f2081ab6f5eef37b0b2af1ccdfe21c/Database/정규화/이상현상과 결정자3.png
--------------------------------------------------------------------------------
/Database/정규화/정규화.md:
--------------------------------------------------------------------------------
1 | # 📌 정규화(normalization)
2 |
3 | 이상 현상이 발생하는 테이블을 수정하여 정상으로 만드는 과정을 정규화(normalization)라고 한다.
4 | 정규화를 하기 위해서는 우선 테이블을 분석하여 기본키와 함수 종속성을 파악해야 한다.
5 | 그 후 릴레이션을 분해하여 제거한다.
6 | 분해된 릴레이션에 이상현상이 남아 있다면 없어질 때까지 분해 한다.
7 |
8 | > `TIP`
9 | 릴레이션과 테이블은 같은 의미로 쓰인다.
10 | 보통 테이블은 실무와 같은 구조보다 데이터를 강조하는 측면이 있고
11 | 릴레이션은 구조에 관한 이론을 강조하는 텍스트측면이 있다.
12 | >
13 |
14 |
15 |
16 | ## ❓ 이상현상(anomaly)?
17 |
18 | 이상이란 잘못 설계된 테이블로 삽입, 수정, 삭제와 같은 데이터 조작시 일어나는 일이다.
19 | ex) 튜플 삽입시 NULL 삽입, 하나의 튜플 삭제시 연쇄 삭제, 수정시 불일치 문제 발생 등
20 |
21 |
22 |
23 | ## ❓ 함수 종속성(FD, Functional Dependency)?
24 |
25 | > 수강 신청 릴레이션
26 | >
27 | >
28 | > 
29 | >
30 |
31 | 수강 신청 릴레이션은 각 속성 사이에 의존성이 존재한다.
32 | '알고리즘' 강좌는 '계란관 101' 한 곳 뿐이다.
33 | 반면 이름이 '유정란'인 경우에는 '알고리즘', '데이터베이스' 두 강좌가 있다.
34 |
35 | 이처럼 강좌이름을 알면 강의실을 알 수 있는데
36 | 어떤 속성 A를 알면 B의 값이 유일해지는 의존 관계를 `'속성B는 속성A에 종속한다'` or `'속성A는 속성B를 결정한다'`라고 한다.
37 | 그리고 `A → B`와 같이 표기 한다.
38 |
39 | `A → B`와 같이 왼쪽 속성(A)의 모든 값에 의하여 오른쪽 속성(B)의 값이 유일하게 결정될때 `'함수적으로 종속한다'`라고 한다. 그리고 이렇게 종속하는 성질을 `함수 종속성`이라고 한다.
40 |
41 | > **함수 종속성 규칙**
42 | >
43 | 부분집합 규칙: if Y ⊆ X, then X → Y
44 | 증가 규칙: if X → Y, then XZ → YZ
45 | 이행 규칙: if X → Y and Y → Z, then X → Z
46 | >
47 | >
48 | > **위의 세 가지 규칙으로 얻을 수 있는 규칙**
49 | > 결합 규칙: if X → Y and X → Z, then X → YZ
50 | > 분해 규칙: if X → YZ, then X → Y and X → Z
51 | > 유사 이행 규칙: if X → Y and WY → Z, then WX → Z
52 | >
53 | > 이 함수 종속성의 규칙은 릴레이션에 적용된다.
54 | >
55 |
56 |
57 |
58 | ## 🔍 이상현상과 결정자
59 |
60 | 
61 |
62 | 이상현상은 한개의 릴레이션에 두개 이상의 정보가 포함되어 있을때 나타난다.
63 | 학생수강성적 릴레이션의 경우 학생정보와 강좌정보가 한 릴레이션에 포함되어 있기 때문에 이상현상이 나타난다.
64 |
65 | 
66 |
67 | 모든 결정자를 살펴보면 (학생번호, 강좌이름), 학생번호, 강좌이름, 학과 이다.
68 | 이 중 (학생번호, 강좌이름)은 키본키이면서 결정자이고 학생번호, 강좌이름, 학과는 키본키가 아니면서 결정자이다.
69 | 이상현상은 기본키가 아니면서 결정자인 속성이 있을때 발생함으로 릴레이션을 분해해야한다.
70 |
71 | 
72 |
73 | 위의 사진과 분해할 경우 더 이상 이상현상이 발생하지 않는다.
74 |
75 |
76 |
77 | ## 🔍 정규화 과정
78 |
79 | > 이상현상이 발생하는 릴레이션을 분해하여 이상현상을 없애는 과정을 정규화라고 한다.
80 | 릴레이션은 정규형이라는 개념으로 구분하며 정규형이 높을수록 이상현상은 줄어든다.
81 | >
82 |
83 | ### 제 1정규형
84 |
85 | ***정의: 릴레이션 R의 모든 속성 값이 원자값을 가지면 제 1정규형이다.***
86 |
87 | > **예시**
88 | >
89 | >
90 | > 
91 | >
92 |
93 |
94 |
95 | ### 제 2정규형
96 |
97 | 제 2정규형은 릴레이션의 기본키가 복합키일 때, 복합키의 일부분이 다른 속성의 결정자인지 여부를 판단하는 것이다.
98 | ***정의: 릴레이션 R이 제 1정규형이고 기본키가 아닌 속성이 기본키에 완전 함수 종속일때 제 2정규형이라고 한다.***
99 |
100 | > 완전 함수 종속성
101 | >
102 | >
103 | > 제 2정규형을 이해하기 위해서는 완전 함수 종속성을 알아야 한다. 정의는 다음과 같다
104 | > **정의: A와 B가 릴레이션R의 속성이고 A → B 종속성이 성립할때, B가 A의 속성 전체에 함수 종속하고 부분 집합 속성에 함수 종속하지 않을 경우 완전 함수 종속(full functional dependency)이라고 한다.**
105 | >
106 | > ex) (A1, A2) → B인데 A1 → B 이면 불완전 함수 종속이다.
107 | >
108 |
109 | > **예시**
110 | >
111 | >
112 | > 
113 | >
114 | > **이상현상**
115 | >
116 | > - 삭제이상
117 | > 101 학번의 학생이 수강을 취소하게 되면 알고리즘 과목의 강의실에 대한 정보가 사라진다.
118 | > - 삽입이상
119 | > '세계사'라는 과목이 '정란관102'로 새로 개설되어도 신청한 학생이 없어 학번과 성적에 `NULL`값을 넣어야 한다.
120 | >
121 | > **2정규형으로 변환**
122 | >
123 | > 
124 | >
125 |
126 |
127 |
128 | ### 제 3정규형
129 |
130 | 제 3정규형은 속성들이 이행적으로 종속되어 있는지 여부를 판단하는 것이다.
131 | ***정의: 릴레이션R이 제 2정규형이고 기본키가 아닌 속성이 기본키에 비이행적으로 종속할 때 제 3정규형이라고 한다.***
132 | `TIP` 이행적 종속이란 A → B, B → C가 성립할 때 A → C가 성립되는 함수 종속성이다.
133 |
134 | > **예시**
135 | >
136 | >
137 | > 
138 | >
139 | > **이상현상**
140 | >
141 | > - 삭제이상
142 | > 402 학번의 학생이 수강을 취소하게 되면 스포츠경영학 과목의 수강료에 대한 정보가 사라진다.
143 | > - 삽입이상
144 | > 운영체제 과목이 개설되어 15,000원을 삽입 해야 하는데, 아직 신청한 학생이 없어 학번을 `NULL`값으로 삽입해야하는 문제 발생
145 | > - 수정이상
146 | > 데이터베이스 수강료를 15,000원으로 변경할 경우 데이터 불일치가 발생할 가능성이 있다.
147 | >
148 | > **제 3정규형으로 변환**
149 | >
150 | > 
151 | >
152 |
153 |
154 |
155 | ### BCNF
156 |
157 | 릴레이션에 존재하는 함수 종속성에서 모든 결정자가 후보키이면 BCNF(Boyce Codd Normal Form) 정규형이다.
158 | ***정의: 릴레이션 R에서 함수 종속성 X → Y가 성립할 때 모든 결정자 X가 후보키이면 BCNF 정규형이라고 한다.***
159 |
160 | > `TIP` 후보키는 기본키로 사용할 수 있는 속성들을 뜻한다.
161 | 즉 유일성과 최소성을 만족해야 한다.
162 | >
163 |
164 | > **예시**
165 | >
166 | >
167 | > 
168 | >
169 | > **이상현상**
170 | >
171 | > - 삭제이상
172 | > 1601번의 학생이 수강을 취소하면 김교수의 정보가 사라진다.
173 | > - 삽입이상
174 | > 최교스기 특강을 새로 열면 아직 신청한 학생이 없어 학생번호를 NULL 값으로 삽입해야 한다.
175 | > - 수정이상
176 | > 박교수가 특강이름을 데이터베이스 개론으로 변경할 경우 불일치가 발생할 수 있다.
177 | >
178 | > **이상현상의 원인**
179 | >
180 | > 교수는 특강이름을 결정하는 결정자이면서 후보키가 아니다.
181 | > 이와 같이 결정자이면서 후보키가 아닌 속성이 존재하면 이상현상이 발생한다.
182 | >
183 | > **BCNF정규형으로 변환**
184 | >
185 | > 
186 | >
187 |
188 |
189 |
190 | ### 🎉 정리
191 |
192 | 제 4정규형은 다치종속성을 가진 릴레이션에 관한 내용, 제 5정규형은 프로젝트-조인 정규형이라고 부르며 조인종석성을 가진 릴레이션이다. 대부분의 릴레이션은 BCNF까지 정규화하면 실제적인 이상현상은 없어진다. 그래서 이 글에서도 따로 다루지는 않는다.
193 |
194 |
195 |
196 | ## ✨ References
197 | - 박우창, 남송휘, 이현룡, 『mysql로 배우는 데이터베이스 개론과 실습』, 한빛아카데미
--------------------------------------------------------------------------------
/Database/정규화/제1정규형.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BoostUpStudy/Backend_Interview_Study/aa78027fc7f2081ab6f5eef37b0b2af1ccdfe21c/Database/정규화/제1정규형.png
--------------------------------------------------------------------------------
/Database/정규화/제2정규형1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BoostUpStudy/Backend_Interview_Study/aa78027fc7f2081ab6f5eef37b0b2af1ccdfe21c/Database/정규화/제2정규형1.png
--------------------------------------------------------------------------------
/Database/정규화/제2정규형2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BoostUpStudy/Backend_Interview_Study/aa78027fc7f2081ab6f5eef37b0b2af1ccdfe21c/Database/정규화/제2정규형2.png
--------------------------------------------------------------------------------
/Database/정규화/제3정규형1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BoostUpStudy/Backend_Interview_Study/aa78027fc7f2081ab6f5eef37b0b2af1ccdfe21c/Database/정규화/제3정규형1.png
--------------------------------------------------------------------------------
/Database/정규화/제3정규형2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BoostUpStudy/Backend_Interview_Study/aa78027fc7f2081ab6f5eef37b0b2af1ccdfe21c/Database/정규화/제3정규형2.png
--------------------------------------------------------------------------------
/Database/트랜잭션.md:
--------------------------------------------------------------------------------
1 | # 트랜잭션
2 |
3 | DBMS에서 데이터를 다루는 논리적인 작업의 단위로, 작업의 단위는 사람이 정하는 기준에 따라 다르다.
4 |
5 | 데이터베이스는 정확한 데이터를 유지 및 오류 발생 시 빠르게 복구하고, 데이터베이스가 항상 정확하고 일관된 상태를 유지할 수 있도록 하는 것이 트랜잭션이다.
6 |
7 |
8 |
9 | # 성질(ACID)
10 |
11 | - **원자성 (Atomicity)** : 트랜잭션이 데이터베이스에 모두 반영되거나 모두 반영되지 않아야 한다.
12 |
13 | - **일관성 (Consistency)** : 데이터베이스는 항상 일관된 상태를 유지해야한다.
14 | - 트랜잭션 전후에도 항상 데이터베이스의 **무결성 제약조건**와 **일관성 조건**을 만족해야 한다.
15 |
16 | > **무결성 제약조건** : 테이블에 부적절한 자료가 입력되는 것을 방지하기 위해 테이블 생성할 때 각 컬럼에 대해 정의하는 여러가지 규칙
17 | ex) not null, unique, primary key, foreign key, check ...
18 | [참고](https://yongstudy.tistory.com/52)
19 |
20 | **일관성 조건** : 올바른 시스템을 정의하기 위한 비명시적인 설계
21 | ex) 자금 이체 후 두 계좌 잔고의 합은 이전과 같아야한다. 계좌의 잔고는 음수가 아니다.
22 |
23 | >
24 | - 트랜잭션 실행 중간에는 만족하지 않아도 된다.
25 |
26 | - **고립성 (Isolation)** : 트랜잭션이 다른 트랜잭션의 연산에 영향을 끼치면 안 된다.
27 |
28 | - **지속성 (Durability)** : 트랜잭션이 성공적으로 완료됐을 경우, 결과는 영구적으로 반영되어야 한다.
29 |
30 |
31 |
32 | - **원자성**과 **지속성**을 유지하기 위해 **[회복](https://www.notion.so/125c44f658124e3ea214c057d1f2c3d3)** 기능을 지원한다.
33 | - **일관성**과 **고립성**을 유지하기 위해 **[동시성 제어](https://www.notion.so/125c44f658124e3ea214c057d1f2c3d3)**를 한다.
34 | - **일관성**을 유지하기 위해 **무결성 제약조건**을 이용한다.
35 |
36 |
37 |
38 | # 트랜잭션 연산
39 |
40 | 데이터베이스는 트랜잭션 연산을 통해 트랜잭션 후에도 데이터베이스를 일관된 상태로 만든다.
41 |
42 | - Commit
43 | - 트랜잭션의 수행이 완료됐고 데이터베이스가 일관성있는 상태에 있을 때, 트랜잭션의 결과를 데이터베이스에 반영한다.
44 | - Rollback
45 | - 트랜잭션이 비정상적으로 종료되어 트랜잭션의 원자성이 깨진 경우, 트랜잭션을 처음부터 다시 시작하거나, 트랜잭션의 부분적으로만 연산된 결과를 취소시킨다.
46 |
47 |
48 |
49 | # 트랜잭션 상태
50 |
51 | 
52 |
53 | - **활동(Active)**
54 | - 모든 트랜잭션의 첫 상태로, 트랜잭션이 시작되어 실행되고 있는 상태
55 | - **부분 완료(Partially Committed)**
56 | - 트랜잭션의 마지막 연산까지 수행했고 commit 연산을 수행하기 직전의 상태
57 | - 데이터는 여전히 데이터베이스에 저장되지 않는다.
58 | - **완료(Committed)**
59 | - 트랜잭션을 성공적으로 완료한 상태
60 | - 트랜잭션의 모든 작업이 데이터베이스에 반영되어 변경 사항이 데이터베이스에 영구적으로 저장된다.
61 | - **실패(Failed)**
62 | - 트랜잭션 수행 중, 오류가 발생하여 트랜잭션이 중단된 상태
63 | - **철회(Aborted)**
64 | - 트랜잭션이 중단되어 rollback된 상태
65 | - rollback된 이후 데이터베이스 복구 모듈은 다음 두 가지 작업 중 하나를 선택한다.
66 | - 트랜잭션 다시 시작
67 | - 트랜잭션 종료
68 |
69 |
70 |
71 | # 동시성 제어(Concurrency Control)
72 |
73 | 다중 사용자 환경에서 둘 이상의 트랜잭션이 동시에 수행될 때, 일관성을 해치지 않도록 트랜잭션의 데이터 접근을 제어하는 것
74 |
75 |
76 |
77 | # 트랜잭션 스케줄
78 |
79 | 여러 트랜잭션들을 어떤 순서에 따라 실행시킬 건지 관리하는 것
80 |
81 | - **직렬 스케줄(Serial Schedule)** : 트랜잭션 별로 연산들을 순차적으로 실행시키는 것
82 |
83 | - **비직렬 스케줄(Non-Serial Schedule)** : 인터리빙 방식을 이용하여 트랜잭션들을 병행하여 실행시키는 것
84 |
85 | - **직렬 가능 스케줄(Serializable Schedule)** : 직렬 스케줄에 따라 수행한 것과 같이 정확한 결과를 생성하는 비직렬 스케줄
86 |
87 |
88 |
89 | # 트랜잭션 격리 수준(Isolation Level)
90 |
91 | 트랜잭션이 동시에 진행 중인 다른 트랜잭션에 의해 간섭받는 정도
92 |
93 | - 0단계 : read-uncommitted
94 | - 1단계 : read-committed
95 | - 2단계 : repeatable-read
96 | - 3단계 : serializable
97 |
98 | 단계가 높아질 수록 트랜잭션 간 간섭이 적으며 직렬적이고, 낮을 수록 트랜잭션 간 간섭은 많지만 동시성을 보장한다.
99 |
100 | 격리 수준을 적절히 조절함으로써 데이터베이스의 **일관성(consistency)**과 **동시성(concurrency)**을 조정할 수 있다.
101 |
102 | → [lock 알아보기](https://mangkyu.tistory.com/30?category=761304)
103 |
104 |
105 |
106 | ## READ-UNCOMMITTED
107 |
108 | 처리중이거나 커밋되지 않은 트랜잭션의 데이터 변경 내용을 다른 트랜잭션이 읽는 것을 허용한다.
109 |
110 | 
111 |
112 | ### 발생될 수 있는 현상
113 |
114 | - [Dirty Read](#트랜잭션-격리-수준-정리)
115 | - Non-Repeatable Read
116 | - Phantom Read
117 |
118 |
119 |
120 | ## READ-COMMITTED
121 |
122 | 커밋이 완료된 트랜잭션의 변경사항만 다른 트랜잭션에서 조회할 수 있다.
123 |
124 | 
125 |
126 | ### 발생될 수 있는 현상
127 |
128 | - [Non-Repeatable Read](#트랜잭션-격리-수준-정리)
129 | - Phantom Read
130 |
131 |
132 |
133 | ## REPEATABLE-READ
134 |
135 | 커밋이 완료된 트랜잭션의 변경사항만 다른 트랜잭션에서 조회할 수 있다.
136 |
137 | 트랜잭션 범위 내에서 조회한 내용이 항상 동일함을 보장한다.
138 |
139 | 
140 |
141 | ### 발생될 수 있는 현상
142 |
143 | - [Phantom Read](#트랜잭션-격리-수준-정리)
144 |
145 |
146 |
147 | ## SERIALIZABLE
148 |
149 | 한 트랜잭션에서 사용하는 데이터를 다른 트랜잭션에서 접근할 수 없다.
150 |
151 | 가장 안전하지만 성능이 매우 떨어진다.
152 |
153 |
154 |
155 | ### 트랜잭션 격리 수준 정리
156 |
157 | 
158 |
159 | - Dirty Read: 무효화된 데이터 값을 읽는 현상
160 |
161 | 
162 |
163 | - Non-Repeatable Read : 하나의 트랜잭션 안에서 다른 트랜잭션으로 인해 read 연산 시 서로 다른 값을 읽는 데이터 불일치 현상
164 |
165 | 
166 |
167 | - Phantom Read : 한 트랜잭션 내에서 여러 번 조회시 나타나는 현상으로, 해당 쿼리로 읽히는 데이터에 레코드가 새로 생기거나 없어져 있는 현상
168 |
169 | 
170 |
171 |
172 |
173 |
174 | # 트랜잭션 교착상태(Dead Lock)
175 |
176 | 트랜잭션 서로가 작업 수행을 차단하기 때문에 발생하는 현상.
177 |
178 |
179 |
180 | ### 해결 방법
181 |
182 | - 격리 수준을 낮춘다.
183 | - 잠금 타임아웃을 건다. → 일정 시간이 지나면 트랜잭션을 롤백시킨다.
184 |
185 |
186 |
187 | # 회복
188 |
189 | 데이터베이스에 장애가 발생했을 때 데이터베이스를 일관성 있는 상태로 되돌리는 기능
190 |
191 | → check point 알아보기
192 |
193 |
194 |
195 | ## 장애 유형
196 |
197 | - 트랜잭션 장애 : 트랜잭션의 실행 시 논리적인 오류로 발생할 수 있는 에러 상황
198 | - 시스템 장애 : 하드웨어 시스템 자체에서 발생할 수 있는 에러 상황
199 | - 미디어 장애 : 디스크 자체의 손상으로 발생할 수 있는 에러 상황
200 |
201 |
202 |
203 | ## 로그 파일
204 |
205 | 데이터페이스는 데이터의 손실을 방지하기 위해 트랜잭션의 기록을 추적하는 로그 파일을 사용한다.
206 |
207 | 로그 파일은 트랜잭션이 반영한 모든 데이터의 변경사항을 데이터베이스에 기록하기 전에 미리 기록해두는 별도의 데이터베이스이며, 하드디스크에 저장된다.
208 |
209 | 로그 구조 : 트랜잭션 번호, 로그 타입, 데이터 항목 이름, 수정 전 값, 수정 후 값
210 |
211 | 로그 타입 : START, INSERT, UPDATE, DELETE, ABORT, COMMIT 등 트랜잭션의 연산 타입
212 |
213 |
214 |
215 | ## 로그 파일을 이용한 회복
216 |
217 | - REDO : 로그 파일에 트랜잭션의 START 기록과 COMMIT 기록이 모두 있을 때, 변경한 내용을 다시 기록하여 일관성을 보장하는 방법
218 | - UNDO : 로그 파일에 트랜잭션의 START 기록이 있지만 COMMIT 기록이 없을 때, 로그를 역순으로 참조하여 롤백시키는 방법
219 |
220 |
221 |
222 | ## 체크포인트를 이용한 회복
223 |
224 | 로그파일에 트랜잭션을 기록할 때 특정 지점에 체크포인트를 표시하고,
225 |
226 | 장애 발생 시 체크포인트 이전에 처리된 트랜잭션은 회복에서 제외하고 체크포인트 이후에 처리된 내용에 대해서만 회복 작업을 수행한다.
227 |
228 | - checkpoint 이후, 장애 발생 이전에 commit이 완료된 경우 redo 수행
229 | - 장애 발생 시점까지 commit되지 못한 경우 undo 수행
230 |
231 | 
232 |
233 |
234 |
235 | ## 덤프를 이용한 회복
236 |
237 | 일정 주기로 원본 데이터베이스의 내용을 백업용 데이터베이스에 저장하여 원본 데이터베이스에 문제가 발생했을 때 백업용 데이터베이스의 내용을 다시 원본 데이터베이스로 옮기는 방법
238 |
239 |
240 |
241 |
242 |
243 | ---
244 |
245 | ### 참고자료
246 |
247 | [https://mangkyu.tistory.com/30?category=761304](https://mangkyu.tistory.com/30?category=761304)
248 |
249 | [https://mommoo.tistory.com/62](https://mommoo.tistory.com/62)
250 |
251 | [https://velog.io/@wldus9503/데이터베이스-트랜잭션Transaction란](https://velog.io/@wldus9503/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98Transaction%EB%9E%80)
252 |
253 | [https://ehpub.co.kr/tag/트랜잭션의-상태/](https://ehpub.co.kr/tag/%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98%EC%9D%98-%EC%83%81%ED%83%9C/)
254 |
255 | [https://brunch.co.kr/@skeks463/28](https://brunch.co.kr/@skeks463/28)
256 |
257 | [https://www.cubrid.org/manual/ko/9.3.0/sql/transaction.html](https://www.cubrid.org/manual/ko/9.3.0/sql/transaction.html)
--------------------------------------------------------------------------------
/DesignPattern/MVC,MVVM,MVP/MVC, MVVM, MVP.md:
--------------------------------------------------------------------------------
1 | # 📌 디자인 패턴이란?
2 |
3 | - 디자인 패턴은 건축으로치면 공법에 해당하는 것으로 소프트웨어의 개발 방법을 공식화 한 것이다. 소수의 뛰어난 엔지니어가 해결한 문제를 다수의 엔지니어들이 처리 할 수 있도록 한 규칙이면서, 구현자들 간의 커뮤니케이션의 효율성을 높이는 기법이다.
4 | - 명확하게 정답이 있는 형태는 아니며, 프로젝트의 상황에 맞추어 적용 가능
5 |
6 | ## 🔍 사용 목적 및 이유
7 |
8 | 1. 우리 주변에서 자주 반복해서 발생하는 문제와 그 문제를 해결하는 핵심을 기술해 동일한 일을 두번 다시 하지 않고 해결할 수 있도록 한다.
9 | 2. 구체적인 설명 없이 구조화된 패턴에 대한 사전 지식으로 개발자 간에 커뮤니케이션이 수월하다.
10 | 3. 설계 과정의 속도를 높일 수 있다. 이미 검증된 구조이기 때문이다.
11 |
12 | # 📌 MVC**(Model-View-Controller)** 패턴
13 |
14 | - MVC 패턴은 Model + View + Controller를 합친 용어
15 |
16 | ## 🔍 구조
17 |
18 | 
19 |
20 | - Controller : 사용자의 입력을 받고 처리하고 뿌리는거 모두하는 부분 (Model과 View 사이에서 컨트롤)
21 | - Model : 어플리케이션에서 사용되는 데이터와 그 데이터를 처리하는 부분
22 | - View : 사용자에게 보여지는 UI 부분 (클라이언트 측 기술인 html/css/javascript들을 모아둔 컨테이너 / View는 Controller의 존재를 모른다 / View 는 Model 의 변화에 대해 직접적으로 알지 못한다 → 옵저버 패턴과 같은 방식으로 간접적으로 인지)
23 |
24 | ## 🔍 동작
25 |
26 | 1. 사용자의 입력들은 Controller에 들어오게 됩니다.
27 | 2. Controller는 사용자의 입력을 확인하고, Model을 업데이트합니다.
28 | 3. Controller는 Model을 나타내줄 View를 선택합니다.
29 | 4. View는 Model을 이용하여 화면을 나타냅니다.
30 |
31 | ## 🔍 특징
32 |
33 | Controller는 여러개의 View를 선택할 수 있는 1:n 구조입니다.(m:n 다대다 관계일 수도 있다)
34 | Controller는 View를 선택할 뿐 직접 업데이트 하지 않습니다. (View는 Controller를 알지 못합니다.)
35 |
36 | ## 🔍 장점
37 |
38 | MVC 패턴의 장점은 널리 사용되고 있는 패턴이라는 점에 걸맞게 가장 단순합니다.
39 | 단순하다 보니 보편적으로 많이 사용되는 디자인패턴입니다.
40 | 그리고 각 구성요소를 독립시킴으로써 각 팀으로 하여금 맡은 부분의 개발에만 따로 집중 할 수 있게 하여 개발의 효율성을 높일 뿐만 아니라. 개발 완료 후에도 유지보수성과 확장성을 보장한다.
41 |
42 | ## 🔍 단점
43 |
44 | MVC 패턴의 단점은 View와 Model 사이의 의존성이 높다는 것입니다.
45 | View와 Model의 높은 의존성은 어플리케이션이 커질 수록 복잡하지고 유지보수가 어렵게 만들 수 있습니다.
46 | MVC 패턴의 경우에는 규모가 커질수록 Controller가 비대해져 복잡도가 증가한다.
47 |
48 | # 📌 MVP**(Model-View-Presenter)** 패턴
49 |
50 | - MVP 패턴은 Model + View + Presenter를 합친 용어
51 | - MVC 패턴에서 Controller 대신 Presenter가 존재
52 |
53 | ## 🔍 구조
54 |
55 | 
56 |
57 | - Presenter : View에서 요청한 정보로 Model을 가공하여 View에 전달해 주는 부분 (ui 없이 로직이 존재 / Model 을 업데이트하고, 원하는 데이터를 가져온다)
58 | - Model : 어플리케이션에서 사용되는 데이터와 그 데이터를 처리하는 부분
59 | - View : 사용자에게 보여지는 UI 부분 (입력을 받는 부분 / Model의 존재를 모른다)
60 |
61 | ## 🔍 동작
62 |
63 | 1. 사용자의 입력들은 View를 통해 들어오게 됩니다.
64 | 2. View는 데이터를 Presenter에 요청합니다.
65 | 3. Presenter는 Model에게 데이터를 요청합니다.
66 | 4. Model은 Presenter에서 요청받은 데이터를 응답합니다.
67 | 5. Presenter는 View에게 데이터를 응답합니다.
68 | 6. View는 Presenter가 응답한 데이터를 이용하여 화면을 나타냅니다.
69 |
70 | ## 🔍 특징
71 |
72 | Presenter는 View와 Model의 인스턴스를 가지고 있어 둘을 연결하는 접착제 역할을 합니다.
73 | Presenter와 View는 1:1 관계입니다.
74 |
75 | ## 🔍 장점
76 |
77 | MVP 패턴은 MVC 패턴의 단점이었던 View와 Model의 의존성을 해결하였습니다
78 |
79 | ## 🔍 단점
80 |
81 | MVC 패턴의 단점인 View와 Model 사이의 의존성은 해결되었지만, View와 Presenter 사이의 의존성이 커지는 단점이 있습니다.
82 | 어플리케이션이 복잡해 질 수록 View와 Presenter 사이의 의존성이 강해지는 단점이 있습니다.
83 |
84 | # 📌 MVVM 패턴
85 |
86 | - MVVM 패턴은 Model + View + View Model를 합친 용어입니다.
87 | Model과 View은 다른 패턴과 동일합니다.
88 | - MVP 패턴에서 Presenter가 ViewModel가 된 패턴
89 |
90 | ## 🔍 구조
91 |
92 | 
93 |
94 | - Model : 어플리케이션에서 사용되는 데이터와 그 데이터를 처리하는 부분입니다.
95 | - View : 사용자에서 보여지는 UI 부분입니다. (입력을 ViewModel에 알림 / View는 ViewModel을 구독하고 있음)
96 | - ViewModel : View를 표현하기 위해 만든 View를 위한 Model입니다. View를 나타내 주기 위한 Model이자 View를 나타내기 위한 데이터 처리를 하는 부분입니다. (ViewModel은 데이터를 바꾸기만함 / 어떤 화면을 그리라고 안알려줌)
97 |
98 | ## 🔍 동작
99 |
100 | 1. 사용자의 입력들은 View를 통해 들어오게 됩니다.
101 | 2. View에 입력이 들어오면, Command 패턴으로 View Model에 입력을 전달합니다.
102 | 3. View Model은 Model에게 데이터를 요청합니다.
103 | 4. Model은 View Model에게 요청받은 데이터를 응답합니다.
104 | 5. View Model은 응답 받은 데이터를 가공하여 저장합니다.
105 | 6. View는 View Model과 Data Binding하여 화면을 나타냅니다.
106 |
107 | ## 🔍 특징
108 |
109 | MVVM 패턴은 [Command 패턴](https://ko.wikipedia.org/wiki/%EC%BB%A4%EB%A7%A8%EB%93%9C_%ED%8C%A8%ED%84%B4)과 [Data Binding](https://en.wikipedia.org/wiki/Data_binding) 두 가지 패턴을 사용하여 구현되었습니다.
110 | Command 패턴과 Data Binding을 이용하여 View와 View Model 사이의 의존성을 없앴습니다.
111 | View Model과 View는 1:n 관계입니다.
112 |
113 | [[WEB] 양방향 단방향 데이터 바인딩](https://velog.io/@sunaaank/data-binding)
114 |
115 | 데이터 바인딩이란?
116 |
117 | ## 🔍 장점
118 |
119 | MVVM 패턴은 View와 Model 사이의 의존성이 없습니다. 또한 Command 패턴과 Data Binding을 사용하여 View와 View Model 사이의 의존성 또한 없앤 디자인패턴입니다. 각각의 부분은 독립적이기 때문에 모듈화 하여 개발할 수 있습니다.
120 |
121 | ## 🔍 단점
122 |
123 | MVVM 패턴의 단점은 View Model의 설계가 쉽지 않다는 점입니다.
124 |
125 | # 👋 예상 질문
126 |
127 | - MVC 패턴이 뭘까요?
128 |
129 | 데이터를 처리하는 Model, 사용자에게 보여지는 화면 부분의 View, 입력을 받아 View에 전달하여 화면을 갱신하고 동시에 Model에 전달하여 데이터 처리까지하는 Controller를 사용하는 패턴입니다.
130 | 각 구성요소를 나눔으로써 개발의 효율성을 높이면서 유지보수에도 유리한 패턴입니다.
131 |
132 | - MVC, MVP, MVVM 패턴의 차이점이 뭘까요?
133 |
134 | MVC 패턴은 위에서 말한바와 동일하고 여기서 Controller 대신 Presenter를 통해서 Model과 View의 의존성을 없애면 MVP 패턴이 되고
135 | MVVM 패턴은 MVP 패턴에서 View와 Presenter의 강한 의존성을 ViewModel로 대체하여 데이터 바인딩을 통해 결합도를 낮춘 패턴입니다.
136 |
137 | - 그렇다면 MVVM 패턴이 가장 좋은 패턴인가요?
138 |
139 | 정답은 없다고 생각합니다.
140 | 가장 단순한 MVC 패턴이 유리할수도 있고 View가 가장 가벼운 MVP 패턴이 디자인 재사용에 유리하여 좋을수도 디자인과 동작까지 재사용에 유리한 MVVM도 설계 자체가 어려울 수 있어 상황에 맞게 적절히 사용하는것이 좋다고 생각합니다.
141 |
142 |
143 | # ✨ References
144 |
145 | - MVC, MVP, MVVM 패턴 특징
146 |
147 | [[디자인패턴] MVC, MVP, MVVM 비교](https://beomy.tistory.com/43)
148 |
149 | - 디자인 패턴이란
150 |
151 | [[Design Pattern] 디자인 패턴 이해 목적 및 사용 이유](https://developercc.tistory.com/17)
152 |
153 | [MVC 디자인 패턴 - 생활코딩](https://opentutorials.org/course/697/3828)
154 |
155 | - 데이터 바인딩이란
156 |
157 | [[WEB] 양방향 단방향 데이터 바인딩](https://velog.io/@sunaaank/data-binding)
--------------------------------------------------------------------------------
/DesignPattern/MVC,MVVM,MVP/mvc1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BoostUpStudy/Backend_Interview_Study/aa78027fc7f2081ab6f5eef37b0b2af1ccdfe21c/DesignPattern/MVC,MVVM,MVP/mvc1.png
--------------------------------------------------------------------------------
/DesignPattern/MVC,MVVM,MVP/mvp1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BoostUpStudy/Backend_Interview_Study/aa78027fc7f2081ab6f5eef37b0b2af1ccdfe21c/DesignPattern/MVC,MVVM,MVP/mvp1.png
--------------------------------------------------------------------------------
/DesignPattern/MVC,MVVM,MVP/mvvm1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BoostUpStudy/Backend_Interview_Study/aa78027fc7f2081ab6f5eef37b0b2af1ccdfe21c/DesignPattern/MVC,MVVM,MVP/mvvm1.png
--------------------------------------------------------------------------------
/Development/CORS/CORS 0e3c01bc007c4adf83e4842c6db23bf6.md:
--------------------------------------------------------------------------------
1 | # CORS
2 |
3 | ## 👾 CORS(Cross Origin Resource Sharing)
4 |
5 |
9 |
10 | > 😯 다른 출처의 자원을 왜 사용 못하게 하나요?
11 | SOP(Same Origin Policy)때문입니다. 이는 다른 출처에서 불러온 자원과 상호작용(Javascript 에서 사용됨)을 방지하기 위해 나온 정책입니다. 이 정책을 우회하는 표준 방법입니다.
12 | >
13 | > - SOP(Same Origin Policy)
14 | >
15 | >
19 | >
20 | > > 출처(Origin): URL의 Protocol(Scheme) + Host + Port
21 | > >
22 | > 1. 출처 상속
23 | >
24 | > about:blank, javascript:와 같은 URL은 출처를 가지고 있지 않아서, 이런 경우에는 해당 창을 만든 URL을 상속받는다.
25 | >
26 | > 2. 출처 변경
27 | >
28 | > 상위 도메인으로의 출처의 변경도 가능하다. 예를 들어, ‘[http://sotre.company.com/dir/index.html](http://sotre.company.com/dir/index.html)’ 에서
29 | >
30 | > ```
31 | > document.domain = 'company.com';
32 | > ```
33 | >
34 | > 와 같이 domain을 바꿀 수 있습니다. 단. document.domain의 값을 바꾸면 port가 null로 설정 되기 때문에 나(요청 Origin)와 상대(요청될 Origin)의 port를 모두 맞춰줘야 합니다.(