
트랜잭션을 어떻게 관리해주는거지??
이 어노테이션이 없다면??
DB 에 모두 반영되거나 모두 반영되지 않아야 되는 하나의 작업 단위를 뜻함
헬스장만 생성되면…???? 기구만 생성되면…???
강제 야외 헬스장이 되거나 유산소만 해야 하는 끔찍이 발생
왜냐??
각각의 요청을 별개의 요청으로 받아들임 → 별개의 요청이기에 하나의 작업 단위가 아님
커넥션 풀을 통해서 커넥션 객체를 가져옴 그리고 커넥션 객체를 DB 서버에서 세션을 만들고 세션을 통해서 DB 에 요청을 보냄

그래서 이 각각의 요청을 하나의 작업으로 만들어줘야겠지??
커넥션 객체를 통해서 setAutoCommit(false) 를 주어 요청을 보내도 즉시 반영하지 않는 요청 진행
이후 헬스장 생성요청 기구 생성요청 아무 문제 없으면 반영해주세요~~!!
적용전
자동 커밋: 쿼리 실행 직후 자동으로 커밋 호출, 트랜잭션 기능 사용 불가
수동 커밋: 커밋 롤백 직접 호출해야 함
자동 커밋 모드에서 수동 커밋 모드로 전환 하는 것을 트랜잭션을 시작한다고 표현한다고 함
@RequiredArgsConstructor
public class HealthServiceImpl implements HealthService {
private final DataSource dataSource;
public void goHealth() throws SQLException {
Connection con = dataSource.getConnection();
try {
con.setAutoCommit(false); // 트랜젝션 시작
// .. 헬스장 만들어버리깃~ ..
logic(con); // 하나의 세션으로 할당해 처리하기 위해 connection 넘겨줌
con.commit(); // 성공시 커밋
} catch (Exception e) {
con.rollback();
throw new IllegalStateException(e);
} finally {
release(con);
}
}
}
AOP 는 프록시 방식으로 동작
Spring 은 타겟 클래스 혹은 그의 상위 인터페이스를 상속하는 프록시 객체를 생성 후 프록시 클래스에서 부가 기능에 관련된 처리를 함 타겟에서는 순수한 비즈니스 로직만 처리 가능
@Service
public class HealthServiceProxy implements HealthService {
@Override
public void logic() {
// Target 호출 이전에 처리해야하는 부가 기능
healthService.goHealth();
// Target 호출 이후에 처리해야하는 부가 기능
}
프록시 객체 - 타겟 객체를 상속해서 재정의한 클래스

Spring AOP를 사용 프록시 형태로 동작

@Transactional 은 결국 Spring AOP 중 하나로 프록시 방식을 사용한다.
서비스 계층에서 비즈니스 로직에 집중하기 위해 트랜잭션애 관련된 부가적인 기능은 로직 밖에서 처리해준다