전체 글75 [ETC] 분산 트랜잭션 처리 전략 MA 환경에 적용하기(1) 들어가기 전하나의 서비스가 특정 비즈니스 로직을 수행할 때 종종 다른 서비스와 연계되어 함께 작업을 진행해야 할 때가 많습니다. 이때 두 가지 이상의 서비스에서 트랜잭션이 실행되면 "모두 실패하거나" 또는 "모두 성공하거나" 하는 상황이 자연스럽게 요구됩니다. 일부 서비스는 작업이 절반만 완료되고 다른 서비스는 작업이 실패하는 경우를 상정하고 시스템을 설계하지 않을뿐더러 그런 일은 발생해서는 안되기 때문입니다.또 다른 예로 사용자 경험을 개선하기 위해 빠른 응답을 제공하기 위해서 서비스 로직이 비동기로 처리되는 경우도 있습니다. 예를 들어 회원 가입 후 안내 메일을 발송하는 로직을 있을 때 이 메일 발송 기능이 특정 이유로 오래 걸린다면 사용자는 가입이 완료되었다는 응답을 지연받게 됩니다. 이를 방지하기.. 2024. 10. 8. [Java] Stream 과 Optional 의 map, flatMap 출처 Java 의 Stream API 는 컬렉션 데이터를 효율적으로 처리하기 위한 도구로 이때 자주 사용되는 map 과 flatMap 메소드는 각각 변환과 스트림 평면화를 담당합니다. 비슷하게 Optional 클래스도 map 과 flatMap 메소드를 제공하는데 Optional 은 null 처리를 깔끔하게 하기 위한 도구로 map 과 flatMap 을 사용하면 더 안전하고 직관적으로 데이터를 다룰 수 있습니다.Streammap()map 은 Stream API 가 제공하는 중간 연산 메소드로 각각의 엘리멘트에 접근하여 특정 작업을 수행하고 그 결과를 새로운 스트림으로 반환합니다.데이터를 변환하고자 할 때 매우 유용하게 사용됩니다. 아래 예제를 통해 Member 객체 리스트에서 이름만 추출해 리스트로 변환하.. 2024. 9. 6. [Spring] SpringBoot 의 다중 요청 처리 이전 글에서 자바의 스레드와 스레드풀에 대해 다루며 스레드를 이용해 여러 작업을 동시에 처리하는 방법 그리고 스레드풀을 통해 효율적으로 스레드를 관리하는 방법에 대해 알아보았습니다. 이제 스레드와 스레드풀의 개념을 조금 더 확장해서 스프링 부트를 사용하면서 서버에서 여러 사용자의 요청을 동시에 처리하는 상황에 대해서 살펴보도록 하겠습니다.MVC출처위 이미지는 사용자의 요청이 서블릿을 통해 컨트롤러 그리고 서비스와 리포지토리로 전달된 후 다시 응답이 사용자에게 돌아가는 과정을 설명합니다. 사실 우리가 흔히 보는 MVC 구조는 한 사용자의 요청 흐름을 설명하는 데 중점을 둡니다. 하지만 실제 애플리케이션 환경에서는 많은 사용자가 동시에 요청을 보내며, 이러한 요청은 모두 서버에서 병렬로 처리되어야 합니다. .. 2024. 8. 22. [Java] Thread Pool 이전 글에서 스레드에 대해 알아보았습니다. 스레드는 병렬 처리를 가능하게 하여 여러 작업을 동시에 실행할 수 있게 해주지만 사실 스레드를 직접 생성하고 해제하는 것은 상당히 복잡함을 요구합니다. 자원: 스레드 생성 시 운영체제는 스레드에 필요한 메모리와 다른 자원을 할당해야함.시간: 스레드를 생성하고 해제하는 작업은 시간 소모적이기 때문에 이로 인한 오버헤드가 발생할 수 있음. 관리: 스레드를 직접 관리하는 것은 동시성 문제, 스케줄링, 예외 처리등 다양한 문제들이 복잡하게 엮여 있기 때문에 오류가 발생하기 쉬움. 즉 위와 같은 문제들로 인해 요청이 빠르게 많이 들어 오고 가는 실제 운영 환경에서 지속적으로 스레드를 생성하게 되면 어느 순간 응답이 불가능한 상태에 빠지게 됩니다. 이런 상황 속에서 조.. 2024. 7. 18. [Java] Thread Thread출처프로세스는 할당받은 자원을 소유하는 일종의 컨테이너로 OS 에 의해 스케줄링 되어 할당됩니다. 프로세스는 방대한 크기를 가지기 때문에 정해진 시간에 처리가 불가능하므로 단위를 나누게 되는데 그 나누어지는 단위가 경량 프로세스(light process)인 스레드입니다.하나의 프로세스는 여러 스레드를 포함할 수 있으며 멀티 스레딩(Multi Threading) 기능을 통해 여러 스레드들을 동시에 실행하여 메모리와 같은 해당 프로세스의 리소스를 공유합니다. 여러 스레드들이 프로세스의 자원을 공유한다는 것은 프로세스 내에서 생성된 모든 스레드가 동일한 메모리 공간과 시스템 자원들을 함께 사용할 수 있음을 의미합니다.기본적으로 프로세스는 OS 에서 할당한 자체 리소스를 처리하기 위해 생성, 삭제 및.. 2024. 6. 30. [Java] Native Method 얼마 전 Java 의 Thread 클래스 소스 코드를 들여다보던 중 native 키워드가 붙어 있는 메소드들을 발견했습니다. 특이한 점이 native 키워드를 포함하고 있는 메소드들은 그 구현체를 찾아볼 수 없었는데 도대체 이 메소드들은 어떻게 작동하는 것인지에 대한 궁금증이 생겼습니다. 따라서 이번 포스팅에서는 Java 의 Native Method 에 대해 알아 보도록 하겠습니다.JNI위에서 소개한 native 메소드를 알아 보기 전에 먼저 Java Native Interface(JNI)에 대해 알아야 합니다.출처JNI 는 Java 프로그램이 다른 언어로 작성된 프로그램과 상호 작용할 수 있게 해주는 인터페이스로 C 와 C++ 로 작성된 프로그램과의 상호작용을 위해 사용됩니다. 즉 JNI 는 C, C+.. 2024. 6. 15. [Spring] Executable JAR JAR 출처 Executable JAR에 대해 알아보기 전에 먼저 JAR가 무엇인지 살펴보겠습니다. JAR는 Java ARchive의 약자로 여러 개의 자바 클래스 파일과 관련 리소스(텍스트, 이미지 등) 및 메타데이터를 하나의 파일로 압축하여 자바 플랫폼에 응용 소프트웨어나 라이브러리를 배포하기 위한 소프트웨어 패키지 파일 포맷입니다. JAR 파일은 실제로 ZIP 파일 포맷으로 이루어져 있어 압축 파일의 형태로 제공되며 이를 통해 효율적인 배포와 관리를 할 수 있습니다 MANIFEST JAR 파일의 기본 메타데이터를 포함하는 파일로 JAR 파일의 루트에 위치하며 JAR 파일에 포함된 리소스 및 클래스에 대한 정보를 제공합니다. JAR 파일 생성시 자동으로 MANIFEST.MF 파일이 생성되며 항상 ME.. 2024. 4. 4. [ETC] Merge 문의 동시성 최근 회사에서 검수 기능을 고도화하는 업무가 있었습니다. 상품을 스캔한 후 적절한 비즈니스 로직에 따라 수량을 데이터베이스에 자동으로 저장하는 로직입니다. @Transactional public void inspectGoods(goods request) { // 상품 정보 조회 Goods goods = findGoods(request); // 상품 상태에 따른 입고 수량 설정 로직 // 상품 검수 merge(goods); } 검수 기능의 흐름은 대략적으로 위 코드와 같습니다. 기존에 존재하던 기능에서 수량 설정 로직만 추가되었고 추가로 QC를 진행 후 정상적인 과정을 통해 운영에 신규 기능이 배포되었습니다. 하지만 며칠 뒤 APM 모니터링을 통해 신규 개발 API 에 primary key violatio.. 2024. 3. 24. [Java] 동기화 동기화 WAS 에서는 많은 사용자의 동시 요청을 처리하기 위해 수십 ~ 수백 개의 쓰레드를 사용합니다. 두 개 이상의 쓰레드가 같은 자원을 이용할 때는 필연적으로 쓰레드 간의 경합이 발생하고 경우에 따라서는 Dead Lock 이 발생할 수 있습니다. 따라서 여러 쓰레드가 공유 자원을 사용할 때 정합성을 보장하려면 동기화 장치로 한 번에 하나의 쓰레드만 공유 자원에 접근할 수 있어야합니다. Java 에서는 Monitor 를 이용해 쓰레드를 동기화합니다. 모든 객체는 하나의 Monitor 를 소유하고 있으며 하나의 쓰레드만이 이를 획득할 수 있습니다. 특정 쓰레드가 소유한 Monitor 를 획득하기 위해서는 Monitor 소유권을 해제할 때까지 Wait Queue 에서 대기해야 합니다. Mutal Exclu.. 2024. 3. 13. 이전 1 2 3 4 ··· 9 다음