Spring/Spring

Spring/Spring

[Spring] 테스트 코드를 작성할 때 @Transactional을 주의하라

개요 테스트 수행 시 데이터를 롤백시키기 위해 @Transactional을 붙이는 경우가 있다. 하지만 이는 몇 가지 문제를 일으킬 수 있다. 이번 포스팅에서는 이러한 문제에 대해 소개해보며 테스트 코드 시 무의식적으로 @Transactional을 붙이는 것에 주의를 요하고자 한다. 1. 영속성 컨텍스트에서 새로운 데이터가 조회되지 않을 수 있다 JPA를 사용한 프로젝트에서 테스트 코드에 @Transactional을 붙이면 메서드 단위로 트랜잭션이 적용된다. 이는 테스트 대상(아래 코드에서는 서비스 계층)의 메서드가 트랜잭션을 이어받게 됨을 의미한다. 이 경우 커밋이 테스트 메서드 종료시점에 수행되므로 DAO를 통해 객체를 조회할 때 예상과 다르게 조회될 수 있다. 아래 코드를 살펴보자(Java 코드를 ..

Spring/Spring

[Spring] @Transactional과 메모리 DB를 활용한 데이터 접근 계층 테스트

테스트 원칙 테스트에는 두 가지 중요한 원칙이 있다 테스트는 다른 테스트와 격리해야 한다 테스트는 반복해서 실행할 수 있어야 한다 데이터 접근 계층 테스트 시 데이터 롤백을 시켜주지 않으면 테스트 데이터가 계속해서 누적되고, 서로 다른 테스트 간에 의존성을 가지게 되면서 위 두 가지 원칙을 위반하게 된다 테스트가 끝날 때마다 추가된 데이터를 DELETE 해줄 수 있지만, 이 방법 또한 궁극적인 해결책이 아니다 만약 테스트 과정에서 데이터를 이미 추가했는데, 테스트가 실행되는 도중에 예외가 발생하거나 애플리케이션이 종료되어버려서 테스트 종료 시점에 DELETE가 이루어지지 않으면 테스트 데이터가 그대로 남아있게 된다 트랜잭션과 롤백 전략 트랜잭션을 사용하여 이런 문제를 해결할 수 있다 다음 순서와 같이 각..

Spring/Spring

[Spring] 트랜잭션 동기화 정리

트랜잭션 관련 포스팅 [Spring] 트랜잭션 추상화 정리 [Spring] 트랜잭션 동기화 정리 [Spring] 트랜잭션 AOP 동작 흐름 [Spring] 트랜잭션 AOP 사용 시 주의점 (ft. Spring AOP self-invocation) [Spring] 스프링 트랜잭션 전파와 롤백 [Spring] 트랜잭션 전파 옵션 리소스 동기화 트랜잭션을 유지하려면 트랜잭션의 시작부터 끝까지 같은 데이터베이스 커넥션을 유지해야 한다 실제 SQL 실행은 세션을 통해 실행된다 즉, 세션이 트랜잭션을 시작하고 종료한다 트랜잭션 매니저와 트랜잭션 동기화 매니저 스프링은 트랜잭션 동기화 매니저를 제공한다 트랜잭션 동기화 매니저는 ThreadLocal을 사용해서 커넥션을 동기화해준다 트랜잭션 매니저는 내부에서 이 트랜..

Spring/Spring

[Spring] 트랜잭션 추상화 정리

트랜잭션 관련 포스팅 [Spring] 트랜잭션 추상화 정리 [Spring] 트랜잭션 동기화 정리 [Spring] 트랜잭션 AOP 동작 흐름 [Spring] 트랜잭션 AOP 사용 시 주의점 (ft. Spring AOP self-invocation) [Spring] 스프링 트랜잭션 전파와 롤백 [Spring] 트랜잭션 전파 옵션 트랜잭션 의존 트랜잭션을 사용하는 코드는 데이터 접근 기술마다 다르다 따라서 데이터 접근 기술이 바뀌면 서비스 계층의 코드도 바뀐다 이는 OCP 원칙을 위반한다 트랜잭션 추상화 public interface TxManager { begin(); commit(); rollback(); } 트랜잭션은 단순하다. 트랜잭션을 시작하고 비즈니스 로직이 끝난 후 커밋이나 롤백을 수행하면 된다 ..

Spring/Spring

[Spring] 스프링 DataSource 간단하게 정리

의미 DataSource는 커넥션을 획득하는 방법을 추상화하는 인터페이스이다 해당 인터페이스의 핵심 기능은 커넥션 조회 하나이다 public interface DataSource { Connection getConnection() throws SQLException; } 정리 대부분 커넥션 풀은 DataSource 인터페이스를 이미 구현해뒀으므로 개발자는 구현체가 아닌 해당 인터페이스에만 의존하도록 코드를 작성하면 된다 만약 커넥션 풀 구현 기술을 변경하고 싶으면 구현체만 갈아끼우면 된다 스프링은 DriverManager도 DataSource를 통해서 사용할 수 있도록 DataSource 인터페이스를 구현한 DriverManagerDataSource라는 구현 클래스를 제공한다 스프링은 설정 파일을 읽어들..

코택
'Spring/Spring' 카테고리의 글 목록 (3 Page)