Spring 142

[Spring for Apache Kafka] 4. Application Events

1. 이벤트Spring Kafka는 여러 소비자 관련 이벤트를 발행함카테고리이벤트명설명주요 속성소비자 생애주기ConsumerStartingEvent소비자 스레드가 생성될 때 발생(poll 시작 전)container, sourceConsumerStartedEvent소비자가 실제로 폴링을 시작하려고 할 때 발생container, sourceConsumerFailedToStartEvent소비자가 시작되지 못한 경우 발생(consumerStartTimeout 초과)container, sourceConsumerStoppingEvent소비자가 정지 직전에 발생container, partitionsConsumerStoppedEvent소비자가 정지된 후 발생container, source, reasonConsumerR..

[Spring for Apache Kafka] 3-1. Receiving Messages: Message Listener

이 문서는 해당 섹션의 일부분만 정리되었음. 1. Message ListenersKafka에서 메시지를 처리하려면 리스너를 제공해야 함인터페이스설명MessageListener개별 메시지 처리AcknowledgingMessageListener메시지 처리 후 수동으로 오프셋을 커밋ConsumerAwareMessageListener메시지 처리 시 Consumer 객체 접근BatchMessageListener배치 메시지 처리BatchAcknowledgingMessageListener배치 메시지 처리 후 수동 커밋 예제더보기더보기MessageListener@KafkaListener(topics = "topic1")public void onMessage(ConsumerRecord record) { System..

[Spring for Apache Kafka] 2. Sending Messages

1. DefaultKafkaProducerFactory기본적으로 모든 클라이언트에서 공유하는 단일 Kafka 프로듀서를 생성 설정) DefaultKafkaProducerFactory더보기@Configurationpublic class KafkaProducerConfig { @Bean public DefaultKafkaProducerFactory producerFactory() { Map configs = new HashMap(); configs.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"); configs.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONF..

[Spring for Apache Kafka] 1. Basic

1. Connecting to KafkaFactory구성 요소역할ProducerFactory메시지 전송을 위한 팩토리 생성ConsumerFactory메시지 수신을 위한 팩토리 생성 FactoryListenerFactory의 Listener는 프로듀서/컨슈머가 만들어지거나 닫힐 때 호출하는 메서드를 정의한 인터페이스생성된 프로듀서/컨슈머의 bean id는 factory의 beanName + kafka client id 패턴으로 정의됩니다. 예제더보기public class MyProducerFactoryListener implements ProducerFactory.Listener { @Override public void producerAdded(String id, Producer produce..

[Spring WebSockets] 2-3. STOMP: 부가 기능

1. Order of Messages브로커에서 클라이언트로 보내는 메시지는 clientOutboundChannel을 통해 전달됩니다.이 채널은 내부적으로 ThreadPoolExecutor(멀티스레드 풀)로 운영되기 때문에, 메시지들이 여러 스레드에서 처리됩니다.그래서 클라이언트가 실제로 받는 메시지 순서가 서버에서 보낸 순서와 다를 수 있습니다. 순서 보장 설정예제) Outbound 더보기@Configuration@EnableWebSocketMessageBrokerpublic class PublishOrderWebSocketConfiguration implements WebSocketMessageBrokerConfigurer { @Override public void configureMessa..

Spring/Spring 2025.05.04

[Spring WebSockets] 2-1. STOMP: 주요 내용

1. STOMP란원래는 스크립트 언어(Ruby, Python, Perl 등)에서 엔터프라이즈 메시지 브로커와 통신할 수 있도록 만들어진 텍스트 기반 메시징 프로토콜.TCP, WebSocket 등 신뢰할 수 있는 양방향 스트리밍 프로토콜 위에서 동작 가능.텍스트 지향이지만, Payload(본문) 는 텍스트 또는 바이너리 모두 지원 가능. 2. 이점항목설명이점@Controller를 통한 메시지 핸들링@MessageMapping 메소드에 메시지 자동 분배 (STOMP destination 기준)- WebSocketHandler 하나로 모든 메시지 처리 X- 코드 구조가 모듈화되고 깔끔해짐Spring Security를 통한 보안 설정인증,권한 제어 가능(STOMP destination + 메시지 타입 기준)- ..

Spring/Spring 2025.05.03

[Spring WebSockets] WebSockets

1. WebSocket 소개WebSocket 프로토콜 (RFC 6455)클라이언트와 서버 간에 하나의 TCP 연결 위에서 양방향(full-duplex) 통신 가능.HTTP를 기반으로 동작하지만, HTTP와는 다른 프로토콜이다.80, 443 포트 사용기존 방화벽 규칙 재사용 가능. 참고사항WebSocket 서버가 nginx 같은 프록시 서버 뒤에 있을 경우, 업그레이드 요청을 프록시가 제대로 전달하도록 설정 필요.클라우드 환경에서는 WebSocket 지원 여부를 클라우드 제공업체 문서에서 확인해야 함. 2. WebSocket API설정WebSocketConfigurer 오버라이딩 예제더보기@Configurationpublic class WebsocketConfig implements WebSocketCon..

Spring/Spring 2025.05.02

[자바 ORM 표준 JPA 프로그래밍] 16. 트랜잭션과 락, 2차 캐시

김영한 님의 "자바 ORM 표준 JPA 프로그래밍" 책을 정리한 포스팅 입니다.1. 트랜잭션과 락NON-REPEATABLE READ사용자 A, B가 동시에 같은 데이터를 수정 → 나중에 저장한 B의 값만 반영되어 A의 수정사항이 유실됨.트랜잭션만으로는 해결 불가능 (트랜잭션 범위를 넘어선 문제)해결 방법설명구현 방식마지막 커밋만 인정마지막에 커밋한 트랜잭션의 값이 저장됨(이전 변경 내용이 덮어씌워짐)버전 관리 없이 단순히 UPDATE 수행최초 커밋만 인정먼저 커밋한 트랜잭션만 인정이후 커밋은 버전 불일치로 예외 발생JPA 낙관적 락 적용 (@Version)충돌 내용 병합동시에 수정된 데이터를 병합하여 둘 다 반영OptimisticLockException 발생 시 직접 예외 처리 낙관적 락과 비관적 락구분..

[자바 ORM 표준 JPA 프로그래밍] 15. 고급 주제와 성능 최적화

김영한 님의 "자바 ORM 표준 JPA 프로그래밍" 책을 정리한 포스팅 입니다.1. 예외 처리JPA 예외 변환서비스 계층이 JPA 구현 기술에 의존하지 않게 하기 위해 예외를 추상화항목설명기능 제공 클래스PersistenceExceptionTranslationPostProcessor적용 방식@Repository가 붙은 클래스를 대상으로 AOP 적용JPA 예외를 스프링 예외로 변환 (DataAccessException 등) JPA 표준 예외PersistenceException (RuntimeException 하위 클래스)구분설명롤백 필수(심각한 예외)예외 복구 시, 커밋 ❌- EntityExistsException: 엔티티 영속화 시도 중, 이미 같은 엔티티가 있음- EntityNotFoundExcepti..

[자바 ORM 표준 JPA 프로그래밍] 13. 웹 애플리케이션과 영속성 관리

김영한 님의 "자바 ORM 표준 JPA 프로그래밍" 책을 정리한 포스팅 입니다.1. 트랜잭션 범위의 영속성 컨텍스트기본 전략구분내용생명 주기트랜잭션과 영속성 컨텍스트는 같은 생존 범위를 가짐- 트랜잭션이 시작될 때 영속성 컨텍스트 생성 (초기화 상태)- 트랜잭션이 종료될 때 영속성 컨텍스트 종료공유- 같은 트랜잭션 간 같은 영속성 컨텍스트를 공유함- 다른 트랜잭션 간 다른 영속성 컨텍스트를 가짐 예시) 공유더보기같은 트랜잭션@Test@Transactionalvoid same_transaction() { User user1 = entityManager.find(User.class, 1); user1.setName("test"); searchName();}private void search..