반응형

Java 49

GC 모니터링

GC 모니터링이란 GC 모니터링이란 JVM이 어떻게 GC를 수행하고 있는지 알아내는 과정을 말합니다. 예를 들어 Young 영역에 있던 객체를 Old 영역으로 언제 얼마나 이동했는지, stop-the-world가 언제 일어나고 얼마동안 일어났는지 등의 정보를 알 수 있습니다. GC를 모니터링 하는 이유는 JVM이 효율적으로 GC를 수행하는지 파악하고 추가적인 GC 튜닝 작업이 필요한지 확인하기 위해서입니다. GC 모니터링으로 파악한 정보를 바탕으로 애플리케이션을 수정하거나 GC를 튜닝할 수 있습니다. GC 모니터링 방법 jstat jstat은 HotSpot JVM에 있는 모니터링 도구입니다. jstat 이외에 HotSpot JVM 모니터링 도구로는 jps와 statd가 있습니다. Java 애플리케이션을 ..

GC 튜닝

GC 튜닝을 해야하는 이유 일반적으로 Java에서 생성된 객체는 GC가 처리해서 지웁니다. 생성된 객체가 많을수록 GC가 처리해야 하는 대상도 많아지고, GC를 수행하는 횟수도 증가합니다. 즉, 운영하고 만드는 시스템이 GC를 적게 하도록 하려면 객체 생성을 줄이는 작업을 먼저 해야합니다. 만약 애플리케이션 메모리 사용도 튜닝을 많이 해서 어느 정도 만족할 만한 상황이 되었다면, 본격적으로 GC 튜닝을 합니다. GC 튜닝의 목적 Old 영역으로 넘어가는 객체의 수 최소화하기 최신 Java이 아닌 구 버전의 Java는 Eden 영역에서 객체가 처음 만들어지고, Survivor 영역을 오가다가, 끝까지 남아 있는 객체를 Old 영역으로 이동합니다. 간혹, Eden 영역에서 만들어지다가 크기가 커져서 Old ..

Java 10

추가된 기능 로컬 변수 타입 추론 로컬 변수 var를 이용함으로서 컴파일러에게 타입을 추론할 수 있게 되었습니다. public void test() { var message = "Hello, Java 10"; assertTrue(message instance of String); } 로컬 변수 타입 추론은 지역 변수를 초기화하며 선언할 때만 사용할 수 있습니다. var의 잘못된 예시 var n; // var는 초기화 없이 사용할 수 없습니다. var emptyList = null; // 변수 초기화를 null로 할 수 없습니다. var p = (String s) -> s.length() > 10; // 람다 표현식은 명확한 타입 추론을 하기 힘들기 때문에 사용할 수 없습니다. var arr = {1, 2..

Spring Batch Chunk 지향 처리

Chunk란 Spring Batch에서 Chunk란 데이터 덩어리로 작업할 때 각 커밋 사이에 처리되는 row 수를 의미합니다. 즉 Chunk 지향 처리란, 한 번에 하나씩 데이터를 읽어 Chunk라는 덩어리를 만든 뒤, Chunk 단위로 트랜잭션을 다루는 것을 의미합니다. 여기서 Chunk 단위로 트랜잭션을 수행하기 때문에 실패할 경우에는 해당 Chunk 만큼만 롤백이 되고, 이전에 커밋된 트랜잭션 범위까지는 반영이 된다는 것입니다. Chunk 지향 처리의 구조 Reader에서 데이터를 하나 읽어옵니다. 읽어온 데이터를 Processor에서 가공합니다. 가공된 데이터들을 별도의 공간에 모은 뒤, Chunk 단위만큼 쌓이게 되면 Writer에 전달하고 Writer는 일괄 저장합니다. Reader와 Pro..

Java/Spring 2021.03.22

Spring + Hibernate Validator Custom Message

Java Bean Validation 일반적으로 데이터 검증(Validation)은 여러 계층에 걸쳐서 이루어지게 됩니다. 거의 동일한 내용의 검증 로직이 각 계층별로 구현된다면 그것은 중복이고 낭비가 심한 작업입니다. 또한 그러한 경우 각 계층별로 구현된 검증 로직간 불일치로 인해 오류가 발생하기도 쉽습니다. 이를 해결하기 위해 데이터 검증을 위한 로직을 도메인 모델 자체에 묶어서 표현하는 방법이 있습니다. 실제 코드로 표현된다면 너무 장황하고 복잡하기 때문에, Java에서는 Bean Validation이라는 이름으로 Annotation을 데이터 검증을 위한 메타 데이터로 사용하는 방법을 제시하고 있습니다. Hibernate Validator Hibernate Validator는 Bean Validat..

Java/Spring 2020.09.15

Spring Integration

Spring Integration이란 Spring Integration은 스프링 기반 어플리케이션 내에 메시징 기반 서비스를 제공하고 선언적 어댑터를 사용해 외부 시스템과의 통합을 쉽게 해줍니다. 이런 어댑터들은 리모팅, 메시징, 스케줄링과 같이 스프링이 제공하는 기능들을 추상화하고 있습니다. Spring Integration의 컴포넌트 Message Spring Integration에서 메시지란 메타데이터와 함께 결합되어 있는 일련의 자바 오브젝트를 위한 포괄적인 Wrapper를 말합니다. 아래 메시지 인터페이스가 보여주듯이 메시지는 페이로드와 여러 개의 헤더로 구성됩니다. public interface org.springframework.integration.Message { MessageHeader..

Java/Spring 2020.09.15

Spring WebFlux

Bloking I/O Block I/O는 어플리케이션에서 I/O 요청을 한 후, 완료되기 전까지는 Application이 Block 되어 다른 작업을 수행할 수 없습니다. 이는 해당 자원이 효율적으로 사용되지 못하고 있음을 의미합니다. 하지만 실제 어플리케이션들은 Blocking 방식임에도 불구하고 마치 Block이 안 되듯이 동작하는 것처럼 보입니다. 이것은 Single Thread 기반이 아닌 Multi Thread를 기반으로 동작하기 때문입니다. Block 되는 순간 다른 Thread가 동작함으로써 Block의 문제를 해소하였습니다. 그러나 Thread 간 전환에 드는 비용이 존재하므로 여러 개의 I/O를 처리하기 위해 여러 개의 Thread를 사용하는 것은 비효율 적으로 보입니다. Synchron..

Java/Spring 2020.09.13

Spring boot 와 Spring Legacy 비교

Pre-set 설정 빌드 도구로 maven을 사용한다고 가정했을 때, Spring Legacy 프로젝트는 다양한 라이브러리를 pom.xml에 추가하고 추가적인 설정또한 xml로 작성해야합니다. 예를 들어 DB 연결이 들어간다면, pom.xml에 jdbc 관련 라이브러리르 추가하고 ORM을 mybatis를 쓴다면 함께 추가해야 합니다. 하지만 Spring Boot는 많은 사람들이 사용하던 설정을 Pre-set으로 구성해서 제공하므로 https://start.spring.io/에서 원하는 의존성 기능들을 추가한 뒤 다운로드 받고 import하면 빠르게 설정 내용을 프로젝트에 적용할 수 있습니다. WAS Spring Legacy 프로젝트를 진행하게 되면 WAS를 설치하고, 설정하는 등 초기에 적지 않은 시간을..

Java/Spring 2020.09.10

Reactive Stream

Reactive Stream이란 계속적으로 들어오는 스트림 데이터를 효율적으로 처리하기 위해서는 비동기 시스템이 효과적입니다. 비동기 처리를 하면서 가장 중요한 문제는 데이터 처리가 목적지의 리소스 소비를 예측가능한 범위에서 신중하게 제어할 수 있어야 하는 것입니다. 비동기는 네트워크를 통한 서버간의 협업 또는 단일 서버에서 컴퓨팅 리소스를 동시에 사용할 때 주로 사용됩니다. Reactive Stream의 주된 목적은 비동기의 경계를 명확히 하여 스트림 데이터의 교환을 효과적으로 관리하는 것입니다. 즉, 비동기로 데이터를 처리하는 시스템에 어느 정도의 데이터가 들어올지 예측가능하도록 하는 것입니다. Reactive Stream에서는 BackPressure이 이를 달성할 수있게 해주는 중요한 부분입니다. ..

Java/일반 2020.09.09

Java Module

Moudle이 등장하게 된 배경 Java는 public, private와 같은 클래스 수준의 한정자가 있습니다. 그러나 이 한정자들은 클래스까지만 유효하고 패키지를 넘어서면 힘을 잃어버리게 됩니다. 이러한 캡슐화에 대한 지원 부족으로 인해 Java Module이 등장했습니다. 예를 들어, 우리는 JAR로 제공된 패키지의 클래스를 보면 어느 클래스를 써야할 지 알 수 가 없습니다. 대부분의 클래스가 public이고 접근이 가능합니다. 그 안에는 API 설계자가 내부 구현을 위해 만든 내부용 API 문서도 있습니다. 기존에는 내부용 API에 접근이 가능합니다. JAR로 제공되고 문서화가 잘 되더라도 클래스와 메소드가 public이면 API 설계자가 의도하지 않은 호출이 발생할 수 있습니다. Module이란 ..

Java/일반 2020.09.07
반응형