본문 바로가기

분류 전체보기70

[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.
[Spring] Spring Batch Job 등록부터 실행까지(1) 들어가기 전 이전 글 에서 Spring Batch 실행을 위한 프로젝트 환경 구성 및 예제 Job 을 작성 후 실행해 봤습니다. 그렇다면 Spring Batch 는 Job 을 어떤 식으로 생성하고 실행시키는지에 대해 이번 글을 통해서 알아 보도록 하겠습니다. Step 다음과 같이 Tasklet 으로 구성된 Step 을 Bean 으로 등록합니다. @Bean public Step step(JobRepository jobRepository, PlatformTransactionManager transactionManager) { return new StepBuilder("step1", jobRepository) .tasklet(tasklet(), transactionManager) .build(); } 먼저 S.. 2024. 1. 22.
[Spring] Spring Batch 시작하기 01 Spring Batch 를 학습하기 위한 시리즈 글로 Spring Batch 5.1.0 버전을 기반으로 작성합니다. 프로젝트 환경 Spring Batch 를 실습하기 위해 먼저 프로젝트부터 생성하겠습니다. 다음과 같은 버전으로 프로젝트를 구성했습니다. Gradle(8.2.1) Spring Boot(3.2.1) Java(17) MySql(8.0.23) 또한 실습에 필요한 의존성은 다음과 같습니다. Spring-Data-JPA(3.2.1) Spring-Batch(5.1.0) Lombok(1.18.30) MySql-Connector(8.1.0) 프로젝트 생성 시 Spring Initializr 를 통해 필요한 의존성을 선택하여 생성하면 build.gralde 파일은 다음과 같습니다. plugins { id '.. 2024. 1. 14.
[Java] 데이터 병렬 처리(Java 8) Java 8 자바 8은 스트림 객체와 람다 표현식과 같은 Feature들을 기반으로 함수형 프로그래밍 스타일을 지원합니다. 병렬 스트림은 스트림 API를 기반으로 하여 작성되어 훨씬 편리하게 사용할 수 있으며 람다 표현식 및 함수형 인터페이스를 활용하여 코드를 간결하게 작성할 수 있습니다. 자바에서 지원해주는 병렬 스트림에 대해서 알아 보겠습니다. 병렬 스트림 출처 병렬 스트림은 내부적으로 스트림의 요소를 여러 청크(chunk)로 Fork/Join 프레임워크를 사용하여 분할하고 이 청크들을 각각의 스레드에서 병렬로 처리하는 방식으로 동작합니다. 여러 청크로 분할하여 각 스레드가 독립적으로 작업을 수행하고 그 결과를 나중에 모아서 최종 결과를 생성함으로써 멀티코어 프로세서를 활용하여 작업을 효율적으로 분산.. 2024. 1. 8.
[Java] 데이터 병렬 처리(Java 5, 7) 병렬 처리 병렬 처리(Parallel Operation)란 멀티 코어 환경에서 하나의 큰 작업을 여러 개의 작은 작업으로 나누어 각각의 코어가 병렬적으로 작업을 처리하는 것을 의미합니다. 기존의 직렬 처리(Sequential Processing)에서는 작업이 순차적으로 진행되어 한 번에 하나의 작업만 처리할 수 있었지만 병렬 처리는 여러 작업을 동시에 실행함으로써 전체적인 성능을 향상시킬 수 있습니다. 동시성(Concurrency)과 병렬성(Parallelism) 출처 동시성은 한 번에 많은 일을 처리하는 것이고 병렬성은 많은 일을 동시에 수행하는 것 입니다. -롭 파이크(Robert Pike)- 동시성 동시성은 여러 작업이 시간의 흐름 상에서 서로 겹치게 실행되는 개념입니다. 즉 동시성이란 독립적인 작.. 2023. 12. 31.
[Spring] @Transactional 속성 @Transactional 스프링은 @Transactional 어노테이션을 활용하여 트랜잭션 관리를 단순화합니다. 이는 트랜잭션의 관리를 설정이나 어노테이션과 같은 외부 수단을 통해 선언하는 방식인 선언적 트랜잭션(Declarative Transaction) 방식 중 하나입니다. 스프링은 선언적 트랜잭션을 처리하기 위해 Spring AOP를 활용하여 적용 대상 로직 전후에 트랜잭션 관련 기능을 삽입함으로써 핵심 비즈니스 로직과 트랜잭션 관리를 분리할 수 있습니다. 동작 스프링에서는 트랜잭션을 관리하기 위해 PlatformTransactionManager 이라는 추상화된 인터페이스를 제공합니다. @Transactional 이 적용된 메소드가 호출될 경우 트랜잭션을 시작하고 실행 결과에 따라 Commit 또.. 2023. 12. 24.