전체 글 338

JPA?

JPA: 인터페이스 Hibernate: JPA인터페이스의 구현체. [JPA Components] EntityManager JPA 인터페이스의 일부로 자바 객체 ("@Entity")를 DB에 저장된 데이터와 맵핑 해주는 ORM 기술을 정의한 인터페이스 "@Entity" 어노테이션을 달고 있는 Entity 객체들을 관리하며 실제 DB테이블과 맵핑하여 데이터를 조회/수정/저장 하는 기능을 수행한다. PersistenceContext라는 논리적인 영역을 두어 내부적으로 Entity의 생애주기를 관리한다. Entity의 생애주기 New 처음 생성되어 아직 EntityManager의 관리를 받지 않는 상태. 즉 순수한 자바 객체 상태라고 보면 된다. Managed EntityManager에 의해 관리되고 있는 단계..

Java/JPA 2022.10.30

Annotation 정리

[AutoConfigurationBefore] Target.class 전에 어노테이션이 선언된 Class를 진행한다. [ConditionalOnProperty] Spring 기반 Application에서는 구성 속성의 존재와 값에따라 조건부로 빈을 생성해야 하는 케이스가 있다. ex) 속성 값을 "prod" 혹은 "test"로 설정했는지 여부에 따라 운영이나 테스트 데이터베이스를 가리키도록 Datasource 빈을 등록할 수 있다. 이럴때 사용하는 케이스 ConditionalOnProperty 어노테이션을 사용하면 구성 속성의 존재여부에 따라 조건부로 빈을 등록할수 있게 되는 것

Bean 생성

BeanDefinitionRegistryPostProcessor Spring에서 Bean을 동적으로 생성하는 방법 중 하나. 스프링에서는 보통 정적으로 Bean을 생성한다. 근데 DcmDatasource 같은 경우는 properties파일을 읽어다가 여러 개의 DcmDataSource Bean을 생성해야 한다. (configuration에서 dcm properties수가 몇개가 될 지 모르는 상황) 결국 동적으로 Bean을 생성해줘야하는 상황이다. 이럴 때 사용할 수 있다. ex) configuration에 언급된 에이전트 개수 (DB A서버,DB B서버..) 만큼 datasource를 만들어야 하는 상황 샘플코드 BeanDefinitionRegistryPostProcessor를 사용하기 위해서는 인터페..

Auto Configuration

[Auto Configuration?] AutoConfiguration을 알아보기 전에 "@SpringBootApplication"을 먼저 알아본다. "@SpringBootApplication"은 3가지 어노테이션을 합친것 "@SpringBootConfiguration": "@Configuration"과 같은 기능을 한다. "@EnableAutoConfiguration": "/reousrce/META-INF/spring.factories중 EnableAutoConfiguration에 정의된 Configuration들을 자동으로 빈등록한다. "@ComponentScan": 컴포넌트 어노테이션을 모두 스캔해서 빈으로 등록 이 때 ComponentScan이 먼저 일어난 후 AutoConfiguration의 B..

Fluentd vs Logstash 비교해보기..?

로그를 수집하고 분석할 때 ELK Stack은 매우 유용하게 사용되어 왔다. fluentd는 Docker나 kubernetes 환경과 같은 마이크로 서비스의 로깅에 인기를 끌고 있다. (fluentd가 CNCF의 일부이고, Treasure Data (고객데이터플랫폼 구축 클라우드 서비스?) 를 기반으로 구축되었기 때문) 어떤 사례에 어떤 도구를 사용하는 것이 좋을지 비교해본다. [Logstash vs Fluentd 비교] 항목 Logstash Fluentd 비고 코드 언어 JRuby (Java 필요) CRuby (Java 필요 X) 오픈 소스 Apache 2.0 라이센스 오픈소스 Apache 2.0 라이센스 오픈 소스. CNCF. 이벤트 라우팅 if-else 조건 기반 태그 기반 이벤트에 태그를 지정하는..

Fluentd - Kafka 로컬 파이프라인 구축해보기

fluentd를 통한 데이터 파이프라인 구축을 위해서 로컬환경에서 fluentd - kafka로 이어지는 파이프라인을 구축해본다. [Docker Container로 간단히 구동하기] Docker-Image Pull docker pull fluent/fluentd:edge-debian Fluentd 설정 파일 생성 http input을 stdout으로 출력하는 형식으로 테스트한다. $ sudo vim fluentd.conf @type http port 9880 bind 0.0.0.0 @type stdout Docker Run # RUN $ sudo docker run -d --name fluentd -p 9880:9880 -v $(pwd):/fluentd/etc fluent/fluentd:edge-debi..

Fluentd란?

[Fluentd?] 로그 수집기 (보통 로그 수집의 목적으로 사용하나 다양한 데이터 소스로부터 데이터를 받아 처리할 수 있음) C와 Ruby로 개발됨. fluentd로 전달된 데이터는 tag, time, record (JSON)으로 구성된 이벤트로 처리됨. 원하는 형태로 가공 후 다양한 목적지 (ES, Kafka etc..)로 전달 될 수 있음. Filter, Buffer, Parser를 직접 설정할 수 있는 것이 가장 큰 장점 데이터 유실을 막기 위해 메모리와 파일 기반의 버퍼 시스템을 사용. Failover를 위한 HA구성도 가능. Use-Cases Application Log 수집 mongodb와 같은 DB에 데이터 수집 스트림 데이터 처리 Tag fluentd에서는 Tag를 통해 이벤트가 흘러가면..

Streaming?

[Why Streaming?] 데이터를 처리하는 역사를 따라가보면 Data Warehouse - Batching - Streaming 순으로 발전해왔다. Data Warehouse 클라우드 이전 시절에는 Data Warehouse만을 사용하였고, 이 공간 자체는 한정적이지 엄격한 schema를 기반으로 분석을 위한 데이터만 추출하여 저장하는 방식으로 사용하였다. 그리고 데이터를 실제로 사용하는 시점은 데이터가 모두 이관된 이후 BI툴을 이용한 접근만이 가능하였다. Batch 하둡의 Batch 시스템이 나오고나서 다양한 schema를 사용할 수 있었지만 여전히 배치가 끝난 후 데이터에 접근할 수 있었다. Streaming 다양한 schema 뿐만 아니라 Ingestion (데이터를 빼오는 시점)에 바로 데..

Source, Sink별 Connector 정리

개인적으로 생각하는 Source, Sink별 사용할 만한 Connector를 정리해봄. Source Sink 용도 Tool 비고 참조 Kafka Kafka 기존 토픽 메시지 가공 후 새로운 토픽 생성 Ksql, Flink 스트림 처리 Kafka Elasticsearch 데이터 이관 logstash kafka input: https://www.elastic.co/guide/en/logstash/current/plugins-inputs-kafka.html output: https://www.elastic.co/guide/en/logstash/current/plugins-outputs-elasticsearch.html Kafka Mongodb 데이터 이관 logstash mongodb input은 없음. ka..

Apache Flink란?

[Apache Flink?] 분산 스트림 처리를 하는 엔진으로 "unbounded", "bounded" 데이터에 대해 상태가 있는 (stateful) 스트림 처리를 하는데 적합한 프레임 워크 비슷한 프레임워크들 중에 Spark, Kafka Streams, Storm 등이 있음 Spark: 마이크로 배치 Kafka Streams: Data Source로 Kafka만 지원함. Storm: Exactly Once 처리를 지원하지 않음. [Unbounded(무한한)와 Bounded(경계있는) 데이터의 처리 ] 모든 종류의 데이터는 이벤트 스트림으로 생성될 수 있다. ex) 카드거래, 센서측정, 로그, 웹 사이트의 사용자 행동 이러한 데이터는 Unbounded 혹은 Bounded 스트림으로 처리될 수 있다. Un..

Docker Build를 이용해서 커스텀 컨테이너 이미지 만들기

기본 이미지를 바탕으로 추가적인 명령어를 실행하여 원하는 이미지를 생성할 수 있다. [작업순서] Dockerfile 생성하기 docker build 명령어로 이미지 생성하기 Dockerfile 생성하기 본 logstash이미지에는 여러 플러그인들이 설치되어 있지만 원하는 플러그인이 없을 수도 있다. (ex: mongdb plugin) 이 경우 기본 이미지를 불러온 뒤 추가 명령어를 수행하여 mongodb 플러그인을 설치한 후 그것을 이미지화 시킬 수 있다. 파일이름은 반드시 Dockerfile로 해야한다. //logstash 기본 이미지 (Docker Hub 경로 입력..?) FROM logstash:7.17.0 //mongodb 플러그인 설치 커맨드 RUN logstash-plugin install l..

Docker 2022.10.29

Logstash를 이용한 Mongdb - Kafka 파이프라인 구성

목차 [개요] 로컬환경에서 Logstash를 활용하여 Mongodb 데이터를 Kafka로 이관하는 작업을 검증해본다. Source: Mongodb Sink: Kafka [준비물] Docker (Docker-compose 필요) Mongodb, Kafka 등을 컨테이너로 구동할 Docker-Compose.yml 파일 Datagrip: Mongodb에 데이터를 넣고 확인할 도구 Kafka-ui: 카프카 어드민 Logstash [작업순서] Docker-Compose.yml 파일 작성 mongodb, zookeeper, kafka, kafka-ui 구동 Datagrip으로 mongodb 접속 database 생성 collecction (table) 생성 document (row) 생성 logstash 세팅 mo..

Logstash

목차 [Logstash란?] 데이터 파이프라인 구조에서 데이터의 집계, 변환, 저장 역할을 수행함. Logstash는 형식이나 복잡성과 관계 없이 데이터를 동적으로 수집, 전환, 전송할 수 있다고 한다. grok을 이용해 비구조적 데이터에서 구조를 도출하여 IP 주소에서 위치 정보 좌표를 해독하고, 민감한 필드를 익명화하거나 제외시키며, 전반적인 처리를 손쉽게 해주는 역할을 한다. Components Source : 모든 형태, 크기, 소스의 데이터 수집 데이터의 매우 다양한 시스템에 매우 다양한 형태로 보관되어 있다. Logstash는 이같이 다양한 시스템에서 데이터를 가져오는 다양한 소스를 지원한다. Filter : 데이터 이동 과정에서의 구문 분석 및 변환 Logstash의 필터는 데이터가 소스에서..

Kafka Connector 개요

[Kafka Connect] 카프카는 프로듀서와 컨슈머 클라이언트를 통해 메시지 파이프라인을 구성할 수 있다. 하지만 파이프라인 구성을 위해 매번 프로듀서와 컨슈머를 개발하는 것은 쉽지 않다. => 카프카와 외부 시스템 간의 파이프라인 구성을 더욱 쉽고 간편하게 해주는 도구. Source Connector : 외부 시스템 -> 커넥트 -> 카프카 Sink Connector : 카프카 -> 커넥트 -> 외부 시스템 특징 다양한 Connector들을 지원한다. But 기능적으로 완벽한 것 같지는 않다. Connector 구축 및 관리를 위한 REST API를 지원한다. Connector별로 라이센스가 다르다. (ex: Elasticsearch Sink Connector는 Confluent 유료 라이센스) C..

Kafka/Connect 2022.10.29

Kafka 토픽명에 날짜가 포함된 경우 오래된 날짜의 토픽 주기적으로 삭제하기

일배치 작업을 위해 날짜가 포함되어 생성된 Kafka 토픽이 있을 수 있다. ex) topic-20221026 이 경우 시간이 흐를수록 토픽은 쌓이기만하므로 정기적으로 삭제해줄 필요가 있을 수 있다. 아래와 같은 스크립트 작성 후 Jenkins에서 스케줄링하는 방식으로 시도 #30일전 이름을 가진 토픽들을 배열에 담음 OLD_DAY=`date +%Y%m%d -d -30day` TOPICS=(`sudo kafka-topics --bootstrap-server localhost:9092 --list | grep $OLD_DAY`) #배열을 순회하면서 삭제 for topic in ${TOPICS[@]} do sudo kafka-topics --bootstrap-server localhost:9092 --del..

Kafka 2022.10.27

Ubuntu에서 Jenkins 스크립트 실행 시 sudo 권한 부여하기

Jenkins에서 쉘 스크립트를 실행하려고 아래와 같은 커맨드를 입력하면 오류가 난다. sudo 권한이 없기 때문 sudo sh /home/jaeshim/test2.sh sudo: no tty present and no askpass program specified jenkins 계정으로 jenkins 서비스를 구동하고 있을 경우 jenkins 계정에 sudo 권한 부여하기 # root로 전환 $ su - # visudo 열어서 sudoers 변경 $ visudo # root 아래에 다음 구문 추가 jenkins ALL=(ALL)NOPASSWD: ALL # Ctrl+X, Y, Enter 로 저장 재실행 성공 [Test] $ /bin/sh -xe /tmp/jenkins464703208738675039.sh..

Jenkins 2022.10.27

ClassPath (클래스패스) 란?

[Classpath?] 클래스패스란 말그대로 Java에서 클래스를 찾기위한 경로를 뜻함. Java는 JVM에서 실행되는데, 빌드 과정에서 .java라는 소스코드가 바이트코드인 .class 형태로 변환된다. 이때 Java Runtime으로 이 .class 파일에 포함된 명령을 실행시키려면 먼저 이 파일을 찾을 수 있어야 한다. 이 때 사용하는 것이 classpath이다. 참조 https://effectivesquid.tistory.com/entry/%EC%9E%90%EB%B0%94-%ED%81%B4%EB%9E%98%EC%8A%A4%ED%8C%A8%EC%8A%A4classpath%EB%9E%80

Java 2022.10.27

데이터 인프라 이해하기

[데이터 인프라의 목적] 비즈니스 리더들의 결정을 도와주기 서비스나 제품을 데이터의 도움을 받아 발전시키기 데이터 웨어하우스? 데이터 인프라의 기초는 각종 운영시스템이다. 이 데이터들을 분석하고 싶으면 각각의 분석 도구를 붙여아 한다. 어느 순간부터는 통합된 데이터 분석 환경이 필요하게 되었다. 그래서 다양한 소스로부터 데이터를 저장하는 DataWarehouse라는 곳이 필요하게 됨. 데이터 유형의 차이 운영시스템(Normalized Schema): 모든 데이터를 쪼개서 관리함. Warehouse(Dimensional Schema): 분석을 위한 단순한 데이터들만 관리함. [ETL, ELT] ETL이란 데이터의 추출(Extract), 변환(Transform), 로드(Load)를 나타내며 조직에서 여러 시..

Data Pipeline 2022.10.23