[Spring] @Transactional(readOnly = true)를 왜 붙여야 하나요?
2023. 11. 10. 13:58
멘토링 중 멘토님께서 지적해주셨던 내용!
GET 메소드 일 때에는 readOnly=true를 붙이라고 말씀해주셨는데 이는 Transactional에서 readOnly=true를 사용하면 다음과 같은 이점이 있기 때문이다.
1. JPA와 관련된 이점
1. 트랜잭션 Commit 시 영속성 컨텍스트가 자동으로 flush 되지 않으므로 조회용으로 가져온 Entity의 예상치 못한 수정을 방지
2. JPA는 해당 트랜잭션 내에서 조회하는 Entity는 조회용임을 인식하고 변경 감지를 위한 Snapshot을 따로 보관하지 않으므로 메모리가 절약되는 성능상 이점
2. Replication 부하 분산
readOnly = true가 설정되어있는 메서드의 경우 Slave DB에서 데이터를 가져오도록 동작한다. 이를 통해 레플리케이션의 목적에 맞게 트래픽을 분산할 수 있다는 이점이 존재한다.
3. 코드 가독성 향상
readOnly = true 만 봐도 조회 메소드라는 사실을 파악할 수 있다.
다음과 같은 이유로 readOnly=true를 사용하도록 코드를 변경하였다.
@Override
@Transactional(readOnly = true)
public List<PortfolioLikeResDto> getUserLiked(Users users) {
List<UserLikes> likeList = likesRepositoryService.getLikesByUsersAndType(users, LikeEnum.item);
return likeList.stream()
.map(userLikes -> itemsRepositoryService.findItemById(userLikes.getLikedId()))
.map(likesMapper::entityToDto)
.toList();
}
'Spring Boot' 카테고리의 다른 글
[Spring]반정규화를 통한 조회 성능 최적화하기(좋아요, 태그) (0) | 2023.11.10 |
---|---|
[Spring] serviceImpl 패턴을 활용한 likeService 리팩토링(객체지향원칙) (0) | 2023.11.10 |
[Spring] Redis Redisson과 AOP를 이용하여 분산락 구현하기 (0) | 2023.10.13 |
[Spring] 좋아요 기능 구현 시 테이블 설계 고민과 성능 테스트 결과 (0) | 2023.10.11 |
[Spring] AOP, Custom Annotation으로 코드 성능 측정하기 (0) | 2023.10.11 |