🍎 애플리케이션 개발에서 흔히 당연시되는 영속 계층(RDB)의 CRUD 작업에 대해 더 깊이 이해하고 싶어, 그 비용과 효율성에 대해 정리한 글입니다.
❗️ CRUD 작업의 효율성을 논하기 전에, ‘Create’와 ‘Read’가 각각 ‘Insert’와 ‘Select’와 어떻게 다른지 정리해 보겠습니다. 단어가 갖고 있는 의미를 명확하게 정의해 혼란을 없애기 위함입니다.
- ‘Create’와 ‘Read’는 데이터 조작의 추상적인 개념을 나타냅니다.
- ‘Insert’와 ‘Select’는 추상적인 개념을 SQL 명령어로 구체화한 것입니다.
- 이 후 글의 진행에선 구체화한 명령어인 SQL의 ‘Insert‘와 ‘Select‘를 사용하겠습니다.
(참고로 Update와 Delete 역시 마찬가지입니다. 쓰인 단어의 모양이 동일할 뿐이지 추상적인 개념과 구체화한 것으로 의미가 나뉩니다.)
🤔 DB의 CRUD 작업인 삽입(Insert), 조회(Select), 갱신(Update), 삭제(Delete) 작업에서 비용이 제일 많이 드는 순서대로 나열하면 어떤 순서가 될까요?
비용이 많이 드는 순서대로 나열해보면 Update > Delete > Insert > Select입니다.
❓ 위 순서대로 비용이 발생하는 이유는 무엇일까요?
- 처음 생각으로는 삭제가 비용이 제일 높을 것이라고 생각했습니다. 이유는 수많은 Record에서 삭제할 Record를 조회하고 난 후 삭제를 수행하기 때문입니다.
- 그렇지만 실제로는 Update 부분에서 비용이 많이 발생했습니다. 서비스 운영 시, Update를 수행하면 훗날 서비스가 커졌을 때, 장애의 지점이 될 확률이 높습니다. Update 동작은 대상 Record를 모두 Lock을 잡고 직접 변경하는 과정이 수행되기 때문입니다.
- 그렇다면 Delete 동작에는 그렇지 않을까요? 그렇습니다. Delete는 직접 값을 삭제하는 것처럼 보이지만 참조 값을 제거하는 방식으로 진행되어 Update 보다 리소스가 적게 듭니다.
- ""Delete시 MSSQL Server는 Delete된 행을 지웠다는 표시만 한다. 그러므로 데이터를 읽을 때는 Delete된 행의 표시가 있으므로 읽지 않는다. 이것은 클러스터드 인덱스나 논클러스터드 인덱스의 리프레벨에서 모두 일어난다.""
- Insert는 테이블의 말미 부분에 값이 추가되기 때문에 갱신과 삭제에 비해 데이터 조회 비용이 소요되지 않습니다.
- Select 비용이 소요된다면 Select가 Insert보다 비용이 많이 발생해야겠지만, 근본적으로 읽기 작업이 쓰기 작업보다 비용이 적게 듭니다.
- 위의 이유로 Update > Delete > Insert > Select의 순서대로 비용이 발생합니다.
📝 나아가 생각해 보기
❓DB CRUD 작업 비용을 아는 것은 왜 중요할까요?
- 단순히 CRUD 작업 비용을 아는 것도 중요하지만 이를 도구로 활요한다면 쿼리를 다룰 때 복잡한 문제를 해결할 수 있기 때문입니다.
- 쿼리 최적화, 서비스가 커짐에 따른 병목 발생 부분 예측 등과 같은 어려운 문제를 비용을 알지 못한다면 잘 해결할 수 있을까요? 그렇지 않다고 생각합니다.
📚 Reference
'Dev' 카테고리의 다른 글
Enum을 사용할 때 생각해봐야할 점 (2) | 2024.09.26 |
---|---|
Spring @Value를 통해 환경 변수를 주입받을 때 주의할 점 (0) | 2024.09.16 |
시간값 발행 주체는 누가 되어야 하는가? (0) | 2024.09.03 |
[설계] 순서 결정의 책임을 결정하는 방법 (0) | 2024.09.03 |
[설계] 설계 시 우선되어야 할 계층 구조에 대하여 (0) | 2024.09.03 |