분류 전체보기
-
충돌이 많을때 왜 낙관적 락을 쓰지 말라고 할까?카테고리 없음 2021. 9. 6. 00:00
데이터베이스나 분산 시스템에서 동시에 여러 트랜잭션이 같은 데이터를 접근할 때 발생할 수 있는 충돌을 관리하기 위해, 동시성을 보장하기 위해 락을 사용한다. 그리고 락을 사용할때 흔히 들은 말은 "충돌이 많으면 비관적 락을 쓰는게 낫다" 이다. 이 같은 말을 들었을때 왜? 라는 의문이 들기보다는 교과서 암기처럼 숙지하고 넘어갔었는데 그 이유에 대해서 알아보려고 한다. 우선 낙관적락과 비관적락이 무엇인지에 대해서 알아보고 어떤 특징이 있는지 확인해보자. Optimistic Locking (낙관적 잠금)Optimistic locking은 트랜잭션이 데이터를 읽을 때는 잠금을 걸지 않고, 데이터를 수정하고자 할 때 다른 트랜잭션이 해당 데이터를 변경했는지 확인하는 방식이다.일반적으로 version numbe..
-
innoDB의 버퍼풀과 리드어헤드책/Real MySql 2021. 8. 12. 09:32
디스크와 인덱스 페이지디스크는 데이터를 영구적으로 저장하는 물리적 장치이다. 데이터베이스는 디스크에 데이터를 저장하고 필요할 때 이를 읽어 메모리로 가져온다. MySQL InnoDB는 데이터를 페이지 단위로 관리한다. 페이지는 데이터베이스의 논리적 저장 단위로, 일반적으로 16KB 크기를 가진다. 하나의 페이지에는 여러 레코드가 저장될 수 있다. 인덱스는 특정 컬럼에 대한 데이터의 위치를 빠르게 찾기 위해 사용하는 구조이다. 인덱스는 디스크에 저장되지만, 인덱스를 이용한 데이터 검색은 페이지 단위로 이루어진다. 인덱스를 통해 관련 페이지를 찾고, 해당 페이지를 메모리로 불러와서 필요한 데이터를 읽는다. 버퍼 풀(Buffer Pool)InnoDB의 버퍼 풀은 메모리 내에서 동작하는 데이터베이스 성능 최적화..
-
스프링 @Transactional과 잠금Spring/Spring 2021. 8. 11. 11:27
Spring Framework에서 @Transactional 어노테이션과 잠금의 차이를 알아보자. @Transactional 어노테이션을 사용하는 것만으로 메서드에 잠금이 걸리는 것은 아니다. @Transactional은 트랜잭션의 경계를 정의하고 트랜잭션 관리의 일관성을 유지하는 데 사용된다. 하지만 이는 동시성 제어나 잠금을 직접적으로 처리하는 것은 아니다.트랜잭션 관리와 잠금은 다르다. 트랜잭션 관리:@Transactional 어노테이션은 데이터베이스 트랜잭션을 시작하고, 커밋하거나 롤백하는 역할을 한다.트랜잭션 내에서 수행되는 모든 작업은 원자적으로 처리되며, 트랜잭션이 완료되기 전까지 다른 트랜잭션에서 해당 데이터에 접근할 수 없도록 보장된다.예를 들어, 사용자 계정 정보 업데이트와 같은 시나..
-
인덱스 개수가 늘어날수록 InnoDB 버퍼를 위한 메모리가 더 많이 필요한 이유책/Real MySql 2021. 8. 3. 09:06
InnoDB는 MySQL의 기본 스토리지 엔진으로, 데이터베이스 성능을 최적화하기 위해 다양한 기법을 사용한다. 그중 하나가 버퍼 풀(Buffer Pool)이다. 버퍼 풀은 디스크 I/O를 최소화하고, 데이터베이스의 응답 시간을 단축시키는 중요한 역할을 한다. InnoDB 버퍼 풀(Buffer Pool)의 역할버퍼 풀은 디스크에 저장된 데이터와 인덱스 페이지를 메모리에 캐싱하여, 자주 사용되는 데이터에 빠르게 접근할 수 있도록 한다. 이를 통해 디스크 접근을 줄이고, 데이터베이스 성능을 향상시킨다. 버퍼 풀의 주요 역할은 다음과 같다:데이터 페이지 캐싱: 자주 접근하는 데이터 페이지를 메모리에 유지하여, 디스크 I/O를 줄인다.인덱스 페이지 캐싱: 자주 사용되는 인덱스 페이지를 메모리에 캐싱하여, 인덱..
-
리액티브 프로그래밍에서의 트랜잭션 관리: @Transactional vs TransactionalOperator카테고리 없음 2021. 8. 1. 21:34
리액티브 프로그래밍에서 비동기 데이터 흐름에서 트랜잭션을 안전하게 관리하는 방법에대해 알아보자. R2DBC등의리액티브 데이터베이스 연동에서 트랜잭션 관리는 중요하다. 그런데 MVC 에서 주로 썼던 @Transactional 어노테이션을 그대로 사용해도 될까? TransactionalOperator 클래스는 무엇인지 알아보고 각 접근법의 적합성에 대해서 알아보자. @Transactional 어노테이션@Transactional 어노테이션은 전통적인 동기적 트랜잭션 관리에서 널리 사용된다. 이 어노테이션은 메서드의 시작과 끝에서 트랜잭션을 관리하며, 예외 발생 시 트랜잭션을 롤백한다. 그러나 리액티브 프로그래밍 환경에서는 몇 가지 제한이 있다.외부 호출에 의존: @Transactional은 주로 외부 클래..
-
Mono.just()와 Mono.defer()에 대한 이해Spring/Spring 2021. 7. 30. 13:26
리액티브 프로그래밍을 위해 스프링 WebFlux를 사용할 때, Mono를 사용하여 단일 값을 비동기적으로 처리하는 경우가 많다. 이때 Mono.just()와 Mono.defer()는 매우 유용한 메서드이다. 이 글에서는 Mono.just()와 Mono.defer()의 차이점과 사용 사례를 살펴보겠다. Mono.just()란?Mono.just()는 단일 값을 즉시 감싸서 Mono로 반환한다. 값을 이미 알고 있고, 그 값을 비동기적으로 반환해야 할 때 유용하다. 예를 들어, 이미 계산된 값이나 상수를 Mono로 반환하고자 할 때 사용된다.public Mono getFixedValue() { return Mono.just("Hello, World!");}위의 코드에서 Mono.just("Hello, ..
-
Kubernetes 인그레스 요청 흐름DevOps/Kubernetes 2021. 7. 19. 08:36
Kubernetes는 컨테이너화된 애플리케이션의 배포, 확장 및 운영을 자동화하는 오픈소스 플랫폼이다. 그중 Kubernetes 인그레스 요청 흐름에 대해 알아보자. 인그레스는 클러스터 외부에서 내부 서비스로의 HTTP 및 HTTPS 경로를 제공하는 역할을 한다. 이를 통해 도메인 기반의 라우팅이 가능해진다. 1. 요청 시작사용자가 웹 브라우저나 애플리케이션을 통해 인그레스 주소로 URL을 요청한다. 예를 들어, http://myapp.example.com에 접근하는 경우를 가정해보자. 사용자가 입력한 URL 요청은 인터넷을 통해 Kubernetes 클러스터로 전달된다.2. 인그레스 컨트롤러요청은 먼저 Kubernetes 클러스터에 배포된 인그레스 컨트롤러로 전달된다. 인그레스 컨트롤러는 인그레스 리소스..
-
Java에서 Files.copy 등을 하면 파일 크기만큼 어플리케이션 메모리가 늘어날까?JAVA 2021. 6. 20. 23:44
파일을 복사하는 과정에서 일시적으로 파일 크기만큼 메모리를 사용한다고 생각할 수 있다. 그러면 파일이 큰 경우, 충분한 메모리가 없다면 메모리 부족 문제가 발생할 수 있을 것이다. 이를 방지하기 위해 스트림을 사용하여 파일을 읽고 쓰는 방식으로 메모리 사용량을 최소화할 수 있는 방식을 사용한다. 예를 들어, 아래와 같이 파일 스트림을 사용하여 파일을 복사하면 메모리 사용량을 줄일 수 있다.public class FileCopyExample { public static void copyFile(Path source, Path target) throws IOException { try (InputStream in = Files.newInputStream(source); ..