본문 바로가기
Spring

[Spring Annotation] 간단한 @Transaction 사용

by sangyunpark 2023. 9. 6.
@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로 설정한다.

이렇게 되면 강제로 플러시를 호출하지 않는 한 플러시가 일어나지 않는다.

트랜잭션을 커밋하더라도 영속성 컨텍스트가 플러시 되지 않아서 엔티티의 등록, 수정, 삭제가 동작하지 않고, 또한 읽기 전용으로, 영속성 컨텍스트는 변경 감지를  위한 스냅샷을 보관하지 않으므로 성능이 향상된다.