전체 글 (60) 썸네일형 리스트형 [중요!] @Transactional(AOP)가 동작하지 않는 이유 this.update(); 이전부터 작성하고 싶었던 주제였습니다. @Transactional 같은 AOP를 사용할 때 종종 발생하는 문제 중 하나는"어노테이션을 붙였는데 값이 업데이트되지 않지? AOP가 작동하지 않지?" 같은 상황입니다.코드상으로도 문제없어 보이고 에러도 나지 않지만, 기능이 제대로 작동하지 않을 때가 있죠. 다음 예제 코드에서 그 문제를 확인해 보겠습니다.updateUserWithLogging() 메서드를 호출하면 로그는 정상적으로 출력되지만,user 객체의 업데이트가 이루어지지 않는 문제가 있습니다. 여기서 @Transactional이 적용되어 있으므로 TransactionManager가 실행되어야 합니다. 그러나 UserController에서 updateUserWithLogging() 메서드를 호출할 경우 .. 스프링 의존성 주입(DI) Spring 프레임워크의 핵심 기능 중 하나는 의존성 주입(DI, Dependency Injection)입니다. DI는 객체 간의 결합을 줄이고 코드의 유연성과 확장성을 높이는 설계 방식으로, 스프링에서는 이를 통해 객체 간의 관계를 간단하게 설정할 수 있습니다. 1. 의존성 주입(DI)란?의존성 주입(DI)이란 객체가 사용할 의존성을 외부에서 주입해주는 설계 패턴입니다. 전통적인 객체 지향 프로그래밍에서는 객체 내부에서 필요한 의존성을 직접 생성하거나 설정합니다. 하지만 DI를 사용하면 외부에서 필요한 의존성을 전달받아 객체가 스스로 관리할 필요 없이 주어진 의존성만 사용할 수 있게 됩니다. 예시public class OrderService { private final PaymentService .. CachedThreadPool의 한계와 ThreadPoolExecutor 커스터마이징 CachedThreadPool의 동작 방식과 한계Java의 CachedThreadPool은 다음과 같은 특성을 지니며 높은 처리량을 지원하지만, 동시 작업 수가 많을 때 주의가 필요합니다. /** * 필요한 경우 새 스레드를 생성하지만, 기존에 생성된 스레드가 있으면 * 이를 재사용하는 스레드 풀을 생성합니다. 이 풀은 많은 짧은 비동기 작업을 * 수행하는 프로그램의 성능을 일반적으로 향상시킵니다. * {@code execute} 호출 시 기존에 생성된 스레드가 사용 가능하다면 이를 재사용합니다. * 사용 가능한 기존 스레드가 없으면 새 스레드를 생성하여 풀에 추가합니다. * 60초 동안 사용되지 않은 스레드는 종료되고 캐시에서 제거됩니다. * .. 안정성과 성능 최적화를 위한 Java와 데이터베이스에서의 Lock 전략 시스템이 복잡해질수록 동시에 여러 작업을 처리해야 할 필요가 늘어나게 됩니다. 이 때 동시에 접근하는 여러 작업 간의 충돌을 방지하기 위해 Lock이라는 개념을 사용하게 됩니다. 여기서 SQL DBMS에서의 Lock과 Java에서의 Lock을 알아보고, 이를 언제 어떻게 사용해야 하는지 살펴보겠습니다. Lock이란?Lock(락)은 특정 자원에 대해 여러 작업이 동시에 접근하는 것을 방지하기 위한 메커니즘입니다. Lock을 활용하지 않은 동시성 문제 예시동시성 문제로 하나 예를 들어보자면, A와 B라는 사람한테 화이트보드에 적혀있는 숫자를 하나씩 증가시켜 달라고 요청을 합니다. 그럼 A라는 사람이 화이트 보드에 있는 3이라는 값을 읽어서 머리속으로 계산을 합니다. 계산을 끝내고 화이트보드를 지우고 다시 적.. Java Thread로 직접 구현하는 커스텀 쓰레드 풀: 기본 원리부터 동작까지 오늘은 Java의 Thread 객체만을 이용해 직접 Executors 클래스의 쓰레드 풀을 구현하는 방법에 대해 소개하겠습니다. Java에서는 Executors 클래스를 사용해 쉽게 쓰레드 풀을 만들 수 있지만, 내부적으로 어떻게 작동하는지 이해하면 더 유연하고 자신만의 커스텀 쓰레드 풀을 설계할 수 있습니다. 이번 글에서는 Thread와 BlockingQueue를 이용해 최소한의 쓰레드 풀을 구현하고, 이를 통해 기본적인 원리를 설명해보겠습니다. 코드는 GitHub에서 확인하실 수 있습니다: https://github.com/youseonghyeon/threadpool 요구 사항구현하려는 Thread Pool의 주요 기능은 다음과 같습니다: 최소 쓰레드 개수 설정: 항상 일정한 최소 개수의 쓰레드가 살.. Kotlin으로 TTL 기반 Map 구현하기: Java 21 가상 쓰레드와 ConcurrentHashMap 최적화 Redis를 사용할 때 유용한 기능인 시간이 지나면 데이터가 지워지는 기능이 있습니다. 이것을 Kotlin에서 사용해보면 좋을 것 같아 구현해보겠습니다. Redis의 TTL(Time To Live) 기능은 데이터가 일정 시간이 지나면 자동으로 삭제되는 매우 유용한 기능입니다. 이 기능을 활용하면 일정 시간 동안만 유효한 데이터를 관리할 수 있어 리소스 효율성을 극대화할 수 있습니다. Redis 대신 Kotlin에서 직접 이러한 TTL 기능을 구현해보면, 기존 Map처럼 동작하면서도 시간 기반 데이터 관리가 필요한 상황에서 유용하게 사용할 수 있습니다. 요구사항기능은 기존 Map과 동일하게 동작해야 합니다.TTL 시간을 생성자로 주입합니다.시간이 지나면 key, Value가 제거됩니다. 구글이 제작한 라이.. 예외 발생 시 롤백 방지하기: Spring에서 독립적인 트랜잭션 설정 방법 프로젝트에서 repository.save() 메서드를 사용했음에도 불구하고 데이터가 커밋되지 않는 문제를 겪은 적이 있습니다. 이 글에서는 문제의 원인과 해결 방법을 공유합니다. 트랜잭션 처리 방식문제의 원인을 파악하기 위해 하나의 쓰레드에서 두 개의 메서드를 사용하며, 각각의 트랜잭션이 어떻게 작동하는지 세 가지 케이스로 살펴보겠습니다. 1. 첫 번째 케이스: 동일 트랜잭션두 메서드(A 트랜잭션, B 트랜잭션)가 동일한 트랜잭션에 포함되어 있습니다. 즉, A와 B가 모두 성공해야 트랜잭션이 커밋됩니다. 만약 B에서 예외가 발생하면, A에서의 작업까지 모두 롤백됩니다. |-----------(A 트랜잭션)-----------| |-----------(.. ELK 스택으로 실시간 로그 수집 및 분석하기: Logback, Filebeat, Elasticsearch, Kibana Quick Starter 서비스를 운영하고 모니터링 하기 위해서 로그 수집은 중요하죠. ELK 스택의 간단한 소개와 사용 방법에 대하여 소개하겠습니다. 우선 로그를 분석하기 위해서는 DB에 쌓여있는 로그가 있어야겠죠. 로그를 수집하기 위해서 아래 것들을 사용할 겁니다.1. 로그 저장 라이브러리 : logback2. 파일로 저장된 로그를 읽어서 네트워크로 로그를 전송하는 프로그램 : filebeat3. 전송받은 로그를 저장하는 프로그램 : elasticsearch4. 로그를 보기쉽게 정렬하고 분석해주는 프로그램 : kibana 로그 저장 라이브러리 [Logback]log4j, slf4j 와 logback 등 여러가지 라이브러리가 있으나,spring boot 1.0.0 버전부터 spring boot starter에 포함된 logba.. 이전 1 2 3 4 5 ··· 8 다음 목록 더보기