인프런 커뮤니티 질문&답변

galid님의 프로필 이미지

작성한 질문수

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

주문 조회 V3: 엔티티를 DTO로 변환 - 페치 조인 최적화

@Transactional(readOnly=true) 설정에 대한 질문입니다.

해결된 질문

21.10.30 20:48 작성

·

345

0

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오) 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예

[질문 내용]
안녕하세요, 최근 부하테스트를 진행하며 성능개선을 해보려하고 있습니다.
 
그 중 단순 DB 조회 API에 대해 테스트를 진행하고 있는데, 스레드 덤프를 확인한 결과 SessionImpl.doFlush()가 호출되는 것을 보고
트랜잭션이 끝나는 시점에 자동으로 flush가 호출되는 것을 발견했고, 때문에 readOnly 설정이란 것을 찾아서 설정하고 다시 테스트를 진행했습니다.
 
 
반복해서 테스트를 진행해 봤는데, readOnly를 설정하지 않았을때가 TPS가 높게 측정이 됩니다. 왜 그런지 알 수 있을까요..
그림은 순서대로 readOnly를 설정하지 않았을 때와 설정했을 때 입니다.
 
테스트 대상 API의 코드는 아래 링크의 getMovieList() 입니다.
 
 
 

답변 2

1

김영한님의 프로필 이미지
김영한
지식공유자

2021. 10. 31. 22:08

안녕하세요. galid님

readOnly=true인 경우 일반적으로 같거나 조금 더 나은 성능을 보여야합니다.

저도 정확한 이유는 모르겠지만, 성능 테스트 환경이나 DB 드라이버 등에 따라서 상황이 달라질 수 있을 것 같아요.

정확한 테스트를 하려면 메모리 DB를 사용하지 않고, 별도의 서버에 MYSQL, WAS를 설치한 다음 TEST를 진행해보셔야 할 것 같습니다.

감사합니다.

galid님의 프로필 이미지
galid
질문자

2021. 11. 01. 17:27

바쁘실텐데 항상 친절한 답변 감사드립니다.

 

별도 GCP상 인스턴스에, DB, WAS를 설치하고 테스트를 진행했는데 몇번을 테스트를해도 위와 같습니다. ㅠ

AOP로 해당 메소드 실행 시점과 끝나는 시점에 대해 실행시간을 로깅해보아도 readOnly를 설정하지 않았을때가 더 나은 성능을 보입니다. ㅠㅠ

 

우선 더 나은 성능을 보여야한다는 것을 알았으니, 더 공부하고 다양한 환경에서 테스트 진행해보겠습니다. 감사합니다.

1

David님의 프로필 이미지

2021. 10. 31. 13:20

안녕하세요. galid님, 공식 서포터즈 David입니다.

.

Transactional의 read-only 옵션 사용에 따른 성능은 아래 링크들을 참고 부탁드립니다:)

https://vladmihalcea.com/spring-read-only-transaction-hibernate-optimization/
https://willseungh0.tistory.com/75
.
감사합니다.

galid님의 프로필 이미지

작성한 질문수

질문하기