spring-boot-starter-data-jpa
추가 @PersistenceContext
EntityManager em;
@PersistenceConext
애너테이션을 사용하면 자동으로 생성된 EntityManager를 주입받아 사용할 수 있습니다.@Transactional(readOnly = true)
public class SimpleJpaRepository<T, ID> implements JpaRepositoryImplementation<T, ID> {
...
@Transactional
@Override
public <S extends T> S save(S entity) {
Assert.notNull(entity, "Entity must not be null");
if (entityInformation.isNew(entity)) {
em.persist(entity);
return entity;
} else {
return em.merge(entity);
}
}
...
}
@Transactional
애너테이션을 클래스나 메서드에 추가하면 쉽게 트랜잭션 개념을 적용할 수 있습니다.readOnly = true
옵션인 @Transactional을 덮어쓰게 되어 **readOnly = false**
옵션으로 적용됩니다.readOnly = true
옵션@Test
@Transactional
@Rollback(value = false) // 테스트 코드에서 @Transactional 를 사용하면 테스트가 완료된 후 롤백하기 때문에 false 옵션 추가
@DisplayName("메모 생성 성공")
void test1() {
Memo memo = new Memo();
memo.setUsername("Robbert");
memo.setContents("@Transactional 테스트 중!");
em.persist(memo); // 영속성 컨텍스트에 메모 Entity 객체를 저장합니다.
}
트랜잭션이 적용되어 DB 작업이 성공했습니다.
@Test
@DisplayName("메모 생성 실패")
void test2() {
Memo memo = new Memo();
memo.setUsername("Robbie");
memo.setContents("@Transactional 테스트 중!");
em.persist(memo); // 영속성 컨텍스트에 메모 Entity 객체를 저장합니다.
}
- 트랜잭션이 적용되지 못해 작업이 취소되었습니다.
- 즉, JPA를 사용하여 DB에 데이터를 저장, 수정, 삭제 하려면 트랜잭션 적용이 반드시 필요합니다.
- 조회 작업은 단순하게 데이터를 읽기만 하기 때문에 트랜잭션 적용이 필수는 아닙니다.
- 다만 조회의 경우에도 트랜잭션 환경이 필요한 경우가 있을 수 있기 때문에
- 조회 작업 기능만 존재하는 메서드일 경우에만 앞서 본 예시처럼
readOnly = true
옵션이 설정된 @Transactional을 적용하면 좋습니다.