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 |