반응형 분류 전체보기343 2개의 멀티 트랜잭션 안정적으로 다루기 2개의 다른 트랜잭션을 안정적으로 다루기 위한 고민을 담은 글입니다.2개의 다른 트랜잭션을 멀티 트랜잭션이라고 부르겠습니다.바로 시작하겠습니다. 멀티 트랜잭션 핸들링을 고민하게 된 계기 레거시 애플리케이션에서는 XA 트랜잭션을 사용해 멀티 트랜잭션을 핸들링하고 있다.시스템을 이관하면서 XA 트랜잭션을 사용하지말아달라는 요구사항이 들어왔고, 이를 수정해야했다. XA 트랜잭션은 A라는 데이터베이스와 B라는 데이터베이스에서 동시에 데이터를 처리할 때,이들을 하나의 트랜잭션으로 묶어서 ACID를 보장해주는 글로벌 트랜잭션이다. 2개의 DB를 사용하는 이유는?? 2개의 데이터베이스를 A 데이터베이스, B 데이터베이스라고 부르겠다. A 데이터베이스는 애플리케이션의 전체적인 비즈니스 로직 데이터들이 저장되고 수정되며.. 개발 2025. 1. 11. @Version을 사용하지 않는데 ObjectOptimisticLockingFailureException 등장?! 예측하지 못한 예외 등장?! Kotlin + Spring Boot + Spring Data Jpa 등 다양한 기술을 사용한 프로젝트를 진행하고 있다. 어느 평화로운 날.. 갑자기 프로젝트의 스프링 부트 버전에서 Tomcat 취약점이 발견되어 최신 버전 3.4.1로 스프링 부트 버전을 올렸다. 버전을 올리고 테스트 코드를 실행하면서 잘 동작하던 코드에서 ObjectOptimisticLockingFailureException이 발생했다.로그를 보면 StateObjectStateException이 먼저 발생하고 해당 에러를 OptimisticLocking 예외로 감쌌다. 프로젝트에서는 현재 낙관적 락(@Version)을 사용하지 않고 있어서 당황했다.기존 스프링 부트 버전으로 다운 그레이드하면 예외를 던진 코.. 개발/JPA 2025. 1. 9. M1 MAC에서 VAGRANT 활용하기 Vagrant는 가상 머신 환경을 관리하고 자동화하는 도구로, 특히 로컬에서 개발 환경을 코드로 정의하고 프로비저닝하는 데 유용하다. 이번에는 Vagrant를 통해 로컬에서 VM을 다뤄보겠다.먼저 아래와 같이 준비를 진행하자. m1에서 Virtual Box가 아직 베타버전이라 vmware를 활용했다. brew tap hashicorp/tapbrew install hashicorp/tap/hashicorp-vagrantbrew install --cask vmware-fusion 이후 vagrant와 vmware를 연동하기 위한 플러그인을 설치하자.vagrant plugin install vagrant-vmware-desktop 그런데 vmware와 vagrant 플러그인을 다운로드 받아도 다음과 같은 문제.. 개발 2024. 11. 25. Chapter 7. 프로파일링 기법으로 숨겨진 이슈 찾기 매우 중요한 세 가지 프로파일링 기법에 대해 살펴보자. 샘플링을 통해 앱 코드의 어떤 부분이 실행되는지 확인한다.실행을 프로파일링(인스트루멘테이션(instrumentation))하여 잘못된 부분을 찾아내 최적화한다.앱을 프로파일링하여 DB와 통신하는 SQL 쿼리를 식별한다. 1. 샘플링으로 실행되는 코드 관찰 샘플링이란 프로파일러로 앱이 실행되는 코드를 찾아내는 방법이다.실행 자체에 대한 상세 정보는 많이 제공하지 않지만, 어떤 일이 일어나고 있는지 큰 그림을 그려보고 추가 분석에 필요한 정보를 제공한다. 샘플링은 항상 앱 프로파일링의 첫 단계로 활용하는 것이 좋고, 사실 샘플링만으로도 충분한 경우가 많다. 실습 시나리오는 다음과 같다. cURL 또는 포스트맨으로 앱에 구현된 /demo 엔드포인트를 호출.. 독서/자바 잘 읽는 법 2024. 11. 23. Chapter 6. 프로파일링 기법으로 리소스 사용 문제 파악하기 프로파일러는 다양한 난관에 봉착했을 때 앱이 이상하게 작동되는 근본 원인을 밝혀내는 강력한 도구다.프로파일러는 실행 중인 JVM 프로세스를 가로채서 다음과 같이 유용한 세부 정보를 제공한다. CPU와 메모리 같은 리소스가 앱에서 어떻게 소비되는가?실행 중인 스레드와 그 현재 상태는 어떤가?실행 중인 코드 및 특정 조각에서 사용하는 리소스(예: 메서드별 실행 시간)는 무엇인가? 1. 프로파일러는 어떤 경우에 유용할까? 프로파일링 도구가 도움이 되는 상황을 세 가지 정도 꼽아보면 이렇다. 비정상적인 리소스 사용량 식별코드의 어느 부분이 실행되는지 찾기앱 실행 속도가 저하되는 문제 파악 1.1 비정상적인 리소스 사용량 식별 프로파일러는 대개 앱이 CPU와 메모리를 어떻게 소비하는지 파악하는 용도로 쓰인다.앱이.. 독서/자바 잘 읽는 법 2024. 11. 22. Chapter 5. 로그를 활용하여 앱 동작 감시하기 표준 메시지 로그 메시지 포맷부터 먼저 알아보자. 2021-07-25 16:11:01.434 INFO o.s.b.w.embedded.tomcat.TomcatWebServer: Tomcat started on port(s): 8080 (http) with context path 로그 메시지는 타임스탬프, 심각도, 앱의 어느 파트에서 메시지를 남겼는지 등의 정보가 포함된다. 2021-07-25 16:11:01.434: 앱이 메시지를 기록한 시점으로, 시간순으로 정렬된다.INFO: 메시지의 중요도이다.o.s.b.w.embedded.tomcat.TomcatWebServer: 로그 메시지를 남긴 모듈과 클래스를 보통 표시한다.Tomcat started on port(s): 8080 (http) with conte.. 독서/자바 잘 읽는 법 2024. 10. 28. Chapter 2, 3, 4. 디버깅 관련 정리 2. 디버깅 기법으로 앱 로직 이해하기 디버거를 사용할 때 제일 중요한 것은 '내가 조사하려는 로직이 무엇인가?'를 아는 것이다. 브레이크 포인트 앱 실행을 중단 시킬 위치는 브레이크 포인트를 찍어 표시한다.브레이크 포인트를 찍으면 해당 코드라인에서 실행이 중단되고 해당 스코프의 모든 변수와 그 값을 살펴볼 수 있다.또 실행 트레이스를 이용하면 코드 라인을 탐색할 때 현재 위치를 기억할 수 있다. 실행 스택 트레이스 실행 스택 트레이스는 마치 실제 지도처럼 디버거가 중단 시킨 코드 라인의 실행 경로를 나타내며, 이후 어디로 나아가야 할지 결정하는 데 도움을 준다.스택 트레이스는 디버거가 실행을 멈춘 지점까지 메서드가 서로 어떻게 호출하는지 나타내며, 메서드명, 클래스명, 호출한 코드 라인을 자세히 표시한.. 독서/자바 잘 읽는 법 2024. 10. 24. Chapter 1. 앱에서 모호한 부분 밝히기 1. 앱에서 모호한 부분 밝히기 이장의 주요 내용은 다음과 같다. 코드 조사 기법자바 앱을 이해하기 위한 코드 조사 기법 개발자는 코드의 작동 방식을 분석하는 다양한 목적으로 디버깅을 수행한다.예시로는 프레임워크 분석, 문제 찾기등이 있다. 1.1 앱을 더 쉽게 이해하는 방법 현재 디버깅은 문제를 콕 집어 조사하는 것뿐만 아니라, 코드가 어떻게 작동하는지 정확하게 이해하는 행위라고 말할 수 있다. 개발자(특히 초심자)는 디버거 도구를 사용하는 일과 디버깅을 동일시하는 착각을 많이 한다.디버거는 코드를 더 쉽게 이해할 수 있게 도와주는 도구이지, 디버깅 기법이 이것만 있는 것은 아니다. 책에서는 아래와 같은 코드 조사 기법을 배울 것이다. 코드 읽기디버깅로그 분석프로파일링스레드 상태 분석메모리 상태 분석모.. 독서/자바 잘 읽는 법 2024. 10. 21. Java Virtual Thread 정리 이번 포스팅은 아래 영상을 정리한 글입니다.https://www.youtube.com/watch?v=BZMZIM-n4C0&t=2277s Virtual Thread 2018년 Project Loom으로 부터 시작된 경량 스레드 모델이다. jdk 21에서 정식 feature로 추가되었다. 기존 Java Thread 단점기존 자바 스레드는 생성 비용이 컸다. 우리가 스레드 풀을 사용하는 이유는 바로 기존 스레드 생성 비용이 크기 때문이다.기존 스레드는 공간적인 비용도 상당히 크다. 최대 2MB까지 사용하며 많은 메모리를 사용한다.JVM이 아닌 OS에 의해 스케줄링 된다. 스레드 생성 및 소멸과 같은 스케줄링 과정에서 항상 OS와 통신해야하므로 시스템 콜이 발생하는데, 시스템 콜 오버헤드가 발생한다. Virtu.. 개발/Java 2024. 9. 13. 스프링 배치 개선하기 정리 스프링 배치 성능에 관한 아래 두 영상을 간략하게 정리한 글입니다. Batch Performance 극한으로 끌어올리기https://www.youtube.com/watch?v=2IIwQDIi3ys&t=589sSpring Batch 애플리케이션 성능 향상을 위한 주요 팁https://www.youtube.com/watch?v=VSwWHHkdQI4&t=1011s Batch Performance 극한으로 끌어올리기 영상 정리대량 데이터 READbatch 성능 개선에서 제일 중요한 것은 Reader를 개선하는 것이다.일반적으로 Read의 복잡한 조건으로 인해 Write보다 성능의 더 큰 영향을 받는다.읽을 때 항상 Chunk 프로세싱이다. 예를 들어 천 만개를 1000개씩 나누어 1만번 처리한다.JpaPagi.. 개발/Spring Batch 2024. 9. 10. 이미지와 컨테이너 이미지(Image)소프트웨어를 실행하기 위해서는 운영체제, 프로그램이 실행하기 위해서 필요한 요소(런타임, 라이브러리 등)와 실행시킬 프로그램이 필요하다. 이미지를 활용하면 의존 요소를 설치하는 과정 없이 이미지 이름만 지정하면 편하게 프로그램을 구동시킬 수 있다.쉽게 말해 이미지란 파일 시스템의 특정 시점을 저장해 놓은 압축 파일이다. 이미지를 통해 제작 단계에서부터 소프트웨어뿐만 아니라 소프트웨어가 실행하기 위해서 필요한 모든 구성요소(OS, 구성요소, 프로그램)를 미리 준비해서 압축한다. 압축한 이미지를 다운 받아서 run 시키면 격리된 공간에 컨테이너가 실행된다.컨테이너를 실행하면 이미지 안에 있던 프로그램이 실행된 것이다. 이미지는 백업 파일과 같아서 그 저장해 놓으면 프로그램을 실행하는 시점을.. Docker 2024. 9. 3. Main class name has not been configured and it could not be resolved from classpath 해결하기 우리가 스프링 부트를 멀티 모듈로 설계하고 처음으로 루트 모듈을 빌드하다 보면 다음과 같은 에러를 흔하게 접한다. Main class name has not been configured and it could not be resolved from classpath 루트 모듈에서는 실행할 스프링 부트 애플리케이션을 실행할 main 함수가 없기 때문이다. 이에 관한 예외를 해결하는 3가지 방법을 알아보자. 실습을 진행한 모듈은 다음과 같다. 1. 직접적인 mainClassName 지정루트 모듈 build.gradle 또는 build.gradle.kts에 아래와 직접적으로 mainClassName을 지정한다.//build.gradle의 경우bootJar { mainClassName = 'template.ap.. 카테고리 없음 2024. 8. 14. 이전 1 2 3 4 ··· 29 다음 반응형