스프링30 Kafka 트랜잭션과 Spring 트랜잭션 시점 차이로 인한 데이터 일관성 문제 들어가며카프카를 사용하면서 카프카 트랜잭션과 스프링 트랜잭션의 시점 차이로 인한 데이터 일관성 문제에 대해 해결한 글을 작성할 예정이다. 이는 결론적으로 트랜잭션과 카프카 이벤트 발행 사이에서 발생하는 정합성 문제이다. 문제 상황발생한 문제의 상황은 트랜잭션 내에서 데이터 변경 후 이벤트를 발행하는 경우, 다른 서비스에서 트랜잭션 커밋 이전의 데이터를 사용할 때이다. 이때 예외가 발생해버리는 것이다. 문제 원인 및 해결트랜잭션이 커밋되기 이전에 카프카 이벤트를 발행하면, 트랜잭션의 실패 여부와 상관없이 이벤트는 발행되도록 구현했던 것이 문제의 원인이었다. 이를 해결하기 위해 TransactionalEventListener를 활용했다. 현재 spring transaction이 후에 kafka 이벤트가 .. Tech/Kafka 2024. 5. 23. [Kafka] 하나의 토픽에 두개의 컨슈머가 구독하면 안되나요? 들어가며개인 프로젝트에서 대규모 데이터 처리를 위해 카프카를 도입했다. MSA를 사용해 서비스를 분리했기 때문에 주문이 들어오면 각 서비스 간에 이벤트를 주고 받게 된다. 주문 취소 기능을 구현하다가 하나의 토픽에 대해 두개의 컨슈머가 구독하여 각 서비스에서 행동을 하도록 구현을 했다. 그러나 하나의 서비스에서만 이벤트를 받아서 동작하였다. 이 문제를 분석하고 해결한 방식에 대해 작성할 예정이다. 문제 발생발생한 문제에 대해서는 이전에 설명한 것과 같다. 다시 간단하게 요약하자면 하나의 토픽을 두개의 컨슈머가 구독한 상황에서 하나의 컨슈머만 이벤트를 처리하고 있다는 것이다.처음에는 파티션이 1개여서 발생한 문제라고 추측을 했다. 그래서 파티션을 2개로 늘려서 다시 시도해봤지만 실패했다.이때 실패한 이유는.. Tech/Kafka 2024. 5. 16. Spring 면접 전 살펴보기 위한 Q&A 35가지 보호되어 있는 글 입니다. 2024. 3. 29. 서블릿(Servlet)이란? 1. Servlet (서블릿) 서블릿은 클라이언트의 요청을 처리하고, 그 결과를 반환하는 Servlet 클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술을 말한다. 간단하게 서블릿은 자바를 사용해 웹을 만들기 위해 필요한 기술이다. 클라이언트가 어떤 요청을 하면 그에 대한 결과를 다시 전송해줘야 하는데, 이러한 역할을 하는 자바 프로그램이다. 예를 들어, 어떤 사용자가 로그인하려고 할 때 사용자는 아이디와 비밀번호를 입력하고 로그인 버튼을 누른다. 그때 서버는 클라이언트의 아이디와 비밀번호를 확인하고 다음 페이지를 띄워줘야하는데 이 역할을 수행하느 것이 서블릿(Servlet)이다. Servlet 특징 1. 클라이언트의 요청에 대해 동적으로 작동하는 웹 어플리케이션 컴포넌트 2. HTML을 사용해 요청에.. Tech/Java 2024. 3. 17. 스프링 순환 참조 에러 발생 및 해결 방법 사전 지식 @Bean 특징 @Bean이 붙은 메서드는 싱글톤이므로 여러번 호출되어도 동일한(하나의) 객체만 return된다고 알고있지만, @Configuration 클래스 내부에서 지정된 @Bean 메서드에만 한정되는 이야기이다. @Configuration 메서드 내부에 있지 않은 @Bean 메서드는 싱글톤을 보장받을 수 없다. 싱글톤 보장 원리 CBLIB(바이트 코드 조작 라이브러리)를 이용하여, @Configuration이 붙은 클래스를 상속한 임의의 클래스를 만들고 그 임의의 클래스를 빈으로 등록한다. 그렇게 빈으로 등록된 클래스 내부의 @Bean 메서드들은 Spring Container에 존재한다면 Spring Container에 존재하는 빈을 반환하고, 없다면 새로 생성하여 빈으로 등록 후 반환.. Tech/Spring 2024. 3. 1. Spring으로 게시판 만들기(1) : 개요 현재 진행하고 있는 프로젝트에서 분실물 찾기 게시판을 담당하여 구현하고 있다. 어떻게 보면 CRUD밖에 없어서 시시하다고 생각할 수 있겠지만 기본은 언제나 중요하다고 하니까. 스스로 기본기가 부족하다고 느꼈고 차근차근 다시 쌓아볼 예정이다. 아직 프로젝트를 완성하진 못했지만 지금까지 구현한 기능에 대해 정리하고, 고민했던 거나 궁금했던 걸 기록해보기 위한 목적으로 작성하게 되었다 ꒰⑅◡̎ ꒱𓈒𓏸 데이터베이스 우선 데이터베이스 설계부터 살펴보면, LostFoundBoard: 분실물 찾기 게시판 LostFoundBoardImage: 분실물 찾기 게시판 이미지 Comment: 분실물 찾기 게시판 댓글 (현재 고민하고 있는 게 초기에는 불필요한 관계라고 판단하여 Comment에서 Member 연관관계를 맺지 않.. Tech/Spring 2024. 2. 22. 예외와 트랜잭션 커밋/롤백 예외가 발생했는데, 내부에서 예외를 처리 못 하고 트랜잭션 범위 밖으로 예외를 던지면 어떻게 될까? 예외 발생 시 스프링 트랜잭션 AOP는 예외 종류에 따라 트랜잭션을 커밋하거나 롤백한다. 언체크 예외인 RuntimeException, Error와 그 하위 예외가 발생하면 트랜잭션을 롤백한다. 체크 예외인 Exception과 그 하위 예외가 발생하면 트랜잭션을 커밋한다. 물론 정상 응답(리턴)하면 트랜잭션을 커밋한다. 테스트 코드 @SpringBootTest public class RollbackTest { @Autowired RollbackService rollbackService; @Test void runtimeException() { assertThatThrownBy(() -> rollbackSe.. Tech/Spring 2024. 1. 3. @Transactional의 타입 : readOnly readOnly 트랜잭션은 기본적으로 읽기 쓰기 모두 가능한 트랜잭션이 생성된다. readOnly=true 옵션을 사용하면 읽기 전용 트랜잭션이 생성된다. 이 경우 등록, 수정, 삭제가 안되고 읽기 기능만 작동한다. readOnly 옵션을 사용하면 읽기에서 다양한 최적화가 발생할 수 있다. [readOnly 옵션이 적용되는 3곳] 프레임워크 JdbcTemplate은 읽기 전용 트랜잭션 안에서 변경 기능을 실행하면 예외를 던진다. JPA(하이버네이트)는 읽기 전용 트랜잭션의 경우 커밋 시점에 플러시를 호출하지 않는다. 읽기 전용이니 변경에 사용되는 플러시를 호출할 필요가 없다. 추가로 변경이 필요 없으니 변경 감지를 위한 스냅샷 객체도 생성하지 않는다. 이렇게 JPA에서는 다양한 최적화가 발생한다. JDB.. Tech/Spring 2023. 12. 27. 스프링 트랜잭션 이해 스프링 트랜잭션 추상화 각각의 데이터 접근 기술들은 트랜잭션을 처리하는 방식에 차이가 있다. JDBC 기술과 JPA 기술은 트랜잭션을 사용하는 코드 자체가 다르다 따라서 JDBC 기술을 사용하다가 JPA 기술로 변경하게 되면 트랜잭션을 사용하는 코드도 모두 함께 변경해야 한다. 스프링은 이런 문제를 해결하기 위해 트랜잭션 추상화를 제공한다. 트랜잭션을 사용하는 입장에서는 스프링 트랜잭션 추상화를 통해 둘을 동일한 방식으로 사용할 수 있게 되는 것이다. 스프링은 PlatformTransactionManager라는 인터페이스를 통해 트랜잭션을 추상화한다. PlatformTransactionManager 인터페이스 트랜잭션은 트랜잭션 시작(획득), 커밋, 롤백으로 단순하게 추상화 할 수 있다. 스프링은 트랜잭.. Tech/Spring 2023. 12. 25. 어떤 데이터 접근 기술을 선택하는 것이 좋을까? 비즈니스 상황과 현재 프로젝트 구성원의 역량에 따라서 결정하는 것이 맞다고 생각한다. JdbcTemplate이나 MyBatis같은 기술들은 SQL을 직접 작성해야하는 단점이 있지만 기술이 단순하기 때문에 SQL에 익숙한 개발자라면 금방 적응할 수 있음 JPA, 스프링 데이터 JPA, Querydsl 같은 기술들은 개발 생산성을 혁신할 수 있지만, 학습 곡선이 높기 때문에, 이런 부분을 감안해야 한다. 그리고 매우 복잡한 통계 쿼리를 주로 작성하는 경우에는 잘 맞지 않는다. 개인적으로 추천하는 방향은 JPA, 스프링 데이터 JPA, Querydsl을 기본으로 사용하고, 만약 복잡한 쿼리를 써야 하는데, 해결이 잘 안되면 해당 부분에는 JdbcTemplate이나 MyBatis를 함께 사용하는 것이다. 트랜잭.. Tech/Spring 2023. 12. 22. 스프링 데이터 JPA와 트레이드 오프 스프링 데이터 JPA 구조를 맞추기 위해, 중간에 어댑터가 들어가면서 전체 구조가 너무 복잡해지고 사용하는 클래스도 많아지는 단점이 생겼다. 유지보수 관점에서 ItemRepository의 구현체를 변경할 수 있는 장점이 있다. DI, OCP 원칙을 지킬 수 있다는 좋은 점이 분명히 있다. 반대로 구조가 복잡해지면서 어댑터 코드와 실제 코드까지 함께 유지보수 해야하는 어려움도 발생한다. 다른 선택 직접 스프링 데이터 JPA를 사용하는 방법 DI, OCP 원칙을 포기하는 대신, 복잡한 어댑터를 제거하고, 구조를 단순하게 가져갈 수 있는 장점이 있다. 클래스 의존 관계 런타임 객체 의존 관계 트레이드 오프 DI, OCP를 지키기 위해 어댑터를 도입하고, 더 많은 코드를 유지함 어댑터를 제거하고 구조를 단순하게.. Tech/Spring 2023. 12. 20. SpringBootTest : @Transactional 스프링은 테스트 데이터 초기화를 위해 트랜잭션을 적용하고 롤백하는 방식을 @Transactional 애노테이션 하나로 깔끔하게 해결해준다. 다시 테스트를 실행해도 실패되지 않고 모두 성공한다 마치 롤백되는 것처럼!! @Transactional 원리 스프링이 제공하는 @Transactional 애노테이션은 로직이 성공적으로 수행되면 커밋되도록 동작한다. 그런데 @Transactioanl 애노테이션을 테스트에서 사용하면 아주 특별하게 동작한다. 테스트에서는 스프링은 테스트를 트랜잭션 안에서 실행하고, 테스트가 끝나면 트랜잭션을 자동으로 롤백시켜 버린다. @Transactional이 적용된 테스트 동작 방식 테스트에 @Transactional 애노테이션이 테스트 메서드나 클래스에 있으면 먼저 트랜잭션을 시작한.. Tech/Spring 2023. 12. 15. 이전 1 2 3 다음 728x90 반응형