13-웹 애플리케이션과 영속성 관리

트랜잭션 범위의 영속성 컨텍스트 스프링 컨테이너의 기본 전략 스프링 컨테이너는 트랜잭션 범위의 영속성 컨텍스트 전략을 기본으로 사용한다. 트랜잭션을 시작할 때 영속성 컨텍스트를 생성하고 트랜잭션이 끝날 때 영속성 컨텍스트를 종료한다. 트랜잭션이 같으면 같은 영속성 컨텍스트를 사용한다. 다양한 위치에서 엔티티 매니저를 주입받아 사용해도 트랜잭션이 같으면 항상 같은 영속성 컨텍스트를 사용한다. 따라서 엔티티 매니저는 달라도 같은 영속성 컨텍스트를 사용한다. 트랜잭션이 다르면 다른 영속성 컨텍스트를 사용한다. 여러 스레드에서 동시에 요청이 와서 같은 엔티티 매니저를 사용해도 트랜잭션에 따라 접근하는 영속성 컨텍스트가 다르다....

2025-11-12 · 5 min · 861 words

properties vs fields

목표 인덱스 mapping 정보에서 properties와 fields의 차이점을 이해한다. properties 서브 필드를 가지고 있는 object와 nested 타입 매핑에서 사용된다. 새로운 속성을 추가하기 위해서 사용한다. fields 같은 필드를 다른 목적으로 사용한다는 의미다. 예를 들어, string 타입의 필드를 full-text search를 위한 text 필드와 정렬을 위한 keyword로 매핑할 때 사용할 수 있다. 참고 자료 https://www.elastic.co/guide/en/elasticsearch/reference/current/properties.html https://www.elastic.co/guide/en/elasticsearch/reference/current/multi-fields.html

2025-10-02 · 1 min · 52 words

Pattern tokenizer

목표 Pattern tokenizer 의 사용법을 이해한다. 사용법 정규식을 이용해서 토크나이징 할 때 사용한다. 패턴을 입력하지 않으면 기본값으로 \W+를 사용한다. 예시 아래와 같이 커스텀 토크나이저를 등록해서 사용할 수 있다. PUT my-index-000001 { "settings": { "analysis": { "analyzer": { "my_analyzer": { "tokenizer": "my_tokenizer" } }, "tokenizer": { "my_tokenizer": { "type": "pattern", "pattern": "," } } } } } POST my-index-000001/_analyze { "analyzer": "my_analyzer", "text": "comma,separated,values" } [ comma, separated, values ] 참고 자료 https://www....

2025-10-02 · 1 min · 72 words

14-스트림 처리

스트림 처리란 무엇인가? 데이터 스트림(이벤트 스트림, 스트리밍 데이터)이란 무한히 늘어나는 데이터세트를 추상한 것이다. 무한이라 함은 끝없이 계속해서 늘어난다는 의미이다. 시간이 흐름에 따라 새로운 레코드가계속해서 추가되기 때문에 데이터세트가 무한해지는 것이다. 데이터 스트림의 또 다른 특성 이벤트 스트림에는 순서가 있다. 데이터 레코드는 불변이다. 이벤트 스트림은 재생이 가능하다. 스트림 처리: 하나 이상의 이벤트 스트림을 계속해서 처리하는 것 스트림 처리는 요청-응답과 배치 처리와 마찬가지로 프로그래밍 패러다임 중 하나다. 요청-응답: 응답 시간이 1밀리초 미만~몇 밀리초 수준인 패러다임으로, 가장 지연이 적은 패러다임이다....

2025-09-07 · 5 min · 922 words

13-카프카 모니터링하기

지표 기초 자바 애플리케이션 모니터링의 기본적인 사항들과 모니터링, 경보 설정의 모범사례를 살펴보도록 하자. 지표는 어디에 있는가? 모든 지표의 출처가 카프카인 것은 아니다. 지푯값은 출처에 따라 다섯 종류로 나눌 수 있다. 애플리케이션 지표: 카프카 그 자체의 JMX 인터페이스에서 나온 지표 로그: 카프카 자체에서 나온 또 다른 타입의 모니터링 데이터. 숫자가 아니라 텍스트 내지 구조화된 데이터이기 때문에 추가 처리를 좀 더 해야 한다. 인프라스크럭처 지표: 카프카의 앞단, 요청이 들어오는 길목에 설치되어 있으며 내가 제어할 수 있는 시스템에서 발생하는 지표(예: 로드 밸런서) 특수 클라이언트 지표: 카프카 외부의 툴에서 나온 데이터....

2025-09-07 · 14 min · 2898 words

12-카프카 운영하기

토픽 작업 토픽 작업을 쉽게할 수 있는 툴은 kafka-topics.sh이다. 역할: 클러스터 내 토픽 생성, 변경, 삭제, 정보 조회 토픽 설정 변경은 kafka-topics.sh에서는 지원 중단 되었으니, 더 강력한 툴인 kafka-configs.sh를 사용하는 것이 좋다. kafka-topics.sh를 사용하려면 --bootstrap-server 옵션에 연결 문자열과 포트를 넣어 줘야한다. 이 장 전체에 걸쳐 모든 툴이 저장된 위치는 /usr/local/kafka/bin/ 디렉토리다. 새 토픽 생성하기 --create 명령을 사용해서 새로운 토픽을 생성할 수 있다. 생성할 떄는 3개의 필 수 인수가 있다. --topic: 생성하려는 토픽의 이름 --replication-factor: 클러스터 안에 유지되어야 할 레플리카의 개수 --partitions: 토픽에서 생성할 파티션의 개수 토픽 이름 짓기 토픽 이름에는 영문, 숫자, _, -, ....

2025-08-31 · 12 min · 2434 words

ELK로 Spring 애플리케이션의 로그 남기기

목표 Spring 애플리케이션의 로그를 남기기 위해 ELK를 구축한다. Spring MVC의 액세스 로그도 ELK에 남기도록 구현한다. ELK란? Elasticsearch, Logstash, Kibana의 약자 Elasticsearch: 검색 및 분석 엔진용 분산 시스템 Logstash: 여러 source로부터 데이터를 수집하고 가공하는 데이터 처리 파이프라인 Kibana: Elasticsearch 데이터 시각화 도구 ELK 작동 방식 Logstash가 다양한 서버, 애플리케이션, 시스템 등에서 생성되는 로그나 데이터를 수집한다. Logstash가 수집된 원본 데이터를 파싱하고, 필드를 추가하거나 불필요한 부분을 제거하여 분석에 용이한 형태로 가공한다. 가공된 데이터는 Elasticsearch에 인덱싱되어 저장된다....

2025-08-19 · 3 min · 443 words

10-클러스터간 데이터 미러링하기

하나 이상의 카프카 클러스터로 구성되는 아키텍처가 필요한 경우가 있다. 여러 개의 별도 클러스터를 운영하는 것은 단일 클러스터를 여러 개 운영하는 것과 같다. 하지만, 클러스터 사이에 데이터를 지속적으로 복사해 줘야 하는 경우도 있다. 미러링: 카프카 클러스터 간의 데이터 복제 미러메이커: 아파치 카프카에서 클러스터간 데이터 복제를 수행하기 위한 툴 클러스터간 미러링 활용 사례 지역 및 중앙 클러스터: 하나의 기업이 지리적으로 분산된 지역, 도시, 대룩 간에 하나 이상의 데이터센터를 가지고 있을 수 있으며, 각각의 데이터센터에 카프카 클러스터가 설치되어 있는 경우 고가용성와 재해 복구: 첫 번째 클러스터의 모든 데이터를 보유하는 여분의 두 번째 클러스터를 준비해 뒀다가 만약의 사태가 발생했을 때 애플리케이션을 두 번째 클러스터를 사용해서 작동함으로써 평상시처럼 작업을 계속하게 할 수 있다....

2025-08-13 · 9 min · 1821 words

Spring Batch에서 Step 흐름 설정하기

배경 Spring Batch에서 하나의 Job이 여러 가지 조건에 따라 다른 step이 흘러가야되는 경우가 필요할 수 있다. 이를 구성할 수 있는 방법을 이해한다. 순차 실행 next() 메서드로 다음으로 실행할 스텝을 선언할 수 있다. 만약 stepA에서 실패하면 해당 Job은 실패처리되고 stepB부터는 실행되지 않는다. @Bean fun testJob(stepA: Step, stepB: Step, stepC: Step) = jobBuilder("testJob") .start(stepA) .next(stepB) .next(stepC) .build() 조건부 실행 on() 메서드로 스텝의 실행 결과에 따라 다음 스텝을 정할 수 있다. on() 메서드는 스텝의 실행 결과인 ExitStatus 의 패턴 매칭으로 동작한다....

2025-08-12 · 3 min · 470 words

9-데이터 파이프라인 구축하기

카프카를 사용한 데이터 파이프라인 구축하는 대표적인 사례 사례1: 아파치 카프카가 두 개의 엔드포인트 중 하나가 되는 데이터 파이프라인 구축 예시: 카프카에서 가져온 데이터를 Amazon S3에 넣거나 몽고DB의 데이터를 카프카로 가져오기 사례2: 두 개의 서로 다른 시스템을 연결하는 파이프라인을 만들면서 그 중간에 카프카를 사용하는 경우 예시: 트위터에서 카프카로 데이터를 전달한 후 다시 카프카에서 엘라스틱서치로 전달함으로써 트위터에서 가져온 데이터를 엘라스틱서치로 보내는 경우 데이터 파이프라인에 있어서 카프카가 갖는 주요한 역할은 데이터 파이프라인의 다양한 단계 사이사이에 있어 매우 크고 안정적인 버퍼 역할을 해 줄 수 있다는 점이다....

2025-08-11 · 11 min · 2209 words

Docker 컨테이너로 싱글 노드 Kafka 브로커 실행하기

목표 테스트 환경에서 사용할 Kafka 브로커를 컨테이너로 실행하는 방법을 이해한다. Kafka 브로커는 KRaft 모드로 실행하여 ZooKeeper 없이 실행 가능하도록 구성한다. KRaft 모드 KRaft 모드가 존재하기 이전에는 Kafka의 메타데이터를 관리하기 위해 Zookeeper 에 의존했다. 이는 여러 문제점이 존재했다. ZooKeeper의 한계로 인해 클러스터의 확장에 한계가 존재 ZooKeeper 자체로도 하나의 분산 시스템이여서 Kafka를 사용하기 위해 2가지 기술의 학습 필요 이를 해결하기 위해서 KRaft 모드가 Apache Kafka 2.8 버전에서 처음 선보였고, 3.3 버전부터 프로덕션 환경에서 사용 가능한 것으로 발표했다....

2025-08-02 · 3 min · 531 words

7-신뢰성 있는 데이터 전달

신뢰성 보장 보장: 서로 다른 상황에서도 시스템이 지킬 것이라고 보장되는 행동 아파치 카프카가 보장하는 것 파티션 안의 메시지들 간에 순서를 보장한다. 만약 메시지 A 다음에 B가 쓰여졌다면, 동일한 프로듀서가 동일한 파티션에 썼을 경우, 카프카는 B의 오프셋이 A보다 큰 것을 보장한다. 컨슈머 역시 A를 읽어온 다음에 B를 읽게 된다. 클라이언트가 쓴 메시지는 모든 인-싱크 레플리카의 파티션에 쓰여진 뒤에야 커밋된 것으로 간주한다. 프로듀서는 메시지가 완전히 커밋된 다음 응답이 올지, 리더에게 쓰여진 다음 응답이 오지 아니면 네트워크로 전송된 다음 바로 응답이 올지 선택할 수 있다....

2025-08-02 · 11 min · 2208 words

2-카프카 설치하기

환경 설정 운영체제 선택하기 아파치 카프카는 다양한 운영체제에서 실행이 가능한 자바 애플리케이션이다. 카프카는 윈도우, macOS, 리눅스 등 다양한 운영체제에서 실행이 가능하지만, 대체로 리눅스가 권장된다. 주키퍼 설치하기 아파치 카프카는 카프카 클러스터의 메타데이터와 컨슈머 클라이언트에 대한 정보를 저장하기 위해 아파치 주키퍼를 사용한다. 주키퍼는 설정 정보 관리 이름 부여, 분산 동기화, 그룹 서비스를 제공하는 중앙화된 서비스이다. 독립 실행 서버이 가능하다. 주키퍼는 고가용성을 보장하기 위해 앙상블이라 불리는 클러스터 단위로 작동하도록 설계되었다. 주키퍼가 사용하는 부하 분산 알고리즘 때문에 앙상블은 홀수 개의 서버를 가지는 것이 권장된다....

2025-08-02 · 13 min · 2658 words

6-카프카 내부 메커니즘

클러스터 멤버십 카프카는 현재 클러스터의 멤버인 브로커들의 목록을 유지하기 위해 아파치 주키퍼를 사용한다. 각 브로커는 브로커 설정 파일에 저장되었거나, 자동으로 생성된 고유 식별자를 가진다. 브로커 프로세스는 시작될 때마다 주키퍼에 Ephemeral 노드의 형태롤 ID를 등록한다. 컨트롤러들과 몇몇의 생태계 툴들은 브로커가 등록되는 주키퍼의 /brokers/ids 경로를 구독함으로써 브로커가 추가되거나 제거될 때마다 알림을 받는다. 만약 동일한 ID를 가진 다른 브로커를 시작한다면, 에러가 발생한다. 브로커가 정지하면 브로커를 나타내는 ZNode는 삭제되지만, 브로커의 ID는 다른 자료구조에 남아 있게 된다....

2025-07-27 · 15 min · 3035 words

Hibernate + MySQL 사용 시 어떤 GenerationType을 사용해야 될까?

목표 MySQL 을 사용 중인 환경에서 Hibernate의 각 GenerationType이 PK를 생성하는 방식을 이해한다. GenerationType GenerationType: JPA에서 PK를 생성하는 전략을 나타내는 enum TABLE: 데이터베이스 테이블을 사용해서 PK 할당 SEQUENCE: 데이터베이스 시퀀스를 사용해서 PK 할당 IDENTITY: 데이터베이스의 식별자 컬럼(MySQL의 AUTO_INCREMENT)을 사용해서 PK 할당 UUID: 애플리케이션에서 UUID를 생성해서 PK 할당 JPA 3.1, Hibernate 6.2부터 지원 시작 AUTO: 사용 중인 데이터베이스 종류에 따라서 자동으로 전략 선택 GenerationType.AUTO의 전략 선택 과정 Hibernate 5.2 Spring Boot 2부터 hibernate....

2025-07-07 · 2 min · 378 words

5-프로그램 내에서 코드로 카프카 관리하기

0.11 부터 프로그램적인 관리 기능 API를 제공하기 위한 목적으로 AdminClient가 추가되었다. AdminClient 개요 비동기적이고 최종적 일관성을 가지는 API 카프카의 AdminClient는 비동기적으로 작동한다. 카프카 컨트롤러로부터 브로커로의 메타데이터 전파가 비동기적으로 이루어지기 때문에, AdminClient API가 리턴하는 Future 객체들은 컨트롤러의 상태가 완전히 업데이트된 시점에 완료된 것으로 간주한다. 이 시점에 모든 브로커가 전부 다 새로운 상태에 대해 알고 있지는 못할 수 있기 때문에, listTopics 요청은 최신 상태를 전달받지 않은 브로커에 의해 처리될 수 있다. 이러한 속성을 최종적 일관성(eventual consistency)이라고 한다....

2025-06-24 · 5 min · 1014 words

15-고급 주제와 성능 최적화

예외 처리 JPA 표준 예외 정리 JPA 표준 예외들은 PersistenceException의 자식 클래스다. 그리고 이 예외 클래스는 RuntimeException의 자식이므로 JPA 예외는 모두 언체크 예외다. JPA 표준 예외는 2가지로 나눌 수 있다. 트랜잭션 롤백을 표시하는 예외: 심각한 예외이므로 복구해선 안 된다. 트랜잭션을 강제로 커밋해도 트랜잭션이 커밋되지 않고 대신 RollbackException이 발생한다. 트랜잭션 롤백을 표시하지 않는 예외 심각한 예외가 아니다. 스프링 프레임워크의 JPA 예외 변환 서비스 계층에서 데이터 접근 계층의 구현 기술에 직접 의존하는 것은 좋은 설계라 할 수 없다....

2025-06-24 · 6 min · 1180 words

JMX와 VisualVM으로 remote 환경에 있는 앱 성능 분석

목표 stage 환경에서 Spring 애플리케이션이 컨테이너로 실행되고 있다. 해당 애플리케이션의 특정 API의 응답 속도가 늦어져서 원인을 파악한다. JMX JMX: JVM 애플리케이션을 관리하고 모니터링하기 위해 제공되는 API JMX 아키텍처 JMX는 3개의 계층으로 구성되어 있다. Instrumentation layer: 애플리케이션에서 관리하고자 하는 자원을 표현하는 MBean 객체를 관리 JVM에서 기본적으로 제공하는 MBean들이 있음 ThreadMXBean: 스레드 수, 스레드별 CPU 시간, 스레드들의 stack trace 정보 등을 제공 MemoryMXBean: 메모리 사용량 제공 JMX agent layer: MBeanServer 존재 MBean 객체들을 등록, 괸리하고 이를 접근할 수 있도록 인터페이스 제공 Remote management layer: JConsole, VisualVM 같은 툴을 가리키는 클라이언트 영역 VisualVM JVM 애플리케이션을 모니터링 하기 위한 툴 jstatd, JMX 등의 방식으로 JVM 애플리케이션과 통신해서 여러 메트릭 정보 확인 가능 Remote 환경의 컨테이너를 VisualVM으로 모니터링 하기 VisualVM을 JVM 애플리케이션과 JMX 연결하여 모니터링 할 수 있다....

2025-06-17 · 2 min · 354 words

5-트랜잭션과 잠금

트랜잭션은 작업의 완전성을 보장해준다. 잠금(Lock)은 트랜잭션과 비슷한 개념 같지만 동시성을 제어하기 위한 기능이다. 반면, 트랜잭션은 데이터의 정합성을 보장한다. 트랜잭션 MySQL에서의 트랜잭션 트랜잭션은 꼭 여러 개의 변경 작업을 수행하는 쿼리가 조합됐을 때만 의미 있는 개념은 아니다. 아래의 예를 본다. SLECT * FROM tab_innodb 트랜잭션을 지원하지 않는다면 1, 2가 부분 저장되고 3만 저장되지 않지만, 트랜잭션이 지원되기 때문에 1, 2, 3 모두 롤백이 되었다. 트랜잭션이 지원되는 않는 코드 부분 업데이트가 발생해서 쓰레기 데이터가 남을 수 있기 때문에, 복잡한 분기처리를 해줘야된다....

2025-06-12 · 9 min · 1705 words

4-유스케이스 구현하기

육각형 아키텍처는 도메인 중심의 아키텍처에 적합하다. 유스케이스 둘러보기 일반적으로 유스케이스는 다음과 같은 단계를 따른다. 입력을 받는다. 입력 유효성 검증은 다른 곳에서 처리한다. (유스케이스 코드가 도메인 로직에만 신경 써야하고 입력 유효성 검증으로 오염되면 안되기 떄문) 비즈니스 규칙을 검증한다. 도메인 엔티티와 유스케이스가 책임을 공유한다. 모델 상태를 조작한다. 영속성 어댑터를 통해 구현된 포트로 변경된 상태를 전달해서 저장될 수 있게 한다. 출력을 반환한다. 입력 유효성 검증 입력 유효성 검증은 입력 모델의 생성자 내에서 이루어진다....

2025-06-12 · 2 min · 391 words