@Transactional
@EnableTransactionmManagement
@Transactional
Class{
Method{}
Method{}
}
Transaction의 다양한 옵션들을 사용하려면 우선
package com.example.weatherdiary;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@SpringBootApplication
@EnableTransactionManagement // 이 어노테이션을 넣어주어야 한다.
public class WeatherDiaryApplication {
public static void main(String[] args) {
SpringApplication.run(WeatherDiaryApplication.class, args);
}
}
DiaryService
@Transactional(readOnly = true)
public void createDiary(LocalDate date, String text) throws MalformedURLException { // 다이어리 생성하기
// 날씨 데이터 가져오기
String weatherData = getWeatherString();
// 받아온 날씨 json 파싱하기
Map<String, Object> parsedWeatherData = parseWeather(weatherData);
// 파싱된 데이터 + 일기 db에 삽입
Diary nowDiary = new Diary();
nowDiary.setWeather(parsedWeatherData.get("main").toString());
nowDiary.setIcon(parsedWeatherData.get("icon").toString());
nowDiary.setTemperature((Double)parsedWeatherData.get("temp"));
nowDiary.setText(text);
nowDiary.setDate(date);
diaryRepository.save(nowDiary);
}
데이터를 생성하는 서비스 로직에 transactional의 readOnly = true를 하게되는 경우, 에러가 발생한다.
데이터를 삽입해야하는데 readOnly를 true로 해서, 데이터를 읽을 수 밖에 없다.
@Transactional(readOnly = true)
public List<Diary> readDiary(LocalDate date){ // 다이어리 읽어오기
return diaryRepository.findAllByDate(date);
}
@Transactional(readOnly = true)
public List<Diary> readDiaries(LocalDate startDate, LocalDate endDate){
return diaryRepository.findAllByDateBetween(startDate,endDate);
}
참고로 데이터를 읽어오기만 하면 되는 로직에는 다음과 같이 readOnly옵션을 넣어주는 것이 좋다.
readOnly 옵션은 기본값이 false이다.
readOnly = true 옵션을 주는 경우 스프링 프레임워크가 하이버넹트 세션 플러시 모드를 MANUAL로 설정한다.
이렇게 되면 강제로 플러시를 호출하지 않는 한 플러시가 일어나지 않는다.
트랜잭션을 커밋하더라도 영속성 컨텍스트가 플러시 되지 않아서 엔티티의 등록, 수정, 삭제가 동작하지 않고, 또한 읽기 전용으로, 영속성 컨텍스트는 변경 감지를 위한 스냅샷을 보관하지 않으므로 성능이 향상된다.
'Spring' 카테고리의 다른 글
[Core] IoC, DI, 컨테이너 (0) | 2023.09.12 |
---|---|
[Core] 좋은 객체 지향 설계의 5가지 원칙 적용 (0) | 2023.09.12 |
[Spring Annotation] @Transaction (0) | 2023.09.06 |
[Core] 관심사의 분리 - AppConfig (0) | 2023.09.05 |
[Core] 스프링 핵심 원리 예제 - 주문과 할인 실행 및 테스트 (0) | 2023.09.01 |