Transaction
Atomicity (원자성)
- All or Noting의 개념으로 작업 단위를 일부분만 실행하지 않는다.
Consistency (일관성)
- 트랜잭션이 성공적으로 완료되면 일관적인 DB상태를 유지해야 한다.
Isolation (독립성)
- 한 트랜잭션 내의 데이터 조작에 관해서 다른 트랜잭션으로부터 독립적으로 동작해야 한다.
Durability (지속성)
예제
- @Transactional 없이 save를 지날 때 마다 디버그를 걸고 테스트를 실행하면, save()메서드 내의 트랜젝션이 동작하여 그때그때 디비에서 book과 author를 확인할 수 있다.
- 그러나 @Transactional을 추가하고 디버그를 하면, putBookAndAuthor()메서드가 끝나기 전까지는 아무리 save를 해도 디비에서 확인할 수 없다. putBookAndAuthor 메서드가 끝나면서 한번에 디비에 commit 되기 때문이다. -> 트랜젝션의 원자성
@Service
@RequiredArgsConstructor
public class BookService {
private final BookRepository bookRepository;
private final AuthorRepository authorRepository;
@Transactional
public void putBookAndAuthor() {
Book book = new Book();
book.setName("JPA 시작하기");
bookRepository.save(book);
Author author = new Author();
author.setName("martin");
authorRepository.save(author);
}
}
@Test
void transactionTest() {
bookService.putBookAndAuthor();
System.out.println("books : " + bookRepository.findAll());
System.out.println("authors : " + authorRepository.findAll());
}
의존성 주입
@Autowired
- 필드 주입이라고 하며, @Autowired 어노테이션을 통해 필드에 바로 의존성 관계를 주입하는 방법이다.
- 필드 주입의 경우 외부에서 값을 변경할 수 없고, 그렇게 되면 테스트 코드에서도 사용할 수 없기 때문에 사용을 지양하는 추세이다.
@RequiredArgsConstructor
- 생성자 주입이라고 하며, lombok(final 키워드와 @RequiredArgsConstructor)을 사용하는 방법이다.