2024/08 22

[Python] Logging - 중복 로깅 해결

현상Python 프로그램의 로깅을 위해 Logging 모듈을 사용하고 있는데, 테스트하다보니 아래와 같이 같은 로그가 두 번 출력되는 현상을 확인할 수 있었다.불필요한 중복 로그를 출력하지 않도록 문제를 해결해보자.  현상 재현먼저 Logger를 편하게 사용하기 위해 다음과 같이 생성 함수를 정의했다.import loggingdef getlogger(title): logger = logging.getLogger(title) logger.setLevel(logging.INFO) formatter = logging.Formatter('[%(asctime)s] [%(module)s.%(funcName)s :%(lineno)d] %(levelname)s:%(message)s') log_st..

Python 2024.08.16

[Python] Requests hooks - 매개변수 전달하기

개요2024.07.18-[Python] Requests hooks - 응답에 대한 콜백 구현하기에서 python requests를 사용하여 응답에 대한 콜백을 구현했는데, 이번 글에서는 콜백 함수에 매개변수를 함께 전달하는 방법을 몇 가지 살펴본다.   partial 활용2022.10.19-[Python] functools.partial - 함수 재활용에서 살펴봤던 partial 함수는 전달받은 함수에 전달받은 인자값을 채워 넣은 함수를 생성할 때 사용한다. 따라서 hooks에 함수를 전달할 때 partial로 인자값이 채워진 함수를 전달할 수 있다. 다만 kwargs로만 참조할 수 있다. 콜백으로 수행할 함수를 다음과 같이 정의했다고 하자.import requestsfrom functools impor..

Python 2024.08.15

[Airflow] 버전 다운그레이드

개요업무 환경에서 Airflow 2.5.1 버전을 사용하고 있었는데 보안적인 문제로 인해 2.8.2 버전으로 업그레이드를 진행하고 있다 그런데 막상 테스트로 업그레이드를 해보니 이슈가 조금 있어서…… 다시 Airflow 2.5.1 버전으로 다운그레이드하고 싶다.2023.03.28-[Airflow] 버전 업그레이드에서는 업그레이드 방법을 정리해 두었으니, 이번 글에서는 다운그레이드 진행 방법을 적어둔다.  방법1. Airflow 서비스 중지 작업을 수행하기 전에 Airflow 서비스를 전부 중지한다. Webserver, Scheduler와 CeleryExecutor를 사용하고 있다면 Flower와 Celery도 중지한다. 추가로 필요하다면 데이터베이스나 설정 파일도 백업해 두도록 한다. 2. Airflow..

Apache Airflow 2024.08.14

[디자인 패턴] Factory method pattern

개요최근 오랜만에 팩토리 패턴이라는 개념을 다시 듣게 되었는데, 어떤 개념이었는지 기억이 잘 나지 않아서 정리해 둔다.  Factory method pattern객체 지향 디자인 패턴, 그중에서도 생성 패턴 중 하나이다.객체를 생성하기 위한 인터페이스는 정의하되, 생성할 클래스는 서브 클래스가 결정하도록 한다. 다른 말로 인스턴스화를 서브 클래스에 연기하게 하는 방법이다.객체를 생성하기 위해서는 종종 포함하기에 적절하지 않은 복잡한 프로세스가 필요할 수 있다. 때문에 팩토리 메서드 패턴은  객체 생성을 위한 별도의 방법을 정의하여 이러한 문제를 처리한다.   구조Product : 최상위 제품 클래스ConcreteProduct : 제품 구현체Creator : 최상위 팩토리 클래스. 추상화된 팩토리 메서드를..

기타 2024.08.13

[Flower] FLOWER_UNAUTHENTICATED_API environment variable is required to enable API without authentication

현상최근 CeleryExecutor를 사용하는 Airflow 버전을 2.5.1에서 2.8.2로 업그레이드를 진행하면서 영향도를 확인하고 있는데, Flower의 업그레이드된 버전에 변경점이 있었는지(확인해 보니 1.2에서 2.0으로 업그레이드되어있었다) Flower를 통한 worker 조작 시 다음과 같은 에러가 발생하면서 설정 변경 등이 적용되지 않았다.문제를 해결해보자.   원인Flower 1.0과 다르게 2.0부터는 보안 상의 이유로 인증, 즉 로그인이 활성화되지 않은 경우에는 기본적으로 API의 사용이 비활성화된다. 따라서 가급적이면 로그인 인증 설정을 활성화하거나 별도의 설정을 통해 로그인 인증 없이 API 사용을 허용해야 한다.   해결이 글에서는 로그인 인증 없이도 API를 사용할 수 있도록 ..

Apache Airflow 2024.08.12

[Python] Requests hooks - 응답에 대한 콜백 구현하기

개요Python Tornado를 사용해서 API를 개발하고 있는데, 다른 서버에 요청을 보낸 후 추가로 처리해야 하는 부분을 콜백 방식으로 구현하려고 한다.관련하여 Requests 라이브러리에서 제공하는 hooks에 대해 적어둔다.   + tornado에서 httpclient.HTTPRequest를 사용하여 요청을 보낼 수도 있는데, 이번 글에선 requests 라이브러리를 사용해 보겠다.  hooksrequests 라이브러리는 요청 프로세스 일부를 조작하거나 이벤트 처리 신호를 보내는 데 사용할 수 있는 hook 기능을 제공한다. requests 응답 후에 호출되는 콜백 함수에 해당한다.실행할 콜백함수는 요청 시 hooks 매개변수에 hook 이름을 키로 하고 실행할 함수를 값으로 하는 딕셔너리 형식으..

Python 2024.08.09

[Jenkins] Script Console - Groovy 스크립트 실행

개요2024.07.16-[Jenkins] RejectedAccessException - Scripts not permitted to use 해결의 에러는 Jenkins 파이프라인이 Groovy 스크립트로 동작한다는 점을 이용해, Groovy 테스트를 시도하다가 만나게 되었는데…… 찾아보니 Groovy 스크립트를 실행할 수 있는 콘솔도 제공을 하고 있었다.이번 글에서는 Script Console 기능을 사용해 Groovy 스크립트를 실행해 본다.  Script ConsoleJenkins는 Script Console을 이용해 Jenkins 컨트롤러나 에이전트에서 Groovy 스크립트를 실행할 수 있다.Jenkins에 웹 기반 Groovy shell을 추가하는 것으로, 사용자가 Script Console을 통..

Jenkins 2024.08.08

[Jenkins] RejectedAccessException - Scripts not permitted to use 해결

현상업무 중 Groovy 코드를 테스트하고 싶은 일이 생겼는데, Java Spring 기반 프로젝트라 단순 print 확인을 위한 프로젝트 세팅을 하기가 좀 번거로운 상황이다. 좀 간편하게 테스트할 방법을 생각해 보다가 Jenkins 파이프라인에서 Groovy 스크립트를 실행할 수 있는 것이 생각나 다음과 같은 코드로 시도해 보았는데……import org.springframework.http.HttpHeadersimport org.springframework.http.MediaTypeimport java.nio.charset.CharsetCONTENT_TYPE = "application/json;charset=utf-8"HttpHeaders headers_1 = new HttpHeaders()header..

Jenkins 2024.08.07

[Snowflake] JSON 구조 데이터 쿼리

개요지금까지 Snowflake 상에서 CSV 데이터를 주로 다루었다. 이번 글에서는 JSON 형식으로 반구조화된 데어티를 쿼리 하는 방법에 대해 적어둔다.  테스트 데이터 저장author_with_header.json 파일을 Snowflake 데이터로 저장해보자. 이를 위해서는 VARIENT라는 형식의 컬럼을 포함하는 테이블을 생성해주어야 한다.CREATE TABLE LIBRARY_CARD_CATALOG.PUBLIC.AUTHOR_INGEST_JSON_2( RAW_AUTHOR VARIANT);VARIENT 형식은 object나 array 등을 포함해 다른 유형의 값을 저장할 때 사용하는 데이터 타입이다. 압축되지 않은 데이터 기준으로 최대 16MB까지의 데이터를 저장할 수 있다. 테이블을 생성했다면 JS..

Snowflake 2024.08.06

[Snowflake] Sequence

개요이번 글에서는 Snowflake에서의 Sequence에 대해서 적어둔다.  Sequence일종의 카운터로 전역적인 수준에서 고유한 값을 생성한다. 따라서 테이블 행에 대한 고유 ID를 만드는 데 사용될 수 있다. 다만 일반적으로 Sequence는 1씩 연속적으로 증가하는 방향으로 동작하는데, Snowflake에서는 연속적인 번호를 생성하지 않을 수도 있다.   생성Sequence는 CREATE 문으로 생성할 수 있다. 시작값과 증가 수준 등을 지정하여 생성한다.CREATE OR REPLACE SEQUENCE garden_plants.flowers.SEQ_AUTHOR_UID start = 1 -- 시작 값 increment = 1 -- 증가 수준 order -- 연속적인 증가 co..

Snowflake 2024.08.05
1 2 3