본문 바로가기

전체 글

Prefect 파이썬과 Prefect를 이용한 배치 프로세스 자동화 Prefect를 사용하여 데이터 워크플로우를 자동화하고 관리하는 방법을 알아봅시다. Prefect란 무엇인가? Prefect는 파이썬으로 구축된 현대적인 워크플로우 오케스트레이션 플랫폼입니다. 데이터 워크플로우를 자동화하고, 조정하며, 모니터링하는 것을 목적으로 설계되었습니다. Prefect는 배치 프로세스를 스케줄링하고, 데이터 파이프라인이 원활하게 실행되도록 보장하며, 오류를 우아하게 처리하는 데 이상적입니다. 시나리오: 엑셀 데이터 처리 및 API 요청 이 시나리오에서는 엑셀 파일에서 데이터를 로드하고, API에 POST 요청을 하는 배치 프로세스를 자동화하는 방법을 Prefect를 사용하여 다루게 됩니다. 다음과 같은 단계를 포함합니다: 엑셀 .. 더보기
Blocking IO 와 Non-Blocking IO Blocking I/O Blocking I/O는 I/O 작업이 완료될 때까지 해당 스레드가 대기하는 방식입니다. 예를 들어, 파일에서 데이터를 읽는 작업을 수행하는 경우, 데이터 읽기가 완료될 때까지 스레드는 블록되어 다른 작업을 수행할 수 없게 됩니다. 스레드의 상태 Blocking I/O 작업 중에는 스레드가 "Blocked" 상태가 되며, 이 상태에서는 CPU가 해당 스레드를 실행하지 않습니다. 스레드는 I/O 작업이 완료될 때까지 대기합니다. CPU의 상태 스레드가 블록된 동안 CPU는 다른 스레드나 프로세스의 작업을 실행할 수 있습니다. 만약 다른 실행 가능한 스레드가 없다면, CPU는 유휴 상태가 될 수 있습니다. CPU 유휴 상태 방지 CPU의 유휴 상태를 방지하기 위해서는 Non-Block.. 더보기
Java OOM 발생 시퀀스 자바에서 힙 메모리에 객체를 할당할 때 메모리가 부족한 상황과 그에 따른 가비지 컬렉터의 역할을 UML 시퀀스 다이어그램을 통해 살펴보려고 합니다. Client가 객체를 생성하려고 JVM에게 요청합니다. JVM은 HeapMemory에서 충분한 메모리 공간이 있는지 확인합니다. 만약 메모리가 충분하지 않다면, JVM은 GarbageCollector를 호출하여 사용되지 않는 객체들을 제거하고 메모리를 회수하도록 합니다. 가비지 컬렉션 후, HeapMemory는 다시 메모리 상태를 확인합니다. 4.1 만약 여전히 메모리가 충분하지 않다면, HeapMemory는 JVM에게 "Out of Memory Error"를 보냅니다. 이 상황에서 프로그램은 종료되거나 예외 처리를 통해 복구될 수 있습니다. 4.2 만약 메.. 더보기
Java Heap 메모리 할당 과정 시퀀스 Client가 JVM에게 새 객체를 생성하라는 요청을 합니다. JVM은 HeapMemory에 충분한 메모리가 있는지 확인합니다. 만약 메모리가 충분하지 않다면, HeapMemory는 GarbageCollector를 호출하여 불필요한 객체를 제거하고 메모리를 회수합니다. 메모리 회수 후, HeapMemory는 JVM에게 메모리가 충분함을 알립니다. JVM은 HeapMemory에 객체를 할당하고 초기화합니다. 마지막으로, JVM은 Client에게 객체의 참조를 반환합니다. 더보기
JMX (Java Management Extensions) 이해하기 및 모니터링 도구 자바 개발에 매우 유용한 JMX (Java Management Extensions)에 대해 알아보고, 이를 활용하여 어플리케이션을 모니터링 할 수 있는 다양한 도구들에 대해 알아봅니다 JMX 란? JMX는 자바 어플리케이션을 관리하고 모니터링하기 위한 표준 방법을 제공하는 기술입니다. JMX를 사용하면, 개발자는 자바 어플리케이션의 성능을 실시간으로 모니터링하고, 어플리케이션의 상태를 변경하며, 디버깅 정보를 얻을 수 있습니다. JMX는 MBean (Managed Bean)이라는 구성 요소를 사용합니다. MBean은 어플리케이션의 특정 부분을 나타내며, 이를 통해 어플리케이션의 상태 정보를 조회하거나 설정할 수 있습니다. JMX를 활용한 모니터링 도구 JMX를 활용하여 어플리케이션을 모니터링 할 수 있는.. 더보기
문자열에서 첫 번째 고유 문자 찾기 주어진 문자열에서 첫 번째 고유 문자의 인덱스를 반환하세요. 고유 문자가 없으면 -1을 반환 fun firstUniqChar(s: String): Int { val frequency = IntArray(26) for (i in s.indices) { frequency[s[i] - 'a']++ } for (i in s.indices) { if (frequency[s[i] - 'a'] == 1) return i } return -1 } 더보기
문자열의 모든 순열 fun permute(str: String, l: Int, r: Int, result: MutableList) { if (l == r) result.add(str) else { for (i in l..r) { val swapped = str.toCharArray().apply { this[l] = this[i].also { this[i] = this[l] } }.joinToString("") permute(swapped, l + 1, r, result) } } } fun getAllPermutations(s: String): List { val result = mutableListOf() permute(s, 0, s.length - 1, result) return result } 더보기
가장 긴 공통 접두사 fun longestCommonPrefix(strs: Array): String { if (strs.isEmpty()) return "" strs.sort() val first = strs[0] val last = strs[strs.size - 1] var i = 0 while (i < first.length && first[i] == last[i]) i++ return first.substring(0, i) } 더보기