@Transactional 어노테이션과 롤백 규칙
Spring의 @Transactional 어노테이션은 AOP(Aspect-Oriented Programming)를 사용하여 트랜잭션을 관리한다. @Transactional이 적용된 메서드에서 예외가 발생하면, Spring은 해당 예외가 롤백을 유발해야 하는지 확인하는데 기본적으로 Spring은 Unchecked Exception (RuntimeException 또는 Error)이 발생했을 때만 롤백한다. Checked Exception에 대해서는 롤백을 수행하지 않는데, 이는 Checked Exception이 비즈니스 로직에서 복구 가능한 예외로 간주되기 때문. 즉, 개발자가 Checked Exception을 처리하기 위한 별도의 로직을 구현했을 것으로 기대하는 것.
Java의 예외는 크게 Checked Exception 과 Unchecked Exception로 나뉜다.
○ Checked Exception: RuntimeException을 상속하지 않는 예외들 (IOException, SQLException 등).
Checked Exception은 컴파일 시점에서 예외 처리를 강제하며, try-catch 블록으로 처리하거나 throws 구문을 사용하여 예외를 메서드 호출자에게 던져야 한다.
○ Unchecked Exception: RuntimeException 클래스 또는 그 하위 클래스를 상속받는 예외들 (NullPointerException, IllegalArgumentException 등). Unchecked Exception은 컴파일 시점에서 예외 처리를 강제하지 않는다.
IOException은 왜 트랜잭션에 해당되지 않나?
IOException은 Checked Exception이므로, Spring의 기본 롤백 규칙에 따라 트랜잭션 롤백을 유발하지 않는다. Spring은 IOException이 발생했을 때 개발자가 이를 try-catch 블록으로 처리 또는 throws 구문을 통해 상위 메서드로 예외를 전파하여 처리한다. 개발자는 IOException에 대한 예외 처리 로직을 통해 필요한 작업을 수행하고, 트랜잭션을 커밋할 수 있다. 만약 IOException이 발생했을 때 트랜잭션을 롤백하고 싶다면, @Transactional 어노테이션의 rollbackFor 속성을 사용하여 명시적으로 지정해야만한다
@Transactional(rollbackFor = IOException.class)
public void myMethod() throws IOException {
// ...
throw new IOException("Something went wrong");
}
IOException이란 무엇인가?
java.io.IOException은 입출력 작업 중 발생할 수 있는 예외의 기본 클래스이다.
(입출력 작업: 파일 읽기/쓰기, 네트워크 통신, 스트림 작업 등)
IOException의 하위 클래스
- FileNotFoundException: 지정된 파일이 존재하지 않을 때 발생.
- EOFException: 파일의 끝에 도달했을 때 발생.
- SocketException: 소켓 연결에 문제가 발생했을 때 발생.
- UnsupportedEncodingException: 지원되지 않는 인코딩을 사용할 때 발생.
IOException의 사용 예
- 파일 읽기/쓰기: 파일을 읽거나 쓸 때 파일이 존재하지 않거나, 권한이 없거나, 디스크 공간이 부족한 경우 IOException이 발생할 수 있습니다.
- 네트워크 통신: 네트워크 연결이 끊어지거나, 서버가 응답하지 않거나, 데이터 전송 중 오류가 발생하는 경우 IOException이 발생할 수 있습니다.
- 스트림 작업: 스트림을 읽거나 쓸 때 스트림이 닫혔거나, 스트림의 형식이 잘못되었거나, 스트림에서 더 이상 읽을 데이터가 없는 경우 IOException이 발생할 수 있습니다.
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class ReadFile {
public static void main(String[] args) {
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader("C:\\test.txt"));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
System.err.println("IOException 발생: " + e.getMessage());
} finally {
try {
if (br != null) {
br.close();
}
} catch (IOException e) {
System.err.println("BufferedReader 닫기 오류: " + e.getMessage());
}
}
}
}
BufferedReader를 사용하여 파일에서 텍스트를 읽고,
FileReader 생성자에서 FileNotFoundException이 발생할 수 있으며,
readLine() 메서드나 close() 메서드에서 IOException이 발생할 수 있다.
try-catch 블록을 사용하여 이러한 예외를 처리하고, finally 블록에서 BufferedReader를 닫아 리소스를 해제.
'Framework > Spring🌱' 카테고리의 다른 글
JPAQueryFactory의 fetch() 와 fetchOne() 비교 (0) | 2025.04.23 |
---|---|
JPA [QueryDSL] 설정하기 (1) | 2025.04.23 |
[Spring]@RequiredArgsConstructor (0) | 2024.05.02 |
[Spring] @Autowired란? (0) | 2024.05.02 |
[Spring] MultiValueMap란? (0) | 2024.04.08 |