여러 개의 테스트를 동시에 실행하기 위해서는 각 테스트가 독립적으로 수행되어야 한다. 즉, 이전 테스트에서 수행한 내용이 다음 테스트에 영향을 미쳐서는 안 된다. 스프링을 사용한다면 @AfterEach 또는 @BeforeEach를 사용하여 각 테스트가 종료될 때마다 클렌징 처리가 가능하다. 이때, deleteAll(), deleteAllInBatch(), @Transactional 중에 하나를 사용하여 클렌징 처리가 가능하다. 셋 다 테스트에서 사용한 데이터를 지운다는 것은 동일하지만, 성능 상에 차이점이 존재한다. 각 방식의 차이점과 무엇을 사용해야 할지 알아보자. 1. 테스트 환경하나의 주문(Order)에는 여러 개의 상품이 포함될 수 있다.하나의 상품(Product)은 여러 개의 주문에 포함될 수..
1. @Transactional트랜잭션이란 데이터베이스의 상태를 변화시키기 위해 수행하는 작업 단위이다. 스프링 프레임워크로 개발하는 경우 보통 Business Layer에 @Transactional을 사용한다. 기본적으로 @Transactional은 CRUD 시에 사용할 수 있다. 즉, Query와 Command를 구분하지 않고 사용할 수 있다.예를 들어, @Transactional을 사용하여 save() 메서드에서 생성된 member 객체를 데이터베이스에 저장할 수 있다. @Transactional을 사용하면 트랜잭션 AOP가 동작하면서 메서드 시작과 끝에 transactional.begin()과 transactional.commit()을 추가하기 때문이다. 단, 중간에 예외가 발생하면 transac..
1. 스프링 AOP란?AOP는 관점 지향 프로그래밍(Aspect-Oriented Programming)이라고 부르며, 프로그램의 핵심 기능 외에 부가적인 기능을 분리해서 모듈화 하는 기법이다. 핵심 비즈니스 로직과는 직접적인 관계가 없는 로직들(ex. 로깅, 트랜잭션)이 코드의 여러 부분에서 반복될 수 있다. AOP는 비즈니스 로직과 상관없는 반복적인 코드들을 별도의 모듈로 관리하여 코드의 유지 보수를 쉽게 하고 핵심 비즈니스 로직에 집중할 수 있도록 한다.ex) @Transactional은 트랜잭션 처리라는 부가적인 기능을 애너테이션으로 적용하는 방식이다. 원래는 트랜잭션을 사용하려면 transaction.begin(), transaction.commit(), transaction.rollback() ..
예제 코드Member.classupdateUsername()을 통해 사용자의 이름을 변경할 수 있다.@Entity@Setter@Getterpublic class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "member_id") private Long id; private String username; @ManyToMany @JoinTable(name = "MEMBER_PRODUCT", joinColumns = @JoinColumn(name = "member_id"), inverseJoinColumns = @JoinColumn(name = "pr..
SimpleJpaRepositoryJpaRepository는 SimpleJpaRepository를 상속받습니다. SimpleJpaRepository는 데이터베이스에 상호작용을 위한 기본적인 CRUD 연산을 제공합니다. CRUD 연산에는 기본적으로 @Transactional 애너테이션이 사용됩니다.public class SimpleJpaRepository implements JpaRepositoryImplementation { @Transactional public void deleteById(ID id) { Assert.notNull(id, "The given id must not be null"); this.findById(id).ifPresent(this::del..