Spring에서 JPA 사용하기 첫 번째 글에서는 기본적인 CRUD 연산에 대해서 알아봤습니다.
오늘은 좀 더 심화된 주제로, 트랜잭션 관리와 예외 처리에 대해 함께 알아보도록 하겠습니다.
🔄 트랜잭션의 중요성
트랜잭션은 데이터베이스 연산의 단위를 의미합니다.
은행 계좌 이체를 예로 들면, A계좌에서 돈을 빼는 작업과 B계좌에 돈을 넣는 작업이 모두 성공해야 합니다.
만약 B계좌에만 돈이 들어가면 문제가 발생하겠죠?
이렇게 연산의 원자성을 보장하는 것이 트랜잭션의 중요한 역할입니다.
🛠 Spring에서의 트랜잭션 관리
Spring에서는 @Transactional
어노테이션을 사용하여 메서드 또는 클래스에 트랜잭션을 적용할 수 있습니다.
Service
import org.springframework.stereotype.Service
import org.springframework.transaction.annotation.Transactional
@Service
class UserService(private val userRepository: UserRepository) {
@Transactional
fun transferMoney(fromUserId: Long, toUserId: Long, amount: Int) {
val fromUser = userRepository.findById(fromUserId).orElseThrow { Exception("From user not found") }
val toUser = userRepository.findById(toUserId).orElseThrow { Exception("To user not found") }
fromUser.balance -= amount
toUser.balance += amount
userRepository.save(fromUser)
userRepository.save(toUser)
}
}
위 코드에서 transferMoney
메서드는 트랜잭셔널하게 동작하므로, 중간에 어떤 문제가 발생하면 모든 연산이 롤백됩니다.
🚫 예외 처리
예외는 프로그램의 예상치 못한 오류를 표현하고, 이를 적절히 처리해야 합니다. Spring에서는 ControllerAdvice
를 사용하여 전역적인 예외 처리를 할 수 있습니다.
CustomException
class UserNotFoundException(message: String) : RuntimeException(message)
GlobalExceptionHandler
import org.springframework.web.bind.annotation.ControllerAdvice
import org.springframework.web.bind.annotation.ExceptionHandler
import org.springframework.web.bind.annotation.ResponseBody
import org.springframework.web.bind.annotation.ResponseStatus
import org.springframework.http.HttpStatus
@ControllerAdvice
class GlobalExceptionHandler {
@ExceptionHandler(UserNotFoundException::class)
@ResponseStatus(HttpStatus.NOT_FOUND)
@ResponseBody
fun handleUserNotFound(exception: UserNotFoundException): String {
return exception.message ?: "User not found"
}
}
이렇게 처리하면 UserNotFoundException
이 발생하면, 항상 404 상태코드와 함께 "User not found" 메시지가 반환됩니다.
마치며
이번 글에서는 Spring Data JPA와 Kotlin을 사용하여 트랜잭션 관리와 예외 처리를 어떻게 하는지에 대해 알아봤습니다.
데이터의 안정성을 보장하기 위해서는 올바른 트랜잭션 관리와 예외 처리가 굉장히 중요합니다.
항상 안전한 코딩을 위해 노력합시다! 💪🔒🚀
'Framework || Library > Spring' 카테고리의 다른 글
Spring Batch (0) | 2023.09.05 |
---|---|
Spring Application 프로파일 (0) | 2023.09.05 |
Spring에서 JPA 사용하기(환경 설정부터 기본 CRUD 까지) (0) | 2023.08.18 |
Lombok이란? (예시 코드 포함) (0) | 2023.08.17 |
Windows에 Gradle 설치 (0) | 2023.08.17 |