오늘은 강의를 들으면서 제법? 심화적인 내용을 알게된 것 같다. 그리고 어려운 느낌이 너무 난다.
첫번째는 트랜잭션(Transaction) 이고 두 번째로는 객체지향(SOLID) 이다.
우선 오늘은 트랜잭션에 대해 학습한 것을 적어보려고 한다.
트랜잭션(Transaction)은 작업의 완전성을 보장해주기 위해 사용되는 개념이다. 특정한 작업을 전부 처리하거나, 전부 실패하게 만들어 데이터의 일관성을 보장해주는 기능이라고 한다.
트랜잭션(Transaction)을 사용하는 대표적인 이유는 작업의 단위를 하나의 쿼리에 종속하는 것이 아닌, 여러개의 작업(쿼리)을 묶어 하나의 작업 단위로 그룹화하여 처리하는 작업을 뜻한다.
트랜잭션을 왜 사용해야 하나? 라고 생각을 할 수도 있는데, 예를 들어보며 설명하겠다.
ex))
1️⃣ A 고객의 계좌에서 1,000원을 차감합니다.
2️⃣ B 고객의 계좌에 1,000원을 추가합니다.
우선 이런 상황이 놓여있는데 1️⃣번 작업을 한 후 2️⃣ 번 작업을 하다 에러가 발생하게 될 경우엔
A고객의 계좌에서 1,000원만 차감되는 문제점이 발생한다. 순서가 반대로 되었다면, B 고객의 계좌에
1,000원이 증가되기만 하는 문제가 발생한다.
이런 부분 업데이트와 같은 상황을 방지하기 위해 트랜잭션(Transaction)이라는 개념을 도입했다고 한다.
이런 상황 외에도 로깅작업,영화관 예매시스템, 은행 결제시스템 등 데이터의 일관성을 유지해야하는 상황에 사용된다.
트랜잭션(Transaction)의 특징으로는 ACID 라고 있는데 이것은 즉, 앞 글자를 따서 4가지로 구성이 된다.
- 원자성(Atomicity) - 가장 대표적인 특징으로 여러개의 작업들을 하나의 묶음으로 처리하여, 내부에서 실행된 명령들이 전부 성공하거나, 아니면 모두 실패해야한다는 특징이 있다. (ex 계좌이체의 비즈니스 로직)
- 일관성(Consistency) - 데이터의 일관성을 유지해야하는 특징이 있고, 작업이 성공할 경우 아무런 문제가 발생하지 않고, 실패하더라도 작업을 진행하던 도중 실패한 상태로 데이터를 방치하지 않는 특징이 있다. 그리고 트랜잭션 내의 데이터는 일관되어야한다. (ex 강의 등록의 비즈니스로직)
- 격리성(Isolation) - 트랜잭션의 경우 실행 전이나 실행 후의 데이터를 외부에서 참조할 수 있지만, 트랜잭션을 수행하는 중간 상태를 보거나 변경할 수 없도록 구성하는 특징이 있다. 그리고 DB에 락(LOCK)을 걸어 격리성을 구현하게 되고 락을 건 상태는 DB에 접속한 또다른 클라이언트가 해당하는 DB오브젝트를 읽거나 사용할 수 없다.
- 지속성(Durability) - 트랜잭션을 성공적으로 수행하면 수정된 데이터를 시스템에 영구적으로 적용하는 특징이 있고, 트랜잭션의 중간 결과가 아니라 완성된 결과만 저장하여 데이터베이스에 이상이 생기더라도 자동 복구할 수 있는 특성을 가지고 있다. 어플리케이션이 트랜잭션을 완료한 이후, DB에 COMMIT을 요청하였지만 변경사항이 반영되기 전에 DB가 비정상 종료될 경우, DB가 재시작 될 때 트랜잭션의 변경 사항을 다시 반영하게 되는 것을 지속성이라 한다.
그 외에도 코드를 작성 할때 COMMIT을 하면 DB에 들어가고 반대의 상황에선 ROLLBACK을 하는데, 이 이후의 이야기는 좀더 깊어지니 자세한건 MDN문서나 공식문서를 참조하는 것이 좋아보인다.
'TIL > 내일배움캠프 8주차' 카테고리의 다른 글
[내배캠 TIL ] 8주차 금요일 :: TypeScript (0) | 2023.07.10 |
---|