Transaction Manager / 패스트캠퍼스 챌린지 15일차

망고쥬스·2021년 11월 15일
0

TransactionManager ( JPA에서 Transaction 활용하기 )

Transaction Manger와 Transactional Annotation에 대해서 알아보겠음.

@Transactional 선언시 영속성 컨텍스트에서 Transaction이 종료되는 시점에 AutoFlush가 된다는 점을 이해하고 있다.

Transaction은 JPA의 기능이라고 하기 보단, DB에서 다루는 개념이다.
DB의 명령어들의 논리적인 묶음이라고 생각하면 된다.
DB에서 Transcation이라는 단위를 통해 여러가지 쿼리를 묶어 활용하고 있다.
예로 들어 물건을 구입하는 행위에서는 주문,구매,결제 등을 하나의 트랜잭션으로 묶여있는 식으로 생각하면 된다.

Transaction이 성공적으로 완료되어 처리되면 주문,구매,결제 데이터 입력이 처리되며, 실패시에는 모든 데이터가 입력되지 않는다.

ACID
A : Atomic city원자성
-> 부분적인 성공을 허용하지 않는다. 즉, 내가 돈을 보냈으면 상대방도 돈을 받아야 한다. 돈을 받았는데 중간에 사라지면 안된다.
C: Consistancy
일관성
-> 송금이 성공하려면 내 계좌의 잔액이 0 보다 커야한다. 성공 후 계좌는 0 혹은 0 보다 많은 잔액이 남아야 한다. 상대방의 통장은 0 이상의 잔액이 존재해야한다.
I: Isolation독립성
-> 다른 트랜잭션으로 부터 독립적인 속성을 가져야한다. 내가 친구에게 돈을 보내고 있는 중에 (트랜잭션중) 친구 통장에서 먼저 인출되거나 하면 안된다.
순서에 대해 가정하자면 (내가 송금 -> 친구 통장에 입금 -> 내 통장에서 차감 -> 친구 통장에서 친구가 그 돈을 먼저 인출 -> 내 통장에서 금액 차감하다가 오류가 발생하여 트랜잭션이 실패처리 하려 했는데 친구 통장에서 먼저 출금처리가 되어 문제가 발생하게 된다.
D: Durability
영구적
-> 데이터는 영구적으로 보관

@Transactional 의 정확한 역할을 알아보자

1. BookService (Service class)

@Service
@RequiredArgsConstructor //Lombok으로 빈 주입
public class BookService{
	private final BookRepository bookRepository;
	private final AuthorRepository autoRepository;

	public void putBookAndAuthor(){
		Book book = new Book(); //book객체생성
		book.setName("JPA 시작하기"); //book객체에 책이름저장

		bookRepository.save(book); //db에 book객체 저장

		Author author = new Author(); //author객체생성
		author.setName("martin"); //author객체에 작가이름저장

		authorRepository.save(author); //db에 author객체 저장
		}
}

2. BookServiceTest

@SpringBootTest
class BookServiceTest{
	@AutoWired //Test에서는 lombok을 사용한 주입이 되지 않음
	private BookRepository bookRepository;
	@AutoWired
	private AuthorRepository authorRepository;
	@AutoWired
	private BookService bookService;

	@Test
	void transactionTest(){
		bookService.putBookAndAuthor(); //위에 BookService에서 생성 된 메서드 호출

		System.out.println("books: "+bookRepository.findAll()); //log로 bookRepository찍어보기
		System.out.println("Author: "+authorRepository.findAll()); 
	}
}

3. mySql (Console)

//if book_manager가 없으면
mysql> create database book_manager; //database생성
mysql> user book_manager;
Database changed
mysql> show tables;
Empty set (0.00sec) //생성된 테이블이 없음
//autoDDL을 사용하기 때문에 프로그램을 실행하면 create-drop이 실행되서 자동 테이블 생성, 테스트 후 삭제됨

#패스트캠퍼스 #패캠챌린지 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #한번에끝내는Java/Spring웹개발마스터초격차패키지Online

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

https://bit.ly/3FVdhDa

profile
#newbieDeveloper #since 2021.04.06

0개의 댓글