본문 바로가기
관리자

Programming-[Backend]/Java

(43)
[TIL] mockStatic 개요static 클래스를 테스트해야할 경우가 발생했다. 아래와 같이 Spring의 의존성 없이 Factory 메서드로 DI를 구현할 때, Factory 자체를 mock 처리해야했다. SmsServiceFactory.get(config.getConfig()).send(normalizeMobileNumber, smsText); 이 때 SmsServiceFactory의 get 메서드 자체를 mock 처리하기 위해서 mockStatic을 사용했다. 기본적으로 Mockito는 인스턴스 메서드(Mock 객체)만 지원하지만, Java의 static 메서드는 인스턴스 없이 호출되므로 기본적인 @Mock이나 when()을 사용할 수 없다. 이를 해결하기 위해 Mockito 3.4+ 버전부터 mockStatic()을 제공..
.jar java SPI 모듈 개발: Factory Pattern(w/o Spring), ServiceLoader, @AutoService 배경Java용 SPI .jar 파일을 build하여 다른 프로젝트에 dependency 형태로 추가하여 사용하는 작업이 필요했다. 구체적으로는 keycloak의 provider를 .jar로 개발해야하는 상황이였다. 순수 Java로 개발하는 경우, Spring의 의존성을 최대한 지양하는 것이 좋다. 다른 프로젝트에서는 Java만을 통해 해당 .jar를 사용할 것이기 때문이다.  1. Factory Pattern기존에 Spring을 사용할 때는 dependency injection을 위해 @Autowire 등을 사용하여 한 객체에서 다른 객체의 Bean을 참고하도록 처리했다. 그러나 Spring을 사용하지 않을 때는 직접 구현체를 넣으면 될 것이다. 예시를 들자면 아래와 같다. public class Tes..
[TIL] JVM HeapSize, HeapDumpPath 설정 buildPack의 bootBuildImage를 통해 JvmOption을 줄 때, 아래와 같이 설정함 static def getEnvs(heapDumpPath, envVal) {def jvmOptions = ["-Xms512m","-Xmx1024m","-XX: MaxDirectMemorySize=100M","-XX:+HeapDumpOnOutOfMemoryError","-XX:HeapDumpPath=${heapDumpPath}"]return [ "BPE_DELIM_JAVA_TOOL_OPTIONS": " ", "BPE_APPEND_JAVA_TOOL_OPTIONS": jvmOptions.join(" ")] Heap Memory Size를 512 ~ 1024 MB로 설정, nio 패키지..
Virtual Thread 기초 kakao tech meet 영상을 보고 요약했다.https://www.youtube.com/watch?v=vQP6Rs-ywlQ  실무에서 써야하는데 단순히 설정값만 넣어주면 되긴하는데 어떤 배경이 있는지 알고는 써야할 것 같아서 정리해본다.  Virtual ThreadJDK21에 추가된 경량 스레드OS 스레드를 그대로 사용하지 않고 JVM 내부 스케줄링을 통해서 수 십 ~ 수 백만개의 스레드를 동시에 사용할 수 있게 해줌   기존 Thread 문제 Thread per request기본 Web Request 처리 방식은 Thread per request인데, OS 스레드 개수 제한으로 인해 개수를 늘릴 수가 없었다. Blocking I/OThread에서 I/O 작업 시 Blocking이 일어나면서 처리시..
비동기 작업: @Async 어노테이션, 스레드 관리 배경서버에서 polling을 해야하는 상황이 생겼다. 아키텍처상 여러 서버들이 통신을 주고 받는데, 일렬로 구성된 3가지 서버에서 중간 서버의 코드를 작성해야하는 상황이였다. 구체적으로는 keycloak과 중간서버가 사용자의 인증을 기다려야하는 상태였다(아래 그림에서 External Auth Server).  External Auth Server는 Keycloak으로부터 인증 요청이 오면, 일단 201로 응답을 한 뒤 AD에 요청을 보내고 polling을 통해 AD의 승인 여부를 기다린다. polling하는 코드는 대략 아래와 같다.@Async protected CompletableFuture> pollingAuthResult(String authReqId, String realmId, String c..
[TIL] Docker image JVM Heap 크기 및 옵션 설정, buildpack-gradle bootBuildImage, Packeto buildpack 1. buildpack 개념과 bootBuildImage 원래 애플리케이션을 이미지로 만들어내기 위해서 Dockerfile을 작성하였다. 이 과정은 보통 애플리케이션의 파일들을 COPY 명령어(레이어)로 도커 환경 내로 모두 복사하고, ENV, CMD, ENTRYPOINT와 같은 명령어들을 모두 작성하는 방식으로 진행한다. buildpack은 Dockerfile을 직접 작성하는 과정을 한 번 더 캡슐화하여 이미지를 편리하게 만들 수 있게 만든 라이브러리다. 유명한 Cloud Native Computing Foundation(CNCF)의 프로젝트의 일환이며, 2018년 Heroku에서 Cloud Native Buildpacks 프로젝트를 시작하였다. 이후 open-source 형태로 Packeto buil..
자바 기초 강의 정리 - 8. 클래스 패스, JAR 인프런 얄코의 제대로 파는 자바 강의를 듣고 정리한 내용이다. 중요하거나 실무를 하면서 놓치고 있었던 부분들 위주로만 요약 정리한다.자세한 내용은 강의를 직접 수강하는 것이 좋다.https://www.inflearn.com/course/%EC%A0%9C%EB%8C%80%EB%A1%9C-%ED%8C%8C%EB%8A%94-%EC%9E%90%EB%B0%94/dashboard    1. 소스패스, 클래스 패스 현재 위치, 패키지 위치 정보 등을 나타낸다. 컴파일 시: -sourcepath 옵션을 주어 소스패스를 사용한다.실행 시: -classpath 또는 -cp 옵션을 주어 클래스패스를 사용한다. 소스 패스 예제소스 패스와 관련한 예제를 살펴본다. 아래 명령어를 실행하면 java의 compiler가 Main.j..
자바 기초 강의 정리 - 7. 리플렉션, 어노테이션, 클래스 로더 인프런 얄코의 제대로 파는 자바 강의를 듣고 정리한 내용이다. 중요하거나 실무를 하면서 놓치고 있었던 부분들 위주로만 요약 정리한다.자세한 내용은 강의를 직접 수강하는 것이 좋다.https://www.inflearn.com/course/%EC%A0%9C%EB%8C%80%EB%A1%9C-%ED%8C%8C%EB%8A%94-%EC%9E%90%EB%B0%94/dashboard    1. 리플렉션 런타임에 클래스, 인터페이스, 메소드, 필드 등을 분석하고 조작할 수 있는 기능이다. 적절히 사용하지 않으면 성능, 보안 등에 문제가 발생할 수 있다.  1.1 Class 자료형reflection을 이용하면 class 자료형을 통해 특정 클래스의 정보들을 불러올 수 있다.public class reflection { ..