@Transactional(readOnly = true)를 붙이는 이유

@Transactional 을 붙이지 않는 것과 @Transactional(readOnly=true) 차이

특징 @Transactional 없음 @Transactional(readOnly = true)
트랜잭션 생성 여부 ❌ 없음 ✅ 읽기 전용 트랜잭션 생성
영속성 컨텍스트 유지 여부 ❌ 없음 (즉시 종료) ✅ 유지됨 (트랜잭션 범위 내에서)
Dirty Checking 작동 여부 ❌ 작동 안 함 (컨텍스트가 없음) ❌ 작동 안 함 (readOnly=true로 인해 비활성화)
flush() 실행 여부 ❌ 실행되지 않음 ❌ 실행되지 않음
성능 최적화 적용 여부 ❌ 없음 ✅ 일부 최적화 (Repeatable Read, JDBC 최적화 가능)

@Transactional 이 없는 경우

public void findPlaceTwice(Long id) {
    Place place1 = placeRepository.findById(id).orElseThrow();
    Place place2 = placeRepository.findById(id).orElseThrow();
}

@Transactoinal(readOnly=true) 인 경우

@Transactional(readOnly = true)
public void findPlace(Long id) {
    Place place = placeRepository.findById(id).orElseThrow();
}