@transactional3 @Transactional의 타입 : readOnly readOnly 트랜잭션은 기본적으로 읽기 쓰기 모두 가능한 트랜잭션이 생성된다. readOnly=true 옵션을 사용하면 읽기 전용 트랜잭션이 생성된다. 이 경우 등록, 수정, 삭제가 안되고 읽기 기능만 작동한다. readOnly 옵션을 사용하면 읽기에서 다양한 최적화가 발생할 수 있다. [readOnly 옵션이 적용되는 3곳] 프레임워크 JdbcTemplate은 읽기 전용 트랜잭션 안에서 변경 기능을 실행하면 예외를 던진다. JPA(하이버네이트)는 읽기 전용 트랜잭션의 경우 커밋 시점에 플러시를 호출하지 않는다. 읽기 전용이니 변경에 사용되는 플러시를 호출할 필요가 없다. 추가로 변경이 필요 없으니 변경 감지를 위한 스냅샷 객체도 생성하지 않는다. 이렇게 JPA에서는 다양한 최적화가 발생한다. JDB.. Tech/Spring 2023. 12. 27. SpringBootTest : @Transactional 스프링은 테스트 데이터 초기화를 위해 트랜잭션을 적용하고 롤백하는 방식을 @Transactional 애노테이션 하나로 깔끔하게 해결해준다. 다시 테스트를 실행해도 실패되지 않고 모두 성공한다 마치 롤백되는 것처럼!! @Transactional 원리 스프링이 제공하는 @Transactional 애노테이션은 로직이 성공적으로 수행되면 커밋되도록 동작한다. 그런데 @Transactioanl 애노테이션을 테스트에서 사용하면 아주 특별하게 동작한다. 테스트에서는 스프링은 테스트를 트랜잭션 안에서 실행하고, 테스트가 끝나면 트랜잭션을 자동으로 롤백시켜 버린다. @Transactional이 적용된 테스트 동작 방식 테스트에 @Transactional 애노테이션이 테스트 메서드나 클래스에 있으면 먼저 트랜잭션을 시작한.. Tech/Spring 2023. 12. 15. SpringBootTest : 데이터베이스 분리 로컬에서 사용하는 애플리케이션 서버와 테스트에서 같은 데이터베이스를 사용하고 있으니 테스트에서 문제가 발생함 테스트를 다른 환경과 철저하게 분히해야 함 테스트 전용 데이터베이스를 별도로 운영하는 것임 현재 JdbcTemplate를 사용해서 findItems를 구현한 상태이다. (추후 업로드 예정) findItems: 전체 아이템 조회 쿼리 이후에 다른 테스트와 함께 실행하면 이렇게 에러가 발생한다. 처음 테스트를 실행할 때 저장한 데이터가 계속 남아있기 때문에 두번째 테스트에 영향을 준 것임 save()에서도 동일한 문제가 발생할 것이다. 이 문제를 해결하려면 각 테스트가 끝날 때마다 해당 테스트에서 추가한 데이터를 삭제해야 한다. 💡 테스트는 다른 테스트와 격리해야 한다. 💡 테스트는 반복해서 실행할 .. Tech/Spring 2023. 12. 11. 이전 1 다음 728x90 반응형