트랜잭션 AOP 관련 질문드립니다
안녕하세요
항상 좋은 강의 감사합니다
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
감사합니다.
설정 정보 없이 임베디드 데이터베이스 생성
0
43
1
RepositoryTest의 패키지 위치가 domain인 이유
0
61
2
REQUIRES_NEW 해결 방법에 대해서 질문있습니다!!
0
50
1
update()에 사용하는 setter 질문드립니다.
0
63
1
SQL 중심적 개발의 문제점에 대한 질문
0
95
1
혹시 Containing 을 안쓰신 이유가 있을까요?
0
96
2
[공유] 스프링부트 4.x 버전 mybatis 연동
0
213
1
@repository 어노테이션
0
111
3
ItemService
0
67
1
논리 커밋, 물리 커밋 질문드립니다.
0
59
1
내부 트랜잭션 커밋은 필수인가요?
0
64
1
프록시 커넥션 객체를 반환할 때 생성하는건가요?
0
63
1
Transaction readOnly 성능 개선 (김영한님의 대한 감사인사)
2
192
2
JPQL 대신 네이티브 쿼리를 사용해야 하는 경우
0
88
1
@EventListener(ApplicationReadyEvent.class) 관련
0
101
1
트랜잭션 동기화 매니저와 데이터 소스
0
83
1
DB 관련 강의 개설 계획은 없으신건가요?
0
141
2
물리 트랜잭션 과 논리트랜잭션 용어를 맞게 이해한걸까요
0
102
1
스프링 3 버전 이상 rollbackFor 변경된듯요
1
125
1
트랜잭션 전파 질문.
0
95
1
프로젝트 오픈 에러
0
139
1
외부 트랜잭션에서 isNewTransaction이 false로 나오는거에 대해 질문드립니다
0
87
2
같은 스레드를 사용하면 트랜잭션 동기화 매니저는 같은 커넥션을 반환
0
80
1
h2 인메모리 테스트중 예약어 충돌날 경우 대처방법
0
107
1





