Java CompletableFuture java 5에서 Future interface 는 비동기식 연산이 기능하도록 추가되었지만, 계산을 결합하거나 발생 가능한 오류를 처리할 수 있는 방법은 없었다. . java 8은 Future interface, CompleteStage interface 를 구현한 CompletableFuture class 를 선보였다. CompletableFuture 클래스는 다른 단계들과 결합할 수 있는 비동기 연산 단계에 대한 계약을 정의한다. 추가로, 비동기 연산 단계 및 오류 처리를 위한 약 50가지의 다양한 방법을 제공한다. CompletableFuture with Encapsulated Computation Logic public static CompletableFut..
Java Garbage Collection(GC) Effective Java 3/E 책을 보면서 GC에 대한 이야기가 많이 언급되었다. 한 번쯤 공부해 두면 도움이 될 것 같다는 생각에 관련 기사를 읽어보며 정리를 해보았다. ... 애플리케이션에서 성능의 가장 중요한 측면 중 하나는 올바른 GC를 선택하고 이를 최적화는 것이다. 최적의 GC 선택은 각 애플리케이션의 동작 및 요구사항에 따라 달라지므로 자바 개발자는 GC를 이해하는 것이 중요하다. Memory management and avoiding memory leaks 자바는 객체 사용 후 메모리에서 각 객체를 제거하는 자동 GC 실행 애플리케이션에서 생성된 자바 객체는 힙이라는 메모리 세그먼트에 저장 애플리케이션이 새 객체를 생성하고 힙이 가득 차..
Firebase 구글에서 제공하는 모바일 앱/웹을 위한 플랫폼인 Firebase 을 알아보려고 한다. AWS 같은 클라우드 컴퓨팅 플랫폼으로 기대(?)했었는데.. 알고 보니 백엔드의 역할을 대신해 주는 플랫폼으로 보인다.😥 . 인증, 데이터베이스, 스토리지, 푸시 알림 등의 기능을 제공하여 백엔드 개발 없이 프론트 개발만으로도 빠른 앱/웹 개발이 필요한 사람들에게는 유용할 것 같다. 백엔드 개발을 해야 하는데.. 필요가 없다니..🥲 백엔드 개발이 필요 없는 플랫폼인만큼.. Spring-boot 프로젝트를 firebase 에 배포할 수는 없어 보이고 필요하다면 별도 서버에 배포가 필요해 보인다. . Firebase 를 알아보는 김에 Spring-boot 와 연동까지는 해보자. Spring-boot 와 Fi..
Jenkins REST API in JAVA 특정 시기마다 대략 20개 정도의 배치를 Jenkins 에서 수동 재기동해야 하는 일이 있다. 가끔씩? 종종? sometimes.. 있는 일이긴 하지만 너무나 귀찮은 일이다. 한 번의 어떠한 동작으로 이 귀찮은 일을 처리할 수 있는 방법을 떠올리다 Jenkins API 를 활용해 보자는 생각이 들었다. . 이제 하나의 API 호출만으로 20개 정도의 배치가 Jenkins 에서 실행되도록 해보자. 참고로, jenkins-rest 라이브러리를 활용할 수도 있지만 REST API 호출을 적용해볼 예정이다. API Token REST API 사용을 위해 먼저 사용자 API Token 이 필요하다. 아래 경로에서 토큰을 추가할 수 있다. 설정 경로 Jenkins 메인 ..
Spring Batch & Jenkins 구동 방식 개선 현재 실무에서 스프링 배치의 구동 방식이 아래와 같다 Deploy Tool 배치 프로젝트 특정 브랜치의 jar 파일을 배치 서버에 배포 Jenkins Build periodically - Schedule 설정 Execute shell 을 통한 배치 실행 쉘에는 파라미터, 프로파일 설정과 jar 파일로 배치 잡을 실행하는 커멘드가 포함 현상 현재 구동 방식에서는 한 가지(한 가지가 아닐 수도 있지만..) 문제가 있었다. . jar 파일이 배포되는 사이 배치 잡이 실행되거나, 배치 잡이 실행되는 사이 jar 파일이 배포되면 Class 정보를 찾을 수 없다는 예외(java.lang.NoClassDefFoundError, java.lang.ClassNot..
Functional Interfaces in Java Functional Interfaces 한 개의 추상 메서드를 가지는 인터페이스 인터페이스에 여러 개의 디폴트 메서드가 있더라도 추상 메서드가 하나라면 함수형 인터페이스 람다 표현식은 함수형 인터페이스로만 사용 가능 함수형 인터페이스를 직접 만들 경우 @FunctionalInterface 어노테이션을 사용하면, 해당 인터페이스가 함수형 인터페이스 조건에 충족하는지 검증 Multiple non-overriding abstract methods found in interface com.practice.notepad.CustomFunctionalInterface Functional Interfaces in Java 함수형 인터페이스 Descripter Me..
Oracle Select vs OR vs IN 비교 약 2만 건 정도의 데이터를 조회하는 API를 개발해야 하는데, 하나씩 조회, OR 연산자 사용, IN 연산자 사용 중 어떤 방법이 성능상 유리할지 궁금했다. 당연히 모두가 아는 결과를 테스트하는 것일 수도 있지만.. 내 눈으로 직접 확인해 보아야 믿을 수 있을 것 같다.. . 실제 서비스 환경과 동일하게 SpringBoot, MyBatis, Oracle 환경으로 테스트하였고, 오라클에서 IN 절에 허용되는 최대 식은 1,000개인 이유로 1,000건 단위로 분할조회 하도록 하였다. 1,000건이 초과하면 ORA-01795 maximum number of expressions in a list is 1000 예외를 던진다고 한다. (그런데 테스트 당시에..
Spring Assert Statements package org.springframework.util; 인수를 검증하고 예외를 발생시키는 유용한 클래스 Assert Class Spring Assert 특징 Assert 메서드는 정적 예상되는 인수를 가정하고, 조건이 충족되지 않으면 런타임 예외를 발생 첫 번째 매개 변수는 검증을 위한 인수 또는 확인할 논리적 조건 두 번째 매개 변수는 유효성 검사에 실패할 경우 표시되는 예외 메시지 Example public class Car { private String state = "stop"; /** * speed > 0 조건을 충족하지 않을 경우 런타임 예외 발생 */ public void drive(int speed) { Assert.isTrue(speed ..