개발 일지/Spring

Controller 내부 API 요청 메소드에 트랜잭션 적용

미숫가루설탕많이 2023. 6. 6. 21:39

 

 위 코드는 기존에 작성되었던 코드이다. 컨트롤러 내부에서 dto를 엔티티 객체로 변환하고 변환된 객체를 service 로직에서 사용하고 있다.

 

 이렇게 쿼리가 실행된다면 발생하는 문제점이 데이터의 안전성이 보장되지 않는다는 것이다. 예를 들어, service 클래스의 createCv가 실행되어 새로운 Cv가 생성되고 repository에 저장되었는데 아래 injectLowDomain에서 실패하게 되면 작업은 종료되어 적절한 응답을 주지 못했지만 저장소에는 새로운 Cv가 있을 것이다.

 

 즉, 데이터의 일관성을 보장하기 위한 작업이 필요했고 helper라는 클래스를 만들어서 트랜잭션을 적용시켜줬다. 트랜잭션은 한 번에 실행되어야 하는 일련의 연산들을 모아놓은 것이다. 예를 들어, 여러 개의 작업이 실행되는 경우 트랜잭션으로 묶여 있다면 모두 성공하거나 실패하게 된다. (하나라도 실패하면 모두 롤백 처리)

 

트랜잭션 적용
helper클래스

 

 

 get 요청과 delete 요청의 경우는 service 로직 하나만 수행하고 있지만 현직자분께 여쭤보니, API 요청을 처리할 때는 호출이 하나이던 여러 개이던 트랜잭션을 적용시켜야 한다고 하셨다. (데이터 원자성 적용의 목적)

 

get 요청에는 readOnly 적용

 

 

 


트랜잭션의 속성 (ACID 원칙)

  • 원자성 (Atomicity)  : 모든 연산이 성공적으로 완료되거나, 하나의 연산이라도 실패하면 이전 상태로 롤백되어야 한다.
  • 일관성 (Consistency) : 트랜잭션이 실행 전과 실행 후에 데이터베이스의 일관성이 유지되어야 한다.
  • 독립성 (Isolation) : 여러 트랜잭션이 동시에 실행될 때 각 트랜잭션이 다른 트랜잭션에 영향을 주지 않도록 보장되어야 한다.
  • 지속성 (Durability) : 트랜잭셕이 성공적으로 완료되면 그 결과는 영구적으로 저장되어야 한다.