요번주는 모의 기술면접을 봤다.....
코딩공부를 하면서 이분야에서 처음 보는 면접이였고 긴장되어서 질문을 받았을 때 잘 생각이 나지않았다 ㅠㅠ
면접을 보면서 cs지식도 많이 필요하다고 느꼈다.
면접 질문 중 db에 대해 많이물어보셨다.
그중 가장 기억나는 거는 트랜젝션이였다.
서비스 코드에서 @Transactional 을 많이 쓴다.
그런데 사실 뜻도 잘 모르고 좋다고 쓴거라... 정확히 설명하기가 어려웠다.
트랜잭션이란?
데이터베이스 트랜잭션은 데이터베이스 관리 시스템 또는 유사한 시스템에서 상호작용의 단위이다.
여기서 단위라는 말을 사용했는데, 쉽게 말하면 더 이상 쪼개질 수 없는 최소의 연산이라는 의미가 된다.
1. 트랜잭션은 데이터베이스 시스템에서 병행 제어 및 회복 작업 시 처리되는 작업의 논리적 단위이다.
2. 사용자가 시스템에 대한 서비스 요구 시 시스템이 응답하기 위한 상태 변환 과정의 작업단위이다.
3. 하나의 트랜잭션은 Commit되거나 Rollback된다.
Atomicity(원자성)
1. 트랜잭션의 연산은 데이터베이스에 모두 반영되든지 아니면 전혀 반영되지 않아야 한다.
2. 트랜잭션 내의 모든 명령은 반드시 완벽히 수행되어야 하며, 모두가 완벽히 수행되지 않고 어느하나라도 오류가 발생하면 트랜잭션 전부가 취소되어야 한다.
Consistency(일관성)
1. 트랜잭션이 그 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 변환한다.
2. 시스템이 가지고 있는 고정요소는 트랜잭션 수행 전과 트랜잭션 수행 완료 후의 상태가 같아야 한다.
Isolation(독립성,격리성)
1. 둘 이상의 트랜잭션이 동시에 병행 실행되는 경우 어느 하나의 트랜잭션 실행중에 다른 트랜잭션의 연산이 끼어들 수 없다.
2. 수행중인 트랜잭션은 완전히 완료될 때까지 다른 트랜잭션에서 수행 결과를 참조할 수 없다.
Durablility(영속성,지속성)
1. 성공적으로 완료된 트랜잭션의 결과는 시스템이 고장나더라도 영구적으로 반영되어야 한다.
Commit연산
1. Commit 연산은 한개의 논리적 단위(트랜잭션)에 대한 작업이 성공적으로 끝났고 데이터베이스가 다시 일관된 상태에 있을 때, 이 트랜잭션이 행한 갱신 연산이 완료된 것을 트랜잭션 관리자에게 알려주는 연산이다.
Rollback연산
1. Rollback 연산은 하나의 트랜잭션 처리가 비정상적으로 종료되어 데이터베이스의 일관성을 깨뜨렸을 때, 이 트랜잭션의 일부가 정상적으로 처리되었더라도 트랜잭션의 원자성을 구현하기 위해 이 트랜잭션이 행한 모든 연산을 취소(Undo)하는 연산이다.
2. Rollback시에는 해당 트랜잭션을 재시작하거나 폐기한다.
@Transactional의 작동 원리와 흐름
그렇다면 @Transactional이 붙은 메서드를 호출할 경우, 우리 코드에는 어떤 일이 벌어질까?
@Transactional이 클래스 내지 메서드게 붙을 때, Spring은 해당 메서드에 대한 프록시를 만든다.
프록시 패턴은 디자인 패턴 중 하나로, 어떤 코드를 감싸면서 추가적인 연산을 수행하도록 강제하는 방법이다.
--프록시란 실제 엔티티 객체 대신에 사용되는 객체로서 실제 엔티티 클래스와 상속 관계 및 위임 관계에 있습니다.
프록시 객체는 실제 엔티티 클래스를 상속 받아서 만들어지므로 실제 엔티티와 겉모습이 같습니다.
트랜잭션의 경우, 트랜잭션의 시작과 연산 종료시의 커밋 과정이 필요하므로, 프록시를 생성해 해당 메서드의 앞뒤에 트랜잭션의 시작과 끝을 추가하는 것이다.
서비스 클래스에서 @Transactional을 사용할 경우, 해당 코드 내의 메서드를 호출할 때 영속성 컨텍스트가 생긴다는 뜻이다. 영속성 컨텍스트는 트랜잭션을 시작할 때 생겨나고, 메서드가 종료되어 트랜잭션을 커밋할 경우 영속성 컨텍스트가 flush되면서 해당 내용이 반영된다. 이후 영속성 컨텍스트 역시 종료되는 것이다.
isolation
트랜잭션에서 일관성없는 데이터 허용 수준을 설정한다
propagation
트랜잭션 동작 도중 다른 트랜잭션을 호출할 때, 어떻게 할 것인지 지정하는 옵션이다
noRollbackFor
특정 예외 발생 시 rollback하지 않는다.
rollbackFor
특정 예외 발생 시 rollback한다.
timeout
지정한 시간 내에 메소드 수행이 완료되지 않으면 rollback 한다. (-1일 경우 timeout을 사용하지 않는다)
readOnly
트랜잭션을 읽기 전용으로 설정한다.
'항해 99(9기) > WIL' 카테고리의 다른 글
항해 99 (9기) 12주차 WIL @Async (0) | 2022.12.13 |
---|---|
항해 99 (9기) 11주차 WIL 풀 텍스트 인덱스 검색 (0) | 2022.12.05 |
항해 99 (9기) 9주차 WIL DB 실행 계획 (1) | 2022.11.21 |
항해 99 (9기) 8주차 WIL (0) | 2022.11.14 |
항해 99 (9기) 7주차 WIL (0) | 2022.11.06 |