트랜잭션
트랜잭션이라 함은 거래라는 뜻으로 한 번에 이루어지는 작업의 단위를 뜻합니다.
트랜잭션의 성격으로 유명한 ACID가 있는데 아래와 같습니다.
원자성(Atomicity) | 하나의 트랜잭션은 모두 하나의 단위로 작성되어야 함. 즉 A는 성공 하고 B는 실패하면 A, B는 모두 원복해야함. |
일관성(Consistency) | 트랜잭션 성공 시 모든 데이터는 일관성을 유지해야함. 즉 전과 후에 차이가 없어야함. |
격리(Isolation) | 외부 간섭이 없어야함. |
영속성(Durability) | 트랜잭션이 성공적이면 결과는 영구적 영속적으로 저장되야함. |
흔히 계좌 이체라는 출금, 입금이 하나의 단위를 이룹니다.
계좌 이체를 bankTransfer()
입금은 deposit()
출금은 withdraw()
라고 칭하면
입금 , 출금은 커넥션을 맺고 작업을 처리합니다.
여기서 문제는 출금은 되는데 입금이 문제가 발생한다면 계좌에서 돈이 빠져나갔지만 상대방 계좌에 돈이 입금되지
않는 문제가 발생합니다.
트랜잭션으로 관리한다는 뜻은 AND 연산과 비슷합니다.
영속 계층에서 각 두 메서드가 연결을 맺고 처리하는데 하나의 트랜잭션 사용 시 한쪽 이 잘못될 경우
이미 성공한 것 도 모두 되돌려야 합니다.
Spring프레임을 쓰지 않는 다면 컨넥션 맺고 처리하도록 작성됩니다. 즉 각 메서드마다 컨넥션을 맺게 됩니다.
이로 인해 비지니스 계층에서는 코드가 굉장히 복잡하게 됩니다.
왜냐하면 한쪽 실패에 대해서도 생각을 해야 하게 됩니다.
하지만 스프링 프레임워크를 사용한다면 이를 손쉽게 처리 가능합니다.
트랜잭션과 데이터베이스 설계
저장 구조를 효율적으로 관리하기 위해서 정규화라는 것을 실행합니다.
정규화는 중복된 데이터를 제거하는 목적인데
이를 이용하면 테이블은 많아지고 테이블마다 각 데이터는 줄어들게 됩니다.
원칙적으로 컬럼으로 처리하지 않는 데이터는 아래와 같습니다.
1) 시간의 흐름에 따라 변하는 데이터 ( 나이 etc)
2) 계산 가능한 데이터
3) 누구에게나 정해진 값( 2019년 1월 1일은 무슨 요일??)
정규화를 잘 이룬다면 트랜잭션이 많이 발생하지 않습니다.
즉 순수한 데이터 형태가 될수록 트랜잭션이 많이 발생하지 않는다는 뜻입니다.
테이블이 간단해지지만 쿼리를 이용한 처리는 복잡해지게 됩니다.
조회를 위해 조인을 이용한다거나 말입니다. 특히 엄청난 개수의 서브 쿼리....
즉 성능에 문제가 발생하겠죠...?
다시 역정 규화의 가능성이 커집니다. 흔히 게시물의 댓글에서 많이 볼 수 있습니다.
아래 테이블을 보도록 합시다.
정규화 진행 시 board에는 게시글 정보만 칼럼으로 구성되고 reply을 이용해서 댓글 보관을 합니다.
하지만 일반적으로 게시글 목록에 게시글 각각 댓글 수를 나타냅니다.
이를 표시하려면 조인을 이용하겠죠 혹은 서브 쿼리...
흔히 board에서 댓글의 숫자를 칼럼으로 따로 표기를 합니다.
이렇게 되면 따로 reply를 이용하지 않더라도 board 내에서 따로 놀기 때문에 더 좋은 경우입니다.
즉 이를 반정 규화라고 합니다.
하지만 댓글이 추가될 때 reply에 insert 하고 댓글 숫자는 board에 업데이트를 시켜줘야 하는 작업이 필요한데
이를 트랜잭션으로 관리돼야 합니다.!!!
이해하셨나요.
'웹 > Spring' 카테고리의 다른 글
웹 시큐리티(Web Security)-1Day (0) | 2019.05.25 |
---|---|
Spring 트랜잭션 설정 (0) | 2019.05.06 |
AOP 적용 (0) | 2019.05.04 |
AOP 개념 (0) | 2019.05.03 |
REST AJAX 댓글 등록 처리 (2) | 2019.04.28 |