연결 리스트 연결 리스트란 각 노드가 데이터와 참조값을 갖고 한 줄로 연결되어 있는 방식으로 데이터를 저장하는 자료구조라 한다. head: head는 연결 리스트의 시작으로 첫 번째 노드를 가리키는 노드를 의미 한다. Node : 데이터와 다음 노드로 접근할 수 있는 참조값을 가지고 있다. Pointer : 노드의 참조 값을 가리키는 변수를 의미한다. Array vs LinkedList 조회가 많은 경우 Array를 사용, 삽입 또는 삭제가 많은 경우 LinkedList를 사용하는 것이 적합하다. 단일 연결 리스트 장점 : 저장 될 데이터 수를 몰라도 사용할 수 있다. 또한 사용한 만큼 메모리 공간을 할당하기 때문에 효율적인 메모리 관리를 할 수 있다. 단점 : 하나의 연결만을 가지고 있기 때문에 순차적..
이미지란 도커는 계층 파일 시스템 기반으로, 이미지는 프로세스가 실행되는 파일들의 집합으로 볼 수 있다. 프로세스는 환경을 변경할 수 있으며, 이 환경을 저장해서 새로운 이미지를 만든다. 이미지 구성에는 AUFS, BTRFS, Overlayfs 등이 사용된다. Base Image : 읽기 전용으로 해당 이미지를 변경할 수 없지만, 해당 내용에 추가적으로 변경할 수 있다. Container : Git이 포함된 새로운 이미지로 Commit을 하게되면 새로운 이미지로 변경할 수 있다. Git 설치 docker run -it --name git ubuntu:latest bash apt-get update apt-get install -y git git --version git이라는 이름의 컨테이너로 ubuntu..
도커 설치하기 Linux curl -s https://get.docker.com/ | sudo sh 명령어를 입력하고 패스워드를 입력하면 리눅스 배포판에 따라 자동으로 최신버전의 도커를 설치해준다. sudo usermod -aG docker ubuntu ubuntu 유저 권한 추가 MacOS 도커는 기본적으로 리눅스를 지원하기 때문에 MacOS와 Windows에 설치되는 도커는 가상머신에 설치된다. MacOS는 xhyve를 사용하고 Windows는 Hyper-V를 사용한다. 설치는 https://docs.docker.com/desktop/mac/install/ 에서 제공한다. 설치하고 docker version 을 입력해보면 다음과 같이 도커 정보가 출력된다. client-server 구조로 로컬(cli..
도커 도커는 컨테이너 기반의 오픈소스 가상화 플랫폼(DotCloud, 현 Docker)으로 계속 바뀌는 서버 환경과 개발 환경을 컨테이너화하여 관리하기 위해 등장했다. 서비스가 점차 확장되면서 기존에 사용하던 서버와 새로 구축한 서버 간에 설정 차이가 발생하고, 관리자의 인적요소에도 영향을 받을 수 있다. 따라서 기존에는 스크립트를 활용한 자동화 방식부터, kickstart 등을 거쳐 OS를 가상화하는 방식으로 서버를 관리해왔다. 기존의 OS 가상화 방식 기존의 가상화 기술은 Hypervisor를 이용해 여러 개의 운영체제를 하나의 호스트에서 생성하여 사용하는 방식이었다. 하이퍼바이저는 호스트 컴퓨터에서 다수의 운영체제를 동시에 실행하기 위한 논리적 플랫폼이다. 여기서 문제점은 시스템 자원을 가상화하고 ..
망 구성 지난 포스팅에서 망 분리는 다음과 같다. VPC 생성 CIDR C 클래스 선택 서브넷 생성 외부망으로 사용할 서브넷 2개 IP 64개 할당 (/26) 및 접근 허용 데이터 센터 A, C 사용 라우팅 테이블 - 모든 네트워크 (0.0.0.0) 에 대해 인터게이트웨이 생성 외부망 보안 그룹 적용 내부망으로 사용할 서브넷 2개 IP 32개 할당(/27) 및 접근 허용 데이터 센터 A, C 사용 라우팅 테이블 - 모든 네트워크에 대해 NAT 게이트웨이 생성 내부망 보안 그룹 적용 EC2 생성 외부망 EC2 1대, 내부망 EC2 1대 외부망 : 보안 그룹 - ICMP(핑 테스트) 전체 오픈, SSH (22) 공인 IP 오픈 내부망 : ICMP(핑 테스트) 전체 오픈, SSH(22) 관리망 오픈 t3.me..
통신망 통신망이란 노드 간 연결된 링크로 구성된 하나의 시스템을 의미한다. 여기서의 노드는 IP로 식별할 수 있는 대상이며, 링크란 물리적 회선을 뜻한다. 즉, 하나의 서브넷을 하나의 망으로 볼 수 있다. 기업의 기본 보안 정책은 외부망, 내부망으로 망 분리하는 것이다. On-premise 방식을 사용하는 경우 회사 내에서 별도로 관리하는 private 서버 관리를 통해 망 분리 구축을 하지만, 클라우드인 AWS를 사용하여 망 분리를 한다면 VPC를 통해 public과 private 망을 구분할 수 있다. AWS에선 망 분리를 위해 VPC, Subnet, Region(국가/지역), 데이터 센터(Availability Zone), Router, Internet gateway 등 여러 가지 기능을 제공한다...
쓰레드 로컬 이전 포스팅에서 로그 추적기에서 트랜잭션 ID 동기화를 위해 TraceId 를 파라미터로 넘기도록 구현했었다. 동기화는 정상 동작했지만, 모든 메서드에 파라미터를 추가해야하는 문제가 발생했다. 이번엔 프로토타입이 아닌 정식 버전으로 개발해보자. LogTrace package hello.advanced.trace.logtrace; import hello.advanced.trace.TraceStatus; public interface LogTrace { TraceStatus begin(String message); void end(TraceStatus status); void exception(TraceStatus status, Exception e); } 다양한 구현체로 변경할 수 있도록 인터..
프로젝트 생성 https://start.spring.io/ 에서 다음과 같이 프로젝트를 생성하자. 상품을 주문하는 프로세스로 가정하고, Controller , Service, Repository로 이어지는 흐름을 단순하게 만들어보자. OrderRepositoryV0 package hello.advanced.app.v0; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; @Repository @RequiredArgsConstructor public class OrderRepositoryV0 { public void save(String itemId) { // 저장 로직 if (itemId.equal..