분류 전체보기
[Database] Database Engine
[Database] Database Engine
2024.04.17기본적으로 데이터를 컴퓨터의 디스크에 안전하게 저장하는 역할을 수행한다. 트랜잭션 관리 / 캐시 관리 / 동시성 제어 / 복구 관리 등.. 디스크 저장과 관련된 전략을 결정하고, B-Tree / B+Tree 등 데이터를 저장할 때 어떤 자료구조를 사용할 지도 결정한다. 디스크 저장과 관련된 모든 작업을 총괄한다고 생각하면 된다. DBMS의 주요한 차이점 중 하나는 DBMS가 사용하는 데이터베이스 엔진의 구현과 특성이다. PostgreSQL, MySQL, Oracle 등 여러 DBMS는 데이터베이스 엔진이 제공하는 데이터 처리 위에서 사용자와 애플리케이션의 요구사항에 맞춘 다양한 기능을 제공한다. (GUI, Session, 스키마, Query...) MyISAM MySQL 및 MySQL의 fork 버전인 ..
[Database] 동시성 처리
[Database] 동시성 처리
2024.04.13Exclusive Lock은 락을 소유한 트랜잭션만 해당 데이터 항목을 읽거나 쓸 수 있고, 다른 트랜잭션들은 그 데이터 항목에 대해 접근을 차단한다. Shared Lock은 여러 트랜잭션이 동시에 같은 데이터 항목을 읽을 수 있도록 허용하지만 해당 데이터 항목이 읽기 작업 중 변경됨을 방지한다. 보통 트랜잭션의 격리 수준으로 간접적으로 락의 동작 방식을 제어할 수 있고, SELECT ... FOR UPDATE / LOCK IN SHARE MODE 구문을 사용해 쿼리 수준에서 명시적으로 락을 요청할 수도 있다. 예약 사이트를 개발하는 경우 이중 예약이 불가능해야 하니.. SELECT ... FOR UPDATE 구문으로 조회 쿼리에서도 명시적으로 Exclusive Lock을 사용하자. 데이터베이스의 동시성..
[Database] Sharding
[Database] Sharding
2024.04.08파티셔닝은 하나의 데이터베이스 서버에서 논리적이나 물리적으로 데이터를 분할해 데이터를 관리하는 방식이다. 반면 샤딩은 데이터를 여러 데이터베이스 서버에 걸쳐 분산시켜 저장하는 방식으로, 각 샤드는 전체 데이터의 부분집합을 가지고 있어 데이터베이스를 수평적으로 확장할 때 유용하다. 샤딩으로 같은 스키마를 가지는 데이터베이스를 여러 서버에 분산시킨 후 각 데이터베이스 서버에 값이 균등하게 저장되도록 하기 위해 Consistent Hashing 기법을 함께 사용한다. 데이터를 분산시키는 기준을 해시 함수가 정하고 해시 값으로 데이터가 저장될 샤드를 결정한다. const HashRing = require("hashring"); const hr = new HashRing(); app.get("/:urlId", a..
[Database] Partitioning
[Database] Partitioning
2024.04.04파티셔닝은 데이터베이스의 데이터를 논리적 또는 물리적으로 분할해서 관리하는 작업을 의미한다. 대량의 데이터가 저장되어있는 테이블에서 조회 쿼리를 실행시켰을 때 파티셔널으로 검색 성능을 향상시킬 수 있다. 1,000,000 개의 데이터가 들어있는 테이블에서 id가 700,001 인 데이터를 조회한다고 생각해보자. 세부적인 내용은 DBMS 설정에 따라 다르겠지만.. id 컬럼에 인덱스가 있으면 인덱스를 사용해서 데이터를 조회하겠고.. 인덱스가 없으면 Full Table Scan을 수행한다. 인덱스가 있든 없든 파티셔닝을 사용하면 성능 향상에 도움이 된다. 1,000,000 개의 데이터를 저장하고 있는 테이블을 파티셔닝을 통해 5의 파티션으로 분할한다. 각 파티션은 데이터의 특정 범위를 담당하게 되고, 이런 ..
[Database] B+Tree 자료구조
[Database] B+Tree 자료구조
2024.03.30데이터베이스에서 특정 값을 검색할 때 해당 컬럼에 인덱스가 없는 경우 전체 테이블을 처음부터 끝까지 탐색하는 Full Table Scan을 수행한다. 테이블에 데이터가 많이 저장되어있고 해당 컬럼에 인덱스가 없으면 쿼리 실행 속도가 매우 느리다. 물론 DBMS가 내부적으로테이블을 쪼개서 멀티쓰레딩 및 병렬처리를 수행하겠지만.. 전체 테이블을 탐색하는 작업은 오버헤드가 크다. 효과적인 탐색을 위해 컬럼마다 인덱스를 구축하고 사용한다. 인덱스 구축에 사용되는 내부 자료구조는 B+Tree / 해시 인덱스 / GIN / R-Tree 등 다양한 등 다양하다. 그 중 범용적으로 사용되는 B+Tree에 대해 살펴보자. B-Tree 데이터의 삽입, 삭제, 검색을 효율적으로 수행할 수 있게 설계된 이진 트리의 일종으로 ..
[Spring Batch] ItemReader / ItemWriter
[Spring Batch] ItemReader / ItemWriter
2024.02.27Step에서 데이터를 읽어오는 역할을 담당하는 ItemReader를 구현할 때는 개발자가 직접 ItemReader 인터페이스를 구현해 read 메서드를 구현한 후 Step에 추가할 수도 있고, 스프링 배치가 기본적으로 제공하는 ItemReader를 사용할 수도 있다. @Bean @StepScope public FlatFileItemReader flatFileItemReader( @Value("#{jobParameters['inputFile']}") FileSystemResource fileSystemResource ) { FlatFileItemReader flatFileItemReader = new FlatFileItemReader(); // flatFileItemReader.setResource(new..
[Spring Batch] 스프링 배치 내부 흐름
[Spring Batch] 스프링 배치 내부 흐름
2024.02.25스프링 배치는 대용량 데이터를 효율적으로 처리하기 위해 설계된 프레임워크이다. 1. Chunk 단위로 나눠서 작업 데이터를 일정량의 Chunk 단위로 묶어서 처리한다. 각 Chunk는 여러 Item으로 구성되고 배치 작업은 Item을 하나씩 읽고 처리한 후 모든 Item이 처리되면 결과를 갱신한다. 대량의 데이터를 한 번에 처리할 때 발생할 수 있는 메모리 부하를 줄이고 로직 수행 중 오류가 발생한 경우 유연하게 복구할 수 있다. 2. 예외처리 스프링 배치는 Job을 여러 Step으로 구성하는 방식으로 사용한다. Step은 독립적인 작업 단위로, 특정 Step에서 예외가 발생했을 때 그 Step에 대해서만 예외를 처리할 수 있어 유연하다. 3. 트랜잭션 각 Chunk 처리 과정에서 트랜잭션을 시작하고 처..
[Database] 내부 저장 구조
[Database] 내부 저장 구조
2024.01.29관계형 데이터베이스에서 테이블을 정의하고 데이터를 저장할 때, 일부 데이터베이스에서는 테이블의 PK와는 별개로 내부적으로 rowid라는 개념을 사용해서 데이터를 저장한다. 사용자가 테이블을 정의할 때 row_id 라는 컬럼을 지정하지 않았지만 데이터베이스가 내부적으로 row_id를 컬럼을 만들고 각 row을 식별할 때 사용한다. 이 rowid는 row의 물리적인 위치를 가리키고, 위치 기반 접근으로 디스크에서 데이터를 더 빠르게 찾고 조작할 수 있다. rowid 개념을 사용하는 데이터베이스는 아래와 같다. SQLite 모든 테이블은 기본적으로 rowid라는 숨겨진 컬럼을 가지고, 이 rowid로 각 행을 식별한다. rowid 기반 쿼리는 매우 빠르게 동작해 대규모 데이터셋에서 유리하다. PostgreSQ..
[Database] ACID
[Database] ACID
2024.01.21트랜잭션은 데이터베이스 작업의 단위로, 여러 쿼리의 집합으로 생각하면 편하다. 가장 쉽게 설명하는 예시로는 계좌이체가 있는데.. 계좌이체 예시와 트랜잭션을 안전하게 처리하는 주요 특성인 ACID에 대해 살펴보자. RDB는 ACID 속성을 엄격하게 준수하고, 락 기반으로 동시성을 제어하지만 NoSQL 기반 데이터베이스는 종류에 따라 ACID 속성을 사용하지 않고 확장성과 성능을 향상시키는 경우도 있다. Atomicity 트랜잭션 안에 있는 모든 쿼리는 모두 성공하거나 실패해야한다는 속성이다. 계좌이체는 출금과 입금으로 이루어지는데.. 출금 쿼리만 성공하고 DB서버가 죽어버리면 DB서버가 다시 시작할 때 트랜잭션을 롤백한다. (clean up) 낙관적 트랜잭션 처리를 사용하는 데이터베이스에서는 트랜잭션이 실..
[Nginx] nginx.conf
[Nginx] nginx.conf
2023.12.28user nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; access_log /var/log/nginx/access.log main; sendfile on; tcp_nopush on; keepalive_timeout 65; gzip on; server { listen 80; server_name 127.0.0.1; client_max_body_size 2M; location / { root /usr/share/nginx/html; i..
[Nginx] Timeout
[Nginx] Timeout
2023.12.24엔진엑스에서의 타임아웃 설정은 크게 클라이언트 / 백엔드 두 가지로 나뉜다. 클라이언트 타임아웃 client_header_timeout 클라이언트가 HTTP 헤더를 서버로 전송하는데 걸리는 최대 시간을 지정한다. 연결이 너무 오래 걸려 서버 리소스를 과도하게 사용하는 연결을 끊어 서버를 보호하고, 의도적으로 헤더를 느리게 전송하는 방식의 공격을 방어한다. 기본 값은 60초이고, nginx.conf의 client_header_timeout 10s; 로 타임아웃 시간을 설정할 수 있다. client_body_timeout HTTP 요청 본문을 서버로 전송하는데 걸리는 최대 시간을 지정한다. header_timeout과 마찬가지로 기본적으로 60초로 설정되고 설정 파일을 통해 수정할 수 있다. 파일 업로드 같..
[Network] 백엔드 아키텍처
[Network] 백엔드 아키텍처
2023.12.21Listener 네트워크를 통해 들어오는 연결 요청을 대기하고 수신하는 컴포넌트이다. 특정 IP주소와 포트에 바인딩된 소켓을 생성해 그 포트로 들어오는 네트워크 요청을 수신한다. 먼저 운영체제에서 제공하는 네트워크 API를 사용해 네트워크 소켓을 생성하고, 생성된 소켓을 특정 IP와 포트에 바인딩해 해당 소켓이 네트워크 요청을 수신할 수 있도록 한다. Acceptor Listener가 감지한 연결을 운영체제의 네트워크 API 중 accept를 사용해 수락한다. 연결이 수락되면 필요한 세션 정보를 초기화하고 클라이언트와의 통신을 준비한다. Reader 네트워크를 통해 전송된 데이터를 읽고 처리하는 컴포넌트로 데이터를 읽고 애플리케이션에서 사용할 수 있는 형태로 변환한다. 실제 네트워크 요청을 처리하는 컴포..