제로타이 2022. 12. 2. 01:30

오프라인

오늘은 거의 번개 미팅. 수헌이 형이 같이 공부할 사람을 모으는데 나 빼고는 나갈 사람이 없기도 하고, 나도 집에 있자니 간혹 딴짓을 하게 되는 게 싫어서 안 그래도 나가서 공부할까 생각을 하고 있었기 때문에 판교에서 만나 공부를 했다. 

면접을 위한 CS

4.3 트랜잭션과 무결성

트랜잭션: 데이터베이스에서 하나의 논리적 기능을 수행하기 위한 작업의 단위. 통상 여러 개의 쿼리로 이뤄지며, 깃에서 커밋 정도의 행위라고 생각하면 된다. 이것과 관련해 4가지 특징(ACID)을 살펴볼 수 있다. 

원자성: 트랜잭션과 관련된 일이 모두 수행되었거나 되지 않았거나를 보장하는 특징. 트랜잭션 내에 다양한 쿼리가 있다. 가령 내 계좌의 돈을 빼고, 다른 이의 계좌의 넣고의 작업을 하나의 트랜잭션으로 묶는다면? 중간만 하다가 멈추거나 하는 일 없이 처음부터 안 되던가, 지정한 트랜잭션이 전부 이뤄지거나를 충족하면 원자성이 있다고 말할 수 있다. 
일관성: 허용된 방식으로만 데이터가 변경돼야 함을 나타내는 특징. 마령 계좌의 잔고가 없을 때 돈을 꺼낼 수 없다라는 규칙을 준수하고 있는 것에 대해 일관성이 있다고 말할 수 있다.
격리성: 트랜잭션이 병렬적으로 들어올 때 서로 충돌하지 않는 것을 말한다. 사실 이는 비단 데이터베이스에서만 발생하는 문제가 아니다. 네트워크로는 유저의 요청들이 동시적으로 들어올 것이고, 컴퓨터 적으로는 쓰레드에서 데드락이 일어나지 않게 관리하는 것이 관련된다고 할 수 있다. 이것과 관련하여 격리 수준에 따른 분류를 할 수 있다.
지속성: 성공적으로 수행된 트랜잭션이 영원히 반영될 때의 특징. 이는 버전 관리와도 연결되며 시스템에 장애가 발생하더라도 원상태로 복구하는 회복 기능이 있어야 함을 의미하기도 한다. 

트랜잭션과 관련하여 알아둬야 할 용어. 커밋과 롤백.
커밋은 한 트랜잭션의 수행을 확정지었을 때 사용하는 용어이다. 여러 개의 쿼리가 일어나고 그것이 성공적으로 일어나 이로 인한 변경 사항이 저장되었을 때, 커밋이 수행되었다고 말한다. 깃에서의 커밋과 그다지 다르지 않다. 
롤백은 그 커밋을 되돌리는 행위이다. 지속성에서 말한 회복 기능과 관련된다. 깃으로 따지자면 버전 관리의 영역이라고 볼 수 있겠다.

격리성과 관련하여 더 볼 수 있는 것. 여러 개의 격리 수준이 존재한다. 다음의 순서로 분류할 수 있고, 격리의 수준은 아래로 갈수록 약해진다. 이에 따라 각 수준에서 나타날 수 있는 현상 역시 아래로 갈수록 중첩돼 나타난다고 보면 되시겠다.

  • Serializable  - 트랜잭션을 순차적으로 진행시키는 격리 수준.
    절대 병렬적으로 일어나는 트랜잭션을 받아들이지 않기에 매우 느리고, 병목 상태가 쉽게 일어난다. 
  • Repeatable_read - 한 트랜잭션이 수정한 행을 다른 트랜잭션이 수정하지 못하도록 막지만, 새로운 행을 추가하는 것은 막지 않는 격리 수준.
    팬텀 리드: 한 트랜잭션 내에서 동일한 쿼리를 보냈을 때 해당 조회 결과가 다른 현상을 말한다.
    처음에 내 계좌를 조회하고, 돈을 이체하고 내 계좌를 다시 조회하면 당연히 내 계좌의 잔고가 다르게 나타날 것이다. 이런 건 당연한 거고, 그것보다 다른 트랜잭션에서 이뤄낸 변경에 의해 조회가 다르게 나타나는 것을 말한다고 보면 된다. 다른 트랜잭션에서 하나의 행을 추가한 후에 전체 행 갯수를 조회하면 다르게 조회될 것이다.
  • Read_committed - 가장 흔한 격리 수준. 커밋이 된 이후의 정보만을 조회 가능하도록 함. 이게 깃의 방식이라 보면 된다. 커밋을 한 이후에야 서로의 트랜잭션이 조회되고 수정이 가능해지는 것이다. 
    반복가능하지 않은 조회: 한 트랜잭션 내에서 같은 행에 두 번 이상의 조회가 발생했을 때 그 값이 다른 현상. 팬텀 리드와 다르게 한 행에 대해서 말하는 것이다. 위 격리 수준에서는 한 행에서의 변경은 일어나지 않기에 이쪽이 더 많은 변경을 가진다고 이야기할 수 있겠다.
  • Read_uncomitted - 가장 낮은 격리 수준. 구글 문서나 노션에서 글을 같이 쓸 때 서로가 서로 쓴 사항에 대해서 수정이 가능한데, 이렇게 수정이 서로 바로바로 조회가 가능한 정도의 수준이다. 무결성이 충족되지 않는 문제가 발생한다.
    더티 리드: 한 트랜잭션의 커밋되지 않은 수정사항이 다른 트랜잭션에서 조회 가능한 상태를 말한다. 딱 생각해도 굉장히 안전하지 않다.

지속성과 관련하여 더 볼 수 있는 것. 데이터베이스에서 제공하는 복구 기능은 무엇이 있을까?
체크섬: 중복 검사의 한 형태. 오류 정정을 하는 방식으로 무결성을 보호하는 단순한 방법이다.
저널링: 커밋 이전에 로그를 남기면서 진행하는 방법.

무결성이란? 데이터의 정확성과 일관성, 유효성이 유지되는 상태를 말한다. 이것은 데이터를 신뢰할 수 있는지에 대한 여부이기도 해서 지키는 것이 매우 중요하다. 외래키와 관련하여 더 볼 여지가 있는 부분이라고 한다.

4.4 데이터베이스의 종류

관계형 데이터베이스. 정형 데이터을 관리하는 데이터베이스. SQL을 써서 조작한다. 가장 대표적인 DBMS가 MySQL.

오늘 요약

일단 새로 메인에 풀리퀘된 것을 받는 것으로 시작. 이후 원래는 오늘 대체로 강의를 듣거나 미션을 할 생각이었는데, 이게 참 애매하다. 공부와 대회가 투 트랙인 것만 같은 기분을 계속 받는다. 궁극적으로는 그렇지 않다고 생각하는데도 당장의 대회에 기여를 하는 것을 계속 괄시할 수가 없다. 결국 lgbm 파라미터를 어떻게 할지 만지면서 수정을 가하는데 집중했다. 
gcn 모델을 통해 임베딩 층을 꺼낼 수 있다면, 이것을 활용해서 lgbm 모델을 돌리는 것도 가능하지 않을까? 근데 사실 큰 의미는 없을 것으로 보이기는 한다. 만약 이걸 하게 된다면 이것도 동건 모델이라 이름 붙여야겠다 ㅋㅋ 아무튼 이것에 대해서 아이디어를 조금 고민해보았다.

피어세션과 데일리 스크럼 때 주로 나온 이야기. 대체 왜 고양이는 얼라인이 잘 안 되는가? 왜 계속 희망을 계속 줘가지고 우리의 소중한 리더보드 제출 기회를 날려먹는가! 그 이유 중 하나가 검증셋의 갯수일 수도 있다는 지적이 나왔다. 또 인터랙션 항이 혹시 '오늘의 값은 어제의 값을 따른다'라는 식의 학습을 하게 하는 것은 아닌지에 대한 고민도 이뤄졌다. 갖은 생각과 고민이 오갔지만, 명쾌한 답은 그다지 나오지 않은 것 같다. 이게 다 고양이 때문이다. 
정한 사항. 아예 맞춰야 하는 문제의 전번 문제를 검증으로 쓰자. 그리고 cardinality 문제를 고민해보자. 조금 더 바이닝을 해보자. 인터랙션을 넣을지의 여부를 정하고난 이후, 각 피쳐들을 늘줄해가면서 각 피쳐들의 중요도나 의미를 파악해보자. 연관성도 파악할 수 있다면 좋을 것. 

대충 손으로 바꿔가면서 하나씩 해보기. 각 결과들을 같이 쓰는 노션에 조금씩 적어나가고 있는데, 다 옮기기는 보기도 힘들게 너무 많아서 일단 보류.. 정리해서 몇 가지를 꺼내보는 게 좋을 것 같다. 

회고 및 다짐

성훈이 형과 조금 이야기해본 것도 있는데, 계속 드는 생각으로 대회에 집중을 할 때마다 여유가 사라지는 것 같다. 어떻게 되도 사실 왕도는 정해져있다. 잘 배워서 적용하는 것. 적용하면서 배우는 것도 좋지만, 그러면서 배우는 것도 있지만, 잘 모르는 영역에 들어갈 때 그것이 빠르게 익히는데 유용하기는 하지만, 어느 시점에는 결국 완전한 파악을 위해 깊게 공부를 하는 시점이 필요하다. 잘 배우는 단계가 필요하다는 것이다. 근데 지금 대회에 집중하다보면 그 단계를 계속 놓치는 것만 같다. 도대체 그래서 부스팅 모델 간의 정확한 차이가 어떻게 되는 것이냐? 그 원리를 당장 나는 설명해낼 수 있는가? 이제 막 조금씩 느낌은 얻고 있지만, 그럼에도 아직 명확하게 답할 수가 없다. 
내가 강의를 다시 듣고 싶고, 스페셜 미션을 해보고 싶고 하는 부분이 그런 지식의 부족함을 채우는 과정에 대한 욕구이다. 그런데, 막상 대회를 생각하면 마냥 그럴 수가 없는 것이다. 가령 지금 나는 lgbm을 적용해보고 싶다. 그래서 각잡고 lgbm을 공부해서 쓰자니, lgbm을 너무 오래 잡게 될 것 같은 것이다. 그래서야 대회에 도움이 안 된다. 그러니 일단 대충 코드들을 보면서 이 정도로 치면 될 것 같다 싶은 것들을 쳐나간다. 그러면 결국 lgbm을 잘 활용하는 상태는 아니고 대표적인 것들만 쓸 수 있는 상태가 된다. 그리고 그 단계에서 어떻게 나아가야 할 지에 대해 크게 방법을 잡지 못하는 것이다. 그래서 중간중간 헤메는 구간이 생긴다. 
계속 말하지만, 사실 왕도는 있다고 본다. 그정도 했으면 대회보다 더 깊게 공부를 하는 시간이 필요하다. 그 시간이 정말 대회에 도움이 될 수 있냐하는 물음도 수반되지만, 웬만해서는 도움이 되기는 할 것이라고 본다. 지금 대회만이 대회인 건 아니니까, 결국 도움은 된다. 그래도 맘이 조급해지고 여유가 없어지는 것이다. 특히 팀원들이 뭔가를 해낼 때마다 그것을 강하게 느낀다. 내가 뒤쳐진 건 어쩔 수 없다고 치자. 그러나 내가 아무런 도움이 되지 않는 것은, 너무나도 싫은 것이다.

어쩔까. 나는 답을 알고 있다. 대회 순위가 중요한 것이 아니니까. 하지만, 그래도 중간점은 없는 걸까? 같이 나아가는 방향은 없는 걸까? 공부를 하는 방식에 변화를 줄 수 있지는 않을까? 이 간극을 어떻게 처리해야할 것인가? 

다른 리소스. 식견을 넓히는 것. 이후 깊게. 
모르겠다. 일단 해보자. 이 대회에서 이랬어도, 이 경험으로부터 다음 대회에서의 나를 발전시킬 것이다. 모든 면에서.