Kafka 3개의 Broker 환경 구축하기 - Kraft ModeDocker compose를 통해 Kafka 환경을 구축하려고 합니다.Kraft ModeZoopkeeper가 아닌 Kraft 모드로 3개의 Broker 구축NetworkKafka 서비스들이 서로 통신할 수 있도록 독립적인 도커 네트워크를 설정합니다. (kafka_network)VolumeKafka 서비스의 데이터 저장을 위해 각 Broker 별로 도커 볼륨을 설정합니다. (Kafka00, Kafka01, Kafka02)Kafka Kraft 모드란KRaft(Kafka Raft) 모드는 기존의 ZooKeeper에 의존하던 Kafka의 메타데이터 관리를 Kafka 자체에서 처리하도록 하는 새로운 아키텍처입니다. KRaft 모드는 Kafka 2...
Kafka란대규모 실시간 데이터 스트리밍을 처리하고 관리하는 분산 이벤트 스트리밍 플랫폼입니다. 링크드인(LinkedIn)에서 개발되었으며, 현재 오픈 소스로 제공되어 널리 사용되고 있습니다.사용 사례로그 및 메트릭 수집대규모 시스템에서 생성되는 로그와 메트릭 데이터를 카프카에 전송하여 중앙에서 실시간으로 수집, 처리, 분석실시간 데이터 파이프라인데이터를 한 시스템에서 다른 시스템으로 실시간으로 전달하는 데이터 파이프라인 구축에 사용됩니다.실시간 스트리밍 분석금융 거래, IoT 센서 데이터 등 실시간 스트리밍 데이터를 처리하고 분석하는 데 사용됩니다.메시지 큐서로 독립적인 서비스 간의 메시지 교환을 위해 사용됩니다. 이벤트 스트리밍 플랫폼이란이벤트 스트리밍 플랫폼은 데이터를 실시간으로 스트리밍하고 처리..
STMOP란Simple Text Oriented Messaing Protocol의 약자WebSocket 위에서 동작하는 텍스트 기반 메시징 프로토콜클라이언트와 서버가 전송할 메시지 유형, 형식, 내용들을 정의하는 메커니즘기본적으로 Publish-Subscribe 구조로 되어있다.Publish-Subscribe 구조란 **메시지를 공급하는 주체와 소비하는 주체를 분리**해 제공하는 메시징 방법이다. Springboot에서 STOMPWebSocket 기반으로 각 Connection마다 WebSocketHandler를 구현하지 않고 @Controller로 된 객체를 이용해 관리할 수 있음메시지는 STOMP의 Destination 헤더를 기반으로 @Controller 객체의 @MethodMapping 메서드로 ..
Transaction이란트랜잭션은 데이터베이스의 상태를 변화시키기 위해 수행하는 작업의 단위를 의미합니다. 데이터베이스의 상태를 변화한다는 것은 insert, update, delete 같은 SQL 문을 이용해 데이터베이스에 접근하는 것을 의미합니다. ⭐️ Spring에서의 @Transcational 이란Springboot에서 @Transcational은 하나의 함수가 하나의 데이터베이스 트랜잭션의 범위 안에서 실행되어야 하는 것을 명시합니다. 해당 어노테이션을 메서드에 적용시키면, Springboot는 해당 메서드를 시작할 때 트랜잭션을 시작하고, 메서드가 성공적으로 완료되면 트랜잭션을 commit 합니다. (만약, 도중 예외가 발생하면 rollback 합니다.) 이를 통해 비정상적인 종료나 오류로 인..
Stream(). collect()stream(). collect()는 데이터의 중간 처리 후 마지막에 원하는 형태로 변환해 주는 역할을 합니다.stream 요소들을 List, Set, Map 자료형으로 변환stream 요소들의 결합 (joining)stream 요소들의 통계 (최대, 최소, 평균값)stream 요소들의 그룹화와 분할 Collectors.toList()모든 Stream의 요소를 List 인스턴스로 수집하는 데 사용합니다.stream().collect(Collectors.toList());stream().toList(); Collectors.groupingBy()Collectors의 groupingBy()는 일부 속성 별로 객체를 그룹핑하고 결과를 Map 인스턴스에 저장하는 데 사용됩니다...
문제 상황Redis Cache를 사용해서 List를 저장하려고 했습니다.엔티티의 모든 데이터를 저장하는 것은 비효율적이고 참조된 엔티티와의 순환 참조 때문에 List 형태로 저장하기로 했습니다.기존 캐싱 적용 코드@Override@Cacheable(value = "nowRecruit", key = "'sorted'")public List getNowRecruitOrderByClass(LocalDateTime now) { return recruitRepository.findNowRecruitOrderByClass(now);}캐싱한 데이터는 위 코드와 같습니다.List를 응답으로 반환하고 **nowRecruit**라는 캐시의 **sorted**라는 키 값으로 저장됩니다.Redis 설정으로 Value는 ..
JMeter 설치mac 기준으로 jmeter를 설치하는 방법입니다.mac에서는 brew를 통해 간단히 설치하여 사용합니다.brew install jmeteropen /opt/homebrew/bin/jmeterJMeter 테스트 용어Thread Group: 테스트에 사용될 스레드 개수 (쓰레드 1개당 사용자 1명)Sampler: 사용자의 액션 (ex: 로그인, 게시물 작성)Listener: 응답을 받아 리포팅, 검증, 그래프 등 다양한 처리Configuration: Sampler or Listener가 사용할 설정 값 (ex: 쿠키, JDBC 커넥션)Assertion: 응답 확인 방법 (응답 코드, 본문 내용)JMeter 설정 방법1. Thread Group (사용자, 스레드 설정)Thread Proper..
JPA 기본전략을 이해하고 데이터베이스 Default 값 설정 및 데이터 저장 시 설정한 기본값으로 저장하는 방법에 대해 정리하고자 합니다.!!문제 상황Spring Data JPA 라이브러리 ORM을 통해 데이터베이스 기본값을 설정하는데 올바르게 설정되지 않는 문제가 있었습니다. 기존 코드@Entity@Getter@Builder(toBuilder = true)@AllArgsConstructor@NoArgsConstructor(access = AccessLevel.PROTECTED)@Table(name = "application_tb")public class Application extends BaseTimeEntity { @Id @GeneratedValue(strategy = Generatio..