해당 글은 코드스쿼드 2022 마스터즈 코스 "Java 웹 백엔드" 과정을 수강하면서 학습한 내용 등에 대한 회고 글입니다. :)
수강 회고
세 번째 팀 프로젝트 시작 4일차인 오늘 일단은 프론트 엔드와 작업 진도를 맞추기 위해 원래 하고 있던 AWS 인프라 구성을 잠시 멈춰두고 애플리케이션 개발을 본격적으로 시작했다. 다행히(?) 프론트 엔드 팀원분들 역시 현재 기능 구현에 있어 고민하고 있는 부분이 많아 API가 당장 급하지 않았다. 그래도 언제 API가 쓰일지 모르기 때문에 분주하게 작업을 시작했다.
지난 미션 과제들을 수행해오면서 리뷰어분들로부터 여러가지 조언을 듣다 보니 기능 구현 하나를 하는데 이것저것 생각해지는 게 많아졌다. 하지만 그러한 사항들을 충족시키기에는 무언가 번뜩이는 아이디어가 떠오르지 않았고 고민의 시간들로 시간이 종일 흘러갔다. 이렇게 시간을 축낼 수는 없어(시간은 제한적이기 때문에) 일단은 이상적인 고민 보다는 당장 내가 할 수 있는 것부터 고민하기로 했다. 뭔가 코드가 비효율적일 것 같은 불안함(?)이 있지만 당장은 내가 할 수 없었기에 일단은 미루기로 했던 것이다.
생각해보면 이렇게 미루어 놓고 나중에 볼 때 오히려 번뜩이는 아이디어가 떠오를 때가 많았다. 개발을 할 때 어느 정도 고민을 했으면 적당히(?) 현실적인 방법대로 구현해놓고 다음 기능 구현에 착수하는 것이 프로젝트 진행 시 효과적인 방법이 아닐까라는 생각이 들었다.
학습 정리
트랜잭션 격리 수준(Isolation Level)별 발생할 수 있는 문제들
ANSI SQL (SQL92) 상 격리 수준은 Read Uncommitted, Read Committed, Repeatable Read, Serializable 총 4가지가 있는데, 데이터 베이스마다 지원하는 레벨이 다르며 MySQL과 MSSQL 같은 경우에는 4가지를 모두 지원한다. 이때 MySQL의 경우 기본적으로 Repeatable Read이다. 하지만 그럼에도 불구하고 Phantom Read Problem이 발생하지 않는다. 그 이유는 MVCC 기능과 ‘갭 락’ 그리고 ‘넥스트 키 락’ 기능이 있기 때문이다.(자세한 내용은 Real MySQL 참고) 참고로 갭 락이란 레코드 자체가 아니라 레코드와 바로 인접한 레코드 사이의 간격만을 잠그는 것을 의미한다. 갭 락의 역할은 레코드와 레코드 사이의 간격에 새로운 레코드가 생성되는 것을 제어하는 것이다.
(P0) Lost Update Problem
두 개의 트랜잭션이 동시에 한 아이템의 데이터를 변경했을 때 발생하는 문제점(어느 한쪽이 덮어씌워짐)으로 트랜잭션을 지원하는 데이터베이스에서는 발생하면 안 된다.
(P1) Dirty Read Problem
어느 한 트랜잭션에서 변경한 값을 다른 트랜잭션에서 읽을 때 발생하는 문제이다. 만일 값을 변경했던 트랜잭션이 롤백이 되버린다면 그 데이터를 읽는(이 자체가 문제가 있는 것) 트랜잭션에서는 올바르지 않은 데이터를 읽게 되는 것이다.(트랜잭션의 독립성에 위배되며 다른 외부 트랜잭션으로부터 영향을 받은 것)
(P2) Non-repeatable Read Problem
(P1)은 해결되어 있는 상황인데 한 트랜잭션에서 같은 값을 두 번 읽었을 때 각각 다른 값이 읽히는 경우이다. 어느 한 트랜잭션에서 간격을 두고 특정 데이터를 조회한다고 했을 때 그 간격 사이에 어떤 다른 트랜잭션이 해당 데이터를 수정한다면 하나의 트랜잭션에서 각각 다른 값이 읽히게 되는 것이다.(트랜잭션의 독립성에 위배되며 다른 외부 트랜잭션으로부터 영향을 받은 것) 하지만 이게 무작정 나쁜 것은 아니다. 상황에 따라 이를 구현해야할 수도 있는 것이다. 예를 들어, 극장 영화표 예매의 경우 Read Uncommitted로 할 수도 있다. 예매를 하는 순간에도 누군가가 예매를 할 수 있기 때문이다.
(P3) Phantom Read Problem
(P1)과 (P2)는 해결되어있는 상황인데 주로 통계나 분석, aggregation function 등을 수행하는 쿼리에서 잘못된 값을 읽게되는 문제이다. 예를 들어 어느 한 트랜잭션에서 처음 조회했었던 통계 값을 간격을 두고 다시 조회 했을 갑자기 변경되는 문제이다.
좋았던 점
- 이번 주 피곤에 상당히 찌들어(?) 있는 상태였는데 어제는 그래도 나름 일찍 잔 덕에 하루를 쾌활(?)하게 보낼 수 있었던 것 같습니다. 💦
아쉬웠던 점
- 이번주 팀 프로젝트 과정에 들어오면서 다시 알고리즘 문제에 소홀히 하고있습니다. 😂
이전 보다 개선되었던 점
- 웹 앱 기능 구현함에 있어서 이전 보다 좀 더 고민을 많이 하게 되는 것 같습니다. 하지만 너무 이상적으로만 생각하기보다는 일단은 현실적인 고민을 먼저 해야겠다는 생각이 들었습니다.
'2022 Masters Course > Project Course' 카테고리의 다른 글
2022 마스터즈 코스(백엔드) 96일차 회고(2022. 5. 30.) - "조금만 더 힘을 내보자" (0) | 2022.05.31 |
---|---|
2022 마스터즈 코스(백엔드) 95일차 회고(2022. 5. 27.) - "정신없었던 지난 한 주" (0) | 2022.05.27 |
2022 마스터즈 코스(백엔드) 93일차 회고(2022. 5. 25.) - "접근성에 대해 고민해보기" (0) | 2022.05.25 |
2022 마스터즈 코스(백엔드) 92일차 회고(2022. 5. 24.) - "할 수 있는 것부터 차근차근" (0) | 2022.05.24 |
2022 마스터즈 코스(백엔드) 91일차 회고(2022. 5. 23.) - "네 번째 팀 프로젝트 시작" (0) | 2022.05.23 |