해당 글은 MySql, H2 데이터베이스 기준으로 작성하였습니다.예상치 못한 상황Q. 주문을 할 때 특정 시간에 사용자 1명만 주문을 할까?Q. 우연히 2명 이상의 사용자가 같은 시각에 동시에 주문을 할 수 있지 않을까?Q. 한 사람이 주문을 동시에 여러 번 할 수 있지 않을까?'데이터베이스에서의 동시성 문제'라고 부르며, '고립성(Isolation)'이 제대로 보장되지 않아 발생하는 문제가 위와 같다. 동시에 여러 트랜잭션이 수행될 때, 트랜잭션들이 서로 간섭하지 않도록 하는 것이 고립성의 목표이다.트랜잭션의 격리 수준을 설정하여 동시성 문제를 일정 수준까지 제어할 수 있지만, 완벽하게 해결하기 위해서는 추가적인 동시성 제어 기법이 필요하다. 이때, 낙관적 락이나 비관적 락 등의 동시성 제어 기법을 사..
지난 시간에는 Future과 Callable의 기본적인 활용법에 대해서 알아보았다. 하지만 실제 개발을 하다 보면 Future만으로는 해결하기 어려운 상황들이 많이 발생한다.여러 비동기 작업을 연결하고 싶을 때비동기 작업의 결과를 조합하고 싶을 때예외 처리를 더 우아하게 하고 싶을 때이런 문제들을 해결하기 위해 Java 8에서 등장한 것이 바로 CompletableFuture이다. (Future은 Java 5에서 등장)따라서 이번 시간에는 CompletableFuture의 핵심 개념과 실무에서 활용할 수 있는 다양한 패턴들에 대해서 알아보도록 하자.Future의 한계점먼저 기존 Future 인터페이스의 한계점을 짚고 넘어가자.ExecutorService executor = Executors.newFixe..
지난 시간에는 Future과 Callable의 활용에 대해서 알아보았다. 정상적으로 코드가 실행이 되어 아무런 문제가 없으면 좋겠지만, 개발자에게는 언제나 예외라는 경우가 존재한다. 그 외 작업을 중단하는 경우 등 다양한 상황에 대해서 추가로 알아보자. 따라서 이번 시간에는 Future 예외, 취소, ExecutorService의 작업 컬렉션에 대해서 알아보도록 하자.Future 인터페이스 주석으로 설명이 되어 있는 대로 cancel()은 완료되지 않은(시작되지 않았거나, 실행 중인) 작업을 취소한다.boolean cancel(boolean mayInterruptIfRunning): 아직 완료되지 않은 작업을 취소한다. mayInterruptIfRunning이 true 또는 false 일 경우, can..
비동기 프로그래밍, 멀티스레드에 활용되는 Future, Callable에 대해 알아보고자 한다. 이는 기존 스레드 모델의 근본적인 한계를 해결하기 위해 등장하였다.Runnable의 불편함public interface Runnable { void run();}반환 값이 없다: run() 메서드는 반환 값을 가지지 않는다. 즉, 스레드의 실행 결과를 직접 받을 수 없다.예외 처리: run() 메서드는 체크 예외를 던질 수 없다. 체크 예외의 처리는 메서드 내부 에서 처리해야 한다.Runnable이란?더보기Runnable은 별도의 스레드에서 수행할 작업의 로직을 정의하는 인터페이스이다. 스레드가 실행할 코드 블록을 캡슐화한다고 보면 된다.// 스레드에서 실행할 작업을 정의Runnable task = ne..
@TransactionalSpringBoot로 프로젝트를 해본 사람이라면 한 번쯤은 이 어노테이션을 써봤을 것이다. 이 기능은 메서드나 클래스에 적용하면 해당 메서드 혹은 클래스 내의 메서드들이 하나의 트랜잭션으로 묶인다.즉, @Transactional은 스프링 프레임워크에서 데이터의 일관성을 보장하고 트랜잭션을 효과적으로 관리하기 위한 중요한 도구이다.AOP(Aspect Oriented Programming)AOP는 관점 지향 프로그래밍이라고도 하며, 애플리케이션의 핵심적인 기능에서 로깅, 트랜잭션, 보안 등 공통 관심사를 비즈니스 로직에서 분리하여 객체로 관리한다. 이를 통해 코드의 가독성, 유지보수성, 재사용성을 높인다. Aspect: 부가기능 모듈. 여기서 부가기능이란 로깅, 트랜잭션, 보안 등과..
간단하게 ThreadPoolExecutor에 대해 설명하자면, ThreadPoolExecutor는 싱글스레드 환경을 멀티스레드 환경으로 전환하여 활용할 수 있는 프레임워크이다. ThreadPoolExecutor는 Java의 동시성 프레임워크인 java.util.concurrent 패키지의 핵심 클래스로 스레드 풀을 생성하고 관리하여 애플리케이션의 성능과 자원 활용을 최적화한다. 일반적으로 ThreadPoolExecutor의 생성자를 만들 때 아래와 같은 속성들을 볼 수 있다.import java.util.concurrent.*;public class ThreadPoolExecutorExample { public static void main(String[] args) { // 스레드 풀..