본문 바로가기
개발/Spring

DataSource, TransactionManager

by BellOne4222 2024. 2. 27.

DataSource

  • 물리적인 데이터소스(데이터베이스) 정보를 담는 인터페이스

   • EmbeddedDatabaseBuilder: HSQL, Derby, H2 등 임베디드 DB 세팅할 때 사용
   • DataSourceBuilder: JDBC DataSource 빌더
   • DriverManagerDataSource: JDBC 드라이버로 세팅하는 DataSource
   • SimpleDriverDataSource: DriverManagerDataSource 를 간편하게 만든 버전
   • HikariDataSource: HikariCP 를 connection pool 로 사용하는 DataSource

 

TransactionalManager

  • 스프링 트랜잭션 관리 기능을 담당하는 인터페이스

   • PlatformTransactionManager, ReactiveTransactionManager
   • JpaTransactionManager: Spring Data JPA 일반적인 상황에 사용하는 구현체, 단일 
      EntityManagerFactory 를 사용
   • DataSourceTransactionManager: 단일 JDBC DataSource 를 사용하는 구현체
   • HibernateTransactionManager: 하이버네이트 SessionFactory 를 사용하는 구현체
   • ChainedTransactionManager: 여러 개의 트랜잭션 매니저를 묶어서 사용하는 구현체

 

@Transactional

  • 스프링이 애노테이션 기반 트랜잭션 관리 기능을 제공
  • 트랜잭션 구역 설정
  • transactionManager(value): 사용할 트랜잭션 매니저를 이름으로 특정
  • propagation: 트랜잭션이 중첩될 경우 동작(트랜잭션 효과의 전파) 규칙 (default: REQUIRED)
  • isolation: 트랜잭션 내부 데이터의 격리 레벨 (default: DEFAULT)
  • readOnly: "이 트랜잭션 안에서는 select 만 일어난다" 를 표현
    • 강제성이 없다.
    • 이 옵션을 처리하지 않는 트랜잭션 매니저 구현체를 사용할 경우, 별도의 예외처리를 안 함

 

  • service/eventservice
@RequiredArgsConstructor // Lombok을 사용하여 필수 인자를 갖는 생성자를 자동 생성
@Transactional // 이 클래스의 모든 메서드에 대한 트랜잭션 처리를 지정
@Service // EventService 인터페이스의 구현체임을 나타냄
public class EventService {

	private final EventRepository eventRepository; // EventRepository 인스턴스 변수
	private final PlaceRepository placeRepository; // PlaceRepository 인스턴스 변수

	@Transactional(readOnly = true) // 읽기 전용 트랜잭션으로 설정
	public List<EventDto> getEvents(Predicate predicate) { // 이벤트를 가져오는 메서드
		try {
			return StreamSupport.stream(eventRepository.findAll(predicate).spliterator(), false) // Predicate를 사용하여 이벤트를 조회하고 Stream으로 변환
				.map(EventDto::of) // 각 이벤트를 EventDto로 변환
				.toList(); // 리스트로 반환
		} catch (Exception e) {
			throw new GeneralException(ErrorCode.DATA_ACCESS_ERROR, e); // 데이터 액세스 오류가 발생하면 예외 처리
		}
	}

	@Transactional(readOnly = true) // 읽기 전용 트랜잭션으로 설정
	public Page<EventViewResponse> getEventViewResponse( // 이벤트 뷰 응답을 가져오는 메서드
		String placeName,
		String eventName,
		EventStatus eventStatus,
		LocalDateTime eventStartDatetime,
		LocalDateTime eventEndDatetime,
		Pageable pageable
	) {
		try {
			return eventRepository.findEventViewPageBySearchParams( // 검색 조건에 따라 이벤트 뷰 페이지를 조회
				placeName,
				eventName,
				eventStatus,
				eventStartDatetime,
				eventEndDatetime,
				pageable
			);
		} catch (Exception e) {
			throw new GeneralException(ErrorCode.DATA_ACCESS_ERROR, e); // 데이터 액세스 오류가 발생하면 예외 처리
		}
	}

	@Transactional(readOnly = true) // 읽기 전용 트랜잭션으로 설정
	public Optional<EventDto> getEvent(Long eventId) { // 특정 이벤트를 가져오는 메서드
		try {
			return eventRepository.findById(eventId).map(EventDto::of); // 이벤트 ID를 사용하여 이벤트를 조회하고 Optional로 반환
		} catch (Exception e) {
			throw new GeneralException(ErrorCode.DATA_ACCESS_ERROR, e); // 데이터 액세스 오류가 발생하면 예외 처리
		}
	}

	@Transactional(readOnly = true) // 읽기 전용 트랜잭션으로 설정
	public Page<EventViewResponse> getEvent(Long placeId, Pageable pageable) { // 특정 장소의 이벤트를 가져오는 메서드
		try {
			Place place = placeRepository.getById(placeId); // 장소 ID를 사용하여 장소를 조회
			Page<Event> eventPage = eventRepository.findByPlace(place, pageable); // 장소에 따라 이벤트 페이지를 조회

			return new PageImpl<>( // 이벤트 페이지를 이벤트 뷰 응답 페이지로 변환하여 반환
				eventPage.getContent()
					.stream()
					.map(event -> EventViewResponse.from(EventDto.of(event)))
					.toList(),
				eventPage.getPageable(),
				eventPage.getTotalElements()
			);
		} catch (Exception e) {
			throw new GeneralException(ErrorCode.DATA_ACCESS_ERROR, e); // 데이터 액세스 오류가 발생하면 예외 처리
		}
	}

 

 

'개발 > Spring' 카테고리의 다른 글

Querydsl  (1) 2024.02.27
JPA 테스트  (1) 2024.02.27
Spring Data JPA 인터페이스  (0) 2024.02.27
H2 Database  (0) 2024.02.26
Hibernate, Spring Data JPA  (0) 2024.02.26