-
실용주의 프로그래머 스터디 6장 - 동시성Book Study 2024. 2. 13. 20:43
들어가며
안녕하세요, 오랜만에 블로그 글로 찾아뵙습니다! 즐거운 2024년 보내고 계신가요?
연휴가 포함되어 있더라도 사내 스터디 요일은 언제나 동일하기 때문에 미리 준비하는 차원에서, 연휴 기간에 공부를 시작하게 되어 미리 글을 남기게 되었습니다. 작년 연말부터 회사에서 타 팀 개발자 분들과 실용주의 프로그래머를 스터디 책으로 골라 진행하고 있습니다. 사실 스터디를 시작한 지는 6주 이상 되었는데, 6장이 되어서야 정리를 해봐야겠다는 마음가짐이 섰습니다...! 늦었지만 이후 진행되는 부분을 정리하고 앞 장으로 돌아가, 실용주의 프로그래머에 대한 나의 키워드와 팀원 분들의 생각을 공유해 보도록 하겠습니다.
나의 키워드
- 동시성
- 병렬성
- 세마포어
- 트랜잭션
TODO
- 자바스크립트에서도 동시성을 보장하기 위해 제공하는 라이브러리가 있는지 확인하기
- 레퍼런스 - Promise.all 과 Transactions
동시성 (concurrency)
- 둘 이상의 코드 조각이 실행될 때 동시에 실행 중인 것처럼 행동하는 것 (p.241)
- 소프트웨어의 동작 방식이다 (p.247)
- 동시성을 얻으려면 실행 중에 코드의 다른 부분으로 실행을 전환할 수 있는 환경에서 코드를 구동해야 한다 (p.241)
병렬성 (parallemlism)
- 실제로 동시에 실행되는 것이다 (p.241)
- 하드웨어가 실제로 동작하는 것이다 (p.247)
- 병렬성을 얻으려면 두 가지 일을 동시에 할 수 있는 하드웨어가 필요하다 (p.241)
- CPU 하나에 있는 여러 개의 코어일 수도 있고, 컴퓨터 한 대에 있는 여러 CPU이거나, 네트워크로 연결된 여러 대의 컴퓨터일 수도 있다 (p.241)
세마포어 (semaphore)
- 단순히 한 번에 한 사람만이 가질 수 있는 무언가다 (p.251)
- 전통적으로는 세마포어를 획득하는 작업을 ‘P’로, 반환하는 작업을 ‘V’로 불렀지만, 요즘은 잠금 ‘lock’, 잠금 해제 ‘unlock’, 획득 ‘claim’, 반환 ‘release’ 등으로 부른다 (p.251)
- 세마포어를 확보한 쪽은 평소처럼 계속 진행한다 (p.252)
- 세마포어를 얻지 못한 쪽은 세마포어를 얻을 수 있을 때까지 멈춰 있는다. (기다린다) (p.252)
case_semaphore.lock() if (display_case.pie_count > 0) promise_pie_to_customer() display_case.take_pie() give_pie_to_customer() end case_semaphore.unlock() ...
트랜잭션
트랜잭션(Transaction 이하 트랜잭션)이란, 데이터베이스의 상태를 변화시키기 해서 수행하는 작업의 단위를 뜻한다. 데이터베이스의 상태를 변화시킨다는 것은 무얼 의미하는 것일까? 데이터 베이스에서 트랜잭션은 하나의 거래를 안전하게 처리하도록 보장해 주는 것이라고 할 수 있다.
착각하지 말아야 할 것은, 작업의 단위가 질의어 한 문장이 아니라는 점이다. 작업 단위는 많은 질의어 명령문들을 사람이 정하는 기준에 따라 정하는 것을 의미한다.
트랜잭션의 특징
- 원자성 (Atomicity) - 다 성공할 것이 아니면 모두 다 실패
- 일관성 (Consistency) - 같은 쿼리는 조회할 떄 마다 같은 결괏값을 반환
- 독립성 (Isolation) - 트랜잭션이 진행 중일 때 해당 데이터에 대한 접근은 대기 상태
- 지속성 (Durability) - 작업이 실패하더라도 트랜잭션의 결과는 유지
첫 번째로, 원자성은 트랜잭션이 데이터베이스에 모두 반영되던가, 아니면 전혀 반영되지 않아야 한다는 것이다. 트랜잭션은 사람이 설계한 논리적인 작업 단위로서, 일처리는 작업단위 별로 이루어져야 사람이 다루는데 무리가 없다. 만약 트랜잭션 단위로 데이터가 처리되지 않는다면, 설계한 사람은 데이터 처리 시스템을 이해하기 힘들 뿐만 아니라, 오작동했을 시 원인을 찾기가 매우 힘들어질 것이다.
두 번째로, 일관성은 트랜잭션의 작업 처리 결과가 항상 일관성이 있어야 한다는 것이다. 트랜잭션이 진행되는 동안에 데이터베이스가 변경되더라도 업데이트된 데이터베이스로 트랜잭션이 진행되는 것이 아니라, 처음에 트랜잭션을 진행하기 위해 참조한 데이터베이스로 진행된다. 이렇게 함으로써 각 사용자는 일관성 있는 데이터를 볼 수 있는 것이다.
세 번째로, 독립성은 둘 이상의 트랜잭션이 동시에 실행되고 있을 경우 어떤 하나의 트랜잭션이라도, 다른 트랜잭션의 연산에 끼어들 수 없다는 점을 가리킨다. 하나의 특정 트랜잭션이 완료될 때까지, 다른 트랜잭션이 특정 트랜잭션의 결과를 참조할 수 없다.
네 번째로, 지속성은 트랜잭션이 성공적으로 완료됐을 경우, 결과는 영구적으로 반영되어야 한다는 점이다.
트랜잭션의 기능 (commit과 rollback)
commit이란 하나의 트랜잭션이 성공적으로 끝났고, 데이터베이스가 일관성 있는 상태에 있을 때, 하나의 트랜잭션이 끝났다는 것을 알려주기 위해 사용하는 연산이다. 이 연산을 사용하면 수행했던 트랜잭션이 로그에 저장되며, 후에 Rollback 연산을 수행했었던 트랜잭션단위로 하는 것을 도와준다.
rollback이란 하나의 트랜잭션 처리가 비정상적으로 종료되어 트랜잭션의 원자성이 깨진 경우, 트랜잭션을 처음부터 다시 시작하거나, 트랜잭션의 부분적으로만 연산된 결과를 다시 취소시킨다. 후에 사용자가 트랜잭션 처리된 단위대로 rollback을 진행할 수도 있다.
도전해 볼 것 (p.249)
- 아침 먹기
- 뉴스 시청
- 샤워
- 노래 듣기
- 머리 말리기 및 준비
- 옷 입기
- 영양제 먹기
- 향수 뿌리기
- 가방 및 필요한 짐 챙기기
- 엄마와 인사
- 신발 신기
- 나가기
궁금한 점 (p.255)
- 동시성을 제어가 필요한 순간이 있으셨나요?
- 타 팀에는 이렇게 동시성을 제어하기 위한 코드가 있나요?
- 사용하고 있는 라이브러리가 있나요?
'Book Study' 카테고리의 다른 글
실용주의 프로그래머 스터디 2장 - 실용주의 접근법 (0) 2024.02.19 실용주의 프로그래머 스터디 1장 - 실용주의 철학 (1) 2024.02.14 2023년 7월부터는 정말로 구글 애널리틱스 (GA4)! (1) 2023.07.03 당신의 웹 사이트가 구글의 선택을 받지 못하는 이유 9가지 (1) 2022.10.06 SEO를 하는 사람들을 위한 FAQ 및 SEO 핵심 키워드 📊 (1) 2022.10.05