오늘도 코드카타...
Java의 큐 자료구조. 요소들이 우선순위에 따라 정렬된 상태로 유지됨
우선순위가 높은 요소가 큐에서 가장 먼저 제거되며 기본적으로는 Natural Order 또는 Comparator에 의해 결정됨
PriorityQueue<Integer> pq = new PriorityQueue<>();PriorityQueue<Integer> pq = new PriorityQueue<>(20); PriorityQueue<Integer> pq = new PriorityQueue<>((a, b) -> b - a); // 내림차순| 메서드 | 설명 |
|---|---|
add(E e) | 큐에 요소를 추가. 공간이 부족하면 예외를 발생시킴 |
offer(E e) | 큐에 요소를 추가. 공간이 부족하면 false를 반환 |
poll() | 큐의 우선순위가 가장 높은 요소를 제거하고 반환. 큐가 비어 있으면 null 반환 |
peek() | 큐의 우선순위가 가장 높은 요소를 반환(제거x).큐가 비어 있으면 null 반환 |
remove(Object o) | 지정된 객체를 큐에서 제거 |
contains(Object o) | 지정된 객체가 큐에 포함되어 있는지 확인 |
size() | 큐에 저장된 요소의 개수를 반환 |
isEmpty() | 큐가 비어 있는지 여부를 반환 |
clear() | 큐의 모든 요소를 제거 |
toArray() | 큐의 모든 요소를 배열로 반환 |
iterator() | 큐의 요소를 순회할 수 있는 Iterator를 반환 |
장점
1. 항상 우선순위가 높은 요소를 빠르게 반환할 수 있음
2. 동적 정렬 상태 유지
3. 메모리 효율이 높고 O(log n) 복잡도를 보장함
단점
1. 전체 요소를 정렬한 상태로 유지하진 않는다
2. 특정 인덱스의 요소에 직접 접근, 업데이트가 어렵다
3. k번째로 작은 요소를 찾으려면 여러번 poll해야 함
컨테이너화된 애플리케이션의 배포, 확장, 관리 자동화를 위한 오픈소스 플랫폼
Docker 등의 컨테이너 기술을 기반으로 하며 클러스터 환경에서 애플리케이션의 상태를 모니터링하고 안정적으로 실행되도록 관리함
장점
1. 확장성: 증가하는 트래픽에 따라 컨테이너를 자동으로 확장
2. 높은 가용성: Pod가 중단되거나 장애가 발생하면 자동으로 복구
3. 리소스 최적화: 클러스터의 CPU, 메모리 등의 리소스를 효율적으로 사용
4. 플랫폼 독립성: 클라우드 서비스(AWS, GCP, Azure) 또는 온프레미스 환경에서도 동일한 방식으로 동작
단점
1. 러닝 커브
2. 운영 부담
3. 리소스 요구량: 쿠버네티스 자체가 많은 리스소를 소비할 수 있음
4. 디버깅이 어려움
| 특징 | 쿠버네티스 | 도커 |
|---|---|---|
| 목적 | 컨테이너 배포, 확장, 관리 | 컨테이너 생성, 실행 |
| 사용 범위 | 대규모 분산 시스템 관리 | 단일 컨테이너 관리 |
| 주요 역할 | 클러스터 오케스트레이션 | 컨테이너 런타임 제공 |
공통점
| 항목 | 쿠버네티스(Kubernetes) | Spring Cloud |
|---|---|---|
| 주요 목적 | 컨테이너 기반 애플리케이션의 배포, 스케일링, 관리 자동화 | 마이크로서비스 간 통신, 구성 관리, 장애 복구 등 애플리케이션 기능 지원 |
| 주요 초점 | 인프라 관리: 컨테이너, 네트워크, 리소스 최적화 | 애플리케이션 레벨: 마이크로서비스 간의 기능 구현 |
| 기반 기술 | 컨테이너 기술(Docker 등) | Spring Framework 기반 |
| 로드 밸런싱 | 네트워크 레벨에서 서비스 간의 트래픽 분산(ClusterIP, NodePort, LoadBalancer) | Spring Cloud LoadBalancer를 사용한 애플리케이션 레벨 로드 밸런싱 |
| 구성 관리 | ConfigMap과 Secrets로 환경 변수 및 민감한 데이터 관리 | Spring Cloud Config로 외부화된 설정 관리 |
| 서비스 디스커버리 | Kubernetes의 DNS 기반 서비스 디스커버리 제공 | Eureka, Consul, Zookeeper 같은 서비스 디스커버리 도구와 통합 |
| 자동 복구 | Pod의 상태를 모니터링하고 실패 시 재시작(Health Check) | Hystrix 등으로 장애 발생 시 폴백(fallback) 처리 |
| 확장성 | Horizontal Pod Autoscaler(HPA)를 통해 트래픽에 따른 컨테이너 자동 확장 | Spring Cloud Gateway를 통한 확장 및 애플리케이션 레벨의 확장 지원 |
| 배포 관리 | 롤링 업데이트와 Canary 배포 지원 | Spring Cloud의 CI/CD 도구와 통합 가능(Jenkins, Spinnaker 등) |
| 사용자 정의 로직 | 컨테이너화된 애플리케이션에 대한 관리만 수행 | 애플리케이션 비즈니스 로직 구현에 초점 |
| 운영 환경 요구 사항 | 클러스터를 운영하기 위한 추가적인 관리 도구와 자원 필요 | 클러스터 없이도 애플리케이션만으로 실행 가능 |
Kubernetes를 사용해야 하는 경우
1. 컨테이너 중심 애플리케이션 운영
2. 여러 서비스의 배포, 스케일링, 복구를 자동화해야 할 경우
3. 멀티클라우스 또는 온프레미스 환경에서 일관성 있는 배포를 해야하는 경우
4. 리소스 사용 최적화와 자동화된 배포 관리가 중요한 경우
Spring Cloud를 사용해야 하는 경우
1. MSA 구현
2. 서비스 간 통신, 구성 관리, 장애 복구 등 애플리케이션 레벨 기능이 필요한 경우
3. 컨테이너 환경이 아닌 전통적 VM 또는 독립 실행 환경에서도 동작해야 하는 경우
4. Spring Boot 기반의 애플리케이션을 개발 중이며 Spring 생태계를 활용하고자 하는 경우
둘은 상호보완적으로 사용됨
쿠버네티스는 인프라, Spring Cloud는 애플리케이션의 마이크로서비스 기능을 구현하는 역할
예시
*Spring Boot 애플리케이션을 Kubernetes에서 배포
Kubernetes에서 Spring Cloud Gateway 사용
이런식?
애플리케이션을 컨테이너로 패키징, 배포, 실행하는 플랫폼
컨테이너: 애플리케이션과 그 실행환경(라이브러리, 설정파일 등)을 격리된 상태에서 실행할 수 있도록 하고, 일관된 실행 환경을 제공
docker run, docker build, docker ps 등 다양한 명령어 지원| 명령어 | 설명 |
|---|---|
docker run | 컨테이너 실행 |
docker ps | 실행 중인 컨테이너 목록 조회 |
docker build | Dockerfile을 기반으로 이미지 생성 |
docker pull | Docker Hub에서 이미지 다운로드 |
docker push | 이미지를 Docker Hub에 업로드 |
docker stop | 컨테이너 중지 |
docker rm | 컨테이너 삭제 |
docker rmi | 이미지 삭제 |
docker logs | 컨테이너 로그 확인 |
docker exec | 실행 중인 컨테이너에서 명령 실행 |
docker build 명령어로 이미지 생성장점
1. 일관된 실행 환경 보장
2. 효율적인 자원 사용: VM에 비해 경량화되어 빠르고 자원 소모가 적음
3. 이식성: 로컬, 테스트, 운영 환경 간 동일한 컨테이너 사용 가능
4. 빠른 배포: 애플리케이션을 컨테이너로 패키징하여 빠르게 배포 가능
5. 확장성: MSA와 클라우드 환경에서 확장 용이
단점
1. 러닝 커브
2. 운영 복잡성: 컨테이너 수가 많아질수록 관리, 모니터링이 어려워질 수 있음
3. 보안 문제: 컨테이너 격리가 완벽하지 않아 보안 우려가 있을 수 있음. 한 컨테이너에서 보안 문제 발생 시 커널을 공유하는 다른 컨테이너에도 영향을 줄 수 있음
4. 운영 체제 종속성: Docker는 리눅스 커널을 사용하여 동작해 리눅스에서 가장 잘 동작함.
소프트웨어로 구현된 컴퓨터 시스템
물리적 하드웨어와 독립적으로 동작함
물리적 하드웨어를 추상화하여 다수의 운영 체제와 애플리케이션이 동일한 물리적 시스템에서 동작할 수 있도록 함
장점
1. 리소스 효율성: 단일 물리적 하드웨어에서 여러 VM 실행으로 자원을 효율적으로 활용
2. 테스트 및 개발
3. 보안 격리: VM 간 격리로 한 VM의 문제가 다른 VM이나 호스트에 영향을 미치지 않음
4. 이식성: VM 이미지를 타 호스트 시스템으로 쉽게 전송하고 실행할 수 있음
5. 유연성: 하드웨어 제약 없이 다양한 운영 체제와 환경에서 애플리케이션 실행
단점
1. 오버헤드: 하이퍼바이저와 게스트 OS가 리소스를 추가적으로 사용해 성능이 다소 저하됨
2. 복잡성: 하이퍼바이저와 VM 관리를 위한 추가적인 설정 및 관리 필요
3. 속도: 컨테이너 기술(Docker 등)에 비해 비교적 부팅 및 실행 속도가 느림
4. 리소스 소모: 게스트 OS 실행으로 인해 메모리와 디스크 사용량이 큼
| 항목 | Docker | VM |
|---|---|---|
| 구조 | 애플리케이션 + 라이브러리/종속성 공유 커널 | 애플리케이션 + OS |
| 크기 | 경량 (MB 단위) | 무거움 (GB 단위) |
| 성능 | OS 없이 실행되므로 빠름 | 게스트 OS가 추가되어 성능 저하 가능 |
| 부팅 시간 | 밀리초 단위로 빠름 | 수 초에서 수 분 |
| 자원 사용량 | OS를 공유하므로 적음 | 게스트 OS가 자원을 소비 |
| 격리 수준 | 프로세스 수준의 격리 | 완전한 OS 수준의 격리 |