해결된 질문
작성
·
499
1
안녕하세요
항상 좋은 강의 감사합니다
AOP와 관련하여 @transactional에 대한 질문이 생겼습니다
spring data jpa에서 save 및 saveAll을 사용하다가 문득 강의를 적용해보고자 생각이 들어,
테스트를 해보았는데요
1번 테스트
public void method_transaction () {
1. sampleRepository.saveAll(); // 1만건 리스트
2.
for( 1만번 반복) {
sampleRepository.save();
}
}
2번 테스트
@transactional
public void method_transaction () {
1. sampleRepository.saveAll(); //1만건 리스트
2.
for(1만번 반복) {
sampleRepository.save();
}
}
1번과 같이 @transactional이 없는 메서드에서 save()와 saveAll() 호출 시에는,
save()에서 트랜잭션 생성 비용으로 인해서 saveAll()이 훨씬 빠른 것은 이해했습니다.
반면, 2번과 같은 코드에서는 AOP 강의에서 내부 함수 호출 시에, 프록시가 동작하지 않는다고 배웠는데요.
비록 상위 메서드에 @transactional이 걸려있어서, 트랜잭션 생성 비용은 안들더라도
saveAll()은 내부 함수 호출이기때문에 프록시가 동작하지 않아서 save()보다 속도가 더 빠를 것이라고 생각했는데,
성능 차이가 유의미하게 나타나지 않더라구요.
혹시 프록시 객체를 생성하고 해제하는 리소스는 많이 크지 않은 것인가요?
아니면 테스트를 10만건 정도로 했는데 그 정도의 사이즈에서는 속도 차이가 없는 것인지 질문드립니다
혹은 제가 설계를 잘못한 것인지… 질문드립니다!
감사합니다
답변 1
1
안녕하세요. springspringspr님, 공식 서포터즈 y2gcoder입니다.
제가 전체 테스트 코드를 잘 보지는 못해서 답변을 정확하게 못드릴 수도 있습니다.
일단 먼저 프록시 동작하는 것과 프록시 객체 생성은 다를 수 있습니다.
AOP, DB2 강의를 들으셨다면 아시겠지만 @Transactional 어노테이션이 메서드에 하나라도 붙어있다면 트랜잭션 AOP는 프록시를 만들어서 스프링 컨테이너에 등록합니다.
그런 관점에서 JpaRepository 인터페이스를 구현한 SimpleJpaRepository를 보시면 이미 @Repository와 함께 @Transactional 어노테이션이 붙어있습니다. 그리고 saveAll 메서드에도 @Transactional 어노테이션이 붙어있습니다.
그래서 프록시를 빈으로 등록하고 그 빈은 싱글톤으로 관리되기 때문에 생성하는 비용은 메서드 호출 때마다 발생하지 않습니다.
그리고 원래 의도하신 가설을 정확하게 모르는 상태지만, save()와 saveAll()의 속도 차이에 대해 실험한 링크가 있어 혹시 도움이 될까 첨부합니다.
https://velog.io/@rainmaker007/spring-data-jpa-save-saveAll-%EB%B9%84%EA%B5%90
https://recordsoflife.tistory.com/591
감사합니다.