트랜잭션은 데이터베이스 작업의 단위로, 하나의 트랜잭션 내에서 발생하는 모든 변경은 원자성을 가지며, 이는 모든 변경이 완전히 적용되거나 아무 것도 적용되지 않아야 함을 의미한다. 이렇게 트랜잭션을 통해 데이터의 무결성을 보장할 수 있다.
트랜잭션 경계 설정은 트랜잭션의 시작과 끝을 명확하게 정의하는 것이다. 이는 트랜잭션의 원자성을 보장하는 데 중요하다. 예를 들어, 하나의 비즈니스 작업을 수행하는 데 필요한 여러 데이터베이스 변경 작업들이 각각 다른 트랜잭션으로 처리되면, 일부 변경만 적용되는 상황이 발생할 수 있다. 이는 데이터의 무결성을 위반하게 된다.
예를 들어, 아래와 같은 트랜잭션이 있다고 가정해보자.
@Transactional
public void process() {
step1();
step2();
}
public void step1() {
// Do something
}
public void step2() {
// Do something
}
위와 같은 경우, process() 메소드 전체가 하나의 트랜잭션으로 처리된다. 즉, step1()과 step2() 메소드에서 발생하는 모든 데이터베이스 변경 작업은 하나의 트랜잭션 내에서 이루어진다. 이 경우, step1()과 step2() 메소드의 작업이 모두 성공적으로 완료되어야만 데이터베이스에 변경이 반영된다.
하지만, step1()과 step2()가 각각 다른 트랜잭션으로 처리되어야 하는 경우, @Transactional 애노테이션을 각각의 메소드에 적용해야 한다.
public void process() {
step1();
step2();
}
@Transactional
public void step1() {
// Do something
}
@Transactional
public void step2() {
// Do something
}
위의 코드는 step1()과 step2() 메소드 각각을 별도의 트랜잭션으로 처리한다. 이 경우, 각 메소드에서 발생하는 데이터베이스 변경 작업은 각자의 트랜잭션 내에서 이루어진다. 따라서, step1()의 작업이 실패하더라도 step2()의 작업은 계속 진행될 수 있다.
이처럼 트랜잭션의 경계를 명확하게 설정하는 것은 데이터의 무결성을 보장하는 데 중요하다. 따라서, 트랜잭션을 사용할 때는 항상 트랜잭션의 경계를 명확하게 설정해야 한다.