Java Reflection - Dynamic Object Creation(Constructor<?>)
·
📘 Backend/Java
📚 ConstructorJava의 Constructor는 Java 리플렉션 API에서 제공하는 클래스 중 하나로, 클래스의 생성자(constructor)를 나타내는 객체입니다. Constructor는 java.lang.reflect 패키지의 일부이며, 특정 클래스의 생성자에 접근하거나 실행할 수 있도록 도와줍니다.클래스 로드 및 생성자 조회Class 객체를 사용하여 특정 클래스의 모든 Constructor 객체를 가져올 수 있고, 해당 생성자 파라미터를 알고 있다면 파라미터에 parameterTypes를 넣으면 특정 생성자를 가져올 수 있습니다.만약 가져온 Class에 생성자가 없다면 자동으로 기본 생성자를 포함한 단일 요소 배열로 반환됩니다.Public, Private 모든 생성자 로드getDecla..
Object를 이용한 Thread 간 통신 / 동기화
·
📘 Backend/Java
📚 Object를 이용한 Thread 간 통신 / 동기화지난 글에서 멀티스레딩 환경에서 여러 스레드 간 통신 및 동기화가 필요할 때 Semaphore / Binary Semaphore를 사용 했었습니다.Semaphore - Multi Threading 작업 순서 제어 & 동기화이번 글은 로직의 복잡성이 낮고 간단하며 직관적인 락 제어가 필요한 경우 Object 객체의 wait(), notify(), notifyAll() 을 이용한 동기화/통신 방법에 대한 글을 작성합니다.wait(), notify(), notifyAll() 함수를 사용하면 효율적으로 스레드를 제어할 수 있습니다.📚 wait(), notify(), notifyAll()wait(), notify(), notifyAll()은 Object ..
Semaphore - Multi Threading 작업 순서 제어 & 동기화
·
📘 Backend/Java
📚 Semaphore - Multi Threading 작업 순서 제어 & 동기화멀티쓰레드 환경에서 여러 쓰레드가 협력하여 순차적으로 작업을 처리해야 할 때, 동기화(Synchronization)는 매우 중요합니다. 이번 글에서는 Semaphore와 Custom Barrier 클래스를 활용하여 모든 쓰레드들이 첫 번째 작업을 전부 완료할 떄 까지 Semaphore를 이용해 Blocking 시키고 이후 두 번째 작업을 수행하도록 동기화하는 방법을 작성 하겠습니다.예시로 구현할 로직은 아래와 같습니다.20개의 Thread로 진행작업 1과 2가 있고 20개의 Thread가 작업 1을 모두 완료한 상태가 아니면 작업 2로 넘어가지 않음각 작업 당 Thread들의 실행 순서는 중요하지 않고 20개의 Thread ..
Producer-Consumer Pattern with RabbitMQ
·
📘 Backend/Java
📚 Producer Consumer Pattern기존에 RabbitMQ의 Queue에서 대량의 데이터를 받아서 동시성을 처리할 때 사용하던 방법은,ReentrantLock의 tryLock을 이용해 명시적 Lock을 걸고 임계영역을 보호하는 방법을 사용 중 이었습니다.근데 문제는 평소 AI Engine에서 받은 MQTT 데이터의 흐름이 평상시에는 일정한 개수(1초에 200개 정도) 나오다가AI Engine에 특정 조건이 트리거 되어 특정 모드로 바뀔때 수 없이 많은 데이터가 쏟아져 나올 떄가 있으며, 그 메시지들을 그대로 Consume 해버리게 됩니다.Thread들을 충분히 나누었음에도 부하가 심해 Spring Server가 일시적으로 멈춤, 오작동하거나 API 호출이 안 먹는다거나 이슈들이 많았습니다...
Java에서 Windows Power Shell 명령어 실행
·
📘 Backend/Java
Java에서 Windows PowerShell 명령어 실행 평소에 리눅스 환경의 서버에서 작업을 하다가 윈도우에 서버를 구축하고 Java 프로그램을 돌리던 중, 분석된 RTSP 영상을 HLS로 스트리밍 하는 로직에서 FFmpeg 프로세스가 실행이 안되어 알아 보았습니다. Java 코드에서 OS 마다 실행할 Command를 Runtime의 getRuntime().exec()를 통해 실행합니다. 이 때 Linux와 Windows는 Shell환경이 다르니 당연히 OS에 맞는 Shell을 지정해줘야 제대로 동작 할 겁니다. 잘 동작하는지 테스트 하기 위해 그리고 실시간 영상 변환 프로세스 체크 로직에 Windows 관련 코드를 좀 추가 해주었습니다. 그리고 리눅스와 같은 환경을 만들어 테스트 해보겠습니다. 테스..