반응형

전체 글 197

동적 계획법 (DP : Dynamic Programming)

동적 계획법은 복잡한 문제를 여러 개의 간단한 문제로 분리하여 부분의 문제들을 해결함으로써 최종적으로 복잡한 문제의 답을 구하는 방법을 뜻한다. 동적 계획법의 핵심 이론1. 큰 문제를 작은 문제로 나눌 수 있어야 한다.2. 작은 문제들이 반복돼 나타나고 사용되며 이 작은 문제들의 결괏값은 항상 같아야 한다.3. 모든 작은 문제들은 한 번만 계산해 DP 테이블에 저장하며 추후 재사용할 때는 이 DP 테이블을 사용한다. 이를 메모이제이션 기법이라고 한다.4. 동적 계획법은 탑-다운 방식과 바텀-업 방식으로 구현할 수 있다. 동적 계획법의 가장 대표적인 문제인 피보나치 수열의 예D[N] = D[N-1] + D[N-2]  동적 계획법 문제 풀이 과정동적 계획법으로 풀 수 있는지 확인하기점화식 세우기메모이제이션 ..

세그먼트 트리

주어진 데이터의 구간 합과 데이터 업데이트를 빠르게 수행하기 위해 고안해 낸 자료구조의 형태가 바로 세그먼트 트리이다. 세그먼트 트리의 핵심 이론세그먼트 트리의 종류는 구간 합 / 최대 & 최소 구하기로 나눌 수 있고,구현 단계는 (1) 트리 초기화하기, (2) 질의값 구하기 (구간합 또는 최대 & 최소), (3) 데이터 업데이트하기로 나눌 수 있습니다.  구현 단계1. 트리 초기화하기리프 노드의 개수가 데이터의 개수(N) 이상이 되도록 트리 배열을 만든다. 트리 배열의 크기를 구하는 방법은 2^k >= N 을 만족하는 k의 최솟값을 구한 후 2^k * 2 를 트리 배열의 크기로 정의하면 된다. 예를 들어, N = 8일 때 2^3 >= 8 이므로 k 는 3이 되고 트리 배열의 크기는 2^3 * 2 이므로..

QueryDSL 이란?

QueryDSL 이란SQL, JPQL 등을 코드로 작성할 수 있도록 해주는 빌더 오픈소스 프레임워크이다.사실, QueryDSL 이 JPA에서만 사용하는 프레임워크로만 알 수도 있지만 공식 사이트를 보면 JPA 뿐만 아니라 SQL, MongoDB, Lucenece 등 다양한 언어에 대해서 서비스를 제공한다. QueryDSL JPAQueryDSL JPA 는SQL, JPQL 을 코드로 작성할 수 있도록 해주는 빌더 API 이고,Entity 클래스와 매핑되는 QClass 라는 객체를 사용해서 쿼리를 실행한다.QClass 란?QueryDSL은 컴파일 단계에서 엔티티를 기반으로 QClass를 생성하는데 JPAAnnotationProcessor 가 컴파일 시점에 작동해서 @Entity 등의 어노테이션을 찾아 해당 파..

SpringBoot 2024.07.17

Spring WebSocket

Spring Framework는 WebSocket API를 제공한다.여기서 중요한 점은 Spring에서 제공하는 WebSocket API는 Spring MVC 기술에 종속되지 않는다는 것이다.WebSocket 서버는 WebSocketHandler 인터페이스의 구현체를 통해서, 각 경로에 대한 핸들러를 구현할 수 있다. 뿐만 아니라, Message 형식에 따라 TextWebSocketHandler 또는 BinaryWebSocketHandler 핸들러를 확장해 구현할 수도 있다.  Spring WebSocket 설정문자열 메시지 기반으로 테스트를 진행하기 때문에 TextWebSocketHandler를 상속받아 메시지를 전달받는다.public class Handler extends TextWebSocketHa..

SpringBoot 2024.07.16

최소 신장 트리 알고리즘

최소 신장 트리(MST) 란?그래프에서 모든 노드를 연결할 때 사용된 에지들의 가중치의 합을 최소로 하는 트리이다. 특징사이클이 포함되면 가중치의 합이 최소가 될 수 없으므로 사이클을 포함하지 않는다.N개의 노드가 있으면 최소 신장 트리를 구성하는 에지의 개수는 항상 N - 1 개이다. ※ 절대적이지 않지만,간선이 적으면 KRUSKAL, 간선이 많으면 PRIM 알고리즘이 유리 (1) Kruskal MST 알고리즘(간선을 고르는 간선 중심) 핵심 이론1. 에지 리스트로 그래프를 구현하고 유니온 파인드 배열 초기화하기데이터를 노드가 아닌 에지 중심으로 저장하므로 에지 리스트의 형태로 저장한다.사이클 처리를 위한 유니온 파인드 배열도 함께 초기화한다. 배열의 인덱스를 해당 자리의 값으로 초기화하면 된다.2. ..

AWS CodeSeries

AWS CodeSeries 란 ?CI / CD의 자동화를 위해 AWS에서 코드 저장소부터 배포까지 해주는 서비스들을 통칭해서 부르는 용어이다.즉, AWS에서 Developer Tools로 분류되어 있는 CodeCommit, CodeBuild,CodeDeploy,CodePipeline 등을 통칭하는 단어이다.CodeCommitCodeBuildCodeDeployCodePipelineCodeStar각 서비스들이 CodeSeries 끼리만 연동되는 것은 아니다.  📢CodeCommit AWS에서 제공하는 Github와 같은 VCS를 위한 서비스이다.Code Series에서 repository를 담당하고 있는 서비스이다. 초기 생성 시, 외부의 github, bitbucket 등에서 긁어 오도록 만들수도 있다...

AWS 2024.07.14

Health checks failed with these codes: [404]

☀️문제 상황 (1)AWS에서 EC2를 생성하고 ELB를 생성하여 80 포트로 (nginx)로 타겟 그룹을 설정하였다.Load Balancer DNS 이름으로 접근하려고 할 때  위와 같은 문제가 발생했다. 로드 밸런싱 -> 대상 그룹으로 가서 대상을 확인했더니 상태 확인에 Unhealthy로 빨간불이 들어왔다.  ✅ 첫번째 문제 해결[변경 전] [변경 후] 💡 문제 발생 이유상태 검사 설정에서 입력한 경로에 요청을 보내고 해당 응답을 확인하여 Health Check의 상태를 결정한다.즉, [변경 전] 사진에서 경로가 /actuator/health로 설정되어 있지만 현재 내가 AWS에 올린 서버는 테스트 겸 올린 것이기 때문에  존재하지 않는 경로이다. 존재하지 않는 경로이기 때문에 성공 코드로 설정한..

AWS ELB 생성, 대상 그룹 설정, EC2와 연결

ELB란?두 개 이상의 AZ에 EC2나 컨테이너, IP 주소 등으로 여러 대상에 걸쳐 수신되는 트래픽을 분산하는 서비스접속 부하에 맞게 자동적으로 리소스의 확장/축소를 수행ALB의 경우, 지속적으로 IP 주소가 바뀌며 IP 고정이 불가능하여 항상 도메인 기반으로 사용LB(Load Balancer)가 등록된 대상의 상태를 모니터링 한다 -> 정상적 상태인 대상으로 트래픽 라우팅 ELB 구성 요소Listener프로토콜과 포트를 기반으로 요청을 받아 타켓으로 전달Target GroupELB가 분산을 할 때 어디로 분산할 것이냐를 모은 그룹들Security Group방화벽과 같이 특정 프로토콜 / 포트만 허용하도록 하는 기능Health Check 직접 트래픽을 발생시켜 인스턴스가 살아있는지 (정상적인지) 체크C..

AWS 2024.07.12

AWS EC2 User Data가 작동하지 않을 때 로그 보는 방법

사용자 데이터(user-data)란?인스턴스를 시작할 때 매개변수나 스크립트를 사용자 데이터로 저장할 수 있다.사용자 데이터의 모든 스크립트는 인스턴스를 시작할 때 실행된다.IMDS(Instance Metadata Service)를 통해 인스턴스의 사용자 데이터를 볼 수 있다. 즉, "EC2 시작과 동시에 user-data에 작성한 스크립트가 돌아간다"는 뜻이다. 💡 사용자 데이터 로그 보는 방법EC2 안에 들어와서 로그 보는 방법은 아래 명령어를 사용하면 된다.$ cat /var/log/cloud-init-output.log

AWS 2024.07.11

위상 정렬 (topology sort)

위상 정렬은 사이클이 없는 방향 그래프에서 노드 순서를 찾는 알고리즘이다. 기능특징시간 복잡도(V : 노드 수, E: 엣지 수)노드 간의 순서를 결정사이클이 없어야 함O(V + E)  위상 정렬의 핵심 이론 1. 진입 차수 이해하기진입 차수(in-degree)는 자기 자신을 가리키는 에지의 개수이다.  이 때, 진입 차수 배열 D[N]은 아래와 같다.1234501122  2. 진입 차수 배열 D[N]에서 진입 차수가 0인 노드를 선택하고 선택된 노드를 정렬 배열에 저장한다. 그 후, 인접 리스트에서 선택된 노드가 가리키는 노드들의 진입 차수를 1씩 뺀다. 위 그림의 경우 진입 차수가 0인 노드 1을 선택하여 2, 3의 진입 차수를 1씩 빼 D[2], D[3]을 0으로 만든 것이다. 계속해서 다음 노드 2..

반응형