1. 트랜잭션(Transaction)
사전적 의미로는 거래를 의미한다. 그렇다면 스프링에서 트랜잭션은 거래와 가까운 기능을 하지않을까?
쉽게 이해 하려면 trans + action 이라고 생각하면 좋다고 강사님께서 말씀하셨는데 꽤 기억에 잘 남는다. 스프링에서의 트랜잭션은 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 모두 수행되어야할 일련의 연산들을 모두 의미한다고 한다. 이때 중요한 점은, 트랜잭션이 모두 수행되거나, 그렇지 않다면 수행되지 않아야 한다는 것이다. 스프링에서 이것을 트랜잭션(transaction)의 원자성이라고 부른다고 한다.
+ 모든 작업이 성공해서 데이터베이스에 정상 반영하는 것을 Commit이라 하고, 작업 중 하나라도 실패해서 거래 이전으로 되돌리는 것을 Rollback이라 한다.
2. 트랜잭션(Transaction)의 활용
스프링에서 트랜잭션을 관리하는 방법은 큰 틀에서 선언적 트랜잭션과 프로그래밍적 트랜잭션으로 나눠진다고 한다.
2-1. 선언적 트랜잭션(Declarative Transaction)
이 방식은 트랜잭션의 시작과 종료를 개발자가 직접 지정할 수 있는 대신, 스프링 프레임워크가 관리를 하게 된다. 이를 통해서 개발자는 비지니스 로직에만 집중할 수 있으며, 코드의 가독성이 좋아진다고 한다. 주로 전체 서비스 레이어 또는 전체 메소드에 걸쳐 트랜잭션을 적용할 때 사용이 된다고 한다.
2-2. 프로그래밍적 트랜잭션(Programmatic Transaction)
프로그래밍적 트랜잭션은 개발자가 직접 코드 상에서 트랜잭션의 시작과 종료를 관리하는 방식을 의미하는데 이 방식은 선언적 트랜잭션에 비해 유연성이 높지만, 복잡성이 늘어날 수 있다고 한다. 대신 개발자가 직접 관리하는 만큼 트랜잭션의 적용 범위나 동작 방식을 세밀하게 제어할 수 있다. 주로 사용하는 곳은 특정 비지니스 로직에서만 트랜잭션을 적용하고 싶을 때 사용된다.
두 방식은 트랜잭션의 '사용처'라고 보기보다는 트랜잭션의 '관리 방식'의 차이로 보면 될 것 같다.
개발자의 요구사항과 상황 별로 적절한 방식을 선택해서 사용하면 된다.
3. 트랜잭션 ACID
트랜잭션은 ACID(https://ko.wikipedia.org/wiki/ACID)라 하는 원자성(Atomicity), 일관성(Consistency), 격리성(Isolation), 지속성(Durability)을 보장해야 한다.
원자성(Atomicity) : 트랜잭션 내에서 실행한 작업들은 마치 하나의 작업인 것처럼모두 성공하거나 실패해야 한다.
일관성(Consistency) : 모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지해야 한다. 예를 들면 데이터 베이스에서 정한 무결성 제약 조건을 항상 만족해야 한다.
격리성(Isolation) : 동시에 실행되는 여러 트랜잭션들이 서로에게 영향을 주지 않도록 격리해야 함을 의미한다. 이는 각 트랜잭션에 대해 독립적인 수행을 보장해줄 수 있다.
지속성(Durability) : 트랜잭션이 성공적으로 완료되면, 그 결과는 영구적으로 반영되어야 함을 의미한다. 즉, 시스템 장애가 발생하더라도 트랜잭션의 결과는 보존되어야만 한다.
이렇게 ACID 속성을 통해 트랜잭션은 데이터의 안정성과 일관성을 보장하며, 동시에 여러 사용자가 데이터베이스를 공유하면서도 서로의 작업에 영향을 주지 않을 수 있도록 해준다.
4. 데이터베이스의 무결성 제한 조건이란?
데이터베이스에서는 무결성 제약 조건을 사용하여 데이터의 일관성과 정확성을 유지해야 한다. 무결성 제약 조건은 데이터베이스에 저장된 데이터가 정해진 규칙에 따라 유효한지 확인하는 규칙이다. 주로 사용되는 제약 조건은 개체 무결성, 참조 무결성, 도메인 무결성, 키 무결성이 대표적으로 사용된다고 한다. 물론 더 많은 제약 조건이 있지만 자주 사용되는 것 위주로 정리했다.
개체 무결성(Entity Integrity) : 주 키(primary key)는 NULL 값이나 중복된 값이 없어야 한다. 개체 무결성은 테이블의 각 레코드가 유일하게 식별되고 식별자가 되는 주 키의 값을 가지도록 보장해준다.
참조 무결성(Referential Integrity) : 외래 키(foreign key) 관계에서 참조하는 테이블의 값은 항상 참조되는 테이블의 기본 키(primary key) 값과 일치해야 한다. 참조 무결성은 데이터베이스의 관계를 유지하며 데이터의 일관성을 보장해준다.
도메인 무결성(Domain Integrity) : 각 열(column)은 정의된 도메인에 속하는 값만 가질 수 있다. 도메인 무결성은 데이터의 유효한 범위를 지정하여 데이터의 일관성을 유지한다.
키 무결성(Key Integrity) : 각 테이블은 최소한 하나의 주 키(primary key)를 가져아만 한다. 키 무결성은 데이터의 식별자를 지정하여 데이터의 고유성을 보장해준다.
무결성 제약 조건은 데이터베이스 설계 시에 정의되며, 데이터베이스 관리 시스템(DBMS)이 이러한 제약 조건을 관리하고 적용한다. 이를 통한다면 데이터베이스에서 데이터의 무결성을 유지할 수 있게된다.
'Framework > Spring' 카테고리의 다른 글
ERD 그게 뭔데 날 힘들게 해 (1) | 2024.01.13 |
---|---|
스프링 프레임워크와 스프링 부트 (0) | 2024.01.03 |
VScode와 intelliJ 사용할 때 로그 처리 방식이 왜 다를까? (0) | 2023.12.30 |
Gradle이 Maven 대신에 많이 사용되는 이유는 뭘까? (0) | 2023.12.21 |
상속과 인터페이스는 언제 써야될까...? (0) | 2023.12.08 |
쓰임 있는 사람이 되기 위해 노력 중입니다.