해시(Hash) Abstract 데이터를 효율적으로 관리하기 위해, 임의의 길이 데이터(input)을 고정된 길이의 데이터(key)로 매핑하는 것 해시 함수를 구현하여 데이터를 해시 값으로 매핑 사용 이유 적은 자원으로 많은 데이터를 효율적으로 관리 하기 위함 하드 디스트나 클라우드에 존재하는 무한한 데이터들을 유한한 개수의 해시값으로 매핑하면 적은 메모미로도 프로세스 관리가 가능해짐 input에 대해 언제나 동일한 Hash 값을 리턴, index를 알면 빠른 데이터 검색 이 가능해짐 검색시 해시 테이블의 시간 복잡도는 O(1) (이진탐색트리는 O(logN) 해시 충돌(Hash Collsion) 데이터가 많아지면, 다른 데이터에 대해 동일한 해시 값으로 충돌이 일어나는 현상(비둘기집 원리) 해시 충돌(H..
![](http://i1.daumcdn.net/thumb/C200x200/?fname=https://blog.kakaocdn.net/dn/bKXYuj/btroHbdyZ2w/tauT6JQ97aIkPL4Ivgnbv0/img.jpg)
이진 탐색 트리(Binary Search Tree, BST) 이진 탐색 과 연결 리스트 의 장점을 결합 Abstract 이진탐색 : 탐색에 소요되는 시간복잡도는 O(logN) 연결리스트 : 삽입, 삭제의 시간복잡도는 O(1), 탐색의 시간복잡도는 O(n) => 두가지를 합하여 장점을 모두 취하는 것이 이진탐색트리 => 효율적인 탐색을 하며, 자료의 삽입/삭제도 용이하게 하기 위함 특징 모든 노드의 자식은 2개 이하 모든 노드의 왼쪽 자식은 부모보다 작고, 오른쪽 자식은 부모보다 큼 중복된 노드가 없어야함 중복된 노드가 없어야 하는 이유 검색목적 자료구조인데, 굳이 중복이 많은 경우에 BST를 사용하여 검색속도를 느리게 할 필요가 없음 중복이 많다면 트리에 삽입하는 것보다, Count를 두어 처리하는 것이..
![](http://i1.daumcdn.net/thumb/C200x200/?fname=https://blog.kakaocdn.net/dn/bCYwkI/btroFW8sJp0/LGv9d1GeE1sKuE7ih3ULEk/img.jpg)
트리(Tree) Abstract Node 와 Edge 로 이루어진 자료구조 Cycle이 존재하지 않는다.(Cycle이 존재한다면 트리가 아니라 그래프) 모든 노드는 자료형으로 표현 가능 루트에서 어떤 노드로 가는 경로는 유일(오직 1개) 노드가 N개면 간선은 N-1개를 갖는다. 순회 방식 전위순회(Pre-Order) Parent -> Left child -> Right child 순으로 방문 1 ➡️ 2 ➡️ 4 ➡️ 8 ➡️ 9 ➡️ 5 ➡️ 10 ➡️ 11 ➡️ 3 ➡️ 6 ➡️ 13 ➡️ 7 ➡️ 14 중위순회(In-Order) Left Child -> Parent -> Right child 순으로 방문 8 ➡️ 4 ➡️ 9 ➡️ 2 ➡️ 10 ➡️ 5 ➡️ 11 ➡️ 1 ➡️ 6 ➡️ 13 ➡️ ..
![](http://i1.daumcdn.net/thumb/C200x200/?fname=https://blog.kakaocdn.net/dn/cEAqx0/btroJj3e2Re/IZ0hHDQndagrGb06hC9fD1/img.png)
힙(Heap) Abstract 우선순위 큐 를 위해 만들어진 자료구조 완전 이진 트리 의 일종(여러 값 중, 최댓값과 최솟값을 빠르게 찾아내도록 만들어진 자료구조) 반정렬 상태(느슨한 정렬상태) 힙트리는 중복허용, 이진 탐색 트리는 중복허용 X 우선순위 큐 우선순위 개념을 큐에 도입한 자료구조 큐의 데이터들이 우선순위를 가지고 있고, 우선순위가 높은 데이터가 먼저 나감 배열, 연결리스트, 힙으로 구현할 수 있는데 힙(heap)이 가장 효율적 완전 이진 트리 마지막 레벨을 제외한 모든 레벨이 완전히 채워져있는 트리 적합할 때 시뮬레이션 시스템, 작업 스케줄링, 수치해석 계산 힙의 종류 최대힙(Max Heap) 부모노드의 키 값이 자식 노드의 키 값보다 크거나 같은 완전이진트리 최소힙(Min Heap) 부모..
![](http://i1.daumcdn.net/thumb/C200x200/?fname=https://blog.kakaocdn.net/dn/6WRwB/btroEArCVF5/5NujyOfDKiCQHWosFeWuI0/img.jpg)
연결리스트(Linked List) Abstract 불연속적인 메모리 위에 저장되는 선형 데이터 구조(배열은 메모리 공간이 연속적) 포인터를 사용해서 연결. 각 node는 데이터 필드 와 다음 노드에 대한 참조 를 포함하는 노드 로 구성 Linked List를 사용하는 이유 배열도 비슷한 유형의 선형 데이터를 저장하는데 사용할 수 있찌만 제한사항이 존재 크기만큼 정적으로 메모리 공간을 연속적으로 할당 연속적으로 할당하기때문에, 사용하지 않는 공간이 있더라고 그 공간을 다른 용도로 쓰지 못함 =>메모리 낭비가 클 수 있음 배열의 크기는 고정되어 있기 때문에 미리 그 수를 할당받아야함(정적) 크기를 초과할시 새로운 요소를 삽입하는 비용이 많이듦 -> 공간을 만들고, 기존 요소를 전부 이동 장점 동적 크기 삽입..
![](http://i1.daumcdn.net/thumb/C200x200/?fname=https://blog.kakaocdn.net/dn/rNFtI/btroJ2zSgWC/jVVz1uKLnOH6KENJdKz35K/img.jpg)
큐(Queue) Abstract FIFO(선입선출) : 가장 먼저 들어온 것이 가장 먼저 나옴 입력과 출력을 한 쪽 끝으로 제한 Front -> 큐의 가장 첫원소, Rare -> 큐의 가장 마지막 원소 들어올 때는 rare로 들어오지만, 나올 때는 front부터 빠지는 특성 가장 첫 원소와 가장 마지막 원소로만 접근 가능 적합할 때 Buffer, BFS, ... 원형 큐 논리적으로 배열의 처음과 끝이 연결되어 있는 것으로 간주하는 큐 우선순위 큐 우선순위의 개념을 큐에 도입한 자료구조 큐의 데이터들이 우선 순위를 가지고 있고, 우선 순위가 높은 데이터가 먼저 나감 배열, 연결리스트, 힙으로 구현할 수 있는데 힙(heap)으로 구현하는것이 가장 효율적
![](http://i1.daumcdn.net/thumb/C200x200/?fname=https://blog.kakaocdn.net/dn/c99acx/btroKxTWqtf/4kSyW09LHlST5Ol9Me9gok/img.jpg)
스택(Stack) Abstract LIFO(후입선출) : 가장 나중에 들어온것이 가장 먼저 나옴 연산 : 삽입(push), 삭제(pop), 비어있는지 확인(isEmpty), 꽉 차 있는지 확인(isFull), SP(Stack Pointer, 스택의 가장 마지막원소를 가리킴) 적합할 때 함수의 콜스택, 문자열 역순 출력, 연산자 후위 표기법 연산자 후위 처리 e.g.) A+B*C 중위 표기식를 순차적으로 탐색하며 연산자는 스택에 넣고, 피연산자는 후위 표기식으로 넘긴다 피연산자를 모두 후위 표기식으로 넘겼다면 스택에서 연산자를 차례대로(위에서부터) pop한다. 참고한 곳 https://velog.io/@inyong_pang/12%EA%B0%95-%EC%8A%A4%ED%83%9D%EC%9D%98-%EC%9D..
(no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator) Jackson을 사용해서 JSON을 파싱하는데 아래와 같은 에러 메시지가 떴고, 이를 해결하기 위한 방안이다. 2021-10-12 02:19:05.038 ERROR 11654 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing fa..
결과 조회 쿼리 객체에서 아래의 메서드들을 사용해 JPQL을 실행한다. query.getResultList()결과를 컬렉션으로 반환한다. 결과가 없으면 빈 컬렉션이 반환된다. 1건이면 1건만 들어간 컬렉션(List)이 반환된다. query.getSingleResult()결과가 정확히 1건 일때 사용한다. ➡️ 단일 결과가 보장 될 때만 사용 결과가 없으면 javax.persistence.NoResultException, 결과가 1건 이상이면 javax.persistence.NonUniqueResultException이 발생 출처
![](http://i1.daumcdn.net/thumb/C200x200/?fname=https://blog.kakaocdn.net/dn/brW4jX/btrgvqX2EyV/so713BSAzx6dDt32HNh7R1/img.png)
클라우드(Cloud)와 MSA(MicroService Architecture)는 최근 IT 업계에서 중요한 이슈이다. 하이브리드 클라우드는 왜 인기 있을까? 2006년 AWS가 상업용 클라우드 컴퓨팅 서비스를 출시한 이후로 클라우드는 피할 수 없는 대세가 됐다. IT 시장조사기관 가트너는 2020년 전 세계 클라우드 시장 규모를 2579억 달러로 추정했다. 이는 서버 시장의 규모(240억 달러)를 10배 이상 추월한 숫자다. 더욱이 향후 몇 년간 20% 가까운 성장률을 예상한다고 하니 그 규모는 더 빠르게 커질 것이다. 이 차이는 어찌 보면 당연하다. 서버는 단순히 고객에게 물리적인 하드웨어를 파는 것인데 반해 클라우드는 서버 외에도 오브젝트 스토리지, 관리형 DBMS(데이터베이스관리시스템), 애플리케이..
![](http://i1.daumcdn.net/thumb/C200x200/?fname=https://blog.kakaocdn.net/dn/EmAy2/btrgxZ5i3UA/H8oJ7i474BoM2NAk8KUfm1/img.png)
개발 -> 빌드 -> 테스트 -> 배포 개발 부터 배포까지는 보통 위의 과정을 거치게된다. 하지만 만약 위 과정을 모두 수작업으로 처리한다면 여러가지 불편한 점이 있을 것이다. 코드 작업부터 배포까지 과정에서 중간중간에 일일히 오류를 수정하고 다시 빌드하고 테스트하는 것은 큰 시간과 체력소모를 하게된다. 큰 규모의 프로젝트일수록 이러한 작업은 피로도를 높일 것이다. 기존 과정의 문제점 1. 수동화 된 작업 : 빌드 오류, 배포가 잘 진행되고 있는지, 신규 버전에서 오류가 발생하는지 등 상황을 확인하면서 이후 작업을 수작업으로 진행하면, 모두가 피곤할 것이다. 2. 작업의 누락 : 장애가 발생하지 않으면 누락 사실을 인지하기 어려운 작업을 놓칠 가능성이 존재한다. 3. 기능 추가 및 변경의 부담 : 기존 ..