├── .DS_Store ├── README.md ├── algorithm ├── README.md ├── jsy │ ├── README.md │ ├── array.md │ ├── mst.md │ └── stack.md ├── kkw │ └── 문자열비교.md └── yij │ ├── Algorithm.md │ ├── Cryptography.md │ ├── DataStructure.md │ └── Sort.md ├── database ├── README.md ├── jsy │ ├── README.md │ ├── db.md │ ├── hint.md │ ├── index.md │ ├── modeling.md │ ├── normalization.md │ └── transaction.md ├── kkw │ └── README.md ├── lhk │ └── README.md └── yij │ ├── Concurrency Control Mechanisms 7905a96a94f94aa2844ac41618bbc858.md │ ├── README.md │ └── sql-injection.md ├── java ├── README.md ├── jsy │ ├── README.md │ ├── call.md │ ├── exception.md │ ├── java.md │ ├── java.png │ ├── jdbc.md │ ├── jvm.md │ ├── lib.md │ ├── oop.md │ ├── pattern.md │ ├── string.md │ └── structure.md ├── kkw │ ├── CallBy.md │ ├── OOP.md │ ├── Regular_Expression.md │ ├── String.md │ ├── serialization.md │ └── singleton.md ├── lhk │ ├── collectionsFramework.md │ ├── generic.md │ └── java.md └── yij │ ├── DataStructure.md │ ├── Exception.md │ ├── Framework.md │ ├── Immutable.md │ ├── JVM.md │ ├── OOP.md │ ├── POJO.md │ ├── README.md │ ├── Singleton.md │ └── Thread.md ├── network ├── README.md ├── jsy │ ├── README.md │ ├── arp.md │ ├── dataCommunication.md │ ├── etc.md │ ├── http.md │ ├── ip.md │ ├── network.md │ ├── port.md │ ├── portforwarding.md │ ├── protocol.md │ ├── tcp.md │ └── udp.md ├── kkw │ ├── HTTP.md │ ├── IP.md │ ├── JWT.md │ ├── Set-Cookie.md │ └── UDP.md ├── lhk │ ├── IPv4.md │ ├── NAT.md │ ├── Network-Model.md │ ├── Network.md │ └── answer.md └── yij │ ├── README.md │ ├── cookie.md │ ├── http.md │ ├── img │ ├── 3way.jpg │ ├── conn_continue.jpg │ ├── cookie.JPG │ ├── disconnection.jpg │ ├── http10.JPG │ ├── httpdiff.png │ ├── method.JPG │ ├── nat.JPG │ ├── request.png │ ├── sliding_window.png │ ├── tcp_communication.PNG │ ├── tcp_diagram.PNG │ └── tcp_protocol.PNG │ ├── ip.md │ ├── nat.md │ ├── proxy.md │ ├── rest.md │ ├── routertable.md │ ├── tcp.md │ ├── transport.md │ └── udp.md ├── operatingSystem ├── README.md ├── jsy │ ├── README.md │ ├── memory.md │ ├── paging.md │ ├── process_thread.md │ ├── replacement.md │ ├── scheduling.md │ ├── synchronized_deadlock.md │ ├── systemcall.md │ └── virtual_memory.md ├── kkw │ ├── MainMemory.md │ └── Process_Thread.md ├── lhk │ ├── CPUScheduling.md │ ├── README.md │ ├── VirtualMemory.md │ └── answer.md └── yij │ └── README.md ├── spring ├── .DS_Store ├── README.md ├── jsy │ ├── CorsFilter.png │ ├── README.md │ ├── annotation.md │ ├── bean.md │ ├── cors.md │ ├── mvc.md │ ├── n+1.md │ ├── propagation.md │ └── spring.md ├── kkw │ ├── @Cacheable.md │ ├── @Transactional.md │ ├── Date.md │ ├── DesignPattern.md │ ├── GIT-rebase.md │ ├── Hibernate.md │ ├── PersistenceContext.md │ └── REST.md └── yij │ ├── .DS_Store │ ├── Dependency.md │ ├── Kotlin 94bb7f23bc6a4e3f899403dbf8bcfafe │ └── Untitled.png │ ├── Kotlin.md │ ├── Pattern.md │ ├── README.md │ ├── Spring.md │ ├── Transaction.md │ └── aop.md └── web ├── .DS_Store ├── README.md ├── jsy ├── README.md ├── docker.md ├── git.md ├── url.md └── web.md ├── kkw └── README.md └── yij ├── .DS_Store ├── Kubernetes 6f1cb1afc6504263b9e637904d8198f5.md ├── Kubernetes 6f1cb1afc6504263b9e637904d8198f5 ├── Untitled.png └── container_evolution.svg ├── README.md └── mvc.md /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjuyeon/Tech-Interview-Study/f5f4978becafb443db02eee145e58f6a1618dfa2/.DS_Store -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Tech Interview Study 2 | 3 | ### :pushpin: About 4 | - 신입 개발자로서 알아야 할 필수 CS 지식에 대해 공부하고 기록하는 저장소입니다. 5 | - 매주 취합된 기술 면접 질문을 바탕으로 필요한 사전지식을 정리하며 공부합니다. 6 | - 매주 스터디 미팅(목요일)에서 나온 자료들도 업로드합니다. 7 | 8 | ### :page_facing_up: How to contribute 9 | 1. 매주 스터디 할 CS 주제들을 스터디 일주일 전 issue로 등록한다. 10 | 2. 'CS과목명' 안의 README.md 에 매주 일요일까지 자신이 취합한 질문을 등록한다. 11 | 3. 월요일부터 미팅날까지 취합된 질문에 대한 CS 지식을 공부한다. 12 | 4. 공부 내용은 'CS과목명/자신의 이니셜로 만들어진 폴더' README.md 에 정리한다. (추가로 자료를 업로드할 수 있다.) 13 | 5. 모든 commit은 항상 관련된 issue와 연결한다. 14 |
- Sample commit: [#1](/../../issues/1) 15 | 16 | ### :page_facing_up: Reference 17 | - https://gyoogle.dev/blog/ 18 | - markdown: https://gist.github.com/ihoneymon/652be052a0727ad59601 19 | 20 | ### :books: Document Structure 21 | ``` 22 | ├─CS과목명 23 | │ ├─jsy 24 | │ ├─kkw 25 | │ ├─lhk 26 | │ ├─yij 27 | │ ├─README.md(기술 면접 질문 정리) 28 | ``` 29 |
30 |
31 | 32 | ## :one: Database 33 | - [Question](./database/README.md) 34 | 35 | ## :two: Network 36 | - [Question](./network/README.md) 37 | 38 | ## :three: Operating System 39 | - [Question](./operatingSystem/README.md) 40 | 41 | ## :four: JAVA 42 | - [Question](./java/README.md) 43 | 44 | ## :five: Algorithm (+ Data Structure) 45 | - [Question](./algorithm/README.md) 46 | 47 | ## :six: Spring 48 | - [Question](./spring/README.md) -------------------------------------------------------------------------------- /algorithm/README.md: -------------------------------------------------------------------------------- 1 | # 5) Algorithm (+ Data Structure) 2 | - contributor : [김경원](https://github.com/shining8543) , [윤이진](https://github.com/483759) , [진수연](https://github.com/jjuyeon) 3 |
4 | 5 | ### :notebook_with_decorative_cover: Sort 6 | - Insertion Sort 7 | - Selection Sort 8 | - Bubble Sort 9 | - Merge Sort 10 | - Quick Sort 11 |
에 대해 설명하고 각각의 장단점을 말해주세요. 12 | 13 | ### :notebook_with_decorative_cover: Tree 14 | 1. AVL Tree의 삽입, 삭제 연산을 그림으로 그려 설명해주세요. 15 | 2. Binary Tree, Binary Search Tree의 차이점을 설명해주세요. 16 | 3. 최소비용 신장트리(MST)가 무엇인지 설명하고, 대표 알고리즘 2개(크루스칼, 프림)를 비교해주세요. 17 | 18 | ### :notebook_with_decorative_cover: String Matching 19 | 1. 문자열 비교 알고리즘들에 대해서 설명해주세요 20 | 2. 보이드무어 알고리즘에 대해 설명해주세요 21 | 22 | ### :notebook_with_decorative_cover: Data Structure 23 | 1. 'Stack, Queue, Tree, Heap'의 특징을 설명해주세요. 24 | 2. Array와 LinkedList의 차이가 무엇인가요? 25 | 26 | ### :notebook_with_decorative_cover: Algorithm 27 | 1. 암호화 알고리즘의 종류에 대해 설명해주세요 28 | -------------------------------------------------------------------------------- /algorithm/jsy/README.md: -------------------------------------------------------------------------------- 1 | # Suyeon Jin 2 | 3 | |Study|바로가기| 4 | |---|---| 5 | |Array, ArrayList, LinkedList|[:white_check_mark:](./array.md)| 6 | |Stack, Queue, Tree, Heap|[:white_check_mark:](./stack.md)| 7 | |MST|[:white_check_mark:](./mst.md)| 8 | -------------------------------------------------------------------------------- /algorithm/jsy/array.md: -------------------------------------------------------------------------------- 1 | # :question: Array, ArrayList, LinkedList 2 | 3 | #### reference 4 | https://girawhale.tistory.com/8 5 |
6 | 7 | ## Question 8 | 1. Array와 LinkedList의 차이가 무엇인가요? 9 | - 탐색방식과 저장방식에 차이가 있습니다. 10 | - Array는 데이터를 인덱스를 통해 특정 요소에 직접 접근하는 방식을 사용합니다. 반면 LinkedList는 어떤 데이터를 접근할 때 순차적으로 검색하는 방식을 사용합니다. 11 | - 저장방식도 Array에서 요소들은 인접한 메모리 위치에 연속적으로 저장됩니다. 반면 LinkedList에서 요소들은 비연속적으로 저장되며, 새로운 노드에 할당된 메모리 위치 주소는 이전 노드에 저장됩니다. 12 |
13 | 14 | ## :nerd_face: What I study 15 | ### 1. Array 16 | ![array](https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblRy0C%2FbtqP4msw6DQ%2FDvajT3DX0P2N9n0s9mUAok%2Fimg.png) 17 | - 메모리 공간을 연속적으로 사용하는 자료구조 18 | - 초기화시 설정한 배열의 크기를 이후에 변경할 수 없다. 19 | - 메모리에 연속적으로 값을 저장한다. 20 | - 검색 시, 인덱스를 통한 검색을 하므로 성능이 좋다. (**O(1)**) 21 | - 삽입/삭제 시, 다른 인덱스들의 위치를 shift 해야하므로 성능이 좋지 않다. (**O(N)**) 22 | - 선언 시, 컴파일 타임에 할당 된다. (정적 메모리 할당) 23 | - Stack 영역에 메모리 할당이 이루어진다. 24 | 25 |

26 | 27 | ### 2. LinkedList 28 | ![linkedList](https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEtrjD%2FbtqPYSsnKD1%2FKT2vr8zKtpgX5LqQDDa1T0%2Fimg.png) 29 | - 일렬로 연결된 데이터를 저장할 때 사용하는 자료구조 30 | - 이중 연결 리스트의 형태를 가지고 있다. 31 | - 초기화시 설정된 리스트의 크기를 이후에 변경할 수 있다. 32 | - 포인터를 통해 다음 데이터의 위치를 가리키고 있다. 33 | - 불연속적인 메모리 공간에 데이터를 저장하기 때문에, 검색 성능이 좋지 않다. 34 | - 검색 시, 시작이나 끝에서부터 원하는 인덱스에 도달할 때까지 **순차적으로** 저장된 다음 주소를 탐색하므로 성능이 좋지 않다. (**O(N)**) 35 | - 삽입/삭제 시, 36 | - 시작이나 끝 요소에 접근할 때, **O(1)** 37 | - LinkedList는 head(시작)와 tail(끝)을 갖는 이중 연결 리스트의 구조이다. 38 | - 그 외 요소에 접근할 때, **O(N)** 39 | - 원하는 인덱스에 도달할 때까지 순차적인 접근을 한다. - O(N) 40 | - `index-1`의 노드의 next와 `index+1`의 prev를 삽입/삭제할 노드 정보로 변경하는 시간은 상수시간이다. - O(1) 41 | - 새로운 요소가 추가될 때, 런타임에 메모리를 할당한다. (동적 메모리 할당) 42 | - Heap 영역에 메모리 할당이 이루어진다. 43 | 44 |

45 | 46 | ### 3. ArrayList 47 | - Array를 사용해 만든 List형 자료구조 48 | - 내부적으로 데이터를 배열의 형태로 관리한다. 49 | - 초기화시 설정된 배열의 크기를 이후에 변경할 수 있다. 50 | - 검색 시, 인덱스 기반 탐색을 하므로 성능이 좋다. (**O(1)**) 51 | - 삽입/삭제 시, 임시 배열을 생성해 데이터를 복사하는 방법을 사용한다. 이는 새로운 메모리를 할당하는 방법으로, 성능이 좋지 않다. (**O(N)**) 52 | - 삽입: 기존에 있던 배열에서, 추가하고 싶은 index부터 마지막 index까지 한 칸씩 뒤로 미루는 연산을 한다. 53 | - 삭제: 삭제된 index + 1부터 마지막 index까지 한 칸씩 앞으로 당기는 연산을 한다. 54 | 55 |

56 | 57 | ### 4. 정리 58 | ||Array|ArrayList|LinkedList 59 | |:---:|:---:|:---:|:---:| 60 | |get/set|O(1)|O(1)|O(N)| 61 | |add(시작)|O(N)|O(N)|O(1)| 62 | |add(끝)|O(N)|O(1)|O(1)| 63 | |add(일반)|O(N)|O(N)|O(N)| 64 | |remove(시작)|O(N)|O(N)|O(1)| 65 | |remove(끝)|O(N)|O(1)|O(1)| 66 | |remove(일반)|O(N)|O(N)|O(N)| 67 | 68 |
69 | 70 | - 일반적으로 검색, 수정을 자주 사용한다면, `Array , ArrayList` 71 | - 데이터의 크기가 고정적일 때, `Array` 72 | - 데이터의 크기가 가변적일 때, `ArrayList` 73 | - 잦은 삽입, 삭제가 발생한다면, `LinkedList` 74 | - 공간 복잡도의 경우, 종종 ArrayList가 LinkedList보다 빠른 경우가 발생한다. 75 | - ArrayList는 연속된 메모리 공간 안에 데이터가 저장되기 때문이다. 76 | - LinkedList는 요소마다 두 개의 참조 노드가 필요하고, 메모리 공간에 비연속적으로 노드가 흩어져 있을 수 있다. -------------------------------------------------------------------------------- /algorithm/jsy/mst.md: -------------------------------------------------------------------------------- 1 | # :question: MST(Minimal Spanning Tree) 2 | 3 | #### reference 4 | https://gmlwjd9405.github.io/2018/08/28/algorithm-mst.html
5 | https://onepwnman.github.io/MST/
6 | https://devraphy.tistory.com/83
7 | https://it-earth.tistory.com/98 8 |
9 | 10 | ## Question 11 | 1. 최소비용 신장트리(MST)가 무엇인지 설명하고, 대표 알고리즘 2개(크루스칼, 프림)를 비교해주세요. 12 | - 최소비용 신장트리는 간선들의 가중치를 고려하여 최소 비용을 갖도록 하는 신장트리입니다. 신장트리는 가장 적은 개수의 간선으로 모든 정점을 연결하는 트리를 뜻합니다. 13 | - 크루스칼은 시작 정점을 정하지 않고 최소 비용의 간선을 순서대로 대입하면서 트리를 구성해나가기 때문에, 사이클 여부를 항상 확인해야합니다. 반면, 프림은 시작 정점을 정하고 해당 정점에서 최소 비용(거리)을 갖는 정점을 선택하면서 트리를 확장시키기 때문에 사이클을 이루지 않으므로, 사이클 여부를 확인하는 과정이 필요하지 않습니다. 14 | - 이러한 점에서 크루스칼은 간선 중심의 알고리즘, 프림은 정점 중심의 알고리즘이라는 차이점을 가지고 있다고 할 수 있습니다. 15 |
16 | 17 | ## :nerd_face: What I study 18 | ### 1. Spanning Tree (신장 트리) 19 | ![spanning](https://gmlwjd9405.github.io/images/algorithm-mst/spanning-tree.png) 20 | - 그래프 내의 모든 정점을 포함하는 트리 21 | - 그래프의 최소 연결 부분 그래프 22 | - 가장 적은 개수의 간선으로 모든 정점을 연결할 수 있다. 23 | 24 | #### 1-1. 특징 25 | - **모든 정점들이 연결**되어 있어야 한다. 26 | - **사이클이 포함되서는 안된다.** 27 | - 그래프가 `n`개의 정점을 가지고 있다면, 정확히 `n-1` 개의 간선으로 연결한다. 28 | - n개의 정점을 가지는 그래프의 최소 간선의 수 : `n-1`개 29 | - ex) 통신 네트워크 구축 - 최소의 케이블(링크)을 사용하여 연결하고자 하는 경우 30 | 31 |
32 | 33 | ### 2. MST (Minimal Spanning Tree, 최소 신장 트리) 34 | - Spanning Tree 중 사용된 간선들의 가중치를 고려하여 최소 비용을 갖는 트리 35 | - 가장 적은 개수의 간선과 비용으로, 모든 정점을 연결할 수 있다. 36 | - cf) 절대적이진 않지만, 간선이 적으면 kruskal, 간선이 많으면 prim 이 유리하다. 37 | 38 | #### 2-1. 특징 39 | - **모든 정점들이 연결**되어 있어야 한다. 40 | - **사이클이 포함되서는 안된다.** 41 | - 그래프가 `n`개의 정점을 가지고 있다면, 정확히 `n-1` 개의 간선으로 연결한다. 42 | - ***간선의 가중치의 합이 최소여야 한다.*** 43 | - ex) 통신망, 도로망, 유통망에서 '길이, 구축 비용, 전송 시간'(이게 가중치를 의미함) 등을 최소로 하여 구축하고자 하는 경우 44 | 45 |

46 | 47 | ### 3. Kruskal MST Algorithm 48 | ![kruskal](https://onepwnman.github.io/assets/images/mst/kruskal.gif) 49 | - **Greedy하게** 네트워크의 모든 정점을 최소 비용으로 연결하는 최적 해답을 구하는 알고리즘 50 | - **간선 중심**으로 간선 선택을 기반으로 하는 알고리즘 51 | - 이전 단계에서 만들어진 신장 트리와는 상관없이 **무조건 최소 간선만을 선택**한다. 52 | - kruskal 알고리즘은 최적의 해답을 주는 것으로 검증되어 있으므로, 따로 증명하지 않아도 된다. 53 | - cf) greedy ? 그 순간에는 최적이지만, 전체적인 관점에서 최적이라는 보장이 없기 때문에 반드시 검증해야 한다. 54 | 55 | #### 3-1. 동작 56 | 1. 그래프의 모든 간선들을 리스트로 담아, 가중치의 오름차순으로 정렬한다. 57 | 2. 정렬된 간선 리스트에서, 가중치가 가장 작은 간선을 선택한다. 58 | 3. 사이클을 형성하지 않는다면, 해당 간선을 현재의 MST의 집합에 추가한다. 59 | 4. 위의 과정을 반복한다. 60 | 61 | #### 3-2. 구현 62 | - 가중치를 저장하여, Edge 관리를 해야한다. 63 | - union-find 를 사용하여 구현한다. 64 | - 왜? 현재 선택된 간선이 MST 집합에서 사이클을 이루는 간선인지 확인(**find**) -> 사이클을 형성하지 않는다고 확인되면, MST 집합에 합침(**union**) 65 | 66 | #### 3-3. 시간복잡도 67 | ![kruskal](https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUxeke%2FbtqJs4y1tXA%2F7HDz2N2NjtSEFNhOKh5Rsk%2Fimg.png) 68 | - 간선이 e개일 때, `O(elog(e))` 의 시간복잡도를 갖는다. 69 | - 간선들을 정렬하는 시간에 영향을 많이 받는다. 70 | - 정점의 개수에 비해 간선의 개수가 적은 경우 유리하다. 71 | 72 | 1. 모든 정점(n개)을 독립적인 집합으로 만든다. `O(n)` 73 | - 노드의 개수만큼 parent, rank(depth) 집합을 초기화한다. 74 | - 전체 시간복잡도에 큰 영향을 미치지 않으므로 삭제 75 | 2. 그래프의 모든 간선을 가중치 기준으로 오름차순 정렬한다 `O(elog(e))` 76 | 3. 2개 부분집합 각각의 루트노드를 확인(find)하고, 루트노드가 서로 다른 경우 union한다 `O(1)` 77 | - union-by-rank 기법과 path compression 기법을 사용하면 상수에 가까운 시간복잡도를 갖는다. 78 | 79 |
80 | 81 | ### 4. Prim MST Algorithm 82 | ![prim](https://onepwnman.github.io/assets/images/mst/prim.gif) 83 | - 시작 정점에서부터 출발하여 신장트리 집합(MST)을 단계적으로 확장해나가는 알고리즘 84 | - **정점 중심**으로 정점 선택을 기반으로 하는 알고리즘 85 | - 이전 단계에서 만들어진 **신장 트리를 확장**해나간다. 86 | 87 | #### 4-1. 동작 88 | 1. 시작 단계에서는 **시작 정점만이** MST 집합에 포함된다. 89 | 2. 앞 단계에서 만들어진 **MST 집합에 인접한 정점들** 중에서 **1)방문한 적이 없으며, 2)가장 낮은 가중치를 갖는 정점을 선택**하여, 트리를 확장한다. 90 | 3. 위의 과정을 트리가 `n-1`개의 간선을 가질 때까지 반복한다. 91 | 92 | #### 4-2. 구현 93 | - 가중치를 저장하여, Edge 관리를 해야한다. 94 | - priority queue, queue 를 사용하여 구현한다. 95 | - 왜? priority queue는 MST의 정점과 인접한 간선 중 최소 가중치 간선(**우선순위**)을 먼저 뽑아내기 위해 사용하고, queue는 정점 방문 스케줄링 관리를 위해 사용한다. 96 | 97 | #### 4-3. 시간복잡도 98 | #### 4-3-1) 우선순위 큐를 사용하지 않을 때 99 | - 정점이 n개일 때, `O(n^2)` 의 시간복잡도를 갖는다. 100 | - 최소 비용의 정점을 찾는 시간에 영향을 많이 받는다. 101 | 102 | 1. 모든 정점을 초기화한다. `O(n)` 103 | - 전체 시간복잡도에 큰 영향을 미치지 않으므로 삭제 104 | 2. 최악의 경우 시작 정점 집합과 그렇지 않은 집합의 모든 노드를 탐색하게 된다. `O(n^2)` 105 | - 주 반복문이 정점의 수 n만큼 반복, 내부 반복문이 모든 노드를 또 n만큼 반복하면서 탐색 106 | 107 | #### 4-3-2) 우선순위 큐를 사용할 때 108 | - 정점이 n개일 때, `O(elog(n))` 의 시간복잡도를 갖는다. 109 | - 간선의 개수에 비해 정점의 개수가 적은 경우 유리하다. 110 | 111 | 1. 모든 정점을 초기화한다. `O(n)` 112 | - 전체 시간복잡도에 큰 영향을 미치지 않으므로 삭제 113 | 2. 우선순위 큐의 push/pop 연산 `O(log(n))` 114 | 3. 모든 간선(e개)을 확인하기 위해, 우선순위 큐에 간선을 push/pop하는 연산 최대 e번 수행 `O(e)` 115 | -------------------------------------------------------------------------------- /algorithm/yij/Cryptography.md: -------------------------------------------------------------------------------- 1 | # Cryptography - 암호화 알고리즘 2 | 3 | 암호화 알고리즘은 암호화/복호화에 사용되는 키, 그리고 양방향 가능 유무를 기준으로 분류할 수 있다. 4 | 5 |
6 | 7 | ## Symmetric-Key Algorithm 8 | 9 | 대칭 키 암호는 암호화 알고리즘의 한 종류로, 암호화와 복호화에 같은 암호 키를 사용하는 알고리즘을 의미한다. 10 | 11 | 암호화를 하는 송신자가 평문을 암호화 하고, 해당 암호 키를 공유해서 복호화를 하는 수신자는 암호문을 복원한다. 공유되는 암호 키를 **대칭 키**라고 한다. 12 | 13 | 공개 키 암호화 방식과 비교해서 계산 속도가 빠르다는 장점이 있지만, 같은 키를 공유해야 하기 때문에 언젠가 한 번은 키를 전달해야 하는데, 전송 과정에서 탈취당할 수 있다는 위험성이 있다. 14 | 15 |
16 | 17 | ## Public-Key Algorithm 18 | 19 | ![image](https://user-images.githubusercontent.com/30489264/140643139-8248db2f-da1c-4cb1-9836-390596a47194.png) 20 | 21 | 암호화와 복호화에 이용하는 키가 다른 방식을 말한다. 이 알고리즘은 공개 키 암호 또는 비대칭 암호라고 부른다. 22 | 23 | 두 개의 키를 사용하는데 전체에서 공유하는 암호 키를 **공개 키**, 특정 사용자만이 가지고 있는 암호 키를 **개인 키**라고 한다. 어느 하나의 키로 암호화한 암호문은 다른 쪽의 키로 복호화할 수 있다. 대칭 키 암호보다 복잡한 계산을 사용하기 때문에, 실제에서는 대칭 키 방식과 혼합해서 사용한다. 24 | 25 | 이 때 사용되는 방식은 두 가지가 있다. 26 | 27 | ### 공개 키 암호 28 | 29 | 공개 키를 이용해서 암호화하고, 특정 개인 키를 가진 사용자만이 해당 암호문을 복호화할 수 있다. 대칭 키를 이용했을 때의 단점인 키의 공유가 발생하지 않기 때문에 두 단말 간에 정보를 안전하게 공유할 수 있다. 30 | 31 | > 1. A는 공개 키를 공개한다. 32 | > 2. B는 공개 키로 전달하려는 평문을 암호화 한다. 33 | > 3. B가 A에게 암호문을 전달한다. 34 | > 4. A는 개인 키를 이용해서 암호문을 복호화한다. 35 | 36 | ### 공개 키 서명 37 | 38 | 개인 키를 이용해서 암호화하고, 공개 키를 이용해서 해당 암호문을 복호화할 수 있다. 누구나 해당 암호문을 복호화할 수 있으므로, 개인 키를 가진 사용자로부터의 신뢰할 수 있는 정보인지 검증하는 용도로 쓰인다. 39 | 40 | > 1. A는 공개 키를 공개한다. 41 | > 2. A는 평문을 자신의 개인 키로 암호화 한다. 42 | > 3. 다른 사용자는 해당 암호문을 A의 공개 키를 이용해서 복호화한다. 43 | > 4. 해당 문서가 변조되었다면 원래의 평문을 복원할 수 없으므로, 문서의 발행 출처와 변조 여부를 확인할 수 있다. 44 | 45 |
46 | 47 | ## 대칭 키 + 비대칭 키 48 | 49 | 대칭 키 방식과 공개 키 암호 방식의 장단점이 명확하기 때문에 두 방식을 혼합해서 사용한다. 50 | 51 | 1. 송신자 측에서는 대칭 키로 사용할 암호 키를 공개 키로 암호화한다. 52 | 2. 암호화된 대칭 키를 전송한다. 이 암호문은 수신자 측만 복호화할 수 있기에 탈취당해도 안전하다. 53 | 3. 수신자는 암호문을 복호화 해서 공개 키를 얻는다. 54 | 4. 송신자와 수신자가 공유한 대칭 키를 이용해서 이후에는 해당 대칭 키를 이용한 암호화 방식을 사용해서 통신한다. 55 | 56 |
57 | 58 | ## One-Way Encryption 59 | 60 | ![image](https://user-images.githubusercontent.com/30489264/140644145-735e0093-c662-4b42-8538-f04bc0cec6a2.png) 61 | 62 | 위의 두 암호화 알고리즘은 암호 키를 사용해서 평문을 암호문으로 암호화, 암호문을 평문으로 복호화할 수 있었다. 하지만 **Cryptographic hash function(암호화 해시 함수)를 사용한 단방향 암호화 방식**은 평문을 암호화한 뒤로는 복호화할 수 없는 암호화 방식이다. 이 암호화 방식은 패스워드 저장과 같이, 반드시 원본 데이터를 복원해내지 않아도 되는 경우에 사용한다(ex. 서버의 데이터베이스에 저장하는 패스워드는 복호화 될 필요가 없고, 사용자가 패스워드를 입력할 때 마다 암호화 한 값을 비교하면 된다). -------------------------------------------------------------------------------- /database/README.md: -------------------------------------------------------------------------------- 1 | # 1) Database 2 | - contributor : [김경원](https://github.com/shining8543) , [윤이진](https://github.com/483759) , [이현경](https://github.com/honggoii) , [진수연](https://github.com/jjuyeon) 3 |
4 | 5 | ### :notebook_with_decorative_cover: 무결성 (integrity) 6 | 1. 무결성에 대해 설명해주세요. 7 | 2. 무결성을 유지하려는 이유가 무엇인가요? 8 | 9 |
10 | 11 | ### :notebook_with_decorative_cover: 인덱스 (Index) 12 | 1. DB 인덱스에 대해 설명해주세요. 13 | 2. DB 인덱스를 사용하는 이유는 무엇인가요? 14 | 3. DB 인덱스에 해쉬 보다 B Tree를 쓰는 이유는 무엇인가요? 15 | 16 |
17 | 18 | ### :notebook_with_decorative_cover: 관계형 DB vs 비관계형 DB 19 | 1. 관계형 DB 와 비관계형 DB 의 차이점에 대해 설명해주세요. 20 | 2. RDBMS과 비교하였을 때 NoSQL의 장점을 설명해보세요. 21 | 3. 어떤상황에서 NoSQL을 쓰는 것이 더 적합한가? 22 | 23 |
24 | 25 | ### :notebook_with_decorative_cover: 트랜잭션 (Transaction) 26 | 1. 트랜잭션이란? 27 | 2. 트랜잭션의 성질 ACID 28 | 3. 트랜잭션을 병행으로 처리할 때 발생할 수 있는 문제점과 이를 방지하기 위한 방법 29 | 4. (3-1) Locking 제어 기법을 사용할 때 Locking 단위를 크게/작게 했을 때의 차이점 30 | 5. (3-2) Locking 제어가 일으킬 수 있는 문제점 31 | 6. 트랜잭션에 의해 발생할 수 있는 데드락에 대해 설명 32 | 7. (6-1) 데드락을 방지할 수 있는 방법은? 33 | 8. 트랜잭션 격리 수준의 각 레벨에 대해 간략하게 설명 34 | 9. COMMIT과 ROLLBACK에 대해 설명해주세요. 35 | 36 |
37 | 38 | ### :notebook_with_decorative_cover: 데이터 모델링 39 | 1. 다양한 데이터 모델에 대해서 설명해주세요. 40 | 2. 데이터 모델링의 디자인 스키마에 대해서 설명해주세요. 41 | 3. 위에서 답변한 스키마 중에서 어떤 것이 더 낫습니까? 42 | 43 |
44 | 45 | ### :notebook_with_decorative_cover: 정규화 (Normalization) 46 | 1. 정규화란 무엇인지, 필요한 이유와 함께 답변해주세요. 47 | 2. 각 정규화 단계에 대해 **만족되어야 할 조건**을 중심으로 설명해주세요. 48 | 3. 함수적 종속에 대해 설명해주세요. 49 | 4. 완전함수적 종속/부분함수적 종속/이행함수적 종속에 대해 설명해주세요. 50 | 5. 역정규화를 하는 이유는 무엇인가요? 51 | 52 |
53 | 54 | ### :notebook_with_decorative_cover: 기타 55 | 1. 데이터베이스 장애에 대해 설명해주세요. 56 | 2. 데이터베이스 회복 기법에 대해 설명해주세요. 57 | 3. SQL Injection에 대해 설명해주세요 58 | 4. HINT(힌트)는 무엇인가요? 59 | 60 |
61 | 62 | #### 참고 자료 63 | - DBMS는 어떻게 트랜잭션을 관리할까? - https://d2.naver.com/helloworld/407507 64 | - 성능 향상을 위한 SQL 작성법 - https://d2.naver.com/helloworld/1155 65 | - CUBRID Internals - 키와 인덱스의 관계 - https://d2.naver.com/helloworld/1043622 -------------------------------------------------------------------------------- /database/jsy/README.md: -------------------------------------------------------------------------------- 1 | # Suyeon Jin 2 | 3 | |Study|바로가기| 4 | |---|---| 5 | |인덱스|[:white_check_mark:](../jsy/index.md)| 6 | |관계형vs비관계형|[:white_check_mark:](../jsy/db.md)| 7 | |트랜잭션|[:white_check_mark:](../jsy/transaction.md)| 8 | |데이터 모델링|[:white_check_mark:](../jsy/modeling.md)| 9 | |정규화|[:white_check_mark:](../jsy/normalization.md)| 10 | |HINT|[:white_check_mark:](../jsy/hint.md)| 11 | -------------------------------------------------------------------------------- /database/jsy/db.md: -------------------------------------------------------------------------------- 1 | # :question: 관계형 DB vs 비관계형 DB 2 | 3 | #### reference 4 | https://yubh1017.tistory.com/56
5 | https://siyoon210.tistory.com/130
6 | https://kosaf04pyh.tistory.com/202 7 |
8 | 9 | ## Question 10 | 1. [관계형 DB 와 비관계형 DB 의 차이점에 대해 설명해주세요.](#3-rdbms-vs-nosql) 11 | - 관계형 DB는 데이터를 **1) 정해진 스키마에 따라 2) 관계(relation)를 통해서 연결된 여러개의 테이블에 분산**하여 관리합니다. 12 | - 반면, 비관계형 DB는 **스키마, 관계를 사용하지 않고** 유연하게 데이터를 관리합니다. 13 | 2. [RDBMS과 비교하였을 때 NoSQL의 장점을 설명해보세요.](#2-nosql) 14 | - 가변적인 데이터구조로 데이터를 저장할 수 있어 유연성이 높기 때문에, **언제든지 저장된 데이터를 조정하거나 새로운 필드를 추가할 수 있습니다.** 15 | 3. [어떤상황에서 NoSQL을 쓰는 것이 더 적합한가?](#2-nosql) 16 | - 정확한 데이터 구조를 알 수 없는 경우 (변경/확장될 수 있는 경우) 17 | - 데이터의 양이 엄청나게 많은 경우 18 | - 읽기(read)처리는 자주하지만, 데이터를 자주 변경(update)하지 않는 경우 19 |
20 | 21 | ## :nerd_face: What I study 22 | ### 1. RDBMS(Relational Data Management System) 23 | ![sql](https://t1.daumcdn.net/cfile/tistory/994D09355C937ECD2D) 24 | - 관계형 데이터베이스를 관리하는 프로그램 25 | #### 1) 관계형 데이터베이스의 특징 26 | - 서비스할 데이터(Entity)에 기반하여 모델링한다. 27 | - 데이터의 분류, 정렬, 탐색 속도가 빠르다. 28 | - 데이터의 무결성을 보장한다. 29 | - 무결성을 보장하기 위해, 데이터베이스에 여러 [제약조건](#cf-무결성-제약조건)이 존재한다. 30 | - 스키마는 사전에 계획되고 알려져야 한다. 즉, 개발자가 데이터 모델을 만든 뒤, 고객의 요구사항을 맞춰나가는 형식이다. 31 | - 기존에 작성된 스키마를 수정하기 어렵다. 32 | #### 2) 장점 33 | - 명확하게(엄격하게) 정의된 스키마를 사용한다. = 데이터 무결성을 보장한다. 34 | - 관계는 각 데이터를 중복없이 한번만 저장된다. 35 | #### 3) 단점 36 | - 나중에 수정하기 매우 힘들어질 수도 있다. 37 | - 관계를 통해서 데이터가 관리되기 때문에, JOIN문이 많은 복잡한 쿼리가 발생한다. 38 | - 수직적인 확장만 가능하다. 39 | #### 4) 사용하면 좋은 경우 40 | - 관계를 맺고 있는(JOIN) 데이터가 자주 변경되는 어플리케이션일 경우 41 | - 이후에 구조가 변경될 일이 없는 경우 42 | - 명확한 스키마가 사용자와 데이터에게 중요한 경우 43 |

44 | 45 | ### 2. NoSQL 46 | ![nosql](https://t1.daumcdn.net/cfile/tistory/99C57D3B5C937F5E17) 47 | - RDBMS(SQL)과 반대되는 접근 방식 48 | #### 1) 비관계형 데이터베이스의 특징 49 | - 가장 큰 특징은 ***스키마도 없고, 관계도 없다***는 것이다. 50 | - 개발할 어플리케이션의 데이터 접근 패턴에 부합하도록 모델링한다. 51 | - 다른 구조의 데이터를 같은 **컬렉션(=SQL에서의 테이블)**에 추가할 수 있다. 52 | - 일반적으로 관련 데이터는 관계형 데이터베이스처럼 여러 테이블에 나누어 담지 않고, 동일한 컬렉션에 넣는다. 53 | - 여러 테이블을 연결할 필요 없이 이미 필요한 모든 것을 갖춘 문서를 작성한다. -> JOIN이라는 개념이 존재하지 않는다. 54 | #### 2) 장점 55 | - 스키마가 없기 때문에 훨씬 유연하다. = 언제든지 저장된 데이터를 조정하고 새로운 필드를 추가할 수 있다. 56 | - 데이터는 애플리케이션이 필요로 하는 형식으로 저장한다. (데이터 read 속도 향상) 57 | - 수직, 수평 확장이 가능함으로 데이터베이스가 어플리케이션에서 발생하는 모든 read/write 요청에 대한 처리를 가능하게 한다. 58 | #### 3) 단점 59 | - 여러 컬렉션에 중복된 데이터가 변경된 경우, 여러 개의 컬렉션에서 데이터를 다 바꿔야한다. -> 하나라도 놓치면 서로 영향을 줄 위험이 있다. 60 | - 그러므로, update 연산을 해야하는 경우 모든 컬렉션에서 수행되어야 한다. 61 | #### 4) 사용하면 좋은 경우 62 | - 정확한 데이터 구조를 알 수 없는 경우 (변경/확장될 수 있는 경우) 63 | - 데이터의 양이 엄청나게 많은 경우(수평적 확장) 64 | - 읽기(read)처리는 자주하지만, 데이터를 자주 변경(update)하지 않는 경우 65 |

66 | 67 | ### 3. RDBMS vs NoSQL 68 | ||RDBMS|NoSQL| 69 | |---|---|---| 70 | ||레코드(record)|문서(document)| 71 | ||테이블(table)|컬렉션(collection)| 72 | |관리방법|스키마, 관계에 따라 데이터 관리|유연한 데이터 관리(스키마, 관계X)| 73 | |장점|데이터 무결성 보장|JOIN 연산 없음| 74 | |단점|수정이 힘듦|데이터가 여러 컬렉션에 중복되어 있음| 75 | |확장성|수직적 확장|수직/수평적 확장| 76 | 77 |
78 |
79 | 80 | ### cf) 무결성 제약조건 81 | - 개체 무결성 82 | - 기본키는 null값이 될 수 없다. 83 | - 참조 무결성 84 | - 외래키는 참조할 수 없는 값을 가질 수 없다. 85 | - 도메인 무결성 86 | - 특정 속성값은 그 속성이 정의된 도메인에 속한 값이어야 한다. 87 | - 키 무결성 88 | - 릴레이션에는 최소한 하나의 키가 존재해야 한다. 89 | - null 무결성 90 | - 특정 속성은 null값을 가질 수 없다. 91 | - 고유 무결성 92 | - 특정 속성값은 서로 달라야 한다. 93 | -------------------------------------------------------------------------------- /database/jsy/hint.md: -------------------------------------------------------------------------------- 1 | # :question: HINT (Oracle) 2 | 3 | #### reference 4 | https://gent.tistory.com/306
5 | https://gurume.tistory.com/entry/%EC%98%A4%EB%9D%BC%ED%81%B4-%EC%9E%90%EC%A3%BC%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%ED%9E%8C%ED%8A%B8%EB%AA%A9%EB%A1%9D-%EC%A0%95%EB%A6%AC%EC%B9%9C%EC%A0%88%ED%95%9C-sql-%ED%8A%9C%EB%8B%9D 6 |
7 | 8 | ## Question 9 | 1. HINT(힌트)는 무엇인가요? 10 | - 오라클에서 SQL을 튜닝하기 위한 지시구문으로 옵티마이저가 최적의 계획으로 SQL문을 처리하지 못하는 경우에 개발자가 직접 최적의 실행 계획을 제공하는 것입니다. 11 | - 개발자가 SQL문 실행을 위한 데이터 스캐닝 경로, 조인 방법 등을 작성하여 옵티마이저에게 알려줍니다. 12 | 13 |
14 | 15 | ## :nerd_face: What I study 16 | ### 1. HINT 17 | 18 | #### 1-1) 목적 19 | - 오라클 서버가 업그레이드되면서 옵티마이저의 성능도 함께 향상되어 쿼리 실행시 최적의 방법으로 실행해준다. 20 | - 하지만 옵티마이저가 항상 최적의 실행 경로를 만들어내기는 불가능하기 때문에 개발자(DBA)가 **직접 최적의 실행경로를 작성**해줘야 하는 경우가 생긴다. (튜닝) 21 | - -> 이때 사용하는 것이 **HINT** 절이다! 22 | - ex) 인덱스 힌트: DBA는 한 쿼리에서 어떤 인덱스의 선택도가 높은지 파악한 후, 옵티마이저에 의존한 실행계획보다 효율적인 실행 계획을 만들어 내어야 한다. 23 | 24 | #### 1-2) 사용법 25 | - 액세스 경로, 조인 순서, 병렬 및 직렬 처리, 옵티마이저의 목표 변경, 데이터 값 정렬에 사용된다. 26 | - HINT는 쿼리 서두에 명시한다. 27 | - 첫 줄에 힌트 주석(`/*+(힌트명)*/`)을 작성하면 된다. 28 | - 여러 개의 힌트를 명시할 수 있고, 공백으로 구분된다. 29 | - 공백이 아니면 힌트가 적용되지 않는다. 30 | - 단, 힌트 안의 괄호 사이에는 쉼표를 사용할 수 있다. 31 | - 힌트 안의 괄호가 명시되는 테이블은 `ALIAS`으로 정의되며, 스키마까지 포함해서 작성하지 않는다. 32 | - 주석에 꼭 `+`를 붙여야 힌트절이 실행되며, 없으면 일반 주석으로 간주된다. 33 | 34 | ``` 35 | -- 인덱스 힌트(index_asc) : 인덱스 영역에서 순방향으로 스캔해라 36 | SELECT /*+ index_asc(e idx_myemp1_ename) */ EMPNO, ENAME, SAL FROM MYEMP1 e WHERE ENAME >= '가' 37 | ``` 38 | 39 | - HINT 쿼리에 오타가 있는 경우, 무시되어 HINT가 없는 것처럼 동작한다. 40 | - 무분별한 HINT의 사용은 성능의 저하를 초래하기 때문에, 최적의 실행 경로를 알고 있을 경우 적절하게 사용되어야 한다. 41 | 42 | #### 1-3) 종류 43 | ##### 출처: https://gurume.tistory.com/entry/오라클-자주사용하는-힌트목록-정리친절한-sql-튜닝 44 |
45 | 46 | 1. 최적화 목표 47 | - `/*+ALL_LOWS */` : 전체 처리속도 최적화 48 | - `/*+FIRST_ROWS(N) */` : 최초 N건 응답속도 최적화 49 | 50 | 2. 액세스 방식 51 | - `/*+FULL */` : 인덱스 타지말고 바로 테이블 풀스캔으로 접근해라 52 | - `/*+INDEX */` : 인덱스를 타라 53 | - `/*+INDEX_DESC */` : 인덱스를 ORDER BY DESC 역순으로 타라 (시간, 결과값등 최근인 것 혹은 MAX값 구할때 좋음) 54 | - `/*+INDEX_FFS */` : INDEX FAST FULL SCAN으로 타라 55 | - `/*+INDEX_SS */` : INDEX SKIP SCAN 56 | 57 | 3. 조인순서 58 | - `/*+ORDERED */` : FROM절에 나열된 테이블 순서대로 조인해라 59 | - `/*+LEADING */`: 힌트절에 열거한 테이블 순서대로 조인해라 60 | - ex) `/*+ LEADING (A B C)*/` (A,B,C 순서대로 조인) 61 | 62 | 4. 조인방식 63 | - `/*+USE_NL */` : NL(NESTED LOOP - 중첩루프)방식 조인 유도 64 | - `/*+USE_MERGE */` : 소트머지 조인으로 유도 65 | - `/*+USE_HASH */` : 해시조인으로 유도 66 | - `/*+NL_SJ */` : NL SEMI조인으로 유도 67 | - `/*+MERGE_SJ */` : 소트머지 세미조인으로 유도 68 | - `/*+HASH_SJ */` : 해시 세미조인으로 유도 69 | 70 | 5. 서브쿼리팩토링 71 | - `/*+MATERIALIZE */` : WITH문으로 정의한 집합을 물리적으로 생성하도록 유도 72 | - ex) `WITH /*+ MATERIALIZE*/ T AS (SELECT ...)` 73 | - `/*+INLINE */` : WITH문으로 정의한 집합을 물리적으로 생성하지않고 INLINE 처리하도록 유도 74 | - ex) `WITH /*+ INLINE*/ T AS (SELECT ...)` 75 | 76 | 6. 쿼리변환 77 | - `/*+ MEERGE */` : 뷰 MERGING 유도 78 | - `/*+NO_MERGE */` : 뷰 MERGING 방지 79 | - `/*+UNNEST */` : 서브쿼리 UNNESTING 유도 80 | - `/*+NO_UNNEST */` : 서브쿼리 UNNESTING 방지 81 | - `/*+PUSH_PRED */` : 조인조건 PUSHDOWN 유도 82 | - `/*+NO_PUSH_PRED */` : 조인조건 PUSHDOWN 방지 83 | - `/*+USE_CONCAT */` : OR 또는 IN-LIST조건을 OR-EXPANSION으로 유도 84 | - `/*+NO_EXPAND */` : OR 또는 IN-LIST 조건에 대한 OR-EXPANSION방지 85 | 86 | 7. 병렬처리 87 | 88 | - `/*+PARALLEL */` : 테이블 스캔, DML 병렬방식으로 처리하도록 할때 사용, 단일 대형 테이블의 접근시 정말 많이 쓴다. 89 | - ex) `/*+ PARALLEL(T1 4)*/` 90 | - `/*+PARALLEL_INDEX */` : 인덱스 스캔을 병렬방식으로 처리하도록 유도 91 | - `/*+PQ_DISTRIBUTE */` : 병렬수행시 데이터 분배방식 결정 92 | - ex) PQ_DISTRIBUTE(T1 HASH(--BUILD INPUT) HASH(--PROBE TABLE)) 93 | 94 | 8. 기타 95 | 96 | - `/*+APPEND*/` : DIRECT PATH INSERT유도로 INSERT문에 주로 많이 쓴다. 97 | - `/*+DRIVING_SITE */` : DB LINK REMOTE쿼리에 대한 최적화 및 실행 주체 지정 (LOCAL 또는 REMOTE) 98 | - `/*+PUSH_SUBQ */` : 서브쿼리를 가급적 빨리 필터링하도록 유도 99 | - `/*+NO_PUSH_SUBQ */` : 서브쿼리를 가급적 늦게 필터링하도록 유도 -------------------------------------------------------------------------------- /database/jsy/index.md: -------------------------------------------------------------------------------- 1 | # :question: 인덱스 (Index) 2 | 3 | #### reference 4 | https://helloinyong.tistory.com/296
5 | https://zorba91.tistory.com/293 6 |
7 | 8 | ## Question 9 | 1. [DB 인덱스에 대해 설명해주세요.](#1-index) 10 | - DB의 데이터를 논리적으로 정렬하여 검색과 정렬 작업의 속도를 높이기 위해 사용되는 방법입니다. 11 | - 책의 목차, 색인과 같다고 할 수 있습니다. 12 |

13 | 14 | 2. DB 인덱스를 사용하는 이유는 무엇인가요? 15 | - ***테이블을 조회하는 속도와 그에 따른 성능을 향상***시킬 수 있으며, 그에 따른 ***전반적인 시스템 부화를 줄일 수*** 있습니다. 16 |

17 | 18 | 3. [DB 인덱스에 해쉬 보다 B Tree(B- Tree)를 쓰는 이유는 무엇인가요?](#2-hash-table) 19 | - 해시 테이블은 단 하나의 데이터를 탐색하는, 등호(=) 연산에만 특화되어 있습니다. 20 | - DB는 기준 값보다 크거나 작은 요소들을 탐색하는, 부등호(<,>) 연산이 자주 발생될 수 있으므로 DB 인덱스 용도로 해시 테이블은 어울리지 않습니다. 21 | 22 |
23 | 24 | ## :nerd_face: What I study 25 | ### 1. Index 26 | - DB Index에 대한 설명 27 | - 기본키는 항상 DBMS가 내부적으로 정렬된 목록을 관리한다. -> 기본키에 대해서 특정 행을 가져올 때 빠르게 처리됨. 28 | - 기본키 외의 다른 열의 내용을 검색하거나 정렬할 때는 하나하나 대조해보기 때문에 시간이 오래걸린다. -> 이를 인덱스로 정의해두면 검색 속도가 향상됨! 29 | - 즉, 데이터와 데이터의 위치를 포함한 자료구조인 인덱스를 생성하여 빠르게 조회한다! 30 | - 장점 31 | - 테이블 조회 속도, 성능 향상 32 | - 전반적인 시스템 부화 감소 33 | - 단점 34 | - 데이터 변경 작업이 자주 일어나는 경우, Index를 재작성해야 한다. (성능에 영향을 미침) 35 | - 인덱스를 관리하기 위해 DB에 추가 저장공간이 필요하다. 36 | - 사용하면 좋은 경우 37 | - where, join문에 자주 사용되는 컬럼 38 | - DML(insert, update, delete)가 자주 발생하지 않는 컬럼 39 | - 데이터의 중복도가 낮은 컬럼 40 | - 규모가 작지 않은 테이블 41 |

42 | 43 | ### 2. Hash Table 44 | ![hash](https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcSdWcV%2FbtqLDOnT21u%2FcYdqhhPUIm1KgBIt3hWVt0%2Fimg.png) 45 | - 해시 테이블은 해시 함수를 통해 나온 해시 값을 이용하여 저장된 메모리 공간에 한 번에 접근한다. 46 | - O(1) (왜? 단 하나의 데이터를 탐색하는 시간) 47 | - 모든 값이 정렬되어 있지 않으므로, 해시 테이블에서는 특정 기준보다 크거나 작은 값을 찾을 수 없다. (부등호 연산에 매우 비효율적) 48 | - 즉, 해시 테이블은 단 하나의 데이터를 탐색하는, 등호 연산에 매우 효율적이다. 49 |

50 | 51 | ### 3. B Tree 52 | #### 1) B- Tree 53 | ![b-](https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwUaAz%2FbtqLFTnLNpN%2F8gJlCP70LaTNjksl84xolk%2Fimg.jpg) 54 | - DB 인덱스에서 사용되는 자료구조 55 | - ***데이터가 정렬된 상태로 유지되는 것***이 핵심이다. 56 | - B- tree는 루트로부터 리프까지의 거리가 일정한 **균형트리**이다. 57 | ![complexity](https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpQB0I%2FbtqBQ05iyzt%2Ff8oPM7x0blzKhEzZMwXDck%2Fimg.png) 58 | - 데이터 갱신이 자주 발생하면 서서히 균형이 깨지고, 성능에도 나쁜 영향을 미치게 된다. 59 | - 데이터 갱신이 자주 발생하는 테이블의 인덱스는 인덱스 재구성을 통해 트리의 균형을 되찾는 작업이 필요하다. 60 | #### 2) B+ Tree 61 | ![b+](https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRiL19%2FbtqBTMSBCWF%2FJ3nKw2qympUVxGThnVdLK0%2Fimg.png) 62 | - B- tree의 확장개념 63 | - ex) InnoDB (MYSQL DB engine) 64 | - 리프 노드에만 key, data를 저장한다. -> 사용되는 메모리 양을 줄일 수 있다. 65 | - 하나의 노드에 더 많은 key들을 담을 수 있으므로, 트리의 높이가 낮아진다. -------------------------------------------------------------------------------- /database/jsy/modeling.md: -------------------------------------------------------------------------------- 1 | # :question: 데이터 모델링 2 | 3 | #### reference 4 | https://rutgo-letsgo.tistory.com/138
5 | https://prinha.tistory.com/entry/DB-3%EB%8B%A8%EA%B3%84-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%8B%9C%EC%8A%A4%ED%85%9C-%EC%99%B8%EB%B6%80%EA%B0%9C%EB%85%90%EB%82%B4%EB%B6%80%EC%8A%A4%ED%82%A4%EB%A7%88 6 |
7 | 8 | ## Question 9 | 1. [다양한 데이터 모델에 대해서 설명해주세요.](#1-data-modeling) 10 | - 데이터 모델에는 '개념 모델, 논리 모델, 물리 모델'이 있습니다. 11 | - 개념 모델에서는 데이터 모델의 첫 단계로 엔티티와 관계 위주로 모델링이 됩니다. 12 | - 논리 모델에서는 누가, 어떻게 데이터에 접근하는 지 등 비즈니스 정보의 구조, 규칙 등이 명확하게 모델링이 됩니다. 13 | - 물리 모델에서는 논리 모델을 각 DBMS의 특성에 맞게 데이터 베이스 저장 구조(물리 데이터 모델)로 변환하는 모델링이 됩니다. 14 |

15 | 16 | 2. [데이터 모델링의 디자인 스키마에 대해서 설명해주세요.](#2-database-schema) 17 | - 스키마에는 '외부 스키마, 개념 스키마, 내부 스키마'가 있습니다. 18 | - 외부 스키마는 외부 단계에서 사용자에게 필요한 데이터베이스를 정의한 스키마입니다. 19 | - 개념 스키마는 개념 단계에서 데이터베이스 전체의 논리적 구조를 정의한 스키마입니다. 20 | - 내부 스키마는 전체 데이터베이스가 저장 장치에 실제로 저장되는 방법을 정의한 스키마입니다. 21 | - 즉, 외부>개념>내부 와 같이 추상화 레벨이 높아진다. 22 |

23 | 24 | 3. 위에서 답변한 스키마 중에서 어떤 것이 더 낫습니까? 25 | 26 |
27 | 28 | ## :nerd_face: What I study 29 | ### 1. Data Modeling 30 | - 데이터 모델: 현실 세계의 정보들을 컴퓨터에 표현하기 위해서 단순화, 추상화하여 체계적으로 표현한 개념적 모형 (다른 데이터 객체와 규칙들 간의 연결을 나타냄) 31 | - 데이터 모델링: 데이터베이스에 저장될 데이터에 대한 데이터 모델링을 하는 프로세스 32 | #### 1) 개념 모델 33 | - 현실 세계에 대한 인식을 추상적 개념으로 표현하는 과정이다. 34 | - 엔티티와 관계 위주로 모델링이 된다. 35 | - 속성들로 기술된 개체 타입과 타입들 간의 관계를 정의한다. 36 | - 개체를 인간이 이해할 수 있는 정보 구조로 표현하기 때문에 정보 모델이라고도 한다. 37 | #### 2) 논리 모델 38 | - 3개의 모델 중 가장 핵심이 되는 모델! 39 | - **특정 DBMS는 특정 논리 모델 하나만 선정하여 사용한다!** 40 | - 개념적 모델링에서 얻은 개념적 구조를 컴퓨터가 이해하고 처리할 수 있도록 변환하는 과정이다. 41 | - 필드로 기술된 데이터 타입과 이들 간의 관계를 정의한다. 42 | - 데이터 요소의 구조를 정의하고 이들간의 관계를 설정한다. 43 | - 비즈니스 정보의 구조, 규칙등을 명확하게 표현해야 한다. 44 | - 개체 명칭, 속성 명칭, 데이터 형태, 길이 등을 고려 45 | #### 3) 물리 모델 46 | - 논리 모델을 특정 데이터베이스로 설계한다. 47 | - 논리 모델을 각 DBMS의 특성에 맞게 데이터 베이스 저장 구조(물리 데이터 모델)로 변환한다. 48 | - 실제 저장 공간, 분산, 저장 방법 등을 고려 49 |

50 | 51 | ### 2. Database Schema 52 | - 스키마: 데이터베이스에 저장되는 ***데이터 구조와 제약조건을 정의***한 것 53 | - 데이터베이스를 쉽게 이해하고 사용할 수 있도록 하나의 데이터베이스를 관점에 따라 세 단계로 나눴다. 54 | - 각 단계별로 다른 추상화를 제공한다. 55 | #### 1) 외부 스키마(External schema) 56 | - **데이터베이스 하나에 외부 스키마가 여러 개 존재할 수 있다.** 57 | - 사용자에게 필요한 데이터베이스를 정의한 스키마 58 | - 각 사용자가 생각하는 데이터베이스의 논리적 구조이다. 59 | - 사용자마다 다른 구조를 가진다. 60 | #### 2) 개념 스키마(Conceptual schema) 61 | - **데이터베이스 하나에 개념 스키마가 하나만 존재한다.** 62 | - 데이터베이스 전체의 논리적 구조를 정의한 스키마 63 | - 정의 대상: 64 | - 어떤 데이터가 저장되는지 65 | - 데이터들 간에는 어떤 관계가 존재하는지 66 | - 어떤 제약조건이 존재하는지 67 | - 데이터에 대한 보안 정책 68 | - 데이터에 대한 접근 권한 등등 69 | #### 3) 내부 스키마(Internal schema) 70 | - **데이터베이스 하나에 내부 스키마가 하나만 존재한다.** 71 | - 전체 데이터베이스가 저장 장치에 실제로 저장되는 방법을 정의한 스키마 72 | - 데이터베이스가 물리적으로 저장한 형식을 나타낸다. 73 | - 레코드 구조, 필드 크기, 레코드 접근 경로 등 물리적인 저장 구조를 정의한다. 74 | 75 | ![schema](https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkClY1%2FbtqQzSdmZ1H%2FNetufh3kJCShtWE1cNCyHK%2Fimg.png) -------------------------------------------------------------------------------- /database/jsy/normalization.md: -------------------------------------------------------------------------------- 1 | # :question: 정규화 (Normalization) 2 | 3 | #### reference 4 | https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=dydghdkdl&logNo=221165683361
5 | https://m.blog.naver.com/cjw950607/221460234203
6 | https://nirsa.tistory.com/107 7 |
8 | 9 | ## Question 10 | 1. [정규화란 무엇인지, 필요한 이유와 함께 답변해주세요.](#1-normalization) 11 | - 하나의 릴레이션에 하나의 의미만 존재할 수 있도록 릴레이션을 분해하는 과정을 뜻합니다. 12 | - 데이터의 중복을 최소화하고 일관성을 보장하기 위해 정규화 과정을 거칩니다. 13 |

14 | 15 | 2. [각 정규화 단계에 대해 **만족되어야 할 조건**을 중심으로 설명해주세요.](#2-정규화-단계) 16 | - 총 5(+1)단계로 구성되어 있습니다. 17 | - 제 1정규화는 ***각 컬럼들의 값이 원자값을 가지도록 바꾸는 정규화***를 말합니다. 18 | - 제 2정규화는 ***테이블의 모든 컬럼에서 부분적 함수 종속을 제거하는 정규화***를 말합니다. 19 | - 제 3정규화는 ***기본키를 제외한 속성들 간의 이행적 함수 종속을 제거하는 정규화***를 말합니다. 20 | - BNCF는 ***결정자이면서 후보키가 아닌 것을 제거하는 정규화***를 말합니다. 21 | - 제 4정규화는 ***결합 종속성을 제거하는 정규화***를 말합니다. 22 | - 제 5정규화는 ***합성키에 순환 종속성을 제거하는 정규화***를 말합니다. 23 |
24 | 25 | ## :nerd_face: What I study 26 | ### 1. Normalization 27 | - 관계형 데이터베이스의 설계에서 중복을 최소화하게 데이터를 구조화하는 프로세스 28 | - 목적: 데이터 구조의 안정성 최대화, 중복 배제를 통한 DML 이상 발생 방지 29 | - 정규화를 거치지 않으면 이상(Anormaly) 문제가 발생한다. 30 | - 모든 테이블을 정규화하는 것은 좋지 않다. (JOIN 연산이 많아져 성능의 저하가 발생할 수 있기 때문) 31 | 32 | #### 1) 장점 33 | - 이상(Anormaly) 현상을 방지하여 유연한 데이터 구축이 가능해진다. 34 | - 불필요한 쿼리(ex. 서브쿼리)를 제거할 수 있다. 35 | - 새로운 데이터 형의 추가로 인한 확장 시, 구조를 최소한으로 변경할 수 있다. 36 | #### 2) 단점 37 | - 릴레이션의 분해로 인해 릴레이션 간 JOIN연산이 많아진다. -> 질의 응답시간이 느려질 수 있다. (성능 저하) 38 | - 위의 해결방법으로는 '반정규화'를 적용해볼 수 있다. 39 |

40 | 41 | ### 2. 정규화 단계 42 | - 정규화는 1-5 정규화까지 있지만, 실무에서는 대체로 1-3 정규화까지의 과정을 거친다. 43 | #### 1) 1NF 44 | Before|After 45 | :-------------------------:|:-------------------------: 46 | ![](https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIXuX0%2FbtqBGpEhISu%2FkNCOwnGlgcOJLMP43tiV6k%2Fimg.png) | ![](https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDtHsC%2FbtqBLiXLMaA%2Fe1iuGoGl5Eppp0CP5PAzEk%2Fimg.png) 47 | 48 | - 릴레이션에 속한 모든 속성의 도메인(속성값)이 원자 값으로만 구성되어야 한다. 49 | - 테이블의 각 컬럼의 유형은 유일해야 한다. 50 | #### 2) 2NF 51 | Before|After 52 | :-------------------------:|:-------------------------: 53 | ![](https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmTwvD%2FbtqBHTxUlyE%2FWad2A4jpY6pEXfarlh1v91%2Fimg.png) | ![](https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeNjmkB%2FbtqBGfor6SV%2F7OcKkFE73Xiw0T9Ylc1nu1%2Fimg.png) 54 | - 제 1정규화를 만족해야 한다. 55 | - 모든 속성들은 오직 개체의 고유 식별자(유일키)에만 의존해야 한다. 56 | - 기본키를 제외한 속성이 기본키에 완전 함수 종속되어야 한다. 57 | #### 3) 3NF 58 | - **면접질문 빈도수가 가장 높은 정규화** 59 | 60 | Before|After 61 | :-------------------------:|:-------------------------: 62 | ![](https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeNjmkB%2FbtqBGfor6SV%2F7OcKkFE73Xiw0T9Ylc1nu1%2Fimg.png) | ![](https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSlASz%2FbtqBHTdDoo3%2F6yv3htZo6k1twifKSUd9MK%2Fimg.png) 63 | - 제 2정규화를 만족해야 한다. 64 | - 테이블의 키 외에 다른 속성에 의존하는 요소가 존재하면 안된다. 65 | - 위와 같은 요소가 존재할 경우, 다른 새로운 테이블로 옮긴다. 66 | - 3NF까지 완성되면 데이터베이스는 정규화된 것으로 간주한다. 67 | #### 4) BNCF 68 | - 제 3정규화를 만족해야 한다. 69 | - 모든 테이블들은 오직 하나의 기본키를 가져야 한다. 70 | - 결정자이면서 후보키가 아닌 것을 제거한다. 71 | #### 5) 4NF 72 | - BNCF를 만족해야 한다. 73 | - 테이블은 하나의 키(pk)에 여러 값을 가질 수 없다. (결합 종속성 제거) 74 | - 다치 종속을 제거한다. 75 | #### 6) 5NF 76 | - 제 4정규화를 만족해야 한다. 77 | - 후보키를 통하지 않는 조인 종속을 제거한다. 78 |

79 | 80 | ### 3. 함수적 종속 81 | - 테이블 속성들간의 관계에 대한 제약조건 82 | - 속성 A가 속성 B를 결정할 때, B는 A에 함수적으로 종속된다고 한다. 83 | #### **1) 완전함수종속** 84 | - 함수적 종속에서 X의 값이 여러 요소일 경우, 즉, {X1, X2} -> Y일 경우, X1과 X2가 Y의 값을 결정할 때를 의미한다. 85 | #### **2) 부분함수종속** 86 | - X1, X2 중 하나만 Y의 값을 정할 때를 의미한다. 87 | #### **3) 이행적함수종속** 88 | - 세 가지 종속간의 종속이 (X->Y) & (Y->Z) 일 경우 X->Z가 성립되는 종속을 의미한다. 89 |

90 | 91 | ### 4. Anomaly 현상 92 | - 정규화를 거치지 않아 데이터가 불필요하게 중복되어 생기는 예기치 않게 발생하는 문제 93 | - 좋은 관계형 데이터베이스를 설계하기 위해서는 정보의 이상 현상이 생기지 않도록 고려해야 한다. 94 | #### 1) 갱신 이상 95 | - 릴레이션에서 튜플의 속성값을 변경할 때, 일부 튜플만 변경되는 현상 96 | #### 2) 삽입 이상 97 | - 릴레이션에 데이터를 삽입할 때, 원하지 않는값이 삽입되는 현상 98 | #### 3) 삭제 이상 99 | - 릴레이션에서 튜플을 삭제할 때, 원하지 않는 다른 값들도 연쇄적으로 삭제되는 현상 100 | -------------------------------------------------------------------------------- /database/yij/Concurrency Control Mechanisms 7905a96a94f94aa2844ac41618bbc858.md: -------------------------------------------------------------------------------- 1 | # Concurrency Control Mechanisms 2 | 3 | # Database Lock ❓ 4 | 5 | ![Untitled](https://user-images.githubusercontent.com/30489264/142808253-8ed178bf-fabd-460d-9bbe-c70e56bdee78.png) 6 | 7 | RDBMS에서 트랜잭션 시스템에 적용되는 동시성 제어 방법. 8 | 9 | 특정 트랜잭션이 레코드에 접근 중 일때 다른 트랜잭션이 해당 데이터에 접근하지 못 하게 막는 것을 의미한다. 일반적으로 Lock의 단위가 너무 작으면 독립성이 보장받지 못 하고, 너무 크면 트랜잭션이 직렬화 되어 수행 시간이 느려진다. 10 | 11 | # Optimistic Concurrency Control 12 | 13 | ![Untitled 1](https://user-images.githubusercontent.com/30489264/142808274-788b5832-61a0-4c69-ae2c-3a913c15be82.png) 14 | 15 | 여러 트랜잭션이 **서로 간섭하지 않고 자주 완료될 수 있다**고 가정하는 동시성 제어 방식. 16 | 17 | 일반적으로 Block Contention(동일한 인덱스나 데이터 블록에 동시에 액세스하기 위해 경쟁하는 프로세스 또는 인스턴스)이 낮은 환경에서 사용한다. 18 | 19 | 원하는 규칙이 커밋 시 **위반되면 트랜잭션을 즉시 중단하고 다시 실행**하기 때문에 오버헤드가 발생한다. 너무 많은 트랜잭션이 중단되지 않는 상황일 경우 **일반적으로 좋은 전략**이다. 20 | 21 | ## 실행 과정 22 | 23 | ### Begin 24 | 25 | 트랜잭션의 시작을 표시하는 타임스탬프 기록 26 | 27 | ### Modify 28 | 29 | 데이터베이스 값을 읽고 변경 사항을 임시로 기록 30 | 31 | ### Validate 32 | 33 | - 이 트랜잭션이 사용(Read/Write)한 데이터를 다른 트랜잭션이 수정했는지 확인 34 | - 시작 시간 이후에 완료된 트랜잭션과 유효성 검사 시간에 여전히 활성 상태인 트랜잭션 포함 35 | 36 | ### Commit/Rollback 37 | 38 | - 충돌이 없으면 모든 변경 사항 적용 39 | - 충돌이 있는 경우 일반적으로 트랜잭션을 중단하여 해결 40 | 41 | ## 특징 42 | 43 | ### 장점 44 | 45 | 충돌이 드물 경우 락을 관리하는 비용 없이 트랜잭션을 완료할 수 있고, 다른 트랜잭션의 락이 해제될 때 까지 기다리지 않고도 높은 처리량을 기대할 수 있다. 46 | 47 | ### 단점 48 | 49 | 데이터 리소스에 대한 경합이 빈번한 경우, 트랜잭션을 반복적으로 다시 실행해야 하기 때문에 성능이 크게 저하된다. 50 | 51 | - Redis가 WATCH 명령어를 통해 OCC를 제공한다 52 | - MySQL이 Group Replication 구성을 위해 OCC를 구현한다 53 | - Elasticsearch의 검색 엔진은 버전 속성을 통해 OCC를 지원한다 54 | 55 | ## OCC in JPA 56 | 57 | ```java 58 | @Entity 59 | public class Student { 60 | @Id 61 | private Long id; 62 | private String name; 63 | private String lastName; 64 | @Version 65 | private Integer version; 66 | // getters and setters 67 | } 68 | ``` 69 | 70 | JPA에서는 `@Version` 어노테이션을 이용해서 낙관적 락을 사용할 수 있다. 이를 통해 외부에서 값을 검색할 수는 있지만 업데이트하거나 증가하도록 허용해서는 안 된다(Persistence Provider에게만 권한을 주어서 데이터의 일관성 유지). 71 | 72 | 이 때 지켜야 할 몇 가지 규칙이 있는데, 73 | 74 | 1. 각 Entity Class에는 `@Version` 특성이 하나만 존재해야 한다 75 | 2. 여러 Table에 매핑된 경우 주 테이블에 배치돼야 한다 76 | 3. 유형은 int, long, short 혹은 Integer, Long, Short, java.sql 중 하나여야 한다. 77 | 78 | # Pessimistic Concurrency Control 79 | 80 | ![Untitled 2](https://user-images.githubusercontent.com/30489264/142808297-5b05b622-c728-43c9-8501-0114246af8f8.png) 81 | 82 | 여러 트랜잭션이 자주 간섭된다고 가정하는 동시성 제어 방식. 83 | 84 | 규칙 위반을 유발하는 경우 위반 가능성이 사라질 때 까지 트랜잭션 작업을 차단한다. 일반적으로 **Shared Lock, Exclusive Lock**을 통해 이를 구현한다. 85 | 86 | OCC에 비해 높은 무결성을 가지고 있지만, 교착 상태가 발생할 가능성이 존재한다. 87 | 88 | ### Shared Lock 89 | 90 | 트랜잭션이 읽기를 할 때 사용되는 락의 종류이다. 트랜잭션이 데이터를 조회할 때 공유락을 걸게 되면, 다른 트랜잭션은 그 데이터를 읽을 수 있고 변경이나 삭제는 불가능하다. 91 | 92 | ### Exclusive Lock 93 | 94 | 배타락은 수정/삭제를 할 때 거는 락의 종류이다. 배타락을 걸게 되면 다른 트랜잭션은 그 데이터에 읽기/수정/삭제 연산을 할 수 없고, 어떠한 락도 걸 수 없다. 95 | -------------------------------------------------------------------------------- /java/README.md: -------------------------------------------------------------------------------- 1 | # 4) JAVA 2 | - contributor : [김경원](https://github.com/shining8543) , [윤이진](https://github.com/483759) , [이현경](https://github.com/honggoii) , [진수연](https://github.com/jjuyeon) 3 |
4 | 5 | ### :notebook_with_decorative_cover: JAVA 6 | 1. 객체지향에 대해서 설명하세요. 7 | 2. 객체지향의 SOLID 원칙에 대해 설명해주세요. 8 | 3. Java의 구동원리(컴파일 과정)를 설명해주세요. 9 | 4. Java의 Garbage Collection 동작 과정을 설명해주세요. 10 | 5. 쓰레드란 무엇이고, 싱글쓰레드와 멀티쓰레드의 차이를 설명해주세요. 11 | 6. 클래스는 무엇이고, 객체는 무엇인지 설명해주세요. 12 | 7. 인터페이스와 추상클래스의 차이점은 무엇인지 설명해주세요. 13 | 8. 직렬화가 무엇인지 설명하세요. 14 | 9. Call by Value와 Call by Reference의 차이에 대해 설명해주세요. 15 | 10. Checked Exception과 Unchecked Exception의 차이를 설명해주세요. 16 | 11. JVM의 역할에 대해 설명해주세요. 17 | 12. JDBC란 무엇인가요? 18 | 13. Thread-Safe에 대해 설명해주세요 19 | 20 | ### :notebook_with_decorative_cover: JAVA 자료구조 21 | 1. Java의 HashMap과 HashTable의 차이점을 설명해주세요. 22 | 2. Java의 원시타입들은 무엇이 있으며 각각 몇 바이트를 차지하는지 설명해주세요. 23 | 3. String, StringBuffer, StringBuilder의 차이를 설명하세요. 24 | 4. String형 객체를 ""로 만들었을 때와 new 키워드를 이용해서 만들었을 때의 차이점은? (String Pool) 25 | 5. 오버라이딩과 오버로딩이 무엇이며 어떤 차이점이 있는지 설명해주세요. 26 | 6. Generic에 대해 설명해주세요. 27 | 7. 오토 박싱과 언박싱에 대해 설명해주세요. 28 | 8. 업캐스팅과 다운캐스팅의 차이에 대해 설명해주세요. 29 | 9. Wrapper Class에 대해 설명해주세요. 30 | 10. Date 대신 LocalDate를 사용하는 이유에 대해서 설명하세요. 31 | 32 | ### :notebook_with_decorative_cover: JAVA 라이브러리 & 프레임워크 33 | 1. '=='과 'equals()'의 차이에 대해 설명하세요. 34 | 2. 자바 컬렉션에 대해서 설명해주세요. (정의, 종류) 35 | 3. 컬렉션 프레임워크에 속한 List, Set, Map에 대해 설명해주세요. 36 | 4. 정규 표현식에 대해 설명해주세요. 37 | 38 | ### :notebook_with_decorative_cover: Design Pattern 39 | 1. 싱글톤 패턴이란 무엇인지 설명해주세요. -------------------------------------------------------------------------------- /java/jsy/README.md: -------------------------------------------------------------------------------- 1 | # Suyeon Jin 2 | 3 | |Study|바로가기| 4 | |---|---| 5 | |OOP|[:white_check_mark:](../jsy/oop.md)| 6 | |JVM|[:white_check_mark:](../jsy/jvm.md)| 7 | |JAVA|[:white_check_mark:](../jsy/java.md)| 8 | |JAVA 자료구조|[:white_check_mark:](../jsy/structure.md)| 9 | |JAVA String|[:white_check_mark:](../jsy/string.md)| 10 | |JAVA 라이브러리|[:white_check_mark:](../jsy/lib.md)| 11 | |JAVA 호출방식|[:white_check_mark:](../jsy/call.md)| 12 | |JAVA 예외처리|[:white_check_mark:](../jsy/exception.md)| 13 | |JAVA 디자인패턴|[:white_check_mark:](../jsy/pattern.md)| 14 | |JDBC|[:white_check_mark:](./jdbc.md)| -------------------------------------------------------------------------------- /java/jsy/call.md: -------------------------------------------------------------------------------- 1 | # :question: JAVA 의 호출방식 2 | 3 | #### reference 4 | https://devlog-wjdrbs96.tistory.com/44
5 | https://sleepyeyes.tistory.com/11 6 |
7 | 8 | ## Question 9 | 1. [Call by Value와 Call by Reference의 차이에 대해 설명해주세요.](#2-call-by-reference) 10 | - Call by Value는 실제 값에 의한 호출 방법이고, Call by Reference는 참조에 의한 호출 방법입니다. 11 | - 좀 더 구체적으로, Call by Value는 함수의 매개변수 값을 복사하여 전달하는 방식으로, 전달받은 값이 변경되어도 원본 값은 변경되지 않고 유지됩니다. 12 | - 반면, Call by Reference는 매개변수의 레퍼런스를 전달하는 방식으로, 전달받은 값이 변경되면 원본 값도 같이 변경됩니다. 13 |
14 | 15 | ## :nerd_face: What I study 16 | ### 1. Call by Value 17 | - 값에 의한 호출 18 | - JAVA는 항상 ```Call by Value```로 값을 넘긴다. 19 | - 함수가 호출될 때, 메모리 공간 안에는 함수를 위한 임시 공간이 생성된다. 20 | - 함수가 종료되면 임시로 생성되었던 공간은 사라진다. 21 | - 함수 호출시 **인자로 전달되는 변수의 값을 복사하여 함수의 인자로 전달한다.** 22 | - 원본의 데이터가 변경될 가능성이 없다. 23 | - 인자를 넘겨줄 때마다 메모리 공간을 할당해야해서 메모리 공간을 더 잡아먹는다. 24 | - 복사된 인자는 함수 안에서 지역적으로 사용되는 local value의 특성을 가진다. 25 | - 따라서 함수 안에서 인자의 값이 변경되어도, ***외부의 변수의 값은 변경되지 않는다.*** 26 |
27 | 28 | ### 2. Call by Reference 29 | - 참조에 의한 호출 30 | - 함수가 호출될 때, 메모리 공간 안에는 함수를 위한 임시 공간이 생성된다. 31 | - 함수가 종료되면 임시로 생성되었던 공간은 사라진다. 32 | - 함수 호출시 **인자로 전달되는 변수의 레퍼런스를 전달한다.** 33 | - 메모리 공간을 더 잡아먹지는 않는다. 34 | - 원본 값이 변경될 수 있다는 위험이 존재한다. 35 | - 따라서 함수 안에서 인자의 값이 변경되면, ***인자로 전달된 변수의 값도 함께 변경된다.*** 36 | 37 | ||Call by Value|Call by Reference| 38 | |:---:|:---:|:---:| 39 | |호출|값에 의한 호출|참조에 의한 호출| 40 | |처리방식|전달받은 값을 복사|전달받은 값을 직접 참조| 41 | |전달받은 값을 변경했을 때|원본은 변하지 않음|원본도 같이 변함| 42 | 43 |
44 | 45 | ### 3. JAVA 의 호출방식 46 | - JAVA에서 함수의 인자로 전달되는 데이터 타입이 **원시 타입**인 경우 value로 ***해당하는 변수의 값***을 복사해서 전달한다. ***call by value*** 47 | - 따라서 함수 안에서 인자의 값이 변경되어도, **외부의 변수의 값은 변경되지 않는다.** 48 | ```java 49 | public class Main { 50 | public static void main(String[] args) { 51 | int n = 10; 52 | System.out.print(n); // 10 53 | primitive(n); 54 | System.out.println(n); // 10 55 | } 56 | 57 | public static void primitive(int n) { // 원시 타입을 함수의 인자로 전달 58 | n -= 5; 59 | System.out.println(n); // 5 60 | } 61 | } 62 | ``` 63 |
64 | 65 | - JAVA에서 함수의 인자로 전달되는 데이터 타입이 **참조 타입**인 경우 value로 ***해당 객체의 주소 값***을 복사하여 넘긴다. ***call by value*** 66 | - JAVA는 C/C++과 같이 변수의 주소값 자체를 가져올 방법이 없으며, 이를 넘길 수 있는 방법도 없다. 67 | - 따라서 **원본 객체의 property까지는 접근이 가능하나, 원본 객체 자체를 변경할 수는 없다.** 68 | ```java 69 | public class Main { 70 | public static void main(String[] args) { 71 | int[] arr = {1, 2, 3}; 72 | for (int num : arr) { // 1 2 3 73 | System.out.print(num + " "); 74 | } 75 | 76 | reference(arr); 77 | 78 | for (int num : arr) { // 10 20 30 79 | System.out.print(num + " "); 80 | } 81 | } 82 | 83 | // 참조형의 경우, 주소값이 전달되므로 값을 변경하면 원본도 영향을 받는다. 84 | public static void reference(int[] a) { 85 | for (int i = 0; i < a.length; i++) { 86 | a[i] *= 10; 87 | } 88 | } 89 | } 90 | ``` 91 | 92 | ```java 93 | public class Main2 { 94 | /* parameter는 참조변수 Person 자체의 reference가 아닌 Object가 "저장하고 있는 주소값(value)" */ 95 | public static void assignNewPerson(Person p) { 96 | p = new Person("yeon"); 97 | } 98 | public static void changeName(Person p) { 99 | p.setName("yeon"); 100 | } 101 | 102 | public static void main(String[] args) { 103 | Person p = new Person("su"); 104 | 105 | assignNewPerson(p); 106 | System.out.println(p); // name is su 107 | 108 | changeName(p); 109 | System.out.println(p); // name is yeon 110 | } 111 | } 112 | ``` -------------------------------------------------------------------------------- /java/jsy/exception.md: -------------------------------------------------------------------------------- 1 | # :question: JAVA 의 예외처리 2 | 3 | #### reference 4 | https://cheese10yun.github.io/checked-exception/
5 | https://devlog-wjdrbs96.tistory.com/351 6 |
7 | 8 | ## Question 9 | 1. [Checked Exception과 Unchecked Exception의 차이를 설명해주세요.](#1-checked-exception) 10 | - Runtime Exception을 상속하지 않는 클래스를 Checked exception이라고 하며, 상속하는 클래스는 Unchecked exception이라고 합니다. 11 | - Checked exception은 반드시 예외 처리를 해야 하지만, Unchecked exception은 명시적으로 하지 않아도 된다는 차이점이 있습니다. 12 |
13 | 14 | ## :nerd_face: What I study 15 | ### 1. Checked Exception 16 | - ***반드시 명시적으로 예외 처리를 해야한다.*** 17 | - **try-catch문**을 사용하여 예외 처리를 하거나, **throw**를 통해서 호출한 메소드로 예외를 던져야 한다. 18 | - 트랜잭션 rollback이 되지 않고 commit까지 완료된다. 19 | - Exception을 상속 받는 하위 클래스 중, Runtime Exception을 제외한 모든 예외 클래스 20 |
21 | 22 | ### 2. Unchecked Exception 23 | - ***명시적으로 예외 처리를 강제하지 않는다.*** 24 | - 실행 중에 발생할 수 있는 예외이다. 25 | - 트랜잭션 rollback이 진행된다. 26 | - Runtime Exception을 상속받는 모든 예외 클래스 27 |
28 | 29 | ||Checked Exception|Unchecked Exception| 30 | |:---:|:---:|:---:| 31 | |처리 여부|필수|Optional| 32 | |확인시점|컴파일 단계|실행 단계| 33 | |Rollback 여부|X|O| 34 | |ex|IO Exception, SQL Exception|NullPointer Exception, IllegalArgument Exception| 35 | 36 |

37 | 38 | ### 3. Error 39 | - 시스템 레벨에서 발생하는 심각한 수준의 오류를 의미한다. 40 | - 개발자가 예측하기 쉽지 않으며, 직접 처리할 수 있는 방법도 없다. 41 | - 그러므로 개발 시 예외 처리에 신경쓰지 않아도 된다. 42 | - ex. OutOfMemory Error, StackOverFlow Error -------------------------------------------------------------------------------- /java/jsy/java.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjuyeon/Tech-Interview-Study/f5f4978becafb443db02eee145e58f6a1618dfa2/java/jsy/java.png -------------------------------------------------------------------------------- /java/jsy/jdbc.md: -------------------------------------------------------------------------------- 1 | # :question: JDBC 2 | 3 | #### reference 4 | https://devlog-wjdrbs96.tistory.com/139
5 | https://shs2810.tistory.com/18 6 |
7 | 8 | ## Question 9 | 1. JDBC란 무엇인가요? 10 | - JDBC는 데이터베이스와 연결되어 데이터를 주고 받을 수 있도록 하는 API 입니다. 11 | - JDBC의 특징으로는 데이터베이스의 종류에 종속되지 않는다는 점과 응용프로그램과 DBMS 간의 통신을 중간에서 변역해주는 역할을 한다는 것입니다. 12 |
13 | 14 | ## :nerd_face: What I study 15 | 16 | ### JDBC 17 | - Java DataBase Connectivity 18 | - 자바 언어로 데이터베이스와 연결되어 데이터를 주고 받을 수 있도록 사용되는 라이브러리(API) 19 | - DBMS에 종속되지 않는 관련 API를 제공한다. 20 | - 데이터베이스 종류에 상관없다. 21 | - 응용프로그램과 DBMS간의 통신을 중간에서 번역해주는 역할을 한다. 22 | 23 |
24 | 25 | ![jdbc](https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Foed9z%2FbtqDjGqc8Hh%2FfTNTE08lq5mhxWQecAi5k0%2Fimg.png) 26 | 27 | - JDBC Driver: 각 DBMS에서 제공하는 라이브러리 압축파일 28 | - JDBC API : 다양한 클래스와 인터페이스로 구성된 패키지 `java.sql`로 구성되어 있다. 29 | - 데이터베이스를 연결하여 테이블 형태의 자료를 참조 30 | - SQL문 질의 31 | - SQL문 결과 처리 32 | - 구체적인 메소드 설명 [https://shs2810.tistory.com/18] 33 | 34 |

35 | 36 | ### JDBC를 이용한 데이터베이스 연동 과정 37 | ![connection](https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOvHi2%2FbtqDibLdLep%2FRLGbbmViRkyd4jkfDKkGw1%2Fimg.png) 38 | 39 | 1. JDBC 드라이버 Load 40 | - 데이터베이스와의 연결을 위해 드라이버를 로딩한다. 41 | 2. Connection 객체 생성 42 | - 데이터베이스와의 연결을 위해 URL과 계정 정보가 필요하다. 43 | 3. Statement 객체 생성 44 | - SQL 구문을 정의하고, 쿼리 전송 전에 변수를 세팅한다. 45 | 4. Query 수행 46 | - executeUpdate 47 | - SQL Query문이 INSERT, DELETE, UPDATE인 경우 48 | - 반환 타입은 int 49 | - executeQuery 50 | - SQL Query문이 SELECT인 경우 51 | - 반환 타입은 ResultSet 52 | 5. Resultset 객체로부터 데이터 추출 (SELECT인 경우) 53 | - 데이터베이스 조회 결과집합에 대한 표준 54 | - `next()`를 통해 DB의 테이블 안에 row를 조회한다. 55 | - `getString()`, `getInt()` 등을 통해 한 행의 특정 column을 조회한다. 56 | 6. Close (Resultset, Statement, Connection) 57 | - 열어줬던 객체들을 하나씩 닫아준다. -------------------------------------------------------------------------------- /java/jsy/lib.md: -------------------------------------------------------------------------------- 1 | # :question: JAVA 의 라이브러리 2 | 3 | #### reference 4 | https://snd-snd.tistory.com/18
5 | https://milkoon1.tistory.com/44 6 |
7 | 8 | ## Question 9 | 1. [자바 컬렉션에 대해서 설명해주세요.](#1-collection-framework) 10 | - 자바에서 컬렉션이란 객체나 데이터를 효율적으로 관리할 수 있는 방법을 모아둔 라이브러리입니다. 컬렉션 프레임워크는 크게 두개로 나눌 수 있는데, 순서나 집합적인 저장 공간의 명세를 나타내는 Collection 인터페이스와 key와 value로 데이터를 핸들링하는 명세를 정의하는 Map 인터페이스로 나눌 수 있습니다. 11 |

12 | 13 | 2. [컬렉션 프레임워크에 속한 List, Set, Map에 대해 설명해주세요.](#1-3-list-vs-set-vs-map) 14 | - 3개의 인터페이스 모두 하나 이상의 element를 저장한다는 공통점이 있습니다. 15 | - List는 순서가 존재하고 중복이 허용됩니다. Set은 집합적인 개념을 가지며, 순서가 없고 Element의 중복은 허용되지 않습니다. Map은 (key,value) 쌍으로 이루어져 있으며 순서가 없으며 key값은 중복될 수 없습니다. 16 |

17 | 18 | 3. [정규 표현식에 대해 설명해주세요.]() 19 | 20 |
21 | 22 | ## :nerd_face: What I study 23 | ### 1. Collection Framework 24 | ![collection](https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc3GrCd%2FbtqxXaEtic3%2FKgMYKbNC4JUmwkLUyswAN0%2Fimg.png) 25 | - 객체나 데이터를 효율적으로 관리(추가, 삭제, 검색)할 수 있는 표준화된 방법을 모아둔 클래스의 집합/라이브러리 26 | - 컬렉션을 쉽고 편리하게 다룰 수 있는 다양한 인터페이스와 클래스를 제공한다. 27 | - 배열의 단점을 보완해준다. 28 | - ```java.util``` 패키지에 포함되어 있다. 29 | - Map과 Collection 인터페이스가 존재한다. 30 | - 사용목적에 따라 Map, List, Set 각각의 하위 구현체를 선택한다. 31 | 32 | ![collection2](https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSkdDj%2FbtqC3reXSMS%2FK1i0B8yqXCGxRP9Frhps20%2Fimg.jpg) 33 | ### 1-1) Collection 34 | #### List 35 | - 순서가 있는 Collection 36 | - 데이터를 중복해서 포함할 수 있다. 37 | - 순차적으로 대량의 데이터를 접근하거나 입력할 때 사용된다. 38 | 39 |
40 | - LinkedList와 ArrayList의 차이점 41 | 42 | ||LinkedList|ArrayList| 43 | |:---:|:---:|:---:| 44 | |데이터 관리|특정 데이터 타입의 배열|노드에 데이터를 저장하고 앞 뒤 노드의 주소값을 연결| 45 | |삽입/삭제|O(1)|O(n)| 46 | |검색|O(n)|O(1)| 47 | 48 |
49 | - Vector와 ArrayList의 차이점 50 | 51 | ||Vector|ArrayList| 52 | |:---:|:---:|:---:| 53 | |동기화 처리|O|X| 54 | |스레드 접근|한 번에 하나의 스레드|한 번에 여러 개 스레드| 55 | |속도|느림|빠름 (멀티스레드 상황 제외)| 56 | 57 | #### Set 58 | - 집합적인 개념의 Collection 59 | - 순서가 없다. 60 | - 데이터를 중복할 수 없다. 61 | - 순차적인 접근을 위해 Iterator를 사용한다. 62 | 63 |
64 | 65 | ### 1-2) Map 66 | - 검색할 수 있는 인터페이스 67 | - 순서가 없다. 68 | - 많은 양의 데이터에서 원하는 특정 데이터에 접근할 때 사용한다. 69 | - 데이터를 삽입할 때, (key-value) 쌍으로 삽입된다. 70 | - 검색 시에는, key를 이용해서 value를 얻을 수 있다. 71 | - 동일한 데이터를 key로 사용할 수 없다. 72 | 73 |
74 | - HashMap과 HashTable의 차이점 75 | 76 | - key, value로 데이터를 관리하고 key를 이용하여 데이터를 검색한다. 77 | 78 | ||HashMap|HashTable| 79 | |:---:|:---:|:---:| 80 | |동기화 여부|X|O| 81 | |멀티 스레드 세이프|X|O| 82 | |속도|빠름|느림 (동기화 처리 비용 때문)| 83 |
84 | 85 | TreeMap과 TreeSet의 차이점 86 | - 큰 차이점은 Map과 Set의 차이이다. 87 | - 둘다 Red Black Tree를 기반으로 이루어져 있다. 88 | - cf) Red Black Tree: balanced binary search tree, BST에서 발생하는 불균형 문제를 색깔을 통해 자체적으로 해결한다. 89 | 90 |
91 | 92 | ### 1-3) List vs Set vs Map 93 | 94 | ||List|Set|Map| 95 | |:---:|:---:|:---:|:---:| 96 | |특징|순서 O, 중복 O|순서X, 중복X|순서X, key에 대한 중복X| 97 | |장점|가변적인 자료구조 사이즈|빠른 속도|빠른 속도| 98 | |단점|원하는 데이터가 뒤쪽에 위치하면 속도가 느림|정렬하려면 별도의 처리가 필요|key의 검색 속도가 검색 속도를 좌우함| 99 | 100 |

-------------------------------------------------------------------------------- /java/jsy/oop.md: -------------------------------------------------------------------------------- 1 | # :question: 객체지향 (OOP) 2 | 3 | #### reference 4 | https://jeong-pro.tistory.com/95
5 | https://youngjinmo.github.io/2021/04/principles-of-oop/
6 | https://victorydntmd.tistory.com/291 7 |
8 | 9 | ## Question 10 | 1. [객체지향에 대해서 설명하세요.](#객체지향-oop) 11 | - 프로그래밍에서 필요한 **데이터를 추상화**시켜 **상태와 행위를 가진 객체를 만들고**, **그 객체들 간의 유기적인 상호작용을 통해 로직을 구성**하는 프로그래밍 방법입니다. 12 |

13 | 14 | 2. [객체지향의 SOLID 원칙에 대해 설명해주세요.](#3-oop의-5가지-설계-원칙-solid) 15 | - 단일 책임 원칙 S, 개방 폐쇄 원칙 O, 리스코프 치환 원칙 L, 인터페이스 분리 원칙 I, 의존관계 역전 원칙 D를 말합니다. 16 | - 단일 책임 원칙은 **클래스는 단 하나의 목적을 가져야 한다는 원칙**이고, 개방 폐쇄 원칙은 **기존의 코드를 변경하지 않으면서, 기능을 추가할 수 있도록 해야한다는 원칙**입니다. 리스코프 치환 원칙은 **상위 타입의 객체를 하위 타입으로 바꾸더라도 프로그램이 잘 작동되어야 한다는 원칙**이고, 인터페이스 분리 원칙은 **사용하지 않는 메소드에 의존하지 않도록 인터페이스를 분리해야 한다는 원칙**입니다. 마지막으로 의존관계 역전 원칙은 **객체들이 서로 정보를 주고 받을 때, 추상화에 의존해야 하며, 구체화에 의존해서는 안된다는 원칙**입니다. 17 | - 이 원칙을 잘 사용하면, 시간이 지나도 유지보수와 확장이 쉬운 소프트웨어를 만들 수 있습니다. 18 | 19 |
20 | 21 | ## :nerd_face: What I study 22 | ### 객체지향 (OOP) 23 | - 프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법 24 | 25 | #### 1) 장점 26 | - 코드 재사용이 용이하다. 27 | - 남이 만든 클래스를 가져와서 이용할 수 있고, 상속을 통해 확장해서 사용할 수 있다. 28 | - 유지보수가 쉽다. 29 | - 수정해야할 부분이 클래스 내부에 멤버 변수 혹은 메서드로 있기 때문에 해당 부분만 수정하면 된다. 30 | - 대형 프로젝트에 적합하다. 31 | - 클래스 단위로 모듈화시켜서 개발할 수 있으므로 업무 분담이 쉽다. 32 | 33 | #### 2) 단점 34 | - 처리속도가 상대적으로 느리다. 35 | - 객체 간의 정보 교환이 모두 메세지 교환을 통해 일어나므로 실행 시스템에 많은 오버헤드가 발생한다. 36 | - 하드웨어의 발전으로 위의 단점은 어느정도 해결되었다. 37 | - 객체가 많으면 용량이 커질 수 있다. 38 | - 프로그램을 설계할 때 많은 시간과 노력이 필요하다. 39 | 40 | #### 3) OOP의 5가지 설계 원칙 (SOLID) 41 | - ***SRP(Single Responsibility Principle, 단일 책임 원칙)*** 42 | - 클래스는 단 하나의 목적을 가져야 하며, 클래스를 변경하는 이유는 단 하나의 이유여야 한다. 43 | - 시스템에 변화가 생기더라도 클래스가 받는 영향을 최소화 할 수 있다. 44 | - ***OCP(Open-Closed Principle, 개방 폐쇄 원칙)*** 45 | - 클래스는 확장에 열려 있고, 변경에는 닫혀 있어야 한다. 46 | - 새로운 변경사항이 발생했을 때 유연하게 코드를 추가 또는 수정할 수 있어야 한다. 47 | - ***LSP(Liskov Substitution Principle, 리스코프 치환 원칙)*** 48 | - 상위 타입의 객체를 하위 타입으로 바꾸어도 프로그램은 일관되게 동작되어야 한다. 49 | - 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다. 50 | - ***ISP(Interface Segragation Principle, 인터페이스 분리 원칙)*** 51 | - 클라이언트는 사용하지 않는 메소드에 의존하지 않도록 인터페이스를 분리해야 한다. 52 | - 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다. 53 | - ***DIP(Dependency Inversion Principle, 의존관계 역전 원칙)*** 54 | - 클라이언트는 추상화(인터페이스)에 의존해야 하며, 구체화(구현된 클래스)에 의존해서는 안된다. 55 | - 객체들이 서로 정보를 주고 받을 때 의존 관계가 형성되는데, 이때 객체들은 나름대로의 원칙을 가지고 정보를 주고 받아야 한다. 56 | 57 | #### 4) OOP의 특징 58 | - 캡슐화 59 | - 객체가 독립적으로 역할을 할 수 있도록 연관 있는 데이터와 기능을 하나로 묶어 관리하는 것을 의미한다. 60 | - 실제로 구현되는 부분을 외부에 드러나지 않도록 하여 정보를 은닉할 수 있다. 61 | - 데이터를 보이지 않고 외부와 상호작용을 할 때는 메소드를 이용하여 통신을 한다. 62 | - 상속 63 | - 하나의 클래스가 가진 특징을 다른 클래스가 그대로 물려받는 것을 의미한다. 64 | - 기존 코드를 재활용하여 사용함으로써 새로운 클래스를 생성하는 것이다. 65 | - 추상화 66 | - 객체들의 공통적인 특징(기능, 속성)을 도출하는 것을 의미한다. 67 | - 인터페이스로 공통적인 특성들을 묶어 표현하는 것이다. 68 | - 다형성 69 | - 다른 방법으로 동작하는 함수를 동일한 이름으로 호출하는 것을 의미한다. 70 | - ex) 오버라이딩(Overriding), 오버로딩(Overloading) 71 | 1. 오버라이딩 72 | - 부모클래스의 메서드와 같은 이름, 매개변수를 재정의하는 것 73 | 2. 오버로딩 74 | - 같은 이름의 함수를 여러개 정의하고, 매개변수의 타입과 개수를 다르게 하여 매개변수에 따라 다르게 호출할 수 있게 하는 것 75 | 76 | ### cf) 절차지향 77 | - 위에서 아래로 순차적으로 처리가 중요한 기법 78 | - 컴퓨터의 실제 처리 구조와 유사해서 속도가 빠르다. 79 | - 순서가 중요하다. 순서가 바뀌면 에러가 나거나 결과가 동일하지 않을 수 있다. -------------------------------------------------------------------------------- /java/jsy/pattern.md: -------------------------------------------------------------------------------- 1 | # :question: JAVA 의 디자인 패턴 2 | 3 | #### reference 4 |
5 | 6 | ## Question 7 | 1. [싱글톤 패턴이란 무엇인지 설명해주세요.]() 8 |
9 | 10 | ## :nerd_face: What I study 11 | ### Singleton pattern -------------------------------------------------------------------------------- /java/jsy/string.md: -------------------------------------------------------------------------------- 1 | # :question: JAVA 의 String 2 | 3 | #### reference 4 | https://github.com/WeareSoft/tech-interview/blob/master/contents/java.md#java%EC%97%90%EC%84%9C-%EC%99%80-equals%EC%9D%98-%EC%B0%A8%EC%9D%B4 5 |
6 | 7 | ## Question 8 | 1. ['=='과 'equals()'의 차이에 대해 설명하세요.](#1-문자열-비교) 9 | - 동등연산자 ==는 두 객체가 같은 메모리 공간을 가리키는지 확인합니다. 즉, 비교하고자 하는 대상의 주소값을 비교합니다. 10 | - 객체 비교 메소드 equals()는 두 객체의 값이 같은지 확인합니다. 즉, 비교하고자 하는 대상의 내용 자체를 비교합니다. 11 |

12 | 13 | 2. [String, StringBuffer, StringBuilder의 차이를 설명하세요.]() 14 |

15 | 16 | 3. [String형 객체를 ""로 만들었을 때와 new 키워드를 이용해서 만들었을 때의 차이점은?]() 17 |
18 | 19 | ## :nerd_face: What I study 20 | ### 1. 문자열 비교 21 | #### 1-1) == 연산자 22 | - 동등 연산자 23 | - 두 객체가 같은 메모리 공간을 가리키는지 확인하는 **참조 비교**를 한다. 24 | - 비교하고자 하는 대상의 **주소값**을 비교한다. 25 | - boolean type으로 반환한다. 26 | - 모든 원시 타입에 대해 적용할 수 있다. 27 | #### 1-2) equals() 메소드 28 | - 객체 비교 메소드 29 | - 두 객체의 값이 같은지 확인하는 **내용 비교**를 한다. 30 | - 비교하고자 하는 대상의 **내용 자체**를 비교한다. 31 | - boolean type으로 반환한다. 32 | - 원시 타입에는 적용할 수 없다. 33 | 34 | ```java 35 | // Thread 객체 36 | Thread t1 = new Thread(); 37 | Thread t2 = new Thread(); // 새로운 객체 생성. 즉, s1과 다른 객체. 38 | Thread t3 = t1; // 같은 대상을 가리킨다. 39 | // String 객체 40 | String s1 = new String("JAVA"); 41 | String s2 = new String("JAVA"); 42 | String s3 = "JAVA"; 43 | String s4 = "JAVA"; 44 | 45 | System.out.println(t1 == t3); // true 46 | System.out.println(t1 == t2); // false(서로 다른 객체이므로 별도의 주소를 갖는다.) 47 | System.out.println(s1 == s2); // false(서로 다른 객체) 48 | System.out.println(s2 == s3); // false(서로 다른 객체) 49 | System.out.println(s3 == s4); // true 50 | 51 | System.out.println(t1.equals(t2)); // false 52 | System.out.println(s1.equals(s2)); // true(모두 "JAVA"라는 동일한 내용을 갖는다.) 53 | System.out.println(s1.equals(s3)); // true 54 | System.out.println(s3.equals(s4)); // true 55 | ``` -------------------------------------------------------------------------------- /java/kkw/CallBy.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | ## `Call By Value` 5 | - 메소드 호출 시에 사용되는 인자의 메모리에 저장되어 있는 값(Value)를 복사하여 보내는 방법 6 | - Primitive Type 들은 Call By Value로 넘어간다. 7 | 8 | ``` 9 | 10 | int a = 10 11 | plus(a); 12 | System.out.println(a); 13 | 14 | void plus(int a){ 15 | a += 10; 16 | } 17 | 18 | 결과 : 10 19 | //값만 복사될 뿐 원본 인자에는 영향을 주지 못한다. 20 | 21 | ``` 22 | 23 | 24 | ## `Call By Reference` 25 | - 메소드 호출 시에 사용되는 인자 값의 메모리에 저장된 주소(Address)값을 복사하여 보낸다. 26 | - Reference Type 들은 Call By Reference로 넘어간다 27 | 28 | ``` 29 | int a[] = {10}; 30 | a[0] = 10; 31 | plus(a); 32 | System.out.println(a); 33 | 34 | void plus(int[] a){ 35 | a[0] += 10; 36 | } 37 | 38 | 결과 : 20 39 | //주소 값이 넘어갔기에 원본 인자 값이 변한다. 40 | ``` 41 | 42 | ## 그렇다면 String 은 ? 43 | - JAVA의 공식 API 문서에 따르면 primitive type은 `boolean, byte, short, int, long, char, floag, double`으로 명시하고 있다. 44 | - 그렇다면 String을 매개변수로 넘길경우 Call-By-Reference 이므로 값이 변경되어야 한다. 45 | 46 | ``` 47 | String a = "hello"; 48 | test(a); 49 | System.out.println(a); 50 | 51 | void test(String a){ 52 | a = "world"; 53 | } 54 | 55 | 결과 : hello 56 | ``` 57 | 58 | - 하지만 실제로 테스트 해보면 원본 값에 전혀 영향을 끼치지 못한다. 59 | 60 | ## 왜 그런걸까? 61 | - 자바는 엄밀하게 말하면 항상 `Call By Value` 이다. 62 | - 다음을 보자 63 | ``` 64 | class Node{ 65 | int num; 66 | Node(int num){ 67 | this.num = num; 68 | } 69 | 70 | void test(Node node){ 71 | node = new Node(20); 72 | } 73 | 74 | main(){ 75 | 76 | Node node = new Node(10); 77 | test(node); 78 | System.out.println(node.num); 79 | //결과는? 80 | } 81 | } 82 | ``` 83 | - `Call By Reference` 라면 결과값이 `20`이 나올테지만, 실제로 돌려보면 결과값은 `10`이 출력된다 84 | - 이는 Java가 Reference Type 들의 객체를 전달하는게 아니라 그 변수가 가지고 있는 주소 값을 복사하여 전달하기 때문이다. 85 | - 우리는 Stack에게 새로운 주소를 주는 Object 방식으로는 원본 값에 어떠한 변화도 줄 수 없다는 뜻이다. 86 | 87 | ## 그래도 주소값이 전달되니깐 수정할 수 있지않아요? 88 | - String의 특징 중 하나는 불변성(immutable)이다. 89 | - String 인스턴스를 생성하게 되면, JVM은 Stack에 변수의 메모리를 할당하고 Heap 영역 내부에 String Pool 을 가르키고 있게 된다. 90 | 91 | ![메모리](https://user-images.githubusercontent.com/43779730/130810447-f377b8b1-0eaa-49a2-95ca-17d5d3d13783.png) 92 | 93 | - JAVA에서는 String 값이 수정될 경우, String Pool에 새로 할당하여 그 주소값을 반환해준다. 94 | - 그렇다는 것은 매개변수로 넘어간 String은 결국 원본 String의 Stack 영역이 가르키고 있는 주소 값을 복사했을 뿐이므로, 메소드 내 지역변수 String의 Stack 영역의 참조값을 수정하여도 원본 String에는 아무 영향이 없는 것이다. 95 | -------------------------------------------------------------------------------- /java/kkw/OOP.md: -------------------------------------------------------------------------------- 1 | # 객체지향 프로그래밍(Object-Oriented Programming) 2 | 3 | ## 객체지향 프로그래밍 4 | - 프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법 5 | 6 | 7 | ## 객체지향 vs 절차지향 8 | - 객체지향 9 | - 장점 10 | - 코드 재사용성이 용이 11 | - 개발(코딩)이 간단 12 | - 유지보수가 쉬움 13 | - 대규모 프로젝트에 적합 14 | - 단점 15 | - 처리 속도가 느림 16 | - 객체에 따른 용량이 증가함 17 | - 설계 단계에 시간이 많이 소요됨 18 | - 절차지향 19 | - 장점 20 | - 처리 속도가 빠름 21 | - 초기 프로그래밍 언어로 컴퓨터의 처리구조와 비슷해 실행 속도가 빠름 22 | - 단점 23 | - 유지보수가 어려움 24 | - 대규모 프로젝트에 부적합 25 | - 프로그램 분석이 어려움 26 | 27 | 28 | ## 클래스와 인스턴스 29 | - 클래스 30 | - 객체를 만들어 내기 위한 설계도 혹은 틀 31 | - 집단에 속하는 속성(attribute)와 행위(behavior)를 변수와 메소드로 정의한 것 32 | - 객체 33 | - 소프트웨어 세계에서 구현할 대상 34 | - 클래스에 선언된 모양 그대로 생성된 실체 35 | - 클래스의 인스턴스라고도 부름 36 | - OOP의 관점에서 클래스의 타입으로 선언되었을 때 '객체'라고 부름 37 | - 객체는 모든 인스턴스를 대표하는 포괄적인 의미를 가짐 38 | - 인스턴스 39 | - 클래스에서 정의한 것을 토대로 실제 메모리상에 할당된 것 40 | - 인스턴스는 어떤 원본(추상적인 개념)으로부터 생성된 복제본을 의미 41 | - 추상적인 개념(또는 명세)과 구체적인 객체 사이의 관계 에 초점을 맞출 경우에 사용 42 | 43 | ## 추상화(Abstraction) 44 | - 객체들의 공통적인 특징(기능, 속성)을 도출하는 것 45 | - 객체지향 관점에서는 클래스를 정의하는 것을 의미 46 | - abstract 클래스와 abstract 메소드와는 다른 이야기 47 | 48 | ## 캡슐화(Encapsulation) 49 | - 객체의 속성과 메소드를 하나로 묶고, 실제 구현 내용 일부를 외부에 감추어 은닉하는 것 50 | - JAVA의 접근 지정자 51 | - Public : 접근 제한 없음 52 | - Protected : 동일 패키지와 상속 받은 클래스 내부에서만 접근 가능 53 | - default : 동일 패키지 내에서만 접근 가능 54 | - private : 동일 클래스 내에서만 가능 55 | 56 | ## 상속(Inheritance) 57 | - 부모 클래스의 속성과 기능을 이어받아 사용하는 것을 말함 58 | 59 | ## 다형성(Polymorphism) 60 | - 하나의 클래스나 메소드가 상황에 따라 다른 의미로 해석될 수 있는 것 61 | - 오버라이딩(Overriding) : 하위 클래스가 상위 클래스의 메소드를 재정의하여 사용하는 것 62 | - 오버로딩(Overloading) : 같은 이름의 메소드가 다양한 입력을 처리할 수 있도록 하는 것 63 | -------------------------------------------------------------------------------- /java/kkw/Regular_Expression.md: -------------------------------------------------------------------------------- 1 | ## 정규 표현식(Regular Expression) 2 | - 특정한 규칙을 가진 문자열의 집합을 표현하는데 사용하는 형식 언어 3 | 4 | 5 | 6 | ## 자바의 정규표현식 사용법 7 | - `java.util.regex` 의 `Pattern` 클래스와 `Matcher` 클래스를 이용하여 정규 표현식을 사용 가능 8 | - String의 matches 함수를 이용하여 사용 가능 9 | - 아래와 같은 방법으로 정규표현식과 대상 문자열이 일치하는지 확인 가능 10 | 11 | ```java 12 | Pattern p = Pattern.compile("a*b"); 13 | Matcher m = p.matcher("aaaab"); 14 | boolean b = m.matches(); 15 | ``` 16 | 17 | ```java 18 | boolean b = Pattern.matches("a*b", "aaaab") 19 | ``` 20 | 21 | ```java 22 | String str = "aaaab"; 23 | String regex = "a*b"; 24 | 25 | boolean b = str.matches(regex); 26 | ``` 27 | 28 | ### Pattern 클래스 29 | - 우선 순위 30 | 1. Literal escape : \x 31 | 2. Grouping [...] 32 | 3. Range a-z 33 | 4. Union [a-e][i-u] 34 | 5. Intersection [a-z&&[aeiou]] 35 | - compile(String regex) : 주어진 정규표현식(regex)으로 패턴을 만듬 36 | - matcher(CharSequense input) : 대상 문자열(input)이 패턴과 일치할 경우 true를 반환 37 | - pattern() : 만들어진 패턴을 String으로 반환함 38 | 39 | 40 | ### Matcher 클래스 41 | - 대상 문자열의 패턴을 해석하고, 주어진 패턴과 일치하는지 판별할 때 주로 사용 42 | - matches() : 대상 문자열과 패턴이 일치할 경우 true를 반환 43 | - find() : 대상 문자열과 패턴이 일치하는 경우 true를 반환하고, 그 위치로 이동 44 | - start() : 매칭되는 문자열 시작위치를 반환 45 | - end() : 매칭되는 문자열 끝 다음 위치를 반환 46 | - group() : 매칭된 부분을 반환 47 | 48 | ### 정규 표현식 문법 49 | - ![1_agUeLvuA3-9NcX12_vI-hg](https://user-images.githubusercontent.com/43779730/131688858-5a6e1b05-ab52-4486-ac7d-4b2e7865762d.png) 50 | 51 | 52 | - 53 | |횟수|0|1|2+| 54 | |:--:|:--:|:--:|:--:| 55 | |?|O|O|X| 56 | |*|O|O|O| 57 | |+|X|O|O| 58 | 59 | - Greedy : 매칭을 위해서 입력된 문자열 전체를 읽어서 확인하고 뒤에서 한자씩 빼면서 끝까지 확인합니다. 60 | - Reluctant : 입력된 문자열에서 한글자씩 확인해 나갑니다. 마지막에 확인하는 것은 전체 문자열 입니다. 61 | - Possessive : 입력된 전체 문자열을 확인합니다. Greedy와 달리 뒤에서 빼면서 확인하지 않습니다. 62 | - |Greedy|Reluctant|Possessive|Meaning| 63 | |:--:|:--:|:--:|:--:| 64 | |x?|x??|x?+|x, 1번 혹은 0번| 65 | |x*|x*?|x*+|x, 0번 이상| 66 | |x+|x+?|x++|x, 1번 이상| 67 | |x{n}|x{n}?|x{n}+|x, 정확하게 n번 반복| 68 | |x{n,}|x{n,}?|x{n,}+|x, 적어도 n번 반복| 69 | |x{n,m}|x{n,m}?|x{n,m}+|x, 적어도 n번 이상 m번 이하로 반복| 70 | 71 | 72 | 73 | ### 참고 사이트 74 | - https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html#sum 75 | - https://offbyone.tistory.com/400 -------------------------------------------------------------------------------- /java/kkw/String.md: -------------------------------------------------------------------------------- 1 | ## String 2 | - 불변성(immutable) 3 | - 생성 시 String pool 이라는 공간에 생성, 생성되면 그 인스턴스의 메모리 공간은 절대 변하지 않음 4 | - `+` 연산이나 `String.concat()` 을 이용해서 문자열 값에 변화를 줘도 메모리 공간 내의 값이 변하는게 아니라 새로운 메모리를 할당받아 새로운 String 클래스 객체를 할당받는 것 -> 연산마다 오버헤드가 발생함 5 | - 위의 경우 GC에 의해 기존의 문자열이 제거되어야 함 (언제 제거될 지 모름) 6 | - 대신, 조회의 경우 타 클래스보다 빠르게 읽을 수 있음 7 | 8 | 9 | ## StringBuilder, 10 | - 가변성(mutable) 11 | - 문자열 연산이 자주 일어날 때 성능이 좋음 12 | - StringBuilder는 동기화가 불가능 13 | - 싱글스레드나 동기화가 필요없는 멀티 스레드 환경에서 유리 14 | 15 | ## StringBuffer 16 | - 가변성(mutable) 17 | - 문자열 연산이 자주 일어날 때 성능이 좋음 18 | - 동기화가 가능함 -> Thread-safe함 19 | - 멀티 스레드 환경에서 유리 20 | 21 | ![이미지](https://t1.daumcdn.net/cfile/tistory/99BE23375E2F133722) -------------------------------------------------------------------------------- /java/kkw/serialization.md: -------------------------------------------------------------------------------- 1 | # 직렬화(Serialization) 2 | 3 | ## 직렬화(Serialization)란? 4 | - 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 Byte 형태로 데이터 변환하는 기술 5 | - 시스템적으로 이야기하면 JVM의 메모리에 상주(힙 or 스택)되어 있는 데이터를 Byte형태로 변환하는 기술과 직렬화된 바이트 형태의 데이털르 객체로 변환해서 JVM으로 상주시키는 형태를 같이 이야기함 6 | 7 | ## 직렬화 조건 8 | - 자바 `기본(Primitive)타입`과 `java.io.Serializable` 인터페이스를 상속받은 `객체`는 직렬화 할 수 있는 기본 조건을 가짐 9 | - `java.io.ObjectOutputStream`를 이용하여 직렬화함 10 | 11 | ## 역직렬화 조건 12 | - 직렬화 대상이 도니 객체의 클래스가 클래스 패스에 존재해야 하며 import 되어 있어야함 13 | - 자바 직렬화 대상 객체는 동일한 `serialVersionUID`를 가지고 있어야함 14 | ``` 15 | private static final long serialVersionUID = 1L; 16 | ``` 17 | - `java.io.ObjectInputStream` 를 가지고 역직렬화함 18 | 19 | ## 직렬화 방법 20 | - 다량의 데이터 직렬화 시 CSV 구조가 많이 쓰이고, 구조적인 데이터는 이전에는 XML 형태를 많이 썻지만 최근에는 JSON 형태로 많이 쓰고 있음 21 | - 문자열 형태 22 | - CSV 23 | - 데이터를 표현하는 방법 중 가장 많이 사용되는 방법으로 콤마(,) 기준으로 데이터를 구분 24 | - JSON 25 | - 최근에 가장 많이 사용됨 26 | - 자바스크립트에서 쉽게 사용이 가능 27 | - 다른 데이터 방식에 비해 오버헤드가 적음 28 | 29 | 30 | 31 | 32 | ## 자바의 직렬화 사용하는 이유 33 | - 자바 직렬화 형태의 데이터 교환은 자바 시스템 간의 데이터 교환을 위해서 사용 34 | - 자바 직렬화는 자바 시스템에 최적화 되어 있어 성능이 우수함 35 | - 복잡한 데이터 구조의 클래스의 객체도 직렬화 기본 조건만 지키면 큰 작업 없이 바로 직렬화 및 역직렬화가 가능 36 | - 데이터 타입이 자동으로 맞춰지기에 관련 부분을 신경 안 써주어도 됨 37 | 38 | ## 직렬화 사용 시 주의해야할 점 39 | - 외부 저장소로 저장되는 데이터는 짧은 만료시간의 데이터를 제외하고 자바 직렬화 사용을 지양한다 -> 호환성 문제가 발생할 수 있음 40 | - 역직렬화시 반드시 예외가 생긴다는 것을 생각하고 개발 하여야함 41 | - 클래스 구조가 변경될 시 에러가 발생할 수 있음 -> serialVersionUID 값을 관리해주어 방지함 42 | - 멤버 변수명은 같은데 타입이 변경되는 경우(int -> long) 에러가 발생 -> 타입에 대해 엄격함 43 | - serialVersionUID의 값은 개발 시 직접 관리하도록 함 44 | - 멤버 변수 타입 변경을 지양하도록 함 45 | - 개발자가 직접 컨트롤하기 힘든 객체(프레임워크, 라이브러리에서 제공하는 객체)는 직렬화를 지양함 46 | - **역직렬 화가 되지 않을 때와 같은 예외처리는 기본적으로 해주기** 47 | - 자바 직렬화시에 기본적으로 타입에 대한 정보 등 클래스의 메타 정보도 가지고 있기 때문에 상대적으로 다른 포맷에 비해서 용량이 큼 48 | 49 | ## 결론 50 | - 장점도 많지만 단점도 많음 -> 신경을 많이 써주어야함 51 | 1. 외부 저장소로 저장되는 데이터는 짧은 만료 시간의 데이터를 제외하고 자바 직렬화를 사용을 지양 52 | 2. 역직렬화시 반드시 예외가 발생하는 것을 염두하고 개발 53 | 3. 자주 변경되는 데이터는 직렬화를 사용하지 않음 54 | 4. 긴 만료 시간을 가지는 데이터는 JSON 등 다른 포맷을 사용하여 저장 55 | 56 | 57 | ## 언제 어디서 사용하는가? 58 | - JVM 메모리에서만 상주되어 있는 객체 데이터를 그대로 영속화(Persistence)가 필요할 때 사용 59 | - 시스템이 종료 되어도 없어지지 않으며 영속화된 데이터 이기에 네트워크로 전송도 가능함 60 | - 서블릿 세션 61 | - 캐시 62 | - 자바 RMI(Remote Method Invocation) -------------------------------------------------------------------------------- /java/kkw/singleton.md: -------------------------------------------------------------------------------- 1 | ## 싱글톤 패턴(Singleton Pattern) 2 | - 애플리케이션이 시작될 때, 어떤 클래스가 최초 한 번만 메모리를 할당하고 해당 메모리에 인스턴스를 만들어 사용하는 패턴 3 | - JAVA의 싱글톤 패턴은 private한 생성자와 static method를 사용한다는 특징이 있다. 4 | 5 | ### 사용하는 이유 6 | - 객체를 생성할 때마다 메모리 영역을 할당 받고, new를 통해 매번 새로운 객체를 생성하는 것으로 메모리 낭비를 방지할 수 있다. 7 | - 싱글톤으로 구현된 인스턴스는 static 하므로, 공유가 가능하다는 장점이 있다. 8 | - 인스턴스가 절대적으로 한 개만 존재하는 것을 보장해줄 수 있음 9 | 10 | ### 단점 11 | - 싱글톤 인스턴스가 너무 많은 작업을 하게 되면, 결합도가 높아진다는 단점이 있다 12 | -> 결합도가 높아지면 유지보수가 힘들고, 테스트 진행이 어려울 수 있음 13 | - 멀티 스레드 환경에서 동기화 처리를 해주어야함 14 | 15 | 16 | ### 구현 17 | - Eager Initialization(이른 초기화, Thread-Safe) 18 | ```Java 19 | public class Singleton{ 20 | private static Singleton instance = new Singleton(); 21 | private Singleton(){} 22 | public static Singleton getInstance(){ 23 | return instance; 24 | } 25 | } 26 | ``` 27 | - 클래스 로더에 의해 클래스가 초기화 되는 시점에서 Static binding을 통해 인스턴스를 메모리에 등록해서 사용하는 방식 28 | - 클래스 로더에 의해 클래스가 최초로 로딩될 때 객체가 생성됨 29 | 30 | 31 | - Lazy Initialization with synchronized 32 | ```Java 33 | public class Singleton { 34 | private static Singleton instance; 35 | 36 | private Singleton() {} 37 | 38 | public static synchronzied Singleton getInstance() { 39 | if(instance == null) { 40 | instance = new Singleton(); 41 | } 42 | return uniqueInstance; 43 | } 44 | } 45 | ``` 46 | - 인스턴스가 필요한 시점에 요청하여 Dynamic Binding을 통해 인스턴스를 생성하는 방식 47 | - 인스턴스가 생성여부와 상관 없이 동기화 블록을 거치기 때문에 성능이 떨어짐 48 | 49 | - Lazy Initialization (Double Checking Locking, DCL) 50 | ```JAVA 51 | public class Singleton { 52 | private volatile static Singleton instance; 53 | 54 | private Sigleton() {} 55 | 56 | public Singleton getInstance() { 57 | if(instance == null) { 58 | synchronized(Singleton.class) { 59 | if(instance == null) { 60 | instance = new Singleton(); 61 | } 62 | } 63 | } 64 | return instance; 65 | } 66 | } 67 | ``` 68 | - volatile 키워드를 사용하는 방식 69 | - volatile 사용하는 이유 70 | - 멀티 스레드 환경에서 작업을 수행하는 동안 성능 향상을 위해 Main Memory에서 읽은 변수 값을 CPU Cache에 저장하게 됨 71 | - 멀티 스레드 환경에서는 각각의 스레드가 변수 값을 읽어올 때, 각각 CPU Cache에 저장된 값이 다르기 때문에 변수값 불일치 문제가 발생할 수 있음 72 | - volatile 키워드를 사용하여 변수가 Main Memory에 있는 것이 보장되므로 위의 문제를 해결 할 수 있음 73 | 74 | Lazy Initialization (Lazy Holder) 75 | ```Java 76 | public class Singleton { 77 | private Singleton() {} 78 | 79 | private static class LazyHolder() { 80 | private static final Singleton instance = new Singleton(); 81 | } 82 | 83 | public static Singleton getInstance() { 84 | return LazyHolder.instance; 85 | } 86 | } 87 | ``` 88 | - static 영역에서 초기화를 해주지만, 객체가 필요한 시점까지 초기화를 미루는 방식 89 | - static 멤버 클래스라도, 내부 클래스에 변수가 없기 때문에 클래스 로더가 초기화할 때 초기화 하지 않고 메소드를 호출할 때 Dynamic binding 하게 됨 90 | - 위의 방법들보다 성능이 뛰어남 -------------------------------------------------------------------------------- /java/lhk/collectionsFramework.md: -------------------------------------------------------------------------------- 1 | ## Java의 데이터 타입 2 | ### primitive 데이터 타입 3 | - 정수타입 : byte, short, int, long 4 | - 소수타입 : float, double 5 | - bool 타입 : boolean 6 | - 문자타입 : char 7 | 8 | 각 primitive 별 참조타입이 존재한다. 9 | 10 | ### Wrapper 타입 11 | - 정수타입 : Byte, Short, Integer, Long 12 | - 소수타입 : Float, Double 13 | - bool 타입 : Boolean 14 | - 문자타입 : Character 15 | 16 | ## 오토박싱과 언박싱 개념 등장 17 | Collection 자료구조가 추가되면서 preimitive 타입을 Collection에 담을 수 없어 내부로 감싼 Wrapper 타입을 활용하게 되었다. 18 | JDK1.5 이전에는 기본형과 참조형 간의 연산이 불가능해서 기본형을 래퍼 클래스 객체로 만들어서 연산했다. 19 | 컴파일러가 자동으로 코드를 변환해주어 기본형과 참조형 간에 연산이 가능해졌다. 20 | 21 | 22 | ```Java 23 | // 컴파일 전 24 | int i = 100; 25 | Integer obj = new Integer(500); 26 | 27 | int sum = i + obj; 28 | ``` 29 | 30 | ```Java 31 | // 컴파일 후 32 | int i = 100; 33 | Integer obj = new Integer(500); 34 | 35 | int sum = i + obj.intValue(); 36 | ``` 37 | 38 | ## 오토박싱(autoboxing) 39 | 기본형 값을 래퍼 클래스 객체로 자동 변환해주는 것 40 | 41 | ## 언박싱(unboxing) 42 | 래퍼 클래스 객체를 기본형 값으로 자동 변환해주는 것 43 | 44 | ```Java 45 | ArrayList list = new ArrayList(); 46 | list.add(100); // 100 -> new Integer(100) [autoboxing] 47 | 48 | int value = list.get(0); // Integer(100) -> 100 [unboxing] 49 | ``` 50 | 51 | ## 오토박싱과 언박싱의 단점 52 | 컴파일러가 자동으로 지원해주어서 편리하지만, 다른 타입간의 형변환은 성능에 영향을 끼치므로 지양하는 것이 좋다. 53 | 54 | 55 | # Collections Framework 56 | 데이터 군을 다르고 표현하기 위한 단일화된 구조 (Java API 문서) 57 | 58 | ## List 59 | ### 특징 60 | - 순서가 있다. 61 | - 중복을 허용한다. 62 | 63 | ### 구현 클래스 64 | - ArrayList 65 | - 기존의 Vector를 개선한 것으로, Vector보다 사용을 권장한다. 66 | - 원하는 데이터에 접근하는데 빠르다. 67 | - 데이터 추가/삭제 시 이후 요소들도 한 칸씩 이동해줘야해서 데이터 개수가 많을수록 시간이 오래걸린다. 68 | - 크기를 변경할 수 없다. 69 | - LinkedList 70 | - 데이터 추가/삭제가 빠르다. 71 | - 데이터에 접근하는 데 느리다. 72 | - 데이터가 많을수록 접근성이 떨어진다. 73 | - Stack 74 | - Vector를 상속받아 구현 75 | - 수식 계산, 괄호검사, 웹브라우저 뒤로가기/앞으로가기 76 | - Vector 77 | 78 | 79 | ## Set 80 | ### 특징 81 | - 순서를 유지하지 않는다. 82 | - 중복을 허용하지 않는다. 83 | 84 | ### 구현 클래스 85 | - HashSet 86 | - 가장 대표적인 클래스 87 | - 중복된 용소를 추가하려고하면 false를 반환하여 실패를 알린다. 88 | - TreeSet 89 | - 이진 검색 트리 자료구조의 형태로 데이터를 저장한다. 90 | - 이진 검색 트리의 성능을 향상시킨 레드블랙트리로 구현되어 있다. 91 | 92 | 93 | ## Map 94 | ### 특징 95 | - Key와 Value의 쌍으로 이루어진 집합 96 | - 순서를 유지하지 않는다. 97 | - Key는 중복을 허용하지 않고, Value는 중복을 허용한다. 98 | 99 | ### 구현 클래스 100 | - HashMap 101 | - Hashtable보다 새로운 버전인 HashMap 사용 권장 (속도 향상) 102 | - 많은 양의 데이터를 검색하는데 뛰어난 성능을 가진다. 103 | - TreeMap 104 | - 정렬과 검색에 적합 105 | - Hashtable 106 | - 동기화를 하기때문에 속도가 느리다. 107 | - Properties 108 | - Hashtable을 상속받아서 구현 109 | 110 | 111 | ## 람다식 112 | Java 8에서 새로 추가된 것 중 하나이다. 익명 함수라고도 하며, 메서드를 하나의 식으로 표현한 것을 말한다. 113 | 모든 메서드는 클래스에 포함되어야 하므로 클래스를 만들어 객체를 생성해야 메서드를 호출할 수 있다. 114 | 하지만 람다식은 그 자체로서 메서드 역할을 수행할 수 있어서 변수처럼 다루는 것이 가능하다. 115 | 116 | ## 람다식 작성하기 117 | 118 | 1. 메서드에서 이름과 반환타입을 제거하고 매개변수 선언부와 몸통 사이에 `->` 를 추가한다. 119 | ```Java 120 | // 기존 메서드 121 | int max(int a, int b) { 122 | return a > b ? a : b; 123 | } 124 | 125 | // 람다식 표현 126 | (int a, int b) -> { return a > b ? a : b; } 127 | ``` 128 | 129 | 2. 반환값이 있거나 반환값이 없어도 괄호 안의 문장이 하나이면 괄호를 생략하고 식으로 표현할 수 있다. 130 | 131 | ```Java 132 | (int a, int b) -> a > b ? a : b 133 | ``` 134 | 135 | 3. 매개변수 타입이 추론 가능하면 생략가능하다. 대부분 생략 가능하다. 136 | ```Java 137 | (a, b) -> a > b ? a : b 138 | ``` 139 | 140 | ```Java 141 | // 기존 메서드 142 | int square(int x) { 143 | return x * x; 144 | } 145 | 146 | // 1. 이름과 반환 타입을 제거하고 식으로 표현한다. 147 | (int x) -> x * x 148 | 149 | // 2. 타입을 생략한다. 150 | (x) -> x * x 151 | 152 | // 3. 매개변수가 하나이면 괄호를 생략한다. 153 | x -> x * x 154 | ``` 155 | 156 | ## 함수형 인터페이스 157 | 람다식으로 정의된 익명 객체를 호출하기 위해서는 참조 변수가 필요하다. 이때, 참조 변수의 타입으로 람다식과 동등한 메서드가 정의된 인터페이스를 사용할 수 있다. 158 | 즉, 람다식을 다루기 위한 인터페이스를 말한다. 159 | 람다식과 인터페이스의 메서드가 1:1로 연결되기 위해, 오직 하나의 추상 메서드만 정의되어 있어야 한다는 제약이 있다. 160 | ```Java 161 | MyFunction f = (int a, int b) -> a > b ? a : b; 162 | int bif = f.max(5, 3) // 호출 163 | 164 | @FunctionalInterface 165 | interface MyFunction { 166 | public abstract int max(int a, int b); 167 | } 168 | ``` 169 | -------------------------------------------------------------------------------- /java/lhk/generic.md: -------------------------------------------------------------------------------- 1 | # 제네릭 2 | 데이터 타입을 일반화(generalize) 하는 것으로 컴파일시 데이터 타입을 체크해준다. 3 | 런타임 에러에서 발생할 수 있는 형변환 에러를 컴파일 에러로 잡을 수 있다. 4 | 5 | 제네릭을 사용하지 않는 코드와의 호환성을 위해 컴파일시, 제네릭 타입은 변환된다. 6 | 7 | 제네릭 전에는 형변환 에러가 발생하여 컴파일 에러는 나지 않지만, 런타임 에러가 발생하여 프로그램이 종료되었다. 8 | ```Java 9 | public class GenericEx { 10 | public static void main(String[] args) { 11 | ArrayList list = new ArrayList(); 12 | list.add(10); 13 | list.add("100"); // 컴파일 됨 14 | 15 | System.out.println(list): // 형변환에러 발생 16 | } 17 | } 18 | ``` 19 | 20 | 제네릭이 등장한 JDK 1.5 이후부터는 제네릭 클래스의 참조변수와 생성자에 다음과 같이 선언해주는 것이 좋다. 21 | 참조변수와 생성자에 대입한 타입은 일치해야 한다. JDK 1.7 이후부터는 생성자 대입한 타입은 생략 가능하다. 22 | ```Java 23 | ArrayList list = new ArrayList(); // JDK 1.5 이전 24 | ArrayList list = new ArrayList(); // JDK 1.5 이후 25 | ArrayList list = new ArrayList<>(); // JDK 1.7 이후 26 | ``` 27 | 28 | ## 제네릭 장점 29 | - 객체 타입의 안정성 30 | - 형변환 번거로움 감소 31 | 32 | 33 | ## 제네릭 용어 34 | ```Java 35 | ArrayList // 제네릭 클래스 36 | ArrayList // 원시 타입 37 | T // 타입 변수 38 | ``` 39 | 40 | 41 | ## 제네릭 다형성 42 | ```Java 43 | class Vehicle { } 44 | class Car extends Vehicle { } 45 | class Truck extends Vehicle { } 46 | 47 | 48 | ArrayList list = new ArrayList(); // 참조변수와 생성자의 대입 변수는 일치 49 | list.add(new Vehicle()); 50 | list.add(new Car()); // 자손 51 | list.add(new Truck()); // 자손 52 | 53 | 54 | Vehicle v = list.get(0); 55 | Car c = (Car)list.get(1); // 형변환 필요 56 | Truck t = (Truck)list.get(2); // 형변환 필요 57 | ``` 58 | 59 | 60 | ## 제한된 제네릭 클래스 61 | 제네릭 대입 타입으로 Vehicle과 Vehicle의 자손 타입만 허용한다. 62 | ```Java 63 | class Box { 64 | 65 | } 66 | ``` 67 | 68 | 69 | ## 제네릭 제약 사항 70 | - static 멤버에 타입 변수 사용 불가 71 | - 이유: 제네릭 인스턴스 별로 다르게 타입 변수를 다르게 대입할 수 있으므로, 공통으로 사용하는 static 멤버에는 사용할 수 없다. 72 | - 객체/배열 생성시 타입 변수 사용 불가 73 | - 이유 : new로 객체나 배열을 생성할 때는 타입이 확정되어 있어야 하기 때문이다. 74 | 75 | 76 | ## 제네릭 와일드 카드 77 | 서로 다른 타입이 대입된 여러 제네릭 객체를 다루기 위한 것 78 | - `` : 모든 타입 가능 79 | - `` : T와 T의 자손들만 사용 가능. 상한을 T로 제한 80 | - `` : T와 T의 조상들만 사용 가능. 하한을 T로 제한 81 | 82 | ```Java 83 | ArrayList list = new ArrayList(); 84 | ``` 85 | 86 | 87 | 88 | 89 | 참조 90 | - 자바의 정석 - 기초편 91 | - http://tcpschool.com/java/java_generic_concept 92 | 93 | 94 | -------------------------------------------------------------------------------- /java/yij/Exception.md: -------------------------------------------------------------------------------- 1 | # Exception 2 | 3 | Java에는 Checked ExceptionUnchecked Exception이 존재한다. 4 | 5 | ![image](https://user-images.githubusercontent.com/30489264/130772149-4bb9df32-1dd0-442e-8a6a-d42bb439c2d5.png) 6 | 7 | 8 | ## Checked Exception 9 | 10 | RuntimeException을 상속하지 않는 클래스. 11 | 12 | - Exception 처리 코드 여부를 컴파일러가 Check 13 | - 프로그램 실행 흐름 상 에러 발생 가능이 있을 때 try-catch / throws를 이용해 예외 처리 14 | - (Spring) Transaction의 기본 Rollback 대상이 아니기 때문에 트랜잭션 관리를 위한 추가적인 처리를 해주어야 한다 15 | 16 |
17 | 18 | ## Unchecked Exception 19 | 20 | RuntimeException을 상속하는 클래스. 21 | 22 | 23 | 24 | ### 언제 발생할까? 25 | 26 | - 프로그래머의 실수로 발생하는 예외 상황(0으로 나누기, NPE, OutOfIndex 등) 27 | - 컴파일 시점에는 에러가 발생하지 않지만 실행 시험에서 에러가 발생할 수 있음 ❗❗ 28 | 29 |
30 | 31 | ## Checked 🆚 Unchecked Exception 32 | 33 | ||Checked|Unchecked| 34 | |-|-|-| 35 | |확인 시점|Compile 시점|Runtime 시점| 36 | |처리 여부|반드시 예외 처리해야 한다|명시적으로 처리하지 않아도 된다| 37 | |트랜잭션 처리|예외 발생 시 Rollback 하지 않는다|예외 발생 시 Rollback 해야 한다| 38 | |종류|Exception class를 상속받는 하위 클래스 중 RuntimeException을 제외한 모든 예외
ex) IOException, ClassNotFoundException 등|RuntimeException의 하위 예외들
NPT(NullPointerException), ClassCastException 등| 39 | 40 | 가장 주요한 차이점은 **예외 처리를 꼭 해주어야 하느냐**라고 할 수 있다. 41 | 42 |
43 | 44 | ## Exception Handling 45 | 46 | 예외를 처리하는 방법에는 예외 복구, 예외 처리 회피, 예외 전환 방법이 존재한다. 47 | 48 |
49 | 50 | ### 예외 복구 51 | 52 | 예외가 발생해도 애플리케이션의 실행은 정상적으로 진행된다(일정 시간 대기, 재시도 회수 제한 등). 53 | 54 | ``` java 55 | final int MAX_RETRY = 100; 56 | public Object someMethod() { 57 | int maxRetry = MAX_RETRY; 58 | while(maxRetry > 0) { 59 | try { 60 | ... 61 | } catch(SomeException e) { 62 | // 로그 출력. 정해진 시간만큼 대기 63 | } finally { 64 | // 리소스 반납 및 정리 작업 65 | } 66 | } 67 | // 최대 재시도 횟수를 넘기면 직접 예외를 발생시킨다. 68 | throw new RetryFailedException(); 69 | } 70 | ``` 71 | 72 |
73 | 74 | ### 예외 처리 회피 75 | 76 | 예외가 발생하면 호출한 메서드 쪽으로 예외를 던지는 기법 77 | 호출한 쪽에서는 반드시 예외를 받아 처리해야 한다 78 | 79 | ``` java 80 | public void add() throws SQLException { 81 | // ... 82 | } 83 | ``` 84 | 85 |
86 | 87 | ### 예외 전환 88 | 89 | 예외가 발생하는 메서드에서 Exception을 Catch해서 다른 예외를 발생시키는 방법 90 | 호출한 메서드 측에서 예외를 받아 처리할 때 더욱 명확하게 인지할 수 있도록 돕기 위한 방법 91 | 92 | ``` java 93 | public void add(User user) throws DuplicateUserIdException, SQLException { 94 | try { 95 | // ... 96 | } catch(SQLException e) { 97 | if(e.getErrorCode() == MysqlErrorNumbers.ER_DUP_ENTRY) { 98 | //Error Code가 MySQL의 Duplicate Entry면 예외를 전환 99 | throw DuplicateUserIdException(); 100 | } 101 | else throw e; 102 | } 103 | } 104 | 105 | public void someMethod() { 106 | try { 107 | // ... 108 | } 109 | catch(NamingException ne) { 110 | throw new EJBException(ne); 111 | } 112 | catch(SQLException se) { 113 | throw new EJBException(se); 114 | } 115 | catch(RemoteException re) { 116 | throw new EJBException(re); 117 | } 118 | } 119 | ``` 120 | 121 | 세 가지 방법을 사용할 때, 예외를 잡고 아무 처리도 하지 않는 것은 굉장히 위험하다. 122 | 따라서 예외가 발생했을 때의 catch문이나, throws 처리된 메서드를 호출하는 측에서 반드시 예외 및 에러에 대해 처리해주어야 한다. 123 | 124 |
125 | 126 | ## ➕ Error 🆚 Exception 127 | 128 | ### Error 129 | 130 | - 시스템에 의도하지 않은 비정상적인 상황이 생겼을 때 발생 131 | - Error의 서브 클래스를 throws 선언할 필요는 없다 132 | - Error 및 서브 클래스는 unchecked exception으로 분류된다 133 | 134 | ### Exception 135 | 136 | - Exception 및 서브 클래스는 응용 프로그램이 catch할 수 있는 조건을 나타내는 throwable 형식 137 | - Exception, RuntimeException 및 서브 클래스는 checked exception으로 분류된다 138 | 139 |
140 | 141 | ## Spring Exception Handling 142 | 143 | > 참고 자료 144 | > - https://bcp0109.tistory.com/303 145 | > - https://velog.io/@dion/%EB%8F%84%EB%8C%80%EC%B2%B4-Checked-Exception%EC%9D%B4%EB%9E%91-Unchecked-Exception%EC%9D%80-%EC%96%B8%EC%A0%9C%EC%93%B0%EB%8A%94%EA%B1%B0%EC%95%BC 146 | 147 | 148 |
149 | 150 | ## 참고 자료 151 | 152 | > - https://madplay.github.io/post/java-checked-unchecked-exceptions 153 | > - https://steady-hello.tistory.com/55 -------------------------------------------------------------------------------- /java/yij/Framework.md: -------------------------------------------------------------------------------- 1 | > [💡#](#collection) 컬렉션 프레임워크에 속한 List, Set, Map에 대해 설명해주세요. 2 | > - List, Set, Map 모두 지정된 타입의 여러 Element를 저장할 수 있는 Collection Framework입니다. 3 | > - List는 ArrayList, LinkedList로 구현될 수 있으며 각각 배열, 링크드리스트의 특성을 갖습니다. 또한 순서가 존재하고 중복이 허용됩니다. 4 | > - Set은 구현체에 따라 순서 여부는 달라질 수 있지만 Element의 중복은 허용되지 않습니다. 5 | > - Map은 로 이루어져 있으며 구현체에 따라 순서 여부는 달라질 수 있지만 Key값은 중복될 수 없습니다. 6 | 7 | # Framework 8 | 9 | ## Collection 10 | 11 | ![image](https://user-images.githubusercontent.com/30489264/131596123-e23e98de-793c-4a8a-9402-5a90d84cb977.png) 12 | 13 | 자바의 대표적인 Collection Framework로는 **List, Set, Map**이 있다. 14 | 세 자료구조 모두 하나 이상의 Element를 저장한다는 공통점이 있지만, 세부적인 특징이 다르다. 15 | 16 |
17 | 18 | ### List 19 | 20 | 저장된 요소들 사이에 순서가 존재하고, Element의 중복이 허용된다. 21 | List Interface의 구현체로는 ArrayList, LinkedList, Vector가 있다. 22 | 23 | #### ArrayList 24 | 25 | - Array(배열)을 이용한 리스트 26 | - Default Size는 10으로 선언되어 있고, List의 Elements가 추가될 때 마다 새로운 배열을 선언한 뒤 옮겨 담는다. 27 | - 구현체가 배열이라는 특성 때문에 조회는 O(1)에 가능하다 28 | - 하지만 Element의 개수가 증가하여 Capacity에 가까워지면 Resizing이 발생하고, Array의 특성을 따르기 때문에 삽입 및 삭제 시간이 느리다 29 | 30 | #### LinkedList 31 | 32 | - LinkedList로 구현한 리스트 33 | - 각각의 Element는 Node< E > 클래스로 이루어져 있으며, next, prev를 가진 양방향 연결 리스트 구조이다. 34 | - ArrayList와는 반대로, 조회보다는 삽입 및 삭제가 자주 발생할 때 사용하는 것이 좋다. 35 | 36 |
37 | 38 | ### Set 39 | 40 | : (일반적으로)저장된 요소들 사이에 순서가 없고, 중복을 허용하지 않는다. 41 | Set Interface의 구현체는 HashSet, LinkedHashSet, TreeSet이 있다. 세 가지 구현체 모두 synchronized하지 않기 때문에 thread-safe하지 않다. 42 | 43 | #### HashSet 44 | 45 | - 해시 테이블(실제로는 HashMap 인스턴스)에 의해 지원되는 Set 구현 클래스 46 | - **중복 불가, 순서 없음** 47 | - 대표적으로 가장 많이 사용하는 Set 구현체 48 | 49 | #### LinkedHashSet 50 | 51 | - HashSet을 extend한 Set 구현 클래스 52 | - **중복 불가, 순서 있음** 53 | - 들어온 순서에 따라 양방향 연결 리스트 형태를 가진다 54 | - 삽입한 순서대로 순서를 가짐 55 | 56 | #### TreeSet 57 | 58 | - NavigableSet을 implements한 Set 구현 클래스 59 | - **중복 불가, 순서 있음** 60 | - **비교 가능한 순서에 의해 정렬된다 !!** 61 | 62 |
63 | 64 | ### Map 65 | 66 | Key, Value 쌍으로 저장되는 자료구조이다. Set과 같이 일반적으로 순서를 가지고 있지 않다. Key 값은 중복될 수 없지만(똑같은 Key를 가진 두 개 이상의 Element가 존재할 수 없다) Value 값은 중복될 수 없다. 67 | 주로 HashMap, HashTable 두 개의 구현체를 사용한다. 68 | 69 | #### HashMap 70 | 71 | - 보조 해시 함수를 지원하여 Collision을 감소시킨다 72 | - 지속적으로 성능 개선을 하고 있다 73 | - Thread-safe하지 않다 74 | 75 | #### HashTable 76 | 77 | - Thread-safe하다 78 | - not fail-fast를 제공한다(?) 79 | - JRE 1.0, 1.1 환경 대상으로의 하위 호환성을 제공한다(기능 발전은 X) 80 | 81 | #### LinkedHashMap 82 | 83 | - HashMap과 동일하지만 insert 된 순서를 유지한다 84 | 85 | #### TreeMap 86 | 87 | - HashMap과 동일하지만 비교 가능한 순서에 의해 정렬된다 88 | 89 |
90 | 91 | ### List 🆚 Set 🆚 Map 92 | 93 | (가장 많이 사용하는 구현체 기준) 94 | 95 | ||List|Set|Map| 96 | |-|-|-|-| 97 | |대표 구현 Class|**ArrayList**
LinkedList|HashSet|HashMap| 98 | |순서 여부|O|X|X| 99 | |중복 허용|O|X|X(Key 중복 불가)| 100 | 101 |
102 | 103 | ## 참고 자료 104 | 105 | > https://techvidvan.com/tutorials/java-collection-framework/ -------------------------------------------------------------------------------- /java/yij/Immutable.md: -------------------------------------------------------------------------------- 1 | # Immutable Object 2 | 3 | Spring의 Constructor Dependency Injection, Java Collection의 String, Multi-Thread에서 Thread-Safe를 구현하는 방법, Builder Pattern의 장점 등등에서 공통적으로 언급하는 단어는 바로 **Immutable**이다. 4 | 5 | Java와 Java 기반 프레임워크의 많은 원칙들은 객체를 Immutable하게 만드는 것을 중요한 목표로 삼는다. 6 | 7 | 그럼 객체가 어떨 때 Immutable하다고 하는 것인지, 그것의 장점은 무엇인지를 알아야 자바에 대해 잘 이해하고 있는게 아닐까 🙄 라는 생각에 또 조사해봤다. 8 | 9 |
10 | 11 | ## Immutable Object란? 12 | 13 | **객체가 처음 생성된 이후, 상태가 변하지 않고 일정하게 유지되는 것**을 Immutable Object(이후 불변 객체)라고 한다. 14 | 15 | 실제 개발 시, 객체가 Immutable하게 정의되면 API를 사용했을 때 해당 인스턴스의 라이프 사이클 동안 완전히 같은 방식으로 작동할 것을 보장한다. 16 | 17 | `java.lang.String`은 메서드를 통해 객체의 값을 변경할 수 있는 것 처럼 보여도, 원본 문자열 자체는 변하지 않는다(자세한 내용은 [링크](https://www.javatpoint.com/immutable-string) 참조). 18 | 19 |
20 | 21 | ```java 22 | String name = "baeldung"; 23 | String newName = name.replace("dung", "----"); 24 | 25 | assertEquals("baeldung", name); 26 | assertEquals("bael----", newName); 27 | ``` 28 | 29 |
30 | 31 | 이를 위해 객체는 Read-Only 메서드를 제공하며 객체의 내부 상태를 변경하는 메서드를 포함해서는 안된다. 32 | 33 |
34 | 35 | ## *final* Keyword in Java 36 | 37 | 자바에서 불변성을 언급할 때에는 `final` keyword가 항상 등장한다. 38 | 39 | 변수는 기본적으로 mutable하기 때문에 값을 자유롭게 변경할 수 있다. 단, `final` 키워드를 함께 사용해서 선언할 때는 변경을 시도했을 때 자바 컴파일러가 컴파일 오류를 보고한다. 40 | 41 | ```java 42 | final String name = "baeldung"; 43 | name = "bael..."; // compile error 44 | 45 | final List strings = new ArrayList<>(); 46 | assertEquals(0, strings.size()); 47 | strings.add("baeldung"); 48 | assertEquals(0, strings.size()); // fail 49 | ``` 50 | 51 | 하지만 `final`은 정확하게는 **변수가 가지고 있는 레퍼런스를 변경하는 것을 금지**하기 때문에, 객체의 내부 상태를 변경하는 것은 보호할 수 없다. 52 | 53 | 그래서 위의 예제에서 `strings` 리스트에는 새 element가 들어갈 수 있고, size는 1로 증가해서 두 번째 `assertEquals()` 메서드는 실패한다. 따라서 `strings`는 Immutable 객체가 아니다. 54 | 55 |
56 | 57 | ### List를 Immutable Object로 만들기 58 | 59 | ```java 60 | List<> 61 | ``` 62 | 63 |
64 | 65 | ## Immutability in Java 66 | 67 | 변수의 value를 변경하는 것에 주의해야 한다는 점을 알면 불변 객체의 API를 구현할 수 있다. 68 | 69 | 이것은 **API의 사용에 관계없이 내부 상태가 절대 변하지 않음**을 보장해야 함을 의미한다. 70 | 71 | 많은 경우에서 이는 필드에 `final`을 사용해서 구현한다. 72 | 73 | ```java 74 | class Money { 75 | private final double amount; 76 | private final Currency currency; 77 | 78 | // ... 79 | } 80 | ``` 81 | 82 | (모든 Primitive Data Type의 경우를 포함) amount의 값은 변하지 않는다. 단, `currency` 인스턴스가 변하지 않음을 보장하지만, Currency 클래스의 API에 의존해서 불변을 보장하는지 함께 검증해야 한다. 83 | 84 | ```java 85 | class Money { 86 | // ... 87 | public Money(double amount, Currency currency) { 88 | this.amount = amount; 89 | this.currency = currency; 90 | } 91 | 92 | public Currency getCurrency() { 93 | return currency; 94 | } 95 | 96 | public double getAmount() { 97 | return amount; 98 | } 99 | } 100 | ``` 101 | 102 | 불변 API의 요구사항을 만족하기 위해 `Money` 클래스는 Read-Only 메서드만 가진다. reflection API(모름)를 이용하면 불변성을 깰 수 있는데, 이것은 불변 객체의 성질을 위반하기 때문에 조심해야 한다. 103 | 104 |
105 | 106 | ## Benefits 107 | 108 | 불변 객체가 가지는 가장 큰 장점은 Multi-Thread 환경에서의 안정성을 보장하는 것 이라고 생각한다. Multi-Thread 환경에서 여러 쓰레드가 공유 자원에 접근할 때, 해당 필드가 변할 가능성이 있다면 일관성이 깨질 수 있다. 필드를 불변하게 만들어주는 것은 Thread-safe를 구현하는 가장 쉬운 방법 중 하나이다. 109 | 110 | 객체지향 관점에서 봤을 때는 외부에서 객체의 상태를 변경할 수 있는 권한을 축소하기 때문에 더 자율적인 객체를 만들 수 있다. 111 | 112 |
113 | 114 | ## 참고자료 115 | 116 | > https://www.baeldung.com/java-immutable-object 117 | > https://tecoble.techcourse.co.kr/post/2020-05-18-immutable-object/ 118 | 119 |
120 | 121 | ## 정리 122 | 123 | > Immutable이 무엇이며 왜 중요한가? 124 | > Java에서 Immutable이란 객체가 처음 생성된 이후 상태가 변하지 않음을 의미한다. 이는 여러 쓰레드가 불변 객체에 동시에 접근을 해도 값이 변하지 않기 때문에 Thread-Safe를 구현하는 유용한 방법이 될 수 있다. 125 | 126 |
-------------------------------------------------------------------------------- /java/yij/OOP.md: -------------------------------------------------------------------------------- 1 | > 💡 객체지향의 SOLID 원칙에 대해 설명해주세요. 2 | > - SOLID 원칙이란 단일 책임, 개방폐쇄, 리스코프 치환, 인터페이스 분리, 의존관계 역전으로 이루어져 있습니다. 유지 보수 및 확장성을 위해 지켜야 하는 객체지향 설계의 다섯 가지 원칙입니다. 3 | 4 |
5 | 6 | # SOLID 7 | 8 | 객체지향의 다섯 가지 기본 원칙은 단일 책임 원칙(SRP), 개방-폐쇄 원칙(OCP), 리스코프 치환 원칙(LSP), 인터페이스 분리 원칙(ISP), 의존관계 역전 원칙(DIP)로 이루어지고, 그 앞글자를 따 SOLID 원칙이라고 불린다. 9 | 10 | 이는 객체지향의 기본 목적인 유지 보수 및 확장성이 좋은 소프트웨어를 만들기 위함이다. 11 | 12 | #### Single responseibility principle - 단일 책임 원칙 13 | 14 | : 한 클래스는 하나의 책임만 가져야 한다 15 | 16 | #### Open/closed principle - 개방/폐쇄 원칙 17 | 18 | : 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다 19 | 20 | #### Liskov substitution principle - 리스코프 치환 원칙 21 | 22 | : 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다 23 | 24 | #### Interface segregation principle - 인터페이스 분리 원칙 25 | 26 | : 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다 27 | 28 | #### Dependency inversion principle - 의존관계 역전 원칙 29 | 30 | : 프로그래머는 추상화에 의존해야지 구체화에 의존해서는 안 된다 -------------------------------------------------------------------------------- /java/yij/POJO.md: -------------------------------------------------------------------------------- 1 | # POJO(Plain Old Java Object) 2 | 3 | 특정 프레임워크에 종속되지 않은 순수한 자바 객체 4 | 5 | 속성, 메서드에 대한 어떠한 네이밍 규칙도 없다. 6 | 7 | Java EE와 같은 무거운 프레임워크들이 서비스 시장을 점유했을 때, 해당 프레임워크에 종속된 (무거운) 객체를 사용해야 했던 것에 반발해서 나오게 된 개념이다. 8 | 9 | Spring Framework는 POJO를 기본 개념으로 채택했다. 10 | 11 | ```java 12 | public class EmployeePojo { 13 | 14 | public String firstName; 15 | public String lastName; 16 | private LocalDate startDate; 17 | 18 | public EmployeePojo(String firstName, String lastName, LocalDate startDate) { 19 | this.firstName = firstName; 20 | this.lastName = lastName; 21 | this.startDate = startDate; 22 | } 23 | 24 | public String name() { 25 | return this.firstName + " " + this.lastName; 26 | } 27 | 28 | public LocalDate getStart() { 29 | return this.startDate; 30 | } 31 | } 32 | ``` 33 | 34 | 이 클래스는 프레임워크에 종속되지 않으므로 모든 Java 프로그램에서 쉽게 사용할 수 있다. 35 | 36 | 하지만 클래스의 상태를 구성하고, 접근하고, 수정하는 어떠한 컨벤션도 없기 때문에 다음의 문제를 발생시킬 수 있다. 37 | 38 | 1. 사용방법을 이해하려는 개발자의 러닝커브 상승 39 | 2. 프레임워크의 활용성을 저해할 수 있음 40 | 41 |
42 | 43 | ## POJO의 단점 44 | 45 | 예시로 `commons-beanutils` 혹은 `Jackson`과 같은 의존성을 사용하여 인스턴스의 property에 접근한다고 했을 때, 위의 코드에서는 `{start}`라는 property밖에 찾을 수 없다. 46 | 47 | 이상적으로는 `{firstName, lastName, startDate}`를 가져와야 한다. 이를 위해 POJO의 기본적 성질을 해치지 않으면서, 많은 Java 라이브러리에서 사용할 수 있는 `JavaBeans` 컨벤션이 존재한다. 48 | 49 |
50 | 51 | ## JavaBeans 52 | 53 | JavaBean이란 구현 방법에 대해 다음의 컨벤션을 적용한 POJO이다. 54 | 55 | - Access Level 56 | - Access Modifier는 private 57 | - getter/setter를 노출 58 | - Method Names: getter/setter는 `getX`, `setX` 규칙을 따름(boolean의 경우 `isX`도 가능) 59 | - Default Constructor: 기본 생성자(인수가 없는)가 존재해야 함(역직렬화 시에 인수 없이 인스턴스 생성할 수 있도록) 60 | - Serializable: Serializable 인터페이스를 implements하여 상태를 저장할 수 있게 함 61 | 62 |
63 | 64 | ### JavaBean Example 65 | 66 | ```java 67 | public class EmployeeBean implements Serializable { 68 | 69 | private static final long serialVersionUID = -3760445487636086034L; 70 | private String firstName; 71 | private String lastName; 72 | private LocalDate startDate; 73 | 74 | public EmployeeBean() { 75 | } 76 | 77 | public EmployeeBean(String firstName, String lastName, LocalDate startDate) { 78 | this.firstName = firstName; 79 | this.lastName = lastName; 80 | this.startDate = startDate; 81 | } 82 | 83 | public String getFirstName() { 84 | return firstName; 85 | } 86 | 87 | public void setFirstName(String firstName) { 88 | this.firstName = firstName; 89 | } 90 | 91 | // additional getters/setters 92 | 93 | } 94 | ``` 95 | 96 | 리플렉션으로 빈을 검사하면 모든 속성을 얻을 수 있다. 97 | 98 |
99 | 100 | ## JavaBeans의 단점 101 | 102 | - Mutability: `setter` 메서드로 인해 mutable하다. mutable 속성은 동시성 혹은 일관성 문제로 이어질 수 있다. 103 | - Boilerplate: 모든 속성에 대해 getter를 적용하고, 대부분의 속성에는 setter를 적용해야 한다. 이는 필수적인 상황이 아니면 권장하지 않는다. 104 | - Zero-argument Constructor: 객체가 필수 의존성에 대해 nullable 속성을 가지지 않도록 인수가 없는 생성자의 설정은 권장하지 않는다. 하지만 JavaBean 표준은 직렬화를 위해 이를 요구한다. 105 | 106 |
107 | 108 | ## 결론 109 | 110 | - POJO: 특정 프레임워크에 바인딩되지 않은 Java 객체 111 | - JavaBean: 엄격한 컨벤션을 지키는 특수 유형의 POJO 112 | 113 | JavaBean 인스턴스를 활용했을 때 일부 프레임워크와 라이브러리를 적용하기에 좋다. 단점에 대해서는 이를 보완할 수 있는 방법을 추가로 적용해야 할 것이다. -------------------------------------------------------------------------------- /java/yij/Singleton.md: -------------------------------------------------------------------------------- 1 | # Singleton 2 | 3 | : 클래스의 인스턴스를 하나만 생성하고, 어디서든 그 인스턴스를 참조할 수 있도록 하는 패턴 4 | 생성자가 여러 번 호출되더라도 실제로 생성되는 객체는 하나 -------------------------------------------------------------------------------- /network/README.md: -------------------------------------------------------------------------------- 1 | # 2) Network 2 | - contributor : [김경원](https://github.com/shining8543) , [윤이진](https://github.com/483759) , [이현경](https://github.com/honggoii) , [진수연](https://github.com/jjuyeon) 3 |
4 | 5 | ### :notebook_with_decorative_cover: 네트워크와 모델 6 | 1. 네트워크, 인터넷, 프로토콜의 개념을 설명해주세요. 7 | 2. 네트워크 통신방식 3가지를 설명하고 해당 통신방식에 속하는 예시를 하나 설명해주세요. 8 | 3. 네트워크 모델 2가지를 설명하고 두 모델의 공통점과 차이점을 설명해주세요. 9 | 10 | ### :notebook_with_decorative_cover: 데이터 통신 11 | 1. Ethernet에 대해 설명하세요. 12 | 2. LAN에 대해 설명하세요. 13 | 3. 데이터 링크 계층의 역할에 대해 설명하세요. 14 | 15 | ### :notebook_with_decorative_cover: IP 주소 16 | 1. 공인 IP와 사설 IP의 차이에 대해서 설명해주세요. 17 | 2. IPv4 와 IPv6의 차이는? 18 | 3. 서브넷 마스크에 대해서 설명해주세요. 19 | 4. IP 주소 클래스에 대해서 설명해주세요. 20 | 21 | ### :notebook_with_decorative_cover: ARP 프로토콜 22 | 1. ARP 프로토콜 동작 흐름에 대해 설명해주세요. (ARP 프로토콜에 대해 설명해주세요.) 23 | 2. ARP와 RARP를 비교해서 설명해주세요. 24 | 25 | ### :notebook_with_decorative_cover: IPv4, ICMP 프로토콜 26 | 1. IPv4가 하는일과 IPv4 프로토콜 구조를 설명해주세요. 27 | 2. ICMP가 하는일과 ICMP 프로토콜 구조를 설명해주세요. 28 | 3. 다른 네트워크까지 내 패킷의 이동 과정을 설명해주세요. 29 | 30 | ### :notebook_with_decorative_cover: 전송계층 및 포트 31 | 1. Port란 무엇인가요? 32 | 2. 서버 측에서 사용되는 포트는 이미 정해져 있습니다. 주요 Well-Known Port에 대해 아는대로 설명해주세요. 33 | 3. 클라이언트와 서버의 통신 과정에 대해 설명해주세요. 34 | 35 | ### :notebook_with_decorative_cover: UDP 비연결지향형 36 | 1. UDP 서버의 특징에 대해서 설명하세요. 37 | 2. UDP는 어느 상황에서 사용하는지 설명하세요. 38 | 39 | ### :notebook_with_decorative_cover: TCP 연결지향형 40 | 1. TCP 프로토콜의 특징을 UDP 프로토콜과 비교하여 설명해주세요. 41 | 2. 3-way handshake에 대해 설명해주세요. 42 | 3. 3-way handshake에서 클라이언트가 서버가 보낸 ACK+SYC을 받지 못하면 어떻게 되나요? 43 | 4. 4-way handshake에서 서버가 마지막에 FIN을 보내는 이유는 무엇인가요? 44 | 5. 4-way handshake에서 클라이언트가 마지막에 ACK를 보내는 이유는 무엇인가요? 45 | 46 | ### :notebook_with_decorative_cover: NAT와 포트포워딩 47 | 1. NAT란 무엇인지 설명해주세요. 48 | 2. 포트포워딩이란 무엇인지 설명해주세요. 49 | 50 | ### :notebook_with_decorative_cover: HTTP 프로토콜 51 | 1. HTTP와 HTTPS의 차이에 대해 설명하세요. 52 | 2. HTTP의 GET 방식과 POST 방식을 비교해주세요. 53 | 3. HTTP의 Statue Code의 종류는 어떻게 되나요? 54 | 4. 주소창에 URL을 치고 엔터를 치면 흐름이 어떻게 되나요? 55 | 56 | ### :notebook_with_decorative_cover: 기타 57 | 1. CORS란 무엇인가요? 58 | 2. CORS 에러가 발생하는 원인을 SOP와 관련하여 설명해주세요. 59 | 3. 쿠키와 세션의 차이점에 대해 설명해주세요. 60 | 4. 프록시와 프록시 서버에 대해 설명해주세요. 61 | 5. JWT 에 대해서 설명해주세요. -------------------------------------------------------------------------------- /network/jsy/README.md: -------------------------------------------------------------------------------- 1 | # Suyeon Jin 2 | 3 | |Study|바로가기| 4 | |---|---| 5 | |네트워크와 모델|[:white_check_mark:](../jsy/network.md)| 6 | |데이터 통신|[:white_check_mark:](../jsy/dataCommunication.md)| 7 | |IP 주소|[:white_check_mark:](../jsy/ip.md)| 8 | |ARP 프로토콜|[:white_check_mark:](../jsy/arp.md)| 9 | |IPv4, ICMP 프로토콜|[:white_check_mark:](../jsy/protocol.md)| 10 | |전송계층 및 포트|[:white_check_mark:](../jsy/port.md)| 11 | |UDP|[:white_check_mark:](../jsy/udp.md)| 12 | |TCP|[:white_check_mark:](../jsy/tcp.md)| 13 | |NAT, 포트포워딩|[:white_check_mark:](../jsy/portforwarding.md)| 14 | |HTTP 프로토콜|[:white_check_mark:](../jsy/http.md)| 15 | |ETC|[:white_check_mark:](../jsy/etc.md)| -------------------------------------------------------------------------------- /network/jsy/arp.md: -------------------------------------------------------------------------------- 1 | # :question: ARP 프로토콜 2 | 3 | #### reference 4 | https://coding-factory.tistory.com/720 5 |
6 | 7 | ## Question 8 | 1. [ARP 프로토콜 동작 흐름에 대해 설명해주세요.](#1-arp-protocol-address-resolution-protocol) 9 | - ARP 프로토콜은 IP 주소를 통해, 해당 IP 주소에 맞는 물리 주소를 알아내는 프로토콜입니다. 10 | - 동작 흐름을 간단하게 설명드리면
IP 프로토콜이 ARP 프로토콜에게 ARP 요청 메시지를 생성하도록 합니다.
이후 요청 메시지를 받은 호스트와 라우터 중, 요청 메시지의 목적지 IP 주소와 일치하는 시스템은 자신의 물리 주소(MAC 주소)를 포함하는 ARP 응답 메시지를 전송합니다.
이러한 흐름을 통해, IP 주소를 통하여 MAC 주소를 얻을 수 있게 됩니다. 11 |

12 | 13 | 2. [ARP와 RARP를 비교해서 설명해주세요.](#2-rarp-protocol-reverse-address-resolution-protocol) 14 | - ARP 프로토콜과 RARP 프로토콜은 네트워크 계층의 주소 결정 프로토콜이라는 공통점을 가지고 있습니다. 15 | - 차이점은 ARP는 논리 주소를 통해 물리 주소를 알아내는 반면, RARP는 물리 주소를 통해 논리 주소를 알아냅니다. 16 | 17 |
18 | 19 | ## :nerd_face: What I study 20 | ### 1. ARP Protocol (Address Resolution Protocol) 21 | 22 | #### 1) ARP 프로토콜에 대한 설명 23 | ![arp](https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdtXirx%2Fbtq3NGrivTP%2FSiJGrscVJ8Fd5Gl8P8IQgk%2Fimg.png) 24 | - 주소 결정 프로토콜 25 | - IP 주소를 그 IP 주소에 맞는 MAC 주소로 대응시키기 위해 사용되는 프로토콜 26 | - [1] 처음 통신을 시작하면 상대방의 MAC 주소를 알 수 없음.
[2] IP 주소를 통해서는, 데이터를 보내고자 하는 PC의 네트워크까지만 접근할 수 있음.
--> 이때 ARP 프로토콜을 통해 상대방의 MAC 주소를 알아내기 위해 사용한다. 27 | 28 | #### 2) 필요성 29 | - IP 주소만으로 통신 불가능 30 | - IP 주소는 가변적 31 | - 왜? 한 네트워크에서 호스트 장치에 할당할 수 있는 IP 주소는 한정적이다.
그래서 IP 주소를 효율적으로 관리하기 위해, 사용하지 않는 IP주소를 다른 호스트에게 할당하기 때문에 IP 주소는 가변적이다. 32 | - 그러므로, IP 주소만으로 통신하기엔 불가능 33 | - MAC 주소만으로 통신 불가능 34 | - MAC 주소만으로 통신하기 위해서는, 전 세계의 모든 네트워크 장치의 MAC 주소를 등록해야 함. 35 | - 저장 공간이 버티질 못함. 36 | 37 | #### 3) 동작 흐름 38 | 1. 송신자는 목적지 IP 주소는 알고 있으나, MAC 주소는 모른다. 39 | 2. 송신자는 목적지 IP 주소를 지정하여 패킷을 송신한다. 40 | 3. MAC 주소를 알아내기 위해, IP 프로토콜이 ARP 프로토콜에게 ARP Request 메시지를 생성하도록 요청한다. 41 | - [참고] ARP Request 메시지는 브로드캐스트 방식으로 전송한다. 42 | - (전체에게 메시지를 보낼 수 있도록 브로드캐스트를 사용한다.) 43 | 4. 메시지는 데이터링크 계층으로 전달되고, 이더넷 프레임으로 Encapsulation 된다. 44 | - [참고] "송신자 MAC 주소-> 발신지 주소, 수신자 MAC 주소-> 브로드캐스트 주소"로 지정한다. 45 | 5. 모든 호스트와 라우터는 이 프레임을 수신하고, 자신의 ARP 프로토콜에게 전달한다. 46 | 6. 목적지 IP 주소가 일치하는 시스템은 **자신의 MAC 주소를 포함하고 있는 ARP Reply 메시지를 보낸다.** 47 | - [참고] ARP Reply 메시지는 유니캐스트 방식으로 전송한다. 48 | - (송신자가 Request 메시지에 자신의 물리주소를 포함했기 때문에 송신자에게만 보낼 수 있으므로, 유니캐스트를 사용한다.) 49 | 7. 최초 송신 측은 지정한 IP 주소에 대응하는 MAC 주소를 획득한다. (목적 달성!!) 50 |

51 | 52 | ### 2. RARP Protocol (Reverse Address Resolution Protocol) 53 | 54 | #### 1) RARP 프로토콜에 대한 설명 55 | - 역순 주소 결정 프로토콜 56 | - ARP 프로토콜과 반대 관계 57 | - MAC 주소를 그 MAC 주소에 맞는 IP 주소로 대응시키기 위해 사용되는 프로토콜 58 | - [참고] 59 | - RARP Request 메시지는 브로드캐스트 방식으로 전송한다. 60 | - RARP Reply 메시지는 유니캐스트 방식으로 전송한다. 61 | 62 | #### 2) ARP vs RARP 63 | - 모두 네트워크 계층 프로토콜 64 | 65 | |ARP|RARP| 66 | |:---:|:---:| 67 | |주소 결정 프로토콜|ARP의 반대| 68 | |IP -> MAC|MAC -> IP| 69 | -------------------------------------------------------------------------------- /network/jsy/dataCommunication.md: -------------------------------------------------------------------------------- 1 | # :question: 데이터 통신 2 | 3 | #### reference 4 | https://maivve.tistory.com/263
5 | https://coding-factory.tistory.com/341
6 | https://itragdoll.tistory.com/15 7 |
8 | 9 | ## Question 10 | 1. [Ethernet에 대해 설명하세요.](#1-ethernet) 11 | - **LAN 영역에서 사용하는 근거리 유선 네트워크 통신 기술**입니다. 전 세계적으로 가장 많이 사용하는 방식입니다. 12 |

13 | 14 | 2. [LAN에 대해 설명하세요.](#2-lan-local-area-network) 15 | - 근거리 통신망으로, 사용자가 포함된 네트워크를 의미합니다. 제한된 지역, 공간 내에 네트워크를 구축한 것입니다. 16 |

17 | 18 | 3. [데이터 링크 계층의 역할에 대해 설명하세요.](#3-osi-7계층-2계층-데이터-링크-계층) 19 | - OSI 7계층 모델에서 2계층으로, 네트워크 장비 간에 신호를 주고받는 규칙을 정하는 계층입니다. LAN에서 데이터를 정상적으로 주고 받기 위해 필요합니다. 20 | - 1계층인 물리 계층에서 발생할 수 있는 오류를 감지하고 수정하는 역할을 합니다. 21 |
22 | 23 | ## :nerd_face: What I study 24 | ### 1. Ethernet 25 | - LAN 영역에서 사용하는 근거리 유선 네트워크 통신 기술 26 | - LAN에서 데이터를 정상적으로 주고 받기 위한 규칙 27 | - 주로 내부 통신에 사용한다. 28 | - CSMA/CD 프로토콜을 이용하여 통신한다. 29 | - 전 세계적으로 가장 많이 사용하는 네트워크 방식 30 | 31 | #### 1) CSMA/CD 프로토콜 (Carrier Sense Multiple Access/Collision Detection) 32 | - LAN 통신 프로토콜 종류 33 | - 이더넷 환경에서 사용한다. 34 | - 구체적인 동작 방식: https://security-nanglam.tistory.com/193 35 | #### 2) 장점 36 | - 설치 비용이 저렴하고, 관리가 쉽다. 37 | - 네트워크 구조가 단순하다. 38 | 39 | #### 3) 단점 40 | - 네트워크 사용 시, 여러 개의 장치가 동시에 데이터를 보내려다 충돌이 발생할 수 있다. 41 | - 충돌이 발생하면 네트워크 지연이 발생한다. 42 | - 시스템의 부하가 증가하면 충돌도 계속 증가한다. 43 |

44 | 45 | ### 2. LAN (Local Area Network) 46 | - 근거리 통신망 47 | - 통신 주체인 자신이 포함된 동일 네트워크 (사용자가 포함된 지역 네트워크) 48 | - 특정 건물이나 지역 범위 내에서만 사용하는 네트워크 영역 49 | - 공유 매체를 사용하므로 경로 선택 없이 매체에 연결된 모든 장치로 데이터를 전송한다. 50 | - 오류 발생률이 낮으며, 유지보수 비용이 감소한다. 51 | - 네트워크 구축시 비용이 증가한다. 52 |

53 | 54 | ### 3. [OSI 7계층] 2계층 데이터 링크 계층 55 | - 네트워크 장비 간에 신호를 주고받는 규칙을 정하는 계층 56 | - LAN에서 데이터를 정상적으로 주고 받기 위해 필요하다. 57 | - 1계층인 물리 계층에서 발생할 수 있는 오류를 감지하고 수정하는 역할 58 | - MAC 주소를 가지고 정확한 장치로 데이터를 통신한다. 59 | - **오류검출과 흐름제어**를 통해 데이터가 안전하게 도달하도록 한다. 60 | 61 | #### 1) 오류검출 62 | - 전송 중에 혼란, 감쇠, 잡음 등에 의한 오류나 손실 발생 시 이를 해결하기 위한 제어방식 63 | - ex. 후진 오류 수정방식, 전진 오류 수정방식 64 | #### 2) 흐름제어 65 | - 송신노드가 수신노드의 처리 속도를 고려하여 이를 초과하지 않도록 전송을 제어하는 방식 66 | - 수신노드가 수신 확인 응답을 송신노드에 제공한다. 67 | - ex. Stop and Wait 방식, Sliding Window 방식 68 | - Stop and Wait: 송신측에서 프레임을 전송한 후, 확인응답(ACK)을 받을 때까지 대기한다. 69 | - Sliding Window: 송신측에서 수신측의 확인응답(ACK)을 받기 전에 수신 가능한 범위 내에서 여러 프레임을 전송한다. -------------------------------------------------------------------------------- /network/jsy/ip.md: -------------------------------------------------------------------------------- 1 | # :question: IP 주소 2 | 3 | #### reference 4 | https://velog.io/@doondoony/ip101
5 | https://velog.io/@hidaehyunlee/IP-address%EB%9E%80
6 | https://velog.io/@hidaehyunlee/%EA%B3%B5%EC%9D%B8Public-%EC%82%AC%EC%84%A4Private-IP%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90 7 |
8 | 9 | ## Question 10 | 1. [공인 IP와 사설 IP의 차이에 대해서 설명해주세요.](#2-공인-ip-vs-사설-ip) 11 | - 공인 IP는 전세계에서 유일한 IP주소입니다. 반면, 사설 IP는 하나의 네트워크 안에서 라우터를 통해 할당받는 주소로 해당 네트워크 안에서만 사용이 가능한 주소입니다. 12 | - 공인 IP는 외부에 공개되어 있기 때문에, 인터넷에 연결된 전 세계의 자원으로부터 접근이 가능합니다. 13 |

14 | 15 | 2. [IPv4 와 IPv6의 차이는?](#3-ipv4-vs-ipv6) 16 | - IPv4는 총 32비트를 가진 IP번호 체계지만, IPv6는 총 128비트를 가진 IP번호 체계입니다. 17 | - 즉, IPv6를 사용하여 주소 공간을 확장할 수 있었고 이를 통해 IPv4의 주소부족 문제를 해결할 수 있었습니다. 18 |

19 | 20 | 3. [서브넷 마스크에 대해서 설명해주세요.](#4-subnet-mask) 21 | - IP주소 부족 문제로 이를 나누어 쓰기 위해 IP 주소에 씌우는 마스크입니다. 22 | - IP주소를 네트워크 부분과 호스트 부분으로 구분할 때 사용합니다. 이를 통해 IP 할당 범위를 더 작은 단위로 나눌 수 있습니다. 23 |

24 | 25 | 4. [IP 주소 클래스에 대해서 설명해주세요.](#1-ip-internet-protocol) 26 | - 하나의 IP주소에서 네트워크 영역과 호스트 영역을 나누는 방법입니다. 27 | - 네트워크 부분의 길이에 따라 A ~ E클래스까지 나누어집니다. 28 |
29 | 30 | ## :nerd_face: What I study 31 | ### 1. IP (Internet Protocol) 32 | - 인터넷 환경에서의 통신규약 33 | - OSI 7계층, 네트워크 계층(TCP/IP 4계층, 인터넷 계층)에 위치하는 프로토콜 34 | - **호스트간의 통신만을 담당한다.** 35 | - 즉, ***비신뢰성, 비연결성***이 특징이다. 36 | - 패킷의 상태를 보장하지 않는다. (비신뢰성) 37 | - 목적지에서 패킷을 잘 받았는지 고려하지 않는다. (비연결성) 38 | - 패킷의 분해, 조립, 주소지정, 경로 선택 등 39 | 40 | #### - IP 주소 (Internet Protocol Address) 41 | - 인터넷에 연결된 모든 컴퓨터 자원을 구분하기 위한 고유 주소 42 | - 컴퓨터 뿐만 아니라 서버도 각자의 IP를 가지고 있다. 43 | - 네트워크 부분의 길이에 따라 A클래스에서 E클래스까지 5단계로 구성된다. 44 | - ex. IPv4 주소, IPv6 주소 45 | 46 | #### - IP 주소의 클래스 47 | - 하나의 IP주소에서 네트워크 영역과 호스트 영역을 나누는 약속 48 | - 네트워크 범위가 커질수록 호스트의 주소 범위는 작아진다. (반비례 관계) 49 | - A 클래스 50 | - 하나의 네트워크가 가질 수 있는 호스트 수가 제일 많은 클래스 51 | - IP주소를 32자리 2진수로 표현했을 때, 맨 앞자리 수가 항상 0인 경우 52 | - 1~126으로 시작하는 네트워크 53 | - B 클래스 54 | - IP주소를 32자리 2진수로 표현했을 때, 맨 앞자리 수가 항상 10인 경우 55 | - C 클래스 56 | - IP주소를 32자리 2진수로 표현했을 때, 맨 앞자리 수가 항상 110인 경우 57 | - D 클래스(참고): 멀티캐스트용 58 | - E 클래스(참고): 연구용 59 |

60 | 61 | ### 2. 공인 IP vs 사설 IP 62 | #### 1) 공인 IP 63 | - **전세계에서 유일한 IP** 64 | - **인터넷 서비스 공급자가 제공**하는 IP주소 65 | - 외부에 공개되어 있다. 그래서 인터넷에 연결된 다른 장비로부터 접근이 가능하다. 66 | - 그러므로, 그에 따른 보안 설정이 필요하다. (ex. 방화벽) 67 | #### 2) 사설 IP 68 | - 어떤 네트워크 안에서 사용되는 IP주소 69 | - IPv4 주소 부족으로 인해 모든 네트워크가 공인 IP를 사용하는 것이 불가능해졌다. 70 | - 이를 해결하기 위해, **하나의 네트워크 안에서 라우터를 통해 할당받는 가상의 주소**가 사설 IP이다. 71 | - 별도의 설정 없이 외부에서 접근이 불가능하다. 72 |

73 | 74 | ### 3. IPv4 vs IPv6 75 | #### 1) IPv4 76 | - 한 자리당 0~255까지 8비트로 표현이 가능하며, 총 32비트를 가진 IP번호 체계 77 | - 대략 40억 개로 표현할 수 있지만, **현재 대부분의 주소를 사용하고 있다.** 78 | - 이러한 주소 부족 문제를 해결하기 위해, IPv6가 만들어졌다. 79 | - 브로드캐스트 주소가 있다. 80 | #### 2) IPv6 81 | - 한 자리당 16비트씩 8개를 가지고 있으며, 총 128비트를 가진 IP번호 체계 82 | - IPv4의 주소 부족문제를 해소하기 위해 IP 주소의 길이가 32 비트에서 128 비트로 확장되었다. 83 | - QoS 요구 실시간 서비스를 제공한다. 84 | - 보안 기능이 강화되었다. 85 | - 브로드캐스트 주소가 없다. 대신, 로컬범위 내에서 모든 노드에 대한 멀티캐스트 주소가 사용 가능하다. 86 | #### 3) IPv4 vs IPv6 87 | - https://blog.naver.com/PostView.nhn?blogId=hai0416&logNo=221566797342&parentCategoryNo=&categoryNo=7&viewDate=&isShowPopularPosts=true&from=search 88 |

89 | 90 | ### 4. Subnet Mask 91 | - IP주소 부족으로 이를 나누어 쓰기 위해 IP 주소에 씌우는 마스크 92 | - 255, 0으로 이루어져 있다. (255: 네트워크 부분, 0: 호스트 부분) 93 | - 서브넷 마스크를 사용하면 IP 할당 범위를 더 작은 단위로 나눌 수 있다. 94 | - 이를 통해 같은 IP 대역인지 확인하여, 부족한 IP 대역을 채울 수 있다. 95 | ### - IP주소와 서브넷 마스크를 AND 연산하면 네트워크 부분과 호스트 부분을 알 수 있다. 96 | - 네트워크 주소? IP 주소와 서브넷 마스크를 AND 연산한 것 97 | - 브로드캐스트 주소? 네트워크 주소에서 서브넷 마스크의 0으로 된 비트를 모두 1로 바꾸어 준 것 -------------------------------------------------------------------------------- /network/jsy/port.md: -------------------------------------------------------------------------------- 1 | # :question: 전송계층 및 포트 2 | 3 | #### reference 4 | https://www.youtube.com/watch?v=3MkI3FBFzX8&list=PL0d8NnikouEWcF1jJueLdjRIC4HsUlULi&index=19 5 |
6 | 7 | ## Question 8 | 1. [Port란 무엇인가요?](#1-port) 9 | - 컴퓨터 안에서 여러 개의 프로세스 중, 특정 프로세스를 찾을 때 사용하는 번호입니다. 10 | - 그래서 하나의 포트는 하나의 프로세스에만 할당됩니다. 11 | - 반대로 하나의 프로세스는 여러 개의 포트를 사용할 수 있습니다. 12 |

13 | 14 | 2. [서버 측에서 사용되는 포트는 이미 정해져 있습니다. 주요 Well-Known Port에 대해 아는대로 설명해주세요.](#1-well-known-port) 15 | - 중요하게 알아야 할 포트로는, 0, 20, 21, 22, 53, 80, 443번 정도가 있습니다. 16 | - 0번은 TCP/IP 네트워킹에서 예약된 포트이기 때문에, 사용하지 않는 포트입니다. 17 | - 20,21번은 FTP 에서 사용하고, 22번은 SSH, 53번은 DNS에서 사용하는 포트입니다. 18 | - 웹 서비스에서 사용하는 포트로는 HTTP 80번, HTTPS 443번이 있습니다. 19 |

20 | 21 | 3. [클라이언트와 서버의 통신 과정에 대해 설명해주세요.](#2-client-와-server-의-통신-과정) 22 | - 클라이언트가 사용하는 포트는 다이나믹 포트이기 때문에, 포트 번호가 정해져 있지 않고 랜덤하게 정해집니다. 23 | - 서버가 사용하는 포트는 80번으로 정해져있지만, 절대적인 것은 아닙니다. 24 | - 그래서, 클라이언트에서 랜덤하게 사용할 포트 번호를 결정한 후, 서버의 포트 80번으로 접속하는 과정을 거칩니다. 25 |
26 | 27 | ## :nerd_face: What I study 28 | ### 1. Port 29 | - like 4계층에서 사용하는 주소 30 | - 컴퓨터 안에서 특정 프로세스(프로그램)를 찾을 때 사용한다. 31 | - 특정 프로세스와 특정 프로세스가 통신을 하기 위해 사용한다. 32 | - ***하나의 포트는 하나의 프로세스만*** 사용해야한다. 33 | - 하나의 프로세스가 여러 개의 포트를 사용하는 것은 가능하다. 34 | - **포트 번호는 일반적으로 정해져 있지만, 무조건 지켜야 하는 것은 아니다.** 35 | #### 1) Well-known Port 36 | - 서버 프로그램이 수신 대기할 때 사용하는 포트 37 | - 0 ~ 1023 번 할당 38 | - 0번 포트는 TCP/IP 네트워킹에서 예약된 포트이기 때문에,
TCP, UDP 메시지에서 사용하면 안된다. 39 | 40 | |서비스 이름|포트 번호| 41 | |:---:|:---:| 42 | |***예약됨(사용하지 않음)***|0| 43 | |FTP(파일 전송 프로토콜)|20, 21| 44 | |SSH(원격 제어, 보안 기능 O)|22| 45 | |TELNET(원격 제어)|23| 46 | |SMTP(이메일 전송)|25| 47 | |DNS(Domain Name System)|53| 48 | |DHCP(동적 호스트 구성 프로토콜)|67, 68| 49 | |TFTP(파일 전송 프로토콜)|69| 50 | |***HTTP***(웹)|80| 51 | |POP3(이메일 수신)|110| 52 | |IMAP4(이메일 수신, 보관 기능 O)|143| 53 | |***HTTPS***(웹, 보안 기능 O)|443| 54 | 55 | #### 2) Registered Port 56 | - 벤더(서버 소프트웨어)가 할당받아 사용하는 포트 57 | - 1024 ~ 49151 번 할당 58 | 59 | |서비스 이름|포트 번호| 60 | |:---:|:---:| 61 | |오라클 DB 서버|1521| 62 | |MySQL 서버|3306| 63 | |MS 원격 데스크탑|3389| 64 | 65 | #### 3) Dynamic Port 66 | - 클라이언트 프로그램이 사용하는 포트 67 | - 49152 ~ 65535 번 할당 68 | - 클라이언트가 사용하는 포트 번호는 다이나믹 포트 번호 대역에서 자동으로 할당된다. 69 | - 그러므로, 어떤 번호가 사용될지 미리 알 수 없다. 70 |

71 | 72 | ### 2. client 와 server 의 통신 과정 73 | #### 1) client ? 74 | - 서비스 및 데이터를 요청하는 쪽 75 | - 해당 서버에 접속하여 데이터를 사용한다. 76 | #### 2) server ? 77 | - 서비스 및 데이터를 제공하는 쪽 78 | - 데이터를 저장하고 관리한다. 79 | #### 3) 서버/클라이언트 구조 관점에서 본 통신 과정 (HTTP) 80 | - 클라이언트가 사용할 포트를 결정한 후(랜덤 포트), 서버의 포트에 접속한다. (80번) 81 | - 서버 측에서 수신 대기하는 포트 번호는 80번이다. 82 | - 80번 포트는 절대적인 것이 아니며, 포트 번호는 바뀔 수 있다.
(다만, 포트를 바꾸면 바뀐 번호를 사용자가 직접 찾아서 접속해야 하기 때문에 웬만하면 바뀌지 않는다.) 83 | - 웹 브라우저(클라이언트)는 dynamic 포트를 사용하기 때문에 포트 번호가 정해져 있지 않다. -------------------------------------------------------------------------------- /network/jsy/portforwarding.md: -------------------------------------------------------------------------------- 1 | # :question: NAT와 포트포워딩 2 | 3 | #### reference 4 | https://en.wikipedia.org/wiki/Network_address_translation
5 | https://ooeunz.tistory.com/104
6 | CM :heart_eyes: 7 |
8 | 9 | ## Question 10 | 1. [NAT이란 무엇인지 설명해주세요.](#1-nat-network-address-traslation) 11 | - 내부 IP와 외부 IP가 서로 통신하기 위해서는, IP 주소를 변환해주어야 합니다. 12 | - 이때, NAT를 사용하여 이러한 주소 변환 규칙을 설정하고, 내부 IP와 외부 IP를 서로 변환하며 통신합니다. 13 |

14 | 15 | 2. [포트포워딩이란 무엇인지 설명해주세요.](#2-portforwarding-portmapping) 16 | - 포트를 통해, 외부에서 내부망으로 접근이 가능하도록 하는 기술입니다. 17 | - 즉, 설정해둔 포트로 외부에서 통신을 요청하는 경우, 매핑된 내부 IP로 포워딩해주는 기술입니다. 18 |
19 | 20 | ## :nerd_face: What I study 21 | ### 1. NAT (Network Address Traslation) 22 | ![nat](https://upload.wikimedia.org/wikipedia/commons/6/63/Network_Address_Translation_%28file2%29.jpg) 23 | - 네트워크 주소 변환 규칙 24 | - 외부망과 내부망을 나눠주는 기능을 한다. 25 | - 내부 IP -> 외부 IP로 가기 위해서는, 내부 IP, 포트번호를 외부 IP, 포트번호로 변환해줘야 한다.
외부 IP -> 내부 IP로 가기 위해서는, 외부 IP, 포트번호를 내부 IP, 포트번호로 변환해줘야 한다.
그래서 ***NAT를 통해 이러한 주소 변환 규칙을 설정하고, 내부 IP 주소와 외부 IP 주소를 서로 변환하며 통신한다.*** 26 | - 맨 처음부터 외부 IP가 내부 IP로 접근할 수 없다. (내부 -> 외부는 통신이 허용된다.) 27 | - 대부분 사설 네트워크에 속한 여러 개의 호스트가 하나의 공인 IP 주소를 사용하여 인터넷에 접속하기 위해 사용한다. 28 | - 부족한 공인 IP 주소를 효율적으로 사용하기 위해, 공인 IP 주소와 사설 IP 주소를 변환해준다. 29 | 30 | #### 1) 장점 31 | - 여러 사설 네트워크를 사용함으로써 인터넷 공인 IP 주소를 절약할 수 있다. 32 | - 내부 IP 주소를 외부로 알리지 않으면서, 외부의 침입/공격을 막을 수 있다. 33 | 34 | #### 2) 단점 35 | - 네트워크의 복잡성이 증가한다. 36 | - 네트워크 성능의 지연에 영향을 끼친다. 37 | 38 | #### 3) 왜 NAT를 쓰면서 통신해야할까? (내부 IP에서 외부 IP로 다이렉트로 통신은 왜 안될까?) 39 | - 다른 네트워크에 있는 장치와 통신하기 위해서는, 각 네트워크의 공인 IP 주소를 통해서만 가능하다. 40 | - 공인 IP 주소는 외부망 주소니까 당연히 내부망의 주소를 외부망의 주소로 변경해야하는 작업이 필요하다. 41 | - 그래서 NAT를 사용해야만 한다. 42 | 43 | #### 4) 왜 통신 처음에는 외부 IP가 내부 IP로 접속할 수 없을까? (포트포워딩이 필요한 이유) 44 | - NAT는 NAT table을 통해 주소를 변환해준다. 45 | - NAT table은 내부망이 외부망으로 외출할 때 업데이트된다. (테이블의 용도는 되돌아왔을 때, 내부망의 정확한 위치로 돌아갈 수 있도록 기록해두는 것) 46 | - 그래서, 내부에서 외부로 먼저 통신 요청을 하지 않으면 외부에서는 내부 IP를 알 수 있는 방법이 없다. (왜? table에 업데이트가 안되니까) 47 | - 이러한 문제를 해결하기 위해, 나타난 방법이 **포트포워딩**이다! 48 |

49 | 50 | ### 2. Portforwarding (PortMapping) 51 | | | | 52 | |---|---| 53 | |![portforwarding](https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkB4pj%2FbtqDjHQjRGR%2F5qbbDDAcLKeI6PM1xxXWK0%2Fimg.png)|![portforwarding2](https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcgpupe%2FbtqDhvwvKrd%2FYPOxXh8Oj0jCzbbGafdLx1%2Fimg.png)| 54 | ##### 1) 공유기를 설치하게 되면 공유기와 연결된 장치는 192.168~로 시작하는 IP를 공유기로부터 부여받는다. 55 | ##### 2) 공유기에게 21번 포트로 요청이 오면 192.168.0.20 PC로 연결하라는 이정표를 달아주는 것이 포트포워딩이다. 56 |
57 | 58 | - 패킷이 라우터나 방화벽과 같은 네트워크 장비를 지나는 동안, **특정 IP 주소와 포트 번호의 통신 요청**을 **특정 다른 IP 주소와 포트 번호로 넘겨주는** NAT의 기능 중 하나이다. 59 | - ***통신할 때 맨 처음부터 외부 IP가 내부 IP로 접근할 수 없었는데, 포트포워딩을 통해서 외부에서 접속이 가능하도록 할 수 있다.*** 60 | - 외부망(게이트웨이)의 반대쪽에 위치한 사설네트워크에 상주하는 호스트에 대한 서비스를 생성하기 위해 주로 사용된다. -------------------------------------------------------------------------------- /network/jsy/udp.md: -------------------------------------------------------------------------------- 1 | # :question: UDP 비연결지향형 프로토콜 2 | 3 | #### reference 4 | https://rednooby.tistory.com/17
5 | https://github.com/WooVictory/Ready-For-Tech-Interview/blob/master/Network/UDP.md 6 |
7 | 8 | ## Question 9 | 1. [UDP 서버의 특징에 대해서 설명하세요.](#1-udp-user-datagram-protocol) 10 | - UDP는 단순히 데이터를 전송하는 역할만 하는 프로토콜입니다. 11 | - UDP는 패킷의 전송 여부와 오류 여부를 파악할 수 없기 때문에 비신뢰성과 비연결성이라는 특징을 가지고 있습니다. 12 | - 또한, 패킷이 잘 전송되었는지 파악하는 과정이 없기 때문에 상대적으로 전송 속도가 빠르다는 특징도 있습니다. 13 |

14 | 15 | 2. [UDP는 어느 상황에서 사용하는지 설명하세요.](#2-dns에서-udp를-사옹하는-이유) 16 | - 상대적으로 데이터 전송의 신뢰성보다 속도가 중요한 **실시간 스트리밍, DNS 서버, RTP 프로토콜** 등에 사용됩니다. 17 |
18 | 19 | ## :nerd_face: What I study 20 | ### 1. UDP (User Datagram Protocol) 21 | - 4계층에 위치하는, 단순히 데이터를 전송하는 역할만 하는 프로토콜 22 | - 간단하기 때문에 신뢰할 수 없는 비연결성 프로토콜

23 | - 단점 24 | - 데이터그램의 도착 순서가 바뀌거나, 중복되거나, 누락되기도 한다. (비연결성, 비신뢰성) 25 | - 흐름제어와 에러제어가 없기 때문에, 손상된 세그먼트에 대한 재전송을 하지 않는다. 26 | - 장점 27 | - **전송 속도가 빠르다** -> 실시간 스트리밍, 온라인 게임에 사용된다. 28 | - 그래서 UDP는 일반적으로 오류의 검사와 수정이 필요없는 프로그램에서 수행할 것으로 가정한다. 29 | - ex.
1) DNS 서버(도메인을 물으면 IP를 알려주는 서버),
2) TFTP 서버(UDP로 파일을 공유하는 서버),
3) RIP 프로토콜(라우팅 정보를 공유하는 프로토콜)
4) RTP(Real Time Protocol)
5) Multicast / Broadcast 30 | #### 1) UDP Header 31 | - 8바이트의 고정된 크기를 가진다. 32 | ![udp](https://t1.daumcdn.net/cfile/tistory/272A5A385759267B36) 33 | - Source Port: 시작 포트번호 34 | - Destination Port: 도착지 포트번호 35 | - Length: 헤더와 데이터의 길이 36 | - Checksum: 오류검출(Optional, 데이터의 훼손유무를 확인) 37 | #### 2) DNS에서 UDP를 사옹하는 이유 38 | - DNS는 7계층(어플리케이션 계층) 프로토콜 39 | - DNS 요청이 많은데 TCP 처럼 세션을 맺고 통신한다면,
1) 속도도 느려지고,
2) 서버 리소스(overhead)도 엄청나게 소모될 것이다. 40 | - 비신뢰성이라는 UDP의 단점을 보완하기 위해, 어플리케이션 계층에서 신뢰성을 추가할 수 있다. (timeout, resend) 41 | #### 3) RTP에서 UDP를 사용하는 이유 42 | - ex. 전화할 때, 손상된 데이터가 있어도 다른 조치를 하지 않고 수신자가 듣지 못한체로 넘어간다. 43 | - ex. 온라인 게임 중에, 네트워크 상태가 좋지 않으면 잠시 화면이 끊겼다가(로딩) 다시 되돌아온다. 44 | #### 4) Multicast / Broadcast에서 UDP를 사용하는 이유 45 | - 1:N(all) 통신 방식에서 하나의 장치가 데이터를 받지 못하여 재전송을 요청할 수 있는 상황이라면, (TCP)
제대로 받은 다른 모든 장치에게도 데이터가 재전송된다는 문제점이 발생할 수 있다. 46 | - 이를 방지하기 위해, UDP를 사용한다. -------------------------------------------------------------------------------- /network/kkw/IP.md: -------------------------------------------------------------------------------- 1 | # IP 2 | 3 | ## 3계층의 기능 4 | 5 | ### 3계층이 하는 일 6 | 7 | - 3계층은 **다른 네트워크 대역** 즉, 멀리 떨어진 곳에 존재하는 **네트워크**까지 어떻게 데이터를 전달할지 제어하는 일을 담당 8 | - 발신에서 착신까지의 패킷의 경로를 제어 9 | 10 | ### 3계층에서 쓰는 주소 11 | 12 | - WAN에서 통신할 때 사용하는 주소 **IP 주소** 13 | - IPv4 주소 : 현재 PC에 할당된 IP 주소 14 | - 서브넷마스크 : IP 주소에 대한 네트워크의 대역을 규정하는 것 15 | - 게이트웨이 주소 : 외부와 통신할 때 사용하는 네트워크의 출입구 16 | 17 | ### 3계층 프로토콜 18 | 19 | - ARP 프로토콜 : IP 주소를 이용해 MAC주소를 알아옴 20 | - IPv4 프로토콜 : WAN에서 통신할 때 사용 21 | - ICMP 프로토콜 : 서로가 통신되는지 확인할 때 사용함 22 | 23 | ## 일반적인 IP 주소 24 | 25 | ### Classful IP 주소 26 | 27 | - 낭비가 심함 28 | - 구식이라 외울 필요까진 없음 (실무자가 물어볼 가능성 낮음) 29 | - 네트워크를 구분하기 위해 사용 30 | - IP 주소의 낭비가 심함 31 | 32 | | 클래스 | 네트워크 구분 | 시작 주소 | 마지막 주소 | 33 | | :-------------------: | :-------------------: | :-------: | :-------------: | 34 | | A 클래스 | 0XXXXXXX, 첫번째 필드 | 0.0.0.0 | 127.255.255.255 | 35 | | B 클래스 | 10XXXXXX, 두번째 필드 | 128.0.0.0 | 191.255.255.255 | 36 | | C 클래스 | 110XXXXX, 세번째 필드 | 192.0.0.0 | 223.255.255.255 | 37 | | D 클래스 (멀티캐스트) | 1110XXXX | 224.0.0.0 | 239.255.255.255 | 38 | | E 클래스 (예약) | 1111XXXX | 240.0.0.0 | 255.255.255.255 | 39 | 40 | ### Classless IP 주소 41 | 42 | - 낭비되지 않도록 아껴쓰는 Classless IP 주소 43 | - 서브넷 마스크 44 | 45 | - 클래스풀한 네트워크 대역을 나눠주는데 사용하는 값 46 | - 어디까지가 네트워크 대역을 구분하는데 사용하고 어디서부터 호스트를 구분하는데 사용하는지 지정 47 | - 32bit 4byte : 255.255.255.192 -> 11111111.11111111.11111111.11000000 48 | - 2진수로 표기했을 때 1로 시작, 1과 1 사이에는 0이 올 수 없다는 규칙을 가지고 있음 49 | - 첫번째 IP를 네트워크 주소로 사용하고, 마지막 주소를 브로드캐스트 주소로 사용합니다. 50 | 51 | ### 사설 IP와 공인 IP 52 | 53 | - 공인 IP 1개당 2^32개의 사설 IP 54 | - 사설 IP는 외부와 통신할 때 공인 IP로 바뀌어서 통신함 55 | - 실제 인터넷 세상에서는 공인 IP로만 통신하여 외부 네트워에 대역에서는 사설 IP 대역이 안 보임 56 | - 외부에서 어떻게 내부를 구분하지 그럼? -> 포트포워딩을 해줘야함 57 | 58 | ### IPv6 59 | 60 | - 개발자 말고 네트워크 담당자가 되려면 따로 공부 필요함 61 | 62 | ## 특수한 IP 주소 63 | 64 | - 0.0.0.0/0 : wildcard, 나머지 모든 IP 65 | - 127.0.0.1 : loopback, 자기 자신을 나타내는 주소 66 | - 게이트웨이 주소 : 외부와 통신할 때 거치는 주소 (외부와 통하는 문) 67 | 68 | ### IPv4 와 IPv6의 차이 69 | 70 | - IPv6의 장점 71 | 72 | - 패킷을 단편화하지 않으면서 보다 효율적인 라우팅이 가능 73 | - 지연에 민감한 패킷을 구분하는 기본적인 QoS(Quality of Service) 74 | - NAT를 없앰으로써 주소 공간을 32비트에서 128비트로 확장 75 | - 네트워크 레이어 보안 내장(IPsec) 76 | - 손쉬운 네트워크 관리를 위한 무상태 주소 자동 구성 77 | - 처리 오버헤트가 줄어든 개선된 헤더 구조 78 | 79 | - IPv6 80 | 81 | - 128비트의 콜론으로 분리된 8개의 16비트 16진수 블록 82 | - 멀티캐스트 주소를 사용 83 | - 전역적으로 교유한 유니캐스트 주소와 로컬 주소를 사용 84 | 85 | - IPv4 86 | - 클래스로 분리됨 87 | - 각 디바이스가 멈추고 패킷을 확인하도록 강제하는 브로드캐스트 주소를 사용 88 | - 전역적으로 고유한 퍼블릭 주소를 트래픽 및 프라이빗 주소에 사용 89 | 90 | --- 91 | 92 | ## 질문 정리 93 | 94 | - Q. 공인 IP와 사설 IP의 차이에 대해서 설명해주세요. 95 | 96 | ``` 97 | 사설 IP는 내부 네트워크 상에서만 사용되는 주소로, 세계 인터넷에서는 사용할 수 없는 IP 주소입니다. 98 | 세계 인터넷에서 사용하기 위해서는 공인 IP를 사용하여야 하며, 사설 IP들은 외부 네트워크와 통신을 할 때 모두 공인 IP로 변경되어 통신을 하게 됩니다. 99 | ``` 100 | 101 | - Q. IPv4 와 IPv6의 차이는? 102 | 103 | ``` 104 | IPv4는 32비트의 길이를 가지고 있지만 IPv6는 길이가 128비트로 늘어나 더 많은 네트워크 주소를 가질 수 있습니다. 105 | 또한 IPv6가 패킷 크기가 확장 되었으며, 효율적인 라우팅으로 IP 패킷 처리를 신속하게 할 수 있습니다. 106 | ``` 107 | 108 | - Q. 서브넷 마스크에 대해서 설명해주세요. 109 | 110 | ``` 111 | IP 낭비가 심한 클래스풀한 IP를 클래스리스하게 만들기 위하여 사용하는 것, 112 | IP 주소를 네트워크 영역과 호스트 영역으로 나눌 때 사용하는 것입니다. 113 | 서브넷 마스크로 114 | ``` 115 | 116 | - Q. IP 주소 클래스에 대해서 설명해주세요. 117 | 118 | ``` 119 | 네트워크를 구분하기 위해 사용하는 것으로, 120 | A클래스부터 E클래스 까지 있는데 각각의 클래스는 고정 비트가 정해져 있습니다. 121 | IP 주소의 낭비가 심합니다. 122 | ``` 123 | -------------------------------------------------------------------------------- /network/kkw/JWT.md: -------------------------------------------------------------------------------- 1 | ## JWT 2 | 3 | ### Json Web Token 4 | 5 | - 선택적 서명 및 선택적 암호화를 사용하여 데이터를 만들기 위한 인터넷 표준 6 | - Payload는 Claim과 assert를 처리하는 JSON을 보관하고 있다 7 | - 토큰은 공개/비공개 키를 사용하여 서명된다 8 | 9 | ### 구조 10 | 11 | - Header 12 | 13 | ```JSON 14 | { 15 | "alg" : "HS256", 16 | "typ" : "JWT" 17 | } 18 | ``` 19 | 20 | - 서명 생성을 위해 어느 알고리즘을 사용할지를 식별 21 | - 주로 HS256이나 RS256 알고리즘을 사용한다 22 | - Payload 23 | 24 | ```JSON 25 | { 26 | "sub": "1234567890", 27 | "name": "KIM KYUNG WON", 28 | "admin": true, 29 | "iat": 1516239022 30 | } 31 | ``` 32 | 33 | - 일련의 클레임들을 포함, 표준 필드인 7개의 등록 필드와 사용자 지정 클레임이 들어간다. 34 | - 등록 클레임 35 | - iss : 토큰 발급자 36 | - sub : 토큰 제목 37 | - aud : 토큰 대상자 38 | - exp : 토큰의 만료 시간 39 | - nbf : Not before, 토큰의 활성 날짜 40 | - iat : 토큰이 발급된 시간 41 | - jti : jwt의 고유식별자 42 | - 공개 클레임 43 | - JWT 를 사용하는 사람들에 의해 정의된 클레임 44 | - 참고 : https://www.iana.org/assignments/jwt/jwt.xhtml 45 | - 공개 클레임은 서로 충돌이 방지된 이름을 가지고 있어야 하므로 URI 형태로 짓는다. 46 | - 비공개 클레임 47 | 48 | - 서버와 클라이언트간에 협의하에 사용되는 클레임 49 | 50 | - Signature 51 | 52 | ```JSON 53 | HMACSHA256( 54 | base64UrlEncode(header) + "." + 55 | base64UrlEncode(payload), 56 | your-secret-key 57 | ) secret base64 encoded 58 | ``` 59 | 60 | - 서명은 위에서 만든 Header와 Payload의 값을 각 BASE64로 인코딩하고, 그 값을 비밀키를 이용해 헤더에서 정의한 알고리즘으로 해싱하고, 이 값을 다시 BASE64로 인코딩하여 생성한다. 61 | 62 | - Header와 Payload는 Base64로 인코딩 되었을 뿐 암호화는 Signature에만 적용되어있다. 63 | - 즉 개발자는 HTTPS와 같은 시스템 수준의 암호화를 통해서 외부 노출 차단을 막고, 데이터의 신뢰성 평가를 암호화 토큰을 통해서 보장한다. 64 | 65 | ### 장단점 66 | 67 | - 장점 68 | - 별도의 인증 저장소가 필요없음 69 | - 토큰의 신뢰성을 확인하는데 네트워크 연결이 따로 필요하지 않음 (독립적임) 70 | - REST 서비스고 제공 가능 71 | - 수평 스케일이 용이 72 | - URL 파라미터와 헤더로 사용이 가능 73 | - 내장된 만료 74 | - 트래픽에 대한 부담이 낮음 75 | - 디버깅 및 관리가 용이 76 | - 단점 77 | - 필드가 많아지면 토큰이 커질 수 있음 78 | - 모든 요청에 보내질 수 있으므로 신경을 써줘야함 79 | - 토큰이 탈취되더라도 막을 수 없음 80 | - JWT 헤더만으로 중요한 유효성을 확인하지 말 것 81 | 82 | ### 주 사용처 83 | 84 | - 회원 인증 85 | - 정보 교류 : JWT에 서명이 담겨있기에 중간에 보낸 이가 바뀌진 않았는지 정보가 바뀌진 않았는지 검증이 가능 86 | -------------------------------------------------------------------------------- /network/kkw/Set-Cookie.md: -------------------------------------------------------------------------------- 1 | ## Set-Cookie 2 | 3 | ### Cookie 4 | 5 | - HTTP 쿠키는 서버가 브라우저에게 전송하는 데이터 6 | - 클라이언트가 이를 저장하고 다시 서버에게 전송을 함으로써 서버는 Statless 해짐 7 | - 주로 세 가지 목적을 위해 사용 8 | - 세션 관리 : 서버에 저장해야할 로그인, 장바구니, 게임 스코어 등의 정보 관리 9 | - 개인화 : 사용자 선호, 테마 등의 세팅 10 | - 트래킹 : 사용자 행동을 기록하고 분석하는 용도 11 | - 과거에는 클라이언트 측의 정보를 저장할 때 주로 사용하였지만 지금은 권장하지 않음(현대는 modern storage APIs를 권장) 12 | 13 | ### Stateless 14 | 15 | - 모든 HTTP request는 완전히 독룁 되어 있다는 의미 16 | - 전후 요청에 영향을 받지 않는 상태 17 | - 서버는 매 Request를 처리할 때마다 독립적으로 처리하므로 HTTP 프로토콜은 많은 정보량을 가지게 됨 18 | - 이를 위해 쿠키를 사용함 19 | 20 | ### Set-Cookie 란? 21 | 22 | - HTTP 요청을 수신할 때, 서버는 Response와 함께 Set-Cookie 헤더를 전송 가능 23 | - 쿠키는 보통 브라우저에 의해서 저장되며, 그 후 쿠키는 같은 서버에 의해 만들어진 Request들의 Cookie HTTP header에 포함되어 전송됨 24 | 25 | ``` 26 | Set-Cookie: = 27 | ``` 28 | 29 | - 서버는 헤더에 클라이언트에게 다음과 같이 쿠키를 저장하라고 전달함 30 | 31 | ``` 32 | HTTP/1.0 200 OK 33 | Content-type: text/html 34 | Set-Cookie: yummy_cookie=choco 35 | Set-Cookie: tasty_cookie=strawberry 36 | 37 | ``` 38 | 39 | - 그 후에는 서버로 보내는 모든 요청에 쿠키가 담기게 됨 40 | 41 | ``` 42 | GET /sample_page.html HTTP/1.1 43 | Host: www.example.org 44 | Cookie: yummy_cookie=choco; tasty_cookie=strawberry 45 | ``` 46 | 47 | ### 쿠키의 종류 48 | 49 | - Session Cookie 50 | - 클라이언트가 셧다운 되면 바로 사라지는 쿠키 51 | - Expires 혹은 Max-Age를 지정하지 않은 경우 52 | - Permanent Cookie 53 | 54 | - 사용자가 브라우저를 열고 닫을 때마다 이러한 쿠키 설정이 보존 되도록 되있는 쿠키 55 | 56 | - HttpOnly 57 | 58 | - XSS 공격 방지를 위해 Javascript의 Document.cookie API로 접근이 불가능 59 | 60 | - Secure 61 | 62 | - HTTPS 프로토콜 상에서 암호된 요청일 경우에만 전송되는 쿠키 63 | - 안전하지 않은 사이트(http:)는 쿠키에 secure 설정을 지시할 수 없음 64 | - 그렇다고 이 방법이 실질적인 보안을 제공하진 않으니 민감한 정보를 담지 말 것 65 | 66 | - path 67 | - 쿠키가 특정한 디렉토리에서만 활성화 되도록 하기 위해서 Path를 설정할 수 있다. 68 | 69 | - Samesite 70 | - 서드 파티 쿠키들을 안전하게 사용하기 위해서 사용 71 | - 총 3가지의 정책을 가지고 있음 72 | 73 | - None : 크로스 사이트의 요청에도 항상 전송 (즉, 서드 파티 쿠키도 전송됨) 74 | - Strict : 가장 보수적인 정책, 모든 쿠키는 크로스 사이트 요청에는 전송하지 않음. 퍼스트 파티 쿠키만 전송함 75 | - Lax : 대체로 서드 파티 쿠키도 전송되지 않지만, 몇가지 예외적인 요청에만 허용 76 | - Top-level-navigation : 링크 `` 를 클릭하거나, window.location.replace 등으로 자동으로 이뤄지는 이동, `302` 리다이렉트를 이용한 이동 77 | - `iframe` 이나 `img`를 문서에 삽입함으로서 발생하는 HTTP 요청에는 적용 안 됨, `iframe` 안에서 이동하는 경우 안 됨) 78 | - `GET`처럼 서버의 상태를 바꿀 수 없는 요청에 한해서 전송됨 79 | 80 | - 20년 2월 이후로 크롬은 Samesite 설정이 기본적으로 Lax로 설정됨(기존에는 None) 81 | - Secure를 none으로 설정하려면 해당 쿠키는 반드시 `Secure` 상태여야만 한다. 82 | 83 | ### XSS (Cross-site Scripting) 84 | 85 | - 공격 대상이 Client 86 | - XSS는 사이트변조나 백도어를 통해 클라이언트에 대한 악성공격을 한다. 87 | - 웹 브라우저에서 사용자가 입력 할수 있는 input태그 등에 악의적인 script를 작성하여 해당 contents를 이용하는 다른 이용자의 개인정보 및 쿠키정보 탈취, 악성코드 감염, 웹 페이지 변조등의 공격을 한다. 88 | 89 | ### CSRF(Cross Site Request Forgery) 90 | 91 | - 공격 대상이 Server 92 | - CSRF는 요청을 위조하여 사용자의 권한을 이용해 서버에 대한 악성공격을 한다. 93 | 94 | 1. 공격대상 사이트는 쿠키로 사용자 인증을 수행함. 95 | 2. 피해자는 공격 대상 사이트에 이미 로그인 되어있어서 브라우저에 쿠키가 있는 상태. 96 | 3. 공격자는 피해자에게 그럴듯한 사이트 링크를 전송하고 누르게 함. (공격대상 사이트와 다른 도메인) 97 | 4. 링크를 누르면 HTML 문서가 열리는데, 이 문서는 공격 대상 사이트에 HTTP 요청을 보냄. 98 | 5. 이 요청에는 쿠키가 포함(서드 파티 쿠키)되어 있으므로 공격자가 유도한 동작을 실행할 수 있음. 99 | 100 | ### 참고 사이트 101 | 102 | - https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies#Secure_and_HttpOnly_cookies 103 | - https://ko.javascript.info/cookie 104 | -------------------------------------------------------------------------------- /network/kkw/UDP.md: -------------------------------------------------------------------------------- 1 | # UDP 프로토콜 2 | 3 | 9969973359FEB59309 4 | 5 | ## UDP 프로토콜 6 | ### UDP가 하는 일 7 | - 사용자 데이터그램 프로토콜 (User Datagram Protocol, UDP), Universal Datagram Protocol 이라고도 함 8 | - UDP의 **전송 방식은 너무 단순**해서, 서비스의 **신뢰성이 낮고** 데이터그램 도착 순서가 바뀌거나, 중복되거나, 심지어는 통보 없이 누락되기도 함 9 | - UDP는 일반적으로 **오류의 검사와 수정이 필요 없는 프로그램에서 수행할 것**으로 가정한다 10 | - 신뢰성보다는 연속성이 중요한 서비스에서 사용 11 | 12 | 13 | 14 | ![5235](https://user-images.githubusercontent.com/43779730/126501313-0556281c-2423-4bdd-92c2-60d0fb49cdb3.png) 15 | 16 | ### UDP 특징 17 | - 비연결형 서비스로 데이터그램 방식을 제공 18 | - 정보를 주고 받을 때 정보를 보내거나 받는다는 신호 절차를 거치지 않음 19 | - UDP 헤더의 CheckSum 필드를 통해 최소한의 오류만 검출 20 | - 신뢰성이 낮음 21 | - TCP보다 속도가 빠름 22 | 23 | 24 | ### UDP 서버 특징 25 | - UDP에는 연결 자체가 없어서 (Connect 함수 불필요) 서버 소켓과 클라이언트 소켓의 구분이 없다 26 | - 소켓 대신 IP를 기반으로 데이터를 전송 27 | - 서버와 클라이언트는 1대1 , 1대N , N대M 등으로 연결 가능 28 | - 데이터그램 단위로 전송되며 그 크기는 65535바이트로, 크기가 초과할 시 잘라서 보낸다. 29 | - 흐름제어(Flow Control)가 없어서 패킷의 전송 여부와 오류 여부를 확인 불가 30 | - 파일 전송과 같은 신뢰성이 필요한 서비스보다는 성능이 중요시 되는 경우에 사용 31 | 32 | * 흐름제어 33 | : 데이터를 송신하는 곳과 수신하는 곳의 데이터 처리 속도를 조절하여 수신자의 버퍼 오버플로우를 방지하는 것입니다 34 | 35 | ### UDP 프로토콜을 사용하는 프로그램 36 | - 실시간 스트리밍 37 | - 도메인을 물어보면 IP를 알려주는 DNS 서버 38 | - UDP로 파일을 공유하는 tftp 서버 39 | - 라우팅 정보를 공유하는 RIP 프로토콜 40 | 41 | ### UDP 와 TCP의 차이 42 | | |TCP|UDP| 43 | |:----:|:----:|:----:| 44 | |연결 방식|연결형 서비스|비연결형 서비스| 45 | |패킷 교환 방식|가상 회선 방식|데이터그램 방식| 46 | |전송 순서|전송 순서 보장|전송 순서가 바뀔 수 있음| 47 | |수신 여부 확인|수신 여부를 확인함|수신 여부 확인 X| 48 | |통신 방식|1:1 통신| 1:1 , 1:N , N:N| 49 | |신뢰성|높다|낮다| 50 | |속도|느리다|빠르다| -------------------------------------------------------------------------------- /network/lhk/IPv4.md: -------------------------------------------------------------------------------- 1 | # IP 주소 2 | - [IPv4](#ipv4) 3 | - [IPv4 조각화](#ipv4-조각화) 4 | - [ICMP](#icmp) 5 | - [라우팅 테이블](#라우팅-테이블) 6 | - 참고 자료 7 | 8 | https://www.youtube.com/watch?v=s5kIGnaNFvM&list=PL0d8NnikouEWcF1jJueLdjRIC4HsUlULi&index=6&t=3s 9 | https://www.youtube.com/watch?v=_i8O_o2ozlE&t=141s 10 | https://www.youtube.com/watch?v=JaBCIUsFE74&list=PL0d8NnikouEWcF1jJueLdjRIC4HsUlULi&index=10&t=41s 11 | https://www.youtube.com/watch?v=CjnKNIyREHA&list=PL0d8NnikouEWcF1jJueLdjRIC4HsUlULi&index=12 12 | https://www.youtube.com/watch?v=_AONcID7Sc8&list=PL0d8NnikouEWcF1jJueLdjRIC4HsUlULi&index=14 13 | 14 | 수제비 2020 정보처리기사 필기 15 | 16 | 17 | ## IPv4 18 | - 네트워크 상에서 데이터를 교환하기 위한 프로토콜 19 | - 정확한 전달을 보장하지 않음 20 | - 중복된 패킷 전달, 패킷 순서 잘못 전달 가능성 21 | - 4계층 TCP가 데이터를 정확하고 순차적으로 전달 22 | - 20 Byte 23 | ![Screenshot_1](https://user-images.githubusercontent.com/46019755/126610020-14f0c4d7-301a-494e-adc4-05414d38b9e6.png) 24 | 25 | Version - 4 26 | IHL(Header Length) - 최대 1111(15) 표현. 헤더 길이는 20 ~ 60이므로 4로 나눔. 보통 20이라 5 27 | Total Length - 페이로드까지 합쳐진 길이 28 | Identification - 쪼개진 데이터를 합치기 위해 id 부여 29 | IP Flags의 M - 여러번 쪼개면 1로 설정 30 | Fragment Offset - 받을 때 조립할 순서 31 | Time To Live(TTL) - 네트워크 장비 하나씩 지날때마다 1 감소. 상대방 os 종류를 알 수 있음. 윈도우(128), 리눅스(64) 32 | Protocol - 상위 프로토콜 종류 33 | Header Checksum - 오류 있는지 확인 34 | 35 | 36 | ## IPv4 조각화 37 | - 보내려는 데이터가 MTU보다 클 때 사용 38 | - 큰 IP 패킷들이 적은 MTU(Maximum Transmission Unit)를 갖는 링크를 통하여 전송되려면 여러 개의 작은 패킷으로 조각화 되어 전송 39 | - 목적지까지 패킷을 전달하는 과정에서 통과하는 라우터마다 전송에 적합한 프레인으로 변환 40 | - 한 번 조각화되면, 최종 목적지에 도달할 때까지 재조립되지 않음 => 재조립은 항상 최종 수신지에서만 41 | - IPv4에서는 발신지, 중간 라우터에서 조각화 가능 42 | - IPv6에서는 발신지에서만 가능 43 | - MTU에서 IPv4의 헤더길이 20을 뺀 만큼씩 조각화 44 | - 뒤에 조각이 더 있으면 MF를 1로 세팅. Offset은 시작점에서 떨어진 만큼/8 45 | - MTU를 지나서 Ethernet이 붙음 46 | 47 | 48 | ## ICMP 49 | - Internet Control Message Protocol (인터넷 제어 메시지 프로토콜) 50 | - 상대방과 통신이 되는지 확인 용도 51 | - 오류 메시지 전송 받는 데 사용 52 | - 프로토콜 구조의 Type과 Code를 통해 오류 베시지 전송 받음 53 | ![Screenshot_2](https://user-images.githubusercontent.com/46019755/126607301-f854e0e2-4318-4f21-80dc-ffc521339b6b.png) 54 | ![Screenshot_3](https://user-images.githubusercontent.com/46019755/126607489-53913c94-7eb7-4179-a54e-30e301fa54a9.png) 55 | 56 | Type 57 | 0 - 응답 58 | 8 - 요청 59 | 3 - 목적지까지 가지 못한 경우 (경로 문제) 60 | 11 - 목적지까지 갔는데, 응답이 없는 경우 (상대방 문제, 주로 방화벽) 61 | 5 - 원격지의 상대방 라우팅 테이블 수정할 때 사용 62 | 63 | 64 | ## 라우팅 테이블 65 | `$netstat -r` 66 | 서로 다른 네트워크 대역에 있는 A와 B의 통신 67 | 1. 자신의 라우팅 테이블 확인 68 | 2. B의 네트워크 대역이 라우팅 테이블에 있어야 출발 가능 69 | 3. ICMP 프로토콜 작성(요청이므로 08) 70 | 4. IPv4 프로토콜 작성 71 | 5. Ethernet 프로토콜 작성(가까운 목적지 주소로) 72 | 6. 공유기를 지나다니며 목적지가 자신의 ip인지 확인 후, 아니면 Ethernet을 가까운 목적지 주소로 작성 73 | 7. 6번 과정을 반복하며 B에 도착하면 ICMP에 응답(00) 작성 후 다시 A로 74 | 75 | Ethernet은 네트워크 대역이 바뀔 떄마다 다시 작성 76 | 만약 목적지 주소의 MAC주소를 모르면 ARP 프로토콜로 알아와야 함 77 | 78 | 79 | -------------------------------------------------------------------------------- /network/lhk/NAT.md: -------------------------------------------------------------------------------- 1 | # NAT와 포트포워딩 2 | - [NAT(Network Address Translation)](#natnetwork-address-translation) 3 | - [포트포워딩](#포트포워딩) 4 | - 참고 자료 5 | 6 | https://www.youtube.com/watch?v=Qle5cfCcuEY&t=85s 7 | 8 | 9 | # NAT(Network Address Translation) 10 | - 보통 사설IP를 공인IP를 변환하는데에 사용하는 기술 11 | - IP 패킷의 TCP/UDP 포트 숫자와 소스 및 목적지의 IP 주소 등을 **재기록**하면서 라우터를 통해 네트워크 트래픽을 주고 받는 기술 12 | - 패킷에 변화가 생기므로 IP나 TCP/UDP의 체크섬 재기록 13 | ## NAT를 사용하는 이유 14 | - IPv4 주소 부족 문제 해결 15 | - 라우터에 NAT을 설정하면 라우터는 자신에게 할당된 공인 IP 주소만 외부로 알려지게 하고, 내부 사설 IP 주소는 감출 수 있다. 16 | - 사설 네트워크에 속한 여러 개의 호스트가 하나의 공인 IP 주소를 사용하여 인터넷에 접속하기 위해서 17 | 18 | # 포트포워딩 19 | - NAT를 응용한 기술 20 | - 특정 IP 주소와 포트 번호의 통신 요청을 특정 다른 IP와 포트 번호로 넘겨주는 기술 21 | 22 | xxxx 포트로 들어온 애들은 yyyy 포트로 보내라 23 | - 게이트웨이(외부망)의 반대쪽에 위치한 사설네트워크에 상주하는 호스트에 대한 서비스를 생성하기 위해 사용 24 | - 3계층 장비에서 제공하는 기술 25 | ## 포트포워딩 과정 26 | - 공인 IP의 특정 포트로 요청(포트는 정해져있지 않음) 27 | - 특정 포트로 들어온 요청을 내부의 특정 IP의 특정 포트로 전송. 이때, 연결하려는 내부 IP를 지정해주어야함 28 | 29 | 30 | -------------------------------------------------------------------------------- /network/lhk/Network-Model.md: -------------------------------------------------------------------------------- 1 | # 네트워크 모델 2 | - [TCP/IP 모델](#TCP/IP-모델) 3 | - [OSI 7계층 모델](#OSI-7계층-모델) 4 | - [두 모델 비교](#두-모델-비교) 5 | - [패킷](#패킷) 6 | - 참고 자료 7 | 8 | https://www.youtube.com/watch?v=y9nlT52SAcg&list=PL0d8NnikouEWcF1jJueLdjRIC4HsUlULi&index=4 9 | 수제비 2020 정보처리기사 필기 10 | 후니의 쉽게 쓴 네트워킹 11 | 12 | ## TCP/IP 모델 13 | 14 | 15 | ## OSI 7계층 모델 16 | ISO에서 표준으로 지정한 모델 17 | **면접에서 가장 많이 물어보는 모델** 18 | 19 | 1계층(물리. Physical Layer) - 전기적, 기능적인 특성을 이용해서 통신 케이블로 데이터 전송 20 | |계층|개념|특징|프로토콜|전송단위|장치| 21 | |-|-|-|-|-|-| 22 | |7계층: 응용
(Application Layer)|일반적인 응용 서비스 수행|응용 서비스 연결
데이터 생성|HTTP, FTP|데이터(Data)|L7 스위치| 23 | |6계층: 표현
(Presentation Layer)|하위 계층에서 온 데이터를 사용자가 이해할 수 있는 형태로 만드는 역할|암/복호화
데이터 압축|JPEG, MPEG|데이터(Data)|-| 24 | |5계층: 세션
(Session Layer)|논리적인 연결 담당|통신하는 사용자 동기화|SSH, TLS|데이터(Data)|L5 스위치| 25 | |4계층: 전송
(Transport Layer)|신뢰성 있는 데이터 전달|데이터 분할
흐름 제어
오류 제어
혼잡 제어|TCP(연결), UDP(비연결)|세그먼트(Segment)|L4 스위치| 26 | |3계층: 네트워크
(Network Layer)|다양한 길이의 패킷 전달|라우팅
패킷 포워딩
인터네트워킹|ARP, IP, ICMP|패킷(Packet)|라우터, L3 스위치| 27 | |2계층: 데이터링크
(Data Link Layer)|직접 연결된 노드 간 데이터 물리적인 전송|오류 제어
흐름 제어|Ethernet|프레임(Frame)|스위치, 브리지| 28 | |1계층: 물리
(Physical Layer)|실제 장치들을 연결하기 위해 필요한 물리적 세부 사항 정의|0과 1의 비트 정보를 전기적 신호로 변환|RS-232C|비트(Bit)|허브| 29 | 30 | ## 두 모델 비교 31 | ### 공통점 32 | - 계층적 네트워크 모델 33 | - 계층간 역할 정의 34 | ### 차이점 35 | - TCP/IP는 프로토콜 기반. 데이터 전송기술 (실무적) 36 | - OSI는 역할 기반. 통신 전반에 대한 표준 (논리적) 37 | 38 | ## 패킷 39 | 네트워크에서 전달하는 데이터의 형식화된 **블록** 40 | 여러 프로토콜들로 캡슐화 41 | 제어 정보와 사용자 데이터(페이로드)로 이루어짐 - 누가 누구에게, 어떻게 어떤 데이터를, 뭘 요청하는지, 뭘 보내주는지 등등 42 | 헤더 + 페이로드(실질 데이터) + 풋터(잘 사용하지 않음) 43 | 44 | ### 캡슐화 45 | 페이로드에 프로토콜을 헤더로 붙이는 과정 46 | 패킷을 **보낼 때** 사용 47 | 상위 계층에서 하위 계층으로 내려가면서 프로토콜을 붙임 48 | 하위 계층에 상위 계층을 붙일 수 없음 49 | 50 | 51 | ### 디캡슐화 52 | 패킷을 **받을 때** 사용 53 | 하위 계층부터 까보면서 상위 계층 확인 54 | 55 | 56 | ## 계층별 패킷 이름 57 | ### 세그먼트 58 | 4계층까지 캡슐화된 상태 59 | **TCP(4계층) + 데이터** 60 | 61 | ### 패킷 => 네트워크상에서 전달되는 데이터(패킷)과 다른 의미 62 | 3계층까지 캡슐화된 상태 63 | **IPv4(3계층) + TCP(4계층) + 데이터** 64 | 65 | ### 프레임 66 | 2계층까지 캡슐화된 상태 67 | **Ethernet(2계층) + IPv4(3계층) + TCP(4계층) + 데이터** 68 | 69 | 70 | 71 | -------------------------------------------------------------------------------- /network/lhk/Network.md: -------------------------------------------------------------------------------- 1 | - [네트워크](#네트워크) 2 | - [인터넷](#인터넷) 3 | - [네트워크 분류](#네트워크-분류) 4 | - [네트워크 통신 방식](#네트워크-통신-방식) 5 | - [프로토콜](#프로토콜) 6 | - 참고 자료 7 | 8 | https://www.youtube.com/watch?v=Av9UFzl_wis&list=PL0d8NnikouEWcF1jJueLdjRIC4HsUlULi&index=1 9 | 10 | ## 네트워크 11 | 노드들이 데이터를 공유할 수 있게 하는 디지털 전기통신망 12 | 분산된어 있는 컴퓨터를 통신망으로 연결한 것 13 | 14 | ## 인터넷 15 | 문서, 그림 영상과 같은 여러가지 데이터를 공유하도록 구성된 세상에서 가장 큰 전세계를 연결하는 네트워크 16 | 네트워크 망의 한 종류 17 | cf) www: 인터넷을 통해 웹과 관련된 데이터를 공유하는 것 18 | 19 | ### 인터넷의 특징 20 | 1. TCP/IP라는 하나의 프로토콜만 사용 21 | 2. 웹 브라우저 이용 22 | 23 | ## 네트워크 분류 24 | ### 크기에 따른 분류 25 | 1. LAN(Local Area Network): 가까운 지역을 하나로 묶은 네트워크. 예) 같은 피시방에 있는 사람들끼리만 게임 26 | 2. WAN(Wide Area Network): 멀리 떨어진 지역을 하나로 묶은 네트워크. 여러개의 LAN과 LAN을 하나로 묶은 것. 27 | ### 연결 형태에 따른 분류 28 | 1. Star형: 중앙 장비에 모든 노드 연결. 중앙 장비가 고장나면 네트워크 통신이 되지 않음. LAN 대역에서 주로 사용 29 | 2. Mesh형: 여러 노드가 서로 연결. 어느 하나가 고장나도 전체에 영향 없음. WAN 대역에서 주로 사용 30 | * 실제 인터넷은 여러 형태가 혼합 31 | 32 | ## 네트워크 통신 방식 33 | 1. 유니캐스트: 특정 대상과 1:1 통신. 목적지 주소가 아닌 다른 PC의 CPU 성능을 저하시키지 않음.(자신에게 온게 아니면 버려서) 34 | 2. 멀티캐스트: 특정 다수와 1:N 통신. 35 | 3. 브로드캐스트: 내가 속한 네트워크 안의 모든 대상과 통신. 패킷을 받은 PC의 CPU 성능 저하.(하던 일을 멈추고 다른 일을 해야해서) 36 | 37 | ## 프로토콜 38 | 네트워크에서 노드와 노드가 통신할 때, 어떤 노드가 어느 노드에게 어떤 데이터를 어떻게 보내는지 작성하기 위한 약속 39 | 여러 가지 프로토콜들로 캡슐화된 패킷 사용 40 | 41 | ## 여러 가지 프로토콜 42 | 가까운 곳과 연락할 때: Ethernet 프로토콜(MAC 주소 사용) 43 | 멀리 있는 곳과 연락할 때: ICMP, IPv4, ARP(IP 주소 사용) 44 | 여러가지 프로그램으로 연락할 때: TCP, UDP(포트 번호) 45 | -------------------------------------------------------------------------------- /network/yij/README.md: -------------------------------------------------------------------------------- 1 | # 2) Network 2 | - contributor : [김경원](https://github.com/shining8543) , [윤이진](https://github.com/483759) , [이현경](https://github.com/honggoii) , [진수연](https://github.com/jjuyeon) 3 |
4 | 5 | ## 데이터 링크 계층의 역할과 Ethernet 프로토콜 정리 6 | [링크](https://2jinishappy.tistory.com/254) 7 | 8 | ### :notebook_with_decorative_cover: 네트워크와 모델 9 | 1. 네트워크, 인터넷, 프로토콜의 개념을 설명해주세요. 10 | 11 | 12 | 네트워크란 분산되어 있는 컴퓨터들을 통신망으로 연결한 구조를 말합니다. 네트워크 내의 모든 장치들은 노드 간 연결을 사용하여 서로 데이터를 주고받습니다. 13 | 인터넷은 문서, 그림, 영상 등의 자원 및 데이터를 공유하도록 구성된 네트워크를 의미합니다. 14 | 프토토콜은 네트워크에서 통신할 때 어떤 노드가 어느 노드에게 어떤 데이터를 어떻게 보낼지를 규정하는 네트워크 상의 통신 규약입니다. 15 | 2. 네트워크 통신방식 3가지를 설명하고 해당 통신방식에 속하는 예시를 하나 설명해주세요. 16 | 17 | - 유니캐스트 : 특정 대상과 1:1 통신 18 | - 멀티캐스트 : 다수와 1:N 통신 19 | - 브로드캐스트 : 네트워크에 있는 모든 대상과 통신 20 | 3. 네트워크 모델 2가지를 설명하고 두 모델의 공통점과 차이점을 설명해주세요. 21 | 22 | - TCP/IP 네트워크 모델 : 4개의 계층(네트워크 인터페이스 - 네트워크 - 전송 - 응용) 23 | - OSI 7계층 네트워크 모델 : 7개의 계층(물리 - 데이터 링크 - 네트워크 - 전송 - 세션 - 표현 - 응용) 24 | - 공통점 : 네트워크를 계층적으로 표현했다 25 | - 차이점 : 실질적인 네트워크 모델은 프로토콜 별로 구분한 TCP/IP가 더 적합. OSI는 역할 기반이며 현재 통신 전반에 대한 표준 26 | 27 | ### :notebook_with_decorative_cover: 데이터 통신 28 | 1. Ethernet에 대해 설명하세요. 29 | 2. LAN에 대해 설명하세요. 30 | 3. 데이터 링크 계층의 역할에 대해 설명하세요. 31 | 32 | ### :notebook_with_decorative_cover: IP 주소 33 | 1. 공인 IP와 사설 IP의 차이에 대해서 설명해주세요. 34 | 35 | 공인 IP는 실제 인터넷 상에서 노드를 탐색할 때 사용하는 주소이며, 사설 IP는 하나의 공인 IP에 연결된 LAN 대역의 장비들에 분포된 IP주소입니다. 36 | 2. IPv4 와 IPv6의 차이는? 37 | 38 | IPv4는 4bytes로 표현된 IP주소이며, 현재 사용하고 있는 IP 주소의 표준입니다. x.x.x.x로 이루어 졌지만 현재 네트워크 장비들이 너무 많아 모든 네트워크의 주소를 표현할 수 없다는 단점이 존재하여 IPv6가 등장했습니다. IPv6는 x.x.x.x.x.x로 표현 가능하고 16bytes로 구성되어 있습니다. 하지만 모든 단말의 통신 방식을 변경하는 것이 어려워 아직 실질적인 적용은 불가능합니다. 39 | 3. 서브넷 마스크에 대해서 설명해주세요. 40 | 41 | IP주소에 대해 어디까지가 네트워크 대역을 구분하는 지, 어디서부터가 호스트인지 나타내기 위해 사용 42 | 4. IP 주소 클래스에 대해서 설명해주세요. 43 | 44 | |클래스|네트워크 구분|시작 주소|끝 주소|네트워크 대역|속해 있는 PC수| 45 | |-|-|-|-|-|-| 46 | |A 클래스|0XXXXXXX|0.0.0.0|127.255.255.255|0. ~ 127.|0.0.0 ~ 255.255.255| 47 | |B 클래스|10XXXXXX|128.0.0.0|191.255.255.255|128.0. ~ 191.255.|0.0 ~ 255.255| 48 | |C 클래스|110XXXXX|192.0.0.0|223.255.255.255|192.0.0. ~ 223.255.255.|0 ~ 255| 49 | |D 클래스
(멀티캐스트)|1110XXXX|224.0.0.0|239.255.255.255|-|-| 50 | |E 클래스
(예약)|1111XXXX|240.0.0.0|255.255.255.255|-|-| 51 | 52 | ### :notebook_with_decorative_cover: ARP 프로토콜 53 | 1. ARP 프로토콜 동작 흐름에 대해 설명해주세요. (ARP 프로토콜에 대해 설명해주세요.) 54 | 55 | ARP 프로토콜 : IP주소를 이용해서 같은 네트워크 대역에서 통신하기 위해 필요한 MAC 주소를 알아내는 프로토콜 56 | - A컴퓨터가 C컴퓨터에게 ARP 요청 (목적지를 모르지만 출발 MAC, 출발 IP주소, 도착 IP주소는 기입 후 도착 MAC 주소는 1로 채운다) 57 | - 스위치가 요청을 받으면 같은 네트워크 대역의 모든 컴퓨터에게 전송 58 | - 본인의 IP주소와 목적 IP주소가 일치하지 않으면 요청 폐기 59 | - 일치하면 응답 프로토콜을 만들어 다시 A컴퓨터에게 ARP 응답(출발 MAC주소에 자신의 MAC주소 기입) 60 | - A컴퓨터가 응답받으면 ARP 캐시 테이블에 MAC주소를 기입 61 | 2. ARP와 RARP를 비교해서 설명해주세요. 62 | 63 | ARP 프로토콜이 IP주소를 이용해서 상대방의 MAC주소를 알아내는 프로토콜이라면, RARP는 반대로 MAC 주소에 해당하는 상대방의 IP주소를 알아내는 프로토콜입니다. -------------------------------------------------------------------------------- /network/yij/cookie.md: -------------------------------------------------------------------------------- 1 | # 쿠키, 세션, 캐시의 차이 2 | : HTTP 프로토콜의 약점을 보완하기 위해 사용 3 | - Connectioneless (비연결지향) 4 | - HTTP 프로토콜을 이용한 Request/Response 시 연결을 계속 유지하지 않는다 5 | - Stateless (상태정보 유지X) 6 | - 서버는 클라이언트의 상태를 저장하지 않는다 7 | 8 | 실제로는 로그인 저장, 장바구니 유지 등 데이터를 유지해야 할 필요가 있다 9 | -> 이러한 Stateless 특성을 극복하기 위해 **쿠키**와 **세션**을 사용한다 10 | 11 | ## 쿠키 12 | : 인터넷 사용자가 어떠한 웹 사이트를 방문할 경우 그 사이트가 사용하고 있는 서버를 통해 인터넷 사용자의 컴퓨터에 설치되는 기록 정보 파일 13 | 14 | ![cookie](img/cookie.JPG) 15 | 16 | - 이름 17 | - 값 18 | - 0개 이상의 속성(이름/값 쌍) - 쿠키 만료 시간, 도메인, 플래그 등의 정보 19 | 20 | #### 쿠키의 구현 21 | 웹 브라우저에 의해 송신되며 웹 브라우저에 의해 클라이언트 컴퓨터에 저장됨 22 | 이후 브라우저는 상태를 Stateless 트랜잭션으로 유입시키면서 모든 요청을 서버로 전달 23 | 24 | #### 쿠키의 동작 순서 25 | 26 | 1. 클라이언트가 페이지를 요청한다. (사용자가 웹사이트 접근) 27 | 2. 웹 서버는 쿠키를 생성한다. 28 | 3. 생성한 쿠키에 정보를 담아 HTTP 화면을 돌려줄 때, 같이 클라이언트에게 돌려준다. 29 | 4. 넘겨 받은 쿠키는 클라이언트가 가지고 있다가(로컬 PC에 저장)다시 서버에 요청할 때 요청과 함께 쿠키를 전송한다. 30 | 5. 동일 사이트 재방문시 클라이언트의 PC에 해당 쿠키가 있는 경우, 요청 페이지와 함께 쿠키를 전송한다. 31 | 32 | #### 쿠키의 활용 33 | > 1. 아이디, 비밀번호 자동 저장 34 | > 2. 팝업창에서의 "오늘 하루 이 창을 열지 않기" 체크 35 | 36 | ## 세션 37 | : 반영구적이고 상호정보적인 정보 교환을 전제하는 둘 이상 간의 연결 상태 38 | 39 | 일정 시간(브라우저를 통해 웹 서버에 접속한 시간 or 특정 시간) 동안 상태를 유지한다 40 | 41 | - 웹 서버에 저장되는 쿠키 42 | - 브라우저를 닫거나 서버에서 세션을 삭제했을 때 같이 지워지므로 쿠키보다 보안이 좋다 43 | - 저장 데이터에 제한이 없다 44 | 45 | #### 세션의 특징 46 | 1. 클라이언트가 페이지를 요청한다. (사용자가 웹사이트 접근) 47 | 2. 서버는 접근한 클라이언트의 Request-Header 필드인 Cookie를 확인하여, 클라이언트가 해당 session-id를 보냈는지 확인한다 48 | 3. session-id가 존재하지 않는다면, 서버는 session-id를 생성해 클라이언트에게 돌려준다. 49 | 4. 서버에서 클라이언트로 돌려준 session-id를 쿠키를 사용해 서버에 저장한다. 쿠키 이름 : JSESSIONID 50 | 5. 클라이언트는 재접속 시, 이 쿠키(JSESSIONID)를 이용하여 session-id 값을 서버에 전달 51 | 52 | #### 쿠키의 활용 53 | > 1. 화면을 이동해도 로그인을 유지 54 | > 2. 쇼핑 사이트에서 장바구니 기능 55 | 56 | ## 쿠키 VS 세션 57 | 58 | ||쿠키|세션| 59 | |-|-|-| 60 | |저장 위치|클라이언트|웹 서버| 61 | |저장 형식|text|Object| 62 | |만료 시점|쿠키 저장 시 설정
(브라우저가 종료되어도 남아있음)|브라우저 종료 시 삭제
(기간 지정 가능)| 63 | |사용 자원|클라이언트 리소스|서버 리소스| 64 | |용량 제한|총 300개
한 도메인 당 20개
하나의 쿠키 당 4KB|서버가 허용하는 한 무제한| 65 | |속도|세션보다 빠름|쿠키보다 느림| 66 | |보안|비교적 취약|비교적 안전| -------------------------------------------------------------------------------- /network/yij/http.md: -------------------------------------------------------------------------------- 1 | # 7계층 프로토콜 HTTP 2 | 3 | ## HTTP 프로토콜 4 | 5 | 웹을 만드는 기술들 6 | 7 | - 필수 8 | 9 | > **HTTP(HTTPS -> SSL/TLS), HTML, Javascript, CSS**, ASP/ASP.NET, **JSP**, PHP, DB 10 | 11 | - 선택 12 | > Python, Spring, Jquery, Ajax 13 | 14 |
15 | 16 | ## HTTP 프로토콜 17 | 18 | : HyperText Transfer Protocol(하이퍼 텍스트 전송 프로토콜) 19 | 20 | > www에서 쓰이는 핵심 프로토콜로 문서의 전송을 위해 쓰이며, 오늘날 거의 모든 웹 애플리케이션에서 사용되고 있다. 21 | > -> 음성, 화상 등 여러 종류의 데이터를 MIME로 정의하여 전송 가능 22 | 23 | ### HTTP 특징 24 | 25 | : Request/Response (요청/응답) 동작에 기반하여 서비스 제공 26 | 27 | ### HTTP 1.0 28 | 29 | ![httpdiff](img/httpdiff.png) 30 | 31 | : "연결 수립, 동작, 연결 해제"의 단순함이 특징 -> 하나의 URL은 하나의 TCP 연결 32 | HTML 문서를 전송 받은 뒤 연결을 끊고 다시 연결하여 데이터를 전송한다 33 | 34 | #### 문제점: 단순 동작(연결 수립, 동작, 연결 해제)이 반복되어 통신 부하 문제 발생 35 | 36 | ### HTTP Request Protocol 37 | 38 | ![req](img/request.png) 39 | 40 | : 요청하는 방식을 정의하고 클라이언트의 정보를 담고 있는 Request Protocol 구조 41 | 42 | - Request Line 43 | - Header 44 | - Empty Line 45 | - Body 46 | 47 | #### Request Line 48 | 49 | | **요청 타입** | 공백 | **URI** | 공백 | HTTP 버전 | 50 | | ------------- | ---- | ------- | ---- | --------- | 51 | 52 |
53 | 54 | ##### HTTP Method 55 | 56 | ![method](img/method.jpg) 57 | 58 | | GET | POST | 59 | | ------------------------------------------------ | ---------------------------------------- | 60 | | 특정 데이터를 요청 | 클라이언트가 서버로 데이터를 전송 | 61 | | URI에 요청 데이터를 query string으로 붙여서 전송 | HTTP Request Body에 데이터를 넣어서 전송 | 62 | 63 |
64 | 65 | ### URI(Uniform Resource Identifier) 66 | : 인터넷 상에서 특정 자원(파일)을 나타내는 유일한 주소 67 | 68 | **scheme://host[:port][/path][?query]** 69 | ex) 70 | - ftp : //IP주소 :포트 /파일이름 71 | - http : //IP주소(도메인주소) :포트 /폴더이름/파일이름 72 | 73 | ### HTTP Response Protocol 74 | 75 |
76 | 77 | #### Request Line 78 | 79 | | **HTTP 버전** | 공백 | **상태 코드** | 공백 | 상태 문구 | 80 | | ------------- | ---- | ------- | ---- | --------- | 81 | 82 |
83 | 84 | #### Response Status Code 85 | 86 | HTTP Status Code는 100 ~ 511번까지 존재 87 | 88 | 각각의 백의 자리 숫자에 따라 89 | 90 | - 1xx (정보): 요청을 받았으며 프로세스를 계속한다 91 | - 2xx (성공): 요청을 성공적으로 받았으며 인식했고 수용하였다 92 | - 3xx (리다이렉션): 요청 완료를 위해 추가 작업 조치가 필요하다 93 | - 4xx (클라이언트 오류): 요청의 문법이 잘못되었거나 요청을 처리할 수 없다 94 | - 5xx (서버 오류): 서버가 명백히 유효한 요청에 대해 충족을 실패했다 95 | 96 |
97 | 98 | ##### 대표적인 Status Code 99 | - 200-OK: Client의 요청이 성공했다는 것을 나타낸다 100 | - 403-Forbidden: Client가 권한이 없는 페이지를 요청했을 때 101 | - 404-Not Found: Client가 서버에 없는 페이지를 요청했을 때 102 | - 500-Internal Server Error: Server의 일부가 멈췄거나 설정 오류가 발생 103 | - 503-Service Unavailable: 최대 Session 수를 초과했을 때 104 | 105 |
106 | 107 | ### HTTP 헤더 포맷 108 | 109 | #### 일반 헤더 110 | 111 | |헤더 종류|설명| 112 | |-|-| 113 | |Content-Length|메시지 바디 길이를 나타낼 때 쓰인다| 114 | |Content-Type|메시지 바디에 들어있는 컨텐츠 종류(Ex: HTML 문서는 text/html)| 115 | 116 |
117 | 118 | #### 요청 헤더 119 | 120 | |헤더 종류|설명| 121 | |-|-| 122 | |Cookie|서버로부터 받은 쿠키를 다시 서버에게 보내주는 역할| 123 | |**Host**|요청된 URL에 나타난 호스트명을 상세하게 표시(HTTP 1.1은 필수)| 124 | |User-Agent|Client Program에 대한 식별 가능 정보 제공| 125 | 126 |
127 | 128 | #### 응답 헤더 129 | 130 | |헤더 종류|설명| 131 | |-|-| 132 | |Server|사용하고 있는 웹서버의 소프트웨어에 대한 정보 포함| 133 | |Set-Cookie|쿠키를 생성하고 브라우저에 보낼 때 사용. 해당 쿠키 값을 브라우저가 서버에게 다시 보낼 때 사용한다| -------------------------------------------------------------------------------- /network/yij/img/3way.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjuyeon/Tech-Interview-Study/f5f4978becafb443db02eee145e58f6a1618dfa2/network/yij/img/3way.jpg -------------------------------------------------------------------------------- /network/yij/img/conn_continue.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjuyeon/Tech-Interview-Study/f5f4978becafb443db02eee145e58f6a1618dfa2/network/yij/img/conn_continue.jpg -------------------------------------------------------------------------------- /network/yij/img/cookie.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjuyeon/Tech-Interview-Study/f5f4978becafb443db02eee145e58f6a1618dfa2/network/yij/img/cookie.JPG -------------------------------------------------------------------------------- /network/yij/img/disconnection.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjuyeon/Tech-Interview-Study/f5f4978becafb443db02eee145e58f6a1618dfa2/network/yij/img/disconnection.jpg -------------------------------------------------------------------------------- /network/yij/img/http10.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjuyeon/Tech-Interview-Study/f5f4978becafb443db02eee145e58f6a1618dfa2/network/yij/img/http10.JPG -------------------------------------------------------------------------------- /network/yij/img/httpdiff.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjuyeon/Tech-Interview-Study/f5f4978becafb443db02eee145e58f6a1618dfa2/network/yij/img/httpdiff.png -------------------------------------------------------------------------------- /network/yij/img/method.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjuyeon/Tech-Interview-Study/f5f4978becafb443db02eee145e58f6a1618dfa2/network/yij/img/method.JPG -------------------------------------------------------------------------------- /network/yij/img/nat.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjuyeon/Tech-Interview-Study/f5f4978becafb443db02eee145e58f6a1618dfa2/network/yij/img/nat.JPG -------------------------------------------------------------------------------- /network/yij/img/request.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjuyeon/Tech-Interview-Study/f5f4978becafb443db02eee145e58f6a1618dfa2/network/yij/img/request.png -------------------------------------------------------------------------------- /network/yij/img/sliding_window.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjuyeon/Tech-Interview-Study/f5f4978becafb443db02eee145e58f6a1618dfa2/network/yij/img/sliding_window.png -------------------------------------------------------------------------------- /network/yij/img/tcp_communication.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjuyeon/Tech-Interview-Study/f5f4978becafb443db02eee145e58f6a1618dfa2/network/yij/img/tcp_communication.PNG -------------------------------------------------------------------------------- /network/yij/img/tcp_diagram.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjuyeon/Tech-Interview-Study/f5f4978becafb443db02eee145e58f6a1618dfa2/network/yij/img/tcp_diagram.PNG -------------------------------------------------------------------------------- /network/yij/img/tcp_protocol.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjuyeon/Tech-Interview-Study/f5f4978becafb443db02eee145e58f6a1618dfa2/network/yij/img/tcp_protocol.PNG -------------------------------------------------------------------------------- /network/yij/ip.md: -------------------------------------------------------------------------------- 1 | ## IP 프로토콜 - 네트워크 상에서 데이터를 교환하기 위한 프로토콜 2 | 3 | 데이터가 정확하게 전달될 것을 보장하지 않는다 4 | 5 | 중복된 패킷을 전달하거나 패킷의 순서를 잘못 전달할 가능성도 있다(악의적으로 이용하면 Dos 공격이 된다). 6 | 7 | 데이터의 정확하고 순차적인 전달은 그보다 상위 프로토콜인 TCP에서 보장한다 8 | 9 | 10 | 11 | - version : IPv4 or IPv6인데 현재 IPv4를 사용 12 | 13 | - IHL : (헤더의 길이)/4 를 2진수로 표현 14 | 15 | - Total Length : PayLoad까지 합친 헤더의 길이 16 | 17 | - Identification & IP Flags & Fragment Offset : 18 | - IP Flags : D - 패킷을 조각화하지 않겠다 / M - 첫 번째 패킷 뒤에 패킷이 더 있다는 것을 알림 19 | - Fragment Offset : 조각화된 패킷의 순서를 알아내기 위함 20 | - TTL : 패킷이 살아있을 수 있는 시간 21 | - Protocol : 전송계층 프로토콜 종류(상위 프로토콜) 22 | - Header Checksum : 헤더에 오류가 있는지 체크하기 위함 23 |
24 | 25 | ### IPv4의 조각화 26 | : 큰 IP 패킷들이 적은 MTU(Maximum Transmission Unit)를 갖는 링크를 통해 전송되려면 여러 개의 작은 패킷으로 쪼개어/조각화되어 전송되어야 한다. 27 | 즉, 목적지까지 패킷을 전달하는 과정에서 통과하는 각 라우터마다 전송에 적합한 프레임으로의 변환이 필요하다. 28 | 일단 조각화되면, 최종 목적지에 도달할 때 까지 재조립되지 않는 것이 일반적이다. 29 | - IPv4에서는 발신지 뿐 아니라 중간 라우터에서도 IP 조각화가 가능 30 | - IPv6에서는 IP단편화가 발신지에서만 가능 31 | - 재조립은 항상 최종 수신지에서만 가능 32 | 33 | 34 | ## ICMP 프로토콜 - Internet Control Message Protocol 35 | 36 | 네트워크 컴퓨터 위에서 돌아가는 운영체제에서 오류 메시지를 전송 받는 데 주로 쓰인다 37 | 38 | 프로토콜 구조의 Type과 Code를 통해 오류 메시지를 전송 받는다 39 | 40 | - 0 - 응답 41 | - 8 - 요청 42 | - 3 - 목적지까지 도달하지 못함 43 | - 11 - 목적지에는 도달했으나 응답받지 못함(ex. 방화벽) 44 | - 5 - 옛날에 쓰던 것으로 -------------------------------------------------------------------------------- /network/yij/nat.md: -------------------------------------------------------------------------------- 1 | # NAT와 포트포워딩 2 | 3 | ## NAT란? 4 | 5 | ![nat](img/nat.JPG) 6 | 7 | NAT(Network Address Translation)은 **IP 패킷의 TCP/UDP 포트 숫자와 소스 및 목적지의 IP 주소 등을 재기록**하면서 라우터를 통해 네트워크 트래픽을 주고 받는 기술 8 | 패킷에 변화가 생기기 때문에 IP나 TCP/UDP의 체크섬(checksum)도 다시 계산되어 재기록해야 한다. 9 | NAT를 이용하는 이유는 대개 사설 네트워크에 속한 여러 개의 호스트가 하나의 공인 IP 주소를 사용하여 인터넷에 접속하기 위함이다. 10 | 하지만 꼭 사설 IP를 공인 IP로 변환 하는 데에만 사용하는 기술은 아니다. 11 | 12 | ## 포트포워딩이란? 13 | 14 | 포트 포워딩 또는 포트 매핑(port mapping)은 패킷이 라우터나 방화벽과 같은 네트워크 장비를 가로지르는 동안 **특정 IP 주소와 포트 번호의 통신 요청을 특정 다른 IP와 포트 번호로 넘겨주는** 네트워크 주소 변환(NAT)의 응용이다. 15 | 이 기법은 게이트웨이(외부망)의 반대쪽에 위치한 사설네트워크에 상주하는 호스트에 대한 서비스를 생성하기 위해 흔히 사용된다. 16 | 17 | ### 포트포워딩 과정 18 | 19 | 1. 사설 IP 대역에서 목적 단말이 위치하는 대역의 공인 IP 2 - 특정 포트로 전송 20 | 2. 특정 포트로 들어온 요청을 다른 특정 IP의 특정 포트로 전송 21 | -------------------------------------------------------------------------------- /network/yij/proxy.md: -------------------------------------------------------------------------------- 1 | # Proxy 2 | 3 | ## (Network)Proxy란? 4 | 5 | 서버와 클라이언트 사이에 중계기로써 클라이언트 대신 서버와 대리로 통신을 수행하는 것(프록시 서버라고 함) 6 | 7 | - 클라이언트 대신 서버에게 요청을 받아 응답 8 | - 캐시를 통해 자원들을 저장 9 | - 프록시 서버를 거치는 요청 및 응답을 확인할 수 있음 10 | - 프록시 서버로 넘어온 데이터를 조작할 수 있음 11 | 12 |
13 | 14 | ## Proxy Server의 역할 15 | 16 | ### Web Cache Proxy 17 | 18 | 클라이언트가 서버로 가기 전 웹 캐싱 프록시 서버를 통해 캐싱을 해주는 역할 19 | 20 | - 네트워크 비용 감소 21 | - 응답 속도 향상 22 | 23 | ### Filter 24 | 25 | 프록시 서버를 거치는 요청 및 응답을 확인할 수 있음 26 | 클라이언트의 요청을 가로채 접근 권한에 대해 제어할 수 있음 27 | 28 | - 보안성 향상 29 | - 프록시를 통한 모든 요청/응답 로깅 가능 30 | 31 | ### TransCoder 32 | 33 | 프록시 서버로 넘어온 데이터를 조작할 수 있음 34 | (데이터 압축, 언어 반환) 35 | 36 | ex) 37 | 38 | - 스페인어를 사용하는 사용자 -> 응답 결과를 언어 변환해서 전달 39 | - 웹브라우저가 탑재된 모바일 -> 응답 결과를 압축해서 전달 40 | 41 |
42 | 43 | - 네트워크 비용 감소 44 | - 웹 서버의 역할 감소 45 | 46 | ### Anonymizer 47 | 48 | 프록시 서버로 넘어온 데이터를 조작할 수 있음 49 | 50 | ex) 51 | 익명화된 메시지는 식별화 정보를 포함하지 않는다 52 | 53 | - 보안성 향상 54 | 55 |
56 | 57 | ## Forward Proxy vs Reverse Proxy 58 | 59 | - Forward Proxy는 클라이언트 대신 요청을 보낸다 60 | - Reverse Proxy는 서버의 응답을 대신 클라이언트에게 전달한다 61 | 62 |
63 | 64 | ### Forward Proxy 65 | 66 | 클라이언트와 인터넷 사이에 위치함 67 | 68 | #### 캐싱 69 | 70 | 클라이언트가 요청한 내용 캐싱. 71 | 72 | 1. 전송 시간 절약 73 | 2. 불필요한 외부 전송 X 74 | 3. 외부 요청 감소로 인한 네트워크 병목 현상 방지 75 | 76 | #### 익명성 77 | 78 | 클라이언트가 보낸 요청을 감춰서 Server가 응답 받은 요청을 누가 보냈는지 알지 못하게 함 (Server가 받은 요청 IP = Proxy IP) 79 | 80 |
81 | 82 | ### Reverse Proxy 83 | 84 | #### 캐싱 85 | 86 | Forward Proxy와 동일한 역할 수행 87 | 88 | #### 보안 89 | 90 | 서버 정보를 클라이언트로부터 숨김. 클라이언트는 Reverse Proxy를 실제 서버라고 생각하여 요청하므로 실제 서버의 IP가 노출되지 않음 91 | 92 | #### Load Balancing 93 | 94 | 여러 대의 서버에 요청을 나누어 진행할 수 있도록 결정해주는 역할(네트워크의 고가용성) 95 | 96 | - 소규모 단위에서 배포중이던 서비스의 사용자가 증가했을 때 부하가 높아짐 97 | - Scale Up(Server의 하드웨어 성능을 높이는 것)을 통해 부하를 줄이고자 함 98 | - 서비스 규모가 커질 수록 Scale Up으로는 성능 향상의 한계가 있음 99 | - Scale Out(여러 대의 Server가 나누어 일을 하는 것)으로 규모가 커질 때 마다 서버를 추가하는 방식으로 서비스 규모를 유동적으로 확대할 수 있음 100 | - 해당 과정에서 여러 대의 서버가 분산 처리할 수 있도록 요청을 나누어주는 서비스를 Load Balancing이라고 함 101 | 102 | ##### Load Balancer 종류 103 | 104 | - L4: Transport Layer(IP & Port) Level에서 Load Balancing(TCP/UDP) 105 | - ex) https://2jinishappy.tistory.com/ 으로 접근 시 서버 A, 서버 B로 로드밸런싱 106 | - L7: Application Layer(User Request) Level에서 Load Balancing(HTTPS/HTTP/FTP) 107 | - ex) https://2jinishappy.tistory.com/ 으로 접근 시 /category와 /search를 담당 서버들로 로드밸런싱 108 | 109 |
110 | 111 | ### Proxy Server를 통한 무중단 배포 예시 112 | 113 | 1. SpringBoot 서버를 8081 Port로 구동 114 | 2. NginX Proxy 서버는 80 Port로 구동 115 | 3. EC2 Server에 접근 가능한 Port는 80밖에 없음 116 | 4. 80요청이 들어오면 Proxy Path를 통해 서버로 중개 가능 117 | 5. 새로운 변경 사항이 있어서 서버를 재시작 해야 할 경우 새로운 8082 Port로 서버를 구동시킴 118 | 6. NginX의 Proxy Path를 8082로 변경(리로드 시간은 체감할 수 없을 만큼 짧음) -------------------------------------------------------------------------------- /network/yij/rest.md: -------------------------------------------------------------------------------- 1 | # REST 2 | 3 | REST(Representational State Transfer)는 네트워크 아키텍처로써, 이를 유지하는 엔지니어링 원칙과 원칙을 위한 상호 작용의 제약으로 이루어진다. 4 | 5 | ## REST를 이끄는 원칙 6 | 7 | 웹 아키텍처를 구성하는 설계 방식은 그에 적용되는 제약 조건으로 설명할 수 있다. REST는 현대 웹 아키텍처가 요구하는 특성을 잘 반영할 수 있다. 8 | 9 | ### Null Style로 시작 -------------------------------------------------------------------------------- /network/yij/routertable.md: -------------------------------------------------------------------------------- 1 | ## 라우팅 테이블 2 | 3 | ``` 4 | nenstat -r 5 | ``` 6 | - 네트워크 대상: 네트워크 대역 7 | - 네트워크 마스크: 서브넷 마스크 8 | 9 | 어디로 보내야 하는지 설정되어 있는 라우팅 테이블(내가 보낸 패킷은 어디로 가는가?) 10 | 지도 상에 작성할 때 기본 값(기본 게이트웨이)를 작성해줌 11 | 12 |
13 | 14 | ## 다른 네트워크와 통신 과정 15 | #### A 컴퓨터가 B 컴퓨터와 통신 16 | 17 | 1. B의 네트워크 대역이 A의 대역에 있어야지만 통신 가능 18 | 2. ICMP 요청을 B 컴퓨터로 송신(Eth - IPv4 - ICMP 형식의 패킷) 19 | - Ethernet 프로토콜의 목적지 MAC주소는 현재 네트워크 대역의 단말 노드(라우터)!! 20 | 3. 라우터는 받은 패킷의 IP 주소를 확인한 뒤 자신의 라우팅테이블을 참고하여 Ethernet 헤더 재작성 후 전송(목적지 MAC주소 변경) 21 | 4. 목적지 MAC 주소에 도달할 때 까지 반복 22 | 5. B 컴퓨터가 1~4번의 행위를 통해 A 컴퓨터로 응답 -------------------------------------------------------------------------------- /network/yij/tcp.md: -------------------------------------------------------------------------------- 1 | # 연결지향형 TCP 프로토콜 2 | 3 | 네이버 D2 포스팅 - [TCP/IP 네트워크 스택 이해하기](https://d2.naver.com/helloworld/47667) 4 | 5 | ## TCP Protocol - Transmission Control Protocol 6 | 전송 제어 프로토콜은 인터넷에 연결된 컴퓨터에서 실행되는 프로그램 간에 통신을 **안정적으로, 순서대로, 에러없이** 교환할 수 있게 한다. 7 | 8 | TCP의 안정성을 필요로 하지 않는 애플리케이션의 경우 일반적으로 TCP 대신 비접속형 사용자 데이터그램 프로토콜(UDP)를 사용한다. 9 | 10 | TCP는 UDP보다 안전하지만 느리다는 단점이 있다. 11 |
12 | 13 | TCP는 4계층(전송) 프로토콜이고, IP는 3계층(네트워크) 프로토콜이라 분리된 것 이지만, 대부분의 인터넷 서비스가 TCP/IP 기반으로 동작하기 때문에 함께 보는 경우가 많다(). 14 | TCP 프로토콜의 핵심 요소는 15 | 16 | ![tcp](./img/tcp_protocol.png) 17 | - source port: 송신 포트 18 | - destination port: 수신 포트 19 | - sequence number 20 | - SYN Flag(1): 초기 시퀀스 번호. 실제 데이터의 최초 바이트 값과 그에 상응하는 ACK 번호는 이 값에 +1을 더한 값 21 | - SYN Flag(0): 현재 세션에서의 세그먼트 데이터의 최초 바이트 값의 누적 시퀀스 번호 22 | - acknowledgment number: 수신자가 예상하는 다음 시퀀스 번호 23 | - offset: TCP 헤더의 길이 24 | - reserved: 사용되지 않는 필드 25 | - window: 수신 윈도우의 크기 26 | - checksum: 헤더 및 데이터의 에러 확인을 위해 사용되는 16비트 비트 27 | - tcp options 28 | 29 | 30 | ### tcp flags 31 | - U: 긴급 bit(우선순위 높음) 32 | - A: Ack bit(승인에 대한 응답) 33 | - P: Push bit(데이터의 포화 여부에 상관 없이 전송, 우선순위 낮음) 34 | - R: Reset bit(연결이 되어 있는 상태에서 문제가 발생했을 때 연결 관계 초기화) 35 | - S: Syn bit(동기화 비트, 상대방과 연결을 할 때 무조건 사용) 36 | - F: Fin bit(종료 비트) 37 | 38 | ## TCP를 이용한 통신 과정 39 | 40 | ### 3-Way Handshake 41 | TCP를 이용한 데이터 통신을 할 때 프로세스와 프로세스를 연결하기 위해 가장 먼저 수행하는 과정 42 | 43 | ![3way](img/3way.jpg) 44 | 45 | 1. 클라이언트가 서버에게 요청 패킷 전송 46 | 2. 서버가 클라이언트의 요청을 받아들이는 패킷 전송 47 | - 1번 패킷에서 받은 Seq + 1을 Ack로 보냄(동기화) 48 | 3. 클라이언트가 이를 수락하는 패킷 전송 49 | - 2번 패킷에서 받은 Seq + 1을 Ack로 보냄 50 | - 2번 패킷에서 받은 Ack를 Seq로 보냄 51 | 52 | 이러한 3개의 과정을 **3-Way Handshake**라고 한다 53 | 54 | ### 데이터 송수신 과정 55 | 56 | TCP를 이용한 데이터 통신을 할 때 단순히 TCP 패킷만을 캡슐화해서 통신하는 것이 아닌 페이로드를 포함한 패킷을 주고 받을 때의 일정한 규칙 57 | 58 | ![tcp_comm](img/tcp_communication.png) 59 | 60 | 1. 보낸 쪽에서 또 보낼 때는 Seq 번호와 Ack 번호가 그대로다 61 | 2. 받는 쪽에서 보내는 Seq 번호는 받은 Ack 번호가 된다 62 | 3. 받는 쪽에서 보내는 Ack 번호는 받은 Seq 번호 + 데이터 크기가 된다 63 | 64 | ### 4-way Handshake 65 | 66 | ![disconn](img/disconnection.jpg) 67 | 연결 종료 시 사용하는 방식 68 | 1. 송신 단말이 연결 종료 요청 69 | 2. 확인 메시지 보내고 통신 종료 대기 70 | 3. 연결 종료 메시지 전송 71 | 4. 확인 메시지 전송 72 | 73 | ## TCP 상태전이도 74 | 75 | ![tcp_diagram](img/tcp_diagram.png) 76 | - LISTEN: 클라이언트와의 연결을 기다리는 상태 77 | - ESTABLISHED: 클라이언트와 연결이 완료된 상태 78 | 79 | 80 | ## 신뢰성 있는 연결을 위한 제어 81 | 82 | ![sliding_window](img/sliding_window.png) 83 | - 흐름 제어 84 | 수신측에서 설정한 **슬라이딩 윈도우** 크기만큼 응답없이 송신하여 데이터 발생률을 조정하는 기법 85 | 우선 윈도우(메모리 버퍼의 일정 영역)에 모든 패킷을 전송한 뒤 패킷들의 전달이 확인되는 채로 윈도우를 옆으로 옮겨 그 다음 패킷을 전송 86 | - 혼잡 제어 87 | 네트워크 상태를 고려한 데이터 전송 속도 조절 88 | ACK 패킷의 수신되는 정도를 통해 혼잡 상태 파악 후 슬라이딩 윈도우의 크기 조절 89 | - 오류 제어(Ack-retransmission) 90 | ![conn_ctrl](img/conn_continue.jpg) -------------------------------------------------------------------------------- /network/yij/transport.md: -------------------------------------------------------------------------------- 1 | # 전송 계층 2 | 3 | ## 4계층(Transport Layer) 4 | : 송신자의 프로세스와 수신자의 프로세스를 연결하는 통신 서비스 제공 5 | 연결 지향 데이터 스트림 지원, 신뢰성, 흐름 제어, 다중화와 같은 편리한 서비스 제공 6 | 전송 프로토콜 중 가장 잘 알려진 것은 연결 지향 전송 방식을 사용하는 전송 제어 프로토콜(TCP)이다. 보다 단순한 전송에 사용되는 사용자 데이터그램 프로토콜(UDP)도 있다. 7 | 8 | ## Port 번호 9 | : 특정 프로세스와 특정 프로세스가 통신하기 위해 사용 10 | - 하나의 포트는 하나의 프로세스만 사용 가능 -> 포트 번호는 중복될 수 없다! 11 | - 하나의 프로세스가 여러 개의 포트를 사용하는 것은 가능 12 | - 포트 번호는 일반적으로 정해져 있지만 무조건 지켜야 하는 것은 아님 13 | - ex. 일반적으로 웹 서비스는 80번 포트를 사용하지만 웹 서비스가 항상 80번 포트를 사용해야만 하는 것은 아님 14 | 15 | 16 | ### Well-Known Port Number 17 | 18 | |서비스 이름|포트 번호| 19 | |----------|---------| 20 | |FTP|20번, 21번| 21 | |SSH|22번| 22 | |TELNET|23번| 23 | |DNS|53번| 24 | |DHCP|67번, 68번| 25 | |TFTP|69번| 26 | |**HTTP**|**80번**| 27 | |HTTPS|443번| 28 | 29 | ### Registered Port Number 30 | 31 | |서비스 이름|포트 번호| 32 | |----------|---------| 33 | |Oracle DB|1521번| 34 | |MySQL|3306번| 35 | |MS 원격 데스크탑|3389번| -------------------------------------------------------------------------------- /network/yij/udp.md: -------------------------------------------------------------------------------- 1 | ## 비연결지향형 UDP 프로토콜 2 | 3 | ### UDP 프로토콜 - User Datagram Protocol 4 | - 전송 방식이 단순해서 서비스의 신뢰성이 낮다 5 | - 데이터그램 도착 순서가 바뀌거나, 중복되거나, 통보 없이 누락될 수 있다 6 | - 일반적으로 오류의 검사와 수정이 필요 없는 프로그램에서 수행할 것으로 가정한다 7 | 8 |
9 | 10 | > Source Port 11 | > Destination Port 12 | > Length 13 | > Checksum 14 | 15 | 으로 이루어져 있다 16 | 17 | ### UDP 프로토콜을 사용하는 프로그램 18 | 19 | 1. DNS 서버(도메인을 물으면 IP 주소를 알려주는) 20 | 2. tftp 서버(UDP 프로토콜로 파일을 공유) 21 | 3. RIP 프로토콜(라우팅 정보를 공유) -------------------------------------------------------------------------------- /operatingSystem/README.md: -------------------------------------------------------------------------------- 1 | # 3) Operating System 2 | - contributor : [김경원](https://github.com/shining8543) , [윤이진](https://github.com/483759) , [이현경](https://github.com/honggoii) , [진수연](https://github.com/jjuyeon) 3 |
4 | 5 | ### :notebook_with_decorative_cover: Process & Thread 6 | 1. 프로세스와 스레드의 차이를 설명하세요. 7 | 2. 멀티 프로세스와 멀티 스레드의 차이를 설명하세요. 8 | 9 | ### :notebook_with_decorative_cover: System call 10 | 1. 시스템 콜에 대해 설명해주세요. 11 | 2. 프로세스가 종료되는 두 가지 조건에 대해 설명해주세요. 12 | 13 | ### :notebook_with_decorative_cover: CPU Scheduling 14 | 1. 자신이 알고 있는 CPU 스케줄링을 선점형, 비선점형으로 나누어 특징을 설명해주세요. 15 | 2. 1에서 설명한 각 CPU 스케줄링의 단점을 설명해주세요. 16 | 17 | ### :notebook_with_decorative_cover: Sync & Async 18 | 1. 동기와 비동기의 차이(블로킹, 넌블로킹) 를 장단점과 함께 설명해주세요. 19 | 2. 교착상태(데드락)란 무엇이며, 교착상태가 발생하는 조건을 설명해주세요. 20 | 3. 세마포어와 뮤텍스의 차이에 대해 설명해주세요. 21 | 22 | ### :notebook_with_decorative_cover: Memory Management 23 | 1. 운영체제의 메모리 관리 전략인 Contiguous Allocation, Noncontiguous Allocation의 차이점을 설명해주세요. 24 | 2. Swapping이란? 25 | - Swapping 시 발생할 수 있는 문제점? 26 | - 외부 단편화를 해소할 수 있는 방법 두 가지 제시 27 | 28 | ### :notebook_with_decorative_cover: Paging & Segmentation 29 | 1. 페이징과 세그먼테이션에 대해서 설명하세요. 30 | 2. 내부 단편화와 외부 단편화가 무엇인지 설명하세요. 31 | 32 | ### :notebook_with_decorative_cover: Vertual Memory 33 | 1. 가상 메모리가 필요한 이유를 하는 일과 관련지어 설명해주세요. 34 | 2. 요구 페이징이란 무엇이고, 요구 페이징에서 Page Fault가 발생했을 때, 처리되는 Page 교체 순서에 대해 설명해주세요. 35 | 36 | ### :notebook_with_decorative_cover: Page replacement 37 | 1. 페이지 부재(page fault)가 무엇인지 설명해주세요. 38 | 2. 페이지 교체란 무엇인지 설명해주세요. 39 | 3. 페이지 교체 알고리즘의 종류와 각각의 특징에 대해 설명해주세요. 40 | -------------------------------------------------------------------------------- /operatingSystem/jsy/README.md: -------------------------------------------------------------------------------- 1 | # Suyeon Jin 2 | 3 | |Study|바로가기| 4 | |---|---| 5 | |프로세스 & 스레드|[:white_check_mark:](../jsy/process_thread.md)| 6 | |시스템 콜|[:white_check_mark:](../jsy/systemcall.md)| 7 | |CPU 스케줄링|[:white_check_mark:](../jsy/scheduling.md)| 8 | |동기화 & 비동기화|[:white_check_mark:](../jsy/synchronized_deadlock.md)| 9 | |메모리 관리|[:white_check_mark:](../jsy/memory.md)| 10 | |페이징 & 세그멘테이션|[:white_check_mark:](../jsy/paging.md)| 11 | |가상 메모리|[:white_check_mark:](../jsy/virtual_memory.md)| 12 | |페이지 교체|[:white_check_mark:](../jsy/replacement.md)| -------------------------------------------------------------------------------- /operatingSystem/jsy/systemcall.md: -------------------------------------------------------------------------------- 1 | # :question: System call 2 | 3 | #### reference 4 | https://luckyyowu.tistory.com/2
5 | https://velog.io/@adam2/%EC%9D%B8%ED%84%B0%EB%9F%BD%ED%8A%B8 6 |
7 | 8 | ## Question 9 | 1. [시스템 콜에 대해 설명해주세요.](#1-system-call시스템-호출) 10 | - 시스템 콜이란 일반 응용프로그램이 시스템의 자원을 사용하여 작업하기 위해, 커널에 접근해야 할 때 사용되는 인터페이스입니다. 11 | - 일반 응용프로그램이 malloc 함수를 사용하여 메모리 할당을 요청할 때, 시스템 콜을 호출하여 커널 모드로 전환하여 메모리 값을 전달받을 수 있습니다. 12 | - 또한, cp 명령어를 사용하여 파일을 복사하고자 할 때, 파일을 접근할 수 있는지 검사하기 위해, 시스템 콜을 호출합니다. 이때, 파일이 존재하지 않는다면 에러가 발생하고 종료 시에도 시스템 콜이 호출됩니다. 13 |

14 | 15 | 2. [프로세스가 종료되는 두 가지 조건에 대해 설명해주세요.]() 16 |
17 | 18 | ## :nerd_face: What I study 19 | ### 1. System call(시스템 호출) 20 | - 함수호출이긴 하나, 자신의 주소 공간을 거스르는 영역에 존재하는 함수를 호출하는 것 21 | - 자신의 프로그램이 아닌, **커널**이라는 다른 프로그램의 주소 공간에 존재하는 함수를 호출하는 것 22 | - 주소 공간 자체가 다른 곳으로 이동해야 한다. 23 | - 프로세스가 하드웨어에 접근해서 필요한 기능을 수행할 수 있도록 한다. 24 | - 하드웨어와 응용 프로그램 사이에서 인터페이스를 제공한다. 25 | - cf) 일반적인 process 함수 호출 과정: 자신의 스택에 복귀 주소를 저장한 후 호출된 함수 위치로 점프한다. 26 | - system call은 운영체제에서 일반적인 사용자 모드가 아닌 커널 모드에서 동작하도록 한다. 27 | - 일반 응용프로그램이 시스템의 자원을 사용하여 작업하고자 할 때, system call을 사용한다. 28 | - 즉, system call은 **커널 모드**의 기능을 사용자 모드가 접근하게 도와주는 기능이라고 할 수 있다. 29 | 30 | #### 1) 사용자 모드 31 | - 시스템 자원이나 하드웨어를 직접적으로 컨트롤 할 수 없다. 32 | - 명령어의 일부와 하드웨어 기능의 일부만 사용할 수 있다. 33 | - 일반 응용프로그램이 동작하는 모드 34 | #### 2) 커널 모드 35 | - 프로세서의 모든 명령을 처리하고 시스템의 자원이나 하드웨어를 직접적으로 엑세스하여 컨트롤한다. 36 | - 실제 장치 드라이버나 운영체제 프로그램이 구동하는 모드 37 | - 시스템에 중요한 영향을 미치는 연산은 커널 모드에서만 실행 가능하도록 하여 보안을 유지하도록 했다. 38 | #### 3) 동작 방식 39 | ``` 40 | 1. 프로세스가 system call 호출 41 | 2. trap이 발생하여 커널 모드에 진입한다. 이때, 현재 상태를 저장한다. 42 | 3. 요청받은 system call을 수행한다. 43 | 4. 사용자 모드로 돌아간다. 이때, 저장해둔 이전 상태로 복원된다. 44 | ``` 45 | #### 4) System call 유형 46 | 1. 프로세서 제어 : 프로세서 특권 모드를 사용해 직접적으로 프로세서를 제어 가능 47 | - 새로운 프로세스 실행 ```exec```, 프로세스 생성 ```fork```, 자식 프로세스가 끝날 때까지 대기 ```wait```,
종료 ```exit```, 강제 종료 ```kill``` ```break``` ```ctrl + c```,
프로세스 중지, 프로세스 적재, 프로세스 속성 획득 및 설정, 메모리 할당 및 해제 ```malloc``` 48 | 2. 파일 조작 49 | - 파일을 생성하거나 삭제, 파일 열기 ```open```, 파일 읽기 ```read```, 파일 쓰기 ```write```,
파일 닫기, 파일 재배치, 파일 속성 획득 및 설정 50 | 3. 장치 관리 : 장치 요구 및 장치 해제, 읽기, 쓰기, 재배치, 장치 속성 획득 및 설정, 장치의 논리적 부착 및 분리 51 | 4. 정보 유지: 시간과 날짜의 설정과 획득, 시스템 데이터 설정과 획득, 프로세스 파일, 장치 속성의 설정 및 획득 52 | 5. 통신: 통신 연결의 생성 및 제거, 메시지의 송수신, 상태 정보 전달, 공유 메모리에서 다른 프로세스 소유 메모리 접근 53 |

54 | 55 | ### 2. Kernel 56 | - 운영체제의 핵심 부분으로, 항상 메모리에 올라가 있다. 57 | - 하드웨어와 응용 프로그램 사이의 인터페이스를 제공하여, 응용 프로그램이 하드웨어에서부터 오는 자원을 관리하고 사용할 수 있도록 해준다. 58 | - 즉, 프로세스가 하드웨어에 직접 접근해서 필요한 기능을 사용할 수 있게 해준다. 59 |

60 | 61 | ### 3. Interrupt 62 | - CPU가 실행중인 프로세스에 예외상황을 발생시켜, 실행중인 프로세스를 중단하고 다른 프로세스를 수행하도록 하는 것 63 | 1. CPU는 매 시점 메모리에서 순차적으로 현재 점유 중인 프로세스의 다음 명령을 읽어와 실행한다. 64 | - CPU는 매번 PC(Program Counter)가 가리키는 곳에 있는 명령을 수행하는 일밖에 하지 않는다. 65 | - 그러므로, 현재 점유 중인 프로세스로부터 CPU를 뺐어서 CPU가 다른 프로세스를 실행하도록 하기 위해 추가 작업이 필요하다 -> Interrupt 66 | 2. CPU 내에는 인터럽트 라인이 있다. 인터럽트를 발생시키기 위해, 하드웨어/소프트웨어는 **CPU 내에 있는 인터럽트 라인을 세팅하여 인터럽트를 발생시킨다.** 67 | 3. CPU는 매번 명령을 수행하기 전, 인터럽트 라인이 세팅되어 있는지 확인한다. 68 | 4. 만약 인터럽트 라인에 신호가 들어와있다면, 하던 명령을 멈추고 인터럽트와 관련된 작업을 먼저 처리한다. 69 | 70 | #### 1) 동작 방식 71 | - 실행 중인 프로세스A가 있다고 가정하자. 72 | ``` 73 | 1. 프로세스A는 system call을 통해 인터럽트를 발생시킨다. 74 | 2. CPU는 현재 진행 중인 기계어 코드를 완료한다. 75 | 3. 현재까지 수행중이었던 상태를 해당 프로세스의 PCB에 저장한다. (ex. 수행중이던 메모리 주소, 레지스터 값 등) 76 | 4. PC에 다음에 실행할 명령의 주소를 저장한다. 77 | 5. 인터럽트 벡터를 읽고, ISR 주소값을 얻는다. 78 | 6. 얻어낸 ISR 주소로 점프하여 루틴을 실행한다. 79 | 7. 해당 코드를 실행한다. 80 | 8. 인터럽트한 일이 다 처리되면, 이전에 수행중이던 레지스터를 복원한다. 81 | 9. ISR 끝에 IRET 명령어에 의해 인터럽트가 해제된다. 82 | 10. IRET 명령어가 실행되면, 이전에 수행중이던 PC 값을 복원하여 이전 실행 위치로 되돌아간다. 83 | ``` 84 | - 인터럽트 벡터: 인터럽트 발생시 처리해야 할 인터럽트 핸들러의 주소를 보관하고 있는 테이블 85 | - ISR (Interrupt Service Routine): 실제 인터럽트를 처리하기 위한 루틴으로, 인터럽트 핸들러라고도 한다. 86 | - 운영체제의 code 영역에는 인터럽트별로 처리해야할 내용이 이미 프로그램되어 있다. 87 | 88 | #### 2) 종류 89 | - 하드웨어 인터럽트 90 | - CPU가 아닌 다른 하드웨어 장치가 CPU에게 어떤 사실을 알려주거나, CPU 서비스를 요청해야 할 경우 발생시킨다. 91 | - ex. 정전, 전원 공급 이상, 하드웨어 오류, 타이머 인터럽트, 하드웨어 I/O 장치 92 | - 소프트웨어 인터럽트 93 | - 외부가 아닌 CPU 내부에서 자신이 실행한 명령이나, 명령 실행과 관련된 모듈이 변화하는 경우 발생시킨다. 94 | - 소프트웨어가 스스로 인터럽트 라인을 세팅하며 동작한다. 95 | - ex. 허가되지 않은 메모리 주소 참조, 0으로 나누는 경우, system call, page fault 96 | 97 | #### 3) 왜 interrupt 메커니즘이 필요할까? 98 | - 입출력 연산이 CPU 명령 수행속도보다 현저히 느리다. 99 | - 하드웨어로 지원을 받아야 하는 제약이 있지만, 폴링에 비해 신속하게 대응하는 것이 가능하다. 100 | - 따라서, 인터럽트는 CPU와 I/O의 속도 차이를 극복하기 위해 필요하다. 101 | -------------------------------------------------------------------------------- /operatingSystem/jsy/virtual_memory.md: -------------------------------------------------------------------------------- 1 | # :question: Virtual Memory 2 | 3 | #### reference 4 | https://baked-corn.tistory.com/20
5 | https://jennysgap.tistory.com/entry/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C%EC%9D%98-%EA%B8%B0%EC%B4%88-17-Demand-Paging-1
6 | https://kahee.github.io/til/2019/12/26/TIL_1226/
7 | https://velog.io/@codemcd/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9COS-15.-%EA%B0%80%EC%83%81%EB%A9%94%EB%AA%A8%EB%A6%AC 8 |
9 | 10 | ## Question 11 | 1. [가상 메모리가 필요한 이유를 하는 일과 관련지어 설명해주세요.](#1-가상-메모리virtual-memory) 12 | 실행되는 코드의 전부를 물리 메모리에 존재시켜야 했고, 메모리 용량보다 큰 프로그램은 실행시킬 수 없었다. 또한, 여러 프로그램을 동시에 메모리에 올리기에는 용량의 한계와, 페이지 교체등의 성능 이슈가 발생하게 된다. 또한, 가끔만 사용되는 코드가 차지하는 메모리들을 확인할 수 있다는 점에서, 불필요하게 전체의 프로그램이 메모리에 올라와 있어야 하는게 아니라는 것을 알 수 있다. 13 | 실제 메모리를 보조하여 프로세스 전체가 메모리 내에 올라오지 않더라도 실행이 가능하도록 해주는 역할입니다. 14 | 15 |

16 | 17 | 1. [요구 페이징이란 무엇이고, 요구 페이징에서 Page Fault가 발생했을 때, 처리되는 Page 교체 순서에 대해 설명해주세요.](#2-요구-페이징demand-paging) 18 | 요구 페이징이란 가상 메모리 관리 방법입니다. 19 | 프로그램 실행 시작 시에 프로그램 전체를 디스크에서 물리 메모리에 적재하는 대신, 초기에 필요한 것들만 적재하는 전략을 요구 페이징이라고 합니다. 20 | 가상 메모리 시스템에서 많이 사용됩니다. 21 | 프로세스 실행에 실제 필요한 페이지들만 메모리로 읽어옴으로써, 사용되지 않을 페이지를 가져오는 시간과 메모리 낭비를 줄일 수 있습니다. 22 |
23 | 24 | ## :nerd_face: What I study 25 | ### 1. 가상 메모리(Virtual Memory) 26 | - 다중 프로그래밍 환경에서는 많은 프로세스들을 동시에 메모리에 올려둬야한다. 27 | - 하지만, 프로세스 전체를 메모리 내에 올리는 것은 효율적이지 않다. 28 | - 가상 메모리를 사용하기 전까진 실행되는 프로그램 전부를 메모리 내에 올려야했다. 29 | - 메모리 용량보다 큰 프로그램은 메모리 내에 올릴 수 없으므로, 실행시킬 수 없었다. 30 | - 오류 처리하는 부분이나 배열 등으로 할당한 부분은 프로세스가 잘 실행되고 있으면 필요 없는 부분이다. 31 | - 가끔만 사용되는 코드가 메모리 공간을 불필요하게 차지하고 있어, 비효율적이다. 32 | - 위의 문제를 해결하기 위해, **프로세스 전체가 아닌 필요한 일부분만 실제 메모리에 올려 실행이 가능하도록 하는** Virtual memory 기법을 사용한다. 33 | - 프로세스 공간 중 일부는 물리적 메모리에 적재되고, 일부는 디스크의 swap area에 존재하게 된다. 34 | - Virtual memory는 Demand paging 기법과 Demand segmentation 기법으로 구현될 수 있다. 35 | - 대부분의 경우 Demand paging 방식을 사용한다. 36 | #### 1) 프로그램의 일부만 메모리에 올렸을 때의 장점 37 | - 프로그램이 물리 메모리 공간보다 커도 실행이 가능하다. 38 | - 물리 메모리 크기에 제약을 받지 않는다. 39 | - 물리 메모리의 여유 공간이 얼마나 남았는지 시작 전에 확인할 필요가 없다. 40 | - 더 많은 프로그램을 동시에 실행할 수 있게 된다. 41 | - 응답시간은 유지되고, CPU 이용률과 처리율을 높아진다. 42 | - [swap](memory.md)에 필요한 I/O(디스크와 메모리 간의 I/O)가 줄어드므로, 프로세스들이 빠르게 실행된다. 43 |

44 | 45 | ### 2. 요구 페이징(Demand Paging) 46 | - 메모리 관리 메커니즘(MMU 메커니즘)을 사용해서 여러 프로세스가 시스템의 메모리를 효율적으로 공유할 수 있도록 하는 기법 47 | - 프로그램 전체가 아니라, CPU의 요청이 들어오면 필요한 부분만 메모리에 적재하고, 페이지들이 실행 과정에서 실제로 필요할 때 해당 부분을 메모리로 적재한다. 48 | - 사용하지 않을 페이지를 가져오는 시간과 메모리 낭비를 줄일 수 있다. 49 | - Page table을 사용하여 가상 메모리를 관리한다. 50 | - 운영체제가 page fault를 해결하기 위한 과정으로 사용한다. 51 | #### 1) Page table 52 | - 프로세스 1개 당 1개씩 존재한다. 53 | - 각 page table이 저장되어 있는 주소를 page table base register가 저장하고 있다. 54 | - page table은 운영체제로부터 관리되며, MMU가 접근하여 읽는다. 55 | - 테이블 항목으로 **프레임 번호** 와 **유효-무효 비트** 가 저장되어 있다. 56 | - 프레임 번호: 각 페이지가 저장되어있는 메모리 주소값 57 | - 유효-무효 비트(Valid-Invalid bit): 각 페이지가 메모리에 적재되었는지 아닌지 표시 58 | - 1인 경우 59 | - 해당 page table의 인덱스는 접근이 가능하다. 60 | - 실제 물리 메모리에 올라와 있다. 61 | - 0인 경우 62 | - 해당 page table의 인덱스는 접근이 불가능하다. 63 | - 현재 디스크에 존재한다. 64 | #### 2) Demanding Paging을 수행하는 과정 65 | ``` 66 | 1. CPU는 trap을 발생시켜 운영체제에게 알린다. 67 | 2. 운영체제는 CPU의 동작을 잠시 멈춘다. 68 | 3. 운영체제는 page table을 확인하여, 가상 메모리(Disk)에 페이지가 존재하는지 확인하고 없으면 프로세스를 종료한다. 69 | 4. 현재 물리 메모리에 비어있는 프레임(free frame)이 있는지 찾는다. 70 | 5. 비어있는 프레임이 없다면, 페이지 교체 알고리즘을 사용하여 공간을 만든다. 71 | 6. 비어있는 프레임에 해당 페이지를 로드하고, page table을 업데이트한다. 72 | 7. 중단되었던 CPU를 다시 시작한다. 73 | ``` 74 | 75 | |Before|After| 76 | |:---:|:---:| 77 | |![paging1](https://kahee.github.io/assets/post_img/191226-2.png)|![paging2](https://user-images.githubusercontent.com/34755287/57119451-47043400-6da5-11e9-9ca3-d0b250683bf0.png)| 78 | 79 | 1. P1가 CPU를 점유하여 실행되고 있다. 80 | 2. CPU에서 P1의 3번째 페이지에 접근한다. 81 | 3. page table을 확인한다. valid bit가 0이다. 82 | 4. CPU에 인터럽트 신호를 발생하여 운영체제 내부의 ISR로 점프한다. 83 | 5. 디스크 내부에서 P1의 3번째 페이지를 물리 메모리에 비어있는 프레임으로 할당한다. -------------------------------------------------------------------------------- /operatingSystem/kkw/MainMemory.md: -------------------------------------------------------------------------------- 1 | # 메인 메모리 2 | 3 | #### logical address : CPU가 생성하는 주소 4 | #### physical address : 메모리가 취급하는 주소(메모리 주소 레지스터에서 주어지는 주소) 5 | - 컴파일(Compile) 타임 바인딩과 적재(Load) 타임 바인딩 기법에서 논리, 물리 주소가 같다. 6 | - 하지만, 실행(Execution) 시간 바인딩 기법에서는 논리, 물리 주소가 다르다. 7 | - 프로그램이 실행 중에는 이와 같은 가상 주소를 물리 주소로 바꾸어줘야 한다. 8 | 9 | * 실행 시간에 바인딩을 해주는 이유 10 | - 실행 시 바인딩을 해주게 되면 MMU가 필요하고, 프로그램이 실행될 때마다 변환 반복 작업을 해줘야 한다. 11 | - 그러나 컴파일 시에 바인딩을 해주게 되면 사용하려고 한 메모리가 다른 프로세스가 사용하고 있는 경우 문제가 발생 (프로세스가 단 하나만 사용되는 시스템에서 사용) 12 | - 적재 시에 바인딩 해주는 경우, 메모리 로딩할 때 Overhead가 크기 때문에 장려하지 않음 13 | - 그 외에도 두 방법의 경우 원래 메모리 위치로 swap-in 해줘야하기에 비효율적이다. 14 | 15 | ### MMU (Memory Management Unit) 16 | - 논리적 주소를 물리적 주소로 매핑해주는 하드웨어 장치 17 | - 재배치(Relocation) 레지스터, 상한(Limit) 레지스터로 이루어짐 18 | - 역할 19 | - 가상 주소를 실제 물리 주소로 변환 20 | - 메모리 보호를 위한 메모리 접근 제어(운영체제 영역과 사용자의 영역을 구분해 줌) 21 | - 캐시 메모리 관리 22 | - 버스 중재 23 | 24 | ### 동적 적재 (Dynamic Loading) 25 | - 메모리 공간을 보다 효율적을 이용하기 위해 사용 26 | - 메모리에 호출 전까지는 적재하지 않고 필요한 루틴을 그 때마다 적재하는 방식 27 | - OS로부터 특별한 지원을 필요로 하지 않음 28 | 29 | ### 스와핑 (Swapping) 30 | - 프로세스를 일시적으로 보조 메모리로 보내졌다가 다시 메모리로 가져오는 방식 31 | - 프로세스 스왑 시 완전히 유후 상태에 있는 것만 스와핑해줘야함 32 | - 입/출력이 종료된 프로세스 33 | - 입/출력을 프로세스로 직접하지 않고 운영체제의 버퍼로만 하도록 하는 것 34 | 35 | ### 연속 메모리 할당 36 | - 각각의 프로세스가 메모리의 연속적인 공간을 가지게 하는 것 37 | - 고정 분할 방식 38 | - 물리적 메모리를 주어진 개수만큼 영구적인 분할로 미리 나누어 각 분할에 하나의 프로세스를 적재하는 방식 39 | - 외부 단편화와 내부 단변화가 발생 40 | - 가변 분할 방식 41 | - 프로그램의 크기를 고려하여 분할 방식을 동적으로 관리하는 방식 42 | - 프로그램이 종료 시 외부 단편화 발생 가능 43 | 44 | ### 동적 공간 할당 문제 45 | - 메모리를 동적으로 할당하다 보면 남는 빈 메모리 공간(Hole)이 발생함 46 | - First-fit 47 | - 첫번째로 사용이 가능한 공간을 할당한다 -> 검색 시간이 빠름 48 | - Best-fit 49 | - 사용 가능한 공간들 중 가장 작은 공간을 할당 -> 나머지 관리에 용이 50 | - Worst-fit 51 | - 가장 큰 공간을 할당해 줌 -> 넣은 공간에 남는 공간이 많아 다른 프로세스가 들어오기는 용이 52 | - 일반적으로 First-fit과 Best-fit이 Worst-fit 보다 성능이 좋음 53 | 54 | ### 단편화 (Fragmentation) 55 | - 외부(External) 단편화 56 | - 공간 중 일부가 사용 못 하게 되는 경우 57 | - 어떤 알고리즘을 사용하여도 외부 단편화는 문제로 남는다 58 | - 통계적인 분석을 했을 때 N개의 블록이 할당되었을 때, 0.5N개의 블록이 단편화 때문에 손실된다고 한다. 59 | - 이는 메모리의 1/3을 사용못한다는 뜻 (50% 규칙 = 0.5N / ( N + 0.5N) = 1/3) 60 | - 해결 방법 61 | - 메모리를 고정된 크기로 분할하여 정수 배로만 할당해주는 방법 62 | - 압축 메모리 모든 내용들을 한 군데로 몰고 자유 공간들을 다른 한 공간으로 모아서 큰 블록을 만드는 방법 -> 항상 가능한 것이 아님, 가능하더라도 비용 문제를 생각해야함 63 | 64 | - 내부(Internal) 단편화 65 | - 메모리를 할당해줬을 때, 실제 필요한 공간보다 많이 할당하여 공간이 남는 경우 66 | 67 | ## 페이징(Paging) 68 | ### 페이징 69 | - 프로세스가 사용하는 메모리 공간을 잘게 나누어서 비연속적으로 할당하는 메모리 관리 기법 70 | - 물리 메모리는 프레임(Frame)이라는 같은 크기의 블록으로 나누어져 있고, 논리 메모리는 페이지(Page)라 불리는 같은 크기의 블록으로 나누어 진다. 71 | - 페이지 테이블(Page Table) 72 | - 각각의 프로세스가 주소 변환을 위해 사용하는 것 73 | - 프로세스가 가질 수 있는 페이지의 수만큼 주소 변환 엔트리를 가진다 74 | - 프로세스 마다 페이지 테이블이 있어 프로세스를 실행할 때마다 다른 테이블을 가져와야 하기에 문맥 교환 시간이 생김 75 | - Page의 크기 76 | - 큰 경우 : 테이블이 작아짐 -> 내부 단편화가 심해짐 77 | - 작은 경우 : 테이블이 커짐 -> 공간이 낭비됨 78 | - 디스크 입장에서는 페이지가 클수록 효율적임 79 | - 프레임 테이블(Frame Table) 80 | - OS는 어느 프레임이 할당 되어있고, 어느 프레임이 사용가능한지 알아둬야 한다. 81 | - 각 프레임이 어느 프로세스의 어떤 메모리에 할당 되어있는지를 빠르게 찾기 위해 사용 82 | - 공유 페이지(Share Page) 83 | - 각각의 프로세스는 다른 논리적 주소 공간을 가지고 있지만 실제 물리 메모리에서 같은 프레임으로 연결될 수 있게 해준다. 84 | 85 | ### PTBR (Page-Table Base Register) 86 | - 페이지 테이블도 메모리에 저장이 되는데, 저장된 테이블을 PRBR로 가리키도록 한다. 87 | - 다른 페이지 테이블을 사용할 때, PTBR만 변화시키면 되므로 문맥 교환 시간을 줄일 수 있음 88 | - 하지만, 메모리 접근에 대해서 두 배로 느려진다 (페이지 테이블에 접근할 때 한 번,메모리 자체를 위해서 한 번) 89 | 90 | ### TLB (Transaction Look-aside Buffer) 91 | - 매우 빠른 연관 메모리(Associative memory)로 구성됨 -> 속도가 매우 빠르지만 HW가 비쌈 92 | - 키(Key)와 값(Value)로 구성, 키는 페이지 번호를 값은 해당하는 프레임 번호를 저장한다. 93 | - 가격이 비싸므로 페이지 테이블의 전체를 저장하지 못하고 일부만을 가지고 있는다 94 | - 이 항목들에 대해서는 다양한 알고리즘으로 교체가 이루어짐 95 | 96 | ### 세그먼테이션 (Segmentation) 97 | - 논리 주소 공간을 가변적인 영역인 세그먼트들의 집합으로 정의 98 | - 각각의 세그먼트는 이름과 길이를 가진다 99 | - 세그먼트 테이블(Segment Table) 100 | - 각 세그먼트의 번호와 시작 주소, 크기를 가지고 있다 101 | - CPU에서 해당 세그먼트의 크기를 넘는 요청이 오면 인터럽트를 발생 시킨다. 102 | - 페이징에 비해 보호와 공유면에서 효율적이다-> 영역이 정확하게 나누어지기 때문에 접근하기 더 쉬움 103 | - 서로 다른 크기의 세그먼트들이 적재, 제거가 반복되면 낭비되는 공간이 생길 수 있다. 104 | 105 | ### Paged Segmentation 106 | - 페이징과 세그먼테이션의 장점을 취함 107 | - 세그먼트 테이블에서 주소 대신 해당 세그먼트의 페이지 테이블의 위치를 저장 108 | - 세그먼트 테이블에서 크기 대신에 페이지의 개수를 저장 109 | - 장점 110 | - 기존의 페이징 기법만 적용했을 때보다 페이지의 크기를 줄일 수 있음 111 | - 외부 단편화를 해결할 수 있음 112 | - 코드를 공유하기 용이함 113 | - 단점 114 | - 메모리 접근에 과정이 하나 더 늘었기에 오버 헤드가 늘어남 -------------------------------------------------------------------------------- /operatingSystem/kkw/Process_Thread.md: -------------------------------------------------------------------------------- 1 | 2 | ## Process 3 | - 컴퓨터에서 연속적으로 실행되고 있는 프로그램 4 | - OS로부터 **자원을 할당받는 작업 단위** 5 | - 프로세스는 각각 독립된 메모리 영역을 할당 받음 6 | - 기본적으로 프로세스 당 최소 1개의 스레드(메인 스레드)를 가지고 있음 7 | - 각 프로세스는 별도의 주소 공간에서 실행되며, 다른 프로세스의 변수나 자료구조에 접근할 수 없음 8 | 9 | ![img](https://user-images.githubusercontent.com/43779730/128197563-4ca901b3-e87b-4e9d-9f91-68effc492921.png) 10 | 11 | 12 | ### 프로세스의 주소 공간 13 | - Code Segment (Read Only) 14 | - 코드가 저장되는 부분 15 | - 컴파일 타임에 결정되고 중간에 코드를 바꿀 수 없게 Read-Only 상태 16 | - Data Segment (Write/Read) 17 | - 전역 변수 같은 데이터를 프로그램이 사용하는 데이터를 관리하는 공간 18 | - Stack Segment 19 | - 호출된 함수의 수행을 마치고 복귀할 주소 및 데이터(지역 변수, 매개변수, 리턴)을 임시로 저장하는 공간 20 | - 런타임 되고 나면 Stack 영역의 사이즈는 변경할 수 없음 -> 무한정 할당 불가능 21 | - 런 타임 후 스택에 호출되는 함수(재귀 함수 등) 메모리가 너무 많으면 Stack Overflow가 발생 22 | - Heap Segment (Write/Read) 23 | - 프로그래머가 필요할 때 사용하는 메모리 영역 24 | - 런타임 시 영역이 결정됨 25 | - JAVA에서는 GC에 의해 관리되는 공간 26 | 27 | ![memory](https://user-images.githubusercontent.com/43779730/128209228-7ec0d0bc-cb7b-4369-a602-67f7fb4fc6a6.png) 28 | 29 | 30 | ``` 31 | Q. Code 영역이 따로 있는 이유는? 32 | A. 프로그램의 코드는 프로그램이 컴파일 된 후에 바뀔 일이 전혀 없음(Read only) 33 | 같은 프로그램을 여러 개 실행시켜 몇 개의 프로세스가 실행 되어도 같은 Code 부분을 가지고 있으므로, 같은 프로그램의 프로세스의 경우 Code 부분을 공유하여 메모리 사용량을 줄이기 위해서 나눠져 있습니다. 34 | ``` 35 | 36 | ``` 37 | Q. Data영역과 Stack 영역이 따로 있는 이유는? 38 | 함수들의 경우 LIFO 의 형태로 진행되지만, 전역 변수 등의 경우 LIFO의 형태가 아니기에 따로 구역을 나눠두었다. 39 | ``` 40 | 41 | ### Process Control Block (PCB) 42 | 43 | - CPU의 스케쥴링 상태에 따라 CPU 점유를 하게 되는데, 이 때 작업의 진행 현황을 저장하고 다시 불러오기 위해 사용되는 OS 자료 구조 44 | - 프로세스 상태 : 생성(new), 준비(ready), 실행(running), 정지(halted), 종료(terminated) 45 | - Program Counter(PC) : 프로세스가 다음에 실행할 명령어의 주소를 가리킴 46 | - CPU 레지스터들 : 누산기, 색인 레지스터, 스택 레지스터, 범용 레지스터, 상태 코드 -> PC와 함께 인터럽프 발생 시 저장됨 47 | - CPU 스케쥴링 정보 : 프로세스 우선순위, 스케쥴 큐에 대한 포인터와 다른 스케쥴 매개변수 48 | - 메모리 관리 정보 : OS에 의해 사용되는 메모리 시스템 49 | - accounting 정보 : CPU가 사용된 양과 실시간, 시간 제한, 계정 번호, job 또는 프로세스 번호 50 | - I/O 상태 정보 : 프로세스에 할당된 I/O 장치들과 열린 파일의 리스트 등을 포함 51 | 52 | 53 | ## Thread 54 | - 프로세스가 할당받은 자원을 이용하는 **실행 흐름의 단위** 55 | - 1개 이상의 스레드를 가질 수 있으며 멀티 스레드라고 함 56 | - 스레드는 프로세스 내에 Stack만 따로 할당 받고 Code, Data, Heap 영역을 공유함 57 | - 메모리를 공유하여 시스템 자원 소모가 줄어들어 응답 시간이 단축 58 | - 동기화 문제가 있음 -> 공유된 데이터를 사용하기 때문 59 | - 디버깅이 다소 까다로움 60 | - 스레드를 많이 생성하면 문맥 교환(Context Switch)이 많이 일어나 성능이 저하됨 61 | 62 | ![다운로드](https://user-images.githubusercontent.com/43779730/128197381-018ed1ea-1a7f-4f16-a993-0f6a4af177fd.png) 63 | 64 | 65 | ### 문맥 교환(Context Switch) 66 | - CPU는 한 번에 하나의 프로세스만 실행이 가능, 여러 프로세스를 돌아가면서 작업을 처리하는 과정 67 | - CPU의 현재 상태를 저장하고, 나중에 연산을 재개하기 위하여 상태 복구 작업을 진행 68 | - 문맥 교환이 진행되는 동안 시스템은 아무런 일을 못하기 때문에 이는 순수한 오버헤드이다. 69 | - 문맥 교환에 걸리는 시간은 하드웨어의 지원에 크게 좌우됨 70 | 71 | ### Process vs Thread 72 | |Process|Thread| 73 | |:-:|:-:| 74 | |독립적|종속적| 75 | |독립적인 자원|프로세스의 자원(Code, Data, Heap) 공유| 76 | |각각의 주소 영역을 가짐|주소 영역을 공유| 77 | |IPC 기법으로 통신|별도 통신을 위한 작업 X| 78 | 79 | 80 | 81 | ## 멀티 프로세싱 82 | - 다중 CPU 환경에서 여러 응용 프로그램을 병렬 처리하는 시스템 83 | - 각 프로세스 간 메모리 구분이 필요하거나 독립된 주소 공간을 가져야 할 경우 사용 84 | - 장점 85 | - 독립된 구조로 안정성이 높음 86 | - 프로세스 중에 하나에 문제가 생겨도 다른 프로세스에 영향을 주지 않음 -> 작업이 느려져도 멈추진 않음 87 | - 현대의 컴퓨터들은 대부분 멀티 코어 이상을 지원하여 멀티 프로세싱을 함 88 | - 단점 89 | - 독립된 메모리 영역이다 보니 작업량이 늘어나면 문맥 교환도 늘어나 오버 헤드가 발생하여 성능 저하 90 | - 문맥 교환 과정에서 캐시 메모리 초기화 등 무거운 작업이 진행되고 시간이 소모하여 오버헤드가 발생 91 | 92 | 93 | ## 멀티 스레드 94 | - 하나의 프로세스 내에서 둘 이상의 스레드가 동시에 작업을 수행하는 것을 의미 95 | - 장점 96 | - 시스템 자원소모 감소 (자원의 효율성 증가) 97 | - 프로세스를 생성하고 자원을 할당하는 시스템 콜이 줄어 자원이 효율적으로 관리됨 98 | - 시스템 처리율 향상 (처리 비용 감소) 99 | - 스레드 간 데이터를 주고 받는 것이 간단해지기에 자원 소모가 줄어듬 100 | - 스레드 사이 작업량이 작아 문맥 교환이 빠름 (캐시 메모리를 비울 필요가 없음) 101 | - 간단한 통신 방법으로 프로그램 응답 시간 단축 102 | - 스레드는 프로세스 내 스택 영역을 제외한 메모리 영역을 공유하기에 통신 비용이 적음 103 | - 힙 영역을 공유하므로 데이터를 주고 받을 수 있음 104 | 105 | - 단점 106 | - 자원을 공유하기에 동기화 문제가 발생함 (Bottleneck, deadlock) 107 | - 주의 깊은 설계가 필요하며 디버깅이 어려움 108 | - 단일 프로세스 시스템의 경우 효과를 기대하기 어려움 109 | 110 | -------------------------------------------------------------------------------- /operatingSystem/lhk/CPUScheduling.md: -------------------------------------------------------------------------------- 1 | # 목차 2 | - [CPU Scheduling이 필요한 이유](#cpu-scheduling이-필요한-이유) 3 | - [CPU Scheduling이 필요한 프로세스의 상태 변화](#cpu-scheduling이-필요한-프로세스의-상태-변화) 4 | - [CPU Scheduling 성능 척도](#cpu-scheduling-성능-척도) 5 | - [Scheduling Algorithms](#scheduling-algorithms) 6 | - [nonpremmptive](#nonpremmptive-scheduling비선점형) 7 | - [preemptive](#preemptive-scheduling선점형) 8 | 9 | 10 | # CPU Scheduling이 필요한 이유 11 | 프로그램은 CPU와 I/O를 번갈아가면서 수행하는데, 이때 자원을 효율적으로 사용하기 위해서 CPU Scheduling이 필요하다. 12 | 13 | 14 | # CPU Scheduling이 필요한 프로세스의 상태 변화 15 | 1. Running -> Blocked (예: I/O 요청) => 자진반납(nonpreemptive) 16 | 2. Running -> Ready (예: 할당시간 만료) => 강제로 빼앗음(preemptive) 17 | 3. Blocked -> Ready (예: I/O 완료 후 인터럽트) => 강제로 빼앗음(preemtive) 18 | 4. Terminate => 자진반납(nonpreemtive) 19 | 20 | 21 | # CPU Scheduling 성능 척도 22 | - `CPU utilization` : CPU 이용률 23 | - `Throughput` : CPU 처리량 24 | - `Turnaround time` : CPU를 사용하러 왔다가 다 쓰고 나가는 총 소요시간 25 | - `Waiting time` : ready queue에서 기다린 시간 26 | - `Response time` : ready queue에 들어와서 처음으로 CPU를 얻기까지 기다린 시간 27 | 28 | CPU 이용률, 처리량이 높을수록 // 소요시간과 기다린시간이 짧을수록 좋은 것이다. 29 | 30 | 31 | # Scheduling Algorithms 32 | ## nonpremmptive scheduling(비선점형) 33 | - [FCFS(First Come First Service)](#fcfsfirst-come-first-service) 34 | - [SJF(Shortest Job First)](#sjfshortest-job-first) 35 | ## preemptive scheduling(선점형) 36 | - [SRTF(Shortest Remaing Time First)](#srtfshortest-remaing-time-first) 37 | - [RR(Round Robin)](#rrround-robin) 38 | 39 | 40 | # FCFS(First Come First Service) 41 | 먼저 들어온 프로세스부터 처리한다. CPU 수행시간이 긴 프로세스가 먼저 들어오면 기다리는 시간이 길어지고, CPU 수행시간이 짧은 프로세스가 먼저 들어오면 기다리는 시간이 길어진다. 42 | 즉, *먼저 들어오는 프로세스가 무엇인가에 따라 대기 시간이 결정된다.* 43 | 44 | 특징 45 | - `Convoy effect` : 먼저 들어온 CPU 수행시간이 긴 프로세스로 인해서 나중에 들어온 짧은 프로세스가 기다리는 현상 46 | 47 | 48 | # SJF(Shortest Job First) 49 | 프로세스를 시작하는 시점에서, CPU 수행시간이 짧은 프로세스 먼저 처리한다. 프로세스처리도중 더 짧은 프로세스가 들어와도 현재 처리중인 프로세스를 끝까지 처리한다. 50 | 51 | 특징 52 | - `Starvation` : CPU 수행시간이 긴 프로세스가 무한히 기다리는 현상 53 | - `Aging` : `Starvation`의 해결책으로, 기다릴수록 우선순위를 높여주어 처리되도록 한다. 54 | 55 | 56 | # SRTF(Shortest Remaing Time First) 57 | 현재 수행중인 프로세스보다 CPU 수행시간이 더 짧은 프로세스가 들어오면, 그 프로세스를 먼저 처리한다. 58 | 59 | 특징 60 | - `minimum average waiting time`을 보장한다. 61 | 62 | # RR(Round Robin) 63 | 각 프로세스는 동일한 크기의 할당 시간을 가지고 할당 시간이 끝나면 ready queue 뒤로 다시 줄을 선다. n개의 프로세스가 ready queue에 있고 할당 시간이 q일때, 64 | 각 프로세스는 최대 q 시간 단위로 CPU를 1/n씩 얻는다. 즉, *어떤 프로세스도 (n-1)q 시간이상 기다리지 않는다.* 65 | 이때, q가 크면 FCFS와 같은 효과이고 q가 작으면 context switch 오버헤드가 커진다. 66 | 67 | 특징 68 | - `Response time`이 짧다. 69 | - `Turnaround time`은 길다. 70 | - `Waiting time`은 CPU 수행시간에 비례한다. 71 | - 만약, CPU 수행시간이 동일한 프로세스 여러개가 들어오면 앞에서부터 처리해서 빨리빨리 집으로 보내면 되는데 굳이 쪼개서 다같이 집에 돌아갈 수 있다. 72 | -------------------------------------------------------------------------------- /operatingSystem/lhk/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjuyeon/Tech-Interview-Study/f5f4978becafb443db02eee145e58f6a1618dfa2/operatingSystem/lhk/README.md -------------------------------------------------------------------------------- /operatingSystem/lhk/VirtualMemory.md: -------------------------------------------------------------------------------- 1 | # 목차 2 | - [가상메모리](#가상메모리) 3 | - [Demand Paging(요구 페이징)](#demand-paging요구-페이징) 4 | - [Demand Paging의 성능](#demand-paging의-성능) 5 | - 출처: KOCW 운영체제, 이화여자대학교 반효경 교수님 6 | 7 | # 가상메모리 8 | 0번지부터 시작하는, 자신만의 메모리 주소 공간 9 | 논리적 메모리와 물리적 메모리를 완전히 분리하여 실제 물리적 메모리의 크기보다 더 큰 프로그램을 실행할 수 있다. 10 | 11 | 12 | 13 | 14 | # Demand Paging(요구 페이징) 15 | 모든 페이지를 메모리에 한꺼번에 올리는 것이 아니라, 요청된 페이지만 메모리에 올리는 것 16 | - 메모리 사용량 감소 17 | - 입출력 오버헤드 감소 18 | - 더 많은 프로그램 동시 실행 가능 19 | 20 | ## 유효-무효 비트 21 | - 하드웨어 지원 필요 22 | - 현재 페이지가 메모리에 있는지(유효) 메모리에 없는지(무효) 확인하는 비트 23 | - 이때, 무효비트는 현재 사용되지 않는 주소 영역임을 나타낼 수도 있다. 24 | - 메모리에 없다는 것은, swap 영역에 내려가있다는 것으로 `page falut(페이지 부재)`가 발생했음을 의미 25 | 26 | 27 | 28 | 29 | ## page fault 처리루틴 30 | 31 | 32 | 1. 페이지 요청 33 | 2. invalid면 MMU가 trap을 걸어서 os에 요청 34 | - 이때, 사용하지 않는 주소 영역이거나 읽기 전용 페이지에 쓰기를 하려고 한다면, 프로세스 종료 35 | 3. backing store(hdd)에서 해당 페이지를 가져옴 36 | 4. physical memory의 빈 프레임에 해당 페이지를 넣음 37 | - 빈 프레임이 없으면, 메모리에 있는 페이지 중 하나를 디스크로 쫗아냄(`swap out`) 38 | 5. valid로 세팅 39 | 6. restart instruction 40 | 41 | 42 | ## Demand Paging의 성능 43 | page fault rate를 p라고 했을 때, 44 | - 0이면, page fault가 전혀 나지 않는 다는 것. 즉, 메모리에서 모든 페이지를 얻을 수 있는 경우 45 | - 1이면, page 요청할 때마다 page fault가 계속 난다는 것. 46 | ### Effective Access Time(유효 접근 시간) 47 | (1-p) x memory access + p (page fault 오버헤드 + 메모리에 빈 프레임이 없으면 swap out 오버헤드 + 요청 페이지 swap in 오버헤드 + 재시작 오버헤드) 48 | ### Page Replacement 49 | - os가 하는 업무 50 | - 어떤 프레임을 내쫓아야하는지 결정해야 함 51 | - 쫓아내고 바로 사용하지 않을 것 같은 프레임을 쫓아내는 것이 가장 효과적 52 | ### Replace Algorithm 53 | - page fault rate 최소화가 목표 54 | - page fault를 얼마나 내느냐가 알고리즘의 성능 척도 55 | - Optimal Algorithm, FIFO Algorithm, LRU Algorithm, LFU Algorithm 56 | 57 | -------------------------------------------------------------------------------- /operatingSystem/lhk/answer.md: -------------------------------------------------------------------------------- 1 | ### :notebook_with_decorative_cover: Process & Thread 2 | 1. 프로세스와 스레드의 차이를 설명하세요. 3 | 2. 멀티 프로세스와 멀티 스레드의 차이를 설명하세요. 4 | 5 | ### :notebook_with_decorative_cover: System call 6 | 1. 시스템 콜에 대해 설명해주세요. 7 | 2. 프로세스가 종료되는 두 가지 조건에 대해 설명해주세요. 8 | 9 | ### :notebook_with_decorative_cover: CPU Scheduling 10 | 1. 자신이 알고 있는 CPU 스케줄링을 선점형, 비선점형으로 나누어 특징을 설명해주세요. 11 | 2. 1에서 설명한 각 CPU 스케줄링의 단점을 설명해주세요. 12 | 13 | ### :notebook_with_decorative_cover: 동기화 & 비동기화 14 | 1. 동기와 비동기의 차이(블로킹, 넌블로킹) 를 장단점과 함께 설명해주세요. 15 | 2. 교착상태(데드락)란 무엇이며, 교착상태가 발생하는 조건을 설명해주세요. 16 | 3. 세마포어와 뮤텍스의 차이에 대해 설명해주세요. 17 | -------------------------------------------------------------------------------- /spring/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjuyeon/Tech-Interview-Study/f5f4978becafb443db02eee145e58f6a1618dfa2/spring/.DS_Store -------------------------------------------------------------------------------- /spring/README.md: -------------------------------------------------------------------------------- 1 | # 6) Spring 2 | - contributor : [김경원](https://github.com/shining8543) , [윤이진](https://github.com/483759) , [진수연](https://github.com/jjuyeon) 3 |
4 | 5 | ### :notebook_with_decorative_cover: Spring 6 | 1. Spring MVC 구조 흐름에 대해 과정대로 설명해주세요. 7 | 2. Spring DI에 대해 설명해주세요. 8 | 3. Spring과 Spring Boot의 차이점에 대해 설명해주세요. 9 | 4. Filter와 Interceptor의 차이점에 대해 설명해주세요. 10 | 5. 영속성 컨텍스트에 대해 설명해주세요. 11 | 6. Spring에서 CORS 에러를 해결하기 위해 했던 방법은 무엇인가요? 12 | 7. Bean/Component 어노테이션은 무엇이며, 둘의 차이점은 무엇인가요? 13 | 8. Spring Triangle의 POJO와 AOP에 대해 설명해주세요 14 | 9. Hibernate에 대해서 설명하세요 15 | 10. Bean의 생명주기에 대해 설명해주세요 16 | 11. Bean scope에 대해 설명해주세요 17 | 12. 프레임워크란 무엇일까요? 프레임워크와 라이브러리 차이점에 대해 설명해주세요 18 | 13. Spring의 @Cacheable에 대해서 설명해주세요 19 | 14. 요즘 스프링 개발 시 자바 대신 코틀린의 비중이 늘어나는 이유는? 20 | 21 | ### :notebook_with_decorative_cover: JPA 22 | 1. JPA Propagation 전파단계를 설명해주세요. 23 | 2. N+1 문제가 발생하는 이유와 이를 해결하는 방법을 설명해주세요. 24 | 3. @Transactional 에 대해서 설명해주세요. 25 | 4. JPA의 낙관적 락, 비관적 락에 대해 설명해주세요 26 | 27 | ### :notebook_with_decorative_cover: Design Pattern 28 | 1. Builder 패턴에 대해서 설명하세요. 29 | 2. MVC1과 MVC2 패턴의 차이를 설명해 주세요. 30 | 3. (꼬리질문) 그렇다면, Spring MVC 는 무엇일까요? -------------------------------------------------------------------------------- /spring/jsy/CorsFilter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjuyeon/Tech-Interview-Study/f5f4978becafb443db02eee145e58f6a1618dfa2/spring/jsy/CorsFilter.png -------------------------------------------------------------------------------- /spring/jsy/README.md: -------------------------------------------------------------------------------- 1 | # Suyeon Jin 2 | 3 | |Study|바로가기| 4 | |---|---| 5 | |Spring|[:white_check_mark:](./spring.md)| 6 | |Spring Bean|[:white_check_mark:](./bean.md)| 7 | |Spring MVC|[:white_check_mark:](./mvc.md)| 8 | |Spring Annotation|[:white_check_mark:](./annotation.md)| 9 | |Spring CORS|[:white_check_mark:](./cors.md)| 10 | |JPA Propagation|[:white_check_mark:](./propagation.md)| 11 | |JPA N+1 problem|[:white_check_mark:](./n+1.md)| -------------------------------------------------------------------------------- /spring/jsy/annotation.md: -------------------------------------------------------------------------------- 1 | # :question: Spring Annotation 2 | 3 | #### reference 4 | https://youngjinmo.github.io/2021/06/bean-component/
5 | https://galid1.tistory.com/494
6 | https://withseungryu.tistory.com/64 7 |
8 | 9 | ## Question 10 | 1. Bean/Component 어노테이션은 무엇이며, 둘의 차이점은 무엇인가요? 11 | - 두 어노테이션 모두 IoC Container에 Bean을 등록하기 위해 사용되는 어노테이션입니다. 12 | - 하지만, 두 어노테이션은 용도에 있어 차이점을 가지고 있습니다. 13 | - @Component는 개발자가 작성한 class를 기반으로 실행시점에 Bean을 생성합니다. (싱글톤) 14 | - 반면, @Bean은 개발자가 작성한 method를 기반으로 method에서 반환하는 객체를 Bean으로 생성합니다. (싱글톤) 15 | - 각자의 용도가 정해져있으므로 정해진 곳에서만 사용이 가능하며, 다른 곳에서 사용하려고 하면 컴파일 에러가 발생합니다. 16 |
17 | 18 | ## :nerd_face: What I study 19 | 20 | ### <참고> 21 | - Spring은 개발의 제어권이 IoC Container에 있다. 22 | - Spring이 개발자 대신 객체를 제어하기 위해서는 Bean으로 등록되어있어야 한다. 23 | - IoC Container는 Bean을 가져오기 위해 Bean Scanning을 한다. 24 | - cf) Bean 등록 방법: 1) XML로 지정, 2) 어노테이션 25 | 26 |

27 | 28 | ### 1. @Bean 29 | - Bean으로 객체를 등록하기 위해 사용하는 어노테이션 30 | - 개발자가 **직접 제어가 불가능한 외부 라이브러리를 Bean으로 등록하고 싶은 경우** 사용한다. 31 | - 개발자가 작성한 ***method***를 통해 반환되는 객체를 Bean으로 만든다. 32 | - 개발자가 수동으로 Bean을 등록해줘야 한다. 33 | - @Configuration을 선언한 클래스 내부에서 사용한다. 34 | - **name** 속성은 Bean의 id를 설정해준다. (모든 문자를 소문자로 바꿈) 35 | - 속성을 사용하지 않으면, 메소드 명을 camelcase로 변경한 것이 Bean의 id가 생성된다. 36 | 37 | ```java 38 | @Configuration 39 | public class ExampleConfig { 40 | // 'array' Bean 생성 41 | @Bean // 외부 라이브러리를 사용하는 경우 42 | public ArrayList array(){ 43 | return new ArrayList(); 44 | } 45 | 46 | // 'smallcharger' Bean 생성 47 | @Bean(name="smallcharger") // 해당 method를 통해 개발자가 만든 클래스가 반환되는 경우 48 | public Product small(){ 49 | Battery charger = new Battery("AAA", 2500); // 사이즈, 가격 50 | charger.setRechargeable(true); 51 | return charger; 52 | } 53 | } 54 | ``` 55 | 56 |
57 | 58 | ### 2. @Component 59 | - Bean으로 객체를 등록하기 위해 사용하는 어노테이션 60 | - 개발자가 **직접 제어할 수 있는 내부 클래스를 Bean으로 등록하고 싶은 경우** 사용한다. 61 | - 개발자가 직접 작성한 ***Class***를 Bean으로 등록한다. 62 | - Spring이 Runtime할 때, component-scan을 통해 자동으로 Bean을 찾고 등록한다. (자동 의존성 주입) 63 | - `@Repository`, `@Service`, `@Controller`, `@Configuration`가 `@Component`에 속해있다. 64 | - **value** 속성은 Bean의 id를 설정해준다. (모든 문자를 소문자로 바꿈) 65 | - 속성을 사용하지 않으면, 메소드 명을 camelcase로 변경한 것이 Bean의 id가 생성된다. 66 | 67 | ```java 68 | @Component(value="hello") 69 | public class Example { 70 | puiblic Example(){ 71 | System.out.println("Hello world"); 72 | } 73 | } 74 | ``` -------------------------------------------------------------------------------- /spring/jsy/mvc.md: -------------------------------------------------------------------------------- 1 | # :question: Spring MVC 2 | 3 | #### reference 4 | https://onejuny.tistory.com/entry/JavaJsp-MVC-1-MVC-2-%EC%B0%A8%EC%9D%B4-%EB%B0%8F-%EC%9E%A5%EB%8B%A8%EC%A0%90
5 | https://chanhuiseok.github.io/posts/spring-3/
6 | https://catsbi.oopy.io/f52511f3-1455-4a01-b8b7-f10875895d5b 7 |
8 | 9 | ## Question 10 | 1. [MVC1과 MVC2 패턴의 차이를 설명해 주세요.](#2-mvc1-) 11 | - MVC1은 모든 클라이언트의 요청과 응답을 JSP가 담당하는 구조로, View와 Controller 모두 JSP가 담당합니다. 12 | - 반면, MVC2는 MVC1의 단점인 유지보수의 어려움을 보완하기 위해 나온 모델로, 클라이언트의 요청, 응답, 비즈니스 로직을 처리하는 부분을 모듈화시킨 구조입니다. JSP는 View의 역할만 하고 Servlet이 Controller를 담당합니다. 13 |
14 | 15 | 1. (꼬리질문) [그렇다면, Spring MVC 는 무엇일까요?](#4-spring-mvc-) 16 | - 기존의 JSP & Servlet 기반 MVC 패턴(MVC1, MVC2)에서 Model, View, Controller로 분할했었습니다. 17 | - 그에 비해 Spring MVC는 Dispatcher Servlet, Handler Mapping, ViewResolver를 추가하며 역할을 더 명확히 분리하고, Restful API를 만드는 데 더 특화되어 있습니다. 18 | 19 |
20 | 21 | ## :nerd_face: What I study 22 | 23 | ### 1. MVC ? 24 | - `Model, View, Controller` 의 줄임말 25 | - 비즈니스 로직과 UI를 분리하여 유지보수를 용이하게 한다. 26 | - Model: 어플리케이션의 데이터, 뷰가 랜더링하는데 필요한 데이터 27 | - View: 사용자 인터페이스 요소, 클라이언트에게 실제로 보이는 화면, 모델로부터 정보를 얻고 표시 28 | - Controller: 데이터와 비즈니스 로직 간의 상호 작용을 관리, view와 model이 직접적인 상호 소통을 하지 않도록 관리 29 | 30 |

31 | 32 | ### 2. MVC1 ? 33 | ![mvc1](https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FI1UUx%2FbtqEZ0IhZ6O%2FqzvwssYAAkEltNqYd3Kpik%2Fimg.png) 34 | - 모든 클라이언트의 요청과 응답을 JSP가 담당하는 구조 35 | - View와 Controller 모두 JSP가 담당한다. 36 | - 하나의 JSP 페이지에서 controller는 자바, view는 html, css는 자바스크립트를 사용한다. 37 | - model은 jdbc 인터페이스로 DB를 조작하면서 클래스를 정의한다. 38 | - 규모가 작고 유지보수가 적은 경우 사용한다. 39 | 40 | #### 2-1) 장점 41 | - 페이지의 흐름이 단순하고 구조가 간단하다. 42 | - JSP 하나로 유저의 요청을 받고 응답을 처리하므로 구현 난이도가 쉽다. 43 | #### 2-2) 단점 44 | - JSP 하나에서 MVC가 모두 이루어지므로 45 | - 1) 재사용성이 매우 떨어진다. 46 | - 2) 가독성도 떨어진다. 47 | - 3) 유지보수가 어려워 웹 규모가 커질수록 복잡해진다. 48 | 49 |

50 | 51 | ### 3. MVC2 ? 52 | ![mvc2](https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbgbhsb%2FbtqE0BOnWqs%2FGhoRjVi90P1dYSBjRHSo91%2Fimg.png) 53 | - 클라이언트의 요청, 응답, 비즈니스 로직을 처리하는 부분을 모듈화시킨 구조 54 | - MVC1의 유지보수가 어렵다는 단점을 보완하기 위해 나온 모델 55 | - JSP는 view의 역할만 하고, 컨트롤러의 역할은 servlet이 하고, model은 MVC1, MVC2 모두 동일하다. 56 | - view는 JSP로 구성되어 있으며, 자바는 포함되지 않고 jstl을 사용해 결과를 표현한다. 57 | - 규모가 크고 유지보수가 많은 경우 사용한다. 58 | 59 | ``` 60 | 1. controller(servlet)에서 웹 브라우저의 요청을 처리 -> 61 | 2. controller가 비즈니스 로직을 수행하며, model을 호출하여 데이터를 요청한다. -> 62 | 3. model은 처리 결과를 view(jsp)에 보내어 사용자에게 응답하게 된다. 63 | ``` 64 | 65 |
66 | 67 | #### 3-1) 장점 68 | - controller와 view의 분리로 분명한 구조를 가진다. 69 | - 처리작업의 분리로 인해 유지보수의 확장이 용이하다. 70 | - 개발자와 디자이너의 역할 분담이 확실해진다. 71 | #### 3-2) 단점 72 | - 구조 설계를 위한 시간이 많이 소요된다. 73 | - 개발 기간이 증가한다. 74 | - 높은 수준의 이해도가 필요하다. 75 | 76 |

77 | 78 | ### 4. Spring MVC ? 79 | - 스프링이 제공하는 트랜잭션 처리, DI, AOP를 손쉽게 사용할 수 있다. 80 | - Restful API를 만드는데 더 특화되었다. 81 | - Dispatcher Servlet, Handler Mapping, ViewResolver가 추가되었다. 82 | - 다른 MVC 프레임워크와 마찬가지로 컨트롤러를 사용하여 요청을 처리한다. 83 | - DispatcherServlet이 MVC에서의 컨트롤러(Controller)부분을 처리한다. 84 | 85 |
86 | 87 | #### 4-1) Spring MVC에서의 데이터 처리 흐름 88 | ![spring_mvc](https://oopy.lazyrockets.com/api/v2/notion/image?src=https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F183bb42c-2998-4362-ade1-b7d75f75a851%2FUntitled.png&blockId=209ecc2e-d659-4a44-a519-675c16309d89) 89 | ``` 90 | 1. 클라이언트는 dispatcher servlet에게 Request를 전달한다. 91 | 2. dispatcher servlet은 어떤 Controller에게 해당 request의 처리를 맡길지 handler mapping에게 URI 처리를 문의한다. 92 | 3. 여기서 handler mapping은 해당 URI를 처리할 수 있는 controller를 반환한다. 93 | 4. dispatcher servlet은 request를 controller에게 전달합니다. 94 | 5. 해당 controller는 request를 처리할 수 있는 메소드를 이용해 처리한 뒤, 수행 결과를 담은 modelAndView 객체를 반환한다. 95 | 6. dispatcher servlet은 view name을 view resolver에게 전달하고, view resolver는 해당 view를 처리할 수 있는 실제 path 및 확장자 정보를 담아 response한다. 96 | 7, dispatcher servlet은 view가 클라이언트에게 response하도록 실제 view path와 request를 전달한다. 97 | 8. view는 실행 결과를 클라이언트에게 response하며 화면을 표현한다. 98 | ``` 99 | 100 |
101 | 102 | #### 4-2) Spring MVC 구성 요소 103 | |구성 요소|설명| 104 | |:---:|:---:| 105 | |DispatcherServlet|클라이언트의 요청을 전달받아 요청에 맞는 컨트롤러가 리턴한 결과값을 View에 전달하여 알맞은 응답을 생성| 106 | |HandlerMapping|클라이언트의 요청 URL을 어떤 컨트롤러가 처리할지 결정| 107 | |Controller|클라이언트의 요청을 처리한 뒤, 결과를 DispatcherServlet에게 리턴| 108 | |ModelAndView|컨트롤러가 처리한 결과 정보 및 View 선택에 필요한 정보를 담음| 109 | |ViewResolver|컨트롤러의 처리 결과를 생성할 View를 결정| 110 | |View|컨트롤러의 처리 결과를 보여줄 화면을 생성| 111 | 112 |
113 | 114 | #### 4-3) Spring MVC 개발 115 | - 클라이언트에 요청을 받을 DispatcherServlet을 web.xml 파일에 설정한다. 116 | - 클라이언트의 요청을 처리할 controller를 작성한다. 117 | - ViewResolver를 설정한다. 118 | - 컨트롤러가 전달한 값을 이용해서 응답 화면을 생성할 view를 결정한다. 119 | - JSP 등을 이용하여 view 영역의 코드를 작성한다. -------------------------------------------------------------------------------- /spring/jsy/n+1.md: -------------------------------------------------------------------------------- 1 | # :question: JPA N+1 문제 2 | 3 | #### reference 4 | https://incheol-jung.gitbook.io/docs/q-and-a/spring/n+1
5 | https://www.popit.kr/jpa-n1-%EB%B0%9C%EC%83%9D%EC%9B%90%EC%9D%B8%EA%B3%BC-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95/
6 | https://velog.io/@woo00oo/N-1-%EB%AC%B8%EC%A0%9C 7 |
8 | 9 | ## Question 10 | 1. N+1 문제가 발생하는 이유와 이를 해결하는 방법을 설명해주세요. 11 | - N+1 문제는 JPA의 프록시로 인한 지연로딩 때문에 발생합니다. 구체적으로는 1개의 쿼리를 실행했을 때, 내부에 존재하는 연관된 엔티티들을 추가로 조회해오면서 생기는 문제입니다. 12 | - 최고의 해결방법은, 되도록이면 @OneToMany의 매핑을 하지 않을 수 있다면 하지 않는 것입니다. 만약 사용해야한다면, Fetch join이라고 하는 JPQL의 join fetch를 사용합니다. 데이터 호출 시점에 모든 연관 관계의 데이터를 가져오므로, 쿼리 한 번으로 해결이 가능합니다. 13 |
14 | 15 | ## :nerd_face: What I study 16 | ### 1. N+1 문제 ? 17 | - 연관 관계에서 발생하는 이슈 18 | - 연관 관계가 설정된 엔티티를 조회할 경우에 조회된 데이터 개수(N)만큼 연관관계의 조회 SQL이 추가로 발생하여 데이터를 읽어온다. 19 | - 즉, 1번 SQL을 실행해서 N번 SQL을 추가로 실행한다고 해서 N+1 문제라 한다. 20 | - ex) SQL 1번으로 100명의 회원을 조회하였는데, 각 회원마다 주문한 상품을 추가로 조회하기 위해 100번의 SQL이 추가로 실행된다. 21 |

22 | 23 | ### 2. N+1 문제 원인 24 | - JPQL은 SQL을 추상화한 객체지향 쿼리 언어이다. 25 | - 특정 SQL에 종속되지 않고 엔티티 객체와 필드 이름을 가지고 쿼리를 생성한다. 26 | 27 |
28 | 29 | - JPA Repository에서 정의한 인터페이스 함수를 실행하면, JPA는 함수 이름을 분석해서 JPQL을 생성하여 실행하게 된다. 30 | - 생성한 JPQL을 분석하여 생성한 SQL을 실행하는 동작에서 N+1 문제가 발생한다. 31 | 32 | ``` 33 | 1. 즉시로딩을 데이터를 가져오는 경우 34 | - JPQL에서 동작한 쿼리를 통해서 데이터를 조회한다. (1) 35 | - 이후에, 연관된 하위 엔티티에 대해 추가적인 로딩 작업을 진행한다. (N) 36 | 37 | 2. 지연로딩으로 데이터를 가져온 후에, 가져온 데이터에서 하위 엔티티를 다시 조회하는 경우 38 | - 엔티티 객체와 필드 이름만을 보고 쿼리를 생성하기 때문에, Join으로 쿼리 생성이 안된다. (1) 39 | - 즉, 하위 엔티티를 조회할 때는 지연로딩이라고 할지라도 쿼리를 새로 생성하여 실행해야 한다. (N) 40 | ``` 41 |
42 | 43 | #### cf. 글로벌 패치 전략 44 | - 실무에서는 가급적 지연로딩만을 사용한다. 45 | 46 | ||즉시로딩(EAGER Loading)|지연로딩(LAZY loading)| 47 | |:---:|:---:|:---:| 48 | ||`@xxToxx(fetch = fetchType.EAGER)`|`@xxToxx(fetch = fetchType.LAZY)`| 49 | |데이터 조회 시|연관된 데이터를 모두 조회|필요한 시점에 필요한 연관 데이터만 조회| 50 | |프록시 객체 사용 여부|X|O| 51 | |예시|`@xxToOne`|`@xxToMany`| 52 | 53 |

54 | 55 | ### 3. N+1 문제 해결 56 | #### 3-1. Fetch join 57 | - fetch를 통해서 조인 쿼리를 실행하는 방법이다. 58 | - 연관된 엔티티를 조회하기 위해, 미리 쿼리를 통해 테이블을 조인해서 가져온다. 59 | - 프록시 객체가 아닌 실제 엔티티를 조회한다. 60 | - 데이터 호출 시점에 모든 연관 관계의 데이터를 가져온다. 61 | - 단점 62 | - JPA Repository에서 정의한 인터페이스 함수가 아닌, JPQL로 직접 작성해야 한다. 63 | - 하나의 쿼리문을 통해 가져오므로, JPA에서 제공하는 Pageable 의 사용이 불가능하다. 64 | - 1:N 관계가 2개인 엔티티는 사용이 불가능하다. (= 2개의 컬렉션은 불가능)
(ex. member vs orders = 1:N && member vs coupon = 1 : N 이면, member에 대한 fetch join은 안됨.) 65 | - 글로벌 패치 전략이 무시된다. (FetchType을 LAZY로 하는 의미가 없다.) 66 | 67 | #### 3-2. Batch size 조절 68 | - 설정한 size만큼 데이터를 미리 로딩하는 방법이다. 69 | - 지정된 size만큼 SQL의 `where in`절을 사용하여 조회한다. 70 | - JPA에서 제공하는 Pageable 처럼, 개수가 고정된 데이터를 가져올 때 함께 사용하면 유용하다. 71 | - 단점 72 | - 글로벌 패치 전략을 즉시 로딩으로 변경해야한다. 73 | 74 | #### 3-3. EntityGraph 75 | - 변수 `attributePaths` 값에 쿼리 수행시 바로 가져올 필드명을 지정하면 LAZY가 아닌 EAGER 전략으로 데이터를 가져온다. 76 | - JPQL을 사용하여 쿼리를 작성하고 필요한 연관관계를 EntityGraph에 설정한다. 77 | - Join문이 Outer join으로 실행된다. 78 | 79 | #### 3-4. @Fetch(FetchMode.SUBSELECT) 80 | - 두 번의 쿼리로 해결하는 방법이다. 81 | - 해당 엔티티를 조회하는 쿼리는 그대로 발생하고, 연관관계의 하위 엔티티를 조회할 때 서브 쿼리로 함께 조회한다. 82 | - **모두 지연로딩으로 설정하고, 성능 최적화가 필요한 곳에는 JPQL Fetch join을 사용하는 것이 추천되는 전략이다.** 83 | 84 | #### 3-5. QueryBuilder 85 | - Query를 실행하도록 지원하는 다양한 플러그인. 86 | - ex. Mybatis, QueryDSL, JDBC Template 등 -------------------------------------------------------------------------------- /spring/jsy/propagation.md: -------------------------------------------------------------------------------- 1 | # :question: JPA propagation 2 | 3 | #### reference 4 | https://www.youtube.com/watch?v=e9PC0sroCzc
5 | https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/transaction/annotation/Propagation.html
6 | https://stackoverflow.com/a/27184785
7 | https://deveric.tistory.com/86
8 | https://n1tjrgns.tistory.com/266 9 |
10 | 11 | ## Question 12 | 1. JPA Propagation 전파단계를 설명해주세요. 13 | - JPA Propagation은 트랜잭션 동작시, 다른 트랜잭션을 호출하는 상황에 선택할 수 있는 옵션입니다. @Transactional의 propagation 속성을 통해 호출 당하는 트랜잭션의 입장에서는 호출한 쪽의 트랜잭션을 그대로 사용할 수도 있고, 새롭게 트랜잭션을 생성할 수도 있습니다. 14 | - Propagation 전파단계에는 7가지의 단계가 존재합니다. 15 | 1. **REQUIRED**: 부모 트랜잭션이 존재한다면 그 트랜잭션 안에 포함되어 동작하며, 부모 트랜잭션이 없을 경우 새로운 트랜잭션을 생성합니다. (default 속성) 16 | 2. **REQUIRES_NEW**: 부모 트랜잭션의 존재 여부와 상관없이 매번 새로운 트랜잭션을 실행합니다. 17 | 3. **NESTED**: 부모 트랜잭션이 존재하면 부모 트랜잭션 안에 중첩 트랜잭션을 만듭니다. 부모 트랜잭션의 커밋과 롤백에 영향을 받지만, 자신의 커밋과 롤백은 부모 트랜잭션에 영향을 주지 않습니다. 18 | 4. **MANDATORY**: 부모 트랜잭션이 존재하면 그 트랜잭션 안에 포함되어 동작하며, 부모 트랜잭션이 없다면 예외를 발생시킵니다. 19 | 5. **SUPPORT**: 부모 트랜잭션이 존재하면 그 트랜잭션 안에 포함되어 동작하며, 부모 트랜잭션이 없다면 트랜잭션 없이 동작합니다. 20 | 6. **NOT_SUPPORTED**: 부모 트랜잭션이 존재하면 부모 트랜잭션을 일시정지하고 기능을 수행합니다. 21 | 7. **NEVER**: 트랜잭션을 사용하지 않도록 강제합니다. 부모 트랜잭션이 없다면 예외를 발생시킵니다. 22 |
23 | 24 | ## :nerd_face: What I study 25 | ### Propagation 26 | - `@Transactional`를 가진 함수가 중첩으로 호출되었을 때, 어떻게 동작 시킬 것인지에 대해 결정할 수 있는 옵션 27 | - 트랜잭션이 시작하거나, 참여하는 방법에 대해서도 설정할 수 있다. 28 | 29 | ```java 30 | public class Car { 31 | 32 | private Taxi taxi; 33 | 34 | @Transactional 35 | public void drive() { 36 | taxi.run(); // 트랜잭션 중첩 발생 37 | } 38 | } 39 | 40 | public class Taxi { 41 | @Transactional 42 | public void run() {...} 43 | } 44 | ``` 45 | 46 | #### cf) @Transactional 47 | - 선언적 트랜잭션 지원(스프링에서 트랜잭션을 처리하는 방식) 48 | - 스프링 프레임워크는 내부적으로 AOP를 통해서 해당 어노테이션을 인지하고 프록시를 생성해서 트랜잭션을 자동 관리한다. 49 | 1. @Transactional을 메소드 또는 클래스에 지정하면, 해당 메소드 호출시 지정된 트랜잭션이 작동하게 된다. 50 | - 특정 메소드에 지정하면, 해당 메소드가 단일 트랜잭션 내에서 실행된다. 51 | - 특정 클래스에 지정하면, 해당 클래스의 모든 메소드를 단일 트랜잭션 내에서 실행한다. 52 | 2. 단, 해당 클래스의 Bean이 다른 클래스의 Bean에서 호출될 때만 @Transactional을 인지하고 작동하게 된다. 53 | - 같은 Bean 내에서 @Transactional이 명시된 다른 메소드를 호출해도 작동하지 않는다. 54 | 55 |

56 | 57 | ![propagation](https://media.vlpt.us/images/syleemk/post/eb89d47f-7498-4657-af97-6c6251361488/image.png) 58 | 59 | ### 1. Propagation.REQUIRED 60 | - default 값이므로, 생략이 가능하다. 61 | - 부모 트랜잭션(자신을 호출한 메소드의 트랜잭션)이 존재한다면 부모 트랜잭션으로 합류하고, 부모 트랜잭션이 없다면 새로운 트랜잭션을 생성한다. 62 | - 즉, 모든 처리 방식이 **하나의** 트랜잭션으로 진행이 된다. 63 | - 해당 메소드를 호출한 곳에 별도의 트랜잭션이 설정되어 있지 **않았다면**, 트랜잭션을 **새로 시작한다.** (새로운 연결을 생성하고 실행) 64 | - 만약 호출한 곳에 이미 트랜잭션이 설정되어 **있었다면**, **기존의 트랜잭션 내**에서 로직을 실행한다. (동일한 연결 안에서 실행) 65 | - 예외가 발생하면 롤백이 되고, 호출한 곳에도 롤백이 전파된다. 66 |

67 | 68 | ### 2. Propagation.REQUIRES_NEW 69 | - 매번 새로운 트랜잭션을 시작한다. = 새로운 연결(DB 커넥션)을 생성하고 실행한다. 70 | - 부모 트랜잭션은 상관하지 않는다. 71 | - 호출한 곳에 이미 트랜잭션이 설정되어 있다면(기존의 연결이 존재한다면), 기존의 트랜잭션은 메소드가 종료될 때까지 잠시 **대기 상태**로 두고, 자신의 트랜잭션을 실행한다. 72 | - 각각의 트랜잭션에 예외가 발생하여 롤백이 되더라도, 서로 영향을 주지 않는다. (롤백이 전파되지 않는다.) 73 | - 즉, 2개의 트랜잭션은 별개의 단위로서 독립적으로 작동한다. 74 |

75 | 76 | ### 3. Propagation.NESTED 77 | - 부모 트랜잭션이 존재한다면 중첩 트랜잭션을 생성하고, 부모 트랜잭션이 없다면 새로운 트랜잭션을 생성한다. 78 | - 메소드가 부모 트랜잭션 안에서 진행될 때, 별개로 커밋되거나 롤백될 수 있다. 79 | - 중첩 트랜잭션에서 롤백이 발생하면, 해당 트랜잭션의 시작 지점까지만 롤백된다. 80 | - 중첩 트랜잭션은 부모 트랜잭션이 커밋될 때 같이 커밋된다. 81 | - `Propagation.REQUIRED`와 비슷하지만, **SAVEPOINT를 지정한 시점까지 부분 롤백이 가능하다**는 차이점이 있다. 82 | - 데이터베이스가 SAVEPOINT 기능을 지원해야한다. 83 |

84 | 85 | ### 4. Propagation.MANDATORY 86 | - 부모 트랜잭션 내에서 실행된다. 87 | - 부모 트랜잭션이 존재한다면 부모 트랜잭션 안으로 합류하고, 부모 트랜잭션이 없다면 Exception을 발생시킨다. 88 |

89 | 90 | ### 5. Propagation.SUPPORT 91 | - 부모 트랜잭션이 존재한다면 부모 트랜잭션으로 합류하여 동작하고, 부모 트랜잭션이 없다면 트랜잭션을 생성하지 않는다. 92 | - non-transactinal하게 실행된다. 93 |

94 | 95 | ### 6. Propagation.NOT_SUPPORT 96 | - 부모 트랜잭션이 존재하면 부모 트랜잭션을 일시정지하고 기능을 수행한다. 97 | - 부모 트랜잭션이 없다면 트랜잭션을 생성하지 않는다. 98 | - non-transactinal하게 실행된다. 99 |

100 | 101 | ### 7. Propagation.NEVER 102 | - 트랜잭션을 허용하지 않는다. 103 | - 진행중인 부모 트랜잭션이 존재하면 Exception을 발생시킨다. 104 | - 부모 트랜잭션이 없다면 트랜잭션을 생성하지 않고 기능을 진행한다. 105 | - non-transactinal하게 실행된다. 106 | -------------------------------------------------------------------------------- /spring/jsy/spring.md: -------------------------------------------------------------------------------- 1 | # :question: Spring 2 | 3 | #### reference 4 | https://webclub.tistory.com/458
5 | https://juyeop.tistory.com/23 6 |
7 | 8 | ## Question 9 | 1. 프레임워크란 무엇일까요? 프레임워크와 라이브러리 차이점에 대해 설명해주세요 10 | - 라이브러리와 프레임워크는 어플리케이션의 틀과 구조를 결정한다는 공통점을 가지고 있습니다. 11 | - 다만, 프레임워크가 큰 뼈대는 이미 잡혀있고 개발자가 그 안에 코드를 작성하여 프로그램을 개발하는 것이라면, 라이브러리는 개발자가 라이브러리가 필요할 때 능동적으로 호출하여 사용하는 것입니다. 12 | - 즉, 프레임워크는 꼭 써야되는 것과 지켜야되는 룰이 있는 반면, 라이브러리는 쓰든 안쓰든 개발자 마음대로 할 수 있다는 점에서 차이가 있습니다. 13 |
14 | 15 | ## :nerd_face: What I study 16 | 17 | ### 1. 프레임워크 18 | - 제어의 역전 개념이 적용된 대표적인 기술 19 | - 뼈대가 되는 부분을 미리 구현한 클래스, 인터페이스, 메소드 등의 모음 20 | - 뼈대나 기반구조를 의미 21 | - 어플리케이션의 틀과 구조를 결정한다. 22 | - 일정 수준 이상의 품질을 보증하는 코드를 비교적 빠르고 편하게 완성 및 유지보수할 수 있는 솔루션 23 | - 소프트웨어의 특정 문제를 해결하기 위해서 상호 협력하는 클래스와 인터페이스의 집합 24 | - 프로그래밍을 진행할 때 어느 정도의 구조를 제공해주기 때문에, 개발자는 이 프레임워크의 뼈대 위에서 코드를 작성하여 프로그램을 개발한다. 25 | - 개발자가 에플리케이션의 구조적 설계를 신경 쓸 필요가 없다. 26 | - 꼭 써야되는 것과 지켜야되는 룰이 있다. 27 | - 객체지향 개발을 하게 되면서 통합성, 일관성의 부족이 발생되는 문제를 해결한다. 28 | 29 |
30 | 31 | ### 2. 라이브러리 32 | - 단순 활용가능한 도구들의 집합 33 | - 특정 기능이 필요할 때 호출해서 쓰는 도구 모음 34 | - 어플리케이션의 틀과 구조를 결정한다. 35 | - 개발자가 만든 클래스에서 호출해서 능동적으로 사용한다. 36 | - 쓰든 안쓰든 개발자 마음대로 할 수 있다. 37 | 38 |
39 | 40 | ### 3. 프레임워크 vs 라이브러리 41 | - 어플리케이션의 흐름을 누가 지니고 있냐의 차이. 42 | - 제어 흐름에 대한 주도성이 누구에게/어디에 있는가 43 | 44 | ![1](https://t1.daumcdn.net/cfile/tistory/2344774D577B359522) 45 | 46 | - 프레임워크는 **전체적인 흐름을 자체적으로** 가지고 있어 **개발자는 그 안에서 필요한 코드를 작성한다.** 47 | - 프레임워크 위에 개발한 클래스를 등록해두고, 프레임워크가 흐름을 주도하는 중에 개발자가 만든 어플리케이션 코드를 사용하도록 한다. 48 | - 즉, 큰 뼈대는 이미 잡혀있고 그 안의 내용물을 채우는 느낌 49 | - 라이브러리는 **개발자가 전체적인 흐름을** 가지고 있어 **라이브러리를 자신이 원하는 기능을 구현하고 싶을 때 가져다 사용**할 수 있다. 50 | - 즉, 라이브러리 자체를 가져가 사용하고 호출하는 용도의 느낌 51 | - 프레임워크가 집 자체를 의미한다면, 라이브러리는 집 안의 가구들을 의미한다고 볼 수 있다. -------------------------------------------------------------------------------- /spring/kkw/@Cacheable.md: -------------------------------------------------------------------------------- 1 | ## @Cacheable 2 | 3 | ### 캐시를 사용하는 이유 4 | 5 | - 서버의 부담을 줄이고, 성능을 높이기 위해 사용 6 | - 반복적으로 동일한 결과를 반환화는 경우에 용이 7 | 8 | ### Spring 에서의 Cache 9 | 10 | - 스프링에서 AOP 방식으로 Cache 기능을 제공하고 있음 11 | - @EnableCaching 추가 12 | ```java 13 | @EnableCaching 14 | @SpringBootApplication 15 | public class MainApplication{ 16 | public static void main(String[] args) { 17 | SpringApplication.run(MainApplication.class, args); 18 | } 19 | } 20 | ``` 21 | - 캐시 매니저 빈 추가 22 | 23 | - ConcurrentMapCacheManager: Java의ConcurrentHashMap을 사용해 구현한 캐시를 사용하는 캐시매니저 24 | - SimpleCacheManager: 기본적으로 제공하는 캐시가 없어 사용할 캐시를 직접 등록하여 사용하기 위한 캐시매니저 25 | - EhCacheCacheManager: 자바에서 유명한 캐시 프레임워크 중 하나인 EhCache를 지원하는 캐시 매니저 26 | - CompositeCacheManager: 1개 이상의 캐시 매니저를 사용하도록 지원해주는 혼합 캐시 매니저 27 | - CaffeineCacheManager: Java 8로 Guava 캐시를 재작성한 Caffeine 캐시를 사용하는 캐시 매니저 28 | - JCacheCacheManager: JSR-107 기반의 캐시를 사용하는 캐시 매니저 29 | - RedisCacheManager : 외부 메모리인 Redis를 캐시로 사용할 때 사용하는 캐시 매니저 30 | 31 | - @Cacheable 32 | 33 | - 캐싱하고 싶은 메소드 위에 달아주면 된다. 34 | - 이 메소드의 캐시 값이 있으면 메소드를 진행하지 않고 캐시 값을 반환하고 없는 경우 진행 후 반환 값을 캐시 메모리에 저장 35 | - value = "캐시의 키 값에 메소드명으로 붙게 된다" 36 | - key = "캐시의 키 값" 37 | - cacheManager = 38 | 39 | ```java 40 | @Cacheable(key="#userId", value="userInfo") 41 | public UserDTO getUserInfo(String userId) { 42 | 43 | User user = userRepo.findById(userId); 44 | 45 | return new UserDTO(user); 46 | } 47 | ``` 48 | 49 | ```Redis 50 | key : userInfo::"test12345" 51 | value : {id : test12345, name: 김철수} 52 | ``` 53 | 54 | - @CachePut 55 | 56 | - 메소드에 실행에 영향을 주지 않고 캐시를 갱신해야 하는 경우에 사용 57 | - 사용 법은 위와 같음 58 | - @Cacheable은 캐시를 사용하여 메소드 실행을 건너뛰지만 @CachePut은 캐시 갱신을 하려고 실행을 강제한다. (특이케이스가 아닌 이상 두 어노테이션은 같이 사용하지 않는 것을 권장한다) 59 | 60 | ```java 61 | @CachePut(key="#userId", value="userInfo") 62 | @Transactional 63 | public UserDTO changeUserName(String userId, String userName) { 64 | 65 | User user = userRepo.findById(userId); 66 | user.setName(userName); 67 | return new UserDTO(user); 68 | } 69 | ``` 70 | 71 | - @CacheEvict 72 | 73 | - 캐시를 제거하고자 하는 메소드에 사용 74 | - value = "캐시 앞에 들어가는 접두사" 75 | - key = "캐시의 키 값" 76 | - allEntries=true : key값과 관계없이 모든 캐시를 제거 77 | 78 | ```java 79 | @Cacheable(value ="userInfos") 80 | public UserListDTO getUserList(){ 81 | List userList = userRepo.findAll(); 82 | 83 | return new UserListDTO(userList); 84 | } 85 | 86 | 87 | @CacheEvict(value="userInfos") 88 | @Transactional 89 | public UserDTO signUp(String userId, String userName) { 90 | 91 | User user = new User(userId, userName); 92 | userRepo.save(user); 93 | 94 | return new UserDTO(user); 95 | } 96 | ``` 97 | 98 | - @Caching 99 | 100 | - 여러 개의 @CacheEvict나 @CachePut을 하나의 메소드에 지정해야 하는 경우에 사용 101 | 102 | ```Java 103 | @Caching(evict = { @CacheEvict("primary"), @CacheEvict(value = "secondary", key = "#p0") }) 104 | public Book importBooks(String deposit, Date date) 105 | ``` 106 | 107 | - 위의 어노테이션이 달린 메소드들은 같은 클래스 내부의 어노테이션이 없는 다른 메소드에 의해서 호출되면 안된다. 108 | 109 | ```Java 110 | public UserDTO updateUser(String userId, String userNamem, String type){ 111 | 112 | UserDTO userDto = null; 113 | 114 | if(type.equals("name") || type.equals("ALL")){ 115 | userDto = updateName(userId, userName); 116 | } 117 | 118 | return userDto; 119 | } 120 | 121 | @Cacheable(value="user", key="userId") 122 | @Transactional 123 | public UserDTO updateName(String userId, String userName){ 124 | User user = userRepo.findById(userId); 125 | user.setName(userName); 126 | 127 | return new UserDTO(user); 128 | } 129 | ``` 130 | 131 | - 위 같은 경우에선 캐시가 되지 않음 132 | - @Cacheable은 캐싱 처리하기 위해 인터셉터를 통해 적당한 시점에서 요청을 가로채서 필요한 처리를 실행하게 된다. 133 | - Proxy를 통해 들어오는 외부 메소드 호출만 인터셉트하는 AOP 특성상 동일 클래스 내(this)에서 접근하는 경우에는 동작하지 않는다. 134 | 135 | ### 참고 사이트 136 | 137 | - https://docs.spring.io/spring-framework/docs/5.0.0.M5/spring-framework-reference/html/cache.html 138 | -------------------------------------------------------------------------------- /spring/kkw/@Transactional.md: -------------------------------------------------------------------------------- 1 | ## Transactional을 조심해서 사용해야 하는 이유 2 | 3 | ### save를 해주지 않았는데 DB에 변경이 되는 경우 4 | 5 | - JPA를 사용하다보면 save를 해주지 않았음에도 DB에 변경된 값이 들어가는 경우를 볼 수 있다. 6 | - 아래와 같은 예시를 볼 수 있다. 7 | 8 | ```Java 9 | @Service 10 | @Transactional(readOnly = true) 11 | public class TestService{ 12 | 13 | @Autowired 14 | UserRepository userRepo; 15 | 16 | 17 | @Transactional 18 | public void setName(String name){ 19 | User user = userRepo.findById("test"); 20 | user.setName(name); 21 | } 22 | } 23 | ``` 24 | 25 | - 위와 같이 코드를 작성한 경우 userRepo를 통해 save 함수를 호출 하지 않았음에도 DB에서 user의 name이 변경되는 것을 볼 수 있다. 26 | 27 | ```Java 28 | @Service 29 | public class TestService{ 30 | 31 | @Autowired 32 | UserRepository userRepo; 33 | 34 | 35 | public void setName(String name){ 36 | User user = userRepo.findById("test"); 37 | user.setName(name); 38 | } 39 | } 40 | ``` 41 | 42 | - 반면에 위와 같은 코드에서는 user의 값이 변하지 않는 것을 알 수 있다. 43 | 44 | ### 무슨 차이일까? 45 | 46 | - EntityManager는 영속성 컨텍스트를 통해서 객체들을 관리한다. 47 | - EntityManager는 트랜잭션 마다 다른 영속성 콘텍스트를 사용한다. 48 | - 이 영속성 컨텍스트 안에 있는 객체가 변경될 경우, 변경 감지를 통해서 Update Query가 생성된다. 49 | - @Transactional 으로 감싸운 메소드가 끝날 때, 트랜잭션이 커밋되고 이 때 EntityManager가 자동으로 flush를 호출하게 됩니다. 50 | - 그러면 엔티티와 스냅샷을 비교해서 변경된 엔티티들을 찾고 수정 쿼리가 자동으로 생성되어 DB에 커밋되게 되는 것 입니다. 51 | 52 | ### 주의할 점 53 | 54 | - Hibernate에서는 SQL쿼리가 항상 우리가 작성한대로 진행을 하지 않습니다. 55 | - Hibernate의 공식 문서를 확인해보면 다음과 같은 순서로 쿼리문이 진행되는 것을 알 수 있습니다. 56 | - 참고 : https://docs.jboss.org/hibernate/orm/4.2/javadocs/org/hibernate/event/internal/AbstractFlushingEventListener.html 57 | 58 | ``` 59 | 1. Inserts, in the order they were performed 60 | 2. Updates 61 | 3. Deletion of collection elements 62 | 4. Insertion of collection elements 63 | 5. Deletes, in the order they were performed 64 | ``` 65 | 66 | - 그렇기 때문에 메소드와 Service 자체를 Transactional로 묶는 경우 Flush를 수동으로 해줘야 하는 경우가 생기지 않도록 구성을 잘해야 합니다. 67 | -------------------------------------------------------------------------------- /spring/kkw/Date.md: -------------------------------------------------------------------------------- 1 | ## Date의 문제점 2 | 3 | - `java.util.Date` , `java.sql.date` 4 | - 불변 객체가 아니다 (Not immutable) 5 | - 상수 필드의 남용 6 | - ex) Calendar.SECOND ,Calendar.OCTOBER 7 | - 헷갈리는 값 지정 8 | - 일부 값이 0 부터 시작한다. 9 | - ex) Calender.OCTOBER = 9 10 | - calendar.set(2021,10,21) = 2021년 9월 21일 11 | - calendar.set(2020,12,31) = 2021년 1월 31일 -> 12를 넣어도 에러가 아닌 1로 변환된다 12 | - 일관성 없는 상수 13 | 14 | - Calender.DAY_OF_WEEK는 int형으로, 일요일을 1로 표현한다 15 | - Date.getDay()로 요일을 구하면 일요일을 0으로 표현한다. 16 | 17 | - Date와 Calendar의 불편한 역할 분담 18 | 19 | - 특정 시간대의 날짜를 생성하거나, 날짜 단위의 계산을 Date 클래스만으로 수행이 불가능 20 | - 날짜 연산을 위해선 Calendar 객체를 생성하고 생성된 객체에서 Date를 생성한다. -> 불필요한 과정을 거침 21 | - 헷갈리는 함수명 : Calendar.getTime() : 반환값 Date 타입 22 | 23 | - 오류에 둔감한 ID 지정 24 | 25 | - Asia/Seoul 대신 Seoul/Asia로 오타가 나도 오류가 발생하지 않음 26 | 27 | ``` 28 | TimeZone zone = TimeZone.getTimeZone("Seoul/Asia"); 29 | ``` 30 | 31 | ## LocalDate, LocalDateTime 32 | 33 | - `java.time.LocalDate` , `java.time.LocalDateTime` 34 | - Joda-Time이나 다른 오픈소스 라이브러리에 영향을 많이 받은 표준 명세 35 | - DateTime 대신 ZoneDateTime을 사용 36 | - 단위별 날짜 연산 메소드를 지원함(plusDays, plusMinutes) 37 | - 월의 int값과 명칭이 일치함 `1월` = `(int)1` 38 | - 13월처럼 잘못된 값이 들어가면 객체 생성 시점에서 `DateTimeException`을 던짐 39 | - 요일 클래스는 Enum 상수로 제공됨 40 | - 잘못 된 시간대 ID 지정에 대해서 `ZoneRulesException` 던짐 41 | -------------------------------------------------------------------------------- /spring/kkw/DesignPattern.md: -------------------------------------------------------------------------------- 1 | ### 점층적 생성자 패턴(Telescoping Constructor Pattern) 2 | 3 | - 클래스 내에 오버로딩을 통해서 생서자를 여러 개 작성하는 방법 4 | 5 | ```Java 6 | User user = new User("uid12345", "kim", 20, Male, "01012345678"); 7 | User user = new User("uid12345", "kim" ,"male"); 8 | ``` 9 | 10 | - 특정 파라미터가 어떠한 값을 나타내는지 확인하기가 어려움 11 | - 사용자가 설정하길 원치 않는 매개변수까지 설정을 해주어야 함 12 | - 매개변수 조합에 따라 생성자의 수가 쓸데없이 많이 늘어날 수 있음 13 | - 매개변수가 늘어날 수록 코드 작성 및 가독성이 저하됨 14 | 15 | ### 자바빈즈 패턴(JavaBeans Pattern) 16 | 17 | - 매개변수가 없는 생성자로 객체를 만든 후 Setter 메소드들을 호출해 원하는 매개변수 값을 설정하는 방식 18 | 19 | ```Java 20 | User user = new User(); 21 | 22 | user.setUid("uid12345"); 23 | user.setName("kim"); 24 | user.setPhoneNumber("01012345678"); 25 | ``` 26 | 27 | - 가독성이 좋으며 인스턴스를 만들기 쉬움 28 | - 객체 하나를 만들기 위해 메소드를 여러 개 호출 하여야 함 29 | - 객체가 완전히 생성되기 전까지는 일관성(Consistency)가 무너진 상태에 놓이게 된다. 30 | - 클래스를 불변(immutable) 상태로 만들 수 없음 31 | -> frezz 방식으로 완성된 객체를 immutable 상태로 만들 수는 있음 32 | 33 | ### 빌더 패턴(Builder Pattern) 34 | 35 | - 생성과 표현의 분리를 위해 디자인된 패턴 36 | - 클라이언트 코드에서 필요한 객체를 직접 생성하는 대신, 그 전에 필수 인자들을 전달하여 빌더 객체를 만들 뒤, 빌더 객체에 정의된 설정 메소드들을 호출하여 인스턴스를 생성하는 방법 37 | 38 | ```Java 39 | User user = new User.userBuilder("uid12345") 40 | .name("kim") 41 | .phoneNumber("01012345678") 42 | .build(); 43 | ``` 44 | 45 | - 인스턴스를 생성하는 필수 인자와 선택 인자를 구분할 수 있다 46 | - 가독성이 좋고, 일관성을 유지할 수 있다. 47 | - Effective Java의 빌더 패턴 48 | - 객체를 만들 때 변수를 각각 개별 함수로 세팅하고, 변수 설정이 끝나면 객체를 만들어 반환하는 방법 49 | - 매개변수가 많을 때 사용하면 좋음 50 | - 만들어진 객체는 멤버변수를 수정할 수 없다. 51 | - lombok의 @Builder 어노테이션을 이용해서도 구현 가능 52 | ```Java 53 | @Builder 54 | public class User { 55 | private final String uid; 56 | private final String name; 57 | private final String phoneNumber; 58 | } 59 | ``` 60 | - GoF 디자인 빌더 패턴 61 | ![problem1](https://user-images.githubusercontent.com/43779730/134389675-cc3aee43-2378-4f33-a494-189470406bed.png) 62 | 63 | - 복잡한 객체를 생성하는 방법과 표현하는 방법을 정의하는 클래스를 별도로 분리하여, 서로 다른 표현이라도 이를 생성할 수 있는 동일한 절차를 제공할 수 있도록 하는 것 64 | - 각기 다른 기능을 가진 객체를 생성하는데 있어서 통일된 방식을 제공한다는 것 65 | - `Builder` : 객체의 일부 요소들을 생성하기 위한 추상 인터페이스를 제공 66 | - `ConcreteBuilder` : Builder 클래스에 정의된 인터페이스를 구현하며, 제품의 부품들을 모아 빌더를 복합한다. 생성한 요소의 표현을 정의하고 관리함. 제품을 검색하는데 필요한 인터페이스도 제공함 67 | - `Director` : Builder 인터페이스를 사용하는 객체를 합성함 68 | - `Product` : 생성할 복합 객체를 표현함 69 | - 과정 70 | - 사용자가 `Director` 객체를 생성하고, 생성한 객체를 자신이 원하는 `Builder` 객체로 합성해 나감 71 | - 제품의 일부가 구축될 때마다 `Director`는 `Builder`에 통보한다 72 | - `Builder`는 `Director`의 요청을 처리하며 제품에 부품을 추가한다 73 | - 사용자는 `Builder`에서 제품을 검색한다 74 | 75 | ### 참고 사이트 76 | 77 | - https://projectlombok.org/features/Builder 78 | - https://johngrib.github.io/wiki/design-pattern/builder-pattern/ 79 | - https://refactoring.guru/design-patterns/builder 80 | -------------------------------------------------------------------------------- /spring/kkw/GIT-rebase.md: -------------------------------------------------------------------------------- 1 | ## Merge 2 | 3 | - Merge는 branch들을 병합하는 것 4 | - commit history로 같이 병합된다 5 | 6 | ![git-merge](https://user-images.githubusercontent.com/43779730/139853647-7378fc43-6b57-4fbb-afa3-8d0fb854de6a.png) 7 | 8 | ## Rebase 9 | 10 | - Merge처럼 두 branch를 합칠 때 사용 11 | - 현재 branch가 대상 branch위로 올라감 12 | - Merge commit이 남지 않아 하나의 흐름으로 유지가 됨 13 | - 위험하니깐 조심스럽게 사용하여야함 14 | - commit history에 변경이 발생 15 | 16 | ![git-rebase](https://user-images.githubusercontent.com/43779730/139853853-6224c5e1-d0fd-40b5-ae68-226b991a3028.png) 17 | 18 | - rebase는 엄밀하게 이동이 아니라 내부에서 노드 변경점의 역추적을 통한 `복제`가 이뤄집니다. 19 | 20 | ## Rebase의 활용 21 | 22 | - Master 브랜치 이외의 브랜치에서 파생된 브랜치가 있는 경우 23 | 24 | ![git-rebase01](https://user-images.githubusercontent.com/43779730/139853995-be9602d8-3071-4313-ad9b-a6417c0f76f8.png) 25 | 26 | - 변경된 부분만 가져오기 때문에 파생된 브랜치의 부분만 가져올 수 있다. 27 | ![git-rebase02](https://user-images.githubusercontent.com/43779730/139854016-c8945b43-fd4d-4bf2-91c3-97363a2e2d83.png) 28 | 29 | - 로컬 작업물을 원격 저장소의 최신 변경 사항으로 업데이트 하려 할 때 사용 30 | - 원격 저장소의 커밋 히스토리를 어지럽히지 않을 수 있음 31 | 32 | ## Rebase 주의점 33 | 34 | - 원격 저장소에 push된 branch는 rebase를 하지 않도록 한다 35 | 36 | - 원격 저장소에서 팀원의 branch와 Merge된 Master Branch를 Pull 한다고 가정했을 때, 다음과 같은 상태가 될 것이다. 37 | 38 | ![git-rebase03](https://user-images.githubusercontent.com/43779730/139856981-2e1807b9-0ee2-4bed-a9d2-7a6ef0341a22.png) 39 | 40 | - 만약의 팀원이 merge를 취소하고 Rebase 하게 된다면 어떻게 될까? 41 | 42 | ![git-rebase04](https://user-images.githubusercontent.com/43779730/139857168-ba281165-586b-469f-97f0-929ed59b6032.png) 43 | 44 | - A4와 A3`는 실질적으로 똑같은 Commit을 나타내지만, 불필요하게 중복된 Commit 내용을 가져오게 된다. 45 | - 이는 히스토리에 똑같은 Commit 내용이 발생하게 되고 혼란을 야기한다. 46 | 47 | ## Cherry-pick 48 | 49 | - 특정한 Commit 하나만 골라서 현재 branch에 추가해준다. 50 | 51 | ![git-cherrypick](https://user-images.githubusercontent.com/43779730/139857739-ebdf8dea-3014-46f9-9c20-4b78db598b9b.png) 52 | -------------------------------------------------------------------------------- /spring/kkw/Hibernate.md: -------------------------------------------------------------------------------- 1 | # Hibernate 2 | 3 | ## SQL Mapper vs ORM 4 | 5 | - SQL Mapper 6 | - SQL <-매핑-> Object 7 | - SQL Mapper는 SQL 쿼리로 직접 DB 데이터를 다룸 8 | - ex) MyBatis 9 | - ORM(Object-Relational Mapping) 객체-관계 매핑 10 | - DB 데이터 <-매핑-> Object 11 | - 객체를 통해 간접적으로 데이터베이스 데이터를 다룸 12 | - 객체간의 관계를 바탕으로 SQL을 자동으로 생성해 준다 13 | 14 | ### Hibernate 15 | 16 | - 자바 언어를 위한 객체 관계 매핑 프레임워크 17 | - `JPA`는 Java Persistence API의 약자로, 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 `인터페이스`이다. 18 | - JPA는 단순한 명세이기 때문에 구현이 없다. 19 | - Hibernate는 JPA의 구현제이다. 20 | - 그렇기 때문에 JPA를 사용하기 위해서 Hibernate 대신에 다른 구현체를 사용하여도 상관이 없다. 21 | 22 | ## MyBatis vs JPA 23 | 24 | - MyBatis 25 | - SQL Mapper 26 | - 장점 27 | - SQL 쿼리를 직접 작성하므로 최적화된 쿼리를 구현 가능 28 | - 엔티니에 종속받지 않고 다양한 테이블 조합이 가능 29 | - 복잡한 쿼리도 SQL 쿼리만 작성할 수 있다면 처리 가능 30 | - 단점 31 | - 스키마 변경시 SQL 쿼리를 직접 수정해줘야함 32 | - 반복된 쿼리가 발생하여 반복된 작업이 있음 33 | - DB변경시 로직도 함께 수정해주어야함 34 | - JPA 35 | - 장점 36 | - 개발이 편리함 (SQL을 직접 작성하지 않아도 됨) 37 | - 테이블 변경 시 JPA의 엔티티만 수정해주면 됨 38 | 39 | ### Spring Data JPA 40 | 41 | - Spring Data JPA는 Spring에서 제공하는 모듈로, JPA를 한 단계 추상화시킨 `Repository` 라는 인터페이스를 제공해준다. 42 | - `Repository` 인터페이스에 정해진 규칙대로 메소르를 입력하면 Spring이 알아서 해당 메소드 이름에 적합한 쿼리를 날리는 구현체를 만들어서 Bean을 등록해 준다. 43 | 44 | ### 정리 45 | 46 | - JPA는 자바 JDBC를 사용하는 방식을 정의한 인터페이스이다. 47 | - Hibernate는 JPA의 구현한 라이브러리이다. 48 | - Spring Data JPA는 JPA를 쓰기 편하게 하기 위해 JPA를 한 단계 추상화 시킨 모듈이다. 49 | 50 | jpa 51 | 52 | ### 참고 사이트 및 문헌 53 | 54 | - https://spring.io/projects/spring-data-jpa#overview 55 | - https://suhwan.dev/2019/02/24/jpa-vs-hibernate-vs-spring-data-jpa/ 56 | -------------------------------------------------------------------------------- /spring/kkw/PersistenceContext.md: -------------------------------------------------------------------------------- 1 | ### Persistence Context (영속성 컨텍스트) 2 | 3 | - 엔티티를 영구히 저장하는 환경 4 | - 논리적인 개념 5 | - 엔티티 매니저를 통해서 영속성 컨텍스트에 접근 6 | 7 | ### 엔티이의 생명주기 8 | 9 | - 비영속(new/transient) : 영속성 컨텍스트와 전혀 관계가 없는 상태 10 | - 순수한 객체 상태 11 | - 영속(managed) : 영속성 컨텍스트에 저장된 상태 12 | - 영속 상태는 영속성 컨텍스트에 의해 관리된다는 뜻 13 | - em.find(), JPQL을 사용해서 조회된 엔티티들 14 | - 준영속(detached) : 영속성 컨텍스트에 저장되었다가 분리된 상태 15 | - 영속성 컨텍스트가 관리하던 영속 상태의 엔티티를 관리하지 않는 상태로 바뀌는 것 16 | - em.detach(entity), em.close(), em.clear() 17 | - 삭제(removed) : 삭제된 상태 18 | - 영속성 컨텍스트와 DB에서 삭제한다 19 | - em.remove(entity) 20 | 21 | ### 영속성 컨택스트의 특징 22 | 23 | - 영속성 컨택스트와 식별자 값 24 | - 엔티티를 식별자 값(@Id)로 구분한다. 25 | - 영속 상태는 식별자 값이 반드시 있어야 한다. 26 | - 영속성 컨텍스트와 데이터베이스 저장 27 | - JPA는 트랜잭션을 커밋하는 순간 영속성 컨택스트에 새로 저장된 엔티티를 DB에 반영한다(Flush) 28 | - 장점 29 | - 1차 캐시 30 | - find()를 하게 되면 1차 캐시를 먼저 조회하게 되어, 1차 캐시에 해당 엔티티가 존재하면 바로 반환한다 31 | - 동일성(identity) 보장 32 | - 동일성(identity) : 실제 인스턴스가 같아서 참조 값이 같다. 33 | - 동등성(equality) : 실제 인스턴스는 다르지만, 가지고 있는 값이 같은 경우 34 | - 트랜잭션을 지원하는 쓰기 지연 35 | - 변경 감지(Dirty Checking) 36 | - 변경 감지는 영속 상태의 엔티티에만 적용됨 37 | - JPA는 엔티티를 영속성 컨텍스트에 보관할 때, 최초 상태를 복사해서 저장해준다(스냅샷) 38 | - 엔티티와 스냅샷을 비교하여 변경된 엔티티를 찾는다. 39 | - 변경된 엔티티가 있는 경우 수정 쿼리를 생성하여 쓰기 지연 SQL 저장소에 보낸다. 40 | - 쓰기 지연 저장소의 SQL을 DB에 보낸다 41 | - DB에 트랜잭션을 커밋한다 42 | - JPA는 Update 문을 작성할 시 엔티티의 모든 필드를 업데이트 함(데이터 전송량이 증가하지만 대신에 수정 쿼리가 항상 같음) 43 | -> @org.hibernate.annotations.DynamicUpdate를 사용하면 수정된 부분만 Update 가능 44 | - 지연 로딩 45 | 46 | ### 플러시(Flush) 47 | 48 | - 플러시(flush())는 영속성 컨텍스트의 변경 내용을 DB에 반영한다 49 | - 영속성 컨텍스트의 변경 내용을 DB에 동기화하는 것 50 | - 영속성 컨텍스트를 플러시하는 3가지 방법 51 | - em.flush()를 직접 호출 52 | - 테스트나 다른 프레임워크와 함께 JPA를 사용할 때를 제외하곤 거의 사용 안 함 53 | - 트랜잭션 커밋 시 플러시가 자동 호출 54 | - 트랜잭션을 커밋하기 전에 영속성 컨텍스트의 변경 내용을 DB에 반영해야 하기 때문에, JPA에서 트랜잭션 커밋 전에 자동으로 호출함 55 | - JPQL 쿼리 실행 시 플러시가 자동 호출 56 | - JPQL은 SQL로 변환되어 DB에서 엔티티를 조회한다. 57 | - 영속성 컨텍스트에 존재하는 엔티티들을 JPQL로 조회를 하는 경우, 제대로 된 값을 줄 수가 없다. 58 | - 그래서 JPA에서는 JPQL을 실행할 때 플러시를 자동으로 호출 해 준다. 59 | -------------------------------------------------------------------------------- /spring/kkw/REST.md: -------------------------------------------------------------------------------- 1 | ### REST 2 | 3 | - Representational State Transfer 4 | - 자원의 이름으로 구분하여 해당 자원의 상태를 주고 받는 모든 것을 의미 5 | - 자원의 표현에 의한 상태 전달 6 | - REST는 기본적으로 웹의 기술과 HTTP 프토로콜을 그대로 활용하기 때문에 웹의 장점을 최대한 활용할 수 있는 아키텍쳐 스타일 7 | 8 | ### REST의 개념 9 | 10 | - HTTP URI를 통해 자원을 명시하고 HTTP METHOD를 통해 해당 자원에 대한 CRUD Operation을 적용하는 것을 의미 11 | - REST는 자원 기반의 구조 설계의 중심에 Resource가 있고 HTTP Method를 통해 Resource를 처리하도록 설계된 아키텍쳐를 의미 12 | - 웹 사이트의 이미지, 텍스트, DB 내용 등의 모든 자원에 고유한 ID인 HTTP URI를 부여한다 13 | - CRUD Operation 14 | 15 | - Create : 생성(POST) 16 | - Read : 조회(GET) 17 | - Update : 수정(PUT) 18 | - Delete : 삭제(Delete) 19 | - HEAD : header 정보 조회(HEAD) 20 | 21 | ### 장단점 22 | 23 | - 장점 24 | - HTTP 프로토콜의 인프라를 사용하기 때문에 REST API 사용을 위해 별도의 인프라 구축 필요 없음 25 | - HTTP 표준 프로토콜에 따르는 모든 기능을 사용이 가능 26 | - REST API 메세지가 의도하는 바를 명확하게 나타내므로 의도하는 바를 쉽게 파악 가능 27 | - 서버와 클라이언트의 역할을 명확하게 분리 28 | - 단점 29 | - 표준이 존재하지 않음 30 | 31 | ### 구성 32 | 33 | - 자원(Resource) : URI 34 | - 모든 자원에 고유한 ID가 존재하고, 이 자원은 Server에 존재 35 | - Client는 URI를 이용해서 자원을 지정하고 해당 자원의 상태에 대한 조작을 Server에 요청한다 36 | - 행위(Verb) : HTTP Method 37 | - HTTP 프로토콜의 Method를 사용한다 38 | - GET, POST, PUT, DELETE 39 | - 표현(Representation of Resource) 40 | - Client가 자원의 상태에 대한 조작을 요청하면 Server는 이에 적절한 응답을 보낸다 41 | - REST에서 하나의 자원은 JSON, TEXT, XML 등 여러 형태로 나타내질 수 있다 42 | - 일반적으로 JSON, XML으로 주고 받음 43 | 44 | ### REST 아키텍쳐에 적용되는 6가지 특징 45 | 46 | - 인터페이스의 일관성 47 | - URI로 지정한 자원에 대한 조작을 통일되고 한정적인 인터페이스로 수행 48 | - HTTP 표준 프로토콜에 따르는 모든 플랫폼에서 사용이 가능하다 49 | - Stateless 50 | - 각 요청 간 클라이언트의 콘텍스트가 서버에 저장되어서는 안 된다 51 | - Server는 각각의 요청을 완전히 별개의 것으로 인식하고 처리한다 52 | - 캐시 처리 가능 53 | - 웹 표준 HTTP 프로토콜을 사용하므로 웹에서 사용하는 기존의 인프라를 그대로 활용이 가능 54 | - 캐시 사용을 통해 응답 시간이 빨라지고 REST Server에 트랜잭션이 발생하지 않기에 응답시간, 성능, 서버의 자원 이용률이 모두 상승한다 55 | - 계층화 56 | - API서버는 순수 비지니스 로직만 수행, 클라이언트는 대상 서버에 직접 연결되었는지 중간 서버를 통해 연결되었는지 알 수 없다. 57 | - Proxy, 게이트웨이 같은 네트워크 기반의 중간 매체를 사용 가능 58 | - Code on demand(Optional) 59 | - 서버가 클라이언트에게 코드를 응답해주면, 클라이언트는 응답 코드를 실행 할 수 있다 60 | - 클라이언트/서버 구조 : 클라이언트와 서버가 독립적으로 분리되어 있다 61 | 62 | ### REST API 63 | 64 | - REST 기반으로 서비스 API를 구현한 것 65 | - 특징 66 | - REST 기반으로 시스템을 분산해 확장성과 재사용성을 높여 유지보수 및 운용을 편리하게 할 수 있다 67 | - HTTP를 지원하는 프로그램 언어로 클라이언트, 서버를 구현할 수 있다 68 | - 설계 기본 규칙 69 | - URI는 정보의 자원을 표현해야 한다 70 | - 자원에 대한 행위는 HTTP Method로 표현한다 71 | 1. URI에 HTTP METHOD가 들어가면 안 된다 72 | ``` 73 | GET /user/delete/1 -> DELETE /user/1 74 | ``` 75 | 2. URI에 행위에 대한 동사 표현이 들어가지 않는다 76 | ``` 77 | GET /user/show/1 -> GET /user/1 78 | ``` 79 | 3. 경로 부분 중 변하는 부분은 유일한 값으로 대체한다 80 | 81 | ### RESTful 하다? 82 | 83 | - RESTful은 일반적으로 REST 라는 아키텍쳐로 구현한 웹 서비스를 나타내는 표현 84 | - REST API를 제공하는 웹 서비스를 RESTful 하다고 할 수 있다 85 | -------------------------------------------------------------------------------- /spring/yij/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjuyeon/Tech-Interview-Study/f5f4978becafb443db02eee145e58f6a1618dfa2/spring/yij/.DS_Store -------------------------------------------------------------------------------- /spring/yij/Kotlin 94bb7f23bc6a4e3f899403dbf8bcfafe/Untitled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjuyeon/Tech-Interview-Study/f5f4978becafb443db02eee145e58f6a1618dfa2/spring/yij/Kotlin 94bb7f23bc6a4e3f899403dbf8bcfafe/Untitled.png -------------------------------------------------------------------------------- /spring/yij/README.md: -------------------------------------------------------------------------------- 1 | # 6) Spring 2 | - contributor : [김경원](https://github.com/shining8543) , [윤이진](https://github.com/483759) , [진수연](https://github.com/jjuyeon) 3 |
4 | 5 | ### :notebook_with_decorative_cover: Spring 6 | 1. Spring MVC 구조 흐름에 대해 과정대로 설명해주세요. 7 | 8 | > 1️⃣ 클라이언트는 디스패처 서블릿에게 요청합니다. 9 | > 2️⃣ 디스패처 서블릿은 어떤 컨트롤러가 요청을 처리할 수 있을지 핸들러 매핑을 이용해서 URI를 분석해서 알아냅니다. 10 | > 3️⃣ 해당 요청을 특정한 컨트롤러에게 전달합니다. 11 | > 4️⃣ 컨트롤러는 비즈니스 로직을 통해 요청을 처리한 뒤 수행 결과를 반환합니다. 12 | > 5️⃣ 디스패처 서블릿은 수행 결과를 표현할 뷰 이름을 뷰리졸버에게 전달합니다. 13 | > 6️⃣ 뷰 리졸버는 이를 처리할 수 있는 경로와 확장자 정보를 담아 반환합니다. 14 | > 7️⃣ 디스패처 서블릿은 뷰에게 응답 결과를 담아 전달합니다. 15 | > 8️⃣ 뷰는 클라이언트에게 응답 결과를 담아 화면을 표현합니다. 16 | 17 |
18 | 19 | 2. Spring DI에 대해 설명해주세요. 20 | 21 | > DI는 Dependency Injection의 약자로, 객체 인스턴스의 생성/관리/소멸을 사용자가 아닌 컨테이너가 관리하는 것을 말합니다. 22 | > 인스턴스의 생성과 객체의 선언을 분리해서 결합도를 낮춥니다. 이는 프로그램의 유지보수성과 확장성을 증가시킬 수 있습니다. 23 | 24 |
25 | 26 | 3. Spring과 Spring Boot의 차이점에 대해 설명해주세요. 27 | 28 | > 스프링 부트는 스프링 기반 애플리케이션을 더 쉽게 구현할 수 있도록 해주는 프레임워크입니다. 기존 xml 기반으로 설정을 해주어야 했던 부분을 빌드 파일을 이용해서 쉽게 관리해서 권장 버전으로 설정해줍니다. 또한 톰캣을 내장 서버로 가지고 있어 WAS 서버를 직접 지정해주지 않아도 됩니다. 29 | 30 |
31 | 32 | 4. Filter와 Interceptor의 차이점에 대해 설명해주세요. 33 | 34 | > 35 | 36 |
37 | 38 | 5. 영속성 컨텍스트에 대해 설명해주세요. 39 | 6. Spring에서 CORS 에러를 해결하기 위해 했던 방법은 무엇인가요? 40 | 7. Bean/Component 어노테이션은 무엇이며, 둘의 차이점은 무엇인가요? 41 | 8. Spring Triangle의 POJO와 AOP에 대해 설명해주세요 42 | 9. Hibernate에 대해서 설명하세요 43 | 44 | ### :notebook_with_decorative_cover: JPA 45 | 1. JPA Propagation 전파단계를 설명해주세요. 46 | 2. N+1 문제가 발생하는 이유와 이를 해결하는 방법을 설명해주세요. 47 | 48 | ### :notebook_with_decorative_cover: Design Pattern 49 | 1. Builder 패턴에 대해서 설명하세요. 50 | 2. MVC1과 MVC2 패턴의 차이를 설명해 주세요. 51 | 3. (꼬리질문) 그렇다면, Spring MVC 는 무엇일까요? -------------------------------------------------------------------------------- /spring/yij/Transaction.md: -------------------------------------------------------------------------------- 1 | > [💡] JPA의 Propagation에 대해 설명해주세요 2 | 3 | ## Transaction of Spring 4 | 5 | Spring에서 Transaction 설정을 하기 위해서는 6 | 7 | 1. Annotation 8 | 2. AOP 9 | 10 | 를 활용할 수 있다. 11 | 12 | `@Transactional` 어노테이션을 활용하면 트랜잭션 설정을 할 수 있으며, 몇 가지 주의 사항이 존재한다. 13 | 14 | ### Configure Transaction 15 | 16 |
17 | Java Configuration 코드 18 | 19 | ```java 20 | @Configuration 21 | @EnableTransactionManagement 22 | public class PersistenceJPAConfig{ 23 | 24 | @Bean 25 | public LocalContainerEntityManagerFactoryBean 26 | entityManagerFactoryBean(){ 27 | //... 28 | } 29 | 30 | @Bean 31 | public PlatformTransactionManager transactionManager(){ 32 | JpaTransactionManager transactionManager 33 | = new JpaTransactionManager(); 34 | transactionManager.setEntityManagerFactory( 35 | entityManagerFactoryBean().getObject() ); 36 | return transactionManager; 37 | } 38 | } 39 | ``` 40 | 41 |
42 | 43 |
44 | XML Configuration 코드 45 | 46 | ```xml 47 | 48 | 49 | 50 | 51 | ``` 52 |
53 |
54 | Annotation Configuration 코드 55 | 56 | ```java 57 | @Service 58 | @Transactional 59 | public class FooService { 60 | //... 61 | } 62 | ``` 63 |
64 | 65 |
66 | 67 | Spring 3.1에서는 `@EnableTransactionManagement` 어노테이션과 `@Configuration` 어노테이션을 사용해서 트랜잭션을 사용할 것 이라고 명시해야 한다. 68 | 69 | 하지만 Spring Boot를 사용하면 `spring-data-` 혹은 `spring-tx` 의존성을 사용하면 트랜잭션 설정을 default로 할 수 있다. 70 | 71 |
72 | 73 | #### Annotation Configuration 74 | 75 | `@Transactional` Annotation을 사용하면 다음과 같은 설정도 할 수 있다. 76 | 77 | - 트랜잭션의 **Propagation Type** 78 | - 트랜잭션의 **Isolation Level** 79 | - 트랜잭션에 의해 래핑된 작업의 **Time Out** 80 | - **readOnly** flag - 트랜잭션이 읽기 전용인지 81 | - **Rollback** 규칙 82 | 83 | default 설정에 의해 rollback이 runtime에 발생하기 때문에, **unchecked exception**이 발생할 수 있다(checked exception은 rollback을 트리거하지 않는다❗❗). `rollbackFor`와 `noRollbackFor`를 통해 이를 제어할 수 있다. 84 | 85 |
86 | 87 | ### Transaction Propagation 88 | 89 | 비즈니스 로직과 트랜잭션의 경계를 정의하는 수준 90 | 91 | Spring은 propagation setting에 따라 트랜잭션을 시작하고 중단하며 관리한다. 92 | 93 | propagation 단계에 따라 트랜잭션을 가져오거나 생성하기 위해 `TransactionManager::getTransaction`을 호출한다. 94 | 95 |
96 | 97 | ### Annotation 사용의 잠재적 위험 98 | 99 | #### Transaction과 Proxy 100 | 101 | Spring은 `@Transactional`이 붙은 클래스(또는 메소드)에 대해 프록시를 생성한다. 이 프록시는 트랜잭션의 시작과 커밋을 위해 메서드를 실행하기 전 트랜잭션 로직을 주입한다. 102 | 103 | 중요한 것은 만약 Transactional Bean이 **Interface를 implements**할 경우, 기본으로 `Java Dynamic Proxy`를 사용하기 때문에 프록시를 통해 들어오는 외부 메서드 호출만 처리하게 된다. 메서드에 `@Transactional`가 있는 경우에도 클래스 내부 호출은 트랜잭션을 시작하지 않는다. 104 | 105 | 또한 `public` 메서드에만 `@Transactional`이 적용된다. 다른 visibility를 가진 메서드는 프록시 되지 않기 때문에 설정이 무시된다. 106 | 107 |
108 | 109 | #### Isolation Level 변경 110 | 111 | ```java 112 | @Transactional(isolation = Isolation.SERIALIZABLE) 113 | ``` 114 | 115 | isolation 레벨 설정은 Spring 4.1 이후에만 적용 가능하다. 116 | 117 |
118 | 119 | #### Read-Only Transaction 120 | 121 | > `readOnly`가 write access시도가 반드시 실패하는 것은 아니다 ❗❗ transaction manager는 read-only를 해석하지 못할 때 read-only 요청에 대해 예외를 throw하지 않는다. 122 | 123 | 즉, `readOnly`가 설정되었다고 삽입 또는 수정이 발생하지 않을 것이라 확신할 수 없다. 124 | -------------------------------------------------------------------------------- /web/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjuyeon/Tech-Interview-Study/f5f4978becafb443db02eee145e58f6a1618dfa2/web/.DS_Store -------------------------------------------------------------------------------- /web/README.md: -------------------------------------------------------------------------------- 1 | # 7) Web 2 | - contributor : [김경원](https://github.com/shining8543) , [윤이진](https://github.com/483759) , [진수연](https://github.com/jjuyeon) 3 |
4 | 5 | ### :notebook_with_decorative_cover: Web 6 | 1. DAO, DTO, VO에 대해 설명해보세요. 7 | 2. RESTful 하다는 것이 무엇인지 설명해주세요. 8 | 3. HTTP SET-Cookie에 대해서 설명해주세요 9 | 4. URI, URL, URN이란? 10 | 11 | ### :notebook_with_decorative_cover: Git 12 | 1. Git을 쓰는 이유는 무엇인지, Git과 GitHub의 차이점에 대해 설명해주세요 13 | 2. Git Rebase에 대해서 설명하세요 14 | 15 | ### :notebook_with_decorative_cover: 기타 16 | 1. 도커와 가상머신(VM)의 차이점에 대해 설명해주세요 17 | 2. 쿠버네티스가 무엇인가? -------------------------------------------------------------------------------- /web/jsy/README.md: -------------------------------------------------------------------------------- 1 | # Suyeon Jin 2 | 3 | |Study|바로가기| 4 | |---|---| 5 | |DAO, DTO, VO|[:white_check_mark:](./web.md)| 6 | |GIT|[:white_check_mark:](./git.md)| 7 | |Docker|[:white_check_mark:](./docker.md)| 8 | |URL|[:white_check_mark:](./url.md)| 9 | -------------------------------------------------------------------------------- /web/jsy/docker.md: -------------------------------------------------------------------------------- 1 | # :question: Docker 2 | 3 | #### reference 4 | https://www.docker.com/resources/what-container#/package_software
5 | https://rat2.tistory.com/47
6 | https://corona-world.tistory.com/15 7 |
8 | 9 | ## Question 10 | 1. 도커와 가상머신(VM)의 차이점에 대해 설명해주세요 11 | - 도커와 가상머신은 하드웨어 안에 격리된 환경을 구성하여 어플리케이션을 배치하는 방법입니다. 12 | - 도커 컨테이너는 모든 컨테이너가 호스트 OS의 Kernel을 공유하고, 어플리케이션을 실행할 때 호스트 OS 위에 어플리케이션의 실행 패키지인 이미지만 배포하면 되므로 VM보다 더 가볍습니다. 13 | - 반면 VM은 어플리케이션을 실행하기 위해서 VM을 띄우고 하드웨어의 자원을 할당한 다음, 게스트 OS(VM이 가지고 있는 OS 복사본)를 부팅하므로 훨씬 복잡하고 무겁게 실행해야 합니다. 14 |
15 | 16 | ## :nerd_face: What I study 17 | 18 | ### 0. 가상화 기술이 나오기 전 19 | - 하나의 서버를 하나의 용도로만 사용함 20 | - 남는 서버 공간을 그대로 방치함 21 | - 하나의 서버에 하나의 운영체제, 하나의 프로그램만을 운영함 22 | - 안정적이지만 비효율적이라는 단점이 있었음 23 | 24 |

25 | 26 | ![VM](https://www.docker.com/sites/default/files/d8/2018-11/docker-containerized-and-vm-transparent-bg.png) 27 | 28 |
29 | 30 | ### 1. Virtual Machine 31 | - ***하이퍼바이저 기반***의 가상화 출현 32 | - 호스트 머신에서 다수의 OS를 동시에 실행할 수 있게 해주는 소프트웨어 33 | - 호스트 OS를 필요로 하지 않는 타입의 가상화 방식 34 | - 소프트웨어를 물리적인 하드웨어 자원 위에 직접 동작하게 함으로써 하이퍼바이저 소프트웨어 위에서 개별로 가상머신을 동작하게 함 35 | 36 | - ***Physical hardware 추상화*** 37 | - 하나의 서버를 여러 서버로 나눠놓은 물리적인 하드웨어의 추상화 38 | - **하이퍼바이저**를 통해, 단일 머신에서 논리적으로 공간을 분할하여 VM이라는 여러 개의 독립적인 가상 환경의 서버를 실행할 수 있음 39 | - 각 VM마다 독립된 가상 하드웨어의 지원을 할당받음 40 | - 각 VM은 OS 복사본과 애플리케이션 및 기타 필요한 바이너리 파일들과 라이브러리들을 전부 포함하고 있음 41 | - 논리적으로 분리되어 있어 도커 컨테이너에 비해 더 높은 격리 수준을 제공함 42 | - 다양한 OS를 가상화할 수 있고 사용이 간편함 43 | - 한 VM에서 오류가 발생해도 다른 VM에 영향을 끼치지 않음 44 | - 각 VM마다 용량이 크고, 부팅하는데 더 많은 시간이 소요됨 45 | 46 |

47 | 48 | ### 2. Docker 49 | - ***컨테이너 기반***의 가상화 출현 50 | - 호스트 OS 위의 Application Layer에서 각각 Application 형태로 동작함 51 | - 각각의 Application을 컨테이너라고 한다 52 | - 각각의 컨테이너(Application)은 OS Kernel을 공유하여 동작함 53 | - 그러나, 하나의 컨테이너 내에서 설정한 환경변수는 다른 컨테이너에 동일하게 적용되지 않음 54 | 55 | - ***Application Layer에서 종속되는 패키지 코드를 추상화*** 56 | - 즉, 호스트 OS 위에서 docker가 동작하여 여러개의 Application 형태로 동작함 57 | - code와 dependencies를 묶어서 Application Layger 형태로 추상화 58 | - 여러 컨테이너가 동일한 머신에서 실행됨 + 유저스페이스에서 각자 격리된 프로세스로 실행되고 OS Kernel은 다른 컨테이너와 공유함 59 | - 호스트 입장에서 보면 하나의 프로세스로 동작, 유저 입장에선 호스트와 무관하게 동작하는 VM처럼 보여서 '컨테이너 가상화'기술로도 불림 60 | - OS Kernel을 공유하기 때문에 VM보다 적은 용량을 사용하며, 더 많은 어플리케이션을 다룰 수 있음 -------------------------------------------------------------------------------- /web/jsy/git.md: -------------------------------------------------------------------------------- 1 | # :question: GIT 2 | 3 | #### reference 4 | https://escapefromcoding.tistory.com/281
5 | https://codevang.tistory.com/217 6 |
7 | 8 | ## Question 9 | 1. Git을 쓰는 이유는 무엇인지, Git과 GitHub의 차이점에 대해 설명해주세요 10 | - Git을 사용하는 이유는 로컬저장소를 이용한 빠른 퍼포먼스와 브랜치를 통한 효율적인 협업을 하기 위함입니다. 11 | - Git은 클라우드가 아닌 로컬 시스템에 설치되어 코드와 이력을 기록하고 관리하도록 돕는 버전관리 시스템이라면, GitHub는 클라우드 기반으로 Git 저장소를 관리해주는 호스팅 서비스입니다. 그래서 GitHub는 개인의 Git 저장소에 원격으로 접근이 가능하다는 차이점을 가지고 있습니다. 12 |
13 | 14 | ## :nerd_face: What I study 15 | 16 | ![vs](https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqwWj3%2FbtqCckCDdUD%2FLVMvU0EOrwQhLF6owuA88k%2Fimg.png) 17 | 18 | ### 1. Git 19 | - 코드와 그 이력을 기록하고 관리하도록 돕는 **버전관리 시스템** 20 | - 클라우드가 아닌 **로컬 시스템에 설치**되고 관리된다. 21 | - 속도가 빠르고 로컬에 부담없이 커밋할 수 있다. 22 | - 원격저장소가 터지더라도 로컬저장소를 통해 복구가 가능하다. 23 | - 진행하는 프로그래밍 버전 기록을 스스로 관리할 수 있다. 24 | - 사용자는 본인의 코드에서 또 다른 독립적인 로컬 브랜치를 만들 수 있다. 25 | - 브랜치를 만든 후 작업하고, 이전 브랜치로 다시 복구하고 쉽게 삭제, 병합이 가능하다. 26 | - 다른 개발자가 실시간으로 작업하는 내용을 알 수 없다. 27 | - 팀원들이 프로젝트의 같은 부분을 수정해도 서로의 작업을 확인할 수 없으므로, conflict가 날 가능성이 있다. 28 | 29 |
30 | 31 | ### 2. Github 32 | - Git 저장소를 관리하는 **클라우드 기반** 호스팅 서비스 33 | - 개인의 로컬 서버 밖에서 Git 버전 프로젝트를 공유하고 기록하는 온라인 데이터베이스 34 | - 자체 구축이 아닌 빌려쓰는 클라우드 개념을 사용한다. 35 | - **클라우드 기반이기 때문에, 개인의 Git 저장소에 원격으로 접근이 가능하다.** 36 | - 다른 개발자와 코드 공유가 가능하다. 37 | - 실시간으로 하나의 프로젝트에 전체 팀원이 함께 협력할 수 있다. 38 | - 만약 개개인이 브랜치를 push/pull 하지 않는다면 다른 사용자 저장소의 중심 디렉토리에 반영되지 않는다. -------------------------------------------------------------------------------- /web/jsy/url.md: -------------------------------------------------------------------------------- 1 | # :question: URL 2 | 3 | #### reference 4 | https://hanamon.kr/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EA%B8%B0%EB%B3%B8-url-uri-urn-%EC%B0%A8%EC%9D%B4%EC%A0%90/
5 | https://ssungkang.tistory.com/entry/WEB-URI-vs-URL-vs-URN-%EB%B9%84%EA%B5%90-%EB%B6%84%EC%84%9D
6 | https://velog.io/@inyong_pang/URI-URL-URN-5gk5pz1o4s 7 |
8 | 9 | ## Question 10 | 1. URI, URL, URN이란? 11 | - **URL**은 **자원을 어떻게 얻을 것이고 어디에서 가져와야하는지 명시**하는 문자열이고, **URN**은 자원을 어떻게 접근할 것인지 명시하는 것이 아니라 **자원 자체를 특정하는** 문자열이다. 12 | - **URI**는 URL과 URN을 포함하는 개념으로, 자원을 가리키는 유일한 주소이다. 13 | 14 |
15 | 16 | ## :nerd_face: What I study 17 | 18 | ![diagram](https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcsPw40%2FbtqLkgwQyPh%2Fnm67jkkVSEPF5kT9gRwyy0%2Fimg.png) 19 | 20 |
21 | 22 | ![diff](https://i.stack.imgur.com/2iD7U.jpg) 23 | 24 | ### 1. URI 25 | 26 | ``` 27 | https://github.com/jjuyeon/Tech-Interview-Study/issues/78 28 | ``` 29 | 30 | - Uniform Resource Identifier (통합 자원 식별자) 31 | - 하나의 자원을 가리키는 유일한 주소 32 | - 자원: HTTP에서 요청한 대상 33 | - 자원을 고유하게 식별하고 위치를 지정할 수 있다. 34 | - URL과 URN을 포함하는 개념 35 | 36 |
37 | 38 | ### 2. URL 39 | 40 | ``` 41 | https://www.website.com/foldername/folderfile.pdf 42 | 43 | http://img.naver.net/static/www/dl_qr_naver.png - 네이버 앱QR코드의 이미지에 대한 URL 44 | ``` 45 | 46 | - Uniform Resource Locator (통합 자원 지시자) 47 | - 자원의 location을 나타내는데 사용된다. 48 | - web에서 자원이 어디 있고 어떻게 접근할 수 있는지에 대한 구체적인 위치를 나타낸다. 49 | - 우리가 아는 일반적인 웹 주소 형식 50 | - **요즘 대부분의 URI는 URL이다.** 51 | - Web Server(ex. Apache, Nginx)가 rewrite기술로 인해, URL을 단순히 특정 파일의 위치를 나타내는 것보다 자원 식별자(URI)로서 사용되고 있다. 52 | 53 |
54 | 55 | ### 3. URN 56 | 57 | ``` 58 | urn:isbn:0451450523 - URN으로 1926년에 출간된 the Last Unicorn의 도서식별번호 59 | 60 | urn:oid:2.16.840 - URN으로 미국을 의미하는 OID이다 61 | ``` 62 | 63 | - Uniform Resource Name (통합 자원 이름) 64 | - 자원의 name을 나타내는데 사용된다. 65 | - 자원의 위치에 영향을 받지 않는 유일무이한 이름을 나타낸다. 66 | - 자원을 어느 곳으로 옮기더라도 문제없이 동작한다. 67 | - 자원의 이름이 변하지 않는 한, 여러 종류의 네트워크 접속 프로토콜(ex. http, https)로 접근해도 문제가 없다. 68 | - 무엇인지를 말하는 What의 개념으로 서로 중복되지 않는 유일한 값이어야한다. 69 | - 하나의 자원에는 절대로 겹치는 urn이 있으면 안된다. (불변, 유일) 70 | - 실제 자원을 찾기 위해서 urn을 url로 변환하여 이용한다. 71 | - 아직 널리 채택되지 않았다! 72 | -------------------------------------------------------------------------------- /web/jsy/web.md: -------------------------------------------------------------------------------- 1 | # :question: DAO, DTO, VO 2 | 3 | #### reference 4 | http://melonicedlatte.com/2021/07/24/231500.html 5 |
6 | 7 | ## Question 8 | 1. DAO, DTO, VO에 대해 설명해보세요. 9 | - DAO는 데이터베이스의 데이터에 접근하기 위한 객체입니다. DTO는 로직을 가지지 않고 순수하게 계층 간 데이터 교환을 하기 위해 사용하는 객체입니다. VO는 값을 위해 사용되는 객체로 오직 읽는 것만 가능합니다. 10 | 11 |
12 | 13 | ## :nerd_face: What I study 14 | 15 | ### 1. DAO (Data Access Object) 16 | - 데이터베이스의 data에 접근하기 위한 객체 17 | - 데이터베이스에 접근하기 위한 비즈니스 로직을 분리하기 위해 사용한다. 18 | - 데이터베이스에 접근하여 데이터를 CRUD 할 수 있는 기능을 수행한다. 19 | - MVC 패턴의 Model 부분을 의미한다. 20 | 21 |
22 | 23 | ### 2. DTO (Data Transfer Object) 24 | - 계층 간(Controller, View, Business Layer) 데이터 교환을 하기 위해 사용하는 객체 25 | - 로직을 가지지 않는 순수한 데이터 객체 26 | - getter, setter만을 가진 클래스 27 | 28 |
29 | 30 | ### 3. VO (Value Object) 31 | - 값을 위해 사용되는 객체 32 | - 사용하는 도중에 변경이 불가능하며, 오직 읽는 것만 가능하다. (read-only) 33 | 34 | |DTO|VO| 35 | |:---:|:---:| 36 | |가변|불변| 37 | |getter/setter|getter| 38 | |인스턴스의 개념|리터럴의 개념| -------------------------------------------------------------------------------- /web/kkw/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjuyeon/Tech-Interview-Study/f5f4978becafb443db02eee145e58f6a1618dfa2/web/kkw/README.md -------------------------------------------------------------------------------- /web/yij/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjuyeon/Tech-Interview-Study/f5f4978becafb443db02eee145e58f6a1618dfa2/web/yij/.DS_Store -------------------------------------------------------------------------------- /web/yij/Kubernetes 6f1cb1afc6504263b9e637904d8198f5.md: -------------------------------------------------------------------------------- 1 | # Kubernetes 2 | 3 | 👇 쿠버네티스 공식 블로그 4 | 5 | [운영 수준의 컨테이너 오케스트레이션](https://kubernetes.io/ko/) 6 | 7 | # Deployment Environment 8 | 9 | 컨테이너화 된 워크로드와 서비스를 관리하기 위한 오픈소스 플랫폼으로, 이식성과 확장가능성이 뛰어나다. 선언적 구성과 자동화를 용이하게 만들어 준다. 10 | 11 | ![container_evolution.svg](Kubernetes%206f1cb1afc6504263b9e637904d8198f5/container_evolution.svg) 12 | 13 | ## Traditional Deployment 14 | 15 | 애플리케이션을 물리 서버에서 실행 했던 시기 16 | 17 | 한 물리 서버에서 여러 애플리케이션의 리소스 한계를 정의할 방법이 존재하지 않아 할당 문제가 발생했다. 18 | 19 | 물리 서버 하나에서 여러 애플리케이션을 실행하면, 리소스 대부분을 차지하는 애플리케이션 인스턴스가 있을 경우 다른 애플리케이션의 실행 성능이 저하된다. 20 | 21 | 이를 위해 서로 다른 여러개의 물리 서버에서 각각의 애플리케이션을 실행하는 방법이 있지만 물리 서버를 많이 유지하기 위해 많은 비용을 필요로 한다. 22 | 23 | ## Virtualized Deployment 24 | 25 | 단일 물리 서버의 CPU에서 여러 가상 시스템(VM)을 실행할 수 있게 한다. 26 | 27 | 가상화를 사용하면 1️⃣ VM간에 애플리케이션을 격리하고 2️⃣ 애플리케이션의 정보를 다른 애플리케이션에서 자유롭게 액세스할 수 없으므로, 3️⃣ 일정 수준의 보안성을 제공할 수 있다. 28 | 29 | 물리 서버보다 리소스를 효율적으로 활용할 수 있으면서, 쉽게 애플리케이션을 추가/수정할 수 있다. 하드웨어 비용의 절감으로 인해 확장성이 크게 증가했으며, 일련의 물리 리소스를 폐기 가능한 가상 머신으로 구성된 클러스터로 만들 수 있다. 30 | 31 | 각 VM은 가상화된 하드웨어 상에서 자체 OS를 포함한 모든 구성 요소를 실행하는 하나의 완전한 머신이다. 32 | 33 | ## Container Deployment 34 | 35 | 컨테이너는 VM과 유사하지만 격리 속성을 완화하여 **애플리케이션 간에 운영체제(OS)를 공유**한다. 36 | 37 | 그러므로 매우 가볍게 동작하며 VM과 마찬가지로 컨테이너는 자체 파일시스템, CPU 점유율, 메모리, 프로세스 공간을 가진다. 기본 인프라와의 종속성이 없기 때문에 클라우드나 OS 배포본에 모두 이식 가능하다. 38 | 39 | - VM이미지보다 쉽고 효율적인 컨테이너 이미지 생성 40 | - 지속적 개발, 통합 및 배포 41 | - 개발과 운영의 관심사 분리 42 | - 애플리케이션 간의 리소스 격리 43 | - OS 수준 정보와 메트릭 뿐 아니라 애플리케이션의 헬스 및 시그널 관측 가능 44 | 45 | # Kubernetes 46 | 47 | [[Kubernetes Service] 클라우드 시장의 대세, 쿠버네티스란 무엇인가?](https://www.youtube.com/watch?v=JNc11rxLtmE) 48 | 49 | 컨테이너는 애플리케이션을 포장하고 실행하는 방법이다. 50 | 51 | 프로덕션 환경에서는 애플리케이션이 실행중인 컨테이너들을 관리하고, 가동 중지 시간을 확인해야 한다. 예를 들어, 하나의 컨테이너가 다운되면 다른 컨테이너를 다시 시작해야 한다. 52 | 53 | 쿠버네티스는 **분산 시스템을 탄력적으로 실행하기 위한 프레임 워크**를 제공하여 시스템이 이러한 행위를 처리하도록 도와준다. 54 | 55 | 애플리케이션의 확장과 장애 조치를 처리하고, 배포 패턴과 같은 서비스 들을 다음과 같이 제공한다. 56 | 57 | ### 서비스 디스커버리와 로드 밸런싱 58 | 59 | DNS 이름을 사용하거나 자체 IP 주소를 사용하여 컨테이너를 노출할 수 있다. 60 | 61 | 컨테이너에 대한 트래픽이 많으면 쿠버네티스는 **네트워크 트래픽을 로드밸런싱하고 배포**하여 안정적인 배포를 돕는다. 62 | 63 | ### 스토리지 오케스트레이션 64 | 65 | 로컬 저장소, 공용 클라우드 공급자와 같이 원하는 저장소 시스템을 자동으로 탑재할 수 있다. 66 | 67 | ### 자동화된 롤아웃과 롤백 68 | 69 | 배포된 컨테이너의 원하는 상태를 서술할 수 있으며, 현재 상태를 원하는 상태로 설정한 속도에 따라 변경할 수 있다. 70 | 71 | 예를 들어 쿠버네티스를 자동화해서 배포용 새 컨테이너를 만들고, 기존 컨테이너를 제거하고, 모든 리소스를 새 컨테이너에 적용할 수 있다. 72 | 73 | ### 자동화된 빈 패킹(bin packing) 74 | 75 | 컨테이너화된 작업을 실행하는 데 사용할 수 있는 쿠버네티스 클러스터 노드를 제공한다. 각 컨테이너가 필요로 하는 CPU와 메모리(RAM)를 쿠버네티스에게 지시한다. 쿠버네티스는 컨테이너를 노드에 맞추어 리소스를 잘 사용할 수 있도록 해준다. 76 | 77 | ### 자동화된 복구(self-healing) 78 | 79 | 실패한 컨테이너를 다시 시작하고, 컨테이너를 교체하며, 사용자 정의 상태 검사에 응답하지 않는 컨테이너를 죽이고, 서비스 준비가 끝날 때 까지 이를 캡슐화 하여 표시하지 않는다. 80 | 81 | ### 시크릿과 구성 관리 82 | 83 | 암호, OAuth 토큰 및 SSH 키와 같은 중요한 정보를 저장하고 관리할 수 있다. 컨테이너 이미지를 재구성하거나 시크릿을 노출하지 않고도 시크릿 및 애플리케이션 구성을 배포하고 업데이트할 수 있다. 84 | 85 | ## Not Kubernetes 86 | 87 | - PaaS(Platform as a Service)가 아니다. 88 | - 지원하는 애플리케이션 유형을 제약하지 않는다. 89 | - 소스 코드를 배포하지 않고, 애플리케이션을 빌드하지 않는다. 90 | - 애플리케이션 레벨 서비스를 제공하지 않는다. 91 | - 단순한 오케스트레이션 시스템이 아니다. 92 | - 기존의 것의 기술적인 정의는 A→B→C 와 같이 정해진 워크플로우를 수행하는 것이다. 93 | - 쿠버네티스는 독립적이고 조합 가능한 제어 프로세스들로 구성되어 있다. 94 | - 중앙화된 제어 없이 **지속적으로 현재 상태를 입력받은 의도한 상태로 나아가도록** 한다. 95 | 96 | 97 | 쿠버네티스를 사용하면 쉽게 사용할 수 있고, 강력하고, 견고하고, 회복력을 갖췄으며, 확장하기 용이한 시스템을 구성할 수 있다. 98 | 99 | # Kubernetes Component 100 | 101 | ![Untitled](Kubernetes%206f1cb1afc6504263b9e637904d8198f5/Untitled.png) 102 | 103 | 쿠버네티스를 배포하면 **클러스터**를 얻는다 104 | 105 | 클러스터는 컨테이너화 된 애플리케이션을 실행하는 **노드**라고 하는 워커 머신의 집합이며, 모든 클러스터는 최소 한 개의 워커 노드를 가진다. 106 | 107 | 워커 노드는 애플리케이션의 구성 요소인 파드를 호스트한다. 108 | 109 | 컨트롤 플레인은 워커 노드와 클러스트 내 파드를 관리한다. 110 | 111 | 프로덕션 환경에서는 일반적으로 컨트롤 플레인이 여러 컴퓨터에 걸쳐 실행되고, 클러스터는 일반적으로 여러 노드를 실행하므로 내결함성과 고가용성이 제공된다. 112 | 113 | - 노드: 쿠버네티스의 작업 장비 114 | - 파드: 쿠버네티스에서 실행 중인 컨테이너의 집합 115 | - 컨트롤 플레인: 라이프사이클을 정의, 배포, 관리하기 위한 API와 인터페이스를 노출하는 컨테이너 오케스트레이션 레이어 -------------------------------------------------------------------------------- /web/yij/Kubernetes 6f1cb1afc6504263b9e637904d8198f5/Untitled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjuyeon/Tech-Interview-Study/f5f4978becafb443db02eee145e58f6a1618dfa2/web/yij/Kubernetes 6f1cb1afc6504263b9e637904d8198f5/Untitled.png -------------------------------------------------------------------------------- /web/yij/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjuyeon/Tech-Interview-Study/f5f4978becafb443db02eee145e58f6a1618dfa2/web/yij/README.md --------------------------------------------------------------------------------