본문 바로가기
Framework || Library/Spring

Spring에서 JPA사용하기 (Transaction, 예외 처리)

by 시니성 2023. 8. 18.

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을 사용하여 트랜잭션 관리와 예외 처리를 어떻게 하는지에 대해 알아봤습니다.

데이터의 안정성을 보장하기 위해서는 올바른 트랜잭션 관리와 예외 처리가 굉장히 중요합니다.

항상 안전한 코딩을 위해 노력합시다! 💪🔒🚀