전체 글 235

Executable Jar

👣 개요 Spring Boot에는 Executable Jar라는 개념이 존재하여 Web Application Project 빌드 결과물이 War이 아니라 Jar를 될 수 있다. 이는 Gradle or Maven으로 빌드를 한 결과물로 바로 서버를 가동시킬 수 있다. 이로서 외부 웹 서버에 의존하지 않고 내장된 웹 서버로 실행 가능하다는 장점이 있다. 👣 War 배포 과정 1. War 파일 생성. - Gradle 기준 - build.gradle에 war 플러그인 추가. plugins { id 'war' } ... - Gradle 명령어로 War 빌드 gradle build 2. Tomcat에 War 파일 배포 - Tomcat 내부의 /webapps 디렉토리에 War 파일를 위치시킴. Tomcat/ ├── ..

Spring Boot 2023.07.28

application.yml 프로퍼티

👣 개요 예를 들어, Spring Boot로 애플리케이션을 구축하고 실제 배포를 할 때, 포트 번호를 8080에서 80을 변경해야 하는 순간이 온다. 만약 포트 번호를 Java 코드를 통해 하드 코딩을 하면 코드 담당자 이외의 개발자는 포트 번호를 바꾸기 위해 해당 코드를 읽고 수정해야 하는데 이는 매우 비효율적이고 유지보수에 불리하다. 때문에 이러한 설정값들은 하드 코딩하지 않고 Yaml 파일 등에 기입하고 사용하게 된다. 만약 Spring Boot에 이런 설정 파일을 Parsing하는 기능이 존재하지 않았다면 직접 파일을 불러와서 Json 규칙에 따라 파싱을 진행해야 하지만 다행히도 그런 기능이 존재하기 때문에 개발자는 Yaml 파일을 작성하고 일련의 규칙을 따르기만 하면 설정값을 Java 객체에 담..

Spring Boot 2023.07.27

Spring Boot 버전 관리 원리

👣 개요 Spring Boot의 장점 중 하나로 꼽히는 특징은 '자동 버전 관리'다. Spring Framework에는 애플리케이션을 만들기 위해 여러 라이브러리들을 사용하게 된다. 예를 들어, Flyway를 이용해 DB 마이그레이션 등등의 기능을 구성하고 성능 향상을 위한 캐싱 DB로 Redis를 사용하기도 한다. 간단히 해당 라이브러리를 다운받고 사용하면 쉬울 것 같지만 사용하고 있는 Spring Framework의 버전이 다운 받은 라이브러리와 호환이 되지 않아 호환되는 버전을 찾고 적용하는 일을 수행해야 한다. 이는 비즈니스 코드와는 동떨어진 작업이고 시간, 에너지가 다소 무의미하게 소비되는 작업이다. Spring Boot에서는 이런 Dependency들의 호환되는 버전을 미리 확인하고 이를 관리..

Spring Boot 2023.07.27

Spring Boot 자동 설정 원리

👣 개요 Spring Boot는 Spring Framework에 비해 비즈니스 코드에만 집중하기 쉬운데 그 이유 중 하나가 'Auto Configuration 기능'이다. 예를 들어, Spring에서 Tomcat 관련 설정을 하지 않으면 오류가 발생하는데 Spring Boot는 이미 관련 기본 설정을 미리 하기 때문에 Tomcat 설정을 하지 않고도 Tomcat을 구동시킬 수 있을 뿐더러 원한다면 맘대로 커스터마이징을 할 수 있다. 해당 게시물은 어찌하여 Spring Boot에서는 위와 같이 기본 설정을 해줄 수 있고 어찌 커스터마이징 하는지 작성하고자 한다. 👣 Spring Boot의 Bean 수집 방법 Spring Boot에는 서버를 구동시키기 위한 Application.java 파일이 필요하고 해당..

Spring Boot 2023.07.27

B-tree

B-tree 역시 'AVL 트리'와 '레드 블랙 트리'와 같이 Balanced Tree이다. 다만 균형 이진 탐색 트리는 아니다. B-tree는 앞서 살펴봤던 트리들과는 달리 Node당 1 개 이상의 데이터가 포함된다. Node 안은 여러 개의 Key로 이뤄져 있다. 그리고 B-tree는 차수라는 속성을 가지고 있다. 이는 한 Node의 최대 자식 Node 갯수를 의미한다. B-tree는 높이를 최소화하기 위해 노드의 분할과 병합을 수행한다. 주로 DB의 인덱스를 구현하기 위해 사용되는 자료 구조다. 👣 B-tree 조건 1. node의 key의 수가 k개라면, 자식 node의 수는 k+1개이다. ["Key 갯수" + 1 = "자식 Node 수"] 2. node의 key는 오름차순으로 정렬된 상태여야 한..

Hash Table

(Key, Value) 로 데이터를 저장하는 자료 구조. 해시 함수에 Key 값을 입력하면 Value를 저장할 메모리의 Index가 결과값으로 도출된다. 실제 값이 저장되는 장소를 버킷 또는 슬롯이라고 한다. 랜덤 탐색, 삽입, 삭제 모두 O(1)라는 성능을 보여준다는 장점이 있지만, 순차 탐색이 불가능하고 해시 함수에 따라 성능이 좌지우지 된다. 최악의 경우 연결 리스트와 다를 바가 없어진다. Random Read Sequential Read Insert Delete 시간 복잡도 O(1) X O(1) O(1) 해시 충돌 제아무리 해시 함수를 잘 구축해도 해시 함수 결과값이 중복될 수 있다. 이 경우, 2 가지 방법으로 해결 가능하다. 1. 분리 연결법(Separate Chaining) 단순하게 연결 리..

Heap

완전 이진 트리의 자료 구조. 이진 탐색 트리는 아니다. 최소힙과 최대힙으로 나뉠 수 있다. 해당 트리는 최소값, 최대값을 찾기에 특화되어 있는 자료 구조다. 최소값과 최대값은 각각 최소힙과 최대힙의 루트 노드다. 최대힙의 법칙 힙의 모든 부모 노드는 자식 노드보다 크다. 최대힙의 삽입 1. 새로운 노드를 마지막에 삽입. 2. 새로운 노드를 부모 노드와 비교하며 최대힙의 법칙을 위반하면 Swap 한다. 3. 위 과정이 안정화가 될 때까지 재귀적으로 반복한다. 최대힙의 삭제 1. 루트 노드를 삭제. 2. 마지막 노드를 루트 노드에 위치시킴. 3. 루트 노드를 자식 노드와 비교하며 최대힙의 법칙을 위반하면 Swap 한다. 단, Swap 대상은 자식 노드 중 가장 큰 노드이다. 4. 위 과정이 안정화가 될 때..

레드 블랙 트리

균형 이진 탐색 트리를 위해 고안된 자료 구조. 각 노드는 빨간색, 검은색 색상을 나타내는 추가 비트를 저장하며, 삽입, 삭제 중에 균형을 유지하기 위해 사용된다. 레드 블랙 트리 규칙 1. 모든 리프 노드와 루트 노드는 블랙이다. 2. 모든 레드 노드의 자식 노드는 블랙이다. 3. 모든 리프 노드의 Black Dept는 같은 값이다. 레드 블랙 트리 삽입 1. 항상 모든 새로운 삽입은 레드 노드로 삽입한다. 2. 조부모 노드를 G, 부모 노드를 P, 삼촌 노드(조부모 노드 중 부모 노드가 아닌 것)은 U, 새로 삽입된 노드를 N이라고 칭한다. 이 때, U가 블랙이면 Restructuring을 수행, U가 레드라면 Recoloring을 수행. 3 - 1. Restructuring은 다음과 과정과 같다. ..

AVL 트리

이진 탐색 트리의 최악의 경우를 피하기 위해 스스로 균형있는 트리로 변형되는 이진 탐색 트리. AVL 트리는 모든 노드의 Balence Factor가 [-1, 0, 1]이어야 한다. Balance Factor 왼쪽 자식 노드가 루트 노드인 서브 쿼리의 최대 높이와 오른쪽 자식 노드가 루트 노드인 서브 쿼리의 최대 높이의 차이를 뜻하는 지표. BF = {왼쪽 자식 노드 최대 높이} - {오른쪽 자식 노드 최대 높이} Rotation 균형을 맞추기 위해 서브 쿼리의 부모 노드를 자식 노드로 수준을 낮추는 행위. 회전 방법은 다음과 같다. 1. Z의 부모 노드를 Y로 재설정. 2. 1번 과정에서의 떨어져 나간 서브 트리(T2)를 Z의 자식 노드로 재설정. Random Read Sequential Read In..

비선형 자료 알고리즘

👣 개요 자료 구조가 일렬로 나열된 형태의 구조가 아닌 Tree나 Graph와 같은 형태로 존재하는 것을 일컫음. 👣 그래프 정점과 간선으로 이뤄진 자료 구조. 👣 그래프 표현 방법 - 인접 행렬 i번째 노드와 j번째 노드가 연결되면 해당 간선의 가중치를 (i, j) 셀에 기입. 👣 그래프 표현 방법 - 인접 리스트 각 노드가 연결된 노드를 리스트로 표현 👣 트리 그래프의 일종으로 부모, 자식 계층의 구조를 가지고 있다. 그리고 간선 사이의 가중치가 없다. 오로지 연결 여부만 나타낼 뿐이다. 👣 이진 트리 트리의 일종으로 자식 노드 수가 2개 이하인 트리. Full 자식노드가 0 또는 2개인 이진 트리. 쉽게 말해서 1개 짜리 자식노드가 없다는 것. Complete 왼쪽부터 차곡차곡 채워진 트리. Deg..