본문 바로가기

분류 전체보기696

Spring 트랜잭션은 언제 어떻게 롤백 될까? -2편 개요이전 글에서는 Spring의 @Transactional 어노테이션이 기본적으로 어떻게 동작하는지, 그리고 예외 처리에 따라 트랜잭션이 롤백되는 메커니즘에 대해 다루었다. 이번 글에서는 실제 코드와 테스트를 통해 다양한 상황에서 트랜잭션이 어떻게 동작하는지 살펴볼 예정이다. 글을 읽는 분들도 각 상황에서 결과를 예측해 보며 따라가면 이해에 도움이 될 것 같다.동일한 클래스 내에서의 트랜잭션 동작본인 메서드에서 예외 발생 시 롤백다른 메서드 호출 후 예외 발생 시 롤백본인 메서드에서 try-catch로 예외 처리 후 커밋다른 메서드 호출 후 본인 메서드에서 try-catch로 예외 처리 후 커밋본인 메서드에서 noRollbackFor 설정 후 예외 발생 시 커밋noRollbackFor 설정된 다른 메서드.. 2024. 12. 22.
Spring 트랜잭션은 언제 어떻게 롤백 될까? -1편 개요스프링에서 @Transactional 어노테이션을 사용하면 트랜잭션이 자동으로 관리된다. 로직이 성공적으로 처리되면 commit을 통해 데이터베이스에 변경 사항이 반영되고, 오류가 발생하면 rollback을 통해 모든 변경 사항이 취소된다. 다만 이는 기본적인 개념으로 이번 글에서는 더 나아가 세부적으로 롤백이 정확히 언제 발생하고(1편), 특정 상황을 예시로 해당 로직이 롤백이 될지 안 될지에 대해 맞춰보는 식(2편)으로 알아보고자 한다.  Check Exception, Unchecked Exception먼저 자바에서는 예외를 크게 다음과 같이 Exception과 Error 두 가지로 나누고 있다.Exception은 입력 값에 대한 처리가 불가능하거나 프로그램 실행 중에 참조된 값이 잘못된 경우인 .. 2024. 10. 4.
[gradle] implementation, api 차이 개요Gradle에서 의존성을 설정할 때는 compileOnly, runtimeOnly, implementation, api 등 여러 가지 옵션을 사용할 수 있다. 특히 api와 implementation은 외부 라이브러리를 프로젝트에 추가할 때 가장 자주 사용하는 두 가지 방법으로, 이 둘은 모두 라이브러리를 추가하는 기능을 제공하지만 각기 다른 방식으로 동작하기 때문에 차이점을 알아두면 좋다.dependencies { api 'org.apache.httpcomponents:httpclient:4.5.7' implementation 'org.apache.commons:commons-lang3:3.5'}참고로 이전 Gradle 버전에서는 implementation 키워드가 없었고, 대신 comp.. 2024. 9. 7.
Spring Boot에서 여러 Kafka 클러스터 사용하기 개요프로젝트에서 일반적으로 하나의 Kafka 클러스터만을 사용하는 경우가 대부분이지만, 경우에 따라 서로 다른 환경의 Kafka 클러스터에 동시에 연결해야 할 필요가 생길 수 있다.나는 이번에 작업하면서 기존의 연결된 Kafka 클러스터 말고도 또 하나의 새로운 클러스터를 연결해야 했는데, 작업을 진행하면서 얻었던 지식을 공유하고자 작성하게 되었다.  컨슈머 설정Spring Boot는 기본적으로 ConcurrentKafkaListenerContainerFactory를 자동으로 구성하여 Kafka 리스너 컨테이너를 생성한다. 그러나 여러 Kafka 클러스터에 연결하려면 각 클러스터에 대해 별도의 ConcurrentKafkaListenerContainerFactory 빈을 생성하고, 해당 클러스터에 맞는 C.. 2024. 8. 17.
[JPA] deleteAll(), deleteAllInBatch(), deleteInBatch() 정리 개요Hibernate(JPA)에서는 레코드를 삭제할 수 있는 아래의 다양한 메서드들을 지원한다.delete(),deleteById()deleteAll(), deleteAllById()deleteInBatch()deleteAllInBatch(), deleteAllByIdInBatch()다양한 메서드를 제공하는 것은 좋지만, 네이밍만 보고 혼란스러운 것들이 몇몇 있다. 대표적으로 deleteInBatch()와 deleteAllInBatch(), 그리고 deleteAll()과 deleteAllInBatch()와 같은 메서드들이다.이번 게시글에서는 위 메서드들이 실제로 어떻게 삭제를 처리하는지를 살펴볼 것이고, 연관관계가 없는 경우와 연관관계가 있는 경우로 나누어 삭제 동작을 분석해 볼 것이다.  사전 세팅DB.. 2024. 8. 12.
단방향 @OneToMany의 문제점 개요JPA를 학습하다 보면 @OneToMany를 사용할 때 단방향보다는 양방향 매핑을 사용하라는 말을 자주 듣게 된다.왜 그런지 이해하기 위해 단방향 @OneToMany를 사용하는 두 가지 방법을 사용하여 문제점에 대해 살펴보고, 양방향을 사용했을 때 어떤 점이 개선되는지 알아보자매핑 테이블을 사용한 단방향 @OneToMany 동작 과정@JoinColumn 사용한 단방향 @OneToMany  동작 과정양방향 @OneToMany를 사용했을 때의 동작 과정 1. 매핑 테이블 사용매핑 테이블을 이용한 @OneToMany 엔티티 설계 예시는 다음과 같다.@Entity@NoArgsConstructor(access = lombok.AccessLevel.PROTECTED)public class Book { @I.. 2024. 7. 26.
NextStep DDD 세레나데 수료 후기 계기4.30 ~ 6.10까지 DDD 세레나데 6기 과정에 참가했다. 요 과정을 듣게 된 이유는넥스트스텝 강의 중 듣고 싶었던 강의 중 하나였기도 하고,기수별로 거의 일 년에 한 번 열리기에 2년 차인 지금이 적기라 생각했고,DDD관련해서는 책으로 이론공부만 했었는데 실습을 해보고 싶었고,현재 프로젝트에서 이 구조를 기반으로 하고 있기 때문에 업무에 도움이 될 거라 생각했기 때문이다. 커리큘럼강의 커리큘럼은 다음과 같다. 1주차 - 도메인 주도 설계 이해첫 주는 도메인 주도 설계의 등장 배경에 대해서 학습했는데, '도메인', '모델', '도메인 모델', '도메인 주도 설계'라는 단어의 정의에 대해 생각해 보는 시간을 많이 가졌다. 미션에서는 2단계와 3단계가 개인적으로 많은 도움이 되었다.0단계 - JUn.. 2024. 7. 15.
@TransactionalEventListener 사용 시 주의점 문제 상황@Service@RequiredArgsConstructorpublic class CurrentValueChangeService { private final ExampleRepository exampleRepository; private final ApplicationEventPublisher applicationEventPublisher; @Transactional public void changeValue(String value) { Example example = exampleRepository.find(1L); String beforeValue = example.getCurrentValue(); example.updateCurren.. 2024. 7. 3.
도메인 엔티티와 영속성 엔티티 개요소프트웨어 아키텍처에서 도메인 엔티티와 영속성 엔티티를 분리하는 것은 중요한 설계 원칙 중 하나이다. 이 원칙은 클린 아키텍처의 핵심 개념을 기반으로 하며, 도메인 로직과 영속성 계층 간의 의존성을 최소화하여 시스템의 유지 보수성과 확장성을 높이는 데 목적이 있다.이번 게시글에서는 이러한 도메인 엔티티와 영속성 엔티티의 차이점에 대해 알아보고, 이 둘을 분리함으로써 얻을 수 있는 이점과 주의해야 할 점 그리고 언제 분리하면 좋을지에 대해 정리했다.  도메인 엔티티먼저 도메인 엔티티의 개념부터 살펴보면 도메인 엔티티는 비즈니스 도메인 내의 개념을 나타내는 객체로, 전자상거래 시스템에서는 'Order', 'Customer', 'Product'등이 도메인 엔티티가 될 수 있다. 다음은 간단한 예시 코드이다.. 2024. 6. 18.