[Spring Boot] JPA에서의 Transaction, 의존성 주입

이맑음·2021년 10월 22일
0

Spring Boot

목록 보기
17/21
post-thumbnail

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)을 사용하는 방법이다.
profile
하삐

0개의 댓글