분류 전체보기 1462

[Airflow] 스케쥴 설정 종류

개요지금까지는 Airflow를 개발하거나 운영하면서 주로 cron 방식의 스케줄 설정을 사용하고 있었는데, 최근에 timedelta 객체로 스케줄을 지정하는 방식도 존재함을 확인했다. 그래서 이번 글에서는 Airflow에서 스케쥴을 지정하는 방법에 대해 정리한다.Airflow 2.8 버전을 기준으로 작성한다. Cron기존에도 잘 활용하고 있던 방식으로, cron 표현식이나 cron preset(@daily)이 포함된다. 몰랐지만 datetime.timedelta 객체도 해당된다고 한다.from airflow.models.dag import DAGimport datetimedag = DAG("regular_interval_cron_example", schedule="0 0 * * *", ...)dag =..

Apache Airflow 2026.05.04

[Grafana] Docker Compose 구성 간 마이그레이션

개요bind mount 방식으로 운영 중이던 Grafana를 팀원이 새로 구성한 provisioning 기반 Docker Compose 환경으로 전환하고자 한다. 기존 구성은 호스트의 ./data/ 디렉토리를 직접 마운트하는 방식이었고, 신규 구성은 named volume(grafana-storage)을 사용한다. 기존 운영# AS-ISservices: grafana: image: grafana/grafana-enterprise container_name: grafana restart: unless-stopped ports: - '3000:3000' volumes: - '$PWD/data:/var/lib/grafana' 신규# TO-BEservices: g..

Grafana 2026.04.30

[Grafana] 프로비저닝이란

개요데이터 파이프라인 모니터링을 위한 Grafana 대시보드를 구축한 적이 있다. 로컬에서 대시보드를 만들고 대시보드 Expoert/Import 기능을 활용해 운영 환경으로 마이그레이션 했는데, 데이터 소스 설정을 다시 잡는 등 과정이 매끄럽다는 인상은 받지 못했다. 또, 이후 UI를 통한 대시보드 수정 시 버전 관리를 어떻게 해야 하는지에 대한 의문점이 생겼다.Grafana를 처음 사용할 때는 대부분 UI로 데이터 소스를 등록하고, 대시보드를 만들고, 알림 규칙을 추가한다. 간단한 환경에서는 문제가 없다. 하지만 환경이 둘 이상이 되거나 팀이 함께 사용하는 순간 한계가 드러난다.환경 재현이 어렵다. 로컬에서 만든 대시보드를 운영 환경에 그대로 옮기려면 수동으로 Export/Import를 반복해야 한다...

Grafana 2026.04.29

[Java] static

개요2026.04.22-[Java] 접근 제어자에 이어서 오늘도 변수나 함수 앞에 위치할 수 있는 키워드 중 하나인 static에 대해서 알아보고자 한다. static'고정된'이라는 의미를 가지며, Java에서는 static 키워드를 사용해 static 변수와 static 메서드를 만들 수 있다. 정적 변수, 정적 메서드라고도 하는데 둘을 묶어 정적 멤버, 클래스 멤버라고 말하기도 한다. 정적 멤버는 객체가 아닌 클래스에 고정된 멤버로, 클래스 로더가 클래스를 메모리 영역에 적재할 때 클래스 별로 관리한다. 클래스 로딩이 끝나면 바로 사용할 수 있다. 정적 멤버 생성static 키워드로 생성된 정적 멤버는 Heap이 아닌 Static 영역에 할당된다. static 영역은 모든 객체가 공유하고 있어 ..

Java 2026.04.28

[Java] 접근 제어자

개요최근 Java 코드를 계속 유지보수하고 있는데, 정말 기본적인 public, private 외에는 접근 제어자 개념이 제대로 잡혀 있지 않아 프로그래밍할 때 애로사항이 있다. 이번 기회에 개념을 좀 잘 잡아보려고 한다. 접근 제어자접근 제어자란 클래스, 클래스 멤버(필드, 메서드, 생성자)에 대한 접근 법위를 제어하는 역할을 한다. 필드, 인터페이스를 다른 패키지에서 사용하지 못 하도록 하거나, 객체 생성, 메서드 호출을 제한함으로써 개발자가 의도하지 않은 동작을 방지하기 위해 사용한다. 접근 제어자 종류접근 제어자 자체는 private, protected, public이 존재하며, 만약 세 가지 모두 적용되어 있지 않으면 default가 적용된다.보통 private, protected, pub..

Java 2026.04.22

[Java] 가드 절 (Guard Clause)

개요업무에서 서비스 중인 Java 앱의 코드를 분석하다 보면 메서드 상단에 return 문이 위치하는 경우가 있다.public void process(Data data) { // 가드 절 if (data == null || !data.isValid()) return; // 핵심 로직 System.out.println("Processing...");}주로 짧은 문장이고 괄호 없이 작성되어있는데, 이것은 가드 절(Guard Clause)이라고 한다. 개인적으로는 중첩을 줄이기 위해 사용하게 되던 방식인데, 개념적으로 정리한 적은 없어서 기록해 둔다. 가드 절가드 절은 메서드 진입 시 전제 조건을 검사하고, 조건을 만족하지 않으면 즉시 반환하는 패턴이다. "가드(Guard)"라..

Java 2026.04.20

[Java] 라벨문(Labeled Statement)

개요Java를 break와 continue만으로 루프를 제어하던 중, 중첩 루프에서 원하는 위치로 한 번에 빠져나오지 못해 불필요한 플래그 변수를 쓴 적이 있었다. 이후 라벨문 개념을 다시 떠올리게 되었는데, 이중·삼중 반복문을 마주치는 상황은 생각보다 자주 오는 만큼 기억을 되살릴 겸 내용을 정리한다. 라벨문라벨문(Labeled Statement)은 특정 구문(주로 반복문)에 이름표(label)를 붙여, break 또는 continue가 어느 반복문을 대상으로 동작할지 명시적으로 지정하는 Java의 제어 흐름 문법이다. 일반 break/continue는 자신이 속한 가장 안쪽 반복문에만 영향을 주지만, 라벨문을 사용하면 중첩된 바깥쪽 반복문까지 직접 제어할 수 있다. Java 1.0부터 존재하는 문법..

Java 2026.04.16

[Java] 패턴 매칭

개요최근 Java 코드를 유지보수하고 개발하다 보니 패턴 매칭이라는 개념을 접하게 되었다. 처음에는 정규 표현식과 관련된 내용인가 했는데, 확인해 보니 전혀 다른 개념이라 정리 차원에서 짚고 간다. 패턴 매칭패턴 매칭은 Java 14에서 프리뷰 기능으로 처음 도입되어 Java 16에서 정식 기능으로 확정된 기능이다. 객체가 특정 타입인지 검사하면서 동시에 변수에 바인딩할 수 있게 해 주며, 기존의 타입 체크 + 캐스팅 패턴을 단순화할 수 있다. 기존에는 instanceof로 타입을 확인하더라도, 값을 활용하려면 명시적으로 형변환을 따로 수행해야 했다.Object obj = "Hello Java";if (obj instanceof String) { String s = (String) obj; //..

Java 2026.04.15

[Airflow] TaskFlow - XCOM 값 반환 시 이름 붙이기

개요2023.04.09-[Airflow] @task 의존성 설정에서 TaskFlow는 태스크 간 종속성을 자동으로 계산하고, XCom을 통해 입출력을 처리한다고 정리했다. 기본적으로 TaskFlow를 사용하면 XCom 키는 return_value로 고정되며, 여러 값을 반환하더라도 튜플 형태로 묶여 return_value 하나에 저장된다.그런데 기존의 수동 XCom Push/Pull 방식과 호환되는 코드를 작성해야 하는 상황이 생겼다. 특정 키 이름으로 값을 push 해야 하위 태스크가 그 이름으로 pull 할 수 있기 때문에, return_value 대신 이름 있는 키로 값을 반환하는 방법이 필요했다. 이 글에서는 TaskFlow DAG에서 multiple_outputs을 활용해 키 이름을 포함한 값을..

Apache Airflow 2026.04.14

[Java] Jackson - ArrayNode 다루기

개요Jackson에서 다루는 JsonNode, ObjectNode는 기본적으로 단일 JSON 데이터를 취급한다. 하지만 JSON 데이터는 Array도 지원하고 있다. 때문에 이번 글에서는 Java에서 JSON Array를 다룰 때 사용하는 ArrayNode에 대해 알아본다. ArrayNodeArrayNode는 Jackson 라이브러리에서 JSON 배열([...])을 표현하는 클래스이다. ObjectNode와 동일하게 JsonNode의 자식 클래스이고, 불변성을 가진 JsonNode와 다르게 데이터의 추가와 수정이 가능하다. 사용법생성 및 요소 추가생성은 ObjectNode와 같이 ObjectMapper.createArrayNode를 사용하고, 값 추가는 add 함수를 사용한다.아래는 ArrayNod..

Java 2026.04.13