본문 바로가기
Review/IT 채용

넥슨 신입 플랫폼 엔지니어 채용 : 데이터베이스(DB)에서 트랜잭션이라는 개념이 생긴 이유는?

by M-life 2020. 5. 1.
반응형

 

문제 3) 

데이터베이스 분야에서 트랜잭션(transaction) 이라는 개념은 널리 알려져 있습니다. 이 트랜잭 션이라는 개념은 어떤 배경에서 왜 생겼어야 했을까요? 트랜잭션의 개념이 꼭 생겼어야 했던 이 유와 트랜잭션이 DBMS 내부에서 실제로 적용되어 설계되고 구현되어 있는 형태는 어떤 모습인 지에 대해서 서술하세요.  

  

 답안 3) 




데이터베이스가 도입된 중요 원인은 여러 사람들이 데이터를 공유하고, 모든 사용자들은 필요 할 때마다 정확한 데이터를 제공받을 수 있게 하기 위함입니다. 여기서 무엇보다 중요한 것은 모든 사용자들은 가장 최근에 업데이트 된 데이터를 정확하게 볼 수 있어야 한다는 것입니다. 그럼 프로그래밍 초창기 때 제가 직접 겪었던 예를 통하여 사용자들이 정확한 데이터를 제공 받을 수 없는 경우를 말씀드리겠습니다. 뉴스 기사를 제공하는 게시판을 구현하고 있을 때의 일입니다. 각 기사마다 사용자들은 ‘좋아 요’를 누를 수 있으며, 기사 리스트를 볼 수 있는 곳에서는 기사마다 ‘좋아요’의 수를 출력하 도록 기획했습니다. 그리고 다음과 같이 DB Table 설계를 하였습니다.

[설계한 DB Table]

 

 

news_contents 테이블은 한 뉴스 기사의 데이터를 저장하는 테이블이며, like_cnt는 해당 기 사에 ‘좋아요’를 누른 유저들의 수를 저장하는 필드입니다. news_contents_like 테이블은 ‘좋 아요’를 누른 유저들의 정보를 저장하는 테이블입니다. (cnt필드를 별도로 추가한 이유는 매번 join으로 count하는 질의를 줄이기 위함이었습니다.) 이러한 테이블 관계를 가지고, 유저가 특정 게시물에 ‘좋아요’를 누르면 우선 news_contents_like 테이블에 해당 정보의 유저가 기록 됩니다.(Insert) 이 후, news_contents 테이블에서는 like_cnt를 +1 시키게 됩니다.(Update) 그러나 당시, Update 시에 코드 상의 오류로 Update Query는 반영되지 못하였습니다. 이렇게 될 경우 ‘좋아요’를 누른 사람은 3명인데, 실제로는 2명으로 표시되게 되었습니다. 물론 코드를 다시 수정하여 해 결하였지만, 추후 예상하지 못했던 또 다른 문제들이 발생할 경우를 생각하여 일괄적으로 처 리해야할 필요가 있다고 생각하였습니다. 학과 강의 때 배운 트랜잭션을 떠올렸고, 인터넷에 서 트랜잭션 sample code를 찾아 익히고 적용하였습니다. 이 후 개념 그대로 ‘일괄 처리’가 필요한 곳에는 꼭 트랜잭션을 적용하였습니다. 저의 사례는 단순하게 ‘기사 보기’ 컨텐츠였지만, 더 크게 나아가보면 생활 속에서 계좌 송금 등과 같은 매우 중요한 단위일 수도 있습니다. 트랜잭션의 성질은 ACID(Automicity, Consistency, Isolation, Durability)라고 개념서에는 쓰여 있지만, 무엇보다 이와 같이 여러 사람들에 의해 공유되는 데이터베이스에서 항상 데이터들의 정확성을 보장하기 위해 도입되었 다고 생각합니다. 그렇다면 트랜잭션이 DBMS 내부에서 어떻게 설계되어 구현되어 있는지 말 씀드리도록 하겠습니다. DBMS에서는 데이터를 보통 디스크에 저장하며, 일부분은 메인 메모리에서 관리합니다. 디스 크에는 고정 길이의 페이지 단위로 저장하며, 메인 메모리에서는 버퍼 관리자에 의해 이런 페 이지들의 입출력을 관리하게 됩니다. 그리고 이 버퍼 관리자의 버퍼 관리 정책은 이제 설명할 트랜잭션 작업에 매우 중요한 영향을 끼칩니다. 

먼저 트랜잭션에서 진행 중에 오류가 발생하여 데이터를 다시 복구하는 경우 내부적으로 Undo, Redo 연산에 의해 이루어지게 됩니다. Undo, Redo 복구를 위해 가장 많이 쓰이는 구조는 데이터베이스의 갱신기록을 모두 기록하는 로그입니다. 그리고 이 로그는 연속된 로그 레코드로 이루어져 있습니다. 로그 버퍼라는 별도의 버퍼를 두어 로그 레코드를 모았다가 로 그 파일에 출력하게 됩니다. 트랜잭션들은 각각의 연산에 대해 로그 레코드를 생성하고, 로그 버퍼에 유지하다가 트랜잭션으로부터 커밋을 요청받거나, 데이터베이스에 직접적으로 기록되 기 전에 해당 명령을 먼저 로그에 기록하게(WAL : Write Ahead Logging) 되는 경우 등의 시점에 로그 파일에 기록합니다. 만약, 트랜잭션 중에 오류가 발생하게 되면 기록된 로그들을 무시하게 되고 결국 데이터베이스는 트랜잭션 실행 전의 상태를 유지할 수 있게 되는 것입니 다. 반면, 모든 작업이 오류 없이 완료되었다면 로그들을 데이터베이스에 기록하며 트랜잭션 은 성공하게 됩니다.(commit)



[트랜잭션의 갱신(commit)과 복구(rollback)]




 

 

 

반응형

댓글